diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 000000000..f23d47aa9 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,3 @@ +# Make sure RUBY_VERSION matches the Ruby version in .ruby-version +ARG RUBY_VERSION=3.4.4 +FROM ghcr.io/rails/devcontainer/images/ruby:$RUBY_VERSION diff --git a/.devcontainer/compose.yaml b/.devcontainer/compose.yaml new file mode 100644 index 000000000..ac672a509 --- /dev/null +++ b/.devcontainer/compose.yaml @@ -0,0 +1,35 @@ +name: "fullstack_developer" + +services: + rails-app: + build: + context: .. + dockerfile: .devcontainer/Dockerfile + + volumes: + - ../..:/workspaces:cached + + # Overrides default command so things don't shut down after the process ends. + command: sleep infinity + + # Uncomment the next line to use a non-root user for all processes. + # user: vscode + + # Use "forwardPorts" in **devcontainer.json** to forward an app port locally. + # (Adding the "ports" property to this file will not forward from a Codespace.) + depends_on: + - postgres + + postgres: + image: postgres:16.1 + restart: unless-stopped + networks: + - default + volumes: + - postgres-data:/var/lib/postgresql/data + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + +volumes: + postgres-data: diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..41f33ae81 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,34 @@ +// For format details, see https://containers.dev/implementors/json_reference/. +// For config options, see the README at: https://github.com/devcontainers/templates/tree/main/src/ruby +{ + "name": "fullstack_developer", + "dockerComposeFile": "compose.yaml", + "service": "rails-app", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + + // Features to add to the dev container. More info: https://containers.dev/features. + "features": { + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/rails/devcontainer/features/activestorage": {}, + "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {"moby":false}, + "ghcr.io/rails/devcontainer/features/postgres-client": {} + }, + + "containerEnv": { + "KAMAL_REGISTRY_PASSWORD": "$KAMAL_REGISTRY_PASSWORD", + "DB_HOST": "postgres" + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + "forwardPorts": [3000, 5432], + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://containers.dev/implementors/json_reference/#remoteUser. + // "remoteUser": "root", + + + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "bin/setup --skip-server" +} diff --git a/Gemfile.lock b/Gemfile.lock index 10d2d6d56..7102821c4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -85,7 +85,7 @@ GEM bindex (0.8.1) bootsnap (1.18.6) msgpack (~> 1.2) - brakeman (7.1.0) + brakeman (7.1.1) racc builder (3.3.0) capybara (3.40.0) diff --git a/config/database.yml b/config/database.yml index 7e092b028..6653c7dd4 100644 --- a/config/database.yml +++ b/config/database.yml @@ -18,6 +18,11 @@ default: &default # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + <% if ENV["DB_HOST"] %> + host: <%= ENV["DB_HOST"] %> + username: postgres + password: postgres + <% end %> development: diff --git a/coverage/.resultset.json b/coverage/.resultset.json index 4c2bc138b..f4f6aca97 100644 --- a/coverage/.resultset.json +++ b/coverage/.resultset.json @@ -1377,6 +1377,6 @@ ] } }, - "timestamp": 1762422350 + "timestamp": 1762426100 } } diff --git a/coverage/index.html b/coverage/index.html index 643f830c2..baf1cf1d1 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -13,7 +13,7 @@ loading
-
Generated 2025-11-06T06:45:50-03:00
+
Generated 2025-11-06T07:48:20-03:00
@@ -3140,7 +3140,7 @@

- CSV.foreach(@file.path, headers: true) do |row| + CSV.foreach(@file.path, headers: true) do |row|

@@ -3334,7 +3334,7 @@

- +

diff --git a/db/seeds.rb b/db/seeds.rb index 4fbd6ed97..bebb7d26b 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,9 +1,4 @@ -# This file should ensure the existence of records required to run the application in every environment (production, -# development, test). The code here should be idempotent so that it can be executed at any point in every environment. -# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup). -# -# Example: -# -# ["Action", "Comedy", "Drama", "Horror"].each do |genre_name| -# MovieGenre.find_or_create_by!(name: genre_name) -# end +require 'factory_bot_rails' + +FactoryBot.create(:user, role: :admin, email: 'admin@email.com', password: '123456') +FactoryBot.create(:user, email: 'user@email.com', password: '123456') diff --git a/spec/factories/users.rb b/spec/factories/users.rb index 330518fba..b8919f82b 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -9,9 +9,9 @@ after(:build) do |user| user.avatar_image.attach( - io: File.open(Rails.root.join("spec", "fixtures", "files", "avatar_image.jpg")), - filename: "avatar_image.jpg", - content_type: "image/jpg" + io: File.open(Rails.root.join("public", "icon.png")), + filename: "icon.png", + content_type: "image/png" ) end end diff --git a/vendor/bundle/ruby/3.4.0/cache/brakeman-7.1.1.gem b/vendor/bundle/ruby/3.4.0/cache/brakeman-7.1.1.gem new file mode 100644 index 000000000..edf3ed54b Binary files /dev/null and b/vendor/bundle/ruby/3.4.0/cache/brakeman-7.1.1.gem differ diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/CHANGES.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/CHANGES.md new file mode 100644 index 000000000..427825468 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/CHANGES.md @@ -0,0 +1,1500 @@ +# 7.1.1 - 2025-11-03 + +* Fix false positive when calling `with_content` on ViewComponents (Peer Allan) +* Word wrap text output in pager +* Consider Tempfile.create.path as safe input (Ali Ismayilov) +* Exclude directories before searching for files +* Check each side of `or` SQL arguments +* Ignore attribute builder in Haml 6 +* Add `FilePath#to_path` for Ruby 3.5 compatibility (S-H-GAMELINKS) +* Fix SQL injection check for calculate method (Rohan Sharma) +* Fix missing `td` in HTML report (John Hawthorn) +* Check for unsafe SQL when two arguments are passed to AR methods (Patrick Brinich-Langlois) + +# 7.1.0 - 2025-07-18 + +* Add EOL dates for Rails 8.0 and Ruby 3.4 +* Support render model shortcut +* Use lazy file lists for AppTree +* Add Haml 6.x support +* Improve ignored warnings layout in HTML report (Sebastien Savater) +* Update JUnit report for CircleCI (Philippe Bernery) +* Only load escape functionality from cgi library (Earlopain) +* Add `--ensure-no-obsolete-ignore-entries` option (viralpraxis) + +# 7.0.2 - 2025-04-04 + +* Fix error with empty `BUNDLE_GEMFILE` env variable + +# 7.0.1 - 2025-04-03 + +* Avoid warning on evaluation of plain strings +* Enable use of custom/alternative Gemfiles +* Fix error on directory with `rb` extension (viralpraxis) +* Support `terminal-table` 4.0 (Chedli Bourguiba) +* Better support Prism 1.4.0 +* Only output timing for each file when using `--debug` + +# 7.0.0 - 2024-12-30 + +* Always warn about deserializing from Marshal +* Output `originalBaseUriIds` for SARIF format report +* Default to using Prism parser if available (disable with `--no-prism`) +* Update `terminal-table` version to use latest +* Update `eval` check to be a little noisier +* Fix array/hash unknown index handling +* Disable following symbolic links by default, re-enable with --follow-symlinks +* Add step (and timing) for finding files +* Add CSV library as explicit dependency for Ruby 3.4 support +* Major changes to how rescanning works +* Raise minimum Ruby version to 3.1 +* Fix hardcoded globally excluded paths +* Remove updated entry in Brakeman ignore files (Toby Hsieh) +* Fix recursion when handling multiple assignment expressions + +# 6.2.2 - 2024-10-15 + +* Ignore more native gems when building gem +* Revamp command injection in `pipeline*` calls +* New end-of-support dates for Rails + +# 6.2.1 - 2024-08-22 + +Just a packaging fix for brakeman.gem + +# 6.2.0 - 2024-08-22 + +* Add `--show-ignored` option (Gabriel Zayas) +* Add optional support for Prism parser +* Warn about unscoped finds with `find_by!` +* Treat `::X` and `X` the same, for now (Jill Klang) +* Fix compatibility with default frozen string literals (Jean Boussier) +* Remediation advice for command injection (Nicholas Barone) +* Fix Ruby warnings in test suite (Jean Boussier) +* Support YAML aliases in secret configs (Chedli Bourguiba) +* Add initial Rails 8 support (Ron Shinall) +* Handle mass assignment with splats +* Add support for symbolic links (Lu Zhu) + +# 6.1.2 - 2024-02-01 + +* Update Highline to 3.0 +* Add EOL date for Ruby 3.3.0 +* Avoid copying Sexps that are too large +* Avoid detecting `ViewComponentContrib::Base` as dynamic render paths (vividmuimui) +* Remove deprecated use of `Kernel#open("|...")` +* Remove `safe_yaml` gem dependency +* Avoid detecting Phlex components as dynamic render paths (Máximo Mussini) + +# 6.1.1 - 2023-12-24 + +* Handle racc as a default gem in Ruby 3.3.0 + +# 6.1.0 - 2023-12-04 + +* Add `--timing` to add timing duration for scan steps +* Fix keyword splats in filter arguments +* Add check for unfiltered search with Ransack +* Fix class method lookup in parent classes +* Handle `class << self` +* Add `PG::Connection.escape_string` as a SQL sanitization method (Joévin Soulenq) + +# 6.0.1 - 2023-07-20 + +* Accept strings for `load_defaults` version + +# 6.0.0 - 2023-05-24 + +* Add obsolete fingerprints to comparison report +* Warn about missing CSRF protection when defaults are not loaded (Chris Kruger) +* Scan directories that include the word `public` +* Raise minimum Ruby version to 3.0 +* Drop support for Ruby 1.8/1.9 syntax +* Fix end-of-life dates for Ruby +* Fix false positive with `content_tag` in newer Rails + +# 5.4.1 - 2023-02-21 + +* Fix file/line location for EOL software warnings +* Revise checking for request.env to only consider request headers +* Add `redirect_back` and `redirect_back_or_to` to open redirect check +* Support Rails 7 redirect options +* Add Rails 6.1 and 7.0 default configuration values +* Prevent redirects using `url_from` being marked as unsafe (Lachlan Sylvester) +* Warn about unscoped find for `find_by(id: ...)` +* Support `presence`, `presence_in` and `in?` +* Fix issue with `if` expressions in `when` clauses + +# 5.4.0 - 2022-11-17 + +* Use relative paths for CodeClimate report format (Mike Poage) +* Add check for weak RSA key sizes and padding modes +* Handle multiple values and splats in case/when +* Ignore more model methods in redirects +* Add check for absolute paths issue with Pathname +* Fix `load_rails_defaults` overwriting settings in the Rails application (James Gregory-Monk) + +# 5.3.1 - 2022-08-09 + +* Fix version range for CVE-2022-32209 + +# 5.3.0 - 2022-08-09 + +* Include explicit engine or lib paths in vendor/ (Joe Rafaniello) +* Load rexml as a Brakeman dependency +* Fix "full call" information propagating unnecessarily +* Add check for CVE-2022-32209 +* Add CWE information to warnings (Stephen Aghaulor) + +# 5.2.3 - 2022-05-01 + +* Fix error with hash shorthand syntax +* Match order of interactive options with help message (Rory O'Kane) + +# 5.2.2 - 2022-04-06 + +* Update `ruby_parser` for Ruby 3.1 support (Merek Skubela) +* Handle `nil` when joining values (Dan Buettner) +* Update message for unsafe reflection (Pedro Baracho) +* Add additional String methods for SQL injection check +* Respect equality in `if` conditions + +# 5.2.1 - 2022-01-30 + +* Add warning codes for EOL software warnings + +# 5.2.0 - 2021-12-15 + +* Initial Rails 7 support +* Require Ruby 2.5.0+ +* Fix issue with calls to `foo.root` in routes +* Ignore `I18n.locale` in SQL queries +* Do not treat `sanitize_sql_like` as safe +* Add new checks for unsupported Ruby and Rails versions + +# 5.1.2 - 2021-10-28 + +* Handle cases where enums are not symbols +* Support newer Haml with ::Haml::AttributeBuilder.build +* Fix issue where the previous output is still visible (Jason Frey) +* Fix warning sorting with nil line numbers +* Update for latest RubyParser (Ryan Davis) + +# 5.1.1 - 2021-07-19 + +* Unrefactor IgnoreConfig's use of `Brakeman::FilePath` + +# 5.1.0 - 2021-07-19 + +* Initial support for ActiveRecord enums +* Support `Hash#include?` +* Interprocedural dataflow from very simple class methods +* Fix SARIF report when checks have no description (Eli Block) +* Add ignored warnings to SARIF report (Eli Block) +* Add `--sql-safe-methods` option (Esty Scheiner) +* Update SQL injection check for Rails 6.0/6.1 +* Fix false positive in command injection with `Open3.capture` (Richard Fitzgerald) +* Fix infinite loop on mixin self-includes (Andrew Szczepanski) +* Ignore dates in SQL +* Refactor `cookie?`/`param?` methods (Keenan Brock) +* Ignore renderables in dynamic render path check (Brad Parker) +* Support `Array#push` +* Better `Array#join` support +* Adjust copy of `--interactive` menu (Elia Schito) +* Support `Array#*` +* Better method definition tracking and lookup +* Support `Hash#values` and `Hash#values_at` +* Check for user-controlled evaluation even if it's a call target +* Support `Array#fetch` and `Hash#fetch` +* Ignore `sanitize_sql_like` in SQL +* Ignore method calls on numbers in SQL +* Add GitHub Actions format (Klaus Badelt) +* Read and parse files in parallel + +# 5.0.4 - 2021-06-08 + +(brakeman gem release only) + +* Update bundled `ruby_parser` to include argument forwarding support + +# 5.0.2 - 2021-06-07 + +* Fix Loofah version check + +# 5.0.1 - 2021-04-27 + +* Detect `::Rails.application.configure` too +* Set more line numbers on Sexps +* Support loading `slim/smart` +* Don't fail if $HOME/$USER are not defined +* Always ignore slice/only calls for mass assignment +* Convert splat array arguments to arguments + +# 5.0.0 - 2021-01-26 + +* Ignore `uuid` as a safe attribute +* Collapse `__send__` calls +* Ignore `Tempfile#path` in shell commands +* Ignore development environment +* Revamp CSV report to a CSV list of warnings +* Set Rails configuration defaults based on `load_defaults` version +* Add check for (more) unsafe method reflection +* Suggest using `--force` if no Rails application is detected +* Add Sonarqube report format (Adam England) +* Add check for potential HTTP verb confusion +* Add `--[no-]skip-vendor` option +* Scan (almost) all Ruby files in project + +# 4.10.1 - 2020-12-24 + +* Declare REXML as a dependency (Ruby 3.0 compatibility) +* Use `Sexp#sexp_body` instead of `Sexp#[..]` (Ruby 3.0 compatibility) +* Prevent render loops when template names are absolute paths +* Ensure RubyParser is passed file path as a String +* Support new Haml 5.2.0 escaping method + +# 5.0.0.pre1 - 2020-11-17 + +* Add check for (more) unsafe method reflection +* Suggest using `--force` if no Rails application is detected +* Add Sonarqube report format (Adam England) +* Add check for potential HTTP verb confusion +* Add `--[no-]skip-vendor` option +* Scan (almost) all Ruby files in project +* Add support for Haml 5.2.0 + +# 4.10.0 - 2020-09-28 + +* Add SARIF report format (Steve Winton) + +# 4.9.1 - 2020-09-04 + +* Check `chomp`ed strings for SQL injection +* Use version from `active_record` for non-Rails apps (Ulysse Buonomo) +* Always set line number for joined arrays +* Avoid warning about missing `attr_accessible` if `protected_attributes` gem is used + +# 4.9.0 - 2020-08-04 + +* Add check for CVE-2020-8166 (Jamie Finnigan) +* Avoid warning when `safe_yaml` is used via `YAML.load(..., safe: true)` +* Add check for user input in `ERB.new` (Matt Hickman) +* Add `--ensure-ignore-notes` (Eli Block) +* Remove whitelist/blacklist language, add clarifications +* Do not warn about mass assignment with `params.permit!.slice` +* Add "full call" information to call index results +* Ignore `params.permit!` in path helpers +* Treat `Dir.glob` as safe source of values in guards +* Always scan `environment.rb` + +# 4.8.2 - 2020-05-12 + +* Add check for CVE-2020-8159 +* Fix `authenticate_or_request_with_http_basic` check for passed blocks (Hugo Corbucci) +* Add `--text-fields` option +* Add check for escaping HTML entities in JSON configuration + +# 4.8.1 - 2020-04-06 + +* Check SQL query strings using `String#strip` or `String.squish` +* Handle non-symbol keys in locals hash for render() +* Warn about global(!) mass assignment +* Index calls in render arguments + +# 4.8.0 - 2020-02-18 + +* Add JUnit-XML report format (Naoki Kimura) +* Sort ignore files by fingerprint and line (Ngan Pham) +* Freeze call index results +* Fix output test when using newer Minitest +* Properly render confidence in Markdown report +* Report old warnings as fixed if zero warnings reported +* Catch dangerous concatenation in `CheckExecute` (Jacob Evelyn) +* Show user-friendly message when ignore config file has invalid JSON (D. Hicks) +* Initialize Rails version with `nil` (Carsten Wirth) + +# 4.7.2 - 2019-11-25 + +* Remove version guard for `named_scope` vs. `scope` +* Find SQL injection in `String#strip_heredoc` target +* Handle more `permit!` cases +* Ensure file name is set when processing model +* Add `request.params` as query parameters + +# 4.7.1 - 2019-10-29 + +* Check string length against limit before joining +* Fix errors from frozen `Symbol#to_s` in Ruby 2.7 +* Fix flaky rails4 test (Adam Kiczula) +* Added release dates to each version in CHANGES (TheSpartan1980) +* Catch reverse tabnabbing with `:_blank` symbol (Jacob Evelyn) +* Convert `s(:lambda)` to `s(:call)` in `Sexp#block_call` +* Sort text report by file and line (Jacob Evelyn) + +# 4.7.0 - 2019-10-16 + +* Refactor `Brakeman::Differ#second_pass` (Benoit Côté-Jodoin) +* Ignore interpolation in `%W[]` +* Fix `version_between?` (Andrey Glushkov) +* Add support for `ruby_parser` 3.14.0 +* Ignore `form_for` for XSS check +* Update Haml support to Haml 5.x +* Catch shell injection from `-c` shell commands (Jacob Evelyn) +* Correctly handle non-symbols in `CheckCookieSerialization` (Phil Turnbull) + +# 4.6.1 - 2019-07-24 + +* Fix Reverse Tabnabbing warning message (Steffen Schildknecht / Jörg Schiller) + +# 4.6.0 - 2019-07-23 + +* Skip calls to `dup` +* Add reverse tabnabbing check (Linos Giannopoulos) +* Better handling of gems with no version declared +* Warn people that Haml 5 is not fully supported (Jared Beck) +* Avoid warning about file access with `ActiveStorage::Filename#sanitized` (Tejas Bubane) +* Update loofah version for fixing CVE-2018-8048 (Markus Nölle) +* Restore `Warning#relative_path` +* Add check for cookie serialization with Marshal +* Index calls in initializers +* Improve template output handling in conditional branches +* Avoid assigning `nil` line numbers to `Sexp`s +* Add special warning code for custom checks +* Add call matching by regular expression + +# 4.5.1 - 2019-05-11 + +* Add `Brakeman::FilePath` to represent file paths +* Handle trailing comma in block args +* Properly handle empty partial name +* Use relative paths for `__FILE__` +* Convert `!!` calls to boolean value +* Add optional check for `config.force_ssl` +* Remove code for Ruby versions prior to 1.9 +* Check `link_to` with block for href XSS +* Add SQL injection checks for `find_or_create_by` and friends +* Add deserialization warning for `Oj.load/object_load` +* Add initial Rails 6 support +* Add SQL injection checks for `destroy_by`/`delete_by` + +# 4.5.0 - 2019-03-16 + +* Update `ruby_parser`, use `ruby_parser-legacy` +* More thoroughly handle `Shellwords` escaping +* Handle non-integer version number comparisons +* Use `FileParser` in `Scanner` to parse files +* Add original exception to `Tracker#errors` list +* Add support for CoffeeScript in Slim templates +* Improve support for embedded template "filters" +* Remove Sass dependency +* Set location information in `CheckContentTag` +* Stop swallowing exceptions in `AliasProcessor` +* Avoid joining strings with different encodings +* Handle `**` inside Hash literals +* Better handling of splat/kwsplat arguments +* Improve "user input" reported for SQL injection + +# 4.4.0 - 2019-01-17 + +* Set default encoding to UTF-8 +* Update to Slim 4.0.1 (Jake Peterson) +* Update to RubyParser 3.12.0 +* Add rendered template information to render paths +* Fix trim mode for ERb templates in old Rails versions +* Fix thread-safety issue in CallIndex +* Add `--enable` option to enable optional checks +* Support reading gem versions from gemspecs +* Support gem versions which are just major.minor (e.g. 3.0) +* Treat `if not` like `unless` +* Handle empty `secrets.yml` files (Naoki Kimura) +* Correctly set `rel="noreferrer"` in HTML reports +* Avoid warning about command injection when `String#shellescape` and `Shellwords.shelljoin` are used (George Ogata) +* Add Dockerfile to run Brakeman inside Docker (Ryan Kemper) +* Trim some unnecessary files from bundled gems +* Add check for CVE-2018-3760 +* Avoid nils when concatenating arrays +* Ignore Tempfiles in FileAccess warnings (Christina Koller) +* Complete overhaul of warning message construction +* Deadcode and typo fixes found via Coverity + +# 4.3.1 - 2018-06-07 + +* Ignore `Object#freeze`, use the target instead +* Ignore `foreign_key` calls in SQL +* Handle `included` calls outside of classes/modules +* Add `:BRAKEMAN_SAFE_LITERAL` to represent known-safe literals +* Handle `Array#map` and `Array#each` over literal arrays +* Use safe literal when accessing literal hash with unknown key +* Avoid deprecated use of ERB in Ruby 2.6 (Koichi ITO) +* Allow `symbolize_keys` to be called on `params` in SQL (Jacob Evelyn) +* Improve handling of conditionals in shell commands (Jacob Evelyn) +* Fix error when setting line number in implicit renders + +# 4.3.0 - 2018-05-11 + +* Check exec-type calls even if they are targets +* Convert `Array#join` to string interpolation +* `BaseCheck#include_interp?` should return first string interpolation +* Add `--parser-timeout` option +* Track parent calls in CallIndex +* Warn about dangerous `link_to` href with `sanitize()` +* Ignore `params#to_h` and `params#to_hash` in SQL checks +* Change "".freeze to just "" +* Ignore `Process.pid` in system calls +* Index Kernel#\` calls even if they are targets +* Code Climate: omit leading dot from `only_files` (Todd Mazierski) +* `--color` can be used to force color output +* Fix reported line numbers for CVE-2018-3741 and CVE-2018-8048 + +# 4.2.1 - 2018-03-24 + +* Add warning for CVE-2018-3741 +* Add warning for CVE-2018-8048 +* Scan `app/jobs/` directory +* Handle `template_exists?` in controllers + +# 4.2.0 - 2018-02-22 + +* Avoid warning about symbol DoS on `Model#attributes` +* Avoid warning about open redirects with model methods ending with `_path` +* Avoid warning about command injection with `Shellwords.escape` +* Use ivars from `initialize` in libraries +* `Sexp#body=` can accept `:rlist` from `Sexp#body_list` +* Update RubyParser to 3.11.0 +* Fix multiple assignment of globals +* Warn about SQL injection in `not` +* Exclude template folders in `lib/` (kru0096) +* Handle ERb use of `String#<<` method for Ruby 2.5 (Pocke) + +# 4.1.1 - 2017-12-19 + +* Remove check for use of `permit` with `*_id` keys +* Avoid duplicate warnings about permitted attributes + +# 4.1.0 - 2017-12-14 + +* Process models as root sexp instead of each sexp +* Avoid CSRF warning in Rails 5.2 default config +* Show better location for Sass errors (Andrew Bromwich) +* Warn about dynamic values in `Arel.sql` +* Fix `include_paths` for Code Climate engine (Will Fleming) +* Add check for dangerous keys in `permit` +* Try to guess options for `less` pager +* Better processing of op_asgn1 (e.g. x[:y] += 1) +* Add optional check for divide by zero +* Remove errors about divide by zero +* Avoid warning about file access for temp files +* Do not warn on params.permit with safe values +* Add Sexp#call_chain +* Use HTTPS for warning links +* Handle nested destructuring/multiple assignment +* Leave results on screen after paging +* Do not page if results fit on screen +* Support `app_path` configuration for Code Climate engine (Noah Davis) +* Refactor Code Climate engine options parsing (Noah Davis) +* Fix upgrade version for CVE-2016-6316 + +# 4.0.1 - 2017-09-25 + +* Disable pager when `CI` environment variable is set +* Fix output when pager fails + +# 4.0.0 - 2017-09-25 + +* Add simple pager for reports output to terminal +* Rename "Cross Site Scripting" to "Cross-Site Scripting" (Paul Tetreau) +* Rearrange tests a little bit +* Treat `request.cookies` like `cookies` +* Treat `fail`/`raise` like early returns +* Remove reliance on `CONFIDENCE` constant in checks +* Remove low confidence mass assignment warnings +* Reduce warnings about XSS in `link_to` +* "Plain" report output is now the default +* --exit-on-error and --exit-on-warn are now the default +* Fix --exit-on-error and --exit-on-warn in config files + +# 3.7.2 - 2017-08-16 + +* Fix --ensure-latest (David Guyon) + +# 3.7.1 - 2017-08-16 + +* Handle simple guard with return at end of branch +* Modularize bin/brakeman +* Improve multi-value Sexp error message +* Add more collection methods for iteration detection +* Update ruby2ruby and ruby_parser + +# 3.7.0 - 2017-06-30 + +* Improve support for rails4/rails5 options in config file +* Track more information about constant assignments +* Show progress indicator in interactive mode +* Handle simple conditional guards that use `return` +* Fix false positive for redirect_to in Rails 4 (Mário Areias) +* Avoid interpolating hashes/arrays on failed access + +# 3.6.2 - 2017-05-19 + +* Handle safe call operator in checks +* Better handling of `if` expressions in HAML rendering +* Remove `--rake` option +* Properly handle template names without `.html` or `.js` +* Set template file names during rendering for better errors +* Limit Slim dependency to before 3.0.8 +* Catch YAML parsing errors in session settings check +* Avoid warning about SQLi with `to_s` in `exists?` +* Update RubyParser to 3.9.0 +* Do not honor additional check paths in config by default +* Handle empty `if` expressions when finding return values +* Fix finding return value from empty `if` + +# 3.6.1 - 2017-03-24 + +* Fix error when using `--compare` (Sean Gransee) + +# 3.6.0 - 2017-03-23 + +* Avoid recursive Concerns +* Branch inside of `case` expressions +* Print command line option errors without modification +* Fix issue with nested interpolation inside SQL strings +* Ignore GraphQL tags inside ERB templates +* Add `--exit-on-error` (Michael Grosser) +* Only report CVE-2015-3227 when exact version is known +* Check targetless SQL calls outside of known models + +# 3.5.0 - 2017-02-01 + +* Allow `-t None` +* Fail on invalid checks specified by `-x` or `-t` +* Avoid warning about all, first, or last after Rails 4.0 +* Avoid warning about models in SQLi +* Lower confidence of SQLi when maybe not on models +* Warn about SQLi even potentially on non-models +* Report check name in JSON and plain reports +* Treat templates without `.html` as HTML anyway +* Add `--ensure-latest` option (tamgrosser / Michael Grosser) +* Add `--no-summary` to hide summaries in HTML/text reports +* Handle `included` block in concerns +* Process concerns before controllers + +# 3.4.1 - 2016-11-02 + +* Show action help at start of interactive ignore +* Check CSRF setting in direct subclasses of `ActionController::Base` (Jason Yeo) +* Configurable engines path (Jason Yeo) +* Use Ruby version to turn off SymbolDoS check +* Pull Ruby version from `.ruby-version` or Gemfile +* Avoid warning about `where_values_hash` in SQLi +* Fix ignoring link interpolation not at beginning of string + +# 3.4.0 - 2016-09-08 + +* Add new `plain` report format +* Add option to prune ignore file with `-I` +* Improved Slim template support +* Show obsolete ignore entries in reports (Jonathan Cheatham) +* Support creating reports in non-existent paths +* Add `--no-exit-warn` + +# 3.3.5 - 2016-08-12 + +* Fix bug in reports when using --debug option + +# 3.3.4 - 2016-08-12 + +* Add generic warning for CVE-2016-6316 +* Warn about dangerous use of `content_tag` with CVE-2016-6316 +* Add warning for CVE-2016-6317 +* Use Minitest + +# 3.3.3 - 2016-07-21 + +* Show path when no Rails app found (Neil Matatall) +* Index calls in view helpers +* Process inline template renders +* Avoid warning about hashes in link_to hrefs +* Add documentation for authentication category +* Ignore boolean methods in render paths +* Reduce open redirect duplicates +* Fix SymbolDoS error with unknown Rails version +* Sexp#value returns nil when there is no value +* Improve return value estimation + +# 3.3.2 - 2016-06-10 + +* Fix serious performance regression with global constant tracking + +# 3.3.1 - 2016-06-03 + +* Delay loading vendored gems and modifying load path +* Avoid warning about SQL injection with `quoted_primary_key` +* Support more safe `&.` operations +* Allow multiple line regex in `validates_format_of` (Dmitrij Fedorenko) +* Only consider `if` branches in templates +* Avoid overwriting instance/class methods with same name (Tim Wade) +* Add `--force-scan` option (Neil Matatall) +* Improved line number accuracy in ERB templates (Patrick Toomey) + +# 3.3.0 - 2016-05-05 + +* Skip processing obviously false if branches (more broadly) +* Skip if branches with `Rails.env.test?` +* Return exit code `4` if no Rails application is detected +* Avoid warning about mass assignment with `params.slice` +* Avoid warning about `u` helper (Chad Dollins) +* Add optional check for secrets in source code +* Process `Array#first` +* Allow non-Hash arguments in `protect_from_forgery` (Jason Yeo) +* Avoid warning on `popen` with array +* Bundle all dependencies in gem +* Track constants globally +* Handle HAML `find_and_preserve` with a block +* [Code Climate engine] When possible, output to /dev/stdout (Gordon Diggs) +* [Code Climate engine] Remove nil entries from include_paths (Gordon Diggs) +* [Code Climate engine] Report end lines for issues (Gordon Diggs) + +# 3.2.1 - 2016-02-25 + +* Remove `multi_json` dependency from `bin/brakeman` + +# 3.2.0 - 2016-02-25 + +* Skip Symbol DoS check on Rails 5 +* Only update ignore config file on changes +* Sort ignore config file +* Support calls using `&.` operator +* Update ruby_parser dependency to 3.8.1 +* Remove `fastercsv` dependency +* Fix finding calls with `targets: nil` +* Remove `multi_json` dependency +* Handle CoffeeScript in HAML +* Avoid render warnings about params[:action]/params[:controller] +* Index calls in class bodies but outside methods + +# 3.1.5 - 2016-01-28 + +* Fix CodeClimate construction of --only-files (Will Fleming) +* Add check for denial of service via routes (CVE-2015-7581) +* Warn about RCE with `render params` (CVE-2016-0752) +* Add check for `strip_tags` XSS (CVE-2015-7579) +* Add check for `sanitize` XSS (CVE-2015-7578/80) +* Add check for `reject_if` proc bypass (CVE-2015-7577) +* Add check for mime-type denial of service (CVE-2016-0751) +* Add check for basic auth timing attack (CVE-2015-7576) +* Add initial Rails 5 support +* Check for implicit integer comparison in dynamic finders +* Support directories better in --only-files and --skip-files (Patrick Toomey) +* Avoid warning about `permit` in SQL +* Handle guards using `detect` +* Avoid warning on user input in comparisons +* Handle module names with self methods +* Add session manipulation documentation + +# 3.1.4 - 2015-12-22 + +* Emit brakeman's native fingerprints for Code Climate engine (Noah Davis) +* Ignore secrets.yml if in .gitignore +* Clean up Ruby warnings (Andy Waite) +* Increase test coverage for option parsing (Zander Mackie) +* Work around safe_yaml error + +# 3.1.3 - 2015-12-03 + +* Check for session secret in secrets.yml +* Respect `exit_on_warn` in config file +* Avoid warning on `without_protection: true` with hash literals +* Make sure before_filter call with block is still a call +* CallIndex improvements +* Restore minimum Highline version (Kevin Glowacz) +* Add Code Climate output format (Ashley Baldwin-Hunter/Devon Blandin/John Pignata/Michael Bernstein) +* Iteratively replace values +* Output nil instead of false for user_input in JSON +* Depend on safe_yaml 1.0 or later +* Test coverage improvements for Brakema module (Bethany Rentz) + +# 3.1.2 - 2015-10-28 + +* Treat `current_user` like a model +* Set user input value for inline renders +* Avoid warning on inline renders with safe content types +* Handle empty interpolation in HAML filters +* Ignore filters that are not method names +* Avoid warning about model find/find_by* in hrefs +* Use SafeYAML to load configuration files +* Warn on SQL query keys, not values in hashes +* Allow inspection of recursive Sexps +* Add line numbers to class-level warnings +* Handle `private def ...` +* Catch divide-by-zero in alias processing +* Reduce string allocations in Warning#initialize +* Sortable tables in HTML report (David Lanner) +* Search for config file relative to application root + +# 3.1.1 - 2015-09-23 + +* Add optional check for use of MD5 and SHA1 +* Avoid warning when linking to decorated models +* Add check for user input in session keys +* Fix chained assignment +* Treat a.try(&:b) like a.b() +* Consider j/escape_javascript safe inside HAML JavaScript blocks +* Better HAML processing of find_and_preserve calls +* Add more Arel methods to be ignored in SQL +* Fix absolute paths for Windows (Cody Frederick) +* Support newer terminal-table releases +* Allow searching call index methods by regex (Alex Ianus) + +# 3.1.0 - 2015-08-31 + +* Add support for gems.rb/gems.locked +* Update render path information in JSON reports +* Remove renaming of several Sexp nodes +* Convert YAML config keys to symbols (Karl Glaser) +* Use railties version if rails gem is missing (Lucas Mazza) +* Warn about unverified SSL mode in Net::HTTP.start +* Add Model, Controller, Template, Config classes internally +* Report file being parsed in debug output +* Update dependencies to Ruby 1.8 incompatible versions +* Treat Array.new and Hash.new as arrays/hashes +* Fix handling of string concatenation with existing string +* Treat html_safe like raw() +* Fix low confidence XSS warning code +* Avoid warning on path creation methods in link_to +* Expand safe methods to match methods with targets +* Avoid duplicate eval() warnings + +# 3.0.5 - 2015-06-20 + +* Fix check for CVE-2015-3227 + +# 3.0.4 - 2015-06-18 + +* Add check for CVE-2015-3226 (XSS via JSON keys) +* Add check for CVE-2015-3227 (XML DoS) +* Treat `<%==` as unescaped output +* Update `ruby_parser` dependency to 3.7.0 + +# 3.0.3 - 2015-04-20 + +* Ignore more Arel methods in SQL +* Warn about protect_from_forgery without exceptions (Neil Matatall) +* Handle lambdas as filters +* Ignore quoted_table_name in SQL (Gabriel Sobrinho) +* Warn about RCE and file access with `open` +* Handle array include? guard conditionals +* Do not ignore targets of `to_s` in SQL +* Add Rake task to exit with error code on warnings (masarakki) + +# 3.0.2 - 2015-03-09 + +* Alias process methods called in class scope on models +* Treat primary_key, table_name_prefix, table_name_suffix as safe in SQL +* Fix using --compare and --add-checks-path together +* Avoid warning about mass assignment with string literals +* Only report original regex DoS locations +* Improve render path information implementation +* Report correct file for simple_format usage CVE warning +* Remove URI.escape from HTML reports with GitHub repos +* Update ruby_parser to ~> 3.6.2 +* Remove formatting newlines in HAML template output +* Ignore case value in XSS checks +* Fix CSV output when there are no warnings +* Handle processing of explicitly shadowed block arguments + +# 3.0.1 - 2015-01-23 + +* Avoid protect_from_forgery warning unless ApplicationController inherits from ActionController::Base +* Properly format command interpolation (again) +* Remove Slim dependency (Casey West) +* Allow for controllers/models/templates in directories under `app/` (Neal Harris) +* Add `--add-libs-path` for additional libraries (Patrick Toomey) +* Properly process libraries (Patrick Toomey) + +# 3.0.0 - 2015-01-03 + +* Add check for CVE-2014-7829 +* Add check for cross-site scripting via inline renders +* Fix formatting of command interpolation +* Local variables are no longer formatted as `(local var)` +* Actually skip skipped before filters +* `--exit-on-warn --compare` only returns error code on new warnings (Jeff Yip) +* Fix parsing of `<%==` in ERB +* Sort warnings by fingerprint in JSON report (Jeff Yip) +* Handle symmetric multiple assignment +* Do not branch for self attribute assignment `x = x.y` +* Fix CVE for CVE-2011-2932 +* Remove "fake filters" from warning fingerpints +* Index calls in `lib/` files +* Move Symbol DoS to optional checks +* CVEs report correct line and file name (Gemfile/Gemfile.lock) (Rob Fletcher) +* Change `--separate-models` to be the default + +# 2.6.3 - 2014-10-14 + +* Whitelist `exists` arel method from SQL injection check +* Avoid warning about Symbol DoS on safe parameters as method targets +* Fix stack overflow in ProcessHelper#class_name +* Add optional check for unscoped find queries (Ben Toews) +* Add framework for optional checks +* Fix stack overflow for cycles in class ancestors (Jeff Rafter) + +# 2.6.2 - 2014-08-18 + +* Add check for CVE-2014-3415 +* Avoid warning about symbolizing safe parameters +* Update ruby2ruby dependency to 2.1.1 +* Expand app path in one place instead of all over (Jeff Rafter) +* Add `--add-checks-path` option for external checks (Clint Gibler) +* Fix SQL injection detection in deep nested string building +* Add `-4` option to force Rails 4 mode +* Check entire call for `send` +* Check for .gitignore of secrets in subdirectories +* Fix block statement endings in Erubis +* Fix undefined variable in controller processing error (Jason Barnabe) + +# 2.6.1 - 2014-07-02 + +* Add check for CVE-2014-3482 and CVE-2014-3483 +* Add support for keyword arguments in blocks +* Remove unused warning codes (Bill Fischer) + +# 2.6.0 - 2014-06-06 + +* Fix detection of `:host` setting in redirects with chained calls +* Add check for CVE-2014-0130 +* Add `find_by`/`find_by!` to SQLi check for Rails 4 +* Parse most files upfront instead of on demand +* Do not branch values for `+=` +* Update to use RubyParser 3.5.0 (Patrick Toomey) +* Improve default route detection in Rails 3/4 (Jeff Jarmoc) +* Handle controllers and models split across files (Patrick Toomey) +* Fix handling of `protected_attributes` gem in Rails 4 (Geoffrey Hichborn) +* Ignore more model methods in redirects +* Fix CheckRender with nested render calls + +# 2.5.0 - 2014-04-30 + + * Add support for RailsLTS 2.3.18.7 and 2.3.18.8 + * Add support for Rails 4 `before_actions` and friends + * Move SQLi CVE checks to `CheckSQLCVEs` + * Check for protected_attributes gem + * Fix SQLi detection in chain calls in scopes + * Add GitHub-flavored Markdown output format (Greg Ose) + * Fix false positives when sanitize() is used in SQL (Jeff Yip) + * Add String#intern and Hash#symbolize_keys DoS check (Jan Rusnacko) + * Check all arguments in Model.select for SQLi + * Fix false positive when :host is specified in redirect + * Handle more non-literals in routes + * Add check for regex denial of service (Ben Toews) + +# 2.4.3 - 2014-03-23 + + No changes. 2.4.2 gem release was unsigned, 2.4.3 is signed. + +# 2.4.2 - 2014-03-21 + + * Remove `rescue Exception` + * Fix duplicate warnings about sanitize CVE + * Reuse duplicate call location information + * Only track original template output locations + * Skip identically rendered templates + * Fix HAML template processing + +# 2.4.1 - 2014-02-19 + + * Add check for CVE-2014-0082 + * Add check for CVE-2014-0081, replaces CVE-2013-6415 + * Add check for CVE-2014-0080 + +# 2.4.0 - 2014-02-05 + + * Detect Rails LTS versions + * Reduce false positives for SQL injection in string building + * More accurate user input marking for SQL injection warnings + * Detect SQL injection in `delete_all`/`destroy_all` + * Detect SQL injection raw SQL queries using `connection` + * Parse exact versions from Gemfile.lock for all gems + * Ignore generators + * Update to RubyParser 3.4.0 + * Fix false positives when SQL methods are not called on AR models (Aaron Bedra) + * Add check for uses of OpenSSL::SSL::VERIFY_NONE (Aaron Bedra) + * No longer raise exceptions if a class name cannot be determined + * Fingerprint attribute warnings individually (Case Taintor) + +# 2.3.1 - 2013-12-13 + + * Fix check for CVE-2013-4491 (i18n XSS) to detect workaround + * Fix link for CVE-2013-6415 (number_to_currency) + +# 2.3.0 - 2013-12-12 + + * Add check for Parameters#permit! + * Add check for CVE-2013-4491 (i18n XSS) + * Add check for CVE-2013-6414 (header DoS) + * Add check for CVE-2013-6415 (number_to_currency) + * Add check for CVE-2013-6416 (simple_format XSS) + * Add check for CVE-2013-6417 (query generation) + * Fix typos in reflection and translate bug messages + * Collapse send/try calls + * Fix Slim XSS false positives (Noah Davis) + * Whitelist `Model#create` for redirects + * Fix scoping issues with instance variables and blocks + +# 2.2.0 - 2013-10-28 + + * Reduce command injection false positives + * Use Rails version from Gemfile if it is available + * Only add routes with actual names + * Ignore redirects to models using friendly_id (AJ Ostrow) + * Support scanning Rails engines (Geoffrey Hichborn) + * Add check for detailed exceptions in production + +# 2.1.2 - 2013-09-18 + + * Do not attempt to load custom Haml filters + * Do not warn about `to_json` XSS in Rails 4 + * Add --table-width option to set width of text reports (ssendev) + * Remove fuzzy matching on dangerous attr_accessible values + +# 2.1.1 - 2013-08-21 + + * New warning code for dangerous attributes in attr_accessible + * Do not warn on attr_accessible using roles + * More accurate results for model attribute warnings + * Use exit code zero with `-z` if all warnings ignored + * Respect ignored warnings in rescans + * Ignore dynamic controller names in routes + * Fix infinite loop when run as rake task (Matthew Shanley) + * Respect ignored warnings in tabs format reports + +# 2.1.0 - 2013-07-17 + + * Support non-native line endings in Gemfile.lock (Paul Deardorff) + * Support for ignoring warnings + * Check for dangerous model attributes defined in attr_accessible (Paul Deardorff) + * Update to ruby_parser 3.2.2 + * Add brakeman-min gemspec + * Load gem dependencies on-demand + * Output JSON diff to file if -o option is used + * Add check for authenticate_or_request_with_http_basic + * Refactor of SQL injection check code (Bart ten Brinke) + * Fix detection of duplicate XSS warnings + * Refactor reports into separate classes + * Allow use of Slim 2.x (Ian Zabel) + * Return error exit code when application path is not found + * Add `--branch-limit` option, limit to 5 by default + * Add more methods to check for command injection + * Fix output format detection to be more strict again + * Allow empty Brakeman configuration file + +# 2.0.0 - 2013-05-20 + + * Add `--only-files` option to specify files/paths to scan (Ian Ehlert) + * Add Marshal/CSV deserialization check + * Combine deserialization checks into single check + * Avoid duplicate "Dangerous Send" and "Unsafe Reflection" warnings + * Avoid duplicate results for Symbol DoS check + * Medium confidence for mass assignment to attr_protected models + * Remove "timestamp" key from JSON reports + * Remove deprecated config file locations + * Relative paths are used by default in JSON reports + * `--absolute-paths` replaces `--relative-paths` + * Only treat classes with names containing `Controller` like controllers + * Better handling of classes nested inside controllers + * Better handling of controller classes nested in classes/modules + * Handle `->` lambdas with no arguments + * Handle explicit block argument destructuring + * Skip Rails config options that are real objects + * Detect Rails 3 JSON escape config option + * Much better tracking of warning file names + * Fix errors when using `--separate-models` (Noah Davis) + * Fix fingerprint generation to actually use the file path + * Fix text report console output in JRuby + * Fix false positives on `Model#id` + * Fix false positives on `params.to_json` + * Fix model path guesses to use "models/" instead of "controllers/" + * Clean up SQL CVE warning messages + * Use exceptions instead of abort in brakeman lib + * Update to Ruby2Ruby 2.0.5 + +# 1.9.5 - 2013-04-05 + + * Add check for unsafe symbol creation + * Do not warn on mass assignment with `slice`/`only` + * Do not warn on session secret if in `.gitignore` + * Fix scoping for blocks and block arguments + * Fix error when modifying blocks in templates + * Fix session secret check for Rails 4 + * Fix crash on `before_filter` outside controller + * Fix `Sexp` hash cache invalidation + * Respect `quiet` option in configuration file + * Convert assignment to simple `if` expressions to `or` + * More fixes for assignments inside branches + * Pin to ruby2ruby version 2.0.3 + +# 1.9.4 - 2013-03-19 + + * Add check for CVE-2013-1854 + * Add check for CVE-2013-1855 + * Add check for CVE-2013-1856 + * Add check for CVE-2013-1857 + * Fix `--compare` to work with older versions + * Add "no-referrer' to HTML report links + * Don't warn when invoking `send` on user input + * Slightly faster cloning of Sexps + * Detect another way to add `strong_parameters` + +# 1.9.3 - 2013-03-01 + + * Add render path to JSON report + * Add warning fingerprints + * Add check for unsafe reflection (Gabriel Quadros) + * Add check for skipping authentication methods with blacklist + * Add support for Slim templates + * Remove empty tables from reports (Owen Ben Davies) + * Handle `prepend/append_before_filter` + * Performance improvements when handling branches + * Fix processing of `production.rb` + * Fix version check for Ruby 2.0 + * Expand HAML dependency to include 4.0 + * Scroll errors into view when expanding in HTML report + +# 1.9.2 - 2013-02-14 + + * Add check for CVE-2013-0269 + * Add check for CVE-2013-0276 + * Add check for CVE-2013-0277 + * Add check for CVE-2013-0333 + * Check for more send-like methods + * Check for more SQL injection locations + * Check for more dangerous YAML methods + * Support MultiJSON 1.2 for Rails 3.0 and 3.1 + +# 1.9.1 - 2013-01-19 + + * Update to RubyParser 3.1.1 (neersighted) + * Remove ActiveSupport dependency (Neil Matatall) + * Do not warn on arrays passed to `link_to` (Neil Matatall) + * Warn on secret tokens + * Warn on more mass assignment methods + * Add check for CVE-2012-5664 + * Add check for CVE-2013-0155 + * Add check for CVE-2013-0156 + * Add check for unsafe `YAML.load` + +# 1.9.0 - 2012-12-25 + + * Update to RubyParser 3 + * Ignore route information by default + * Support `strong_parameters` + * Support newer `validates :format` call + * Add scan time to reports + * Add Brakeman version to reports + * Fix `CheckExecute` to warn on all string interpolation + * Fix false positive on `to_sql` calls + * Don't mangle whitespace in JSON code formatting + * Add AppTree as facade for filesystem (brynary) + * Add link for translate vulnerability warning (grosser) + * Rename LICENSE to MIT-LICENSE, remove from README (grosser) + * Add Rakefile to run tests (grosser) + * Better default config file locations (grosser) + * Reduce Sexp creation + * Handle empty model files + * Remove "find by regex" feature from `CallIndex` + +# 1.8.3 - 2012-11-13 + + * Use `multi_json` gem for better harmony + * Performance improvement for call indexing + * Fix issue with processing HAML files + * Handle pre-release versions when processing `Gemfile.lock` + * Only check first argument of `redirect_to` + * Fix false positives from `Model.arel_table` accesses + * Fix false positives on redirects to models decorated with Draper gem + * Fix false positive on redirect to model association + * Fix false positive on `YAML.load` + * Fix false positive XSS on any `to_i` output + * Fix error on Rails 2 name routes with no args + * Fix error in rescan of mixins with symbols in method name + * Do not rescan non-Ruby files in config/ + +# 1.8.2 - 2012-10-17 + + * Fixed rescanning problems caused by 1.8.0 changes + * Fix scope calls with single argument + * Report specific model name in rendered collections + * Handle overwritten JSON escape settings + * Much improved test coverage + * Add CHANGES to gemspec + +# 1.8.1 - 2012-09-24 + + * Recover from errors in output formatting + * Fix false positive in redirect_to (Neil Matatall) + * Fix problems with removal of `Sexp#method_missing` + * Fix array indexing in alias processing + * Fix old mail_to vulnerability check + * Fix rescans when only controller action changes + * Allow comparison of versions with unequal lengths + * Handle super calls with blocks + * Respect `-q` flag for "Rails 3 detected" message + +# 1.8.0 - 2012-09-05 + + * Support relative paths in reports (fsword) + * Allow Brakeman to be run without tty (fsword) + * Fix exit code with `--compare` (fsword) + * Fix `--rake` option (Deepak Kumar) + * Add high confidence warnings for `to_json` XSS (Neil Matatall) + * Fix `redirect_to` false negative + * Fix duplicate warnings with `raw` calls + * Fix shadowing of rendered partials + * Add "render chain" to HTML reports + * Add check for XSS in `content_tag` + * Add full backtrace for errors in debug mode + * Treat model attributes in `or` expressions as immediate values + * Switch to method access for Sexp nodes + +# 1.7.1 - 2012-08-13 + + * Add check for CVE-2012-3463 + * Add check for CVE-2012-3464 + * Add check for CVE-2012-3465 + * Add charset to HTML report (hooopo) + * Report XSS in select() for Rails 2 + +# 1.7.0 - 2012-07-31 + + * Add check for CVE-2012-3424 + * Link report types to descriptions on website + * Report errors raised while running check + * Improve processing of Rails 3 routes + * Fix "empty char-class" error + * Improve file access check + * Avoid warning on non-ActiveModel models + * Speed improvements by stripping down SexpProcessor + * Fix how `params[:x] ||=` is handled + * Treat user input in `or` expressions as immediate values + * Fix processing of negative array indexes + * Add line breaks to truncated table rows + +# 1.6.2 - 2012-06-13 + + * Add checks for CVE-2012-2660, CVE-2012-2661, CVE-2012-2694, CVE-2012-2695 (Dave Worth) + * Avoid warning when redirecting to a model instance + * Add `request.parameters` as a parameters hash + * Raise confidence level for model attributes in redirects + * Return non-zero exit code when missing dependencies + * Fix `before_filter :except` logic + * Only accept symbol literals as before_filter names + * Cache before_filter lookups + * Turn off quiet mode by default for `--compare` + +# 1.6.1 - 2012-05-23 + + * Major rewrite of CheckSQL + * Fix rescanning of deleted templates + * Process actions mixed into controllers + * Handle `render :template => ...` + * Check for inherited attr_accessible (Neil Matatall) + * Fix highlighting of HTML escaped values in HTML report + * Report line number of highlighted value, if available + +# 1.6.0 - 2012-04-20 + + * Remove the Ruport dependency (Neil Matatall) + * Add more informational JSON output (Neil Matatall) + * Add comparison to previous JSON report (Neil Matatall) + * Add highlighting of dangerous values in HTML/text reports + * Model#update_attribute should not raise mass assignment warning (Dave Worth) + * Don't check `find_by_*` method for SQL injection + * Fix duplicate reporting of mass assignment and SQL injection + * Fix rescanning of deleted files + * Properly check for rails_xss in Gemfile + +# 1.5.3 - 2012-04-10 + + * Add check for user input in Object#send (Neil Matatall) + * Handle render :layout in views + * Support output to multiple formats (Nick Green) + * Prevent infinite loops in mutually recursive templates + * Only check eval arguments for user input, not targets + * Search subdirectories for models + * Set values in request hashes and propagate to views + * Add rake task file to gemspec (Anton Ageev) + * Filter rescanning of templates (Neil Matatall) + * Improve handling of modules and nesting + * Test for zero errors in test reports + +# 1.5.2 - 2012-03-22 + + * Fix link_to checks for Rails 2.0 and 2.3 + * Fix rescanning of lib files (Neil Matatall) + * Output stack trace on interrupt when debugging + * Ignore user input in if statement conditions + * Fix --skip-files option + * Only warn on user input in render paths + * Fix handling of views when using rails_xss + * Revert to ruby_parser 2.3.1 for Ruby 1.8 parsing + +# 1.5.1- 2012-03-06 + + * Fix detection of global mass assignment setting + * Fix partial rendering in Rails 3 + * Show backtrace when interrupt received (Ruby 1.9 only) + * More debug output + * Remove duplicate method in Brakeman::Rails2XSSErubis + * Add tracking of module and class to Brakeman::BaseProcessor + * Report module when using Brakeman::FindCall + +# 1.5.0 - 2012-03-02 + + * Add version check for SafeBuffer vulnerability + * Add check for select vulnerability in Rails 3 + * select() is no longer considered safe in Rails 2 + * Add check for skipping CSRF protection with a blacklist + * Add JSON report format + * Model#id should not be considered XSS + * Standardize methods to check for SQL injection + * Fix Rails 2 route parsing issue with nested routes + +# 1.4.0 - 2012-02-24 + + * Add check for user input in link_to href parameter + * Match ERB processing to rails_xss plugin when plugin used + * Add Brakeman::Report#to_json, Brakeman::Warning#to_json + * Warnings below minimum confidence are dropped completely + * Brakeman.run always returns a Tracker + +# 1.3.0 - 2012-02-09 + + * Add file paths to HTML report + * Add caching of filters + * Add --skip-files option + * Add support for attr_protected + * Add detection of request.env as user input + * Descriptions of checks in -k output + * Improved processing of named scopes + * Check for mass assignment in ActiveRecord::Associations::AssociationCollection#build + * Better variable substitution + * Table output option for rescan reports + +# 1.2.2 - 2012-01-26 + + * --no-progress works again + * Make CheckLinkTo a separate check + * Don't fail on unknown options to resource(s) + * Handle empty resource(s) blocks + * Add RescanReport#existing_warnings + +## 1.2.1 - 2012-01-20 + + * Remove link_to warning for Rails 3.x or when using rails_xss + * Don't warn if first argument to link_to is escaped + * Detect usage of attr_accessible with no arguments + * Fix error when rendering a partial from a view but not through a controller + * Fix some issues with rails_xss, CheckCrossSiteScripting, and CheckTranslateBug + * Simplify Brakeman Rake task + * Avoid modifying $VERBOSE + * Add Brakeman::RescanReport#to_s + * Add Brakeman::Warning#to_s + +## 1.2.0 - 2012-01-14 + + * Speed improvements for CheckExecute and CheckRender + * Check named_scope() and scope() for SQL injection + * Add --rake option to create rake task to run Brakeman + * Add experimental support for rescanning a subset of files + * Add --summary option to only output summary + * Fix a problem with Rails 3 routes + +## 1.1.0 - 2011-12-22 + + * Relax required versions for dependencies + * Performance improvements for source processing + * Better progress reporting + * Handle basic operators like << + - * / + * Rescue more errors to prevent complete crashes + * Compatibility with newer Haml versions + * Fix some warnings + +## 1.0.0 - 2011-12-08 + + * Better handling of assignments inside ifs + * Check more expressions for SQL injection + * Use latest ruby_parser for better 1.9 syntax support + * Better behavior for Brakeman as a library + +## 1.0.0rc1 - 2011-12-06 + + * Brakeman can now be used as a library + * Faster call search + * Add option to return error code if warnings are found (tw-ngreen) + * Allow truncated messages to be expanded in HTML + * Fix summary when using warning thresholds + * Better support for Rails 3 routes + * Reduce SQL injection duplicate warnings + * Lower confidence on mass assignment with no user input + * Ignore mass assignment using all literal arguments + * Keep expanded context in view with HTML output + +## 0.9.2 - 2011-11-22 + + * Fix Rails 3 configuration parsing + * Add t() helper to check for translate XSS bug + +## 0.9.1 - 2011-11-18 + + * Add warning for translator helper XSS vulnerability + +## 0.9.0 - 2011-11-17 + + * Process Rails 3 configuration files + * Fix CSV output + * Check for config.active_record.whitelist_attributes = true + * Always produce a warning for without_protection => true + +## 0.8.4 - 2011-11-04 + + * Option for separate attr_accessible warnings + * Option to set CSS file for HTML output + * Add file names for version-specific warnings + * Add line number for default routes in a controller + * Fix hash_insert() + * Remove use of Queue from threaded checks + +## 0.8.3 - 2011-10-25 + + * Respect -w flag in .tabs format (tw-ngreen) + * Escape HTML output of error messages + * Add --skip-libs option + +## 0.8.2 - 2011-10-01 + + * Run checks in parallel threads by default + * Fix compatibility with ruby_parser 2.3.1 + +## 0.8.1 - 2011-09-28 + + * Add option to assume all controller methods are actions + * Recover from errors when parsing routes + +## 0.8.0 - 2011-09-15 + + * Add check for mass assignment using without_protection + * Add check for password in http_basic_authenticate_with + * Warn on user input in hash argument with mass assignment + * auto_link is now considered safe for Rails >= 3.0.6 + * Output detected Rails version in report + * Keep track of methods called in class definition + * Add ruby_parser hack for Ruby 1.9 hash syntax + * Add a few Rails 3.1 tests + +## 0.7.2 - 2011-08-27 + + * Fix handling of params and cookies with nested access + * Add CVEs for checks added in 0.7.0 + +## 0.7.1 - 2011-08-18 + + * Require BaseProcessor for GemProcessor + +## 0.7.0 - 2011-08-17 + + * Allow local variable as a class name + * Add checks for vulnerabilities fixed in Rails 2.3.14 and 3.0.10 + * Check for default routes in Rails 3 apps + * Look in Gemfile or Gemfile.lock for Rails version + +## 0.6.1 - 2011-07-29 + + * Fix XSS check for cookies as parameters in output + * Don't bother calling super in CheckSessionSettings + * Add escape_once as a safe method + * Accept '\Z' or '\z' in model validations + +## 0.6.0 - 2011-07-20 + + * Tests are in place and fully functional + * Hide errors by default in HTML output + * Warn if routes.rb cannot be found + * Narrow methods assumed to be file access + * Increase confidence for methods known to not escape output + * Fixes to output processing for Erubis + * Fixes for Rails 3 XSS checks + * Fixes to line numbers with Erubis + * Fixes to escaped output scanning + * Update CSRF CVE-2011-0447 message to be less assertive + +## 0.5.2 - 2011-06-29 + + * Output report file name when finished + * Add initial tests for Rails 2.x + * Fix ERB line numbers when using Ruby 1.9 + +## 0.5.1 - 2011-06-17 + + * Fix issue with 'has_one' => in routes + +## 0.5.0 - 2011-06-08 + + * Add support for routes like get 'x/y', :to => 'ctrlr#whatever' + * Allow empty blocks in Rails 3 routes + * Check initializer for session settings + * Add line numbers to session setting warnings + * Add --checks option to list checks + +## 0.4.1 - 2011-05-23 + + * Fix reported line numbers when using new Erubis parser + (Mostly affects Rails 3 apps) + +## 0.4.0 - 2011-05-19 + + * Handle Rails XSS protection properly + * More detection options for rails_xss + * Add --escape-html option + +## 0.3.2 - 2011-05-12 + + * Autodetect Rails 3 applications + * Turn on auto-escaping for Rails 3 apps + * Check Model.create() for mass assignment + +## 0.3.1 - 2011-05-03 + + * Always output a line number in tabbed output format + * Restrict characters in category name in tabbed output format to + word characters and spaces, for Hudson/Jenkins plugin + +## 0.3.0 - 2011-03-21 + + * Check for SQL injection in calls using constantize() + * Check for SQL injection in calls to count_by_sql() + +## 0.2.2 - 2011-02-22 + + * Fix version_between? when no Rails version is specified + +## 0.2.1 - 2011-02-18 + + * Add code snippet to tab output messages + +## 0.2.0 - 2011-02-16 + + * Add check for mail_to vulnerability - CVE-2011-0446 + * Add check for CSRF weakness - CVE-2011-0447 + +## 0.1.1 - 2011-01-25 + + * Be more permissive with ActiveSupport version + +## 0.1.0 - 2011-01-18 + + * Check link_to for XSS (because arguments are not escaped) + * Process layouts better (although not perfectly yet) + * Load custom Haml filters if they are in lib/ + * Tab separated output via .tabs output extension + * Switch to normal versioning scheme diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/FEATURES b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/FEATURES new file mode 100644 index 000000000..58e800c54 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/FEATURES @@ -0,0 +1,16 @@ +Can detect: +-Possibly unescaped model attributes or parameters in views (Cross-Site Scripting) +-Bad string interpolation in calls to Model.find, Model.last, Model.first, etc., as well as chained calls (SQL Injection) +-String interpolation in find_by_sql (SQL Injection) +-String interpolation or params in calls to system, exec, and syscall and `` (Command Injection) +-Unrestricted mass assignments +-Global restriction of mass assignment +-Missing call to protect_from_forgery in ApplicationController (CSRF protection) +-Default routes, per-controller and globally +-Redirects based on params (probably too broad currently) +-Validation regexes not using \A and \z +-Calls to render with dynamic paths + +General capabilities: +-Search for method calls based on target class and/or method name +-Determine 'output' of templates using ERB, Erubis, or HAML. Can handle automatic escaping diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/README.md new file mode 100644 index 000000000..5ae91a1a5 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/README.md @@ -0,0 +1,219 @@ +[![Brakeman Logo](http://brakemanscanner.org/images/logo_medium.png)](http://brakemanscanner.org/) + +[![Build Status](https://circleci.com/gh/presidentbeef/brakeman.svg?style=svg)](https://circleci.com/gh/presidentbeef/brakeman) +[![Code Coverage](https://qlty.sh/gh/presidentbeef/projects/brakeman/coverage.svg)](https://qlty.sh/gh/presidentbeef/projects/brakeman) + +# Brakeman + +Brakeman is a static analysis tool which checks Ruby on Rails applications for security vulnerabilities. + +# Installation + +Using RubyGems: + + gem install brakeman + +Using Bundler: + +```ruby +group :development do + gem 'brakeman', require: false +end +``` + +Using Docker: + + docker pull presidentbeef/brakeman + +Using Docker to build from source: + + git clone https://github.com/presidentbeef/brakeman.git + cd brakeman + docker build . -t brakeman + +# Usage + +#### Running locally + +From a Rails application's root directory: + + brakeman + +Outside of Rails root: + + brakeman /path/to/rails/application + +#### Running with Docker + +From a Rails application's root directory: + + docker run -v "$(pwd)":/code presidentbeef/brakeman + +With a little nicer color: + + docker run -v "$(pwd)":/code presidentbeef/brakeman --color + +For an HTML report: + + docker run -v "$(pwd)":/code presidentbeef/brakeman -o brakeman_results.html + +Outside of Rails root (note that the output file is relative to path/to/rails/application): + + docker run -v 'path/to/rails/application':/code presidentbeef/brakeman -o brakeman_results.html + +# Compatibility + +Brakeman should work with any version of Rails from 2.3.x to 8.x. + +Brakeman can analyze code written with Ruby 2.0 syntax and newer, but requires at least Ruby 3.0.0 to run. + +# Basic Options + +For a full list of options, use `brakeman --help` or see the [OPTIONS.md](OPTIONS.md) file. + +To specify an output file for the results: + + brakeman -o output_file + +The output format is determined by the file extension or by using the `-f` option. Current options are: `text`, `html`, `tabs`, `json`, `junit`, `markdown`, `csv`, `codeclimate`, and `sonar`. + +Multiple output files can be specified: + + brakeman -o output.html -o output.json + +To output to both a file and to the console, with color: + + brakeman --color -o /dev/stdout -o output.json + +To suppress informational warnings and just output the report: + + brakeman -q + +Note all Brakeman output except reports are sent to stderr, making it simple to redirect stdout to a file and just get the report. + +To see all kinds of debugging information: + + brakeman -d + +Specific checks can be skipped, if desired. The name needs to be the correct case. For example, to skip looking for default routes (`DefaultRoutes`): + + brakeman -x DefaultRoutes + +Multiple checks should be separated by a comma: + + brakeman -x DefaultRoutes,Redirect + +To do the opposite and only run a certain set of tests: + + brakeman -t SQL,ValidationRegex + +If Brakeman is running a bit slow, try + + brakeman --faster + +This will disable some features, but will probably be much faster (currently it is the same as `--skip-libs --no-branching`). *WARNING*: This may cause Brakeman to miss some vulnerabilities. + +By default, Brakeman will return a non-zero exit code if any security warnings are found or scanning errors are encountered. To disable this: + + brakeman --no-exit-on-warn --no-exit-on-error + +To skip certain files or directories that Brakeman may have trouble parsing, use: + + brakeman --skip-files file1,/path1/,path2/ + +To compare results of a scan with a previous scan, use the JSON output option and then: + + brakeman --compare old_report.json + +This will output JSON with two lists: one of fixed warnings and one of new warnings. + +Brakeman will ignore warnings if configured to do so. By default, it looks for a configuration file in `config/brakeman.ignore`. +To create and manage this file, use: + + brakeman -I + +If you want to temporarily see the warnings you ignored without affecting the exit code, use: + + brakeman --show-ignored + +# Warning information + +See [warning\_types](docs/warning_types) for more information on the warnings reported by this tool. + +# Warning context + +The HTML output format provides an excerpt from the original application source where a warning was triggered. Due to the processing done while looking for vulnerabilities, the source may not resemble the reported warning and reported line numbers may be slightly off. However, the context still provides a quick look into the code which raised the warning. + +# Confidence levels + +Brakeman assigns a confidence level to each warning. This provides a rough estimate of how certain the tool is that a given warning is actually a problem. Naturally, these ratings should not be taken as absolute truth. + +There are three levels of confidence: + + + High - Either this is a simple warning (boolean value) or user input is very likely being used in unsafe ways. + + Medium - This generally indicates an unsafe use of a variable, but the variable may or may not be user input. + + Weak - Typically means user input was indirectly used in a potentially unsafe manner. + +To only get warnings above a given confidence level: + + brakeman -w3 + +The `-w` switch takes a number from 1 to 3, with 1 being low (all warnings) and 3 being high (only highest confidence warnings). + +# Configuration files + +Brakeman options can be stored and read from YAML files. + +To simplify the process of writing a configuration file, the `-C` option will output the currently set options: + +```sh +$ brakeman -C --skip-files plugins/ +--- +:skip_files: +- plugins/ +``` + +Options passed in on the commandline have priority over configuration files. + +The default config locations are `./config/brakeman.yml`, `~/.brakeman/config.yml`, and `/etc/brakeman/config.yml` + +The `-c` option can be used to specify a configuration file to use. + +# Continuous Integration + +There is a [plugin available](http://brakemanscanner.org/docs/jenkins/) for Jenkins/Hudson. + +For even more continuous testing, try the [Guard plugin](https://github.com/guard/guard-brakeman). + +There are a couple [GitHub Actions](https://github.com/marketplace?type=actions&query=brakeman) available. + +# Building + + git clone git://github.com/presidentbeef/brakeman.git + cd brakeman + gem build brakeman.gemspec + gem install brakeman*.gem + +# Who is Using Brakeman? + +* [Code Climate](https://codeclimate.com/) +* [GitHub](https://github.com/) +* [Groupon](http://www.groupon.com/) +* [New Relic](http://newrelic.com) +* [Twitter](https://twitter.com/) + +[..and more!](http://brakemanscanner.org/brakeman_users) + +# Homepage/News + +Website: http://brakemanscanner.org/ + +Twitter: https://twitter.com/brakeman + +Chat: https://gitter.im/presidentbeef/brakeman + +# License + +Brakeman is free for non-commercial use. + +See [COPYING](COPYING.md) for details. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bin/brakeman b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bin/brakeman new file mode 100755 index 000000000..09ca1e9a1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bin/brakeman @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby +#Adjust path in case called directly and not through gem +$:.unshift "#{File.expand_path(File.dirname(__FILE__))}/../lib" + +Encoding.default_external = 'UTF-8' + +require 'brakeman' +require 'brakeman/commandline' + +Brakeman::Commandline.start diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/load.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/load.rb new file mode 100644 index 000000000..c445b48bc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/load.rb @@ -0,0 +1,17 @@ +path = File.expand_path('../..', __FILE__) +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/csv-3.3.5/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/haml-6.4.0/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/highline-3.1.2/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/parallel-1.27.0/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/reline-0.6.2/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/slim-5.2.1/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/temple-0.10.4/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib" +$:.unshift "#{path}/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/LICENSE.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/LICENSE.txt new file mode 100644 index 000000000..07b1b7fe2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/LICENSE.txt @@ -0,0 +1,33 @@ +Copyright (C) 2005-2016 James Edward Gray II. All rights reserved. +Copyright (C) 2007-2017 Yukihiro Matsumoto. All rights reserved. +Copyright (C) 2017 SHIBATA Hiroshi. All rights reserved. +Copyright (C) 2017 Olivier Lacan. All rights reserved. +Copyright (C) 2017 Espartaco Palma. All rights reserved. +Copyright (C) 2017 Marcus Stollsteimer. All rights reserved. +Copyright (C) 2017 pavel. All rights reserved. +Copyright (C) 2017-2018 Steven Daniels. All rights reserved. +Copyright (C) 2018 Tomohiro Ogoke. All rights reserved. +Copyright (C) 2018 Kouhei Sutou. All rights reserved. +Copyright (C) 2018 Mitsutaka Mimura. All rights reserved. +Copyright (C) 2018 Vladislav. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/NEWS.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/NEWS.md new file mode 100644 index 000000000..58e443226 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/NEWS.md @@ -0,0 +1,1009 @@ +# News + +## 3.3.5 - 2025-06-01 + +### Improvements + + * docs: Fixed `StringScanner` document URL. + * GH-343 + * Patch by Petrik de Heus + +### Thanks + + * Petrik de Heus + +## 3.3.4 - 2025-04-13 + +### Improvements + + * `csv-filter`: Removed an experimental command line tool. + * GH-341 + +## 3.3.3 - 2025-03-20 + +### Improvements + + * `csv-filter`: Added an experimental command line tool to filter a CSV. + * Patch by Burdette Lamar + +### Fixes + + * Fixed wrong EOF detection for `ARGF` + * GH-328 + * Reported by Takeshi Nishimatsu + + * Fixed a regression bug that `CSV.open` rejects integer mode. + * GH-336 + * Reported by Dave Burgess + +### Thanks + + * Takeshi Nishimatsu + + * Burdette Lamar + + * Dave Burgess + +## 3.3.2 - 2024-12-21 + +### Fixes + + * Fixed a parse bug with a quoted line with `col_sep` and an empty + line. This was introduced in 3.3.1. + * GH-324 + * Reported by stoodfarback + +### Thanks + + * stoodfarback + +## 3.3.1 - 2024-12-15 + +### Improvements + + * `CSV.open`: Changed to detect BOM by default. Note that this isn't + enabled on Windows because Ruby may have a bug. See also: + https://bugs.ruby-lang.org/issues/20526 + * GH-301 + * Reported by Junichi Ito + + * Improved performance. + * GH-311 + * GH-312 + * Patch by Vladimir Kochnev + + * `CSV.open`: Added support for `StringIO` as an input. + * GH-300 + * GH-302 + * Patch by Marcelo + + * Added a built-in time converter. You can use it by `converters: + :time`. + * GH-313 + * Patch by Bart de Water + + * Added `CSV::TSV` for tab-separated values. + * GH-272 + * GH-319 + * Reported by kojix2 + * Patch by Jas + +### Thanks + + * Junichi Ito + + * Vladimir Kochnev + + * Marcelo + + * Bart de Water + + * kojix2 + + * Jas + +## 3.3.0 - 2024-03-22 + +### Fixes + + * Fixed a regression parse bug in 3.2.9 that parsing with + `:skip_lines` may cause wrong result. + +## 3.2.9 - 2024-03-22 + +### Fixes + + * Fixed a parse bug that wrong result may be happen when: + + * `:skip_lines` is used + * `:row_separator` is `"\r\n"` + * There is a line that includes `\n` as a column value + + Reported by Ryo Tsukamoto. + + GH-296 + +### Thanks + + * Ryo Tsukamoto + +## 3.2.8 - 2023-11-08 + +### Improvements + + * Added `CSV::InvalidEncodingError`. + + Patch by Kosuke Shibata. + + GH-287 + +### Thanks + + * Kosuke Shibata + +## 3.2.7 - 2023-06-26 + +### Improvements + + * Removed an unused internal variable. + [GH-273](https://github.com/ruby/csv/issues/273) + [Patch by Mau Magnaguagno] + + * Changed to use `https://` instead of `http://` in documents. + [GH-274](https://github.com/ruby/csv/issues/274) + [Patch by Vivek Bharath Akupatni] + + * Added prefix to a helper module in test. + [GH-278](https://github.com/ruby/csv/issues/278) + [Patch by Luke Gruber] + + * Added a documentation for `liberal_parsing: {backslash_quotes: true}`. + [GH-280](https://github.com/ruby/csv/issues/280) + [Patch by Mark Schneider] + +### Fixes + + * Fixed a wrong execution result in documents. + [GH-276](https://github.com/ruby/csv/issues/276) + [Patch by Yuki Tsujimoto] + + * Fixed a bug that the same line is used multiple times. + [GH-279](https://github.com/ruby/csv/issues/279) + [Reported by Gabriel Nagy] + +### Thanks + + * Mau Magnaguagno + + * Vivek Bharath Akupatni + + * Yuki Tsujimoto + + * Luke Gruber + + * Mark Schneider + + * Gabriel Nagy + +## 3.2.6 - 2022-12-08 + +### Improvements + + * `CSV#read` consumes the same lines with other methods like + `CSV#shift`. + [[GitHub#258](https://github.com/ruby/csv/issues/258)] + [Reported by Lhoussaine Ghallou] + + * All `Enumerable` based methods consume the same lines with other + methods. This may have a performance penalty. + [[GitHub#260](https://github.com/ruby/csv/issues/260)] + [Reported by Lhoussaine Ghallou] + + * Simplify some implementations. + [[GitHub#262](https://github.com/ruby/csv/pull/262)] + [[GitHub#263](https://github.com/ruby/csv/pull/263)] + [Patch by Mau Magnaguagno] + +### Fixes + + * Fixed `CSV.generate_lines` document. + [[GitHub#257](https://github.com/ruby/csv/pull/257)] + [Patch by Sampat Badhe] + +### Thanks + + * Sampat Badhe + + * Lhoussaine Ghallou + + * Mau Magnaguagno + +## 3.2.5 - 2022-08-26 + +### Improvements + + * Added `CSV.generate_lines`. + [[GitHub#255](https://github.com/ruby/csv/issues/255)] + [Reported by OKURA Masafumi] + [[GitHub#256](https://github.com/ruby/csv/pull/256)] + [Patch by Eriko Sugiyama] + +### Thanks + + * OKURA Masafumi + + * Eriko Sugiyama + +## 3.2.4 - 2022-08-22 + +### Improvements + + * Cleaned up internal implementations. + [[GitHub#249](https://github.com/ruby/csv/pull/249)] + [[GitHub#250](https://github.com/ruby/csv/pull/250)] + [[GitHub#251](https://github.com/ruby/csv/pull/251)] + [Patch by Mau Magnaguagno] + + * Added support for RFC 3339 style time. + [[GitHub#248](https://github.com/ruby/csv/pull/248)] + [Patch by Thierry Lambert] + + * Added support for transcoding String CSV. Syntax is + `from-encoding:to-encoding`. + [[GitHub#254](https://github.com/ruby/csv/issues/254)] + [Reported by Richard Stueven] + + * Added quoted information to `CSV::FieldInfo`. + [[GitHub#254](https://github.com/ruby/csv/pull/253)] + [Reported by Hirokazu SUZUKI] + +### Fixes + + * Fixed a link in documents. + [[GitHub#244](https://github.com/ruby/csv/pull/244)] + [Patch by Peter Zhu] + +### Thanks + + * Peter Zhu + + * Mau Magnaguagno + + * Thierry Lambert + + * Richard Stueven + + * Hirokazu SUZUKI + +## 3.2.3 - 2022-04-09 + +### Improvements + + * Added contents summary to `CSV::Table#inspect`. + [GitHub#229][Patch by Eriko Sugiyama] + [GitHub#235][Patch by Sampat Badhe] + + * Suppressed `$INPUT_RECORD_SEPARATOR` deprecation warning by + `Warning.warn`. + [GitHub#233][Reported by Jean byroot Boussier] + + * Improved error message for liberal parsing with quoted values. + [GitHub#231][Patch by Nikolay Rys] + + * Fixed typos in documentation. + [GitHub#236][Patch by Sampat Badhe] + + * Added `:max_field_size` option and deprecated `:field_size_limit` option. + [GitHub#238][Reported by Dan Buettner] + + * Added `:symbol_raw` to built-in header converters. + [GitHub#237][Reported by taki] + [GitHub#239][Patch by Eriko Sugiyama] + +### Fixes + + * Fixed a bug that some texts may be dropped unexpectedly. + [Bug #18245][ruby-core:105587][Reported by Hassan Abdul Rehman] + + * Fixed a bug that `:field_size_limit` doesn't work with not complex row. + [GitHub#238][Reported by Dan Buettner] + +### Thanks + + * Hassan Abdul Rehman + + * Eriko Sugiyama + + * Jean byroot Boussier + + * Nikolay Rys + + * Sampat Badhe + + * Dan Buettner + + * taki + +## 3.2.2 - 2021-12-24 + +### Improvements + + * Added a validation for invalid option combination. + [GitHub#225][Patch by adamroyjones] + + * Improved documentation for developers. + [GitHub#227][Patch by Eriko Sugiyama] + +### Fixes + + * Fixed a bug that all of `ARGF` contents may not be consumed. + [GitHub#228][Reported by Rafael Navaza] + +### Thanks + + * adamroyjones + + * Eriko Sugiyama + + * Rafael Navaza + +## 3.2.1 - 2021-10-23 + +### Improvements + + * doc: Fixed wrong class name. + [GitHub#217][Patch by Vince] + + * Changed to always use `"\n"` for the default row separator on Ruby + 3.0 or later because `$INPUT_RECORD_SEPARATOR` was deprecated + since Ruby 3.0. + + * Added support for Ractor. + [GitHub#218][Patch by rm155] + + * Users who want to use the built-in converters in non-main + Ractors need to call `Ractor.make_shareable(CSV::Converters)` + and/or `Ractor.make_shareable(CSV::HeaderConverters)` before + creating non-main Ractors. + +### Thanks + + * Vince + + * Joakim Antman + + * rm155 + +## 3.2.0 - 2021-06-06 + +### Improvements + + * `CSV.open`: Added support for `:newline` option. + [GitHub#198][Patch by Nobuyoshi Nakada] + + * `CSV::Table#each`: Added support for column mode with duplicated + headers. + [GitHub#206][Reported by Yaroslav Berezovskiy] + + * `Object#CSV`: Added support for Ruby 3.0. + + * `CSV::Row`: Added support for pattern matching. + [GitHub#207][Patch by Kevin Newton] + +### Fixes + + * Fixed typos in documentation. + [GitHub#196][GitHub#205][Patch by Sampat Badhe] + +### Thanks + + * Sampat Badhe + + * Nobuyoshi Nakada + + * Yaroslav Berezovskiy + + * Kevin Newton + +## 3.1.9 - 2020-11-23 + +### Fixes + + * Fixed a compatibility bug that the line to be processed by + `skip_lines:` has a row separator. + [GitHub#194][Reported by Josef Šimánek] + +### Thanks + + * Josef Šimánek + +## 3.1.8 - 2020-11-18 + +### Improvements + + * Improved documentation. + [Patch by Burdette Lamar] + +### Thanks + + * Burdette Lamar + +## 3.1.7 - 2020-08-04 + +### Improvements + + * Improved document. + [GitHub#158][GitHub#160][GitHub#161] + [Patch by Burdette Lamar] + + * Updated required Ruby version to 2.5.0 or later. + [GitHub#159] + [Patch by Gabriel Nagy] + + * Removed stringio 0.1.3 or later dependency. + +### Thanks + + * Burdette Lamar + + * Gabriel Nagy + +## 3.1.6 - 2020-07-20 + +### Improvements + + * Improved document. + [GitHub#127][GitHub#135][GitHub#136][GitHub#137][GitHub#139][GitHub#140] + [GitHub#141][GitHub#142][GitHub#143][GitHub#145][GitHub#146][GitHub#148] + [GitHub#148][GitHub#151][GitHub#152][GitHub#154][GitHub#155][GitHub#157] + [Patch by Burdette Lamar] + + * `CSV.open`: Added support for `undef: :replace`. + [GitHub#129][Patch by Koichi ITO] + + * `CSV.open`: Added support for `invalid: :replace`. + [GitHub#129][Patch by Koichi ITO] + + * Don't run quotable check for invalid encoding field values. + [GitHub#131][Patch by Koichi ITO] + + * Added support for specifying the target indexes and names to + `force_quotes:`. + [GitHub#153][Reported by Aleksandr] + + * `CSV.generate`: Changed to use the encoding of the first non-ASCII + field rather than the encoding of ASCII only field. + + * Changed to require the stringio gem 0.1.3 or later. + +### Thanks + + * Burdette Lamar + + * Koichi ITO + + * Aleksandr + +## 3.1.5 - 2020-05-18 + +### Improvements + + * Improved document. + [GitHub#124][Patch by Burdette Lamar] + +### Fixes + + * Added missing document files. + [GitHub#125][Reported by joast] + +### Thanks + + * Burdette Lamar + + * joast + +## 3.1.4 - 2020-05-17 + +### Improvements + + * Improved document. + [GitHub#122][Patch by Burdette Lamar] + + * Stopped to dropping stack trace for exception caused by + `CSV.parse_line`. + [GitHub#120][Reported by Kyle d'Oliveira] + +### Fixes + + * Fixed a bug that `:write_nil_value` or `:write_empty_value` don't + work with non `String` objects. + [GitHub#123][Reported by asm256] + +### Thanks + + * Burdette Lamar + + * asm256 + + * Kyle d'Oliveira + +## 3.1.3 - 2020-05-09 + +### Improvements + + * `CSV::Row#dup`: Copied deeply. + [GitHub#108][Patch by Jim Kane] + +### Fixes + + * Fixed a infinite loop bug for zero length match `skip_lines`. + [GitHub#110][Patch by Mike MacDonald] + + * `CSV.generate`: Fixed a bug that encoding isn't set correctly. + [GitHub#110][Patch by Seiei Miyagi] + + * Fixed document for the `:strip` option. + [GitHub#114][Patch by TOMITA Masahiro] + + * Fixed a parse bug when split charcter exists in middle of column + value. + [GitHub#115][Reported by TOMITA Masahiro] + +### Thanks + + * Jim Kane + + * Mike MacDonald + + * Seiei Miyagi + + * TOMITA Masahiro + +## 3.1.2 - 2019-10-12 + +### Improvements + + * Added `:col_sep` check. + [GitHub#94][Reported by Florent Beaurain] + + * Suppressed warnings. + [GitHub#96][Patch by Nobuyoshi Nakada] + + * Improved documentation. + [GitHub#101][GitHub#102][Patch by Vitor Oliveira] + +### Fixes + + * Fixed a typo in documentation. + [GitHub#95][Patch by Yuji Yaginuma] + + * Fixed a multibyte character handling bug. + [GitHub#97][Patch by koshigoe] + + * Fixed typos in documentation. + [GitHub#100][Patch by Vitor Oliveira] + + * Fixed a bug that seeked `StringIO` isn't accepted. + [GitHub#98][Patch by MATSUMOTO Katsuyoshi] + + * Fixed a bug that `CSV.generate_line` doesn't work with + `Encoding.default_internal`. + [GitHub#105][Reported by David Rodríguez] + +### Thanks + + * Florent Beaurain + + * Yuji Yaginuma + + * Nobuyoshi Nakada + + * koshigoe + + * Vitor Oliveira + + * MATSUMOTO Katsuyoshi + + * David Rodríguez + +## 3.1.1 - 2019-04-26 + +### Improvements + + * Added documentation for `strip` option. + [GitHub#88][Patch by hayashiyoshino] + + * Added documentation for `write_converters`, `write_nil_value` and + `write_empty_value` options. + [GitHub#87][Patch by Masafumi Koba] + + * Added documentation for `quote_empty` option. + [GitHub#89][Patch by kawa\_tech] + +### Fixes + + * Fixed a bug that `strip; true` removes a newline. + +### Thanks + + * hayashiyoshino + + * Masafumi Koba + + * kawa\_tech + +## 3.1.0 - 2019-04-17 + +### Fixes + + * Fixed a backward incompatibility bug that `CSV#eof?` may raises an + error. + [GitHub#86][Reported by krororo] + +### Thanks + + * krororo + +## 3.0.9 - 2019-04-15 + +### Fixes + + * Fixed a test for Windows. + +## 3.0.8 - 2019-04-11 + +### Fixes + + * Fixed a bug that `strip: String` doesn't work. + +## 3.0.7 - 2019-04-08 + +### Improvements + + * Improve parse performance 1.5x by introducing loose parser. + +### Fixes + + * Fix performance regression in 3.0.5. + + * Fix a bug that `CSV#line` returns wrong value when you + use `quote_char: nil`. + +## 3.0.6 - 2019-03-30 + +### Improvements + + * `CSV.foreach`: Added support for `mode`. + +## 3.0.5 - 2019-03-24 + +### Improvements + + * Added `:liberal_parsing => {backslash_quote: true}` option. + [GitHub#74][Patch by 284km] + + * Added `:write_converters` option. + [GitHub#73][Patch by Danillo Souza] + + * Added `:write_nil_value` option. + + * Added `:write_empty_value` option. + + * Improved invalid byte line number detection. + [GitHub#78][Patch by Alyssa Ross] + + * Added `quote_char: nil` optimization. + [GitHub#79][Patch by 284km] + + * Improved error message. + [GitHub#81][Patch by Andrés Torres] + + * Improved IO-like implementation for `StringIO` data. + [GitHub#80][Patch by Genadi Samokovarov] + + * Added `:strip` option. + [GitHub#58] + +### Fixes + + * Fixed a compatibility bug that `CSV#each` doesn't care `CSV#shift`. + [GitHub#76][Patch by Alyssa Ross] + + * Fixed a compatibility bug that `CSV#eof?` doesn't care `CSV#each` + and `CSV#shift`. + [GitHub#77][Reported by Chi Leung] + + * Fixed a compatibility bug that invalid line isn't ignored. + [GitHub#82][Reported by krororo] + + * Fixed a bug that `:skip_lines` doesn't work with multibyte characters data. + [GitHub#83][Reported by ff2248] + +### Thanks + + * Alyssa Ross + + * 284km + + * Chi Leung + + * Danillo Souza + + * Andrés Torres + + * Genadi Samokovarov + + * krororo + + * ff2248 + +## 3.0.4 - 2019-01-25 + +### Improvements + + * Removed duplicated `CSV::Row#include?` implementations. + [GitHub#69][Patch by Max Schwenk] + + * Removed duplicated `CSV::Row#header?` implementations. + [GitHub#70][Patch by Max Schwenk] + +### Fixes + + * Fixed a typo in document. + [GitHub#72][Patch by Artur Beljajev] + + * Fixed a compatibility bug when row headers are changed. + [GitHub#71][Reported by tomoyuki kosaka] + +### Thanks + + * Max Schwenk + + * Artur Beljajev + + * tomoyuki kosaka + +## 3.0.3 - 2019-01-12 + +### Improvements + + * Migrated benchmark tool to benchmark-driver from benchmark-ips. + [GitHub#57][Patch by 284km] + + * Added `liberal_parsing: {double_quote_outside_quote: true}` parse + option. + [GitHub#66][Reported by Watson] + + * Added `quote_empty:` write option. + [GitHub#35][Reported by Dave Myron] + +### Fixes + + * Fixed a compatibility bug that `CSV.generate` always return + `ASCII-8BIT` encoding string. + [GitHub#63][Patch by Watson] + + * Fixed a compatibility bug that `CSV.parse("", headers: true)` + doesn't return `CSV::Table`. + [GitHub#64][Reported by Watson][Patch by 284km] + + * Fixed a compatibility bug that multiple-characters column + separator doesn't work. + [GitHub#67][Reported by Jesse Reiss] + + * Fixed a compatibility bug that double `#each` parse twice. + [GitHub#68][Reported by Max Schwenk] + +### Thanks + + * Watson + + * 284km + + * Jesse Reiss + + * Dave Myron + + * Max Schwenk + +## 3.0.2 - 2018-12-23 + +### Improvements + + * Changed to use strscan in parser. + [GitHub#52][Patch by 284km] + + * Improves CSV write performance. + 3.0.2 will be about 2 times faster than 3.0.1. + + * Improves CSV parse performance for complex case. + 3.0.2 will be about 2 times faster than 3.0.1. + +### Fixes + + * Fixed a parse error bug for new line only input with `headers` option. + [GitHub#53][Reported by Chris Beer] + + * Fixed some typos in document. + [GitHub#54][Patch by Victor Shepelev] + +### Thanks + + * 284km + + * Chris Beer + + * Victor Shepelev + +## 3.0.1 - 2018-12-07 + +### Improvements + + * Added a test. + [GitHub#38][Patch by 284km] + + * `CSV::Row#dup`: Changed to duplicate internal data. + [GitHub#39][Reported by André Guimarães Sakata] + + * Documented `:nil_value` and `:empty_value` options. + [GitHub#41][Patch by OwlWorks] + + * Added support for separator detection for non-seekable inputs. + [GitHub#45][Patch by Ilmari Karonen] + + * Removed needless code. + [GitHub#48][Patch by Espartaco Palma] + + * Added support for parsing header only CSV with `headers: true`. + [GitHub#47][Patch by Kazuma Shibasaka] + + * Added support for coverage report in CI. + [GitHub#48][Patch by Espartaco Palma] + + * Improved auto CR row separator detection. + [GitHub#51][Reported by Yuki Kurihara] + +### Fixes + + * Fixed a typo in document. + [GitHub#40][Patch by Marcus Stollsteimer] + +### Thanks + + * 284km + + * André Guimarães Sakata + + * Marcus Stollsteimer + + * OwlWorks + + * Ilmari Karonen + + * Espartaco Palma + + * Kazuma Shibasaka + + * Yuki Kurihara + +## 3.0.0 - 2018-06-06 + +### Fixes + + * Fixed a bug that header isn't returned for empty row. + [GitHub#37][Patch by Grace Lee] + +### Thanks + + * Grace Lee + +## 1.0.2 - 2018-05-03 + +### Improvements + + * Split file for CSV::VERSION + + * Code cleanup: Split csv.rb into a more manageable structure + [GitHub#19][Patch by Espartaco Palma] + [GitHub#20][Patch by Steven Daniels] + + * Use CSV::MalformedCSVError for invalid encoding line + [GitHub#26][Reported by deepj] + + * Support implicit Row <-> Array conversion + [Bug #10013][ruby-core:63582][Reported by Dawid Janczak] + + * Update class docs + [GitHub#32][Patch by zverok] + + * Add `Row#each_pair` + [GitHub#33][Patch by zverok] + + * Improve CSV performance + [GitHub#30][Patch by Watson] + + * Add :nil_value and :empty_value option + +### Fixes + + * Fix a bug that "bom|utf-8" doesn't work + [GitHub#23][Reported by Pavel Lobashov] + + * `CSV::Row#to_h`, `#to_hash`: uses the same value as `Row#[]` + [Bug #14482][Reported by tomoya ishida] + + * Make row separator detection more robust + [GitHub#25][Reported by deepj] + + * Fix a bug that too much separator when col_sep is `" "` + [Bug #8784][ruby-core:63582][Reported by Sylvain Laperche] + +### Thanks + + * Espartaco Palma + + * Steven Daniels + + * deepj + + * Dawid Janczak + + * zverok + + * Watson + + * Pavel Lobashov + + * tomoya ishida + + * Sylvain Laperche + + * Ryunosuke Sato + +## 1.0.1 - 2018-02-09 + +### Improvements + + * `CSV::Table#delete`: Added bulk delete support. You can delete + multiple rows and columns at once. + [GitHub#4][Patch by Vladislav] + + * Updated Gem description. + [GitHub#11][Patch by Marcus Stollsteimer] + + * Code cleanup. + [GitHub#12][Patch by Marcus Stollsteimer] + [GitHub#14][Patch by Steven Daniels] + [GitHub#18][Patch by takkanm] + + * `CSV::Table#dig`: Added. + [GitHub#15][Patch by Tomohiro Ogoke] + + * `CSV::Row#dig`: Added. + [GitHub#15][Patch by Tomohiro Ogoke] + + * Added ISO 8601 support to date time converter. + [GitHub#16] + +### Fixes + + * Fixed wrong `CSV::VERSION`. + [GitHub#10][Reported by Marcus Stollsteimer] + + * `CSV.generate`: Fixed a regression bug that `String` argument is + ignored. + [GitHub#13][Patch by pavel] + +### Thanks + + * Vladislav + + * Marcus Stollsteimer + + * Steven Daniels + + * takkanm + + * Tomohiro Ogoke + + * pavel diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/README.md new file mode 100644 index 000000000..cf61a3585 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/README.md @@ -0,0 +1,55 @@ +# CSV + +This library provides a complete interface to CSV files and data. It offers tools to enable you to read and write to and from Strings or IO objects, as needed. + +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'csv' +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install csv + +## Usage + +```ruby +require "csv" + +CSV.foreach("path/to/file.csv") do |row| + # use row here... +end +``` + +## Documentation + +- [API](https://ruby.github.io/csv/): all classes, methods, and constants. +- [Recipes](https://ruby.github.io/csv/doc/csv/recipes/recipes_rdoc.html): specific code for specific tasks. + +## Development + +After checking out the repo, run `ruby run-test.rb` to check if your changes can pass the test. + +To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/csv. + +### NOTE: About RuboCop + +We don't use RuboCop because we can manage our coding style by ourselves. We want to accept small fluctuations in our coding style because we use Ruby. +Please do not submit issues and PRs that aim to introduce RuboCop in this repository. + +## License + +The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause). + +See LICENSE.txt for details. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv.rb new file mode 100644 index 000000000..aef96ac92 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv.rb @@ -0,0 +1,3017 @@ +# encoding: US-ASCII +# frozen_string_literal: true +# = csv.rb -- CSV Reading and Writing +# +# Created by James Edward Gray II on 2005-10-31. +# +# See CSV for documentation. +# +# == Description +# +# Welcome to the new and improved CSV. +# +# This version of the CSV library began its life as FasterCSV. FasterCSV was +# intended as a replacement to Ruby's then standard CSV library. It was +# designed to address concerns users of that library had and it had three +# primary goals: +# +# 1. Be significantly faster than CSV while remaining a pure Ruby library. +# 2. Use a smaller and easier to maintain code base. (FasterCSV eventually +# grew larger, was also but considerably richer in features. The parsing +# core remains quite small.) +# 3. Improve on the CSV interface. +# +# Obviously, the last one is subjective. I did try to defer to the original +# interface whenever I didn't have a compelling reason to change it though, so +# hopefully this won't be too radically different. +# +# We must have met our goals because FasterCSV was renamed to CSV and replaced +# the original library as of Ruby 1.9. If you are migrating code from 1.8 or +# earlier, you may have to change your code to comply with the new interface. +# +# == What's the Different From the Old CSV? +# +# I'm sure I'll miss something, but I'll try to mention most of the major +# differences I am aware of, to help others quickly get up to speed: +# +# === \CSV Parsing +# +# * This parser is m17n aware. See CSV for full details. +# * This library has a stricter parser and will throw MalformedCSVErrors on +# problematic data. +# * This library has a less liberal idea of a line ending than CSV. What you +# set as the :row_sep is law. It can auto-detect your line endings +# though. +# * The old library returned empty lines as [nil]. This library calls +# them []. +# * This library has a much faster parser. +# +# === Interface +# +# * CSV now uses keyword parameters to set options. +# * CSV no longer has generate_row() or parse_row(). +# * The old CSV's Reader and Writer classes have been dropped. +# * CSV::open() is now more like Ruby's open(). +# * CSV objects now support most standard IO methods. +# * CSV now has a new() method used to wrap objects like String and IO for +# reading and writing. +# * CSV::generate() is different from the old method. +# * CSV no longer supports partial reads. It works line-by-line. +# * CSV no longer allows the instance methods to override the separators for +# performance reasons. They must be set in the constructor. +# +# If you use this library and find yourself missing any functionality I have +# trimmed, please {let me know}[mailto:james@grayproductions.net]. +# +# == Documentation +# +# See CSV for documentation. +# +# == What is CSV, really? +# +# CSV maintains a pretty strict definition of CSV taken directly from +# {the RFC}[https://www.ietf.org/rfc/rfc4180.txt]. I relax the rules in only one +# place and that is to make using this library easier. CSV will parse all valid +# CSV. +# +# What you don't want to do is to feed CSV invalid data. Because of the way the +# CSV format works, it's common for a parser to need to read until the end of +# the file to be sure a field is invalid. This consumes a lot of time and memory. +# +# Luckily, when working with invalid CSV, Ruby's built-in methods will almost +# always be superior in every way. For example, parsing non-quoted fields is as +# easy as: +# +# data.split(",") +# +# == Questions and/or Comments +# +# Feel free to email {James Edward Gray II}[mailto:james@grayproductions.net] +# with any questions. + +require "forwardable" +require "date" +require "time" +require "stringio" + +require_relative "csv/fields_converter" +require_relative "csv/input_record_separator" +require_relative "csv/parser" +require_relative "csv/row" +require_relative "csv/table" +require_relative "csv/writer" + +# == \CSV +# +# === \CSV Data +# +# \CSV (comma-separated values) data is a text representation of a table: +# - A _row_ _separator_ delimits table rows. +# A common row separator is the newline character "\n". +# - A _column_ _separator_ delimits fields in a row. +# A common column separator is the comma character ",". +# +# This \CSV \String, with row separator "\n" +# and column separator ",", +# has three rows and two columns: +# "foo,0\nbar,1\nbaz,2\n" +# +# Despite the name \CSV, a \CSV representation can use different separators. +# +# For more about tables, see the Wikipedia article +# "{Table (information)}[https://en.wikipedia.org/wiki/Table_(information)]", +# especially its section +# "{Simple table}[https://en.wikipedia.org/wiki/Table_(information)#Simple_table]" +# +# == \Class \CSV +# +# Class \CSV provides methods for: +# - Parsing \CSV data from a \String object, a \File (via its file path), or an \IO object. +# - Generating \CSV data to a \String object. +# +# To make \CSV available: +# require 'csv' +# +# All examples here assume that this has been done. +# +# == Keeping It Simple +# +# A \CSV object has dozens of instance methods that offer fine-grained control +# of parsing and generating \CSV data. +# For many needs, though, simpler approaches will do. +# +# This section summarizes the singleton methods in \CSV +# that allow you to parse and generate without explicitly +# creating \CSV objects. +# For details, follow the links. +# +# === Simple Parsing +# +# Parsing methods commonly return either of: +# - An \Array of Arrays of Strings: +# - The outer \Array is the entire "table". +# - Each inner \Array is a row. +# - Each \String is a field. +# - A CSV::Table object. For details, see +# {\CSV with Headers}[#class-CSV-label-CSV+with+Headers]. +# +# ==== Parsing a \String +# +# The input to be parsed can be a string: +# string = "foo,0\nbar,1\nbaz,2\n" +# +# \Method CSV.parse returns the entire \CSV data: +# CSV.parse(string) # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# +# \Method CSV.parse_line returns only the first row: +# CSV.parse_line(string) # => ["foo", "0"] +# +# \CSV extends class \String with instance method String#parse_csv, +# which also returns only the first row: +# string.parse_csv # => ["foo", "0"] +# +# ==== Parsing Via a \File Path +# +# The input to be parsed can be in a file: +# string = "foo,0\nbar,1\nbaz,2\n" +# path = 't.csv' +# File.write(path, string) +# +# \Method CSV.read returns the entire \CSV data: +# CSV.read(path) # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# +# \Method CSV.foreach iterates, passing each row to the given block: +# CSV.foreach(path) do |row| +# p row +# end +# Output: +# ["foo", "0"] +# ["bar", "1"] +# ["baz", "2"] +# +# \Method CSV.table returns the entire \CSV data as a CSV::Table object: +# CSV.table(path) # => # +# +# ==== Parsing from an Open \IO Stream +# +# The input to be parsed can be in an open \IO stream: +# +# \Method CSV.read returns the entire \CSV data: +# File.open(path) do |file| +# CSV.read(file) +# end # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# +# As does method CSV.parse: +# File.open(path) do |file| +# CSV.parse(file) +# end # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# +# \Method CSV.parse_line returns only the first row: +# File.open(path) do |file| +# CSV.parse_line(file) +# end # => ["foo", "0"] +# +# \Method CSV.foreach iterates, passing each row to the given block: +# File.open(path) do |file| +# CSV.foreach(file) do |row| +# p row +# end +# end +# Output: +# ["foo", "0"] +# ["bar", "1"] +# ["baz", "2"] +# +# \Method CSV.table returns the entire \CSV data as a CSV::Table object: +# File.open(path) do |file| +# CSV.table(file) +# end # => # +# +# === Simple Generating +# +# \Method CSV.generate returns a \String; +# this example uses method CSV#<< to append the rows +# that are to be generated: +# output_string = CSV.generate do |csv| +# csv << ['foo', 0] +# csv << ['bar', 1] +# csv << ['baz', 2] +# end +# output_string # => "foo,0\nbar,1\nbaz,2\n" +# +# \Method CSV.generate_line returns a \String containing the single row +# constructed from an \Array: +# CSV.generate_line(['foo', '0']) # => "foo,0\n" +# +# \CSV extends class \Array with instance method Array#to_csv, +# which forms an \Array into a \String: +# ['foo', '0'].to_csv # => "foo,0\n" +# +# === "Filtering" \CSV +# +# \Method CSV.filter provides a Unix-style filter for \CSV data. +# The input data is processed to form the output data: +# in_string = "foo,0\nbar,1\nbaz,2\n" +# out_string = '' +# CSV.filter(in_string, out_string) do |row| +# row[0] = row[0].upcase +# row[1] *= 4 +# end +# out_string # => "FOO,0000\nBAR,1111\nBAZ,2222\n" +# +# == \CSV Objects +# +# There are three ways to create a \CSV object: +# - \Method CSV.new returns a new \CSV object. +# - \Method CSV.instance returns a new or cached \CSV object. +# - \Method \CSV() also returns a new or cached \CSV object. +# +# === Instance Methods +# +# \CSV has three groups of instance methods: +# - Its own internally defined instance methods. +# - Methods included by module Enumerable. +# - Methods delegated to class IO. See below. +# +# ==== Delegated Methods +# +# For convenience, a CSV object will delegate to many methods in class IO. +# (A few have wrapper "guard code" in \CSV.) You may call: +# * IO#binmode +# * #binmode? +# * IO#close +# * IO#close_read +# * IO#close_write +# * IO#closed? +# * #eof +# * #eof? +# * IO#external_encoding +# * IO#fcntl +# * IO#fileno +# * #flock +# * IO#flush +# * IO#fsync +# * IO#internal_encoding +# * #ioctl +# * IO#isatty +# * #path +# * IO#pid +# * IO#pos +# * IO#pos= +# * IO#reopen +# * #rewind +# * IO#seek +# * #stat +# * IO#string +# * IO#sync +# * IO#sync= +# * IO#tell +# * #to_i +# * #to_io +# * IO#truncate +# * IO#tty? +# +# === Options +# +# The default values for options are: +# DEFAULT_OPTIONS = { +# # For both parsing and generating. +# col_sep: ",", +# row_sep: :auto, +# quote_char: '"', +# # For parsing. +# field_size_limit: nil, +# converters: nil, +# unconverted_fields: nil, +# headers: false, +# return_headers: false, +# header_converters: nil, +# skip_blanks: false, +# skip_lines: nil, +# liberal_parsing: false, +# nil_value: nil, +# empty_value: "", +# strip: false, +# # For generating. +# write_headers: nil, +# quote_empty: true, +# force_quotes: false, +# write_converters: nil, +# write_nil_value: nil, +# write_empty_value: "", +# } +# +# ==== Options for Parsing +# +# Options for parsing, described in detail below, include: +# - +row_sep+: Specifies the row separator; used to delimit rows. +# - +col_sep+: Specifies the column separator; used to delimit fields. +# - +quote_char+: Specifies the quote character; used to quote fields. +# - +field_size_limit+: Specifies the maximum field size + 1 allowed. +# Deprecated since 3.2.3. Use +max_field_size+ instead. +# - +max_field_size+: Specifies the maximum field size allowed. +# - +converters+: Specifies the field converters to be used. +# - +unconverted_fields+: Specifies whether unconverted fields are to be available. +# - +headers+: Specifies whether data contains headers, +# or specifies the headers themselves. +# - +return_headers+: Specifies whether headers are to be returned. +# - +header_converters+: Specifies the header converters to be used. +# - +skip_blanks+: Specifies whether blanks lines are to be ignored. +# - +skip_lines+: Specifies how comments lines are to be recognized. +# - +strip+: Specifies whether leading and trailing whitespace are to be +# stripped from fields. This must be compatible with +col_sep+; if it is not, +# then an +ArgumentError+ exception will be raised. +# - +liberal_parsing+: Specifies whether \CSV should attempt to parse +# non-compliant data. +# - +nil_value+: Specifies the object that is to be substituted for each null (no-text) field. +# - +empty_value+: Specifies the object that is to be substituted for each empty field. +# +# :include: ../doc/csv/options/common/row_sep.rdoc +# +# :include: ../doc/csv/options/common/col_sep.rdoc +# +# :include: ../doc/csv/options/common/quote_char.rdoc +# +# :include: ../doc/csv/options/parsing/field_size_limit.rdoc +# +# :include: ../doc/csv/options/parsing/converters.rdoc +# +# :include: ../doc/csv/options/parsing/unconverted_fields.rdoc +# +# :include: ../doc/csv/options/parsing/headers.rdoc +# +# :include: ../doc/csv/options/parsing/return_headers.rdoc +# +# :include: ../doc/csv/options/parsing/header_converters.rdoc +# +# :include: ../doc/csv/options/parsing/skip_blanks.rdoc +# +# :include: ../doc/csv/options/parsing/skip_lines.rdoc +# +# :include: ../doc/csv/options/parsing/strip.rdoc +# +# :include: ../doc/csv/options/parsing/liberal_parsing.rdoc +# +# :include: ../doc/csv/options/parsing/nil_value.rdoc +# +# :include: ../doc/csv/options/parsing/empty_value.rdoc +# +# ==== Options for Generating +# +# Options for generating, described in detail below, include: +# - +row_sep+: Specifies the row separator; used to delimit rows. +# - +col_sep+: Specifies the column separator; used to delimit fields. +# - +quote_char+: Specifies the quote character; used to quote fields. +# - +write_headers+: Specifies whether headers are to be written. +# - +force_quotes+: Specifies whether each output field is to be quoted. +# - +quote_empty+: Specifies whether each empty output field is to be quoted. +# - +write_converters+: Specifies the field converters to be used in writing. +# - +write_nil_value+: Specifies the object that is to be substituted for each +nil+-valued field. +# - +write_empty_value+: Specifies the object that is to be substituted for each empty field. +# +# :include: ../doc/csv/options/common/row_sep.rdoc +# +# :include: ../doc/csv/options/common/col_sep.rdoc +# +# :include: ../doc/csv/options/common/quote_char.rdoc +# +# :include: ../doc/csv/options/generating/write_headers.rdoc +# +# :include: ../doc/csv/options/generating/force_quotes.rdoc +# +# :include: ../doc/csv/options/generating/quote_empty.rdoc +# +# :include: ../doc/csv/options/generating/write_converters.rdoc +# +# :include: ../doc/csv/options/generating/write_nil_value.rdoc +# +# :include: ../doc/csv/options/generating/write_empty_value.rdoc +# +# === \CSV with Headers +# +# CSV allows to specify column names of CSV file, whether they are in data, or +# provided separately. If headers are specified, reading methods return an instance +# of CSV::Table, consisting of CSV::Row. +# +# # Headers are part of data +# data = CSV.parse(<<~ROWS, headers: true) +# Name,Department,Salary +# Bob,Engineering,1000 +# Jane,Sales,2000 +# John,Management,5000 +# ROWS +# +# data.class #=> CSV::Table +# data.first #=> # +# data.first.to_h #=> {"Name"=>"Bob", "Department"=>"Engineering", "Salary"=>"1000"} +# +# # Headers provided by developer +# data = CSV.parse('Bob,Engineering,1000', headers: %i[name department salary]) +# data.first #=> # +# +# === \Converters +# +# By default, each value (field or header) parsed by \CSV is formed into a \String. +# You can use a _field_ _converter_ or _header_ _converter_ +# to intercept and modify the parsed values: +# - See {Field Converters}[#class-CSV-label-Field+Converters]. +# - See {Header Converters}[#class-CSV-label-Header+Converters]. +# +# Also by default, each value to be written during generation is written 'as-is'. +# You can use a _write_ _converter_ to modify values before writing. +# - See {Write Converters}[#class-CSV-label-Write+Converters]. +# +# ==== Specifying \Converters +# +# You can specify converters for parsing or generating in the +options+ +# argument to various \CSV methods: +# - Option +converters+ for converting parsed field values. +# - Option +header_converters+ for converting parsed header values. +# - Option +write_converters+ for converting values to be written (generated). +# +# There are three forms for specifying converters: +# - A converter proc: executable code to be used for conversion. +# - A converter name: the name of a stored converter. +# - A converter list: an array of converter procs, converter names, and converter lists. +# +# ===== Converter Procs +# +# This converter proc, +strip_converter+, accepts a value +field+ +# and returns field.strip: +# strip_converter = proc {|field| field.strip } +# In this call to CSV.parse, +# the keyword argument converters: string_converter +# specifies that: +# - \Proc +string_converter+ is to be called for each parsed field. +# - The converter's return value is to replace the +field+ value. +# Example: +# string = " foo , 0 \n bar , 1 \n baz , 2 \n" +# array = CSV.parse(string, converters: strip_converter) +# array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# +# A converter proc can receive a second argument, +field_info+, +# that contains details about the field. +# This modified +strip_converter+ displays its arguments: +# strip_converter = proc do |field, field_info| +# p [field, field_info] +# field.strip +# end +# string = " foo , 0 \n bar , 1 \n baz , 2 \n" +# array = CSV.parse(string, converters: strip_converter) +# array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# Output: +# [" foo ", #] +# [" 0 ", #] +# [" bar ", #] +# [" 1 ", #] +# [" baz ", #] +# [" 2 ", #] +# Each CSV::FieldInfo object shows: +# - The 0-based field index. +# - The 1-based line index. +# - The field header, if any. +# +# ===== Stored \Converters +# +# A converter may be given a name and stored in a structure where +# the parsing methods can find it by name. +# +# The storage structure for field converters is the \Hash CSV::Converters. +# It has several built-in converter procs: +# - :integer: converts each \String-embedded integer into a true \Integer. +# - :float: converts each \String-embedded float into a true \Float. +# - :date: converts each \String-embedded date into a true \Date. +# - :date_time: converts each \String-embedded date-time into a true \DateTime +# - :time: converts each \String-embedded time into a true \Time +# . +# This example creates a converter proc, then stores it: +# strip_converter = proc {|field| field.strip } +# CSV::Converters[:strip] = strip_converter +# Then the parsing method call can refer to the converter +# by its name, :strip: +# string = " foo , 0 \n bar , 1 \n baz , 2 \n" +# array = CSV.parse(string, converters: :strip) +# array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# +# The storage structure for header converters is the \Hash CSV::HeaderConverters, +# which works in the same way. +# It also has built-in converter procs: +# - :downcase: Downcases each header. +# - :symbol: Converts each header to a \Symbol. +# +# There is no such storage structure for write headers. +# +# In order for the parsing methods to access stored converters in non-main-Ractors, the +# storage structure must be made shareable first. +# Therefore, Ractor.make_shareable(CSV::Converters) and +# Ractor.make_shareable(CSV::HeaderConverters) must be called before the creation +# of Ractors that use the converters stored in these structures. (Since making the storage +# structures shareable involves freezing them, any custom converters that are to be used +# must be added first.) +# +# ===== Converter Lists +# +# A _converter_ _list_ is an \Array that may include any assortment of: +# - Converter procs. +# - Names of stored converters. +# - Nested converter lists. +# +# Examples: +# numeric_converters = [:integer, :float] +# date_converters = [:date, :date_time] +# [numeric_converters, strip_converter] +# [strip_converter, date_converters, :float] +# +# Like a converter proc, a converter list may be named and stored in either +# \CSV::Converters or CSV::HeaderConverters: +# CSV::Converters[:custom] = [strip_converter, date_converters, :float] +# CSV::HeaderConverters[:custom] = [:downcase, :symbol] +# +# There are two built-in converter lists: +# CSV::Converters[:numeric] # => [:integer, :float] +# CSV::Converters[:all] # => [:date_time, :numeric] +# +# ==== Field \Converters +# +# With no conversion, all parsed fields in all rows become Strings: +# string = "foo,0\nbar,1\nbaz,2\n" +# ary = CSV.parse(string) +# ary # => # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# +# When you specify a field converter, each parsed field is passed to the converter; +# its return value becomes the stored value for the field. +# A converter might, for example, convert an integer embedded in a \String +# into a true \Integer. +# (In fact, that's what built-in field converter +:integer+ does.) +# +# There are three ways to use field \converters. +# +# - Using option {converters}[#class-CSV-label-Option+converters] with a parsing method: +# ary = CSV.parse(string, converters: :integer) +# ary # => [0, 1, 2] # => [["foo", 0], ["bar", 1], ["baz", 2]] +# - Using option {converters}[#class-CSV-label-Option+converters] with a new \CSV instance: +# csv = CSV.new(string, converters: :integer) +# # Field converters in effect: +# csv.converters # => [:integer] +# csv.read # => [["foo", 0], ["bar", 1], ["baz", 2]] +# - Using method #convert to add a field converter to a \CSV instance: +# csv = CSV.new(string) +# # Add a converter. +# csv.convert(:integer) +# csv.converters # => [:integer] +# csv.read # => [["foo", 0], ["bar", 1], ["baz", 2]] +# +# Installing a field converter does not affect already-read rows: +# csv = CSV.new(string) +# csv.shift # => ["foo", "0"] +# # Add a converter. +# csv.convert(:integer) +# csv.converters # => [:integer] +# csv.read # => [["bar", 1], ["baz", 2]] +# +# There are additional built-in \converters, and custom \converters are also supported. +# +# ===== Built-In Field \Converters +# +# The built-in field converters are in \Hash CSV::Converters: +# - Each key is a field converter name. +# - Each value is one of: +# - A \Proc field converter. +# - An \Array of field converter names. +# +# Display: +# CSV::Converters.each_pair do |name, value| +# if value.kind_of?(Proc) +# p [name, value.class] +# else +# p [name, value] +# end +# end +# Output: +# [:integer, Proc] +# [:float, Proc] +# [:numeric, [:integer, :float]] +# [:date, Proc] +# [:date_time, Proc] +# [:time, Proc] +# [:all, [:date_time, :numeric]] +# +# Each of these converters transcodes values to UTF-8 before attempting conversion. +# If a value cannot be transcoded to UTF-8 the conversion will +# fail and the value will remain unconverted. +# +# Converter +:integer+ converts each field that Integer() accepts: +# data = '0,1,2,x' +# # Without the converter +# csv = CSV.parse_line(data) +# csv # => ["0", "1", "2", "x"] +# # With the converter +# csv = CSV.parse_line(data, converters: :integer) +# csv # => [0, 1, 2, "x"] +# +# Converter +:float+ converts each field that Float() accepts: +# data = '1.0,3.14159,x' +# # Without the converter +# csv = CSV.parse_line(data) +# csv # => ["1.0", "3.14159", "x"] +# # With the converter +# csv = CSV.parse_line(data, converters: :float) +# csv # => [1.0, 3.14159, "x"] +# +# Converter +:numeric+ converts with both +:integer+ and +:float+.. +# +# Converter +:date+ converts each field that Date::parse accepts: +# data = '2001-02-03,x' +# # Without the converter +# csv = CSV.parse_line(data) +# csv # => ["2001-02-03", "x"] +# # With the converter +# csv = CSV.parse_line(data, converters: :date) +# csv # => [#, "x"] +# +# Converter +:date_time+ converts each field that DateTime::parse accepts: +# data = '2020-05-07T14:59:00-05:00,x' +# # Without the converter +# csv = CSV.parse_line(data) +# csv # => ["2020-05-07T14:59:00-05:00", "x"] +# # With the converter +# csv = CSV.parse_line(data, converters: :date_time) +# csv # => [#, "x"] +# +# Converter +time+ converts each field that Time::parse accepts: +# data = '2020-05-07T14:59:00-05:00,x' +# # Without the converter +# csv = CSV.parse_line(data) +# csv # => ["2020-05-07T14:59:00-05:00", "x"] +# # With the converter +# csv = CSV.parse_line(data, converters: :time) +# csv # => [2020-05-07 14:59:00 -0500, "x"] +# +# Converter +:numeric+ converts with both +:date_time+ and +:numeric+.. +# +# As seen above, method #convert adds \converters to a \CSV instance, +# and method #converters returns an \Array of the \converters in effect: +# csv = CSV.new('0,1,2') +# csv.converters # => [] +# csv.convert(:integer) +# csv.converters # => [:integer] +# csv.convert(:date) +# csv.converters # => [:integer, :date] +# +# ===== Custom Field \Converters +# +# You can define a custom field converter: +# strip_converter = proc {|field| field.strip } +# string = " foo , 0 \n bar , 1 \n baz , 2 \n" +# array = CSV.parse(string, converters: strip_converter) +# array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# You can register the converter in \Converters \Hash, +# which allows you to refer to it by name: +# CSV::Converters[:strip] = strip_converter +# string = " foo , 0 \n bar , 1 \n baz , 2 \n" +# array = CSV.parse(string, converters: :strip) +# array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] +# +# ==== Header \Converters +# +# Header converters operate only on headers (and not on other rows). +# +# There are three ways to use header \converters; +# these examples use built-in header converter +:downcase+, +# which downcases each parsed header. +# +# - Option +header_converters+ with a singleton parsing method: +# string = "Name,Count\nFoo,0\n,Bar,1\nBaz,2" +# tbl = CSV.parse(string, headers: true, header_converters: :downcase) +# tbl.class # => CSV::Table +# tbl.headers # => ["name", "count"] +# +# - Option +header_converters+ with a new \CSV instance: +# csv = CSV.new(string, header_converters: :downcase) +# # Header converters in effect: +# csv.header_converters # => [:downcase] +# tbl = CSV.parse(string, headers: true) +# tbl.headers # => ["Name", "Count"] +# +# - Method #header_convert adds a header converter to a \CSV instance: +# csv = CSV.new(string) +# # Add a header converter. +# csv.header_convert(:downcase) +# csv.header_converters # => [:downcase] +# tbl = CSV.parse(string, headers: true) +# tbl.headers # => ["Name", "Count"] +# +# ===== Built-In Header \Converters +# +# The built-in header \converters are in \Hash CSV::HeaderConverters. +# The keys there are the names of the \converters: +# CSV::HeaderConverters.keys # => [:downcase, :symbol] +# +# Converter +:downcase+ converts each header by downcasing it: +# string = "Name,Count\nFoo,0\n,Bar,1\nBaz,2" +# tbl = CSV.parse(string, headers: true, header_converters: :downcase) +# tbl.class # => CSV::Table +# tbl.headers # => ["name", "count"] +# +# Converter +:symbol+ converts each header by making it into a \Symbol: +# string = "Name,Count\nFoo,0\n,Bar,1\nBaz,2" +# tbl = CSV.parse(string, headers: true, header_converters: :symbol) +# tbl.headers # => [:name, :count] +# Details: +# - Strips leading and trailing whitespace. +# - Downcases the header. +# - Replaces embedded spaces with underscores. +# - Removes non-word characters. +# - Makes the string into a \Symbol. +# +# ===== Custom Header \Converters +# +# You can define a custom header converter: +# upcase_converter = proc {|header| header.upcase } +# string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" +# table = CSV.parse(string, headers: true, header_converters: upcase_converter) +# table # => # +# table.headers # => ["NAME", "VALUE"] +# You can register the converter in \HeaderConverters \Hash, +# which allows you to refer to it by name: +# CSV::HeaderConverters[:upcase] = upcase_converter +# table = CSV.parse(string, headers: true, header_converters: :upcase) +# table # => # +# table.headers # => ["NAME", "VALUE"] +# +# ===== Write \Converters +# +# When you specify a write converter for generating \CSV, +# each field to be written is passed to the converter; +# its return value becomes the new value for the field. +# A converter might, for example, strip whitespace from a field. +# +# Using no write converter (all fields unmodified): +# output_string = CSV.generate do |csv| +# csv << [' foo ', 0] +# csv << [' bar ', 1] +# csv << [' baz ', 2] +# end +# output_string # => " foo ,0\n bar ,1\n baz ,2\n" +# Using option +write_converters+ with two custom write converters: +# strip_converter = proc {|field| field.respond_to?(:strip) ? field.strip : field } +# upcase_converter = proc {|field| field.respond_to?(:upcase) ? field.upcase : field } +# write_converters = [strip_converter, upcase_converter] +# output_string = CSV.generate(write_converters: write_converters) do |csv| +# csv << [' foo ', 0] +# csv << [' bar ', 1] +# csv << [' baz ', 2] +# end +# output_string # => "FOO,0\nBAR,1\nBAZ,2\n" +# +# === Character Encodings (M17n or Multilingualization) +# +# This new CSV parser is m17n savvy. The parser works in the Encoding of the IO +# or String object being read from or written to. Your data is never transcoded +# (unless you ask Ruby to transcode it for you) and will literally be parsed in +# the Encoding it is in. Thus CSV will return Arrays or Rows of Strings in the +# Encoding of your data. This is accomplished by transcoding the parser itself +# into your Encoding. +# +# Some transcoding must take place, of course, to accomplish this multiencoding +# support. For example, :col_sep, :row_sep, and +# :quote_char must be transcoded to match your data. Hopefully this +# makes the entire process feel transparent, since CSV's defaults should just +# magically work for your data. However, you can set these values manually in +# the target Encoding to avoid the translation. +# +# It's also important to note that while all of CSV's core parser is now +# Encoding agnostic, some features are not. For example, the built-in +# converters will try to transcode data to UTF-8 before making conversions. +# Again, you can provide custom converters that are aware of your Encodings to +# avoid this translation. It's just too hard for me to support native +# conversions in all of Ruby's Encodings. +# +# Anyway, the practical side of this is simple: make sure IO and String objects +# passed into CSV have the proper Encoding set and everything should just work. +# CSV methods that allow you to open IO objects (CSV::foreach(), CSV::open(), +# CSV::read(), and CSV::readlines()) do allow you to specify the Encoding. +# +# One minor exception comes when generating CSV into a String with an Encoding +# that is not ASCII compatible. There's no existing data for CSV to use to +# prepare itself and thus you will probably need to manually specify the desired +# Encoding for most of those cases. It will try to guess using the fields in a +# row of output though, when using CSV::generate_line() or Array#to_csv(). +# +# I try to point out any other Encoding issues in the documentation of methods +# as they come up. +# +# This has been tested to the best of my ability with all non-"dummy" Encodings +# Ruby ships with. However, it is brave new code and may have some bugs. +# Please feel free to {report}[mailto:james@grayproductions.net] any issues you +# find with it. +# +class CSV + + # The error thrown when the parser encounters illegal CSV formatting. + class MalformedCSVError < RuntimeError + attr_reader :line_number + alias_method :lineno, :line_number + def initialize(message, line_number) + @line_number = line_number + super("#{message} in line #{line_number}.") + end + end + + # The error thrown when the parser encounters invalid encoding in CSV. + class InvalidEncodingError < MalformedCSVError + attr_reader :encoding + def initialize(encoding, line_number) + @encoding = encoding + super("Invalid byte sequence in #{encoding}", line_number) + end + end + + # + # A FieldInfo Struct contains details about a field's position in the data + # source it was read from. CSV will pass this Struct to some blocks that make + # decisions based on field structure. See CSV.convert_fields() for an + # example. + # + # index:: The zero-based index of the field in its row. + # line:: The line of the data source this row is from. + # header:: The header for the column, when available. + # quoted?:: True or false, whether the original value is quoted or not. + # + FieldInfo = Struct.new(:index, :line, :header, :quoted?) + + # A Regexp used to find and convert some common Date formats. + DateMatcher = / \A(?: (\w+,?\s+)?\w+\s+\d{1,2},?\s+\d{2,4} | + \d{4}-\d{2}-\d{2} )\z /x + # A Regexp used to find and convert some common (Date)Time formats. + DateTimeMatcher = + / \A(?: (\w+,?\s+)?\w+\s+\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2},?\s+\d{2,4} | + # ISO-8601 and RFC-3339 (space instead of T) recognized by (Date)Time.parse + \d{4}-\d{2}-\d{2} + (?:[T\s]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)? + )\z /x + + # The encoding used by all converters. + ConverterEncoding = Encoding.find("UTF-8") + + # A \Hash containing the names and \Procs for the built-in field converters. + # See {Built-In Field Converters}[#class-CSV-label-Built-In+Field+Converters]. + # + # This \Hash is intentionally left unfrozen, and may be extended with + # custom field converters. + # See {Custom Field Converters}[#class-CSV-label-Custom+Field+Converters]. + Converters = { + integer: lambda { |f| + Integer(f.encode(ConverterEncoding)) rescue f + }, + float: lambda { |f| + Float(f.encode(ConverterEncoding)) rescue f + }, + numeric: [:integer, :float], + date: lambda { |f| + begin + e = f.encode(ConverterEncoding) + e.match?(DateMatcher) ? Date.parse(e) : f + rescue # encoding conversion or date parse errors + f + end + }, + date_time: lambda { |f| + begin + e = f.encode(ConverterEncoding) + e.match?(DateTimeMatcher) ? DateTime.parse(e) : f + rescue # encoding conversion or date parse errors + f + end + }, + time: lambda { |f| + begin + e = f.encode(ConverterEncoding) + e.match?(DateTimeMatcher) ? Time.parse(e) : f + rescue # encoding conversion or parse errors + f + end + }, + all: [:date_time, :numeric], + } + + # A \Hash containing the names and \Procs for the built-in header converters. + # See {Built-In Header Converters}[#class-CSV-label-Built-In+Header+Converters]. + # + # This \Hash is intentionally left unfrozen, and may be extended with + # custom field converters. + # See {Custom Header Converters}[#class-CSV-label-Custom+Header+Converters]. + HeaderConverters = { + downcase: lambda { |h| h.encode(ConverterEncoding).downcase }, + symbol: lambda { |h| + h.encode(ConverterEncoding).downcase.gsub(/[^\s\w]+/, "").strip. + gsub(/\s+/, "_").to_sym + }, + symbol_raw: lambda { |h| h.encode(ConverterEncoding).to_sym } + } + + # Default values for method options. + DEFAULT_OPTIONS = { + # For both parsing and generating. + col_sep: ",", + row_sep: :auto, + quote_char: '"', + # For parsing. + field_size_limit: nil, + max_field_size: nil, + converters: nil, + unconverted_fields: nil, + headers: false, + return_headers: false, + header_converters: nil, + skip_blanks: false, + skip_lines: nil, + liberal_parsing: false, + nil_value: nil, + empty_value: "", + strip: false, + # For generating. + write_headers: nil, + quote_empty: true, + force_quotes: false, + write_converters: nil, + write_nil_value: nil, + write_empty_value: "", + }.freeze + + class << self + # :call-seq: + # instance(string, **options) + # instance(io = $stdout, **options) + # instance(string, **options) {|csv| ... } + # instance(io = $stdout, **options) {|csv| ... } + # + # Creates or retrieves cached \CSV objects. + # For arguments and options, see CSV.new. + # + # This API is not Ractor-safe. + # + # --- + # + # With no block given, returns a \CSV object. + # + # The first call to +instance+ creates and caches a \CSV object: + # s0 = 's0' + # csv0 = CSV.instance(s0) + # csv0.class # => CSV + # + # Subsequent calls to +instance+ with that _same_ +string+ or +io+ + # retrieve that same cached object: + # csv1 = CSV.instance(s0) + # csv1.class # => CSV + # csv1.equal?(csv0) # => true # Same CSV object + # + # A subsequent call to +instance+ with a _different_ +string+ or +io+ + # creates and caches a _different_ \CSV object. + # s1 = 's1' + # csv2 = CSV.instance(s1) + # csv2.equal?(csv0) # => false # Different CSV object + # + # All the cached objects remains available: + # csv3 = CSV.instance(s0) + # csv3.equal?(csv0) # true # Same CSV object + # csv4 = CSV.instance(s1) + # csv4.equal?(csv2) # true # Same CSV object + # + # --- + # + # When a block is given, calls the block with the created or retrieved + # \CSV object; returns the block's return value: + # CSV.instance(s0) {|csv| :foo } # => :foo + def instance(data = $stdout, **options) + # create a _signature_ for this method call, data object and options + sig = [data.object_id] + + options.values_at(*DEFAULT_OPTIONS.keys) + + # fetch or create the instance for this signature + @@instances ||= Hash.new + instance = (@@instances[sig] ||= new(data, **options)) + + if block_given? + yield instance # run block, if given, returning result + else + instance # or return the instance + end + end + + # :call-seq: + # filter(in_string_or_io, **options) {|row| ... } -> array_of_arrays or csv_table + # filter(in_string_or_io, out_string_or_io, **options) {|row| ... } -> array_of_arrays or csv_table + # filter(**options) {|row| ... } -> array_of_arrays or csv_table + # + # - Parses \CSV from a source (\String, \IO stream, or ARGF). + # - Calls the given block with each parsed row: + # - Without headers, each row is an \Array. + # - With headers, each row is a CSV::Row. + # - Generates \CSV to an output (\String, \IO stream, or STDOUT). + # - Returns the parsed source: + # - Without headers, an \Array of \Arrays. + # - With headers, a CSV::Table. + # + # When +in_string_or_io+ is given, but not +out_string_or_io+, + # parses from the given +in_string_or_io+ + # and generates to STDOUT. + # + # \String input without headers: + # + # in_string = "foo,0\nbar,1\nbaz,2" + # CSV.filter(in_string) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end # => [["FOO", 0], ["BAR", -1], ["BAZ", -2]] + # + # Output (to STDOUT): + # + # FOO,0 + # BAR,-1 + # BAZ,-2 + # + # \String input with headers: + # + # in_string = "Name,Value\nfoo,0\nbar,1\nbaz,2" + # CSV.filter(in_string, headers: true) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end # => # + # + # Output (to STDOUT): + # + # Name,Value + # FOO,0 + # BAR,-1 + # BAZ,-2 + # + # \IO stream input without headers: + # + # File.write('t.csv', "foo,0\nbar,1\nbaz,2") + # File.open('t.csv') do |in_io| + # CSV.filter(in_io) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end + # end # => [["FOO", 0], ["BAR", -1], ["BAZ", -2]] + # + # Output (to STDOUT): + # + # FOO,0 + # BAR,-1 + # BAZ,-2 + # + # \IO stream input with headers: + # + # File.write('t.csv', "Name,Value\nfoo,0\nbar,1\nbaz,2") + # File.open('t.csv') do |in_io| + # CSV.filter(in_io, headers: true) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end + # end # => # + # + # Output (to STDOUT): + # + # Name,Value + # FOO,0 + # BAR,-1 + # BAZ,-2 + # + # When both +in_string_or_io+ and +out_string_or_io+ are given, + # parses from +in_string_or_io+ and generates to +out_string_or_io+. + # + # \String output without headers: + # + # in_string = "foo,0\nbar,1\nbaz,2" + # out_string = '' + # CSV.filter(in_string, out_string) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end # => [["FOO", 0], ["BAR", -1], ["BAZ", -2]] + # out_string # => "FOO,0\nBAR,-1\nBAZ,-2\n" + # + # \String output with headers: + # + # in_string = "Name,Value\nfoo,0\nbar,1\nbaz,2" + # out_string = '' + # CSV.filter(in_string, out_string, headers: true) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end # => # + # out_string # => "Name,Value\nFOO,0\nBAR,-1\nBAZ,-2\n" + # + # \IO stream output without headers: + # + # in_string = "foo,0\nbar,1\nbaz,2" + # File.open('t.csv', 'w') do |out_io| + # CSV.filter(in_string, out_io) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end + # end # => [["FOO", 0], ["BAR", -1], ["BAZ", -2]] + # File.read('t.csv') # => "FOO,0\nBAR,-1\nBAZ,-2\n" + # + # \IO stream output with headers: + # + # in_string = "Name,Value\nfoo,0\nbar,1\nbaz,2" + # File.open('t.csv', 'w') do |out_io| + # CSV.filter(in_string, out_io, headers: true) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end + # end # => # + # File.read('t.csv') # => "Name,Value\nFOO,0\nBAR,-1\nBAZ,-2\n" + # + # When neither +in_string_or_io+ nor +out_string_or_io+ given, + # parses from {ARGF}[rdoc-ref:ARGF] + # and generates to STDOUT. + # + # Without headers: + # + # # Put Ruby code into a file. + # ruby = <<-EOT + # require 'csv' + # CSV.filter do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end + # EOT + # File.write('t.rb', ruby) + # # Put some CSV into a file. + # File.write('t.csv', "foo,0\nbar,1\nbaz,2") + # # Run the Ruby code with CSV filename as argument. + # system(Gem.ruby, "t.rb", "t.csv") + # + # Output (to STDOUT): + # + # FOO,0 + # BAR,-1 + # BAZ,-2 + # + # With headers: + # + # # Put Ruby code into a file. + # ruby = <<-EOT + # require 'csv' + # CSV.filter(headers: true) do |row| + # row[0].upcase! + # row[1] = - row[1].to_i + # end + # EOT + # File.write('t.rb', ruby) + # # Put some CSV into a file. + # File.write('t.csv', "Name,Value\nfoo,0\nbar,1\nbaz,2") + # # Run the Ruby code with CSV filename as argument. + # system(Gem.ruby, "t.rb", "t.csv") + # + # Output (to STDOUT): + # + # Name,Value + # FOO,0 + # BAR,-1 + # BAZ,-2 + # + # Arguments: + # + # * Argument +in_string_or_io+ must be a \String or an \IO stream. + # * Argument +out_string_or_io+ must be a \String or an \IO stream. + # * Arguments **options must be keyword options. + # + # - Each option defined as an {option for parsing}[#class-CSV-label-Options+for+Parsing] + # is used for parsing the filter input. + # - Each option defined as an {option for generating}[#class-CSV-label-Options+for+Generating] + # is used for generator the filter input. + # + # However, there are three options that may be used for both parsing and generating: + # +col_sep+, +quote_char+, and +row_sep+. + # + # Therefore for method +filter+ (and method +filter+ only), + # there are special options that allow these parsing and generating options + # to be specified separately: + # + # - Options +input_col_sep+ and +output_col_sep+ + # (and their aliases +in_col_sep+ and +out_col_sep+) + # specify the column separators for parsing and generating. + # - Options +input_quote_char+ and +output_quote_char+ + # (and their aliases +in_quote_char+ and +out_quote_char+) + # specify the quote characters for parsing and generting. + # - Options +input_row_sep+ and +output_row_sep+ + # (and their aliases +in_row_sep+ and +out_row_sep+) + # specify the row separators for parsing and generating. + # + # Example options (for column separators): + # + # CSV.filter # Default for both parsing and generating. + # CSV.filter(in_col_sep: ';') # ';' for parsing, default for generating. + # CSV.filter(out_col_sep: '|') # Default for parsing, '|' for generating. + # CSV.filter(in_col_sep: ';', out_col_sep: '|') # ';' for parsing, '|' for generating. + # + # Note that for a special option (e.g., +input_col_sep+) + # and its corresponding "regular" option (e.g., +col_sep+), + # the two are mutually overriding. + # + # Another example (possibly surprising): + # + # CSV.filter(in_col_sep: ';', col_sep: '|') # '|' for both parsing(!) and generating. + # + def filter(input=nil, output=nil, **options) + # parse options for input, output, or both + in_options, out_options = Hash.new, {row_sep: InputRecordSeparator.value} + options.each do |key, value| + case key + when /\Ain(?:put)?_(.+)\Z/ + in_options[$1.to_sym] = value + when /\Aout(?:put)?_(.+)\Z/ + out_options[$1.to_sym] = value + else + in_options[key] = value + out_options[key] = value + end + end + + # build input and output wrappers + input = new(input || ARGF, **in_options) + output = new(output || $stdout, **out_options) + + # process headers + need_manual_header_output = + (in_options[:headers] and + out_options[:headers] == true and + out_options[:write_headers]) + if need_manual_header_output + first_row = input.shift + if first_row + if first_row.is_a?(Row) + headers = first_row.headers + yield headers + output << headers + end + yield first_row + output << first_row + end + end + + # read, yield, write + input.each do |row| + yield row + output << row + end + end + + # + # :call-seq: + # foreach(path_or_io, mode='r', **options) {|row| ... ) + # foreach(path_or_io, mode='r', **options) -> new_enumerator + # + # Calls the block with each row read from source +path_or_io+. + # + # \Path input without headers: + # + # string = "foo,0\nbar,1\nbaz,2\n" + # in_path = 't.csv' + # File.write(in_path, string) + # CSV.foreach(in_path) {|row| p row } + # + # Output: + # + # ["foo", "0"] + # ["bar", "1"] + # ["baz", "2"] + # + # \Path input with headers: + # + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # in_path = 't.csv' + # File.write(in_path, string) + # CSV.foreach(in_path, headers: true) {|row| p row } + # + # Output: + # + # + # + # + # + # \IO stream input without headers: + # + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # File.open('t.csv') do |in_io| + # CSV.foreach(in_io) {|row| p row } + # end + # + # Output: + # + # ["foo", "0"] + # ["bar", "1"] + # ["baz", "2"] + # + # \IO stream input with headers: + # + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # File.open('t.csv') do |in_io| + # CSV.foreach(in_io, headers: true) {|row| p row } + # end + # + # Output: + # + # + # + # + # + # With no block given, returns an \Enumerator: + # + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # CSV.foreach(path) # => # + # + # Arguments: + # * Argument +path_or_io+ must be a file path or an \IO stream. + # * Argument +mode+, if given, must be a \File mode. + # See {Access Modes}[https://docs.ruby-lang.org/en/master/File.html#class-File-label-Access+Modes]. + # * Arguments **options must be keyword options. + # See {Options for Parsing}[#class-CSV-label-Options+for+Parsing]. + # * This method optionally accepts an additional :encoding option + # that you can use to specify the Encoding of the data read from +path+ or +io+. + # You must provide this unless your data is in the encoding + # given by Encoding::default_external. + # Parsing will use this to determine how to parse the data. + # You may provide a second Encoding to + # have the data transcoded as it is read. For example, + # encoding: 'UTF-32BE:UTF-8' + # would read +UTF-32BE+ data from the file + # but transcode it to +UTF-8+ before parsing. + def foreach(path, mode="r", **options, &block) + return to_enum(__method__, path, mode, **options) unless block_given? + open(path, mode, **options) do |csv| + csv.each(&block) + end + end + + # + # :call-seq: + # generate(csv_string, **options) {|csv| ... } + # generate(**options) {|csv| ... } + # + # * Argument +csv_string+, if given, must be a \String object; + # defaults to a new empty \String. + # * Arguments +options+, if given, should be generating options. + # See {Options for Generating}[#class-CSV-label-Options+for+Generating]. + # + # --- + # + # Creates a new \CSV object via CSV.new(csv_string, **options); + # calls the block with the \CSV object, which the block may modify; + # returns the \String generated from the \CSV object. + # + # Note that a passed \String *is* modified by this method. + # Pass csv_string.dup if the \String must be preserved. + # + # This method has one additional option: :encoding, + # which sets the base Encoding for the output if no no +str+ is specified. + # CSV needs this hint if you plan to output non-ASCII compatible data. + # + # --- + # + # Add lines: + # input_string = "foo,0\nbar,1\nbaz,2\n" + # output_string = CSV.generate(input_string) do |csv| + # csv << ['bat', 3] + # csv << ['bam', 4] + # end + # output_string # => "foo,0\nbar,1\nbaz,2\nbat,3\nbam,4\n" + # input_string # => "foo,0\nbar,1\nbaz,2\nbat,3\nbam,4\n" + # output_string.equal?(input_string) # => true # Same string, modified + # + # Add lines into new string, preserving old string: + # input_string = "foo,0\nbar,1\nbaz,2\n" + # output_string = CSV.generate(input_string.dup) do |csv| + # csv << ['bat', 3] + # csv << ['bam', 4] + # end + # output_string # => "foo,0\nbar,1\nbaz,2\nbat,3\nbam,4\n" + # input_string # => "foo,0\nbar,1\nbaz,2\n" + # output_string.equal?(input_string) # => false # Different strings + # + # Create lines from nothing: + # output_string = CSV.generate do |csv| + # csv << ['foo', 0] + # csv << ['bar', 1] + # csv << ['baz', 2] + # end + # output_string # => "foo,0\nbar,1\nbaz,2\n" + # + # --- + # + # Raises an exception if +csv_string+ is not a \String object: + # # Raises TypeError (no implicit conversion of Integer into String) + # CSV.generate(0) + # + def generate(str=nil, **options) + encoding = options[:encoding] + # add a default empty String, if none was given + if str + str = StringIO.new(str) + str.seek(0, IO::SEEK_END) + str.set_encoding(encoding) if encoding + else + str = +"" + str.force_encoding(encoding) if encoding + end + csv = new(str, **options) # wrap + yield csv # yield for appending + csv.string # return final String + end + + # :call-seq: + # CSV.generate_line(ary) + # CSV.generate_line(ary, **options) + # + # Returns the \String created by generating \CSV from +ary+ + # using the specified +options+. + # + # Argument +ary+ must be an \Array. + # + # Special options: + # * Option :row_sep defaults to "\n"> on Ruby 3.0 or later + # and $INPUT_RECORD_SEPARATOR ($/) otherwise.: + # $INPUT_RECORD_SEPARATOR # => "\n" + # * This method accepts an additional option, :encoding, which sets the base + # Encoding for the output. This method will try to guess your Encoding from + # the first non-+nil+ field in +row+, if possible, but you may need to use + # this parameter as a backup plan. + # + # For other +options+, + # see {Options for Generating}[#class-CSV-label-Options+for+Generating]. + # + # --- + # + # Returns the \String generated from an \Array: + # CSV.generate_line(['foo', '0']) # => "foo,0\n" + # + # --- + # + # Raises an exception if +ary+ is not an \Array: + # # Raises NoMethodError (undefined method `find' for :foo:Symbol) + # CSV.generate_line(:foo) + # + def generate_line(row, **options) + options = {row_sep: InputRecordSeparator.value}.merge(options) + str = +"" + if options[:encoding] + str.force_encoding(options[:encoding]) + else + fallback_encoding = nil + output_encoding = nil + row.each do |field| + next unless field.is_a?(String) + fallback_encoding ||= field.encoding + next if field.ascii_only? + output_encoding = field.encoding + break + end + output_encoding ||= fallback_encoding + if output_encoding + str.force_encoding(output_encoding) + end + end + (new(str, **options) << row).string + end + + # :call-seq: + # CSV.generate_lines(rows) + # CSV.generate_lines(rows, **options) + # + # Returns the \String created by generating \CSV from + # using the specified +options+. + # + # Argument +rows+ must be an \Array of row. Row is \Array of \String or \CSV::Row. + # + # Special options: + # * Option :row_sep defaults to "\n" on Ruby 3.0 or later + # and $INPUT_RECORD_SEPARATOR ($/) otherwise.: + # $INPUT_RECORD_SEPARATOR # => "\n" + # * This method accepts an additional option, :encoding, which sets the base + # Encoding for the output. This method will try to guess your Encoding from + # the first non-+nil+ field in +row+, if possible, but you may need to use + # this parameter as a backup plan. + # + # For other +options+, + # see {Options for Generating}[#class-CSV-label-Options+for+Generating]. + # + # --- + # + # Returns the \String generated from an + # CSV.generate_lines([['foo', '0'], ['bar', '1'], ['baz', '2']]) # => "foo,0\nbar,1\nbaz,2\n" + # + # --- + # + # Raises an exception + # # Raises NoMethodError (undefined method `each' for :foo:Symbol) + # CSV.generate_lines(:foo) + # + def generate_lines(rows, **options) + self.generate(**options) do |csv| + rows.each do |row| + csv << row + end + end + end + + # + # :call-seq: + # open(path_or_io, mode = "rb", **options ) -> new_csv + # open(path_or_io, mode = "rb", **options ) { |csv| ... } -> object + # + # possible options elements: + # keyword form: + # :invalid => nil # raise error on invalid byte sequence (default) + # :invalid => :replace # replace invalid byte sequence + # :undef => :replace # replace undefined conversion + # :replace => string # replacement string ("?" or "\uFFFD" if not specified) + # + # * Argument +path_or_io+, must be a file path or an \IO stream. + # :include: ../doc/csv/arguments/io.rdoc + # * Argument +mode+, if given, must be a \File mode. + # See {Access Modes}[https://docs.ruby-lang.org/en/master/File.html#class-File-label-Access+Modes]. + # * Arguments **options must be keyword options. + # See {Options for Generating}[#class-CSV-label-Options+for+Generating]. + # * This method optionally accepts an additional :encoding option + # that you can use to specify the Encoding of the data read from +path+ or +io+. + # You must provide this unless your data is in the encoding + # given by Encoding::default_external. + # Parsing will use this to determine how to parse the data. + # You may provide a second Encoding to + # have the data transcoded as it is read. For example, + # encoding: 'UTF-32BE:UTF-8' + # would read +UTF-32BE+ data from the file + # but transcode it to +UTF-8+ before parsing. + # + # --- + # + # These examples assume prior execution of: + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # + # string_io = StringIO.new + # string_io << "foo,0\nbar,1\nbaz,2\n" + # + # --- + # + # With no block given, returns a new \CSV object. + # + # Create a \CSV object using a file path: + # csv = CSV.open(path) + # csv # => # + # + # Create a \CSV object using an open \File: + # csv = CSV.open(File.open(path)) + # csv # => # + # + # Create a \CSV object using a \StringIO: + # csv = CSV.open(string_io) + # csv # => # + # --- + # + # With a block given, calls the block with the created \CSV object; + # returns the block's return value: + # + # Using a file path: + # csv = CSV.open(path) {|csv| p csv} + # csv # => # + # Output: + # # + # + # Using an open \File: + # csv = CSV.open(File.open(path)) {|csv| p csv} + # csv # => # + # Output: + # # + # + # Using a \StringIO: + # csv = CSV.open(string_io) {|csv| p csv} + # csv # => # + # Output: + # # + # --- + # + # Raises an exception if the argument is not a \String object or \IO object: + # # Raises TypeError (no implicit conversion of Symbol into String) + # CSV.open(:foo) + def open(filename_or_io, mode="r", **options) + # wrap a File opened with the remaining +args+ with no newline + # decorator + file_opts = {} + may_enable_bom_detection_automatically(filename_or_io, + mode, + options, + file_opts) + file_opts.merge!(options) + unless file_opts.key?(:newline) + file_opts[:universal_newline] ||= false + end + options.delete(:invalid) + options.delete(:undef) + options.delete(:replace) + options.delete_if {|k, _| /newline\z/.match?(k)} + + if filename_or_io.is_a?(StringIO) + f = create_stringio(filename_or_io.string, mode, **file_opts) + else + begin + f = File.open(filename_or_io, mode, **file_opts) + rescue ArgumentError => e + raise unless /needs binmode/.match?(e.message) and mode == "r" + mode = "rb" + file_opts = {encoding: Encoding.default_external}.merge(file_opts) + retry + end + end + + begin + csv = new(f, **options) + rescue Exception + f.close + raise + end + + # handle blocks like Ruby's open(), not like the CSV library + if block_given? + begin + yield csv + ensure + csv.close + end + else + csv + end + end + + # + # :call-seq: + # parse(string) -> array_of_arrays + # parse(io) -> array_of_arrays + # parse(string, headers: ..., **options) -> csv_table + # parse(io, headers: ..., **options) -> csv_table + # parse(string, **options) {|row| ... } + # parse(io, **options) {|row| ... } + # + # Parses +string+ or +io+ using the specified +options+. + # + # - Argument +string+ should be a \String object; + # it will be put into a new StringIO object positioned at the beginning. + # :include: ../doc/csv/arguments/io.rdoc + # - Argument +options+: see {Options for Parsing}[#class-CSV-label-Options+for+Parsing] + # + # ====== Without Option +headers+ + # + # Without {option +headers+}[#class-CSV-label-Option+headers] case. + # + # These examples assume prior execution of: + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # + # --- + # + # With no block given, returns an \Array of Arrays formed from the source. + # + # Parse a \String: + # a_of_a = CSV.parse(string) + # a_of_a # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] + # + # Parse an open \File: + # a_of_a = File.open(path) do |file| + # CSV.parse(file) + # end + # a_of_a # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] + # + # --- + # + # With a block given, calls the block with each parsed row: + # + # Parse a \String: + # CSV.parse(string) {|row| p row } + # + # Output: + # ["foo", "0"] + # ["bar", "1"] + # ["baz", "2"] + # + # Parse an open \File: + # File.open(path) do |file| + # CSV.parse(file) {|row| p row } + # end + # + # Output: + # ["foo", "0"] + # ["bar", "1"] + # ["baz", "2"] + # + # ====== With Option +headers+ + # + # With {option +headers+}[#class-CSV-label-Option+headers] case. + # + # These examples assume prior execution of: + # string = "Name,Count\nfoo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # + # --- + # + # With no block given, returns a CSV::Table object formed from the source. + # + # Parse a \String: + # csv_table = CSV.parse(string, headers: ['Name', 'Count']) + # csv_table # => # + # + # Parse an open \File: + # csv_table = File.open(path) do |file| + # CSV.parse(file, headers: ['Name', 'Count']) + # end + # csv_table # => # + # + # --- + # + # With a block given, calls the block with each parsed row, + # which has been formed into a CSV::Row object: + # + # Parse a \String: + # CSV.parse(string, headers: ['Name', 'Count']) {|row| p row } + # + # Output: + # # + # # + # # + # + # Parse an open \File: + # File.open(path) do |file| + # CSV.parse(file, headers: ['Name', 'Count']) {|row| p row } + # end + # + # Output: + # # + # # + # # + # + # --- + # + # Raises an exception if the argument is not a \String object or \IO object: + # # Raises NoMethodError (undefined method `close' for :foo:Symbol) + # CSV.parse(:foo) + # + # --- + # + # Please make sure if your text contains \BOM or not. CSV.parse will not remove + # \BOM automatically. You might want to remove \BOM before calling CSV.parse : + # # remove BOM on calling File.open + # File.open(path, encoding: 'bom|utf-8') do |file| + # CSV.parse(file, headers: true) do |row| + # # you can get value by column name because BOM is removed + # p row['Name'] + # end + # end + # + # Output: + # # "foo" + # # "bar" + # # "baz" + def parse(str, **options, &block) + csv = new(str, **options) + + return csv.each(&block) if block_given? + + # slurp contents, if no block is given + begin + csv.read + ensure + csv.close + end + end + + # :call-seq: + # CSV.parse_line(string) -> new_array or nil + # CSV.parse_line(io) -> new_array or nil + # CSV.parse_line(string, **options) -> new_array or nil + # CSV.parse_line(io, **options) -> new_array or nil + # CSV.parse_line(string, headers: true, **options) -> csv_row or nil + # CSV.parse_line(io, headers: true, **options) -> csv_row or nil + # + # Returns the data created by parsing the first line of +string+ or +io+ + # using the specified +options+. + # + # - Argument +string+ should be a \String object; + # it will be put into a new StringIO object positioned at the beginning. + # :include: ../doc/csv/arguments/io.rdoc + # - Argument +options+: see {Options for Parsing}[#class-CSV-label-Options+for+Parsing] + # + # ====== Without Option +headers+ + # + # Without option +headers+, returns the first row as a new \Array. + # + # These examples assume prior execution of: + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # + # Parse the first line from a \String object: + # CSV.parse_line(string) # => ["foo", "0"] + # + # Parse the first line from a File object: + # File.open(path) do |file| + # CSV.parse_line(file) # => ["foo", "0"] + # end # => ["foo", "0"] + # + # Returns +nil+ if the argument is an empty \String: + # CSV.parse_line('') # => nil + # + # ====== With Option +headers+ + # + # With {option +headers+}[#class-CSV-label-Option+headers], + # returns the first row as a CSV::Row object. + # + # These examples assume prior execution of: + # string = "Name,Count\nfoo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # + # Parse the first line from a \String object: + # CSV.parse_line(string, headers: true) # => # + # + # Parse the first line from a File object: + # File.open(path) do |file| + # CSV.parse_line(file, headers: true) + # end # => # + # + # --- + # + # Raises an exception if the argument is +nil+: + # # Raises ArgumentError (Cannot parse nil as CSV): + # CSV.parse_line(nil) + # + def parse_line(line, **options) + new(line, **options).each.first + end + + # + # :call-seq: + # read(source, **options) -> array_of_arrays + # read(source, headers: true, **options) -> csv_table + # + # Opens the given +source+ with the given +options+ (see CSV.open), + # reads the source (see CSV#read), and returns the result, + # which will be either an \Array of Arrays or a CSV::Table. + # + # Without headers: + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # CSV.read(path) # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] + # + # With headers: + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # CSV.read(path, headers: true) # => # + def read(path, **options) + open(path, **options) { |csv| csv.read } + end + + # :call-seq: + # CSV.readlines(source, **options) + # + # Alias for CSV.read. + def readlines(path, **options) + read(path, **options) + end + + # :call-seq: + # CSV.table(source, **options) + # + # Calls CSV.read with +source+, +options+, and certain default options: + # - +headers+: +true+ + # - +converters+: +:numeric+ + # - +header_converters+: +:symbol+ + # + # Returns a CSV::Table object. + # + # Example: + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # CSV.table(path) # => # + def table(path, **options) + default_options = { + headers: true, + converters: :numeric, + header_converters: :symbol, + } + options = default_options.merge(options) + read(path, **options) + end + + ON_WINDOWS = /mingw|mswin/.match?(RUBY_PLATFORM) + private_constant :ON_WINDOWS + + private + def may_enable_bom_detection_automatically(filename_or_io, + mode, + options, + file_opts) + if filename_or_io.is_a?(StringIO) + # Support to StringIO was dropped for Ruby 2.6 and earlier without BOM support: + # https://github.com/ruby/stringio/pull/47 + return if RUBY_VERSION < "2.7" + else + # "bom|utf-8" may be buggy on Windows: + # https://bugs.ruby-lang.org/issues/20526 + return if ON_WINDOWS + end + return unless Encoding.default_external == Encoding::UTF_8 + return if options.key?(:encoding) + return if options.key?(:external_encoding) + return if mode.is_a?(String) and mode.include?(":") + file_opts[:encoding] = "bom|utf-8" + end + + if RUBY_VERSION < "2.7" + def create_stringio(str, mode, opts) + opts.delete_if {|k, _| k == :universal_newline or DEFAULT_OPTIONS.key?(k)} + raise ArgumentError, "Unsupported options parsing StringIO: #{opts.keys}" unless opts.empty? + StringIO.new(str, mode) + end + else + def create_stringio(str, mode, opts) + StringIO.new(str, mode, **opts) + end + end + end + + # :call-seq: + # CSV.new(string) + # CSV.new(io) + # CSV.new(string, **options) + # CSV.new(io, **options) + # + # Returns the new \CSV object created using +string+ or +io+ + # and the specified +options+. + # + # - Argument +string+ should be a \String object; + # it will be put into a new StringIO object positioned at the beginning. + # :include: ../doc/csv/arguments/io.rdoc + # - Argument +options+: See: + # * {Options for Parsing}[#class-CSV-label-Options+for+Parsing] + # * {Options for Generating}[#class-CSV-label-Options+for+Generating] + # For performance reasons, the options cannot be overridden + # in a \CSV object, so those specified here will endure. + # + # In addition to the \CSV instance methods, several \IO methods are delegated. + # See {Delegated Methods}[#class-CSV-label-Delegated+Methods]. + # + # --- + # + # Create a \CSV object from a \String object: + # csv = CSV.new('foo,0') + # csv # => # + # + # Create a \CSV object from a \File object: + # File.write('t.csv', 'foo,0') + # csv = CSV.new(File.open('t.csv')) + # csv # => # + # + # --- + # + # Raises an exception if the argument is +nil+: + # # Raises ArgumentError (Cannot parse nil as CSV): + # CSV.new(nil) + # + def initialize(data, + col_sep: ",", + row_sep: :auto, + quote_char: '"', + field_size_limit: nil, + max_field_size: nil, + converters: nil, + unconverted_fields: nil, + headers: false, + return_headers: false, + write_headers: nil, + header_converters: nil, + skip_blanks: false, + force_quotes: false, + skip_lines: nil, + liberal_parsing: false, + internal_encoding: nil, + external_encoding: nil, + encoding: nil, + nil_value: nil, + empty_value: "", + strip: false, + quote_empty: true, + write_converters: nil, + write_nil_value: nil, + write_empty_value: "") + raise ArgumentError.new("Cannot parse nil as CSV") if data.nil? + + if data.is_a?(String) + if encoding + if encoding.is_a?(String) + data_external_encoding, data_internal_encoding = encoding.split(":", 2) + if data_internal_encoding + data = data.encode(data_internal_encoding, data_external_encoding) + else + data = data.dup.force_encoding(data_external_encoding) + end + else + data = data.dup.force_encoding(encoding) + end + end + @io = StringIO.new(data) + else + @io = data + end + @encoding = determine_encoding(encoding, internal_encoding) + + @base_fields_converter_options = { + nil_value: nil_value, + empty_value: empty_value, + } + @write_fields_converter_options = { + nil_value: write_nil_value, + empty_value: write_empty_value, + } + @initial_converters = converters + @initial_header_converters = header_converters + @initial_write_converters = write_converters + + if max_field_size.nil? and field_size_limit + max_field_size = field_size_limit - 1 + end + @parser_options = { + column_separator: col_sep, + row_separator: row_sep, + quote_character: quote_char, + max_field_size: max_field_size, + unconverted_fields: unconverted_fields, + headers: headers, + return_headers: return_headers, + skip_blanks: skip_blanks, + skip_lines: skip_lines, + liberal_parsing: liberal_parsing, + encoding: @encoding, + nil_value: nil_value, + empty_value: empty_value, + strip: strip, + } + @parser = nil + @parser_enumerator = nil + @eof_error = nil + + @writer_options = { + encoding: @encoding, + force_encoding: (not encoding.nil?), + force_quotes: force_quotes, + headers: headers, + write_headers: write_headers, + column_separator: col_sep, + row_separator: row_sep, + quote_character: quote_char, + quote_empty: quote_empty, + } + + @writer = nil + writer if @writer_options[:write_headers] + end + + class TSV < CSV + def initialize(data, **options) + super(data, **({col_sep: "\t"}.merge(options))) + end + end + + # :call-seq: + # csv.col_sep -> string + # + # Returns the encoded column separator; used for parsing and writing; + # see {Option +col_sep+}[#class-CSV-label-Option+col_sep]: + # CSV.new('').col_sep # => "," + def col_sep + parser.column_separator + end + + # :call-seq: + # csv.row_sep -> string + # + # Returns the encoded row separator; used for parsing and writing; + # see {Option +row_sep+}[#class-CSV-label-Option+row_sep]: + # CSV.new('').row_sep # => "\n" + def row_sep + parser.row_separator + end + + # :call-seq: + # csv.quote_char -> character + # + # Returns the encoded quote character; used for parsing and writing; + # see {Option +quote_char+}[#class-CSV-label-Option+quote_char]: + # CSV.new('').quote_char # => "\"" + def quote_char + parser.quote_character + end + + # :call-seq: + # csv.field_size_limit -> integer or nil + # + # Returns the limit for field size; used for parsing; + # see {Option +field_size_limit+}[#class-CSV-label-Option+field_size_limit]: + # CSV.new('').field_size_limit # => nil + # + # Deprecated since 3.2.3. Use +max_field_size+ instead. + def field_size_limit + parser.field_size_limit + end + + # :call-seq: + # csv.max_field_size -> integer or nil + # + # Returns the limit for field size; used for parsing; + # see {Option +max_field_size+}[#class-CSV-label-Option+max_field_size]: + # CSV.new('').max_field_size # => nil + # + # Since 3.2.3. + def max_field_size + parser.max_field_size + end + + # :call-seq: + # csv.skip_lines -> regexp or nil + # + # Returns the \Regexp used to identify comment lines; used for parsing; + # see {Option +skip_lines+}[#class-CSV-label-Option+skip_lines]: + # CSV.new('').skip_lines # => nil + def skip_lines + parser.skip_lines + end + + # :call-seq: + # csv.converters -> array + # + # Returns an \Array containing field converters; + # see {Field Converters}[#class-CSV-label-Field+Converters]: + # csv = CSV.new('') + # csv.converters # => [] + # csv.convert(:integer) + # csv.converters # => [:integer] + # csv.convert(proc {|x| x.to_s }) + # csv.converters + # + # Notes that you need to call + # +Ractor.make_shareable(CSV::Converters)+ on the main Ractor to use + # this method. + def converters + parser_fields_converter.map do |converter| + name = Converters.rassoc(converter) + name ? name.first : converter + end + end + + # :call-seq: + # csv.unconverted_fields? -> object + # + # Returns the value that determines whether unconverted fields are to be + # available; used for parsing; + # see {Option +unconverted_fields+}[#class-CSV-label-Option+unconverted_fields]: + # CSV.new('').unconverted_fields? # => nil + def unconverted_fields? + parser.unconverted_fields? + end + + # :call-seq: + # csv.headers -> object + # + # Returns the value that determines whether headers are used; used for parsing; + # see {Option +headers+}[#class-CSV-label-Option+headers]: + # CSV.new('').headers # => nil + def headers + if @writer + @writer.headers + else + parsed_headers = parser.headers + return parsed_headers if parsed_headers + raw_headers = @parser_options[:headers] + raw_headers = nil if raw_headers == false + raw_headers + end + end + + # :call-seq: + # csv.return_headers? -> true or false + # + # Returns the value that determines whether headers are to be returned; used for parsing; + # see {Option +return_headers+}[#class-CSV-label-Option+return_headers]: + # CSV.new('').return_headers? # => false + def return_headers? + parser.return_headers? + end + + # :call-seq: + # csv.write_headers? -> true or false + # + # Returns the value that determines whether headers are to be written; used for generating; + # see {Option +write_headers+}[#class-CSV-label-Option+write_headers]: + # CSV.new('').write_headers? # => nil + def write_headers? + @writer_options[:write_headers] + end + + # :call-seq: + # csv.header_converters -> array + # + # Returns an \Array containing header converters; used for parsing; + # see {Header Converters}[#class-CSV-label-Header+Converters]: + # CSV.new('').header_converters # => [] + # + # Notes that you need to call + # +Ractor.make_shareable(CSV::HeaderConverters)+ on the main Ractor + # to use this method. + def header_converters + header_fields_converter.map do |converter| + name = HeaderConverters.rassoc(converter) + name ? name.first : converter + end + end + + # :call-seq: + # csv.skip_blanks? -> true or false + # + # Returns the value that determines whether blank lines are to be ignored; used for parsing; + # see {Option +skip_blanks+}[#class-CSV-label-Option+skip_blanks]: + # CSV.new('').skip_blanks? # => false + def skip_blanks? + parser.skip_blanks? + end + + # :call-seq: + # csv.force_quotes? -> true or false + # + # Returns the value that determines whether all output fields are to be quoted; + # used for generating; + # see {Option +force_quotes+}[#class-CSV-label-Option+force_quotes]: + # CSV.new('').force_quotes? # => false + def force_quotes? + @writer_options[:force_quotes] + end + + # :call-seq: + # csv.liberal_parsing? -> true or false + # + # Returns the value that determines whether illegal input is to be handled; used for parsing; + # see {Option +liberal_parsing+}[#class-CSV-label-Option+liberal_parsing]: + # CSV.new('').liberal_parsing? # => false + def liberal_parsing? + parser.liberal_parsing? + end + + # :call-seq: + # csv.encoding -> encoding + # + # Returns the encoding used for parsing and generating; + # see {Character Encodings (M17n or Multilingualization)}[#class-CSV-label-Character+Encodings+-28M17n+or+Multilingualization-29]: + # CSV.new('').encoding # => # + attr_reader :encoding + + # :call-seq: + # csv.line_no -> integer + # + # Returns the count of the rows parsed or generated. + # + # Parsing: + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # CSV.open(path) do |csv| + # csv.each do |row| + # p [csv.lineno, row] + # end + # end + # Output: + # [1, ["foo", "0"]] + # [2, ["bar", "1"]] + # [3, ["baz", "2"]] + # + # Generating: + # CSV.generate do |csv| + # p csv.lineno; csv << ['foo', 0] + # p csv.lineno; csv << ['bar', 1] + # p csv.lineno; csv << ['baz', 2] + # end + # Output: + # 0 + # 1 + # 2 + def lineno + if @writer + @writer.lineno + else + parser.lineno + end + end + + # :call-seq: + # csv.line -> array + # + # Returns the line most recently read: + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # CSV.open(path) do |csv| + # csv.each do |row| + # p [csv.lineno, csv.line] + # end + # end + # Output: + # [1, "foo,0\n"] + # [2, "bar,1\n"] + # [3, "baz,2\n"] + def line + parser.line + end + + ### IO and StringIO Delegation ### + + extend Forwardable + def_delegators :@io, :binmode, :close, :close_read, :close_write, + :closed?, :external_encoding, :fcntl, + :fileno, :flush, :fsync, :internal_encoding, + :isatty, :pid, :pos, :pos=, :reopen, + :seek, :string, :sync, :sync=, :tell, + :truncate, :tty? + + def binmode? + if @io.respond_to?(:binmode?) + @io.binmode? + else + false + end + end + + def flock(*args) + raise NotImplementedError unless @io.respond_to?(:flock) + @io.flock(*args) + end + + def ioctl(*args) + raise NotImplementedError unless @io.respond_to?(:ioctl) + @io.ioctl(*args) + end + + def path + @io.path if @io.respond_to?(:path) + end + + def stat(*args) + raise NotImplementedError unless @io.respond_to?(:stat) + @io.stat(*args) + end + + def to_i + raise NotImplementedError unless @io.respond_to?(:to_i) + @io.to_i + end + + def to_io + @io.respond_to?(:to_io) ? @io.to_io : @io + end + + def eof? + return false if @eof_error + begin + parser_enumerator.peek + false + rescue MalformedCSVError => error + @eof_error = error + false + rescue StopIteration + true + end + end + alias_method :eof, :eof? + + # Rewinds the underlying IO object and resets CSV's lineno() counter. + def rewind + @parser = nil + @parser_enumerator = nil + @eof_error = nil + @writer.rewind if @writer + @io.rewind + end + + ### End Delegation ### + + # :call-seq: + # csv << row -> self + # + # Appends a row to +self+. + # + # - Argument +row+ must be an \Array object or a CSV::Row object. + # - The output stream must be open for writing. + # + # --- + # + # Append Arrays: + # CSV.generate do |csv| + # csv << ['foo', 0] + # csv << ['bar', 1] + # csv << ['baz', 2] + # end # => "foo,0\nbar,1\nbaz,2\n" + # + # Append CSV::Rows: + # headers = [] + # CSV.generate do |csv| + # csv << CSV::Row.new(headers, ['foo', 0]) + # csv << CSV::Row.new(headers, ['bar', 1]) + # csv << CSV::Row.new(headers, ['baz', 2]) + # end # => "foo,0\nbar,1\nbaz,2\n" + # + # Headers in CSV::Row objects are not appended: + # headers = ['Name', 'Count'] + # CSV.generate do |csv| + # csv << CSV::Row.new(headers, ['foo', 0]) + # csv << CSV::Row.new(headers, ['bar', 1]) + # csv << CSV::Row.new(headers, ['baz', 2]) + # end # => "foo,0\nbar,1\nbaz,2\n" + # + # --- + # + # Raises an exception if +row+ is not an \Array or \CSV::Row: + # CSV.generate do |csv| + # # Raises NoMethodError (undefined method `collect' for :foo:Symbol) + # csv << :foo + # end + # + # Raises an exception if the output stream is not opened for writing: + # path = 't.csv' + # File.write(path, '') + # File.open(path) do |file| + # CSV.open(file) do |csv| + # # Raises IOError (not opened for writing) + # csv << ['foo', 0] + # end + # end + def <<(row) + writer << row + self + end + alias_method :add_row, :<< + alias_method :puts, :<< + + # :call-seq: + # convert(converter_name) -> array_of_procs + # convert {|field, field_info| ... } -> array_of_procs + # + # - With no block, installs a field converter (a \Proc). + # - With a block, defines and installs a custom field converter. + # - Returns the \Array of installed field converters. + # + # - Argument +converter_name+, if given, should be the name + # of an existing field converter. + # + # See {Field Converters}[#class-CSV-label-Field+Converters]. + # --- + # + # With no block, installs a field converter: + # csv = CSV.new('') + # csv.convert(:integer) + # csv.convert(:float) + # csv.convert(:date) + # csv.converters # => [:integer, :float, :date] + # + # --- + # + # The block, if given, is called for each field: + # - Argument +field+ is the field value. + # - Argument +field_info+ is a CSV::FieldInfo object + # containing details about the field. + # + # The examples here assume the prior execution of: + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # + # Example giving a block: + # csv = CSV.open(path) + # csv.convert {|field, field_info| p [field, field_info]; field.upcase } + # csv.read # => [["FOO", "0"], ["BAR", "1"], ["BAZ", "2"]] + # + # Output: + # ["foo", #] + # ["0", #] + # ["bar", #] + # ["1", #] + # ["baz", #] + # ["2", #] + # + # The block need not return a \String object: + # csv = CSV.open(path) + # csv.convert {|field, field_info| field.to_sym } + # csv.read # => [[:foo, :"0"], [:bar, :"1"], [:baz, :"2"]] + # + # If +converter_name+ is given, the block is not called: + # csv = CSV.open(path) + # csv.convert(:integer) {|field, field_info| fail 'Cannot happen' } + # csv.read # => [["foo", 0], ["bar", 1], ["baz", 2]] + # + # --- + # + # Raises a parse-time exception if +converter_name+ is not the name of a built-in + # field converter: + # csv = CSV.open(path) + # csv.convert(:nosuch) => [nil] + # # Raises NoMethodError (undefined method `arity' for nil:NilClass) + # csv.read + def convert(name = nil, &converter) + parser_fields_converter.add_converter(name, &converter) + end + + # :call-seq: + # header_convert(converter_name) -> array_of_procs + # header_convert {|header, field_info| ... } -> array_of_procs + # + # - With no block, installs a header converter (a \Proc). + # - With a block, defines and installs a custom header converter. + # - Returns the \Array of installed header converters. + # + # - Argument +converter_name+, if given, should be the name + # of an existing header converter. + # + # See {Header Converters}[#class-CSV-label-Header+Converters]. + # --- + # + # With no block, installs a header converter: + # csv = CSV.new('') + # csv.header_convert(:symbol) + # csv.header_convert(:downcase) + # csv.header_converters # => [:symbol, :downcase] + # + # --- + # + # The block, if given, is called for each header: + # - Argument +header+ is the header value. + # - Argument +field_info+ is a CSV::FieldInfo object + # containing details about the header. + # + # The examples here assume the prior execution of: + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # + # Example giving a block: + # csv = CSV.open(path, headers: true) + # csv.header_convert {|header, field_info| p [header, field_info]; header.upcase } + # table = csv.read + # table # => # + # table.headers # => ["NAME", "VALUE"] + # + # Output: + # ["Name", #] + # ["Value", #] + + # The block need not return a \String object: + # csv = CSV.open(path, headers: true) + # csv.header_convert {|header, field_info| header.to_sym } + # table = csv.read + # table.headers # => [:Name, :Value] + # + # If +converter_name+ is given, the block is not called: + # csv = CSV.open(path, headers: true) + # csv.header_convert(:downcase) {|header, field_info| fail 'Cannot happen' } + # table = csv.read + # table.headers # => ["name", "value"] + # --- + # + # Raises a parse-time exception if +converter_name+ is not the name of a built-in + # field converter: + # csv = CSV.open(path, headers: true) + # csv.header_convert(:nosuch) + # # Raises NoMethodError (undefined method `arity' for nil:NilClass) + # csv.read + def header_convert(name = nil, &converter) + header_fields_converter.add_converter(name, &converter) + end + + include Enumerable + + # :call-seq: + # csv.each -> enumerator + # csv.each {|row| ...} + # + # Calls the block with each successive row. + # The data source must be opened for reading. + # + # Without headers: + # string = "foo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string) + # csv.each do |row| + # p row + # end + # Output: + # ["foo", "0"] + # ["bar", "1"] + # ["baz", "2"] + # + # With headers: + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string, headers: true) + # csv.each do |row| + # p row + # end + # Output: + # + # + # + # + # --- + # + # Raises an exception if the source is not opened for reading: + # string = "foo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string) + # csv.close + # # Raises IOError (not opened for reading) + # csv.each do |row| + # p row + # end + def each(&block) + return to_enum(__method__) unless block_given? + begin + while true + yield(parser_enumerator.next) + end + rescue StopIteration + end + end + + # :call-seq: + # csv.read -> array or csv_table + # + # Forms the remaining rows from +self+ into: + # - A CSV::Table object, if headers are in use. + # - An \Array of Arrays, otherwise. + # + # The data source must be opened for reading. + # + # Without headers: + # string = "foo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # csv = CSV.open(path) + # csv.read # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] + # + # With headers: + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # path = 't.csv' + # File.write(path, string) + # csv = CSV.open(path, headers: true) + # csv.read # => # + # + # --- + # + # Raises an exception if the source is not opened for reading: + # string = "foo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string) + # csv.close + # # Raises IOError (not opened for reading) + # csv.read + def read + rows = to_a + if parser.use_headers? + Table.new(rows, headers: parser.headers) + else + rows + end + end + alias_method :readlines, :read + + # :call-seq: + # csv.header_row? -> true or false + # + # Returns +true+ if the next row to be read is a header row\; + # +false+ otherwise. + # + # Without headers: + # string = "foo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string) + # csv.header_row? # => false + # + # With headers: + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string, headers: true) + # csv.header_row? # => true + # csv.shift # => # + # csv.header_row? # => false + # + # --- + # + # Raises an exception if the source is not opened for reading: + # string = "foo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string) + # csv.close + # # Raises IOError (not opened for reading) + # csv.header_row? + def header_row? + parser.header_row? + end + + # :call-seq: + # csv.shift -> array, csv_row, or nil + # + # Returns the next row of data as: + # - An \Array if no headers are used. + # - A CSV::Row object if headers are used. + # + # The data source must be opened for reading. + # + # Without headers: + # string = "foo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string) + # csv.shift # => ["foo", "0"] + # csv.shift # => ["bar", "1"] + # csv.shift # => ["baz", "2"] + # csv.shift # => nil + # + # With headers: + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string, headers: true) + # csv.shift # => # + # csv.shift # => # + # csv.shift # => # + # csv.shift # => nil + # + # --- + # + # Raises an exception if the source is not opened for reading: + # string = "foo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string) + # csv.close + # # Raises IOError (not opened for reading) + # csv.shift + def shift + if @eof_error + eof_error, @eof_error = @eof_error, nil + raise eof_error + end + begin + parser_enumerator.next + rescue StopIteration + nil + end + end + alias_method :gets, :shift + alias_method :readline, :shift + + # :call-seq: + # csv.inspect -> string + # + # Returns a \String showing certain properties of +self+: + # string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # csv = CSV.new(string, headers: true) + # s = csv.inspect + # s # => "#" + def inspect + str = ["#<", self.class.to_s, " io_type:"] + # show type of wrapped IO + if @io == $stdout then str << "$stdout" + elsif @io == $stdin then str << "$stdin" + elsif @io == $stderr then str << "$stderr" + else str << @io.class.to_s + end + # show IO.path(), if available + if @io.respond_to?(:path) and (p = @io.path) + str << " io_path:" << p.inspect + end + # show encoding + str << " encoding:" << @encoding.name + # show other attributes + ["lineno", "col_sep", "row_sep", "quote_char"].each do |attr_name| + if a = __send__(attr_name) + str << " " << attr_name << ":" << a.inspect + end + end + ["skip_blanks", "liberal_parsing"].each do |attr_name| + if a = __send__("#{attr_name}?") + str << " " << attr_name << ":" << a.inspect + end + end + _headers = headers + str << " headers:" << _headers.inspect if _headers + str << ">" + begin + str.join('') + rescue # any encoding error + str.map do |s| + e = Encoding::Converter.asciicompat_encoding(s.encoding) + e ? s.encode(e) : s.force_encoding("ASCII-8BIT") + end.join('') + end + end + + private + + def determine_encoding(encoding, internal_encoding) + # honor the IO encoding if we can, otherwise default to ASCII-8BIT + io_encoding = raw_encoding + return io_encoding if io_encoding + + return Encoding.find(internal_encoding) if internal_encoding + + if encoding + encoding, = encoding.split(":", 2) if encoding.is_a?(String) + return Encoding.find(encoding) + end + + Encoding.default_internal || Encoding.default_external + end + + def normalize_converters(converters) + converters ||= [] + unless converters.is_a?(Array) + converters = [converters] + end + converters.collect do |converter| + case converter + when Proc # custom code block + [nil, converter] + else # by name + [converter, nil] + end + end + end + + # + # Processes +fields+ with @converters, or @header_converters + # if +headers+ is passed as +true+, returning the converted field set. Any + # converter that changes the field into something other than a String halts + # the pipeline of conversion for that field. This is primarily an efficiency + # shortcut. + # + def convert_fields(fields, headers = false) + if headers + header_fields_converter.convert(fields, nil, 0) + else + parser_fields_converter.convert(fields, @headers, lineno) + end + end + + # + # Returns the encoding of the internal IO object. + # + def raw_encoding + if @io.respond_to? :internal_encoding + @io.internal_encoding || @io.external_encoding + elsif @io.respond_to? :encoding + @io.encoding + else + nil + end + end + + def parser_fields_converter + @parser_fields_converter ||= build_parser_fields_converter + end + + def build_parser_fields_converter + specific_options = { + builtin_converters_name: :Converters, + } + options = @base_fields_converter_options.merge(specific_options) + build_fields_converter(@initial_converters, options) + end + + def header_fields_converter + @header_fields_converter ||= build_header_fields_converter + end + + def build_header_fields_converter + specific_options = { + builtin_converters_name: :HeaderConverters, + accept_nil: true, + } + options = @base_fields_converter_options.merge(specific_options) + build_fields_converter(@initial_header_converters, options) + end + + def writer_fields_converter + @writer_fields_converter ||= build_writer_fields_converter + end + + def build_writer_fields_converter + build_fields_converter(@initial_write_converters, + @write_fields_converter_options) + end + + def build_fields_converter(initial_converters, options) + fields_converter = FieldsConverter.new(options) + normalize_converters(initial_converters).each do |name, converter| + fields_converter.add_converter(name, &converter) + end + fields_converter + end + + def parser + @parser ||= Parser.new(@io, parser_options) + end + + def parser_options + @parser_options.merge(header_fields_converter: header_fields_converter, + fields_converter: parser_fields_converter) + end + + def parser_enumerator + @parser_enumerator ||= parser.parse + end + + def writer + @writer ||= Writer.new(@io, writer_options) + end + + def writer_options + @writer_options.merge(header_fields_converter: header_fields_converter, + fields_converter: writer_fields_converter) + end +end + +# Passes +args+ to CSV::instance. +# +# CSV("CSV,data").read +# #=> [["CSV", "data"]] +# +# If a block is given, the instance is passed the block and the return value +# becomes the return value of the block. +# +# CSV("CSV,data") { |c| +# c.read.any? { |a| a.include?("data") } +# } #=> true +# +# CSV("CSV,data") { |c| +# c.read.any? { |a| a.include?("zombies") } +# } #=> false +# +# CSV options may also be given. +# +# io = StringIO.new +# CSV(io, col_sep: ";") { |csv| csv << ["a", "b", "c"] } +# +# This API is not Ractor-safe. +# +def CSV(*args, **options, &block) + CSV.instance(*args, **options, &block) +end + +require_relative "csv/version" +require_relative "csv/core_ext/array" +require_relative "csv/core_ext/string" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/core_ext/array.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/core_ext/array.rb new file mode 100644 index 000000000..ad1b881b4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/core_ext/array.rb @@ -0,0 +1,9 @@ +class Array + # Equivalent to CSV::generate_line(self, options) + # + # ["CSV", "data"].to_csv + # #=> "CSV,data\n" + def to_csv(**options) + CSV.generate_line(self, **options) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/core_ext/string.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/core_ext/string.rb new file mode 100644 index 000000000..61286d0f6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/core_ext/string.rb @@ -0,0 +1,9 @@ +class String + # Equivalent to CSV::parse_line(self, options) + # + # "CSV,data".parse_csv + # #=> ["CSV", "data"] + def parse_csv(**options) + CSV.parse_line(self, **options) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/fields_converter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/fields_converter.rb new file mode 100644 index 000000000..8ea13408c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/fields_converter.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +class CSV + # Note: Don't use this class directly. This is an internal class. + class FieldsConverter + include Enumerable + + NO_QUOTED_FIELDS = [] # :nodoc: + def NO_QUOTED_FIELDS.[](_index) + false + end + NO_QUOTED_FIELDS.freeze + + # + # A CSV::FieldsConverter is a data structure for storing the + # fields converter properties to be passed as a parameter + # when parsing a new file (e.g. CSV::Parser.new(@io, parser_options)) + # + + def initialize(options={}) + @converters = [] + @nil_value = options[:nil_value] + @empty_value = options[:empty_value] + @empty_value_is_empty_string = (@empty_value == "") + @accept_nil = options[:accept_nil] + @builtin_converters_name = options[:builtin_converters_name] + @need_static_convert = need_static_convert? + end + + def add_converter(name=nil, &converter) + if name.nil? # custom converter + @converters << converter + else # named converter + combo = builtin_converters[name] + case combo + when Array # combo converter + combo.each do |sub_name| + add_converter(sub_name) + end + else # individual named converter + @converters << combo + end + end + end + + def each(&block) + @converters.each(&block) + end + + def empty? + @converters.empty? + end + + def convert(fields, headers, lineno, quoted_fields=NO_QUOTED_FIELDS) + return fields unless need_convert? + + fields.collect.with_index do |field, index| + if field.nil? + field = @nil_value + elsif field.is_a?(String) and field.empty? + field = @empty_value unless @empty_value_is_empty_string + end + @converters.each do |converter| + break if field.nil? and @accept_nil + if converter.arity == 1 # straight field converter + field = converter[field] + else # FieldInfo converter + if headers + header = headers[index] + else + header = nil + end + quoted = quoted_fields[index] + field = converter[field, FieldInfo.new(index, lineno, header, quoted)] + end + break unless field.is_a?(String) # short-circuit pipeline for speed + end + field # final state of each field, converted or original + end + end + + private + def need_static_convert? + not (@nil_value.nil? and @empty_value_is_empty_string) + end + + def need_convert? + @need_static_convert or + (not @converters.empty?) + end + + def builtin_converters + @builtin_converters ||= ::CSV.const_get(@builtin_converters_name) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/input_record_separator.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/input_record_separator.rb new file mode 100644 index 000000000..7a99343c0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/input_record_separator.rb @@ -0,0 +1,18 @@ +require "English" +require "stringio" + +class CSV + module InputRecordSeparator + class << self + if RUBY_VERSION >= "3.0.0" + def value + "\n" + end + else + def value + $INPUT_RECORD_SEPARATOR + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/parser.rb new file mode 100644 index 000000000..4a74e40d1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/parser.rb @@ -0,0 +1,1302 @@ +# frozen_string_literal: true + +require "strscan" + +require_relative "input_record_separator" +require_relative "row" +require_relative "table" + +class CSV + # Note: Don't use this class directly. This is an internal class. + class Parser + # + # A CSV::Parser is m17n aware. The parser works in the Encoding of the IO + # or String object being read from or written to. Your data is never transcoded + # (unless you ask Ruby to transcode it for you) and will literally be parsed in + # the Encoding it is in. Thus CSV will return Arrays or Rows of Strings in the + # Encoding of your data. This is accomplished by transcoding the parser itself + # into your Encoding. + # + + class << self + ARGF_OBJECT_ID = ARGF.object_id + # Convenient method to check whether the give input reached EOF + # or not. + def eof?(input) + # We can't use input != ARGF in Ractor. Because ARGF isn't a + # shareable object. + input.object_id != ARGF_OBJECT_ID and + input.respond_to?(:eof) and + input.eof? + end + end + + # Raised when encoding is invalid. + class InvalidEncoding < StandardError + end + + # Raised when unexpected case is happen. + class UnexpectedError < StandardError + end + + # + # CSV::Scanner receives a CSV output, scans it and return the content. + # It also controls the life cycle of the object with its methods +keep_start+, + # +keep_end+, +keep_back+, +keep_drop+. + # + # Uses StringScanner (the official strscan gem). Strscan provides lexical + # scanning operations on a String. We inherit its object and take advantage + # on the methods. For more information, please visit: + # https://docs.ruby-lang.org/en/master/StringScanner.html + # + class Scanner < StringScanner + alias_method :scan_all, :scan + + def initialize(*args) + super + @keeps = [] + end + + def each_line(row_separator) + position = pos + rest.each_line(row_separator) do |line| + position += line.bytesize + self.pos = position + yield(line) + end + end + + def keep_start + @keeps.push(pos) + end + + def keep_end + start = @keeps.pop + string.byteslice(start, pos - start) + end + + def keep_back + self.pos = @keeps.pop + end + + def keep_drop + @keeps.pop + end + end + + # + # CSV::InputsScanner receives IO inputs, encoding and the chunk_size. + # It also controls the life cycle of the object with its methods +keep_start+, + # +keep_end+, +keep_back+, +keep_drop+. + # + # CSV::InputsScanner.scan() tries to match with pattern at the current position. + # If there's a match, the scanner advances the "scan pointer" and returns the matched string. + # Otherwise, the scanner returns nil. + # + # CSV::InputsScanner.rest() returns the "rest" of the string (i.e. everything after the scan pointer). + # If there is no more data (eos? = true), it returns "". + # + class InputsScanner + def initialize(inputs, encoding, row_separator, chunk_size: 8192) + @inputs = inputs.dup + @encoding = encoding + @row_separator = row_separator + @chunk_size = chunk_size + @last_scanner = @inputs.empty? + @keeps = [] + read_chunk + end + + def each_line(row_separator) + return enum_for(__method__, row_separator) unless block_given? + buffer = nil + input = @scanner.rest + position = @scanner.pos + offset = 0 + n_row_separator_chars = row_separator.size + # trace(__method__, :start, input) + while true + input.each_line(row_separator) do |line| + @scanner.pos += line.bytesize + if buffer + if n_row_separator_chars == 2 and + buffer.end_with?(row_separator[0]) and + line.start_with?(row_separator[1]) + buffer << line[0] + line = line[1..-1] + position += buffer.bytesize + offset + @scanner.pos = position + offset = 0 + yield(buffer) + buffer = nil + next if line.empty? + else + buffer << line + line = buffer + buffer = nil + end + end + if line.end_with?(row_separator) + position += line.bytesize + offset + @scanner.pos = position + offset = 0 + yield(line) + else + buffer = line + end + end + break unless read_chunk + input = @scanner.rest + position = @scanner.pos + offset = -buffer.bytesize if buffer + end + yield(buffer) if buffer + end + + def scan(pattern) + # trace(__method__, pattern, :start) + value = @scanner.scan(pattern) + # trace(__method__, pattern, :done, :last, value) if @last_scanner + return value if @last_scanner + + read_chunk if value and @scanner.eos? + # trace(__method__, pattern, :done, value) + value + end + + def scan_all(pattern) + # trace(__method__, pattern, :start) + value = @scanner.scan(pattern) + # trace(__method__, pattern, :done, :last, value) if @last_scanner + return value if @last_scanner + + # trace(__method__, pattern, :done, :nil) if value.nil? + return nil if value.nil? + while @scanner.eos? and read_chunk and (sub_value = @scanner.scan(pattern)) + # trace(__method__, pattern, :sub, sub_value) + value << sub_value + end + # trace(__method__, pattern, :done, value) + value + end + + def eos? + @scanner.eos? + end + + def keep_start + # trace(__method__, :start) + adjust_last_keep + @keeps.push([@scanner, @scanner.pos, nil]) + # trace(__method__, :done) + end + + def keep_end + # trace(__method__, :start) + scanner, start, buffer = @keeps.pop + if scanner == @scanner + keep = @scanner.string.byteslice(start, @scanner.pos - start) + else + keep = @scanner.string.byteslice(0, @scanner.pos) + end + if buffer + buffer << keep + keep = buffer + end + # trace(__method__, :done, keep) + keep + end + + def keep_back + # trace(__method__, :start) + scanner, start, buffer = @keeps.pop + if buffer + # trace(__method__, :rescan, start, buffer) + string = @scanner.string + if scanner == @scanner + keep = string.byteslice(start, + string.bytesize - @scanner.pos - start) + else + keep = string + end + if keep and not keep.empty? + @inputs.unshift(StringIO.new(keep)) + @last_scanner = false + end + @scanner = StringScanner.new(buffer) + else + if @scanner != scanner + message = "scanners are different but no buffer: " + message += "#{@scanner.inspect}(#{@scanner.object_id}): " + message += "#{scanner.inspect}(#{scanner.object_id})" + raise UnexpectedError, message + end + # trace(__method__, :repos, start, buffer) + @scanner.pos = start + last_scanner, last_start, last_buffer = @keeps.last + # Drop the last buffer when the last buffer is the same data + # in the last keep. If we keep it, we have duplicated data + # by the next keep_back. + if last_scanner == @scanner and + last_buffer and + last_buffer == last_scanner.string.byteslice(last_start, start) + @keeps.last[2] = nil + end + end + read_chunk if @scanner.eos? + end + + def keep_drop + _, _, buffer = @keeps.pop + # trace(__method__, :done, :empty) unless buffer + return unless buffer + + last_keep = @keeps.last + # trace(__method__, :done, :no_last_keep) unless last_keep + return unless last_keep + + if last_keep[2] + last_keep[2] << buffer + else + last_keep[2] = buffer + end + # trace(__method__, :done) + end + + def rest + @scanner.rest + end + + def check(pattern) + @scanner.check(pattern) + end + + private + def trace(*args) + pp([*args, @scanner, @scanner&.string, @scanner&.pos, @keeps]) + end + + def adjust_last_keep + # trace(__method__, :start) + + keep = @keeps.last + # trace(__method__, :done, :empty) if keep.nil? + return if keep.nil? + + scanner, start, buffer = keep + string = @scanner.string + if @scanner != scanner + start = 0 + end + if start == 0 and @scanner.eos? + keep_data = string + else + keep_data = string.byteslice(start, @scanner.pos - start) + end + if keep_data + if buffer + buffer << keep_data + else + keep[2] = keep_data.dup + end + end + + # trace(__method__, :done) + end + + def read_chunk + return false if @last_scanner + + adjust_last_keep + + input = @inputs.first + case input + when StringIO + string = input.read + raise InvalidEncoding unless string.valid_encoding? + # trace(__method__, :stringio, string) + @scanner = StringScanner.new(string) + @inputs.shift + @last_scanner = @inputs.empty? + true + else + chunk = input.gets(@row_separator, @chunk_size) + if chunk + raise InvalidEncoding unless chunk.valid_encoding? + # trace(__method__, :chunk, chunk) + @scanner = StringScanner.new(chunk) + if Parser.eof?(input) + @inputs.shift + @last_scanner = @inputs.empty? + end + true + else + # trace(__method__, :no_chunk) + @scanner = StringScanner.new("".encode(@encoding)) + @inputs.shift + @last_scanner = @inputs.empty? + if @last_scanner + false + else + read_chunk + end + end + end + end + end + + def initialize(input, options) + @input = input + @options = options + @samples = [] + + prepare + end + + def column_separator + @column_separator + end + + def row_separator + @row_separator + end + + def quote_character + @quote_character + end + + def field_size_limit + @max_field_size&.succ + end + + def max_field_size + @max_field_size + end + + def skip_lines + @skip_lines + end + + def unconverted_fields? + @unconverted_fields + end + + def headers + @headers + end + + def header_row? + @use_headers and @headers.nil? + end + + def return_headers? + @return_headers + end + + def skip_blanks? + @skip_blanks + end + + def liberal_parsing? + @liberal_parsing + end + + def lineno + @lineno + end + + def line + last_line + end + + def parse(&block) + return to_enum(__method__) unless block_given? + + if @return_headers and @headers and @raw_headers + headers = Row.new(@headers, @raw_headers, true) + if @unconverted_fields + headers = add_unconverted_fields(headers, []) + end + yield headers + end + + begin + @scanner ||= build_scanner + __send__(@parse_method, &block) + rescue InvalidEncoding + if @scanner + ignore_broken_line + lineno = @lineno + else + lineno = @lineno + 1 + end + raise InvalidEncodingError.new(@encoding, lineno) + rescue UnexpectedError => error + if @scanner + ignore_broken_line + lineno = @lineno + else + lineno = @lineno + 1 + end + message = "This should not be happen: #{error.message}: " + message += "Please report this to https://github.com/ruby/csv/issues" + raise MalformedCSVError.new(message, lineno) + end + end + + def use_headers? + @use_headers + end + + private + # A set of tasks to prepare the file in order to parse it + def prepare + prepare_variable + prepare_quote_character + prepare_backslash + prepare_skip_lines + prepare_strip + prepare_separators + validate_strip_and_col_sep_options + prepare_quoted + prepare_unquoted + prepare_line + prepare_header + prepare_parser + end + + def prepare_variable + @encoding = @options[:encoding] + liberal_parsing = @options[:liberal_parsing] + if liberal_parsing + @liberal_parsing = true + if liberal_parsing.is_a?(Hash) + @double_quote_outside_quote = + liberal_parsing[:double_quote_outside_quote] + @backslash_quote = liberal_parsing[:backslash_quote] + else + @double_quote_outside_quote = false + @backslash_quote = false + end + else + @liberal_parsing = false + @backslash_quote = false + end + @unconverted_fields = @options[:unconverted_fields] + @max_field_size = @options[:max_field_size] + @skip_blanks = @options[:skip_blanks] + @fields_converter = @options[:fields_converter] + @header_fields_converter = @options[:header_fields_converter] + end + + def prepare_quote_character + @quote_character = @options[:quote_character] + if @quote_character.nil? + @escaped_quote_character = nil + @escaped_quote = nil + else + @quote_character = @quote_character.to_s.encode(@encoding) + if @quote_character.length != 1 + message = ":quote_char has to be nil or a single character String" + raise ArgumentError, message + end + @escaped_quote_character = Regexp.escape(@quote_character) + @escaped_quote = Regexp.new(@escaped_quote_character) + end + end + + def prepare_backslash + return unless @backslash_quote + + @backslash_character = "\\".encode(@encoding) + + @escaped_backslash_character = Regexp.escape(@backslash_character) + @escaped_backslash = Regexp.new(@escaped_backslash_character) + if @quote_character.nil? + @backslash_quote_character = nil + else + @backslash_quote_character = + @backslash_character + @escaped_quote_character + end + end + + def prepare_skip_lines + skip_lines = @options[:skip_lines] + case skip_lines + when String + @skip_lines = skip_lines.encode(@encoding) + when Regexp, nil + @skip_lines = skip_lines + else + unless skip_lines.respond_to?(:match) + message = + ":skip_lines has to respond to \#match: #{skip_lines.inspect}" + raise ArgumentError, message + end + @skip_lines = skip_lines + end + end + + def prepare_strip + @strip = @options[:strip] + @escaped_strip = nil + @strip_value = nil + @rstrip_value = nil + if @strip.is_a?(String) + case @strip.length + when 0 + raise ArgumentError, ":strip must not be an empty String" + when 1 + # ok + else + raise ArgumentError, ":strip doesn't support 2 or more characters yet" + end + @strip = @strip.encode(@encoding) + @escaped_strip = Regexp.escape(@strip) + if @quote_character + @strip_value = Regexp.new(@escaped_strip + + "+".encode(@encoding)) + @rstrip_value = Regexp.new(@escaped_strip + + "+\\z".encode(@encoding)) + end + elsif @strip + strip_values = " \t\f\v" + @escaped_strip = strip_values.encode(@encoding) + if @quote_character + @strip_value = Regexp.new("[#{strip_values}]+".encode(@encoding)) + @rstrip_value = Regexp.new("[#{strip_values}]+\\z".encode(@encoding)) + end + end + end + + begin + StringScanner.new("x").scan("x") + rescue TypeError + STRING_SCANNER_SCAN_ACCEPT_STRING = false + else + STRING_SCANNER_SCAN_ACCEPT_STRING = true + end + + def prepare_separators + column_separator = @options[:column_separator] + @column_separator = column_separator.to_s.encode(@encoding) + if @column_separator.size < 1 + message = ":col_sep must be 1 or more characters: " + message += column_separator.inspect + raise ArgumentError, message + end + @row_separator = + resolve_row_separator(@options[:row_separator]).encode(@encoding) + + @escaped_column_separator = Regexp.escape(@column_separator) + @escaped_first_column_separator = Regexp.escape(@column_separator[0]) + if @column_separator.size > 1 + @column_end = Regexp.new(@escaped_column_separator) + @column_ends = @column_separator.each_char.collect do |char| + Regexp.new(Regexp.escape(char)) + end + @first_column_separators = Regexp.new(@escaped_first_column_separator + + "+".encode(@encoding)) + else + if STRING_SCANNER_SCAN_ACCEPT_STRING + @column_end = @column_separator + else + @column_end = Regexp.new(@escaped_column_separator) + end + @column_ends = nil + @first_column_separators = nil + end + + escaped_row_separator = Regexp.escape(@row_separator) + @row_end = Regexp.new(escaped_row_separator) + if @row_separator.size > 1 + @row_ends = @row_separator.each_char.collect do |char| + Regexp.new(Regexp.escape(char)) + end + else + @row_ends = nil + end + + @cr = "\r".encode(@encoding) + @lf = "\n".encode(@encoding) + @line_end = Regexp.new("\r\n|\n|\r".encode(@encoding)) + @not_line_end = Regexp.new("[^\r\n]+".encode(@encoding)) + end + + # This method verifies that there are no (obvious) ambiguities with the + # provided +col_sep+ and +strip+ parsing options. For example, if +col_sep+ + # and +strip+ were both equal to +\t+, then there would be no clear way to + # parse the input. + def validate_strip_and_col_sep_options + return unless @strip + + if @strip.is_a?(String) + if @column_separator.start_with?(@strip) || @column_separator.end_with?(@strip) + raise ArgumentError, + "The provided strip (#{@escaped_strip}) and " \ + "col_sep (#{@escaped_column_separator}) options are incompatible." + end + else + if Regexp.new("\\A[#{@escaped_strip}]|[#{@escaped_strip}]\\z").match?(@column_separator) + raise ArgumentError, + "The provided strip (true) and " \ + "col_sep (#{@escaped_column_separator}) options are incompatible." + end + end + end + + def prepare_quoted + if @quote_character + @quotes = Regexp.new(@escaped_quote_character + + "+".encode(@encoding)) + no_quoted_values = @escaped_quote_character.dup + if @backslash_quote + no_quoted_values << @escaped_backslash_character + end + @quoted_value = Regexp.new("[^".encode(@encoding) + + no_quoted_values + + "]+".encode(@encoding)) + end + if @escaped_strip + @split_column_separator = Regexp.new(@escaped_strip + + "*".encode(@encoding) + + @escaped_column_separator + + @escaped_strip + + "*".encode(@encoding)) + else + if @column_separator == " ".encode(@encoding) + @split_column_separator = Regexp.new(@escaped_column_separator) + else + @split_column_separator = @column_separator + end + end + end + + def prepare_unquoted + return if @quote_character.nil? + + no_unquoted_values = "\r\n".encode(@encoding) + no_unquoted_values << @escaped_first_column_separator + unless @liberal_parsing + no_unquoted_values << @escaped_quote_character + end + @unquoted_value = Regexp.new("[^".encode(@encoding) + + no_unquoted_values + + "]+".encode(@encoding)) + end + + def resolve_row_separator(separator) + if separator == :auto + cr = "\r".encode(@encoding) + lf = "\n".encode(@encoding) + if @input.is_a?(StringIO) + pos = @input.pos + separator = detect_row_separator(@input.read, cr, lf) + @input.seek(pos) + elsif @input.respond_to?(:gets) + if @input.is_a?(File) + chunk_size = 32 * 1024 + else + chunk_size = 1024 + end + begin + while separator == :auto + # + # if we run out of data, it's probably a single line + # (ensure will set default value) + # + break unless sample = @input.gets(nil, chunk_size) + + # extend sample if we're unsure of the line ending + if sample.end_with?(cr) + sample << (@input.gets(nil, 1) || "") + end + + @samples << sample + + separator = detect_row_separator(sample, cr, lf) + end + rescue IOError + # do nothing: ensure will set default + end + end + separator = InputRecordSeparator.value if separator == :auto + end + separator.to_s.encode(@encoding) + end + + def detect_row_separator(sample, cr, lf) + lf_index = sample.index(lf) + if lf_index + cr_index = sample[0, lf_index].index(cr) + else + cr_index = sample.index(cr) + end + if cr_index and lf_index + if cr_index + 1 == lf_index + cr + lf + elsif cr_index < lf_index + cr + else + lf + end + elsif cr_index + cr + elsif lf_index + lf + else + :auto + end + end + + def prepare_line + @lineno = 0 + @last_line = nil + @scanner = nil + end + + def last_line + if @scanner + @last_line ||= @scanner.keep_end + else + @last_line + end + end + + def prepare_header + @return_headers = @options[:return_headers] + + headers = @options[:headers] + case headers + when Array + @raw_headers = headers + quoted_fields = FieldsConverter::NO_QUOTED_FIELDS + @use_headers = true + when String + @raw_headers, quoted_fields = parse_headers(headers) + @use_headers = true + when nil, false + @raw_headers = nil + @use_headers = false + else + @raw_headers = nil + @use_headers = true + end + if @raw_headers + @headers = adjust_headers(@raw_headers, quoted_fields) + else + @headers = nil + end + end + + def parse_headers(row) + quoted_fields = [] + converter = lambda do |field, info| + quoted_fields << info.quoted? + field + end + headers = CSV.parse_line(row, + col_sep: @column_separator, + row_sep: @row_separator, + quote_char: @quote_character, + converters: [converter]) + [headers, quoted_fields] + end + + def adjust_headers(headers, quoted_fields) + adjusted_headers = @header_fields_converter.convert(headers, nil, @lineno, quoted_fields) + adjusted_headers.each {|h| h.freeze if h.is_a? String} + adjusted_headers + end + + def prepare_parser + @may_quoted = may_quoted? + if @quote_character.nil? + @parse_method = :parse_no_quote + elsif @liberal_parsing or @strip + @parse_method = :parse_quotable_robust + else + @parse_method = :parse_quotable_loose + end + end + + def may_quoted? + return false if @quote_character.nil? + + if @input.is_a?(StringIO) + pos = @input.pos + sample = @input.read + @input.seek(pos) + else + return false if @samples.empty? + sample = @samples.first + end + sample[0, 128].index(@quote_character) + end + + class UnoptimizedStringIO # :nodoc: + def initialize(string) + @io = StringIO.new(string, "rb:#{string.encoding}") + end + + def gets(*args) + @io.gets(*args) + end + + def each_line(*args, &block) + @io.each_line(*args, &block) + end + + def eof? + @io.eof? + end + end + + SCANNER_TEST = (ENV["CSV_PARSER_SCANNER_TEST"] == "yes") + if SCANNER_TEST + SCANNER_TEST_CHUNK_SIZE_NAME = "CSV_PARSER_SCANNER_TEST_CHUNK_SIZE" + SCANNER_TEST_CHUNK_SIZE_VALUE = ENV[SCANNER_TEST_CHUNK_SIZE_NAME] + def build_scanner + inputs = @samples.collect do |sample| + UnoptimizedStringIO.new(sample) + end + if @input.is_a?(StringIO) + inputs << UnoptimizedStringIO.new(@input.read) + else + inputs << @input + end + begin + chunk_size_value = ENV[SCANNER_TEST_CHUNK_SIZE_NAME] + rescue # Ractor::IsolationError + # Ractor on Ruby 3.0 can't read ENV value. + chunk_size_value = SCANNER_TEST_CHUNK_SIZE_VALUE + end + chunk_size = Integer((chunk_size_value || "1"), 10) + InputsScanner.new(inputs, + @encoding, + @row_separator, + chunk_size: chunk_size) + end + else + def build_scanner + string = nil + if @samples.empty? and @input.is_a?(StringIO) + string = @input.read + elsif @samples.size == 1 and Parser.eof?(@input) + string = @samples[0] + end + if string + unless string.valid_encoding? + index = string.lines(@row_separator).index do |line| + !line.valid_encoding? + end + if index + raise InvalidEncodingError.new(@encoding, @lineno + index + 1) + end + end + Scanner.new(string) + else + inputs = @samples.collect do |sample| + StringIO.new(sample) + end + inputs << @input + InputsScanner.new(inputs, @encoding, @row_separator) + end + end + end + + def skip_needless_lines + return unless @skip_lines + + until @scanner.eos? + @scanner.keep_start + line = @scanner.scan_all(@not_line_end) || "".encode(@encoding) + line << @row_separator if parse_row_end + if skip_line?(line) + @lineno += 1 + @scanner.keep_drop + else + @scanner.keep_back + return + end + end + end + + def skip_line?(line) + line = line.delete_suffix(@row_separator) + case @skip_lines + when String + line.include?(@skip_lines) + when Regexp + @skip_lines.match?(line) + else + @skip_lines.match(line) + end + end + + def validate_field_size(field) + return unless @max_field_size + return if field.size <= @max_field_size + ignore_broken_line + message = "Field size exceeded: #{field.size} > #{@max_field_size}" + raise MalformedCSVError.new(message, @lineno) + end + + def parse_no_quote(&block) + @scanner.each_line(@row_separator) do |line| + next if @skip_lines and skip_line?(line) + original_line = line + line = line.delete_suffix(@row_separator) + + if line.empty? + next if @skip_blanks + row = [] + else + line = strip_value(line) + row = line.split(@split_column_separator, -1) + if @max_field_size + row.each do |column| + validate_field_size(column) + end + end + n_columns = row.size + i = 0 + while i < n_columns + row[i] = nil if row[i].empty? + i += 1 + end + end + @last_line = original_line + emit_row(row, &block) + end + end + + def parse_quotable_loose(&block) + @scanner.keep_start + @scanner.each_line(@row_separator) do |line| + if @skip_lines and skip_line?(line) + @scanner.keep_drop + @scanner.keep_start + next + end + original_line = line + line = line.delete_suffix(@row_separator) + + if line.empty? + if @skip_blanks + @scanner.keep_drop + @scanner.keep_start + next + end + row = [] + quoted_fields = FieldsConverter::NO_QUOTED_FIELDS + elsif line.include?(@cr) or line.include?(@lf) + @scanner.keep_back + @parse_method = :parse_quotable_robust + return parse_quotable_robust(&block) + else + row = line.split(@split_column_separator, -1) + quoted_fields = [] + n_columns = row.size + i = 0 + while i < n_columns + column = row[i] + if column.empty? + quoted_fields << false + row[i] = nil + else + n_quotes = column.count(@quote_character) + if n_quotes.zero? + quoted_fields << false + # no quote + elsif n_quotes == 2 and + column.start_with?(@quote_character) and + column.end_with?(@quote_character) + quoted_fields << true + row[i] = column[1..-2] + else + @scanner.keep_back + @parse_method = :parse_quotable_robust + return parse_quotable_robust(&block) + end + validate_field_size(row[i]) + end + i += 1 + end + end + @scanner.keep_drop + @scanner.keep_start + @last_line = original_line + emit_row(row, quoted_fields, &block) + end + @scanner.keep_drop + end + + def parse_quotable_robust(&block) + row = [] + quoted_fields = [] + skip_needless_lines + start_row + while true + @quoted_column_value = false + @unquoted_column_value = false + @scanner.scan_all(@strip_value) if @strip_value + value = parse_column_value + if value + @scanner.scan_all(@strip_value) if @strip_value + validate_field_size(value) + end + if parse_column_end + row << value + quoted_fields << @quoted_column_value + elsif parse_row_end + if row.empty? and value.nil? + emit_row([], &block) unless @skip_blanks + else + row << value + quoted_fields << @quoted_column_value + emit_row(row, quoted_fields, &block) + row = [] + quoted_fields.clear + end + skip_needless_lines + start_row + elsif @scanner.eos? + break if row.empty? and value.nil? + row << value + quoted_fields << @quoted_column_value + emit_row(row, quoted_fields, &block) + break + else + if @quoted_column_value + if liberal_parsing? and (new_line = @scanner.check(@line_end)) + message = + "Illegal end-of-line sequence outside of a quoted field " + + "<#{new_line.inspect}>" + else + message = "Any value after quoted field isn't allowed" + end + ignore_broken_line + raise MalformedCSVError.new(message, @lineno) + elsif @unquoted_column_value and + (new_line = @scanner.scan(@line_end)) + ignore_broken_line + message = "Unquoted fields do not allow new line " + + "<#{new_line.inspect}>" + raise MalformedCSVError.new(message, @lineno) + elsif @scanner.rest.start_with?(@quote_character) + ignore_broken_line + message = "Illegal quoting" + raise MalformedCSVError.new(message, @lineno) + elsif (new_line = @scanner.scan(@line_end)) + ignore_broken_line + message = "New line must be <#{@row_separator.inspect}> " + + "not <#{new_line.inspect}>" + raise MalformedCSVError.new(message, @lineno) + else + ignore_broken_line + raise MalformedCSVError.new("TODO: Meaningful message", + @lineno) + end + end + end + end + + def parse_column_value + if @liberal_parsing + quoted_value = parse_quoted_column_value + if quoted_value + @scanner.scan_all(@strip_value) if @strip_value + unquoted_value = parse_unquoted_column_value + if unquoted_value + if @double_quote_outside_quote + unquoted_value = unquoted_value.gsub(@quote_character * 2, + @quote_character) + if quoted_value.empty? # %Q{""...} case + return @quote_character + unquoted_value + end + end + @quote_character + quoted_value + @quote_character + unquoted_value + else + quoted_value + end + else + parse_unquoted_column_value + end + elsif @may_quoted + parse_quoted_column_value || + parse_unquoted_column_value + else + parse_unquoted_column_value || + parse_quoted_column_value + end + end + + def parse_unquoted_column_value + value = @scanner.scan_all(@unquoted_value) + return nil unless value + + @unquoted_column_value = true + if @first_column_separators + while true + @scanner.keep_start + is_column_end = @column_ends.all? do |column_end| + @scanner.scan(column_end) + end + @scanner.keep_back + break if is_column_end + sub_separator = @scanner.scan_all(@first_column_separators) + break if sub_separator.nil? + value << sub_separator + sub_value = @scanner.scan_all(@unquoted_value) + break if sub_value.nil? + value << sub_value + end + end + value.gsub!(@backslash_quote_character, @quote_character) if @backslash_quote + if @rstrip_value + value.gsub!(@rstrip_value, "") + end + value + end + + def parse_quoted_column_value + quotes = @scanner.scan_all(@quotes) + return nil unless quotes + + @quoted_column_value = true + n_quotes = quotes.size + if (n_quotes % 2).zero? + quotes[0, (n_quotes - 2) / 2] + else + value = quotes[0, n_quotes / 2] + while true + quoted_value = @scanner.scan_all(@quoted_value) + value << quoted_value if quoted_value + if @backslash_quote + if @scanner.scan(@escaped_backslash) + if @scanner.scan(@escaped_quote) + value << @quote_character + else + value << @backslash_character + end + next + end + end + + quotes = @scanner.scan_all(@quotes) + unless quotes + ignore_broken_line + message = "Unclosed quoted field" + raise MalformedCSVError.new(message, @lineno) + end + n_quotes = quotes.size + if n_quotes == 1 + break + else + value << quotes[0, n_quotes / 2] + break if (n_quotes % 2) == 1 + end + end + value + end + end + + def parse_column_end + return true if @scanner.scan(@column_end) + return false unless @column_ends + + @scanner.keep_start + if @column_ends.all? {|column_end| @scanner.scan(column_end)} + @scanner.keep_drop + true + else + @scanner.keep_back + false + end + end + + def parse_row_end + return true if @scanner.scan(@row_end) + return false unless @row_ends + @scanner.keep_start + if @row_ends.all? {|row_end| @scanner.scan(row_end)} + @scanner.keep_drop + true + else + @scanner.keep_back + false + end + end + + def strip_value(value) + return value unless @strip + return value if value.nil? + + case @strip + when String + while value.delete_prefix!(@strip) + # do nothing + end + while value.delete_suffix!(@strip) + # do nothing + end + else + value.strip! + end + value + end + + def ignore_broken_line + @scanner.scan_all(@not_line_end) + @scanner.scan_all(@line_end) + @lineno += 1 + end + + def start_row + if @last_line + @last_line = nil + else + @scanner.keep_drop + end + @scanner.keep_start + end + + def emit_row(row, quoted_fields=FieldsConverter::NO_QUOTED_FIELDS, &block) + @lineno += 1 + + raw_row = row + if @use_headers + if @headers.nil? + @headers = adjust_headers(row, quoted_fields) + return unless @return_headers + row = Row.new(@headers, row, true) + else + row = Row.new(@headers, + @fields_converter.convert(raw_row, @headers, @lineno, quoted_fields)) + end + else + # convert fields, if needed... + row = @fields_converter.convert(raw_row, nil, @lineno, quoted_fields) + end + + # inject unconverted fields and accessor, if requested... + if @unconverted_fields and not row.respond_to?(:unconverted_fields) + add_unconverted_fields(row, raw_row) + end + + yield(row) + end + + # This method injects an instance variable unconverted_fields into + # +row+ and an accessor method for +row+ called unconverted_fields(). The + # variable is set to the contents of +fields+. + def add_unconverted_fields(row, fields) + class << row + attr_reader :unconverted_fields + end + row.instance_variable_set(:@unconverted_fields, fields) + row + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/row.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/row.rb new file mode 100644 index 000000000..86323f7d0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/row.rb @@ -0,0 +1,757 @@ +# frozen_string_literal: true + +require "forwardable" + +class CSV + # = \CSV::Row + # A \CSV::Row instance represents a \CSV table row. + # (see {class CSV}[../CSV.html]). + # + # The instance may have: + # - Fields: each is an object, not necessarily a \String. + # - Headers: each serves a key, and also need not be a \String. + # + # === Instance Methods + # + # \CSV::Row has three groups of instance methods: + # - Its own internally defined instance methods. + # - Methods included by module Enumerable. + # - Methods delegated to class Array.: + # * Array#empty? + # * Array#length + # * Array#size + # + # == Creating a \CSV::Row Instance + # + # Commonly, a new \CSV::Row instance is created by parsing \CSV source + # that has headers: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.each {|row| p row } + # Output: + # # + # # + # # + # + # You can also create a row directly. See ::new. + # + # == Headers + # + # Like a \CSV::Table, a \CSV::Row has headers. + # + # A \CSV::Row that was created by parsing \CSV source + # inherits its headers from the table: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table.first + # row.headers # => ["Name", "Value"] + # + # You can also create a new row with headers; + # like the keys in a \Hash, the headers need not be Strings: + # row = CSV::Row.new([:name, :value], ['foo', 0]) + # row.headers # => [:name, :value] + # + # The new row retains its headers even if added to a table + # that has headers: + # table << row # => # + # row.headers # => [:name, :value] + # row[:name] # => "foo" + # row['Name'] # => nil + # + # + # + # == Accessing Fields + # + # You may access a field in a \CSV::Row with either its \Integer index + # (\Array-style) or its header (\Hash-style). + # + # Fetch a field using method #[]: + # row = CSV::Row.new(['Name', 'Value'], ['foo', 0]) + # row[1] # => 0 + # row['Value'] # => 0 + # + # Set a field using method #[]=: + # row = CSV::Row.new(['Name', 'Value'], ['foo', 0]) + # row # => # + # row[0] = 'bar' + # row['Value'] = 1 + # row # => # + # + class Row + # :call-seq: + # CSV::Row.new(headers, fields, header_row = false) -> csv_row + # + # Returns the new \CSV::Row instance constructed from + # arguments +headers+ and +fields+; both should be Arrays; + # note that the fields need not be Strings: + # row = CSV::Row.new(['Name', 'Value'], ['foo', 0]) + # row # => # + # + # If the \Array lengths are different, the shorter is +nil+-filled: + # row = CSV::Row.new(['Name', 'Value', 'Date', 'Size'], ['foo', 0]) + # row # => # + # + # Each \CSV::Row object is either a field row or a header row; + # by default, a new row is a field row; for the row created above: + # row.field_row? # => true + # row.header_row? # => false + # + # If the optional argument +header_row+ is given as +true+, + # the created row is a header row: + # row = CSV::Row.new(['Name', 'Value'], ['foo', 0], header_row = true) + # row # => # + # row.field_row? # => false + # row.header_row? # => true + def initialize(headers, fields, header_row = false) + @header_row = header_row + headers.each { |h| h.freeze if h.is_a? String } + + # handle extra headers or fields + @row = if headers.size >= fields.size + headers.zip(fields) + else + fields.zip(headers).each(&:reverse!) + end + end + + # Internal data format used to compare equality. + attr_reader :row + protected :row + + ### Array Delegation ### + + extend Forwardable + def_delegators :@row, :empty?, :length, :size + + # :call-seq: + # row.initialize_copy(other_row) -> self + # + # Calls superclass method. + def initialize_copy(other) + super_return_value = super + @row = @row.collect(&:dup) + super_return_value + end + + # :call-seq: + # row.header_row? -> true or false + # + # Returns +true+ if this is a header row, +false+ otherwise. + def header_row? + @header_row + end + + # :call-seq: + # row.field_row? -> true or false + # + # Returns +true+ if this is a field row, +false+ otherwise. + def field_row? + not header_row? + end + + # :call-seq: + # row.headers -> array_of_headers + # + # Returns the headers for this row: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table.first + # row.headers # => ["Name", "Value"] + def headers + @row.map(&:first) + end + + # :call-seq: + # field(index) -> value + # field(header) -> value + # field(header, offset) -> value + # + # Returns the field value for the given +index+ or +header+. + # + # --- + # + # Fetch field value by \Integer index: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.field(0) # => "foo" + # row.field(1) # => "bar" + # + # Counts backward from the last column if +index+ is negative: + # row.field(-1) # => "0" + # row.field(-2) # => "foo" + # + # Returns +nil+ if +index+ is out of range: + # row.field(2) # => nil + # row.field(-3) # => nil + # + # --- + # + # Fetch field value by header (first found): + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.field('Name') # => "Foo" + # + # Fetch field value by header, ignoring +offset+ leading fields: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.field('Name', 2) # => "Baz" + # + # Returns +nil+ if the header does not exist. + def field(header_or_index, minimum_index = 0) + # locate the pair + finder = (header_or_index.is_a?(Integer) || header_or_index.is_a?(Range)) ? :[] : :assoc + pair = @row[minimum_index..-1].public_send(finder, header_or_index) + + # return the field if we have a pair + if pair.nil? + nil + else + header_or_index.is_a?(Range) ? pair.map(&:last) : pair.last + end + end + alias_method :[], :field + + # + # :call-seq: + # fetch(header) -> value + # fetch(header, default) -> value + # fetch(header) {|row| ... } -> value + # + # Returns the field value as specified by +header+. + # + # --- + # + # With the single argument +header+, returns the field value + # for that header (first found): + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.fetch('Name') # => "Foo" + # + # Raises exception +KeyError+ if the header does not exist. + # + # --- + # + # With arguments +header+ and +default+ given, + # returns the field value for the header (first found) + # if the header exists, otherwise returns +default+: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.fetch('Name', '') # => "Foo" + # row.fetch(:nosuch, '') # => "" + # + # --- + # + # With argument +header+ and a block given, + # returns the field value for the header (first found) + # if the header exists; otherwise calls the block + # and returns its return value: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.fetch('Name') {|header| fail 'Cannot happen' } # => "Foo" + # row.fetch(:nosuch) {|header| "Header '#{header} not found'" } # => "Header 'nosuch not found'" + def fetch(header, *varargs) + raise ArgumentError, "Too many arguments" if varargs.length > 1 + pair = @row.assoc(header) + if pair + pair.last + else + if block_given? + yield header + elsif varargs.empty? + raise KeyError, "key not found: #{header}" + else + varargs.first + end + end + end + + # :call-seq: + # row.has_key?(header) -> true or false + # + # Returns +true+ if there is a field with the given +header+, + # +false+ otherwise. + def has_key?(header) + !!@row.assoc(header) + end + alias_method :include?, :has_key? + alias_method :key?, :has_key? + alias_method :member?, :has_key? + alias_method :header?, :has_key? + + # + # :call-seq: + # row[index] = value -> value + # row[header, offset] = value -> value + # row[header] = value -> value + # + # Assigns the field value for the given +index+ or +header+; + # returns +value+. + # + # --- + # + # Assign field value by \Integer index: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row[0] = 'Bat' + # row[1] = 3 + # row # => # + # + # Counts backward from the last column if +index+ is negative: + # row[-1] = 4 + # row[-2] = 'Bam' + # row # => # + # + # Extends the row with nil:nil if positive +index+ is not in the row: + # row[4] = 5 + # row # => # + # + # Raises IndexError if negative +index+ is too small (too far from zero). + # + # --- + # + # Assign field value by header (first found): + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row['Name'] = 'Bat' + # row # => # + # + # Assign field value by header, ignoring +offset+ leading fields: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row['Name', 2] = 4 + # row # => # + # + # Append new field by (new) header: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row['New'] = 6 + # row# => # + def []=(*args) + value = args.pop + + if args.first.is_a? Integer + if @row[args.first].nil? # extending past the end with index + @row[args.first] = [nil, value] + @row.map! { |pair| pair.nil? ? [nil, nil] : pair } + else # normal index assignment + @row[args.first][1] = value + end + else + index = index(*args) + if index.nil? # appending a field + self << [args.first, value] + else # normal header assignment + @row[index][1] = value + end + end + end + + # + # :call-seq: + # row << [header, value] -> self + # row << hash -> self + # row << value -> self + # + # Adds a field to +self+; returns +self+: + # + # If the argument is a 2-element \Array [header, value], + # a field is added with the given +header+ and +value+: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row << ['NAME', 'Bat'] + # row # => # + # + # If the argument is a \Hash, each key-value pair is added + # as a field with header +key+ and value +value+. + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row << {NAME: 'Bat', name: 'Bam'} + # row # => # + # + # Otherwise, the given +value+ is added as a field with no header. + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row << 'Bag' + # row # => # + def <<(arg) + if arg.is_a?(Array) and arg.size == 2 # appending a header and name + @row << arg + elsif arg.is_a?(Hash) # append header and name pairs + arg.each { |pair| @row << pair } + else # append field value + @row << [nil, arg] + end + + self # for chaining + end + + # :call-seq: + # row.push(*values) -> self + # + # Appends each of the given +values+ to +self+ as a field; returns +self+: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.push('Bat', 'Bam') + # row # => # + def push(*args) + args.each { |arg| self << arg } + + self # for chaining + end + + # + # :call-seq: + # delete(index) -> [header, value] or nil + # delete(header) -> [header, value] or empty_array + # delete(header, offset) -> [header, value] or empty_array + # + # Removes a specified field from +self+; returns the 2-element \Array + # [header, value] if the field exists. + # + # If an \Integer argument +index+ is given, + # removes and returns the field at offset +index+, + # or returns +nil+ if the field does not exist: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.delete(1) # => ["Name", "Bar"] + # row.delete(50) # => nil + # + # Otherwise, if the single argument +header+ is given, + # removes and returns the first-found field with the given header, + # of returns a new empty \Array if the field does not exist: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.delete('Name') # => ["Name", "Foo"] + # row.delete('NAME') # => [] + # + # If argument +header+ and \Integer argument +offset+ are given, + # removes and returns the first-found field with the given header + # whose +index+ is at least as large as +offset+: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.delete('Name', 1) # => ["Name", "Bar"] + # row.delete('NAME', 1) # => [] + def delete(header_or_index, minimum_index = 0) + if header_or_index.is_a? Integer # by index + @row.delete_at(header_or_index) + elsif i = index(header_or_index, minimum_index) # by header + @row.delete_at(i) + else + [ ] + end + end + + # :call-seq: + # row.delete_if {|header, value| ... } -> self + # + # Removes fields from +self+ as selected by the block; returns +self+. + # + # Removes each field for which the block returns a truthy value: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.delete_if {|header, value| value.start_with?('B') } # => true + # row # => # + # row.delete_if {|header, value| header.start_with?('B') } # => false + # + # If no block is given, returns a new Enumerator: + # row.delete_if # => #:delete_if> + def delete_if(&block) + return enum_for(__method__) { size } unless block_given? + + @row.delete_if(&block) + + self # for chaining + end + + # :call-seq: + # self.fields(*specifiers) -> array_of_fields + # + # Returns field values per the given +specifiers+, which may be any mixture of: + # - \Integer index. + # - \Range of \Integer indexes. + # - 2-element \Array containing a header and offset. + # - Header. + # - \Range of headers. + # + # For +specifier+ in one of the first four cases above, + # returns the result of self.field(specifier); see #field. + # + # Although there may be any number of +specifiers+, + # the examples here will illustrate one at a time. + # + # When the specifier is an \Integer +index+, + # returns self.field(index)L + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.fields(1) # => ["Bar"] + # + # When the specifier is a \Range of \Integers +range+, + # returns self.field(range): + # row.fields(1..2) # => ["Bar", "Baz"] + # + # When the specifier is a 2-element \Array +array+, + # returns self.field(array)L + # row.fields('Name', 1) # => ["Foo", "Bar"] + # + # When the specifier is a header +header+, + # returns self.field(header)L + # row.fields('Name') # => ["Foo"] + # + # When the specifier is a \Range of headers +range+, + # forms a new \Range +new_range+ from the indexes of + # range.start and range.end, + # and returns self.field(new_range): + # source = "Name,NAME,name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.fields('Name'..'NAME') # => ["Foo", "Bar"] + # + # Returns all fields if no argument given: + # row.fields # => ["Foo", "Bar", "Baz"] + def fields(*headers_and_or_indices) + if headers_and_or_indices.empty? # return all fields--no arguments + @row.map(&:last) + else # or work like values_at() + all = [] + headers_and_or_indices.each do |h_or_i| + if h_or_i.is_a? Range + index_begin = h_or_i.begin.is_a?(Integer) ? h_or_i.begin : + index(h_or_i.begin) + index_end = h_or_i.end.is_a?(Integer) ? h_or_i.end : + index(h_or_i.end) + new_range = h_or_i.exclude_end? ? (index_begin...index_end) : + (index_begin..index_end) + all.concat(fields.values_at(new_range)) + else + all << field(*Array(h_or_i)) + end + end + return all + end + end + alias_method :values_at, :fields + + # :call-seq: + # index(header) -> index + # index(header, offset) -> index + # + # Returns the index for the given header, if it exists; + # otherwise returns +nil+. + # + # With the single argument +header+, returns the index + # of the first-found field with the given +header+: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.index('Name') # => 0 + # row.index('NAME') # => nil + # + # With arguments +header+ and +offset+, + # returns the index of the first-found field with given +header+, + # but ignoring the first +offset+ fields: + # row.index('Name', 1) # => 1 + # row.index('Name', 3) # => nil + def index(header, minimum_index = 0) + # find the pair + index = headers[minimum_index..-1].index(header) + # return the index at the right offset, if we found one + index.nil? ? nil : index + minimum_index + end + + # :call-seq: + # row.field?(value) -> true or false + # + # Returns +true+ if +value+ is a field in this row, +false+ otherwise: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.field?('Bar') # => true + # row.field?('BAR') # => false + def field?(data) + fields.include? data + end + + include Enumerable + + # :call-seq: + # row.each {|header, value| ... } -> self + # + # Calls the block with each header-value pair; returns +self+: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.each {|header, value| p [header, value] } + # Output: + # ["Name", "Foo"] + # ["Name", "Bar"] + # ["Name", "Baz"] + # + # If no block is given, returns a new Enumerator: + # row.each # => #:each> + def each(&block) + return enum_for(__method__) { size } unless block_given? + + @row.each(&block) + + self # for chaining + end + + alias_method :each_pair, :each + + # :call-seq: + # row == other -> true or false + # + # Returns +true+ if +other+ is a /CSV::Row that has the same + # fields (headers and values) in the same order as +self+; + # otherwise returns +false+: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # other_row = table[0] + # row == other_row # => true + # other_row = table[1] + # row == other_row # => false + def ==(other) + return @row == other.row if other.is_a? CSV::Row + @row == other + end + + # :call-seq: + # row.to_h -> hash + # + # Returns the new \Hash formed by adding each header-value pair in +self+ + # as a key-value pair in the \Hash. + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.to_h # => {"Name"=>"foo", "Value"=>"0"} + # + # Header order is preserved, but repeated headers are ignored: + # source = "Name,Name,Name\nFoo,Bar,Baz\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.to_h # => {"Name"=>"Foo"} + def to_h + hash = {} + each do |key, _value| + hash[key] = self[key] unless hash.key?(key) + end + hash + end + alias_method :to_hash, :to_h + + # :call-seq: + # row.deconstruct_keys(keys) -> hash + # + # Returns the new \Hash suitable for pattern matching containing only the + # keys specified as an argument. + def deconstruct_keys(keys) + if keys.nil? + to_h + else + keys.to_h { |key| [key, self[key]] } + end + end + + alias_method :to_ary, :to_a + + # :call-seq: + # row.deconstruct -> array + # + # Returns the new \Array suitable for pattern matching containing the values + # of the row. + def deconstruct + fields + end + + # :call-seq: + # row.to_csv -> csv_string + # + # Returns the row as a \CSV String. Headers are not included: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.to_csv # => "foo,0\n" + def to_csv(**options) + fields.to_csv(**options) + end + alias_method :to_s, :to_csv + + # :call-seq: + # row.dig(index_or_header, *identifiers) -> object + # + # Finds and returns the object in nested object that is specified + # by +index_or_header+ and +specifiers+. + # + # The nested objects may be instances of various classes. + # See {Dig Methods}[rdoc-ref:dig_methods.rdoc]. + # + # Examples: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.dig(1) # => "0" + # row.dig('Value') # => "0" + # row.dig(5) # => nil + def dig(index_or_header, *indexes) + value = field(index_or_header) + if value.nil? + nil + elsif indexes.empty? + value + else + unless value.respond_to?(:dig) + raise TypeError, "#{value.class} does not have \#dig method" + end + value.dig(*indexes) + end + end + + # :call-seq: + # row.inspect -> string + # + # Returns an ASCII-compatible \String showing: + # - Class \CSV::Row. + # - Header-value pairs. + # Example: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # row = table[0] + # row.inspect # => "#" + def inspect + str = ["#<", self.class.to_s] + each do |header, field| + str << " " << (header.is_a?(Symbol) ? header.to_s : header.inspect) << + ":" << field.inspect + end + str << ">" + begin + str.join('') + rescue # any encoding error + str.map do |s| + e = Encoding::Converter.asciicompat_encoding(s.encoding) + e ? s.encode(e) : s.force_encoding("ASCII-8BIT") + end.join('') + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/table.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/table.rb new file mode 100644 index 000000000..fb19f5453 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/table.rb @@ -0,0 +1,1055 @@ +# frozen_string_literal: true + +require "forwardable" + +class CSV + # = \CSV::Table + # A \CSV::Table instance represents \CSV data. + # (see {class CSV}[../CSV.html]). + # + # The instance may have: + # - Rows: each is a Table::Row object. + # - Headers: names for the columns. + # + # === Instance Methods + # + # \CSV::Table has three groups of instance methods: + # - Its own internally defined instance methods. + # - Methods included by module Enumerable. + # - Methods delegated to class Array.: + # * Array#empty? + # * Array#length + # * Array#size + # + # == Creating a \CSV::Table Instance + # + # Commonly, a new \CSV::Table instance is created by parsing \CSV source + # using headers: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.class # => CSV::Table + # + # You can also create an instance directly. See ::new. + # + # == Headers + # + # If a table has headers, the headers serve as labels for the columns of data. + # Each header serves as the label for its column. + # + # The headers for a \CSV::Table object are stored as an \Array of Strings. + # + # Commonly, headers are defined in the first row of \CSV source: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.headers # => ["Name", "Value"] + # + # If no headers are defined, the \Array is empty: + # table = CSV::Table.new([]) + # table.headers # => [] + # + # == Access Modes + # + # \CSV::Table provides three modes for accessing table data: + # - \Row mode. + # - Column mode. + # - Mixed mode (the default for a new table). + # + # The access mode for a\CSV::Table instance affects the behavior + # of some of its instance methods: + # - #[] + # - #[]= + # - #delete + # - #delete_if + # - #each + # - #values_at + # + # === \Row Mode + # + # Set a table to row mode with method #by_row!: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_row! # => # + # + # Specify a single row by an \Integer index: + # # Get a row. + # table[1] # => # + # # Set a row, then get it. + # table[1] = CSV::Row.new(['Name', 'Value'], ['bam', 3]) + # table[1] # => # + # + # Specify a sequence of rows by a \Range: + # # Get rows. + # table[1..2] # => [#, #] + # # Set rows, then get them. + # table[1..2] = [ + # CSV::Row.new(['Name', 'Value'], ['bat', 4]), + # CSV::Row.new(['Name', 'Value'], ['bad', 5]), + # ] + # table[1..2] # => [["Name", #], ["Value", #]] + # + # === Column Mode + # + # Set a table to column mode with method #by_col!: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_col! # => # + # + # Specify a column by an \Integer index: + # # Get a column. + # table[0] + # # Set a column, then get it. + # table[0] = ['FOO', 'BAR', 'BAZ'] + # table[0] # => ["FOO", "BAR", "BAZ"] + # + # Specify a column by its \String header: + # # Get a column. + # table['Name'] # => ["FOO", "BAR", "BAZ"] + # # Set a column, then get it. + # table['Name'] = ['Foo', 'Bar', 'Baz'] + # table['Name'] # => ["Foo", "Bar", "Baz"] + # + # === Mixed Mode + # + # In mixed mode, you can refer to either rows or columns: + # - An \Integer index refers to a row. + # - A \Range index refers to multiple rows. + # - A \String index refers to a column. + # + # Set a table to mixed mode with method #by_col_or_row!: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_col_or_row! # => # + # + # Specify a single row by an \Integer index: + # # Get a row. + # table[1] # => # + # # Set a row, then get it. + # table[1] = CSV::Row.new(['Name', 'Value'], ['bam', 3]) + # table[1] # => # + # + # Specify a sequence of rows by a \Range: + # # Get rows. + # table[1..2] # => [#, #] + # # Set rows, then get them. + # table[1] = CSV::Row.new(['Name', 'Value'], ['bat', 4]) + # table[2] = CSV::Row.new(['Name', 'Value'], ['bad', 5]) + # table[1..2] # => [["Name", #], ["Value", #]] + # + # Specify a column by its \String header: + # # Get a column. + # table['Name'] # => ["foo", "bat", "bad"] + # # Set a column, then get it. + # table['Name'] = ['Foo', 'Bar', 'Baz'] + # table['Name'] # => ["Foo", "Bar", "Baz"] + class Table + # :call-seq: + # CSV::Table.new(array_of_rows, headers = nil) -> csv_table + # + # Returns a new \CSV::Table object. + # + # - Argument +array_of_rows+ must be an \Array of CSV::Row objects. + # - Argument +headers+, if given, may be an \Array of Strings. + # + # --- + # + # Create an empty \CSV::Table object: + # table = CSV::Table.new([]) + # table # => # + # + # Create a non-empty \CSV::Table object: + # rows = [ + # CSV::Row.new([], []), + # CSV::Row.new([], []), + # CSV::Row.new([], []), + # ] + # table = CSV::Table.new(rows) + # table # => # + # + # --- + # + # If argument +headers+ is an \Array of Strings, + # those Strings become the table's headers: + # table = CSV::Table.new([], headers: ['Name', 'Age']) + # table.headers # => ["Name", "Age"] + # + # If argument +headers+ is not given and the table has rows, + # the headers are taken from the first row: + # rows = [ + # CSV::Row.new(['Foo', 'Bar'], []), + # CSV::Row.new(['foo', 'bar'], []), + # CSV::Row.new(['FOO', 'BAR'], []), + # ] + # table = CSV::Table.new(rows) + # table.headers # => ["Foo", "Bar"] + # + # If argument +headers+ is not given and the table is empty (has no rows), + # the headers are also empty: + # table = CSV::Table.new([]) + # table.headers # => [] + # + # --- + # + # Raises an exception if argument +array_of_rows+ is not an \Array object: + # # Raises NoMethodError (undefined method `first' for :foo:Symbol): + # CSV::Table.new(:foo) + # + # Raises an exception if an element of +array_of_rows+ is not a \CSV::Table object: + # # Raises NoMethodError (undefined method `headers' for :foo:Symbol): + # CSV::Table.new([:foo]) + def initialize(array_of_rows, headers: nil) + @table = array_of_rows + @headers = headers + unless @headers + if @table.empty? + @headers = [] + else + @headers = @table.first.headers + end + end + + @mode = :col_or_row + end + + # The current access mode for indexing and iteration. + attr_reader :mode + + # Internal data format used to compare equality. + attr_reader :table + protected :table + + ### Array Delegation ### + + extend Forwardable + def_delegators :@table, :empty?, :length, :size + + # :call-seq: + # table.by_col -> table_dup + # + # Returns a duplicate of +self+, in column mode + # (see {Column Mode}[#class-CSV::Table-label-Column+Mode]): + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.mode # => :col_or_row + # dup_table = table.by_col + # dup_table.mode # => :col + # dup_table.equal?(table) # => false # It's a dup + # + # This may be used to chain method calls without changing the mode + # (but also will affect performance and memory usage): + # dup_table.by_col['Name'] + # + # Also note that changes to the duplicate table will not affect the original. + def by_col + self.class.new(@table.dup).by_col! + end + + # :call-seq: + # table.by_col! -> self + # + # Sets the mode for +self+ to column mode + # (see {Column Mode}[#class-CSV::Table-label-Column+Mode]); returns +self+: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.mode # => :col_or_row + # table1 = table.by_col! + # table.mode # => :col + # table1.equal?(table) # => true # Returned self + def by_col! + @mode = :col + + self + end + + # :call-seq: + # table.by_col_or_row -> table_dup + # + # Returns a duplicate of +self+, in mixed mode + # (see {Mixed Mode}[#class-CSV::Table-label-Mixed+Mode]): + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true).by_col! + # table.mode # => :col + # dup_table = table.by_col_or_row + # dup_table.mode # => :col_or_row + # dup_table.equal?(table) # => false # It's a dup + # + # This may be used to chain method calls without changing the mode + # (but also will affect performance and memory usage): + # dup_table.by_col_or_row['Name'] + # + # Also note that changes to the duplicate table will not affect the original. + def by_col_or_row + self.class.new(@table.dup).by_col_or_row! + end + + # :call-seq: + # table.by_col_or_row! -> self + # + # Sets the mode for +self+ to mixed mode + # (see {Mixed Mode}[#class-CSV::Table-label-Mixed+Mode]); returns +self+: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true).by_col! + # table.mode # => :col + # table1 = table.by_col_or_row! + # table.mode # => :col_or_row + # table1.equal?(table) # => true # Returned self + def by_col_or_row! + @mode = :col_or_row + + self + end + + # :call-seq: + # table.by_row -> table_dup + # + # Returns a duplicate of +self+, in row mode + # (see {Row Mode}[#class-CSV::Table-label-Row+Mode]): + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.mode # => :col_or_row + # dup_table = table.by_row + # dup_table.mode # => :row + # dup_table.equal?(table) # => false # It's a dup + # + # This may be used to chain method calls without changing the mode + # (but also will affect performance and memory usage): + # dup_table.by_row[1] + # + # Also note that changes to the duplicate table will not affect the original. + def by_row + self.class.new(@table.dup).by_row! + end + + # :call-seq: + # table.by_row! -> self + # + # Sets the mode for +self+ to row mode + # (see {Row Mode}[#class-CSV::Table-label-Row+Mode]); returns +self+: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.mode # => :col_or_row + # table1 = table.by_row! + # table.mode # => :row + # table1.equal?(table) # => true # Returned self + def by_row! + @mode = :row + + self + end + + # :call-seq: + # table.headers -> array_of_headers + # + # Returns a new \Array containing the \String headers for the table. + # + # If the table is not empty, returns the headers from the first row: + # rows = [ + # CSV::Row.new(['Foo', 'Bar'], []), + # CSV::Row.new(['FOO', 'BAR'], []), + # CSV::Row.new(['foo', 'bar'], []), + # ] + # table = CSV::Table.new(rows) + # table.headers # => ["Foo", "Bar"] + # table.delete(0) + # table.headers # => ["FOO", "BAR"] + # table.delete(0) + # table.headers # => ["foo", "bar"] + # + # If the table is empty, returns a copy of the headers in the table itself: + # table.delete(0) + # table.headers # => ["Foo", "Bar"] + def headers + if @table.empty? + @headers.dup + else + @table.first.headers + end + end + + # :call-seq: + # table[n] -> row or column_data + # table[range] -> array_of_rows or array_of_column_data + # table[header] -> array_of_column_data + # + # Returns data from the table; does not modify the table. + # + # --- + # + # Fetch a \Row by Its \Integer Index:: + # - Form: table[n], +n+ an integer. + # - Access mode: :row or :col_or_row. + # - Return value: _nth_ row of the table, if that row exists; + # otherwise +nil+. + # + # Returns the _nth_ row of the table if that row exists: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_row! # => # + # table[1] # => # + # table.by_col_or_row! # => # + # table[1] # => # + # + # Counts backward from the last row if +n+ is negative: + # table[-1] # => # + # + # Returns +nil+ if +n+ is too large or too small: + # table[4] # => nil + # table[-4] # => nil + # + # Raises an exception if the access mode is :row + # and +n+ is not an \Integer: + # table.by_row! # => # + # # Raises TypeError (no implicit conversion of String into Integer): + # table['Name'] + # + # --- + # + # Fetch a Column by Its \Integer Index:: + # - Form: table[n], +n+ an \Integer. + # - Access mode: :col. + # - Return value: _nth_ column of the table, if that column exists; + # otherwise an \Array of +nil+ fields of length self.size. + # + # Returns the _nth_ column of the table if that column exists: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_col! # => # + # table[1] # => ["0", "1", "2"] + # + # Counts backward from the last column if +n+ is negative: + # table[-2] # => ["foo", "bar", "baz"] + # + # Returns an \Array of +nil+ fields if +n+ is too large or too small: + # table[4] # => [nil, nil, nil] + # table[-4] # => [nil, nil, nil] + # + # --- + # + # Fetch Rows by \Range:: + # - Form: table[range], +range+ a \Range object. + # - Access mode: :row or :col_or_row. + # - Return value: rows from the table, beginning at row range.start, + # if those rows exists. + # + # Returns rows from the table, beginning at row range.first, + # if those rows exist: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_row! # => # + # rows = table[1..2] # => # + # rows # => [#, #] + # table.by_col_or_row! # => # + # rows = table[1..2] # => # + # rows # => [#, #] + # + # If there are too few rows, returns all from range.start to the end: + # rows = table[1..50] # => # + # rows # => [#, #] + # + # Special case: if range.start == table.size, returns an empty \Array: + # table[table.size..50] # => [] + # + # If range.end is negative, calculates the ending index from the end: + # rows = table[0..-1] + # rows # => [#, #, #] + # + # If range.start is negative, calculates the starting index from the end: + # rows = table[-1..2] + # rows # => [#] + # + # If range.start is larger than table.size, returns +nil+: + # table[4..4] # => nil + # + # --- + # + # Fetch Columns by \Range:: + # - Form: table[range], +range+ a \Range object. + # - Access mode: :col. + # - Return value: column data from the table, beginning at column range.start, + # if those columns exist. + # + # Returns column values from the table, if the column exists; + # the values are arranged by row: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_col! + # table[0..1] # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] + # + # Special case: if range.start == headers.size, + # returns an \Array (size: table.size) of empty \Arrays: + # table[table.headers.size..50] # => [[], [], []] + # + # If range.end is negative, calculates the ending index from the end: + # table[0..-1] # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] + # + # If range.start is negative, calculates the starting index from the end: + # table[-2..2] # => [["foo", "0"], ["bar", "1"], ["baz", "2"]] + # + # If range.start is larger than table.size, + # returns an \Array of +nil+ values: + # table[4..4] # => [nil, nil, nil] + # + # --- + # + # Fetch a Column by Its \String Header:: + # - Form: table[header], +header+ a \String header. + # - Access mode: :col or :col_or_row + # - Return value: column data from the table, if that +header+ exists. + # + # Returns column values from the table, if the column exists: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_col! # => # + # table['Name'] # => ["foo", "bar", "baz"] + # table.by_col_or_row! # => # + # col = table['Name'] + # col # => ["foo", "bar", "baz"] + # + # Modifying the returned column values does not modify the table: + # col[0] = 'bat' + # col # => ["bat", "bar", "baz"] + # table['Name'] # => ["foo", "bar", "baz"] + # + # Returns an \Array of +nil+ values if there is no such column: + # table['Nosuch'] # => [nil, nil, nil] + def [](index_or_header) + if @mode == :row or # by index + (@mode == :col_or_row and (index_or_header.is_a?(Integer) or index_or_header.is_a?(Range))) + @table[index_or_header] + else # by header + @table.map { |row| row[index_or_header] } + end + end + + # :call-seq: + # table[n] = row -> row + # table[n] = field_or_array_of_fields -> field_or_array_of_fields + # table[header] = field_or_array_of_fields -> field_or_array_of_fields + # + # Puts data onto the table. + # + # --- + # + # Set a \Row by Its \Integer Index:: + # - Form: table[n] = row, +n+ an \Integer, + # +row+ a \CSV::Row instance or an \Array of fields. + # - Access mode: :row or :col_or_row. + # - Return value: +row+. + # + # If the row exists, it is replaced: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # new_row = CSV::Row.new(['Name', 'Value'], ['bat', 3]) + # table.by_row! # => # + # return_value = table[0] = new_row + # return_value.equal?(new_row) # => true # Returned the row + # table[0].to_h # => {"Name"=>"bat", "Value"=>3} + # + # With access mode :col_or_row: + # table.by_col_or_row! # => # + # table[0] = CSV::Row.new(['Name', 'Value'], ['bam', 4]) + # table[0].to_h # => {"Name"=>"bam", "Value"=>4} + # + # With an \Array instead of a \CSV::Row, inherits headers from the table: + # array = ['bad', 5] + # return_value = table[0] = array + # return_value.equal?(array) # => true # Returned the array + # table[0].to_h # => {"Name"=>"bad", "Value"=>5} + # + # If the row does not exist, extends the table by adding rows: + # assigns rows with +nil+ as needed: + # table.size # => 3 + # table[5] = ['bag', 6] + # table.size # => 6 + # table[3] # => nil + # table[4]# => nil + # table[5].to_h # => {"Name"=>"bag", "Value"=>6} + # + # Note that the +nil+ rows are actually +nil+, not a row of +nil+ fields. + # + # --- + # + # Set a Column by Its \Integer Index:: + # - Form: table[n] = array_of_fields, +n+ an \Integer, + # +array_of_fields+ an \Array of \String fields. + # - Access mode: :col. + # - Return value: +array_of_fields+. + # + # If the column exists, it is replaced: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # new_col = [3, 4, 5] + # table.by_col! # => # + # return_value = table[1] = new_col + # return_value.equal?(new_col) # => true # Returned the column + # table[1] # => [3, 4, 5] + # # The rows, as revised: + # table.by_row! # => # + # table[0].to_h # => {"Name"=>"foo", "Value"=>3} + # table[1].to_h # => {"Name"=>"bar", "Value"=>4} + # table[2].to_h # => {"Name"=>"baz", "Value"=>5} + # table.by_col! # => # + # + # If there are too few values, fills with +nil+ values: + # table[1] = [0] + # table[1] # => [0, nil, nil] + # + # If there are too many values, ignores the extra values: + # table[1] = [0, 1, 2, 3, 4] + # table[1] # => [0, 1, 2] + # + # If a single value is given, replaces all fields in the column with that value: + # table[1] = 'bat' + # table[1] # => ["bat", "bat", "bat"] + # + # --- + # + # Set a Column by Its \String Header:: + # - Form: table[header] = field_or_array_of_fields, + # +header+ a \String header, +field_or_array_of_fields+ a field value + # or an \Array of \String fields. + # - Access mode: :col or :col_or_row. + # - Return value: +field_or_array_of_fields+. + # + # If the column exists, it is replaced: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # new_col = [3, 4, 5] + # table.by_col! # => # + # return_value = table['Value'] = new_col + # return_value.equal?(new_col) # => true # Returned the column + # table['Value'] # => [3, 4, 5] + # # The rows, as revised: + # table.by_row! # => # + # table[0].to_h # => {"Name"=>"foo", "Value"=>3} + # table[1].to_h # => {"Name"=>"bar", "Value"=>4} + # table[2].to_h # => {"Name"=>"baz", "Value"=>5} + # table.by_col! # => # + # + # If there are too few values, fills with +nil+ values: + # table['Value'] = [0] + # table['Value'] # => [0, nil, nil] + # + # If there are too many values, ignores the extra values: + # table['Value'] = [0, 1, 2, 3, 4] + # table['Value'] # => [0, 1, 2] + # + # If the column does not exist, extends the table by adding columns: + # table['Note'] = ['x', 'y', 'z'] + # table['Note'] # => ["x", "y", "z"] + # # The rows, as revised: + # table.by_row! + # table[0].to_h # => {"Name"=>"foo", "Value"=>0, "Note"=>"x"} + # table[1].to_h # => {"Name"=>"bar", "Value"=>1, "Note"=>"y"} + # table[2].to_h # => {"Name"=>"baz", "Value"=>2, "Note"=>"z"} + # table.by_col! + # + # If a single value is given, replaces all fields in the column with that value: + # table['Value'] = 'bat' + # table['Value'] # => ["bat", "bat", "bat"] + def []=(index_or_header, value) + if @mode == :row or # by index + (@mode == :col_or_row and index_or_header.is_a? Integer) + if value.is_a? Array + @table[index_or_header] = Row.new(headers, value) + else + @table[index_or_header] = value + end + else # set column + unless index_or_header.is_a? Integer + index = @headers.index(index_or_header) || @headers.size + @headers[index] = index_or_header + end + if value.is_a? Array # multiple values + @table.each_with_index do |row, i| + if row.header_row? + row[index_or_header] = index_or_header + else + row[index_or_header] = value[i] + end + end + else # repeated value + @table.each do |row| + if row.header_row? + row[index_or_header] = index_or_header + else + row[index_or_header] = value + end + end + end + end + end + + # :call-seq: + # table.values_at(*indexes) -> array_of_rows + # table.values_at(*headers) -> array_of_columns_data + # + # If the access mode is :row or :col_or_row, + # and each argument is either an \Integer or a \Range, + # returns rows. + # Otherwise, returns columns data. + # + # In either case, the returned values are in the order + # specified by the arguments. Arguments may be repeated. + # + # --- + # + # Returns rows as an \Array of \CSV::Row objects. + # + # No argument: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.values_at # => [] + # + # One index: + # values = table.values_at(0) + # values # => [#] + # + # Two indexes: + # values = table.values_at(2, 0) + # values # => [#, #] + # + # One \Range: + # values = table.values_at(1..2) + # values # => [#, #] + # + # \Ranges and indexes: + # values = table.values_at(0..1, 1..2, 0, 2) + # pp values + # Output: + # [#, + # #, + # #, + # #, + # #, + # #] + # + # --- + # + # Returns columns data as row Arrays, + # each consisting of the specified columns data for that row: + # values = table.values_at('Name') + # values # => [["foo"], ["bar"], ["baz"]] + # values = table.values_at('Value', 'Name') + # values # => [["0", "foo"], ["1", "bar"], ["2", "baz"]] + def values_at(*indices_or_headers) + if @mode == :row or # by indices + ( @mode == :col_or_row and indices_or_headers.all? do |index| + index.is_a?(Integer) or + ( index.is_a?(Range) and + index.first.is_a?(Integer) and + index.last.is_a?(Integer) ) + end ) + @table.values_at(*indices_or_headers) + else # by headers + @table.map { |row| row.values_at(*indices_or_headers) } + end + end + + # :call-seq: + # table << row_or_array -> self + # + # If +row_or_array+ is a \CSV::Row object, + # it is appended to the table: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table << CSV::Row.new(table.headers, ['bat', 3]) + # table[3] # => # + # + # If +row_or_array+ is an \Array, it is used to create a new + # \CSV::Row object which is then appended to the table: + # table << ['bam', 4] + # table[4] # => # + def <<(row_or_array) + if row_or_array.is_a? Array # append Array + @table << Row.new(headers, row_or_array) + else # append Row + @table << row_or_array + end + + self # for chaining + end + + # + # :call-seq: + # table.push(*rows_or_arrays) -> self + # + # A shortcut for appending multiple rows. Equivalent to: + # rows.each {|row| self << row } + # + # Each argument may be either a \CSV::Row object or an \Array: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # rows = [ + # CSV::Row.new(table.headers, ['bat', 3]), + # ['bam', 4] + # ] + # table.push(*rows) + # table[3..4] # => [#, #] + def push(*rows) + rows.each { |row| self << row } + + self # for chaining + end + + # :call-seq: + # table.delete(*indexes) -> deleted_values + # table.delete(*headers) -> deleted_values + # + # If the access mode is :row or :col_or_row, + # and each argument is either an \Integer or a \Range, + # returns deleted rows. + # Otherwise, returns deleted columns data. + # + # In either case, the returned values are in the order + # specified by the arguments. Arguments may be repeated. + # + # --- + # + # Returns rows as an \Array of \CSV::Row objects. + # + # One index: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # deleted_values = table.delete(0) + # deleted_values # => [#] + # + # Two indexes: + # table = CSV.parse(source, headers: true) + # deleted_values = table.delete(2, 0) + # deleted_values # => [#, #] + # + # --- + # + # Returns columns data as column Arrays. + # + # One header: + # table = CSV.parse(source, headers: true) + # deleted_values = table.delete('Name') + # deleted_values # => ["foo", "bar", "baz"] + # + # Two headers: + # table = CSV.parse(source, headers: true) + # deleted_values = table.delete('Value', 'Name') + # deleted_values # => [["0", "1", "2"], ["foo", "bar", "baz"]] + def delete(*indexes_or_headers) + if indexes_or_headers.empty? + raise ArgumentError, "wrong number of arguments (given 0, expected 1+)" + end + deleted_values = indexes_or_headers.map do |index_or_header| + if @mode == :row or # by index + (@mode == :col_or_row and index_or_header.is_a? Integer) + @table.delete_at(index_or_header) + else # by header + if index_or_header.is_a? Integer + @headers.delete_at(index_or_header) + else + @headers.delete(index_or_header) + end + @table.map { |row| row.delete(index_or_header).last } + end + end + if indexes_or_headers.size == 1 + deleted_values[0] + else + deleted_values + end + end + + # :call-seq: + # table.delete_if {|row_or_column| ... } -> self + # + # Removes rows or columns for which the block returns a truthy value; + # returns +self+. + # + # Removes rows when the access mode is :row or :col_or_row; + # calls the block with each \CSV::Row object: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_row! # => # + # table.size # => 3 + # table.delete_if {|row| row['Name'].start_with?('b') } + # table.size # => 1 + # + # Removes columns when the access mode is :col; + # calls the block with each column as a 2-element array + # containing the header and an \Array of column fields: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_col! # => # + # table.headers.size # => 2 + # table.delete_if {|column_data| column_data[1].include?('2') } + # table.headers.size # => 1 + # + # Returns a new \Enumerator if no block is given: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.delete_if # => #:delete_if> + def delete_if(&block) + return enum_for(__method__) { @mode == :row or @mode == :col_or_row ? size : headers.size } unless block_given? + + if @mode == :row or @mode == :col_or_row # by index + @table.delete_if(&block) + else # by header + headers.each do |header| + delete(header) if yield([header, self[header]]) + end + end + + self # for chaining + end + + include Enumerable + + # :call-seq: + # table.each {|row_or_column| ... ) -> self + # + # Calls the block with each row or column; returns +self+. + # + # When the access mode is :row or :col_or_row, + # calls the block with each \CSV::Row object: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.by_row! # => # + # table.each {|row| p row } + # Output: + # # + # # + # # + # + # When the access mode is :col, + # calls the block with each column as a 2-element array + # containing the header and an \Array of column fields: + # table.by_col! # => # + # table.each {|column_data| p column_data } + # Output: + # ["Name", ["foo", "bar", "baz"]] + # ["Value", ["0", "1", "2"]] + # + # Returns a new \Enumerator if no block is given: + # table.each # => #:each> + def each(&block) + return enum_for(__method__) { @mode == :col ? headers.size : size } unless block_given? + + if @mode == :col + headers.each.with_index do |header, i| + yield([header, @table.map {|row| row[header, i]}]) + end + else + @table.each(&block) + end + + self # for chaining + end + + # :call-seq: + # table == other_table -> true or false + # + # Returns +true+ if all each row of +self+ == + # the corresponding row of +other_table+, otherwise, +false+. + # + # The access mode does no affect the result. + # + # Equal tables: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # other_table = CSV.parse(source, headers: true) + # table == other_table # => true + # + # Different row count: + # other_table.delete(2) + # table == other_table # => false + # + # Different last row: + # other_table << ['bat', 3] + # table == other_table # => false + def ==(other) + return @table == other.table if other.is_a? CSV::Table + @table == other + end + + # :call-seq: + # table.to_a -> array_of_arrays + # + # Returns the table as an \Array of \Arrays; + # the headers are in the first row: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.to_a # => [["Name", "Value"], ["foo", "0"], ["bar", "1"], ["baz", "2"]] + def to_a + array = [headers] + @table.each do |row| + array.push(row.fields) unless row.header_row? + end + + array + end + + # :call-seq: + # table.to_csv(**options) -> csv_string + # + # Returns the table as \CSV string. + # See {Options for Generating}[../CSV.html#class-CSV-label-Options+for+Generating]. + # + # Defaults option +write_headers+ to +true+: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.to_csv # => "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # + # Omits the headers if option +write_headers+ is given as +false+ + # (see {Option +write_headers+}[../CSV.html#class-CSV-label-Option+write_headers]): + # table.to_csv(write_headers: false) # => "foo,0\nbar,1\nbaz,2\n" + # + # Limit rows if option +limit+ is given like +2+: + # table.to_csv(limit: 2) # => "Name,Value\nfoo,0\nbar,1\n" + def to_csv(write_headers: true, limit: nil, **options) + array = write_headers ? [headers.to_csv(**options)] : [] + limit ||= @table.size + limit = @table.size + 1 + limit if limit < 0 + limit = 0 if limit < 0 + @table.first(limit).each do |row| + array.push(row.fields.to_csv(**options)) unless row.header_row? + end + + array.join("") + end + alias_method :to_s, :to_csv + + # + # Extracts the nested value specified by the sequence of +index+ or +header+ objects by calling dig at each step, + # returning nil if any intermediate step is nil. + # + def dig(index_or_header, *index_or_headers) + value = self[index_or_header] + if value.nil? + nil + elsif index_or_headers.empty? + value + else + unless value.respond_to?(:dig) + raise TypeError, "#{value.class} does not have \#dig method" + end + value.dig(*index_or_headers) + end + end + + # :call-seq: + # table.inspect => string + # + # Returns a US-ASCII-encoded \String showing table: + # - Class: CSV::Table. + # - Access mode: :row, :col, or :col_or_row. + # - Size: Row count, including the header row. + # + # Example: + # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n" + # table = CSV.parse(source, headers: true) + # table.inspect # => "#\nName,Value\nfoo,0\nbar,1\nbaz,2\n" + # + def inspect + inspected = +"#<#{self.class} mode:#{@mode} row_count:#{to_a.size}>" + summary = to_csv(limit: 5) + inspected << "\n" << summary if summary.encoding.ascii_compatible? + inspected + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/version.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/version.rb new file mode 100644 index 000000000..227f7f75a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/version.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class CSV + # The version of the installed library. + VERSION = "3.3.5" +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/writer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/writer.rb new file mode 100644 index 000000000..b59f111e7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/csv-3.3.5/lib/csv/writer.rb @@ -0,0 +1,209 @@ +# frozen_string_literal: true + +require_relative "input_record_separator" +require_relative "row" + +class CSV + # Note: Don't use this class directly. This is an internal class. + class Writer + # + # A CSV::Writer receives an output, prepares the header, format and output. + # It allows us to write new rows in the object and rewind it. + # + attr_reader :lineno + attr_reader :headers + + def initialize(output, options) + @output = output + @options = options + @lineno = 0 + @fields_converter = nil + prepare + if @options[:write_headers] and @headers + self << @headers + end + @fields_converter = @options[:fields_converter] + end + + # + # Adds a new row + # + def <<(row) + case row + when Row + row = row.fields + when Hash + row = @headers.collect {|header| row[header]} + end + + @headers ||= row if @use_headers + @lineno += 1 + + if @fields_converter + row = @fields_converter.convert(row, nil, lineno) + end + + i = -1 + converted_row = row.collect do |field| + i += 1 + quote(field, i) + end + line = converted_row.join(@column_separator) + @row_separator + if @output_encoding + line = line.encode(@output_encoding) + end + @output << line + + self + end + + # + # Winds back to the beginning + # + def rewind + @lineno = 0 + @headers = nil if @options[:headers].nil? + end + + private + def prepare + @encoding = @options[:encoding] + + prepare_header + prepare_format + prepare_output + end + + def prepare_header + headers = @options[:headers] + case headers + when Array + @headers = headers + @use_headers = true + when String + @headers = CSV.parse_line(headers, + col_sep: @options[:column_separator], + row_sep: @options[:row_separator], + quote_char: @options[:quote_character]) + @use_headers = true + when true + @headers = nil + @use_headers = true + else + @headers = nil + @use_headers = false + end + return unless @headers + + converter = @options[:header_fields_converter] + @headers = converter.convert(@headers, nil, 0, []) + @headers.each do |header| + header.freeze if header.is_a?(String) + end + end + + def prepare_force_quotes_fields(force_quotes) + @force_quotes_fields = {} + force_quotes.each do |name_or_index| + case name_or_index + when Integer + index = name_or_index + @force_quotes_fields[index] = true + when String, Symbol + name = name_or_index.to_s + if @headers.nil? + message = ":headers is required when you use field name " + + "in :force_quotes: " + + "#{name_or_index.inspect}: #{force_quotes.inspect}" + raise ArgumentError, message + end + index = @headers.index(name) + next if index.nil? + @force_quotes_fields[index] = true + else + message = ":force_quotes element must be " + + "field index or field name: " + + "#{name_or_index.inspect}: #{force_quotes.inspect}" + raise ArgumentError, message + end + end + end + + def prepare_format + @column_separator = @options[:column_separator].to_s.encode(@encoding) + row_separator = @options[:row_separator] + if row_separator == :auto + @row_separator = InputRecordSeparator.value.encode(@encoding) + else + @row_separator = row_separator.to_s.encode(@encoding) + end + @quote_character = @options[:quote_character] + force_quotes = @options[:force_quotes] + if force_quotes.is_a?(Array) + prepare_force_quotes_fields(force_quotes) + @force_quotes = false + elsif force_quotes + @force_quotes_fields = nil + @force_quotes = true + else + @force_quotes_fields = nil + @force_quotes = false + end + unless @force_quotes + @quotable_pattern = + Regexp.new("[\r\n".encode(@encoding) + + Regexp.escape(@column_separator) + + Regexp.escape(@quote_character.encode(@encoding)) + + "]".encode(@encoding)) + end + @quote_empty = @options.fetch(:quote_empty, true) + end + + def prepare_output + @output_encoding = nil + return unless @output.is_a?(StringIO) + + output_encoding = @output.internal_encoding || @output.external_encoding + if @encoding != output_encoding + if @options[:force_encoding] + @output_encoding = output_encoding + else + compatible_encoding = Encoding.compatible?(@encoding, output_encoding) + if compatible_encoding + @output.set_encoding(compatible_encoding) + @output.seek(0, IO::SEEK_END) + end + end + end + end + + def quote_field(field) + field = String(field) + encoded_quote_character = @quote_character.encode(field.encoding) + encoded_quote_character + + field.gsub(encoded_quote_character, + encoded_quote_character * 2) + + encoded_quote_character + end + + def quote(field, i) + if @force_quotes + quote_field(field) + elsif @force_quotes_fields and @force_quotes_fields[i] + quote_field(field) + else + if field.nil? # represent +nil+ fields as empty unquoted fields + "" + else + field = String(field) # Stringify fields + # represent empty fields as empty quoted fields + if (@quote_empty and field.empty?) or (field.valid_encoding? and @quotable_pattern.match?(field)) + quote_field(field) + else + field # unquoted field + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/CHANGES.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/CHANGES.txt new file mode 100644 index 000000000..bed32be25 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/CHANGES.txt @@ -0,0 +1,828 @@ +# -*- coding: utf-8 -*- +# $Release: 2.7.0 $ +# copyright(c) 2006-2011 kuwata-lab.com all rights reserved. + +- release: 2.7.0 + date: 2011-04-01 + enhancements: + + - | + New option ':bufvar' supported to specify buffer variable name. + + ex: + input = "Hello <%= name %>!" + eruby = Erubis::Eruby.new(input) + puts eruby.src + #=> _buf = ''; _buf << "Hello "; _buf << ( name ).to_s; _buf << '!'; + + eruby = Erubis::Eruby.new(input, :bufvar=>'@_out') + puts eruby.src + #=> @_out = ''; @_out << 'Hello '; @_out << ( name ).to_s; @_out << '!'; + + - | + New enhancer 'PrefixedLineEnhancer' which is a customizable version + of PercentLineEnhancer. + The difference between PrefixedLineEnhancer and PercentLineEnhancer is: + * You can indent Ruby statetment lines starting with '%' + * You can specify prefix character by :prefixchar option. + + ex: + class MyEruby < Erubis::Eruby + include Erubis::PrefixedLineEnhancer + end + input = < + % for item in @items +
  • <%= item %>
  • + % end + %% you can indent '%' lines + + END + eruby = MyEruby.new(input, :prefixchar=>'%') # default '%' + puts eruby.src + + output: + _buf = ''; _buf << '
      + '; for item in @items + _buf << '
    • '; _buf << ( item ).to_s; _buf << '
    • + '; end + % you can indent '%' lines + _buf << '
    + '; + _buf.to_s + + - | + Add helper CGI script. See 'public_html/README.txt' for details. + + - | + Rubinius is supported as first-class Ruby implementation. + + - | + C++ support. Try '-l cpp' command-line option. + + + changes: + + - | + Remove dependency to 'abstract' library. + You don't need to install 'abstract' gem. + + - | + Erubis::Eruby#load_file() now sets cache file timestamp to the same + value as original eRuby file. For example, if you restore eRuby files + from backup, Erubis::Eruby#load_file() can detect it and generate + cache file again. + + ## generates cache file (A.rhtml.cache). + eruby = Erubis::Eruby.load_file('A.rhtml') + p File.mtime('A.rhtml') == File.mtime('A.rhtml.cache') #=> true + + + +- release: 2.6.6 + date: 2010-06-27 + bugfixes: + + - | + Fixed a bug around InterporationEnhancer and FastEruby to escape back-quote. (thanks to Andrew R Jackson) + + +- release: 2.6.5 + date: 2009-07-20 + bugfixes: + + - | + Fixed bug around '-z' option. + + +- release: 2.6.4 + date: 2009-02-18 + enhancements: + + - | + Rails 2.2 and 2.3 support. + + + +- release: 2.6.3 + date: 2009-02-07 + bugfixes: + + - Enhancer name was not displayed in Ruby 1.9.1 when it was missing. + + - Command option argument name was not displayed correctly as a part of error message. + + - MethoNotFound error was raised when invalid option was specified. + + +- release: 2.6.2 + date: 2008-06-12 + enhancements: + + - | + Ruby 1.9 support. + + bugfixes: + + - | + Fixed installation problem on Windows (Thanks to Tim Morgan and Allen). + + +- release: 2.6.1 + date: 2008-06-06 + enhancements: + + - | + Rails 2.1 support. (special thanks José Valim) + + + +- release: 2.6.0 + date: 2008-05-05 + enhancements: + + - | + Improved support of Ruby on Rails 2.0.2. + New class ActionView::TemplateHandlers::Erubis is defined and + registered as default handler of *.html.erb and *.rhtml. + + - | + '<%% %>' and '<%%= %>' are converted into '<% %>' and '<%= %>' respectively. + This is for compatibility with ERB. + + ex1.rhtml: +
      + <%% for item in @list %> +
    • <%%= item %>
    • + <%% end %> +
    + + result: + $ erubis ex1.rhtml +
      + <% for item in @list %> +
    • <%= item %>
    • + <% end %> +
    + + - | + '<%= -%>' removes tail spaces and newlines. + This is for compatibiliy with ERB when trim mode is '-'. + '<%= =%>' also removes tail spaces and newlines, and this is + Erubis-original enhancement (cooler than '<%= -%>', isn't it?). + + ex2.rhtml: +
    + <%= @var -%> # or <%= @var =%> +
    + + result (version 2.6.0): + $ erubis -c '{var: "AAA\n"}' ex2.rhtml +
    + AAA +
    + + result (version 2.5.0): + $ erubis -c '{var: "AAA\n"}' ex2.rhtml +
    + AAA + +
    + + - | + Erubis::Eruby.load_file() now allows you to change cache filename. + + ex. + eruby = Erubis::Eruby.load_file("ex3.rhtml", + :cachename=>'ex3.rhtml.cache') + + +- release: 2.5.0 + date: 2008-01-30 + enhancements: + + - | + Ruby on Rails 2.0 support. + If you are using preprocessing, notice that _?('foo.id') will be NG + because it contains period ('.') character. + + -------------------- + + [%= link_to 'Edit', edit_user_path(_?('@user.id')) %] + [%= link_to 'Show', @user %] + [%= link_to 'Delete', @user, :confirm=>'OK?', :method=>:delete %] + + + <%= user_id = @user.id %> + [%= link_to 'Edit', edit_user_path(_?('user_id')) %] + [%= link_to 'Show', :action=>'show', :id=>_?('user_id') %] + [%= link_to 'Delete', {:action=>'destroy', :id=>_?('user_id')}, + {:confirm=>'OK?', :method=>:delete} %] + -------------------- + + - | + (experimental) + Rails form helper methods for preprocessing are added. + These helper methos are available with preprocessing. + + ex. _form.rhtml + -------------------- + Name: <%= text_field :user, :name %> + Name: [%= pp_text_field :user, :name %] + -------------------- + + preprocessed: + -------------------- + Name: <%= text_field :user, :name %> + Name: + -------------------- + + Ruby code: + -------------------- + _buf << ' + Name: '; _buf << ( text_field :stock, :name ).to_s; _buf << ' + Name: + '; + -------------------- + + This shows that text_filed() is called every time when rendering, + but pp_text_filed() is called only once when loading template, + so pp_text_field() with prepocessing is much faster than text_field(). + + See User's guide for details. + http://www.kuwata-lab.com/erubis/users-guide.05.html#rails-formhelpers + +# +- release: 2.4.1 + date: 2007-09-25 + enhancements: + + - | + Add new section 'evaluate(context) v.s. result(binding)' to user's guide. + This section describes why Erubis::Eruby#evaluate(context) is recommended + rather than Erubis::Eruby#result(binding). + User's Guide > Other Topics > evaluate(context) v.s. result(binding) + http://www.kuwata-lab.com/erubis/users-guide.06.html#topics-context-vs-binding + + - | + Add new command-line property '--docwrite={true|false}' to + Erubis::Ejavascript. + If this property is true then 'document.write(_buf.join(""));' is used + as postamble and if it is false then '_buf.join("")' is used. + Default is true for compatibility reason but it will be false in the + future release. + (This feature was proposed by D.Dribin. Thank you.) + + bugfix: + + - | + When using Erubis::Eruby#evaluate(), changing local variables in + templates have affected to variables accessible with TOPLEVEL_BINDING. + It means that if you change variables in templates, it is possible to + change variables in main program. + This was a bug and is now fixed not to affect to variables in main + program. + + ex. template.rhtml + -------------------- + <% for x in @items %> + item = <%= x %> + <% end %> + -------------------- + + ex. main-program.rb + -------------------- + require 'erubis' + x = 10 + items = ['foo', 'bar', 'baz'] + eruby = Erubis::Eruby.new(File.read('template.rhtml')) + s = eruby.evaluate(:items=>items) + print s + $stderr.puts "*** debug: x=#{x.inspect}" #=> x="baz" (2.4.0) + #=> x=10 (2.4.1) + -------------------- + + - | + PercentLineEnhancer was very slow. Now performance problem is solved. + + +# +- release: 2.4.0 + date: 2007-07-19 + enhancements: + + - | + Preprocessing is supported by Ruby on Rails helper. + Preprocessing makes Ruby on Rails application about 20-40 percent faster. + + For example, + + [%= link_to 'Show', :action=>'show', :id=>_?('@user.id') %] + + is evaluate by preprocessor and expanded into the following + when template file is loaded. + + Show + + It means that link_to() is not called when template is rendered + and rendering speed will be much faster in the result. + + See User's Guide for details. + + - | + Erubis::Eruby#evaluate() (or Erubis::RubyEvaluator#evaluate()) now + creates Proc object from @src and eval it. + + def evaluate(context=Context.new) + context = Context.new(context) if context.is_a?(Hash) + @_proc ||= eval("proc { #{@src} }", TOPLEVEL_BINDING, @filename || '(erubis)') + return context.instance_eval(&@_proc) + end + + This makes evaluate() much faster when eruby object is reused. + + - | + Erubis::Eruby#def_method() is supported. + This method defines ruby code as instance method or singleton metod. + + require 'erubis' + s = "hello <%= name %>" + eruby = Erubis::Eruby.new(s) + filename = 'hello.rhtml' + + ## define instance method to Dummy class (or module) + class Dummy; end + eruby.def_method(Dummy, 'render(name)', filename) # filename is optional + p Dummy.new.render('world') #=> "hello world" + + ## define singleton method to an object + obj = Object.new + eruby.def_method(obj, 'render(name)', filename) # filename is optional + p obj.render('world') #=> "hello world" + + This is equivarent to ERB#def_method(). + + - | + Erubis::XmlHelper.url_escape() and u() which is alias of url_escape() + are added. + This is equivarent to ERB#Util.url_escape(). + + + bugfix: + - Help message was not shown when '-h' is specified. Fixed. + - 'def method()' was not availabe in template file. Fixed. + + +# +- release: 2.3.1 + date: 2007-05-26 + bugfix: + - A serious bug in 'helpers/rails_helper.rb' is fixed. + You must be update if you are using Erubis with Ruby on Rails. + + +# +- release: 2.3.0 + date: 2007-05-23 + enhancements: + - | + New class 'Erubis::FastEruby' is added. + It is a subclass of Erubis::Eruby and includes InterpolationEnhancer. + Erubis::FastEruby is compatible with and faster than Erubis::Eruby. + + - | + New enhancer 'InterpolationEnhancer' is added. + This enhancer uses expression interpolation to eliminate method call + of String#<<. In the result, this enhancer makes Eruby a little faster. + + -------------------- + ## Assume that input is '<%=name%>'. + ## Eruby convert input into the following code. String#<< is called 5 times. + _buf << ''; _buf << (name).to_s; _buf << ''; + + ## When InterpolationEnhancer is used, String#<< is called only once. + _buf << %Q`#{name}`; + -------------------- + + - | + New enhancer 'ErboutEnhancer' is added. + ErboutEnhancer set '_erbout' as well as '_buf' to be compatible with ERB. + + ex. + ==================== + $ cat ex.rhtml +

    Hello

    + $ erubis -x ex.rhtml + _buf = ''; _buf << '

    Hello

    + '; + _buf.to_s + $ erubis -xE Erbout ex.rhtml + _erbout = _buf = ''; _buf << '

    Hello

    + '; + _buf.to_s + ==================== + + - | + [experimental] + New enhancer 'DeleteIndentEnhancer' is added. + This enhancer deletes indentation of HTML file. + + ex. + ==================== + $ cat ex.rhtml +
    +
      + <% for item in ['AAA', 'BBB', 'CCC'] %> +
    • <%= item %>
    • + <% end %> +
    +
    + $ erubis ex.rhtml +
    +
      +
    • AAA
    • +
    • BBB
    • +
    • CCC
    • +
    +
    + $ erubis -E DeleteIndent ex.rhtml +
    +
      +
    • AAA
    • +
    • BBB
    • +
    • CCC
    • +
    +
    + ==================== + + - | + Mod_ruby is supported (very thanks to Andrew R Jackson!). + See users-guide and 'contrib/erubis-run.rb' for details. + + - | + New command-line option '-X', '-N', '-U', and '-C' are added. + These are intended to be a replacement of 'notext' command. + '-X' shows only ruby statements and expressions. + '-N' adds line numbers. + '-U' compress empty lines into a line. + '-C' removes empty lines. + + + changes: + + - | + 'helpers/rails_helper.rb' is changed to use ErboutEnhancer. + The following is an examle to use Erubis with Ruby on Rails. + + File 'config/environment.rb': + ---------------------------------------- + require 'erubis/helpers/rails_helper' + #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby # or Erubis::FastEruby + #Erubis::Helpers::RailsHelper.init_properties = {} + #Erubis::Helpers::RailsHelper.show_src = false # set true for debugging + ---------------------------------------- + + - | + Command 'notext' has been removed. Use '-X', '-N', '-U', and '-C' + instead. + + - | + Tab characters in YAML file are expaneded automatically. + If you want not to expand tab characters, add command-line optio '-T'. + + - | + Benchmark scripts (benchmark/bench.*) are rewrited. + + - | + Users-guide (doc/users-guide.html) is updated. + + + +# +- release: 2.2.0 + date: 2007-02-11 + enhancements: + - | + Performance tuned up. Release 2.2.0 works about 8 percent faster + than 2.1.0. + As a result, Erubis works more than 10 percent faster than eruby. + (eruby is the extension module of eRuby written in C.) + + - | + Support of Ruby on Rails improved. + If you want to use Erubis with Ruby on Rails, add the following code + into your 'config/environment.rb' and restart web server. + This will set Erubis as eRuby compiler in Ruby on Rails instead of ERB. + + -------------------- + require 'erubis/helpers/rails_helper' + #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby + #Erubis::Helpers::RailsHelper.init_properties = {} + #Erubis::Helpers::RailsHelper.show_src = true + -------------------- + + Methods 'capture()' and 'content_for()' of ActionView::Helpers::CaptureHelper + are available. Methd ActionView::Helpers::TextHelper#concat() is also available. + + If Erubis::Helpers::RailsHelper.show_src is ture, Erubis prints converted + Ruby code into log file (such as 'log/development.log'). + + - | + Erubis::Engine.load_file(filename) creates cache file (filename + + '.cache') automatically if cache file is old or not exist. + Caching makes Erubis about 40-50 percent faster. + + ex. + -------------------- + require 'erubis' + eruby = Erubis::Eruby.load_file('example.rhtml') + ## cache file 'example.rhtml.cache' is created automatically + -------------------- + + - | + Command-line option '-f datafile' can take Ruby script ('*.rb') + as well as YAML file ('*.yaml' or '*.yml'). + + ex. + ==================== + $ cat context.rb + @title = 'Example' + @list = %w[AAA BBB CCC] + $ cat example.rhtml +

    <%= @title %>

    +
      + <% for item in @list %> +
    • <%= item %>
    • + <% end %> +
    + $ erubis -f context.rb example.rhtml +

    Example

    +
      +
    • AAA
    • +
    • BBB
    • +
    • CCC
    • +
    + ==================== + + - | + New command-line option '-c context' support. It takes context string + in YAML inline style or Ruby code style. + + ex. YAML inline style + ==================== + $ erubis -c '{title: Example, list: [AAA, BBB, CCC]}' example.rhtml + ==================== + + ex. Ruby style + ==================== + $ erubis -c '@title="Example"; @list=%w[AAA BBB CCC]' example.rhtml + ==================== + + - | + New command-line option '-z' (syntax checking) support. It is similar + to 'erubis -x file.rhtml | ruby -wc', but it can take several filenames. + + ex. + ==================== + $ erubis -z app/views/*/*.rhtml + Syntax OK + ==================== + + - | + New constant Erubis::VERSION added. + + + changes: + - | + Class Erubis::Eruby changed to include Erubis::StringBufferEnhancer + instead of Erubis::ArrayBufferEnhancer. + This is for Ruby on Rails support. + + ex. + ==================== + $ cat example.rhtml +
      + <% for item in @list %> +
    • <%= item %>
    • + <% end %> +
    + $ erubis -x example.rhtml + _buf = ''; _buf << '
      + '; for item in @list + _buf << '
    • '; _buf << ( item ).to_s; _buf << '
    • + '; end + _buf << '
    + '; + _buf.to_s + ==================== + + - | + Erubis::StringBufferEnhancer#add_postamble() prints "_buf.to_s" + instead of "_buf". + This is useful for 'erubis -x file.rhtml | ruby -wc'. + + - | + Command-line option '-T' is removed. Use '--trim=false' instead. + + - | + License is changed to MIT License. + + - | + Embedded pattern '<%- -%>' can be handled. + + +# +- release: 2.1.0 + date: 2006-09-23 + enhancements: + - | + Ruby on Rails support. Add the following code to + your 'app/controllers/application.rb' and restart web server. + + -------------------- + require 'erubis/helper/rails' + suffix = 'erubis' + ActionView::Base.register_template_handler(suffix, Erubis::Helper::RailsTemplate) + #Erubis::Helper::RailsTemplate.engine_class = Erubis::EscapedEruby ## or Erubis::PI::Eruby + #Erubis::Helper::RailsTemplate.default_properties = { :escape=>true, :escapefunc=>'h' } + -------------------- + + And rename your view template as 'xxx.erubis'. + If you got the "(eval):10:in `render': no block given" error, + use '@content_for_layout' instead 'yield' in your layout template. + + - | + Another eRuby engine (PIEngine) support. This engine doesn't + break HTML design because it uses Processing Instructions (PI) + '' as embedded pattern instead of '<% .. %>'. + + example.rhtml + -------------------- + + + + + + + +
    @!{item}@
    + -------------------- + + compile: + ==================== + $ erubis -x --pi example.rhtml + _buf = []; _buf << ' + '; @list.each_with_index do |item, i| + klass = i % 2 == 0 ? 'odd' : 'even' + _buf << ' + + + '; end + _buf << '
    '; _buf << (item).to_s; _buf << '
    + '; + _buf.join + ==================== + + - | + Add new command 'notext' which remove text part from eRuby + script and leaves only Ruby code. + This is very useful for debug of eRuby script. + + example2.rhtml + -------------------- + + + + <% @list.each_with_index do |item, i| %> + <% klass = i % 2 == 0 ? 'odd' : 'even' %> + + + + <% end %> +
    <%== item %>
    + + + -------------------- + + command line example: + ==================== + $ notext example2.rhtml + _buf = []; + + + @list.each_with_index do |item, i| ; + klass = i % 2 == 0 ? 'odd' : 'even' ; + _buf << ( klass ).to_s; + _buf << Erubis::XmlHelper.escape_xml( item ); + + end ; + + + + _buf.join + $ notext -nc example2.rhtml + 1: _buf = []; + 4: @list.each_with_index do |item, i| ; + 5: klass = i % 2 == 0 ? 'odd' : 'even' ; + 6: _buf << ( klass ).to_s; + 7: _buf << Erubis::XmlHelper.escape_xml( item ); + 9: end ; + 13: _buf.join + ==================== + + - | + Add new enhance 'NoCode' which removes ruby code from + eRuby script and leaves only HTML text part. + It is very useful to validate HTML of eRuby script. + + command-line example: + ==================== + $ erubis -x -E NoCode example2.rhtml + + + + + + + + + +
    + + + ==================== + + changes: + - License is changed to LGPL. + - Command-line property '--escape=name' is renamed to + '--escapefunc=name'. + - When command-line option '-l perl' is specified, function + 'encode_entities()' is used ad escaping function which is + available wth HTML::Entities module. + + bugfix: + - There is a certain pattern which makes Engine#convert() + too slow. Now Engne#convert() is fixed not to be slown. + - Command name is now displayed when '-h' is specified. + + +# +- release: 2.0.1 + date: 2006-06-21 + bugfix: + - some minor bugs are fixed + + +# +- release: 2.0.0 + date: 2006-05-20 + changes: + - module 'PrintEnhancer' is renamed to 'PrintEnabledEnahncer' + - module 'FastEnhancer' and class 'FastEruby' is obsolete because they are integrated into Eruby class + - Eruby#evaluate() calls instance_eval() instead of eval() + - XmlEruby.escape_xml() is moved to XmlHelper.escape_xml() + enhancements: + - multi programming language support (Ruby/PHP/C/Java/Scheme/Perl/Javascript) + - class Eruby runs very fast because FastEnhancer module is integrated into Eruby by default + - TinyEruby class (tiny.rb) is added + - module ArrayBufferEnhancer added + - module ArrayEnhancer added + - module BiPatternEnhancer added + - module EscapeEnhancer added + - module HeaderFooterEnhancer added + - module NoTextEnhancer added + - module PercentLineEnhancer added + - module PrintEnabledEnhancer added + - module PrintOutEnhancer added + - module SimplifyEnhancer added + - module StringBufferEnhancer added + - module StringIOEnhancer added + - command-line option '-b' (body only) added + - command-line option '-e' (escape) added + - command-line option '-l' (lang) added + - command-line option '-E' (enhancer) added + - command-line option '-I' (require path) added + - command-line option '-K' (kanji code) added + - command-line option '-S' (string to symbol) added + - command-line option '-B' (call result(binding())) added + + +# +- release: 1.1.0 + date: 2006-03-05 + enhancements: + - '<%# ... %>' is supported + - PrintEnhancer, PrintEruby, and PrintXmlEruby added + +- release: 1.0.1 + date: 2006-02-01 + bugfixes: + - bin/erubis is available with RubyGems + + +# +- release: 1.0.0 + date: 2006-02-01 + bugfixes: + - first release + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/MIT-LICENSE b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/MIT-LICENSE new file mode 100644 index 000000000..c0e8bda58 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/MIT-LICENSE @@ -0,0 +1,20 @@ +copyright(c) 2006-2011 kuwata-lab.com all rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/README.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/README.txt new file mode 100644 index 000000000..219794847 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/README.txt @@ -0,0 +1,102 @@ += README + +release:: 2.7.0 +copyright:: copyright(c) 2006-2011 kuwata-lab.com all rights reserved. + + + +== About Erubis + +Erubis is an implementation of eRuby. It has the following features. +* Very fast, almost three times faster than ERB and even 10% faster than eruby +* Multi-language support (Ruby/PHP/C/Java/Scheme/Perl/Javascript) +* Auto escaping support +* Auto trimming spaces around '<% %>' +* Embedded pattern changeable (default '<% %>') +* Enable to handle Processing Instructions (PI) as embedded pattern (ex. '') +* Context object available and easy to combine eRuby template with YAML datafile +* Print statement available +* Easy to extend and customize in subclass +* Ruby on Rails support + +Erubis is implemented in pure Ruby. It requires Ruby 1.8 or higher. +Erubis now supports Ruby 1.9. + +See doc/users-guide.html for details. + + + +== Installation + +* If you have installed RubyGems, just type gem install erubis. + + $ sudo gem install erubis + +* Else install abstract[http://rubyforge.org/projects/abstract/] at first, + and download erubis_X.X.X.tar.bz2 and install it by setup.rb. + + $ tar xjf abstract_X.X.X.tar.bz2 + $ cd abstract_X.X.X/ + $ sudo ruby setup.rb + $ cd .. + $ tar xjf erubis_X.X.X.tar.bz2 + $ cd erubis_X.X.X/ + $ sudo ruby setup.rb + +* (Optional) It is able to merge 'lib/**/*.rb' into 'bin/erubis' by + 'contrib/inline-require' script. + + $ tar xjf erubis_X.X.X.tar.bz2 + $ cd erubis_X.X.X/ + $ cp /tmp/abstract_X.X.X/lib/abstract.rb lib + $ unset RUBYLIB + $ contrib/inline-require -I lib bin/erubis > contrib/erubis + + + +== Ruby on Rails Support + +Erubis supports Ruby on Rails. +All you have to do is to add the following code into your 'config/environment.rb' +and restart web server. + + require 'erubis/helpers/rails_helper' + #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby + #Erubis::Helpers::RailsHelper.init_properties = {} + #Erubis::Helpers::RailsHelper.show_src = nil + +If Erubis::Helpers::RailsHelper.show_src is ture, Erubis prints converted Ruby code +into log file ('log/development.log' or so). It is useful for debug. + + + +== Exploring Guide + +If you are exploring Eruby, see the following class at first. +* Erubis::TinyEruby (erubis/tiny.rb) -- + the most simple eRuby implementation. +* Erubis::Engine (erubis/engine.rb) -- + base class of Eruby, Ephp, Ejava, and so on. +* Erubis::Eruby (erubis/engine/eruby.rb) -- + engine class for eRuby. +* Erubis::Converter (erubis/converter.rb) -- + convert eRuby script into Ruby code. + + + +== Benchmark + +'benchmark/erubybenchmark.rb' is a benchmark script of Erubis. +Try 'ruby erubybenchmark.rb' in benchmark directory. + + + +== License + +MIT License + + + +== Author + +makoto kuwata diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/erubis b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/erubis new file mode 100755 index 000000000..96385d3eb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/erubis @@ -0,0 +1,3468 @@ +#!/usr/bin/env ruby + +### +### $Release: 2.7.0 $ +### copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +### + +#--begin of require 'erubis/main' +### +### $Release: 2.7.0 $ +### copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +### + +require 'yaml' +#--begin of require 'erubis' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +## +## an implementation of eRuby +## +## ex. +## input = <<'END' +##
      +## <% for item in @list %> +##
    • <%= item %> +## <%== item %>
    • +## <% end %> +##
    +## END +## list = ['', 'b&b', '"ccc"'] +## eruby = Erubis::Eruby.new(input) +## puts "--- code ---" +## puts eruby.src +## puts "--- result ---" +## context = Erubis::Context.new() # or new(:list=>list) +## context[:list] = list +## puts eruby.evaluate(context) +## +## result: +## --- source --- +## _buf = ''; _buf << '
      +## '; for item in @list +## _buf << '
    • '; _buf << ( item ).to_s; _buf << ' +## '; _buf << ' '; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '
    • +## '; end +## _buf << '
    +## '; +## _buf.to_s +## --- result --- +##
      +##
    • +## <aaa>
    • +##
    • b&b +## b&b
    • +##
    • "ccc" +## "ccc"
    • +##
    +## + + +module Erubis + VERSION = ('$Release: 2.7.0 $' =~ /([.\d]+)/) && $1 +end + +#--begin of require 'erubis/engine' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +#--begin of require 'erubis/generator' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--begin of require 'erubis/util' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +module Kernel + + ## + ## raise NotImplementedError + ## + def not_implemented #:doc: + backtrace = caller() + method_name = (backtrace.shift =~ /`(\w+)'$/) && $1 + mesg = "class #{self.class.name} must implement abstract method '#{method_name}()'." + #mesg = "#{self.class.name}##{method_name}() is not implemented." + err = NotImplementedError.new mesg + err.set_backtrace backtrace + raise err + end + private :not_implemented + +end +#--end of require 'erubis/util' + +module Erubis + + + ## + ## code generator, called by Converter module + ## + module Generator + + def self.supported_properties() # :nodoc: + return [ + [:escapefunc, nil, "escape function name"], + ] + end + + attr_accessor :escapefunc + + def init_generator(properties={}) + @escapefunc = properties[:escapefunc] + end + + + ## (abstract) escape text string + ## + ## ex. + ## def escape_text(text) + ## return text.dump + ## # or return "'" + text.gsub(/['\\]/, '\\\\\&') + "'" + ## end + def escape_text(text) + not_implemented + end + + ## return escaped expression code (ex. 'h(...)' or 'htmlspecialchars(...)') + def escaped_expr(code) + code.strip! + return "#{@escapefunc}(#{code})" + end + + ## (abstract) add @preamble to src + def add_preamble(src) + not_implemented + end + + ## (abstract) add text string to src + def add_text(src, text) + not_implemented + end + + ## (abstract) add statement code to src + def add_stmt(src, code) + not_implemented + end + + ## (abstract) add expression literal code to src. this is called by add_expr(). + def add_expr_literal(src, code) + not_implemented + end + + ## (abstract) add escaped expression code to src. this is called by add_expr(). + def add_expr_escaped(src, code) + not_implemented + end + + ## (abstract) add expression code to src for debug. this is called by add_expr(). + def add_expr_debug(src, code) + not_implemented + end + + ## (abstract) add @postamble to src + def add_postamble(src) + not_implemented + end + + + end + + +end +#--end of require 'erubis/generator' +#--begin of require 'erubis/converter' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/util' + +module Erubis + + + ## + ## convert + ## + module Converter + + attr_accessor :preamble, :postamble, :escape + + def self.supported_properties # :nodoc: + return [ + [:preamble, nil, "preamble (no preamble when false)"], + [:postamble, nil, "postamble (no postamble when false)"], + [:escape, nil, "escape expression or not in default"], + ] + end + + def init_converter(properties={}) + @preamble = properties[:preamble] + @postamble = properties[:postamble] + @escape = properties[:escape] + end + + ## convert input string into target language + def convert(input) + codebuf = "" # or [] + @preamble.nil? ? add_preamble(codebuf) : (@preamble && (codebuf << @preamble)) + convert_input(codebuf, input) + @postamble.nil? ? add_postamble(codebuf) : (@postamble && (codebuf << @postamble)) + @_proc = nil # clear cached proc object + return codebuf # or codebuf.join() + end + + protected + + ## + ## detect spaces at beginning of line + ## + def detect_spaces_at_bol(text, is_bol) + lspace = nil + if text.empty? + lspace = "" if is_bol + elsif text[-1] == ?\n + lspace = "" + else + rindex = text.rindex(?\n) + if rindex + s = text[rindex+1..-1] + if s =~ /\A[ \t]*\z/ + lspace = s + #text = text[0..rindex] + text[rindex+1..-1] = '' + end + else + if is_bol && text =~ /\A[ \t]*\z/ + #lspace = text + #text = nil + lspace = text.dup + text[0..-1] = '' + end + end + end + return lspace + end + + ## + ## (abstract) convert input to code + ## + def convert_input(codebuf, input) + not_implemented + end + + end + + + module Basic + end + + + ## + ## basic converter which supports '<% ... %>' notation. + ## + module Basic::Converter + include Erubis::Converter + + def self.supported_properties # :nodoc: + return [ + [:pattern, '<% %>', "embed pattern"], + [:trim, true, "trim spaces around <% ... %>"], + ] + end + + attr_accessor :pattern, :trim + + def init_converter(properties={}) + super(properties) + @pattern = properties[:pattern] + @trim = properties[:trim] != false + end + + protected + + ## return regexp of pattern to parse eRuby script + def pattern_regexp(pattern) + @prefix, @postfix = pattern.split() # '<% %>' => '<%', '%>' + #return /(.*?)(^[ \t]*)?#{@prefix}(=+|\#)?(.*?)-?#{@postfix}([ \t]*\r?\n)?/m + #return /(^[ \t]*)?#{@prefix}(=+|\#)?(.*?)-?#{@postfix}([ \t]*\r?\n)?/m + return /#{@prefix}(=+|-|\#|%)?(.*?)([-=])?#{@postfix}([ \t]*\r?\n)?/m + end + module_function :pattern_regexp + + #DEFAULT_REGEXP = /(.*?)(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m + #DEFAULT_REGEXP = /(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m + #DEFAULT_REGEXP = /<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m + DEFAULT_REGEXP = pattern_regexp('<% %>') + + public + + def convert_input(src, input) + pat = @pattern + regexp = pat.nil? || pat == '<% %>' ? DEFAULT_REGEXP : pattern_regexp(pat) + pos = 0 + is_bol = true # is beginning of line + input.scan(regexp) do |indicator, code, tailch, rspace| + match = Regexp.last_match() + len = match.begin(0) - pos + text = input[pos, len] + pos = match.end(0) + ch = indicator ? indicator[0] : nil + lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol) + is_bol = rspace ? true : false + add_text(src, text) if text && !text.empty? + ## * when '<%= %>', do nothing + ## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>' + if ch == ?= # <%= %> + rspace = nil if tailch && !tailch.empty? + add_text(src, lspace) if lspace + add_expr(src, code, indicator) + add_text(src, rspace) if rspace + elsif ch == ?\# # <%# %> + n = code.count("\n") + (rspace ? 1 : 0) + if @trim && lspace && rspace + add_stmt(src, "\n" * n) + else + add_text(src, lspace) if lspace + add_stmt(src, "\n" * n) + add_text(src, rspace) if rspace + end + elsif ch == ?% # <%% %> + s = "#{lspace}#{@prefix||='<%'}#{code}#{tailch}#{@postfix||='%>'}#{rspace}" + add_text(src, s) + else # <% %> + if @trim && lspace && rspace + add_stmt(src, "#{lspace}#{code}#{rspace}") + else + add_text(src, lspace) if lspace + add_stmt(src, code) + add_text(src, rspace) if rspace + end + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + add_text(src, rest) + end + + ## add expression code to src + def add_expr(src, code, indicator) + case indicator + when '=' + @escape ? add_expr_escaped(src, code) : add_expr_literal(src, code) + when '==' + @escape ? add_expr_literal(src, code) : add_expr_escaped(src, code) + when '===' + add_expr_debug(src, code) + end + end + + end + + + module PI + end + + ## + ## Processing Instructions (PI) converter for XML. + ## this class converts '' and '${...}' notation. + ## + module PI::Converter + include Erubis::Converter + + def self.desc # :nodoc: + "use processing instructions (PI) instead of '<% %>'" + end + + def self.supported_properties # :nodoc: + return [ + [:trim, true, "trim spaces around <% ... %>"], + [:pi, 'rb', "PI (Processing Instrunctions) name"], + [:embchar, '@', "char for embedded expression pattern('@{...}@')"], + [:pattern, '<% %>', "embed pattern"], + ] + end + + attr_accessor :pi, :prefix + + def init_converter(properties={}) + super(properties) + @trim = properties.fetch(:trim, true) + @pi = properties[:pi] if properties[:pi] + @embchar = properties[:embchar] || '@' + @pattern = properties[:pattern] + @pattern = '<% %>' if @pattern.nil? #|| @pattern == true + end + + def convert(input) + code = super(input) + return @header || @footer ? "#{@header}#{code}#{@footer}" : code + end + + protected + + def convert_input(codebuf, input) + unless @regexp + @pi ||= 'e' + ch = Regexp.escape(@embchar) + if @pattern + left, right = @pattern.split(' ') + @regexp = /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?|#{ch}(!*)?\{(.*?)\}#{ch}|#{left}(=+)(.*?)#{right}/m + else + @regexp = /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?|#{ch}(!*)?\{(.*?)\}#{ch}/m + end + end + # + is_bol = true + pos = 0 + input.scan(@regexp) do |pi_arg, stmt, rspace, + indicator1, expr1, indicator2, expr2| + match = Regexp.last_match + len = match.begin(0) - pos + text = input[pos, len] + pos = match.end(0) + lspace = stmt ? detect_spaces_at_bol(text, is_bol) : nil + is_bol = stmt && rspace ? true : false + add_text(codebuf, text) # unless text.empty? + # + if stmt + if @trim && lspace && rspace + add_pi_stmt(codebuf, "#{lspace}#{stmt}#{rspace}", pi_arg) + else + add_text(codebuf, lspace) if lspace + add_pi_stmt(codebuf, stmt, pi_arg) + add_text(codebuf, rspace) if rspace + end + else + add_pi_expr(codebuf, expr1 || expr2, indicator1 || indicator2) + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + add_text(codebuf, rest) + end + + #-- + #def convert_input(codebuf, input) + # parse_stmts(codebuf, input) + # #parse_stmts2(codebuf, input) + #end + # + #def parse_stmts(codebuf, input) + # #regexp = pattern_regexp(@pattern) + # @pi ||= 'e' + # @stmt_pattern ||= /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?/m + # is_bol = true + # pos = 0 + # input.scan(@stmt_pattern) do |pi_arg, code, rspace| + # match = Regexp.last_match + # len = match.begin(0) - pos + # text = input[pos, len] + # pos = match.end(0) + # lspace = detect_spaces_at_bol(text, is_bol) + # is_bol = rspace ? true : false + # parse_exprs(codebuf, text) # unless text.empty? + # if @trim && lspace && rspace + # add_pi_stmt(codebuf, "#{lspace}#{code}#{rspace}", pi_arg) + # else + # add_text(codebuf, lspace) + # add_pi_stmt(codebuf, code, pi_arg) + # add_text(codebuf, rspace) + # end + # end + # rest = $' || input + # parse_exprs(codebuf, rest) + #end + # + #def parse_exprs(codebuf, input) + # unless @expr_pattern + # ch = Regexp.escape(@embchar) + # if @pattern + # left, right = @pattern.split(' ') + # @expr_pattern = /#{ch}(!*)?\{(.*?)\}#{ch}|#{left}(=+)(.*?)#{right}/ + # else + # @expr_pattern = /#{ch}(!*)?\{(.*?)\}#{ch}/ + # end + # end + # pos = 0 + # input.scan(@expr_pattern) do |indicator1, code1, indicator2, code2| + # indicator = indicator1 || indicator2 + # code = code1 || code2 + # match = Regexp.last_match + # len = match.begin(0) - pos + # text = input[pos, len] + # pos = match.end(0) + # add_text(codebuf, text) # unless text.empty? + # add_pi_expr(codebuf, code, indicator) + # end + # rest = $' || input + # add_text(codebuf, rest) + #end + #++ + + def add_pi_stmt(codebuf, code, pi_arg) # :nodoc: + case pi_arg + when nil ; add_stmt(codebuf, code) + when 'header' ; @header = code + when 'footer' ; @footer = code + when 'comment'; add_stmt(codebuf, "\n" * code.count("\n")) + when 'value' ; add_expr_literal(codebuf, code) + else ; add_stmt(codebuf, code) + end + end + + def add_pi_expr(codebuf, code, indicator) # :nodoc: + case indicator + when nil, '', '==' # @{...}@ or <%== ... %> + @escape == false ? add_expr_literal(codebuf, code) : add_expr_escaped(codebuf, code) + when '!', '=' # @!{...}@ or <%= ... %> + @escape == false ? add_expr_escaped(codebuf, code) : add_expr_literal(codebuf, code) + when '!!', '===' # @!!{...}@ or <%=== ... %> + add_expr_debug(codebuf, code) + else + # ignore + end + end + + end + + +end +#--end of require 'erubis/converter' +#--begin of require 'erubis/evaluator' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--begin of require 'erubis/error' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +module Erubis + + + ## + ## base error class + ## + class ErubisError < StandardError + end + + + ## + ## raised when method or function is not supported + ## + class NotSupportedError < ErubisError + end + + +end +#--end of require 'erubis/error' +#--begin of require 'erubis/context' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +module Erubis + + + ## + ## context object for Engine#evaluate + ## + ## ex. + ## template = <<'END' + ## Hello <%= @user %>! + ## <% for item in @list %> + ## - <%= item %> + ## <% end %> + ## END + ## + ## context = Erubis::Context.new(:user=>'World', :list=>['a','b','c']) + ## # or + ## # context = Erubis::Context.new + ## # context[:user] = 'World' + ## # context[:list] = ['a', 'b', 'c'] + ## + ## eruby = Erubis::Eruby.new(template) + ## print eruby.evaluate(context) + ## + class Context + include Enumerable + + def initialize(hash=nil) + hash.each do |name, value| + self[name] = value + end if hash + end + + def [](key) + return instance_variable_get("@#{key}") + end + + def []=(key, value) + return instance_variable_set("@#{key}", value) + end + + def keys + return instance_variables.collect { |name| name[1..-1] } + end + + def each + instance_variables.each do |name| + key = name[1..-1] + value = instance_variable_get(name) + yield(key, value) + end + end + + def to_hash + hash = {} + self.keys.each { |key| hash[key] = self[key] } + return hash + end + + def update(context_or_hash) + arg = context_or_hash + if arg.is_a?(Hash) + arg.each do |key, val| + self[key] = val + end + else + arg.instance_variables.each do |varname| + key = varname[1..-1] + val = arg.instance_variable_get(varname) + self[key] = val + end + end + end + + end + + +end +#--end of require 'erubis/context' + + +module Erubis + + EMPTY_BINDING = binding() + + + ## + ## evaluate code + ## + module Evaluator + + def self.supported_properties # :nodoc: + return [] + end + + attr_accessor :src, :filename + + def init_evaluator(properties) + @filename = properties[:filename] + end + + def result(*args) + raise NotSupportedError.new("evaluation of code except Ruby is not supported.") + end + + def evaluate(*args) + raise NotSupportedError.new("evaluation of code except Ruby is not supported.") + end + + end + + + ## + ## evaluator for Ruby + ## + module RubyEvaluator + include Evaluator + + def self.supported_properties # :nodoc: + list = Evaluator.supported_properties + return list + end + + ## eval(@src) with binding object + def result(_binding_or_hash=TOPLEVEL_BINDING) + _arg = _binding_or_hash + if _arg.is_a?(Hash) + _b = binding() + eval _arg.collect{|k,v| "#{k} = _arg[#{k.inspect}]; "}.join, _b + elsif _arg.is_a?(Binding) + _b = _arg + elsif _arg.nil? + _b = binding() + else + raise ArgumentError.new("#{self.class.name}#result(): argument should be Binding or Hash but passed #{_arg.class.name} object.") + end + return eval(@src, _b, (@filename || '(erubis')) + end + + ## invoke context.instance_eval(@src) + def evaluate(_context=Context.new) + _context = Context.new(_context) if _context.is_a?(Hash) + #return _context.instance_eval(@src, @filename || '(erubis)') + #@_proc ||= eval("proc { #{@src} }", Erubis::EMPTY_BINDING, @filename || '(erubis)') + @_proc ||= eval("proc { #{@src} }", binding(), @filename || '(erubis)') + return _context.instance_eval(&@_proc) + end + + ## if object is an Class or Module then define instance method to it, + ## else define singleton method to it. + def def_method(object, method_name, filename=nil) + m = object.is_a?(Module) ? :module_eval : :instance_eval + object.__send__(m, "def #{method_name}; #{@src}; end", filename || @filename || '(erubis)') + end + + + end + + +end +#--end of require 'erubis/evaluator' +#--already included require 'erubis/context' + + +module Erubis + + + ## + ## (abstract) abstract engine class. + ## subclass must include evaluator and converter module. + ## + class Engine + #include Evaluator + #include Converter + #include Generator + + def initialize(input=nil, properties={}) + #@input = input + init_generator(properties) + init_converter(properties) + init_evaluator(properties) + @src = convert(input) if input + end + + + ## + ## convert input string and set it to @src + ## + def convert!(input) + @src = convert(input) + end + + + ## + ## load file, write cache file, and return engine object. + ## this method create code cache file automatically. + ## cachefile name can be specified with properties[:cachename], + ## or filname + 'cache' is used as default. + ## + def self.load_file(filename, properties={}) + cachename = properties[:cachename] || (filename + '.cache') + properties[:filename] = filename + timestamp = File.mtime(filename) + if test(?f, cachename) && timestamp == File.mtime(cachename) + engine = self.new(nil, properties) + engine.src = File.read(cachename) + else + input = File.open(filename, 'rb') {|f| f.read } + engine = self.new(input, properties) + tmpname = cachename + rand().to_s[1,8] + File.open(tmpname, 'wb') {|f| f.write(engine.src) } + File.rename(tmpname, cachename) + File.utime(timestamp, timestamp, cachename) + end + engine.src.untaint # ok? + return engine + end + + + ## + ## helper method to convert and evaluate input text with context object. + ## context may be Binding, Hash, or Object. + ## + def process(input, context=nil, filename=nil) + code = convert(input) + filename ||= '(erubis)' + if context.is_a?(Binding) + return eval(code, context, filename) + else + context = Context.new(context) if context.is_a?(Hash) + return context.instance_eval(code, filename) + end + end + + + ## + ## helper method evaluate Proc object with contect object. + ## context may be Binding, Hash, or Object. + ## + def process_proc(proc_obj, context=nil, filename=nil) + if context.is_a?(Binding) + filename ||= '(erubis)' + return eval(proc_obj, context, filename) + else + context = Context.new(context) if context.is_a?(Hash) + return context.instance_eval(&proc_obj) + end + end + + + end # end of class Engine + + + ## + ## (abstract) base engine class for Eruby, Eperl, Ejava, and so on. + ## subclass must include generator. + ## + class Basic::Engine < Engine + include Evaluator + include Basic::Converter + include Generator + end + + + class PI::Engine < Engine + include Evaluator + include PI::Converter + include Generator + end + + +end +#--end of require 'erubis/engine' +#require 'erubis/generator' +#require 'erubis/converter' +#require 'erubis/evaluator' +#require 'erubis/error' +#require 'erubis/context' +#requier 'erubis/util' +#--begin of require 'erubis/helper' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +module Erubis + + ## + ## helper for xml + ## + module XmlHelper + + module_function + + ESCAPE_TABLE = { + '&' => '&', + '<' => '<', + '>' => '>', + '"' => '"', + "'" => ''', + } + + def escape_xml(value) + value.to_s.gsub(/[&<>"]/) { |s| ESCAPE_TABLE[s] } # or /[&<>"']/ + #value.to_s.gsub(/[&<>"]/) { ESCAPE_TABLE[$&] } + end + + def escape_xml2(value) + return value.to_s.gsub(/\&/,'&').gsub(//,'>').gsub(/"/,'"') + end + + alias h escape_xml + alias html_escape escape_xml + + def url_encode(str) + return str.gsub(/[^-_.a-zA-Z0-9]+/) { |s| + s.unpack('C*').collect { |i| "%%%02X" % i }.join + } + end + + alias u url_encode + + end + + +end +#--end of require 'erubis/helper' +#--begin of require 'erubis/enhancer' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +module Erubis + + + ## + ## switch '<%= ... %>' to escaped and '<%== ... %>' to unescaped + ## + ## ex. + ## class XmlEruby < Eruby + ## include EscapeEnhancer + ## end + ## + ## this is language-indenedent. + ## + module EscapeEnhancer + + def self.desc # :nodoc: + "switch '<%= %>' to escaped and '<%== %>' to unescaped" + end + + #-- + #def self.included(klass) + # klass.class_eval <<-END + # alias _add_expr_literal add_expr_literal + # alias _add_expr_escaped add_expr_escaped + # alias add_expr_literal _add_expr_escaped + # alias add_expr_escaped _add_expr_literal + # END + #end + #++ + + def add_expr(src, code, indicator) + case indicator + when '=' + @escape ? add_expr_literal(src, code) : add_expr_escaped(src, code) + when '==' + @escape ? add_expr_escaped(src, code) : add_expr_literal(src, code) + when '===' + add_expr_debug(src, code) + end + end + + end + + + #-- + ## (obsolete) + #module FastEnhancer + #end + #++ + + + ## + ## use $stdout instead of string + ## + ## this is only for Eruby. + ## + module StdoutEnhancer + + def self.desc # :nodoc: + "use $stdout instead of array buffer or string buffer" + end + + def add_preamble(src) + src << "#{@bufvar} = $stdout;" + end + + def add_postamble(src) + src << "\n''\n" + end + + end + + + ## + ## use print statement instead of '_buf << ...' + ## + ## this is only for Eruby. + ## + module PrintOutEnhancer + + def self.desc # :nodoc: + "use print statement instead of '_buf << ...'" + end + + def add_preamble(src) + end + + def add_text(src, text) + src << " print '#{escape_text(text)}';" unless text.empty? + end + + def add_expr_literal(src, code) + src << " print((#{code}).to_s);" + end + + def add_expr_escaped(src, code) + src << " print #{escaped_expr(code)};" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + end + + end + + + ## + ## enable print function + ## + ## Notice: use Eruby#evaluate() and don't use Eruby#result() + ## to be enable print function. + ## + ## this is only for Eruby. + ## + module PrintEnabledEnhancer + + def self.desc # :nodoc: + "enable to use print function in '<% %>'" + end + + def add_preamble(src) + src << "@_buf = " + super + end + + def print(*args) + args.each do |arg| + @_buf << arg.to_s + end + end + + def evaluate(context=nil) + _src = @src + if context.is_a?(Hash) + context.each do |key, val| instance_variable_set("@#{key}", val) end + elsif context + context.instance_variables.each do |name| + instance_variable_set(name, context.instance_variable_get(name)) + end + end + return instance_eval(_src, (@filename || '(erubis)')) + end + + end + + + ## + ## return array instead of string + ## + ## this is only for Eruby. + ## + module ArrayEnhancer + + def self.desc # :nodoc: + "return array instead of string" + end + + def add_preamble(src) + src << "#{@bufvar} = [];" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "#{@bufvar}\n" + end + + end + + + ## + ## use an Array object as buffer (included in Eruby by default) + ## + ## this is only for Eruby. + ## + module ArrayBufferEnhancer + + def self.desc # :nodoc: + "use an Array object for buffering (included in Eruby class)" + end + + def add_preamble(src) + src << "_buf = [];" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "_buf.join\n" + end + + end + + + ## + ## use String class for buffering + ## + ## this is only for Eruby. + ## + module StringBufferEnhancer + + def self.desc # :nodoc: + "use a String object for buffering" + end + + def add_preamble(src) + src << "#{@bufvar} = '';" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "#{@bufvar}.to_s\n" + end + + end + + + ## + ## use StringIO class for buffering + ## + ## this is only for Eruby. + ## + module StringIOEnhancer # :nodoc: + + def self.desc # :nodoc: + "use a StringIO object for buffering" + end + + def add_preamble(src) + src << "#{@bufvar} = StringIO.new;" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "#{@bufvar}.string\n" + end + + end + + + ## + ## set buffer variable name to '_erbout' as well as '_buf' + ## + ## this is only for Eruby. + ## + module ErboutEnhancer + + def self.desc # :nodoc: + "set '_erbout = _buf = \"\";' to be compatible with ERB." + end + + def add_preamble(src) + src << "_erbout = #{@bufvar} = '';" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "#{@bufvar}.to_s\n" + end + + end + + + ## + ## remove text and leave code, especially useful when debugging. + ## + ## ex. + ## $ erubis -s -E NoText file.eruby | more + ## + ## this is language independent. + ## + module NoTextEnhancer + + def self.desc # :nodoc: + "remove text and leave code (useful when debugging)" + end + + def add_text(src, text) + src << ("\n" * text.count("\n")) + if text[-1] != ?\n + text =~ /^(.*?)\z/ + src << (' ' * $1.length) + end + end + + end + + + ## + ## remove code and leave text, especially useful when validating HTML tags. + ## + ## ex. + ## $ erubis -s -E NoCode file.eruby | tidy -errors + ## + ## this is language independent. + ## + module NoCodeEnhancer + + def self.desc # :nodoc: + "remove code and leave text (useful when validating HTML)" + end + + def add_preamble(src) + end + + def add_postamble(src) + end + + def add_text(src, text) + src << text + end + + def add_expr(src, code, indicator) + src << "\n" * code.count("\n") + end + + def add_stmt(src, code) + src << "\n" * code.count("\n") + end + + end + + + ## + ## get convert faster, but spaces around '<%...%>' are not trimmed. + ## + ## this is language-independent. + ## + module SimplifyEnhancer + + def self.desc # :nodoc: + "get convert faster but leave spaces around '<% %>'" + end + + #DEFAULT_REGEXP = /(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m + SIMPLE_REGEXP = /<%(=+|\#)?(.*?)-?%>/m + + def convert(input) + src = "" + add_preamble(src) + #regexp = pattern_regexp(@pattern) + pos = 0 + input.scan(SIMPLE_REGEXP) do |indicator, code| + match = Regexp.last_match + index = match.begin(0) + text = input[pos, index - pos] + pos = match.end(0) + add_text(src, text) + if !indicator # <% %> + add_stmt(src, code) + elsif indicator[0] == ?\# # <%# %> + n = code.count("\n") + add_stmt(src, "\n" * n) + else # <%= %> + add_expr(src, code, indicator) + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + add_text(src, rest) + add_postamble(src) + return src + end + + end + + + ## + ## enable to use other embedded expression pattern (default is '\[= =\]'). + ## + ## notice! this is an experimental. spec may change in the future. + ## + ## ex. + ## input = < + ## <%= item %> : <%== item %> + ## [= item =] : [== item =] + ## <% end %> + ## END + ## + ## class BiPatternEruby + ## include BiPatternEnhancer + ## end + ## eruby = BiPatternEruby.new(input, :bipattern=>'\[= =\]') + ## list = ['', 'b&b', '"c"'] + ## print eruby.result(binding()) + ## + ## ## output + ## : <a> + ## : <a> + ## b&b : b&b + ## b&b : b&b + ## "c" : "c" + ## "c" : "c" + ## + ## this is language independent. + ## + module BiPatternEnhancer + + def self.desc # :nodoc: + "another embedded expression pattern (default '\[= =\]')." + end + + def initialize(input, properties={}) + self.bipattern = properties[:bipattern] # or '\$\{ \}' + super + end + + ## when pat is nil then '\[= =\]' is used + def bipattern=(pat) # :nodoc: + @bipattern = pat || '\[= =\]' + pre, post = @bipattern.split() + @bipattern_regexp = /(.*?)#{pre}(=*)(.*?)#{post}/m + end + + def add_text(src, text) + return unless text + m = nil + text.scan(@bipattern_regexp) do |txt, indicator, code| + m = Regexp.last_match + super(src, txt) + add_expr(src, code, '=' + indicator) + end + #rest = $' || text # ruby1.8 + rest = m ? text[m.end(0)..-1] : text # ruby1.9 + super(src, rest) + end + + end + + + ## + ## regards lines starting with '^[ \t]*%' as program code + ## + ## in addition you can specify prefix character (default '%') + ## + ## this is language-independent. + ## + module PrefixedLineEnhancer + + def self.desc # :nodoc: + "regard lines matched to '^[ \t]*%' as program code" + end + + def init_generator(properties={}) + super + @prefixchar = properties[:prefixchar] + end + + def add_text(src, text) + unless @prefixrexp + @prefixchar ||= '%' + @prefixrexp = Regexp.compile("^([ \\t]*)\\#{@prefixchar}(.*?\\r?\\n)") + end + pos = 0 + text2 = '' + text.scan(@prefixrexp) do + space = $1 + line = $2 + space, line = '', $1 unless $2 + match = Regexp.last_match + len = match.begin(0) - pos + str = text[pos, len] + pos = match.end(0) + if text2.empty? + text2 = str + else + text2 << str + end + if line[0, 1] == @prefixchar + text2 << space << line + else + super(src, text2) + text2 = '' + add_stmt(src, space + line) + end + end + #rest = pos == 0 ? text : $' # ruby1.8 + rest = pos == 0 ? text : text[pos..-1] # ruby1.9 + unless text2.empty? + text2 << rest if rest + rest = text2 + end + super(src, rest) + end + + end + + + ## + ## regards lines starting with '%' as program code + ## + ## this is for compatibility to eruby and ERB. + ## + ## this is language-independent. + ## + module PercentLineEnhancer + include PrefixedLineEnhancer + + def self.desc # :nodoc: + "regard lines starting with '%' as program code" + end + + #-- + #def init_generator(properties={}) + # super + # @prefixchar = '%' + # @prefixrexp = /^\%(.*?\r?\n)/ + #end + #++ + + def add_text(src, text) + unless @prefixrexp + @prefixchar = '%' + @prefixrexp = /^\%(.*?\r?\n)/ + end + super(src, text) + end + + end + + + ## + ## [experimental] allow header and footer in eRuby script + ## + ## ex. + ## ==================== + ## ## without header and footer + ## $ cat ex1.eruby + ## <% def list_items(list) %> + ## <% for item in list %> + ##
  • <%= item %>
  • + ## <% end %> + ## <% end %> + ## + ## $ erubis -s ex1.eruby + ## _buf = []; def list_items(list) + ## ; for item in list + ## ; _buf << '
  • '; _buf << ( item ).to_s; _buf << '
  • + ## '; end + ## ; end + ## ; + ## _buf.join + ## + ## ## with header and footer + ## $ cat ex2.eruby + ## + ## <% for item in list %> + ##
  • <%= item %>
  • + ## <% end %> + ## + ## + ## $ erubis -s -c HeaderFooterEruby ex4.eruby + ## + ## def list_items(list) + ## _buf = []; _buf << ' + ## '; for item in list + ## ; _buf << '
  • '; _buf << ( item ).to_s; _buf << '
  • + ## '; end + ## ; _buf << ' + ## '; + ## _buf.join + ## end + ## + ## ==================== + ## + ## this is language-independent. + ## + module HeaderFooterEnhancer + + def self.desc # :nodoc: + "allow header/footer in document (ex. '')" + end + + HEADER_FOOTER_PATTERN = /(.*?)(^[ \t]*)?([ \t]*\r?\n)?/m + + def add_text(src, text) + m = nil + text.scan(HEADER_FOOTER_PATTERN) do |txt, lspace, word, content, rspace| + m = Regexp.last_match + flag_trim = @trim && lspace && rspace + super(src, txt) + content = "#{lspace}#{content}#{rspace}" if flag_trim + super(src, lspace) if !flag_trim && lspace + instance_variable_set("@#{word}", content) + super(src, rspace) if !flag_trim && rspace + end + #rest = $' || text # ruby1.8 + rest = m ? text[m.end(0)..-1] : text # ruby1.9 + super(src, rest) + end + + attr_accessor :header, :footer + + def convert(input) + source = super + return @src = "#{@header}#{source}#{@footer}" + end + + end + + + ## + ## delete indentation of HTML. + ## + ## this is language-independent. + ## + module DeleteIndentEnhancer + + def self.desc # :nodoc: + "delete indentation of HTML." + end + + def convert_input(src, input) + input = input.gsub(/^[ \t]+<%=title%>" into "_buf << %Q`

    #{title}

    `" + ## + ## this is only for Eruby. + ## + module InterpolationEnhancer + + def self.desc # :nodoc: + "convert '

    <%=text%>

    ' into '_buf << %Q`

    \#{text}

    `'" + end + + def convert_input(src, input) + pat = @pattern + regexp = pat.nil? || pat == '<% %>' ? Basic::Converter::DEFAULT_REGEXP : pattern_regexp(pat) + pos = 0 + is_bol = true # is beginning of line + str = '' + input.scan(regexp) do |indicator, code, tailch, rspace| + match = Regexp.last_match() + len = match.begin(0) - pos + text = input[pos, len] + pos = match.end(0) + ch = indicator ? indicator[0] : nil + lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol) + is_bol = rspace ? true : false + _add_text_to_str(str, text) + ## * when '<%= %>', do nothing + ## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>' + if ch == ?= # <%= %> + rspace = nil if tailch && !tailch.empty? + str << lspace if lspace + add_expr(str, code, indicator) + str << rspace if rspace + elsif ch == ?\# # <%# %> + n = code.count("\n") + (rspace ? 1 : 0) + if @trim && lspace && rspace + add_text(src, str) + str = '' + add_stmt(src, "\n" * n) + else + str << lspace if lspace + add_text(src, str) + str = '' + add_stmt(src, "\n" * n) + str << rspace if rspace + end + else # <% %> + if @trim && lspace && rspace + add_text(src, str) + str = '' + add_stmt(src, "#{lspace}#{code}#{rspace}") + else + str << lspace if lspace + add_text(src, str) + str = '' + add_stmt(src, code) + str << rspace if rspace + end + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + _add_text_to_str(str, rest) + add_text(src, str) + end + + def add_text(src, text) + return if !text || text.empty? + #src << " _buf << %Q`" << text << "`;" + if text[-1] == ?\n + text[-1] = "\\n" + src << " #{@bufvar} << %Q`#{text}`\n" + else + src << " #{@bufvar} << %Q`#{text}`;" + end + end + + def _add_text_to_str(str, text) + return if !text || text.empty? + str << text.gsub(/[`\#\\]/, '\\\\\&') + end + + def add_expr_escaped(str, code) + str << "\#{#{escaped_expr(code)}}" + end + + def add_expr_literal(str, code) + str << "\#{#{code}}" + end + + end + + +end +#--end of require 'erubis/enhancer' +#require 'erubis/tiny' +#--begin of require 'erubis/engine/eruby' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/engine' +#--already included require 'erubis/enhancer' + + +module Erubis + + + ## + ## code generator for Ruby + ## + module RubyGenerator + include Generator + #include ArrayBufferEnhancer + include StringBufferEnhancer + + def init_generator(properties={}) + super + @escapefunc ||= "Erubis::XmlHelper.escape_xml" + @bufvar = properties[:bufvar] || "_buf" + end + + def self.supported_properties() # :nodoc: + return [] + end + + def escape_text(text) + text.gsub(/['\\]/, '\\\\\&') # "'" => "\\'", '\\' => '\\\\' + end + + def escaped_expr(code) + return "#{@escapefunc}(#{code})" + end + + #-- + #def add_preamble(src) + # src << "#{@bufvar} = [];" + #end + #++ + + def add_text(src, text) + src << " #{@bufvar} << '" << escape_text(text) << "';" unless text.empty? + end + + def add_stmt(src, code) + #src << code << ';' + src << code + src << ';' unless code[-1] == ?\n + end + + def add_expr_literal(src, code) + src << " #{@bufvar} << (" << code << ').to_s;' + end + + def add_expr_escaped(src, code) + src << " #{@bufvar} << " << escaped_expr(code) << ';' + end + + def add_expr_debug(src, code) + code.strip! + s = (code.dump =~ /\A"(.*)"\z/) && $1 + src << ' $stderr.puts("*** debug: ' << s << '=#{(' << code << ').inspect}");' + end + + #-- + #def add_postamble(src) + # src << "\n#{@bufvar}.join\n" + #end + #++ + + end + + + ## + ## engine for Ruby + ## + class Eruby < Basic::Engine + include RubyEvaluator + include RubyGenerator + end + + + ## + ## fast engine for Ruby + ## + class FastEruby < Eruby + include InterpolationEnhancer + end + + + ## + ## swtich '<%= %>' to escaped and '<%== %>' to not escaped + ## + class EscapedEruby < Eruby + include EscapeEnhancer + end + + + ## + ## sanitize expression (<%= ... %>) by default + ## + ## this is equivalent to EscapedEruby and is prepared only for compatibility. + ## + class XmlEruby < Eruby + include EscapeEnhancer + end + + + class PI::Eruby < PI::Engine + include RubyEvaluator + include RubyGenerator + + def init_converter(properties={}) + @pi = 'rb' + super(properties) + end + + end + + +end +#--end of require 'erubis/engine/eruby' +#require 'erubis/engine/enhanced' # enhanced eruby engines +#require 'erubis/engine/optimized' # generates optimized ruby code +#require 'erubis/engine/ephp' +#require 'erubis/engine/ec' +#require 'erubis/engine/ejava' +#require 'erubis/engine/escheme' +#require 'erubis/engine/eperl' +#require 'erubis/engine/ejavascript' + +#--begin of require 'erubis/local-setting' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +## +## you can add site-local settings here. +## this files is required by erubis.rb +## +#--end of require 'erubis/local-setting' +#--end of require 'erubis' +#--begin of require 'erubis/tiny' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +module Erubis + + ## + ## tiny and the simplest implementation of eRuby + ## + ## ex. + ## eruby = TinyEruby.new(File.read('example.rhtml')) + ## print eruby.src # print ruby code + ## print eruby.result(binding()) # eval ruby code with Binding object + ## print eruby.evalute(context) # eval ruby code with context object + ## + class TinyEruby + + def initialize(input=nil) + @src = convert(input) if input + end + attr_reader :src + + EMBEDDED_PATTERN = /<%(=+|\#)?(.*?)-?%>/m + + def convert(input) + src = "_buf = '';" # preamble + pos = 0 + input.scan(EMBEDDED_PATTERN) do |indicator, code| + m = Regexp.last_match + text = input[pos...m.begin(0)] + pos = m.end(0) + #src << " _buf << '" << escape_text(text) << "';" + text.gsub!(/['\\]/, '\\\\\&') + src << " _buf << '" << text << "';" unless text.empty? + if !indicator # <% %> + src << code << ";" + elsif indicator == '#' # <%# %> + src << ("\n" * code.count("\n")) + else # <%= %> + src << " _buf << (" << code << ").to_s;" + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + #src << " _buf << '" << escape_text(rest) << "';" + rest.gsub!(/['\\]/, '\\\\\&') + src << " _buf << '" << rest << "';" unless rest.empty? + src << "\n_buf.to_s\n" # postamble + return src + end + + #def escape_text(text) + # return text.gsub!(/['\\]/, '\\\\\&') || text + #end + + def result(_binding=TOPLEVEL_BINDING) + eval @src, _binding + end + + def evaluate(_context=Object.new) + if _context.is_a?(Hash) + _obj = Object.new + _context.each do |k, v| _obj.instance_variable_set("@#{k}", v) end + _context = _obj + end + _context.instance_eval @src + end + + end + + + + module PI + end + + class PI::TinyEruby + + def initialize(input=nil, options={}) + @escape = options[:escape] || 'Erubis::XmlHelper.escape_xml' + @src = convert(input) if input + end + + attr_reader :src + + EMBEDDED_PATTERN = /(^[ \t]*)?<\?rb(\s.*?)\?>([ \t]*\r?\n)?|@(!+)?\{(.*?)\}@/m + + def convert(input) + src = "_buf = '';" # preamble + pos = 0 + input.scan(EMBEDDED_PATTERN) do |lspace, stmt, rspace, indicator, expr| + match = Regexp.last_match + len = match.begin(0) - pos + text = input[pos, len] + pos = match.end(0) + #src << " _buf << '" << escape_text(text) << "';" + text.gsub!(/['\\]/, '\\\\\&') + src << " _buf << '" << text << "';" unless text.empty? + if stmt # + if lspace && rspace + src << "#{lspace}#{stmt}#{rspace}" + else + src << " _buf << '" << lspace << "';" if lspace + src << stmt << ";" + src << " _buf << '" << rspace << "';" if rspace + end + else # ${...}, $!{...} + if !indicator + src << " _buf << " << @escape << "(" << expr << ");" + elsif indicator == '!' + src << " _buf << (" << expr << ").to_s;" + end + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + #src << " _buf << '" << escape_text(rest) << "';" + rest.gsub!(/['\\]/, '\\\\\&') + src << " _buf << '" << rest << "';" unless rest.empty? + src << "\n_buf.to_s\n" # postamble + return src + end + + #def escape_text(text) + # return text.gsub!(/['\\]/, '\\\\\&') || text + #end + + def result(_binding=TOPLEVEL_BINDING) + eval @src, _binding + end + + def evaluate(_context=Object.new) + if _context.is_a?(Hash) + _obj = Object.new + _context.each do |k, v| _obj.instance_variable_set("@#{k}", v) end + _context = _obj + end + _context.instance_eval @src + end + + end + + +end +#--end of require 'erubis/tiny' +#--begin of require 'erubis/engine/enhanced' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/enhancer' +#--already included require 'erubis/engine/eruby' + + +module Erubis + + + #-- + ## moved to engine/ruby.rb + #class EscapedEruby < Eruby + # include EscapeEnhancer + #end + #++ + + + #-- + ### (obsolete) + #class FastEruby < Eruby + # include FastEnhancer + #end + #++ + + + class StdoutEruby < Eruby + include StdoutEnhancer + end + + + class PrintOutEruby < Eruby + include PrintOutEnhancer + end + + + class PrintEnabledEruby < Eruby + include PrintEnabledEnhancer + end + + + class ArrayEruby < Eruby + include ArrayEnhancer + end + + + class ArrayBufferEruby < Eruby + include ArrayBufferEnhancer + end + + + class StringBufferEruby < Eruby + include StringBufferEnhancer + end + + + class StringIOEruby < Eruby + include StringIOEnhancer + end + + + class ErboutEruby < Eruby + include ErboutEnhancer + end + + + class NoTextEruby < Eruby + include NoTextEnhancer + end + + + class NoCodeEruby < Eruby + include NoCodeEnhancer + end + + + class SimplifiedEruby < Eruby + include SimplifyEnhancer + end + + + class StdoutSimplifiedEruby < Eruby + include StdoutEnhancer + include SimplifyEnhancer + end + + + class PrintOutSimplifiedEruby < Eruby + include PrintOutEnhancer + include SimplifyEnhancer + end + + + class BiPatternEruby < Eruby + include BiPatternEnhancer + end + + + class PercentLineEruby < Eruby + include PercentLineEnhancer + end + + + class PrefixedLineEruby < Eruby + include PrefixedLineEnhancer + end + + + class HeaderFooterEruby < Eruby + include HeaderFooterEnhancer + end + + + class DeleteIndentEruby < Eruby + include DeleteIndentEnhancer + end + + + class InterpolationEruby < Eruby + include InterpolationEnhancer + end + + +end +#--end of require 'erubis/engine/enhanced' +#--begin of require 'erubis/engine/optimized' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +#--already included require 'erubis/engine/eruby' + + +module Erubis + + + module OptimizedGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [] + end + + def init_generator(properties={}) + super + @escapefunc ||= "Erubis::XmlHelper.escape_xml" + @initialized = false + @prev_is_expr = false + end + + protected + + def escape_text(text) + text.gsub(/['\\]/, '\\\\\&') # "'" => "\\'", '\\' => '\\\\' + end + + def escaped_expr(code) + @escapefunc ||= 'Erubis::XmlHelper.escape_xml' + return "#{@escapefunc}(#{code})" + end + + def switch_to_expr(src) + return if @prev_is_expr + @prev_is_expr = true + src << ' _buf' + end + + def switch_to_stmt(src) + return unless @prev_is_expr + @prev_is_expr = false + src << ';' + end + + def add_preamble(src) + #@initialized = false + #@prev_is_expr = false + end + + def add_text(src, text) + return if text.empty? + if @initialized + switch_to_expr(src) + src << " << '" << escape_text(text) << "'" + else + src << "_buf = '" << escape_text(text) << "';" + @initialized = true + end + end + + def add_stmt(src, code) + switch_to_stmt(src) if @initialized + #super + src << code + src << ';' unless code[-1] == ?\n + end + + def add_expr_literal(src, code) + unless @initialized; src << "_buf = ''"; @initialized = true; end + switch_to_expr(src) + src << " << (" << code << ").to_s" + end + + def add_expr_escaped(src, code) + unless @initialized; src << "_buf = ''"; @initialized = true; end + switch_to_expr(src) + src << " << " << escaped_expr(code) + end + + def add_expr_debug(src, code) + code.strip! + s = (code.dump =~ /\A"(.*)"\z/) && $1 + src << ' $stderr.puts("*** debug: ' << s << '=#{(' << code << ').inspect}");' + end + + def add_postamble(src) + #super if @initialized + src << "\n_buf\n" if @initialized + end + + end # end of class OptimizedEruby + + + ## + ## Eruby class which generates optimized ruby code + ## + class OptimizedEruby < Basic::Engine # Eruby + include RubyEvaluator + include OptimizedGenerator + + def init_converter(properties={}) + @pi = 'rb' + super(properties) + end + + end + + + ## + ## XmlEruby class which generates optimized ruby code + ## + class OptimizedXmlEruby < OptimizedEruby + include EscapeEnhancer + + def add_expr_debug(src, code) + switch_to_stmt(src) if indicator == '===' && !@initialized + super + end + + end # end of class OptimizedXmlEruby + +end +#--end of require 'erubis/engine/optimized' +#--already included require 'erubis/engine/eruby' +#--begin of require 'erubis/engine/ephp' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/engine' +#--already included require 'erubis/enhancer' + + +module Erubis + + + module PhpGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [] + end + + def init_generator(properties={}) + super + @escapefunc ||= 'htmlspecialchars' + end + + def add_preamble(src) + # empty + end + + def escape_text(text) + return text.gsub!(/<\?xml\b/, '<?xml') || text + end + + def add_text(src, text) + src << escape_text(text) + end + + def add_expr_literal(src, code) + code.strip! + src << "" + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + code.strip! + s = code.gsub(/\'/, "\\'") + src << "" + end + + def add_stmt(src, code) + src << "\n" + else + src << code << "?>" + end + end + + def add_postamble(src) + # empty + end + + end + + + ## + ## engine for PHP + ## + class Ephp < Basic::Engine + include PhpGenerator + end + + + class EscapedEphp < Ephp + include EscapeEnhancer + end + + + #class XmlEphp < Ephp + # include EscapeEnhancer + #end + + + class PI::Ephp < PI::Engine + include PhpGenerator + + def init_converter(properties={}) + @pi = 'php' + super(properties) + end + + end + + +end +#--end of require 'erubis/engine/ephp' +#--begin of require 'erubis/engine/ec' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/engine' +#--already included require 'erubis/enhancer' + + +module Erubis + + + module CGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:indent, '', "indent spaces (ex. ' ')"], + [:out, 'stdout', "output file pointer name"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= "escape" + @indent = properties[:indent] || '' + @out = properties[:out] || 'stdout' + end + + def add_preamble(src) + src << "#line 1 \"#{self.filename}\"\n" if self.filename + end + + def escape_text(text) + @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" } + text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } + return text + end + + def escaped_expr(code) + return "#{@escapefunc}(#{code.strip}, #{@out})" + end + + def add_text(src, text) + return if text.empty? + src << (src.empty? || src[-1] == ?\n ? @indent : ' ') + src << "fputs(" + i = 0 + text.each_line do |line| + src << "\n" << @indent << ' ' if i > 0 + i += 1 + src << '"' << escape_text(line) << '"' + end + src << ", #{@out});" #<< (text[-1] == ?\n ? "\n" : "") + src << "\n" if text[-1] == ?\n + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + src << @indent if src.empty? || src[-1] == ?\n + src << " fprintf(#{@out}, " << code.strip << ');' + end + + def add_expr_escaped(src, code) + src << @indent if src.empty? || src[-1] == ?\n + src << ' ' << escaped_expr(code) << ';' + end + + def add_expr_debug(src, code) + code.strip! + s = nil + if code =~ /\A\".*?\"\s*,\s*(.*)/ + s = $1.gsub(/[%"]/, '\\\1') + '=' + end + src << @indent if src.empty? || src[-1] == ?\n + src << " fprintf(stderr, \"*** debug: #{s}\" #{code});" + end + + def add_postamble(src) + # empty + end + + end + + + ## + ## engine for C + ## + class Ec < Basic::Engine + include CGenerator + end + + + class EscapedEc < Ec + include EscapeEnhancer + end + + + #class XmlEc < Ec + # include EscapeEnhancer + #end + + class PI::Ec < PI::Engine + include CGenerator + + def init_converter(properties={}) + @pi = 'c' + super(properties) + end + + end + + +end +#--end of require 'erubis/engine/ec' +#--begin of require 'erubis/engine/ecpp' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/engine' +#--already included require 'erubis/enhancer' + + +module Erubis + + + module CppGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:indent, '', "indent spaces (ex. ' ')"], + [:bufvar, '_buf', "buffer variable name"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= "escape" + @indent = properties[:indent] || '' + @bufvar = properties[:bufvar] || '_buf' + end + + def add_preamble(src) + src << "#line 1 \"#{self.filename}\"\n" if self.filename + end + + def escape_text(text) + @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" } + text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } + return text + end + + def escaped_expr(code) + return "#{@escapefunc}(#{code.strip})" + end + + def add_text(src, text) + return if text.empty? + src << (src.empty? || src[-1] == ?\n ? @indent : ' ') + src << "_buf << " + i = 0 + text.each_line do |line| + src << "\n" << @indent << " " if i > 0 + i += 1 + src << '"' << escape_text(line) << '"' + end + src << ";" #<< (text[-1] == ?\n ? "\n" : "") + src << "\n" if text[-1] == ?\n + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + src << @indent if src.empty? || src[-1] == ?\n + src << " _buf << (" << code.strip << ");" + end + + def add_expr_escaped(src, code) + src << @indent if src.empty? || src[-1] == ?\n + src << ' ' << escaped_expr(code) << ';' + end + + def add_expr_debug(src, code) + code.strip! + src << @indent if src.empty? || src[-1] == ?\n + src << " std::cerr << \"*** debug: #{code.gsub(/(")/, '\\\&')}=\" << (#{code});" + end + + def add_postamble(src) + # empty + end + + end + + + ## + ## engine for C + ## + class Ecpp < Basic::Engine + include CppGenerator + end + + + class EscapedEcpp < Ecpp + include EscapeEnhancer + end + + + #class XmlEcpp < Ecpp + # include EscapeEnhancer + #end + + class PI::Ecpp < PI::Engine + include CppGenerator + + def init_converter(properties={}) + @pi = 'cpp' + super(properties) + end + + end + + +end +#--end of require 'erubis/engine/ecpp' +#--begin of require 'erubis/engine/ejava' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/engine' +#--already included require 'erubis/enhancer' + + +module Erubis + + + module JavaGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:indent, '', "indent spaces (ex. ' ')"], + [:bufvar, '_buf', "output buffer variable name"], + [:bufclass, 'StringBuffer', "output buffer class (ex. 'StringBuilder')"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= 'escape' + @indent = properties[:indent] || '' + @bufvar = properties[:bufvar] || '_buf' + @bufclass = properties[:bufclass] || 'StringBuffer' + end + + def add_preamble(src) + src << "#{@indent}#{@bufclass} #{@bufvar} = new #{@bufclass}();" + end + + def escape_text(text) + @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" } + return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text + end + + def add_text(src, text) + return if text.empty? + src << (src.empty? || src[-1] == ?\n ? @indent : ' ') + src << @bufvar << ".append(" + i = 0 + text.each_line do |line| + src << "\n" << @indent << ' + ' if i > 0 + i += 1 + src << '"' << escape_text(line) << '"' + end + src << ");" << (text[-1] == ?\n ? "\n" : "") + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + src << @indent if src.empty? || src[-1] == ?\n + code.strip! + src << " #{@bufvar}.append(#{code});" + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + code.strip! + src << @indent if src.empty? || src[-1] == ?\n + src << " System.err.println(\"*** debug: #{code}=\"+(#{code}));" + end + + def add_postamble(src) + src << "\n" if src[-1] == ?; + src << @indent << "return " << @bufvar << ".toString();\n" + #src << @indent << "System.out.print(" << @bufvar << ".toString());\n" + end + + end + + + ## + ## engine for Java + ## + class Ejava < Basic::Engine + include JavaGenerator + end + + + class EscapedEjava < Ejava + include EscapeEnhancer + end + + + #class XmlEjava < Ejava + # include EscapeEnhancer + #end + + class PI::Ejava < PI::Engine + include JavaGenerator + + def init_converter(properties={}) + @pi = 'java' + super(properties) + end + + end + +end +#--end of require 'erubis/engine/ejava' +#--begin of require 'erubis/engine/escheme' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/engine' +#--already included require 'erubis/enhancer' + + +module Erubis + + + module SchemeGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:func, '_add', "function name (ex. 'display')"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= 'escape' + @func = properties[:func] || '_add' # or 'display' + end + + def add_preamble(src) + return unless @func == '_add' + src << "(let ((_buf '())) " + \ + "(define (_add x) (set! _buf (cons x _buf))) " + #src << "(let* ((_buf '())" + \ + # " (_add (lambda (x) (set! _buf (cons x _buf))))) " + end + + def escape_text(text) + @table_ ||= { '"'=>'\\"', '\\'=>'\\\\' } + text.gsub!(/["\\]/) { |m| @table_[m] } + return text + end + + def escaped_expr(code) + code.strip! + return "(#{@escapefunc} #{code})" + end + + def add_text(src, text) + return if text.empty? + t = escape_text(text) + if t[-1] == ?\n + t[-1, 1] = '' + src << "(#{@func} \"" << t << "\\n\")\n" + else + src << "(#{@func} \"" << t << '")' + end + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + code.strip! + src << "(#{@func} #{code})" + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + s = (code.strip! || code).gsub(/\"/, '\\"') + src << "(display \"*** debug: #{s}=\")(display #{code.strip})(display \"\\n\")" + end + + def add_postamble(src) + return unless @func == '_add' + src << "\n" unless src[-1] == ?\n + src << " (reverse _buf))\n" + end + + end + + + ## + ## engine for Scheme + ## + class Escheme < Basic::Engine + include SchemeGenerator + end + + + class EscapedEscheme < Escheme + include EscapeEnhancer + end + + + #class XmlEscheme < Escheme + # include EscapeEnhancer + #end + + + class PI::Escheme < PI::Engine + include SchemeGenerator + + def init_converter(properties={}) + @pi = 'scheme' + super(properties) + end + + end + + +end +#--end of require 'erubis/engine/escheme' +#--begin of require 'erubis/engine/eperl' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/engine' +#--already included require 'erubis/enhancer' + + +module Erubis + + + module PerlGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:func, 'print', "function name"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= 'encode_entities' + @func = properties[:func] || 'print' + end + + def add_preamble(src) + src << "use HTML::Entities; "; + end + + def escape_text(text) + return text.gsub!(/['\\]/, '\\\\\&') || text + end + + def add_text(src, text) + src << @func << "('" << escape_text(text) << "'); " unless text.empty? + end + + def add_expr_literal(src, code) + code.strip! + src << @func << "(" << code << "); " + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + code.strip! + s = code.gsub(/\'/, "\\'") + src << @func << "('*** debug: #{code}=', #{code}, \"\\n\");" + end + + def add_stmt(src, code) + src << code + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + end + + end + + + ## + ## engine for Perl + ## + class Eperl < Basic::Engine + include PerlGenerator + end + + + class EscapedEperl < Eperl + include EscapeEnhancer + end + + + #class XmlEperl < Eperl + # include EscapeEnhancer + #end + + + class PI::Eperl < PI::Engine + include PerlGenerator + + def init_converter(properties={}) + @pi = 'perl' + super(properties) + end + + end + + +end +#--end of require 'erubis/engine/eperl' +#--begin of require 'erubis/engine/ejavascript' +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +#--already included require 'erubis/engine' +#--already included require 'erubis/enhancer' + + +module Erubis + + + module JavascriptGenerator + include Generator + + def self.supported_properties() # :nodoc: + list = [] + #list << [:indent, '', "indent spaces (ex. ' ')"] + #list << [:bufvar, '_buf', "output buffer variable name"] + list << [:docwrite, true, "use 'document.write()' when true"] + return list + end + + def init_generator(properties={}) + super + @escapefunc ||= 'escape' + @indent = properties[:indent] || '' + @bufvar = properties[:bufvar] || '_buf' + @docwrite = properties[:docwrite] != false # '!= false' will be removed in the next release + end + + def add_preamble(src) + src << "#{@indent}var #{@bufvar} = [];" + end + + def escape_text(text) + @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n\\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" } + return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text + end + + def add_indent(src, indent) + src << (src.empty? || src[-1] == ?\n ? indent : ' ') + end + + def add_text(src, text) + return if text.empty? + add_indent(src, @indent) + src << @bufvar << '.push("' + s = escape_text(text) + if s[-1] == ?\n + s[-2, 2] = '' + src << s << "\");\n" + else + src << s << "\");" + end + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + add_indent(src, @indent) + code.strip! + src << "#{@bufvar}.push(#{code});" + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + add_indent(src, @indent) + code.strip! + src << "alert(\"*** debug: #{code}=\"+(#{code}));" + end + + def add_postamble(src) + src << "\n" if src[-1] == ?; + if @docwrite + src << @indent << 'document.write(' << @bufvar << ".join(\"\"));\n" + else + src << @indent << @bufvar << ".join(\"\");\n" + end + end + + end + + + ## + ## engine for JavaScript + ## + class Ejavascript < Basic::Engine + include JavascriptGenerator + end + + + class EscapedEjavascript < Ejavascript + include EscapeEnhancer + end + + + #class XmlEjavascript < Ejavascript + # include EscapeEnhancer + #end + + + class PI::Ejavascript < PI::Engine + include JavascriptGenerator + + def init_converter(properties={}) + @pi = 'js' + super(properties) + end + + end + + +end +#--end of require 'erubis/engine/ejavascript' + + +module Erubis + + + Ejs = Ejavascript + EscapedEjs = EscapedEjavascript + + + class CommandOptionError < ErubisError + end + + + ## + ## main class of command + ## + ## ex. + ## Main.main(ARGV) + ## + class Main + + def self.main(argv=ARGV) + status = 0 + begin + Main.new.execute(ARGV) + rescue CommandOptionError => ex + $stderr.puts ex.message + status = 1 + end + exit(status) + end + + def initialize + @single_options = "hvxztTSbeBXNUC" + @arg_options = "pcrfKIlaE" #C + @option_names = { + 'h' => :help, + 'v' => :version, + 'x' => :source, + 'z' => :syntax, + 'T' => :unexpand, + 't' => :untabify, # obsolete + 'S' => :intern, + 'b' => :bodyonly, + 'B' => :binding, + 'p' => :pattern, + 'c' => :context, + #'C' => :class, + 'e' => :escape, + 'r' => :requires, + 'f' => :datafiles, + 'K' => :kanji, + 'I' => :includes, + 'l' => :lang, + 'a' => :action, + 'E' => :enhancers, + 'X' => :notext, + 'N' => :linenum, + 'U' => :unique, + 'C' => :compact, + } + assert unless @single_options.length + @arg_options.length == @option_names.length + (@single_options + @arg_options).each_byte do |ch| + assert unless @option_names.key?(ch.chr) + end + end + + + def execute(argv=ARGV) + ## parse command-line options + options, properties = parse_argv(argv, @single_options, @arg_options) + filenames = argv + options['h'] = true if properties[:help] + opts = Object.new + arr = @option_names.collect {|ch, name| "def #{name}; @#{name}; end\n" } + opts.instance_eval arr.join + options.each do |ch, val| + name = @option_names[ch] + opts.instance_variable_set("@#{name}", val) + end + + ## help, version, enhancer list + if opts.help || opts.version + puts version() if opts.version + puts usage() if opts.help + puts show_properties() if opts.help + puts show_enhancers() if opts.help + return + end + + ## include path + opts.includes.split(/,/).each do |path| + $: << path + end if opts.includes + + ## require library + opts.requires.split(/,/).each do |library| + require library + end if opts.requires + + ## action + action = opts.action + action ||= 'syntax' if opts.syntax + action ||= 'convert' if opts.source || opts.notext + + ## lang + lang = opts.lang || 'ruby' + action ||= 'convert' if opts.lang + + ## class name of Eruby + #classname = opts.class + classname = nil + klass = get_classobj(classname, lang, properties[:pi]) + + ## kanji code + $KCODE = opts.kanji if opts.kanji + + ## read context values from yaml file + datafiles = opts.datafiles + context = load_datafiles(datafiles, opts) + + ## parse context data + if opts.context + context = parse_context_data(opts.context, opts) + end + + ## properties for engine + properties[:escape] = true if opts.escape && !properties.key?(:escape) + properties[:pattern] = opts.pattern if opts.pattern + #properties[:trim] = false if opts.notrim + properties[:preamble] = properties[:postamble] = false if opts.bodyonly + properties[:pi] = nil if properties[:pi] == true + + ## create engine and extend enhancers + engine = klass.new(nil, properties) + enhancers = get_enhancers(opts.enhancers) + #enhancers.push(Erubis::EscapeEnhancer) if opts.escape + enhancers.each do |enhancer| + engine.extend(enhancer) + engine.bipattern = properties[:bipattern] if enhancer == Erubis::BiPatternEnhancer + end + + ## no-text + engine.extend(Erubis::NoTextEnhancer) if opts.notext + + ## convert and execute + val = nil + msg = "Syntax OK\n" + if filenames && !filenames.empty? + filenames.each do |filename| + File.file?(filename) or + raise CommandOptionError.new("#{filename}: file not found.") + engine.filename = filename + engine.convert!(File.read(filename)) + val = do_action(action, engine, context, filename, opts) + msg = nil if val + end + else + engine.filename = filename = '(stdin)' + engine.convert!($stdin.read()) + val = do_action(action, engine, context, filename, opts) + msg = nil if val + end + print msg if action == 'syntax' && msg + + end + + private + + def do_action(action, engine, context, filename, opts) + case action + when 'convert' + s = manipulate_src(engine.src, opts) + when nil, 'exec', 'execute' + s = opts.binding ? engine.result(context.to_hash) : engine.evaluate(context) + when 'syntax' + s = check_syntax(filename, engine.src) + else + raise "*** internal error" + end + print s if s + return s + end + + def manipulate_src(source, opts) + flag_linenum = opts.linenum + flag_unique = opts.unique + flag_compact = opts.compact + if flag_linenum + n = 0 + source.gsub!(/^/) { n += 1; "%5d: " % n } + source.gsub!(/^ *\d+:\s+?\n/, '') if flag_compact + source.gsub!(/(^ *\d+:\s+?\n)+/, "\n") if flag_unique + else + source.gsub!(/^\s*?\n/, '') if flag_compact + source.gsub!(/(^\s*?\n)+/, "\n") if flag_unique + end + return source + end + + def usage(command=nil) + command ||= File.basename($0) + buf = [] + buf << "erubis - embedded program converter for multi-language" + buf << "Usage: #{command} [..options..] [file ...]" + buf << " -h, --help : help" + buf << " -v : version" + buf << " -x : show converted code" + buf << " -X : show converted code, only ruby code and no text part" + buf << " -N : numbering: add line numbers (for '-x/-X')" + buf << " -U : unique: compress empty lines to a line (for '-x/-X')" + buf << " -C : compact: remove empty lines (for '-x/-X')" + buf << " -b : body only: no preamble nor postamble (for '-x/-X')" + buf << " -z : syntax checking" + buf << " -e : escape (equal to '--E Escape')" + buf << " -p pattern : embedded pattern (default '<% %>')" + buf << " -l lang : convert but no execute (ruby/php/c/cpp/java/scheme/perl/js)" + buf << " -E e1,e2,... : enhancer names (Escape, PercentLine, BiPattern, ...)" + buf << " -I path : library include path" + buf << " -K kanji : kanji code (euc/sjis/utf8) (default none)" + buf << " -c context : context data string (yaml inline style or ruby code)" + buf << " -f datafile : context data file ('*.yaml', '*.yml', or '*.rb')" + #buf << " -t : expand tab characters in YAML file" + buf << " -T : don't expand tab characters in YAML file" + buf << " -S : convert mapping key from string to symbol in YAML file" + buf << " -B : invoke 'result(binding)' instead of 'evaluate(context)'" + buf << " --pi=name : parse '' instead of '<% ... %>'" + #' + # -T : don't trim spaces around '<% %>' + # -c class : class name (XmlEruby/PercentLineEruby/...) (default Eruby) + # -r library : require library + # -a : action (convert/execute) + return buf.join("\n") + end + + def collect_supported_properties(erubis_klass) + list = [] + erubis_klass.ancestors.each do |klass| + if klass.respond_to?(:supported_properties) + list.concat(klass.supported_properties) + end + end + return list + end + + def show_properties + s = "supported properties:\n" + basic_props = collect_supported_properties(Erubis::Basic::Engine) + pi_props = collect_supported_properties(Erubis::PI::Engine) + list = [] + common_props = basic_props & pi_props + list << ['(common)', common_props] + list << ['(basic)', basic_props - common_props] + list << ['(pi)', pi_props - common_props] + %w[ruby php c cpp java scheme perl javascript].each do |lang| + klass = Erubis.const_get("E#{lang}") + list << [lang, collect_supported_properties(klass) - basic_props] + end + list.each do |lang, props| + s << " * #{lang}\n" + props.each do |name, default_val, desc| + s << (" --%-23s : %s\n" % ["#{name}=#{default_val.inspect}", desc]) + end + end + s << "\n" + return s + end + + def show_enhancers + dict = {} + ObjectSpace.each_object(Module) do |mod| + dict[$1] = mod if mod.name =~ /\AErubis::(.*)Enhancer\z/ + end + s = "enhancers:\n" + dict.sort_by {|name, mod| name }.each do |name, mod| + s << (" %-13s : %s\n" % [name, mod.desc]) + end + return s + end + + def version + return Erubis::VERSION + end + + def parse_argv(argv, arg_none='', arg_required='', arg_optional='') + options = {} + context = {} + while argv[0] && argv[0][0] == ?- + optstr = argv.shift + optstr = optstr[1, optstr.length-1] + # + if optstr[0] == ?- # context + optstr =~ /\A\-([-\w]+)(?:=(.*))?/ or + raise CommandOptionError.new("-#{optstr}: invalid context value.") + name, value = $1, $2 + name = name.gsub(/-/, '_').intern + #value = value.nil? ? true : YAML.load(value) # error, why? + value = value.nil? ? true : YAML.load("---\n#{value}\n") + context[name] = value + # + else # options + while optstr && !optstr.empty? + optchar = optstr[0].chr + optstr = optstr[1..-1] + if arg_none.include?(optchar) + options[optchar] = true + elsif arg_required.include?(optchar) + arg = optstr.empty? ? argv.shift : optstr or + raise CommandOptionError.new("-#{optchar}: #{@option_names[optchar]} required.") + options[optchar] = arg + optstr = nil + elsif arg_optional.include?(optchar) + arg = optstr.empty? ? true : optstr + options[optchar] = arg + optstr = nil + else + raise CommandOptionError.new("-#{optchar}: unknown option.") + end + end + end + # + end # end of while + + return options, context + end + + + def untabify(str, width=8) + list = str.split(/\t/) + last = list.pop + sb = '' + list.each do |s| + column = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length + n = width - (column % width) + sb << s << (' ' * n) + end + sb << last + return sb + end + #-- + #def untabify(str, width=8) + # sb = '' + # str.scan(/(.*?)\t/m) do |s, | + # len = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length + # sb << s << (" " * (width - len % width)) + # end + # return $' ? (sb << $') : str + #end + #++ + + + def get_classobj(classname, lang, pi) + classname ||= "E#{lang}" + base_module = pi ? Erubis::PI : Erubis + begin + klass = base_module.const_get(classname) + rescue NameError + klass = nil + end + unless klass + if lang + msg = "-l #{lang}: invalid language name (class #{base_module.name}::#{classname} not found)." + else + msg = "-c #{classname}: invalid class name." + end + raise CommandOptionError.new(msg) + end + return klass + end + + def get_enhancers(enhancer_names) + return [] unless enhancer_names + enhancers = [] + shortname = nil + begin + enhancer_names.split(/,/).each do |name| + shortname = name + enhancers << Erubis.const_get("#{shortname}Enhancer") + end + rescue NameError + raise CommandOptionError.new("#{shortname}: no such Enhancer (try '-h' to show all enhancers).") + end + return enhancers + end + + def load_datafiles(filenames, opts) + context = Erubis::Context.new + return context unless filenames + filenames.split(/,/).each do |filename| + filename.strip! + test(?f, filename) or raise CommandOptionError.new("#{filename}: file not found.") + if filename =~ /\.ya?ml$/ + if opts.unexpand + ydoc = YAML.load_file(filename) + else + ydoc = YAML.load(untabify(File.read(filename))) + end + ydoc.is_a?(Hash) or raise CommandOptionError.new("#{filename}: root object is not a mapping.") + intern_hash_keys(ydoc) if opts.intern + context.update(ydoc) + elsif filename =~ /\.rb$/ + str = File.read(filename) + context2 = Erubis::Context.new + _instance_eval(context2, str) + context.update(context2) + else + CommandOptionError.new("#{filename}: '*.yaml', '*.yml', or '*.rb' required.") + end + end + return context + end + + def _instance_eval(_context, _str) + _context.instance_eval(_str) + end + + def parse_context_data(context_str, opts) + if context_str[0] == ?{ + require 'yaml' + ydoc = YAML.load(context_str) + unless ydoc.is_a?(Hash) + raise CommandOptionError.new("-c: root object is not a mapping.") + end + intern_hash_keys(ydoc) if opts.intern + return ydoc + else + context = Erubis::Context.new + context.instance_eval(context_str, '-c') + return context + end + end + + def intern_hash_keys(obj, done={}) + return if done.key?(obj.__id__) + case obj + when Hash + done[obj.__id__] = obj + obj.keys.each do |key| + obj[key.intern] = obj.delete(key) if key.is_a?(String) + end + obj.values.each do |val| + intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array) + end + when Array + done[obj.__id__] = obj + obj.each do |val| + intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array) + end + end + end + + def check_syntax(filename, src) + require 'open3' + #command = (ENV['_'] || 'ruby') + ' -wc' # ENV['_'] stores command name + bin = ENV['_'] && File.basename(ENV['_']) =~ /^ruby/ ? ENV['_'] : 'ruby' + command = bin + ' -wc' + stdin, stdout, stderr = Open3.popen3(command) + stdin.write(src) + stdin.close + result = stdout.read() + stdout.close() + errmsg = stderr.read() + stderr.close() + return nil unless errmsg && !errmsg.empty? + errmsg =~ /\A-:(\d+): / + linenum, message = $1, $' + return "#{filename}:#{linenum}: #{message}" + end + + if defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx" + def check_syntax(filename, src) + require 'compiler' + verbose = $VERBOSE + msg = nil + begin + $VERBOSE = true + Rubinius::Compiler.compile_string(src, filename) + rescue SyntaxError => ex + ex_linenum = ex.line + linenum = 0 + srcline = src.each_line do |line| + linenum += 1 + break line if linenum == ex_linenum + end + msg = "#{ex.message}\n" + msg << srcline + msg << "\n" unless srcline =~ /\n\z/ + msg << (" " * (ex.column-1)) << "^\n" + ensure + $VERBOSE = verbose + end + return msg + end + end + + end + +end +#--end of require 'erubis/main' + +Erubis::Main.main(ARGV) diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/erubis-run.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/erubis-run.rb new file mode 100644 index 000000000..44be6d462 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/erubis-run.rb @@ -0,0 +1,132 @@ +=begin + += apache/erubis-run.rb + +Copyright (C) 2007 Andrew R Jackson + +Built from original by Shugo Maeda: +Copyright (C) 2001 Shugo Maeda + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WAreqANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WAreqANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTEreqUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +== Overview + +Apache::ErubisRun handles eRuby files with erubis + +== Example of httpd.conf + + RubyRequire apache/erubis-run + + SetHandler ruby-object + RubyHandler Apache::ErubisRun.instance + + +=end + +require "singleton" +require "tempfile" +require "eruby" # Still needed to bring in a couple useful helper methods +require "erubis" + +module Erubis + @@cgi = nil + + def self.cgi + return @@cgi + end + + def self.cgi=(cgi) + @@cgi = cgi + end +end + +module Apache + class ErubisRun + include Singleton + + def handler(req) + status = check_request(req) + return status if(status != OK) + + filename = req.filename.dup + filename.untaint + erubis = compile(filename) + prerun(req) + begin + run(erubis, filename) + ensure + postrun(req) + end + + return OK + end + + private + + def initialize + @compiler = nil + end + + def check_request(req) + if(req.method_number == M_OPTIONS) + req.allowed |= (1 << M_GET) + req.allowed |= (1 << M_POST) + return DECLINED + end + if(req.finfo.mode == 0) + return NOT_FOUND + end + return OK + end + + def compile(filename) + @compiler = Erubis::Eruby.load_file(filename) # use caching version as much as possible + return @compiler + end + + def prerun(req) + Erubis.cgi = nil + req.setup_cgi_env + Apache.chdir_file(req.filename) + end + + def run(erubis, filename) + binding = eval_string_wrap("binding") + puts erubis.result(binding) # eval the code in the context of the same binding ERuby uses + end + + def postrun(req) + if(cgi = Erubis.cgi) + # TODO: pull the content type header from the cgi object, if set there? + elsif(req.sync_output or req.sync_header) + # Do nothing: header has already been sent + else + unless(req.content_type) + req.content_type = format("text/html;") + end + req.send_http_header + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/inline-require b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/inline-require new file mode 100755 index 000000000..de420c6f8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/inline-require @@ -0,0 +1,179 @@ +#!/usr/bin/env ruby + +### +### inline-require - expand 'require "foo"' into inline code +### +### usage: inline-require [-h] [-I path[,path2,..]] script +### +### copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +### 2.7.0 +### $Rev: 10 $ +### + + +class InlineRequire + + def initialize(opts={}) + @opts = opts.dup + end + attr_accessor :opts + + def expand(filename) + sbuf = '' + inlined = [] + level = 0 + expand_require(filename, sbuf, inlined, level) + return sbuf + end + + private + + def expand_require(filename, sbuf, inlined, level) + raise "*** assertion error" if inlined.include?(filename) + remove_comment = @opts[:remove_comment] + expand_indented = @opts[:expand_indented] + keep_filename = @opts[:keep_filename] + loaded_features = @opts[:loaded_features] + inlined << filename + prog = File.read(filename) + n = 0 + flag_if_file = false + prog.each_line do |line| + n += 1 + + ## comment out from 'if __FILE__ == $0' to 'end' + if level > 0 + if flag_if_file + sbuf << "#" << line + flag_if_file = false if line =~ /^end$/ + next + end + if line =~ /^if\s+__FILE__\s*==\s*\$0(\s+then)?$/ || line =~ /^if\s+\$0\s*==\s*__FILE__(\s+then)?$/ + flag_if_file = true + sbuf << "#" << line + next + end + end + + ## find 'require "foo"' and expand it to inline code + flag_inline = false + pattern = expand_indented ? /^[ \t]*require ['"](.*)["']\s*$/ \ + : /^require ['"](.*)["']\s*$/ + if line =~ pattern + libname = $1 + libpath = find_library(libname) + $stderr.puts "*** debug: libpath=#{libpath.inspect}" if $debug_mode + unless libpath + #raise "file '#{filename}'(line #{n}): library '#{libname}' not found." + warn "file '#{filename}'(line #{n}): library '#{libname}' not found." + else + flag_inline = true if libpath =~ /\.rb$/ && local_library?(libpath) + end + end + if !flag_inline + sbuf << line unless remove_comment && line =~ /^[ \t]*\#/ + elsif inlined.include?(libpath) + sbuf << "#--already included #{line}" unless remove_comment + else + if keep_filename + @n ||= 0; @n += 1; n = @n + end + sbuf << "#--begin of #{line}" unless remove_comment + sbuf << "$LOADED_FEATURES << '#{libname}.rb'\n" if loaded_features + sbuf << "eval <<'END_OF_SCRIPT__#{n}', TOPLEVEL_BINDING, '#{libpath}', 1\n" if keep_filename + expand_require(libpath, sbuf, inlined, level+1) + sbuf << "END_OF_SCRIPT__#{n}\n" if keep_filename + sbuf << "#--end of #{line}" unless remove_comment + end + end + #sbuf << "\n" if sbuf[-1] != ?\n + end + + def local_library?(libpath) + return libpath !~ /^\// + end + + def find_library(libname) + if libname =~ /^\.rb$/ + libname_rb = libname + libname_so = nil + elsif libname =~ /^\.so$/ + libname_rb = nil + libname_so = libname + else + libname_rb = libname + ".rb" + libname_so = libname + ".so" + end + $LOAD_PATH.each do |path| + if libname_rb + libpath = path + "/" + libname_rb + return libpath if test(?f, libpath) + end + if libname_so + libpath = path + "/" + libname_so + return libpath if test(?f, libpath) + end + end + return nil + end + +end + +if __FILE__ == $0 + + begin + require "optparse" + op = OptionParser.new + options = {} + op.on("-h", "--help") {|v| options[:help] = v } + op.on("-I libpath") {|v| options[:libpath] = v } + op.on("-i") {|v| options[:expand_indented] = v } + op.on("-c") {|v| options[:remove_comment] = v } + op.on("-k") {|v| options[:keep_filename] = v } + op.on("-l") {|v| options[:loaded_features] = v } + op.on("-D") {|v| options[:debug] = v } + op.parse!() + + $debug_mode = options[:debug] + + if options[:help] + command = File.basename($0) + puts "Usage: #{command} [-h] [-I path[,path2,..]] script" + puts " -h : help" + puts " -i : expand indented require(), too" + puts " -c : remove comment lines start with '#'" + puts " -k : keep filename (for debugging)" + puts " -l : append libs to $LOADED_FEATURES" + puts " -I path[,path2,...] : ruby library path" + exit(0) + end + + if options[:libpath] + rubylib_paths = options[:libpath].split(/,/) + else + rubylib_paths = [] + end + $stderr.puts "*** debug: rubylib_paths=#{rubylib_paths.inspect}" if $debug_mode + $LOAD_PATH.concat(rubylib_paths) + + filenames = ARGV + + opts = { :expand_indented => options[:expand_indented], + :remove_comment => options[:remove_comment], + :keep_filename => options[:keep_filename], + :loaded_features => options[:loaded_features] } + inline_require = InlineRequire.new(opts) + filenames.each do |filename| + print inline_require.expand(filename) + end + + rescue => ex + if $debug_mode + raise ex + else + $stderr.puts ex.message + end + + end + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis.rb new file mode 100644 index 000000000..88aed35d8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis.rb @@ -0,0 +1,73 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +## +## an implementation of eRuby +## +## ex. +## input = <<'END' +##
      +## <% for item in @list %> +##
    • <%= item %> +## <%== item %>
    • +## <% end %> +##
    +## END +## list = ['', 'b&b', '"ccc"'] +## eruby = Erubis::Eruby.new(input) +## puts "--- code ---" +## puts eruby.src +## puts "--- result ---" +## context = Erubis::Context.new() # or new(:list=>list) +## context[:list] = list +## puts eruby.evaluate(context) +## +## result: +## --- source --- +## _buf = ''; _buf << '
      +## '; for item in @list +## _buf << '
    • '; _buf << ( item ).to_s; _buf << ' +## '; _buf << ' '; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '
    • +## '; end +## _buf << '
    +## '; +## _buf.to_s +## --- result --- +##
      +##
    • +## <aaa>
    • +##
    • b&b +## b&b
    • +##
    • "ccc" +## "ccc"
    • +##
    +## + + +module Erubis + VERSION = ('$Release: 2.7.0 $' =~ /([.\d]+)/) && $1 +end + +require 'erubis/engine' +#require 'erubis/generator' +#require 'erubis/converter' +#require 'erubis/evaluator' +#require 'erubis/error' +#require 'erubis/context' +#requier 'erubis/util' +require 'erubis/helper' +require 'erubis/enhancer' +#require 'erubis/tiny' +require 'erubis/engine/eruby' +#require 'erubis/engine/enhanced' # enhanced eruby engines +#require 'erubis/engine/optimized' # generates optimized ruby code +#require 'erubis/engine/ephp' +#require 'erubis/engine/ec' +#require 'erubis/engine/ejava' +#require 'erubis/engine/escheme' +#require 'erubis/engine/eperl' +#require 'erubis/engine/ejavascript' + +require 'erubis/local-setting' diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/context.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/context.rb new file mode 100644 index 000000000..a70d297f5 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/context.rb @@ -0,0 +1,83 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +module Erubis + + + ## + ## context object for Engine#evaluate + ## + ## ex. + ## template = <<'END' + ## Hello <%= @user %>! + ## <% for item in @list %> + ## - <%= item %> + ## <% end %> + ## END + ## + ## context = Erubis::Context.new(:user=>'World', :list=>['a','b','c']) + ## # or + ## # context = Erubis::Context.new + ## # context[:user] = 'World' + ## # context[:list] = ['a', 'b', 'c'] + ## + ## eruby = Erubis::Eruby.new(template) + ## print eruby.evaluate(context) + ## + class Context + include Enumerable + + def initialize(hash=nil) + hash.each do |name, value| + self[name] = value + end if hash + end + + def [](key) + return instance_variable_get("@#{key}") + end + + def []=(key, value) + return instance_variable_set("@#{key}", value) + end + + def keys + return instance_variables.collect { |name| name[1..-1] } + end + + def each + instance_variables.each do |name| + key = name[1..-1] + value = instance_variable_get(name) + yield(key, value) + end + end + + def to_hash + hash = {} + self.keys.each { |key| hash[key] = self[key] } + return hash + end + + def update(context_or_hash) + arg = context_or_hash + if arg.is_a?(Hash) + arg.each do |key, val| + self[key] = val + end + else + arg.instance_variables.each do |varname| + key = varname[1..-1] + val = arg.instance_variable_get(varname) + self[key] = val + end + end + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/converter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/converter.rb new file mode 100644 index 000000000..a28a7ada8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/converter.rb @@ -0,0 +1,357 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/util' + +module Erubis + + + ## + ## convert + ## + module Converter + + attr_accessor :preamble, :postamble, :escape + + def self.supported_properties # :nodoc: + return [ + [:preamble, nil, "preamble (no preamble when false)"], + [:postamble, nil, "postamble (no postamble when false)"], + [:escape, nil, "escape expression or not in default"], + ] + end + + def init_converter(properties={}) + @preamble = properties[:preamble] + @postamble = properties[:postamble] + @escape = properties[:escape] + end + + ## convert input string into target language + def convert(input) + codebuf = "" # or [] + @preamble.nil? ? add_preamble(codebuf) : (@preamble && (codebuf << @preamble)) + convert_input(codebuf, input) + @postamble.nil? ? add_postamble(codebuf) : (@postamble && (codebuf << @postamble)) + @_proc = nil # clear cached proc object + return codebuf # or codebuf.join() + end + + protected + + ## + ## detect spaces at beginning of line + ## + def detect_spaces_at_bol(text, is_bol) + lspace = nil + if text.empty? + lspace = "" if is_bol + elsif text[-1] == ?\n + lspace = "" + else + rindex = text.rindex(?\n) + if rindex + s = text[rindex+1..-1] + if s =~ /\A[ \t]*\z/ + lspace = s + #text = text[0..rindex] + text[rindex+1..-1] = '' + end + else + if is_bol && text =~ /\A[ \t]*\z/ + #lspace = text + #text = nil + lspace = text.dup + text[0..-1] = '' + end + end + end + return lspace + end + + ## + ## (abstract) convert input to code + ## + def convert_input(codebuf, input) + not_implemented + end + + end + + + module Basic + end + + + ## + ## basic converter which supports '<% ... %>' notation. + ## + module Basic::Converter + include Erubis::Converter + + def self.supported_properties # :nodoc: + return [ + [:pattern, '<% %>', "embed pattern"], + [:trim, true, "trim spaces around <% ... %>"], + ] + end + + attr_accessor :pattern, :trim + + def init_converter(properties={}) + super(properties) + @pattern = properties[:pattern] + @trim = properties[:trim] != false + end + + protected + + ## return regexp of pattern to parse eRuby script + def pattern_regexp(pattern) + @prefix, @postfix = pattern.split() # '<% %>' => '<%', '%>' + #return /(.*?)(^[ \t]*)?#{@prefix}(=+|\#)?(.*?)-?#{@postfix}([ \t]*\r?\n)?/m + #return /(^[ \t]*)?#{@prefix}(=+|\#)?(.*?)-?#{@postfix}([ \t]*\r?\n)?/m + return /#{@prefix}(=+|-|\#|%)?(.*?)([-=])?#{@postfix}([ \t]*\r?\n)?/m + end + module_function :pattern_regexp + + #DEFAULT_REGEXP = /(.*?)(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m + #DEFAULT_REGEXP = /(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m + #DEFAULT_REGEXP = /<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m + DEFAULT_REGEXP = pattern_regexp('<% %>') + + public + + def convert_input(src, input) + pat = @pattern + regexp = pat.nil? || pat == '<% %>' ? DEFAULT_REGEXP : pattern_regexp(pat) + pos = 0 + is_bol = true # is beginning of line + input.scan(regexp) do |indicator, code, tailch, rspace| + match = Regexp.last_match() + len = match.begin(0) - pos + text = input[pos, len] + pos = match.end(0) + ch = indicator ? indicator[0] : nil + lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol) + is_bol = rspace ? true : false + add_text(src, text) if text && !text.empty? + ## * when '<%= %>', do nothing + ## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>' + if ch == ?= # <%= %> + rspace = nil if tailch && !tailch.empty? + add_text(src, lspace) if lspace + add_expr(src, code, indicator) + add_text(src, rspace) if rspace + elsif ch == ?\# # <%# %> + n = code.count("\n") + (rspace ? 1 : 0) + if @trim && lspace && rspace + add_stmt(src, "\n" * n) + else + add_text(src, lspace) if lspace + add_stmt(src, "\n" * n) + add_text(src, rspace) if rspace + end + elsif ch == ?% # <%% %> + s = "#{lspace}#{@prefix||='<%'}#{code}#{tailch}#{@postfix||='%>'}#{rspace}" + add_text(src, s) + else # <% %> + if @trim && lspace && rspace + add_stmt(src, "#{lspace}#{code}#{rspace}") + else + add_text(src, lspace) if lspace + add_stmt(src, code) + add_text(src, rspace) if rspace + end + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + add_text(src, rest) + end + + ## add expression code to src + def add_expr(src, code, indicator) + case indicator + when '=' + @escape ? add_expr_escaped(src, code) : add_expr_literal(src, code) + when '==' + @escape ? add_expr_literal(src, code) : add_expr_escaped(src, code) + when '===' + add_expr_debug(src, code) + end + end + + end + + + module PI + end + + ## + ## Processing Instructions (PI) converter for XML. + ## this class converts '' and '${...}' notation. + ## + module PI::Converter + include Erubis::Converter + + def self.desc # :nodoc: + "use processing instructions (PI) instead of '<% %>'" + end + + def self.supported_properties # :nodoc: + return [ + [:trim, true, "trim spaces around <% ... %>"], + [:pi, 'rb', "PI (Processing Instrunctions) name"], + [:embchar, '@', "char for embedded expression pattern('@{...}@')"], + [:pattern, '<% %>', "embed pattern"], + ] + end + + attr_accessor :pi, :prefix + + def init_converter(properties={}) + super(properties) + @trim = properties.fetch(:trim, true) + @pi = properties[:pi] if properties[:pi] + @embchar = properties[:embchar] || '@' + @pattern = properties[:pattern] + @pattern = '<% %>' if @pattern.nil? #|| @pattern == true + end + + def convert(input) + code = super(input) + return @header || @footer ? "#{@header}#{code}#{@footer}" : code + end + + protected + + def convert_input(codebuf, input) + unless @regexp + @pi ||= 'e' + ch = Regexp.escape(@embchar) + if @pattern + left, right = @pattern.split(' ') + @regexp = /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?|#{ch}(!*)?\{(.*?)\}#{ch}|#{left}(=+)(.*?)#{right}/m + else + @regexp = /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?|#{ch}(!*)?\{(.*?)\}#{ch}/m + end + end + # + is_bol = true + pos = 0 + input.scan(@regexp) do |pi_arg, stmt, rspace, + indicator1, expr1, indicator2, expr2| + match = Regexp.last_match + len = match.begin(0) - pos + text = input[pos, len] + pos = match.end(0) + lspace = stmt ? detect_spaces_at_bol(text, is_bol) : nil + is_bol = stmt && rspace ? true : false + add_text(codebuf, text) # unless text.empty? + # + if stmt + if @trim && lspace && rspace + add_pi_stmt(codebuf, "#{lspace}#{stmt}#{rspace}", pi_arg) + else + add_text(codebuf, lspace) if lspace + add_pi_stmt(codebuf, stmt, pi_arg) + add_text(codebuf, rspace) if rspace + end + else + add_pi_expr(codebuf, expr1 || expr2, indicator1 || indicator2) + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + add_text(codebuf, rest) + end + + #-- + #def convert_input(codebuf, input) + # parse_stmts(codebuf, input) + # #parse_stmts2(codebuf, input) + #end + # + #def parse_stmts(codebuf, input) + # #regexp = pattern_regexp(@pattern) + # @pi ||= 'e' + # @stmt_pattern ||= /<\?#{@pi}(?:-(\w+))?(\s.*?)\?>([ \t]*\r?\n)?/m + # is_bol = true + # pos = 0 + # input.scan(@stmt_pattern) do |pi_arg, code, rspace| + # match = Regexp.last_match + # len = match.begin(0) - pos + # text = input[pos, len] + # pos = match.end(0) + # lspace = detect_spaces_at_bol(text, is_bol) + # is_bol = rspace ? true : false + # parse_exprs(codebuf, text) # unless text.empty? + # if @trim && lspace && rspace + # add_pi_stmt(codebuf, "#{lspace}#{code}#{rspace}", pi_arg) + # else + # add_text(codebuf, lspace) + # add_pi_stmt(codebuf, code, pi_arg) + # add_text(codebuf, rspace) + # end + # end + # rest = $' || input + # parse_exprs(codebuf, rest) + #end + # + #def parse_exprs(codebuf, input) + # unless @expr_pattern + # ch = Regexp.escape(@embchar) + # if @pattern + # left, right = @pattern.split(' ') + # @expr_pattern = /#{ch}(!*)?\{(.*?)\}#{ch}|#{left}(=+)(.*?)#{right}/ + # else + # @expr_pattern = /#{ch}(!*)?\{(.*?)\}#{ch}/ + # end + # end + # pos = 0 + # input.scan(@expr_pattern) do |indicator1, code1, indicator2, code2| + # indicator = indicator1 || indicator2 + # code = code1 || code2 + # match = Regexp.last_match + # len = match.begin(0) - pos + # text = input[pos, len] + # pos = match.end(0) + # add_text(codebuf, text) # unless text.empty? + # add_pi_expr(codebuf, code, indicator) + # end + # rest = $' || input + # add_text(codebuf, rest) + #end + #++ + + def add_pi_stmt(codebuf, code, pi_arg) # :nodoc: + case pi_arg + when nil ; add_stmt(codebuf, code) + when 'header' ; @header = code + when 'footer' ; @footer = code + when 'comment'; add_stmt(codebuf, "\n" * code.count("\n")) + when 'value' ; add_expr_literal(codebuf, code) + else ; add_stmt(codebuf, code) + end + end + + def add_pi_expr(codebuf, code, indicator) # :nodoc: + case indicator + when nil, '', '==' # @{...}@ or <%== ... %> + @escape == false ? add_expr_literal(codebuf, code) : add_expr_escaped(codebuf, code) + when '!', '=' # @!{...}@ or <%= ... %> + @escape == false ? add_expr_escaped(codebuf, code) : add_expr_literal(codebuf, code) + when '!!', '===' # @!!{...}@ or <%=== ... %> + add_expr_debug(codebuf, code) + else + # ignore + end + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine.rb new file mode 100644 index 000000000..d020062be --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine.rb @@ -0,0 +1,120 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +require 'erubis/generator' +require 'erubis/converter' +require 'erubis/evaluator' +require 'erubis/context' + + +module Erubis + + + ## + ## (abstract) abstract engine class. + ## subclass must include evaluator and converter module. + ## + class Engine + #include Evaluator + #include Converter + #include Generator + + def initialize(input=nil, properties={}) + #@input = input + init_generator(properties) + init_converter(properties) + init_evaluator(properties) + @src = convert(input) if input + end + + + ## + ## convert input string and set it to @src + ## + def convert!(input) + @src = convert(input) + end + + + ## + ## load file, write cache file, and return engine object. + ## this method create code cache file automatically. + ## cachefile name can be specified with properties[:cachename], + ## or filname + 'cache' is used as default. + ## + def self.load_file(filename, properties={}) + cachename = properties[:cachename] || (filename + '.cache') + properties[:filename] = filename + timestamp = File.mtime(filename) + if test(?f, cachename) && timestamp == File.mtime(cachename) + engine = self.new(nil, properties) + engine.src = File.read(cachename) + else + input = File.open(filename, 'rb') {|f| f.read } + engine = self.new(input, properties) + tmpname = cachename + rand().to_s[1,8] + File.open(tmpname, 'wb') {|f| f.write(engine.src) } + File.rename(tmpname, cachename) + File.utime(timestamp, timestamp, cachename) + end + engine.src.untaint # ok? + return engine + end + + + ## + ## helper method to convert and evaluate input text with context object. + ## context may be Binding, Hash, or Object. + ## + def process(input, context=nil, filename=nil) + code = convert(input) + filename ||= '(erubis)' + if context.is_a?(Binding) + return eval(code, context, filename) + else + context = Context.new(context) if context.is_a?(Hash) + return context.instance_eval(code, filename) + end + end + + + ## + ## helper method evaluate Proc object with contect object. + ## context may be Binding, Hash, or Object. + ## + def process_proc(proc_obj, context=nil, filename=nil) + if context.is_a?(Binding) + filename ||= '(erubis)' + return eval(proc_obj, context, filename) + else + context = Context.new(context) if context.is_a?(Hash) + return context.instance_eval(&proc_obj) + end + end + + + end # end of class Engine + + + ## + ## (abstract) base engine class for Eruby, Eperl, Ejava, and so on. + ## subclass must include generator. + ## + class Basic::Engine < Engine + include Evaluator + include Basic::Converter + include Generator + end + + + class PI::Engine < Engine + include Evaluator + include PI::Converter + include Generator + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ec.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ec.rb new file mode 100644 index 000000000..4ca322262 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ec.rb @@ -0,0 +1,117 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/engine' +require 'erubis/enhancer' + + +module Erubis + + + module CGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:indent, '', "indent spaces (ex. ' ')"], + [:out, 'stdout', "output file pointer name"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= "escape" + @indent = properties[:indent] || '' + @out = properties[:out] || 'stdout' + end + + def add_preamble(src) + src << "#line 1 \"#{self.filename}\"\n" if self.filename + end + + def escape_text(text) + @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" } + text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } + return text + end + + def escaped_expr(code) + return "#{@escapefunc}(#{code.strip}, #{@out})" + end + + def add_text(src, text) + return if text.empty? + src << (src.empty? || src[-1] == ?\n ? @indent : ' ') + src << "fputs(" + i = 0 + text.each_line do |line| + src << "\n" << @indent << ' ' if i > 0 + i += 1 + src << '"' << escape_text(line) << '"' + end + src << ", #{@out});" #<< (text[-1] == ?\n ? "\n" : "") + src << "\n" if text[-1] == ?\n + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + src << @indent if src.empty? || src[-1] == ?\n + src << " fprintf(#{@out}, " << code.strip << ');' + end + + def add_expr_escaped(src, code) + src << @indent if src.empty? || src[-1] == ?\n + src << ' ' << escaped_expr(code) << ';' + end + + def add_expr_debug(src, code) + code.strip! + s = nil + if code =~ /\A\".*?\"\s*,\s*(.*)/ + s = $1.gsub(/[%"]/, '\\\1') + '=' + end + src << @indent if src.empty? || src[-1] == ?\n + src << " fprintf(stderr, \"*** debug: #{s}\" #{code});" + end + + def add_postamble(src) + # empty + end + + end + + + ## + ## engine for C + ## + class Ec < Basic::Engine + include CGenerator + end + + + class EscapedEc < Ec + include EscapeEnhancer + end + + + #class XmlEc < Ec + # include EscapeEnhancer + #end + + class PI::Ec < PI::Engine + include CGenerator + + def init_converter(properties={}) + @pi = 'c' + super(properties) + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ecpp.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ecpp.rb new file mode 100644 index 000000000..5ce2c4029 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ecpp.rb @@ -0,0 +1,113 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/engine' +require 'erubis/enhancer' + + +module Erubis + + + module CppGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:indent, '', "indent spaces (ex. ' ')"], + [:bufvar, '_buf', "buffer variable name"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= "escape" + @indent = properties[:indent] || '' + @bufvar = properties[:bufvar] || '_buf' + end + + def add_preamble(src) + src << "#line 1 \"#{self.filename}\"\n" if self.filename + end + + def escape_text(text) + @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" } + text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } + return text + end + + def escaped_expr(code) + return "#{@escapefunc}(#{code.strip})" + end + + def add_text(src, text) + return if text.empty? + src << (src.empty? || src[-1] == ?\n ? @indent : ' ') + src << "_buf << " + i = 0 + text.each_line do |line| + src << "\n" << @indent << " " if i > 0 + i += 1 + src << '"' << escape_text(line) << '"' + end + src << ";" #<< (text[-1] == ?\n ? "\n" : "") + src << "\n" if text[-1] == ?\n + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + src << @indent if src.empty? || src[-1] == ?\n + src << " _buf << (" << code.strip << ");" + end + + def add_expr_escaped(src, code) + src << @indent if src.empty? || src[-1] == ?\n + src << ' ' << escaped_expr(code) << ';' + end + + def add_expr_debug(src, code) + code.strip! + src << @indent if src.empty? || src[-1] == ?\n + src << " std::cerr << \"*** debug: #{code.gsub(/(")/, '\\\&')}=\" << (#{code});" + end + + def add_postamble(src) + # empty + end + + end + + + ## + ## engine for C + ## + class Ecpp < Basic::Engine + include CppGenerator + end + + + class EscapedEcpp < Ecpp + include EscapeEnhancer + end + + + #class XmlEcpp < Ecpp + # include EscapeEnhancer + #end + + class PI::Ecpp < PI::Engine + include CppGenerator + + def init_converter(properties={}) + @pi = 'cpp' + super(properties) + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ejava.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ejava.rb new file mode 100644 index 000000000..ba0790a52 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ejava.rb @@ -0,0 +1,110 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/engine' +require 'erubis/enhancer' + + +module Erubis + + + module JavaGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:indent, '', "indent spaces (ex. ' ')"], + [:bufvar, '_buf', "output buffer variable name"], + [:bufclass, 'StringBuffer', "output buffer class (ex. 'StringBuilder')"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= 'escape' + @indent = properties[:indent] || '' + @bufvar = properties[:bufvar] || '_buf' + @bufclass = properties[:bufclass] || 'StringBuffer' + end + + def add_preamble(src) + src << "#{@indent}#{@bufclass} #{@bufvar} = new #{@bufclass}();" + end + + def escape_text(text) + @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" } + return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text + end + + def add_text(src, text) + return if text.empty? + src << (src.empty? || src[-1] == ?\n ? @indent : ' ') + src << @bufvar << ".append(" + i = 0 + text.each_line do |line| + src << "\n" << @indent << ' + ' if i > 0 + i += 1 + src << '"' << escape_text(line) << '"' + end + src << ");" << (text[-1] == ?\n ? "\n" : "") + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + src << @indent if src.empty? || src[-1] == ?\n + code.strip! + src << " #{@bufvar}.append(#{code});" + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + code.strip! + src << @indent if src.empty? || src[-1] == ?\n + src << " System.err.println(\"*** debug: #{code}=\"+(#{code}));" + end + + def add_postamble(src) + src << "\n" if src[-1] == ?; + src << @indent << "return " << @bufvar << ".toString();\n" + #src << @indent << "System.out.print(" << @bufvar << ".toString());\n" + end + + end + + + ## + ## engine for Java + ## + class Ejava < Basic::Engine + include JavaGenerator + end + + + class EscapedEjava < Ejava + include EscapeEnhancer + end + + + #class XmlEjava < Ejava + # include EscapeEnhancer + #end + + class PI::Ejava < PI::Engine + include JavaGenerator + + def init_converter(properties={}) + @pi = 'java' + super(properties) + end + + end + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ejavascript.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ejavascript.rb new file mode 100644 index 000000000..22a52f519 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ejavascript.rb @@ -0,0 +1,119 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/engine' +require 'erubis/enhancer' + + +module Erubis + + + module JavascriptGenerator + include Generator + + def self.supported_properties() # :nodoc: + list = [] + #list << [:indent, '', "indent spaces (ex. ' ')"] + #list << [:bufvar, '_buf', "output buffer variable name"] + list << [:docwrite, true, "use 'document.write()' when true"] + return list + end + + def init_generator(properties={}) + super + @escapefunc ||= 'escape' + @indent = properties[:indent] || '' + @bufvar = properties[:bufvar] || '_buf' + @docwrite = properties[:docwrite] != false # '!= false' will be removed in the next release + end + + def add_preamble(src) + src << "#{@indent}var #{@bufvar} = [];" + end + + def escape_text(text) + @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n\\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" } + return text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] } || text + end + + def add_indent(src, indent) + src << (src.empty? || src[-1] == ?\n ? indent : ' ') + end + + def add_text(src, text) + return if text.empty? + add_indent(src, @indent) + src << @bufvar << '.push("' + s = escape_text(text) + if s[-1] == ?\n + s[-2, 2] = '' + src << s << "\");\n" + else + src << s << "\");" + end + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + add_indent(src, @indent) + code.strip! + src << "#{@bufvar}.push(#{code});" + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + add_indent(src, @indent) + code.strip! + src << "alert(\"*** debug: #{code}=\"+(#{code}));" + end + + def add_postamble(src) + src << "\n" if src[-1] == ?; + if @docwrite + src << @indent << 'document.write(' << @bufvar << ".join(\"\"));\n" + else + src << @indent << @bufvar << ".join(\"\");\n" + end + end + + end + + + ## + ## engine for JavaScript + ## + class Ejavascript < Basic::Engine + include JavascriptGenerator + end + + + class EscapedEjavascript < Ejavascript + include EscapeEnhancer + end + + + #class XmlEjavascript < Ejavascript + # include EscapeEnhancer + #end + + + class PI::Ejavascript < PI::Engine + include JavascriptGenerator + + def init_converter(properties={}) + @pi = 'js' + super(properties) + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/enhanced.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/enhanced.rb new file mode 100644 index 000000000..0121a5fab --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/enhanced.rb @@ -0,0 +1,126 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/enhancer' +require 'erubis/engine/eruby' + + +module Erubis + + + #-- + ## moved to engine/ruby.rb + #class EscapedEruby < Eruby + # include EscapeEnhancer + #end + #++ + + + #-- + ### (obsolete) + #class FastEruby < Eruby + # include FastEnhancer + #end + #++ + + + class StdoutEruby < Eruby + include StdoutEnhancer + end + + + class PrintOutEruby < Eruby + include PrintOutEnhancer + end + + + class PrintEnabledEruby < Eruby + include PrintEnabledEnhancer + end + + + class ArrayEruby < Eruby + include ArrayEnhancer + end + + + class ArrayBufferEruby < Eruby + include ArrayBufferEnhancer + end + + + class StringBufferEruby < Eruby + include StringBufferEnhancer + end + + + class StringIOEruby < Eruby + include StringIOEnhancer + end + + + class ErboutEruby < Eruby + include ErboutEnhancer + end + + + class NoTextEruby < Eruby + include NoTextEnhancer + end + + + class NoCodeEruby < Eruby + include NoCodeEnhancer + end + + + class SimplifiedEruby < Eruby + include SimplifyEnhancer + end + + + class StdoutSimplifiedEruby < Eruby + include StdoutEnhancer + include SimplifyEnhancer + end + + + class PrintOutSimplifiedEruby < Eruby + include PrintOutEnhancer + include SimplifyEnhancer + end + + + class BiPatternEruby < Eruby + include BiPatternEnhancer + end + + + class PercentLineEruby < Eruby + include PercentLineEnhancer + end + + + class PrefixedLineEruby < Eruby + include PrefixedLineEnhancer + end + + + class HeaderFooterEruby < Eruby + include HeaderFooterEnhancer + end + + + class DeleteIndentEruby < Eruby + include DeleteIndentEnhancer + end + + + class InterpolationEruby < Eruby + include InterpolationEnhancer + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/eperl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/eperl.rb new file mode 100644 index 000000000..aa206fade --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/eperl.rb @@ -0,0 +1,95 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/engine' +require 'erubis/enhancer' + + +module Erubis + + + module PerlGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:func, 'print', "function name"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= 'encode_entities' + @func = properties[:func] || 'print' + end + + def add_preamble(src) + src << "use HTML::Entities; "; + end + + def escape_text(text) + return text.gsub!(/['\\]/, '\\\\\&') || text + end + + def add_text(src, text) + src << @func << "('" << escape_text(text) << "'); " unless text.empty? + end + + def add_expr_literal(src, code) + code.strip! + src << @func << "(" << code << "); " + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + code.strip! + s = code.gsub(/\'/, "\\'") + src << @func << "('*** debug: #{code}=', #{code}, \"\\n\");" + end + + def add_stmt(src, code) + src << code + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + end + + end + + + ## + ## engine for Perl + ## + class Eperl < Basic::Engine + include PerlGenerator + end + + + class EscapedEperl < Eperl + include EscapeEnhancer + end + + + #class XmlEperl < Eperl + # include EscapeEnhancer + #end + + + class PI::Eperl < PI::Engine + include PerlGenerator + + def init_converter(properties={}) + @pi = 'perl' + super(properties) + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ephp.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ephp.rb new file mode 100644 index 000000000..0684b3dfd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ephp.rb @@ -0,0 +1,99 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/engine' +require 'erubis/enhancer' + + +module Erubis + + + module PhpGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [] + end + + def init_generator(properties={}) + super + @escapefunc ||= 'htmlspecialchars' + end + + def add_preamble(src) + # empty + end + + def escape_text(text) + return text.gsub!(/<\?xml\b/, '<?xml') || text + end + + def add_text(src, text) + src << escape_text(text) + end + + def add_expr_literal(src, code) + code.strip! + src << "" + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + code.strip! + s = code.gsub(/\'/, "\\'") + src << "" + end + + def add_stmt(src, code) + src << "\n" + else + src << code << "?>" + end + end + + def add_postamble(src) + # empty + end + + end + + + ## + ## engine for PHP + ## + class Ephp < Basic::Engine + include PhpGenerator + end + + + class EscapedEphp < Ephp + include EscapeEnhancer + end + + + #class XmlEphp < Ephp + # include EscapeEnhancer + #end + + + class PI::Ephp < PI::Engine + include PhpGenerator + + def init_converter(properties={}) + @pi = 'php' + super(properties) + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/eruby.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/eruby.rb new file mode 100644 index 000000000..02e3d4e1a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/eruby.rb @@ -0,0 +1,125 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/engine' +require 'erubis/enhancer' + + +module Erubis + + + ## + ## code generator for Ruby + ## + module RubyGenerator + include Generator + #include ArrayBufferEnhancer + include StringBufferEnhancer + + def init_generator(properties={}) + super + @escapefunc ||= "Erubis::XmlHelper.escape_xml" + @bufvar = properties[:bufvar] || "_buf" + end + + def self.supported_properties() # :nodoc: + return [] + end + + def escape_text(text) + text.gsub(/['\\]/, '\\\\\&') # "'" => "\\'", '\\' => '\\\\' + end + + def escaped_expr(code) + return "#{@escapefunc}(#{code})" + end + + #-- + #def add_preamble(src) + # src << "#{@bufvar} = [];" + #end + #++ + + def add_text(src, text) + src << " #{@bufvar} << '" << escape_text(text) << "';" unless text.empty? + end + + def add_stmt(src, code) + #src << code << ';' + src << code + src << ';' unless code[-1] == ?\n + end + + def add_expr_literal(src, code) + src << " #{@bufvar} << (" << code << ').to_s;' + end + + def add_expr_escaped(src, code) + src << " #{@bufvar} << " << escaped_expr(code) << ';' + end + + def add_expr_debug(src, code) + code.strip! + s = (code.dump =~ /\A"(.*)"\z/) && $1 + src << ' $stderr.puts("*** debug: ' << s << '=#{(' << code << ').inspect}");' + end + + #-- + #def add_postamble(src) + # src << "\n#{@bufvar}.join\n" + #end + #++ + + end + + + ## + ## engine for Ruby + ## + class Eruby < Basic::Engine + include RubyEvaluator + include RubyGenerator + end + + + ## + ## fast engine for Ruby + ## + class FastEruby < Eruby + include InterpolationEnhancer + end + + + ## + ## swtich '<%= %>' to escaped and '<%== %>' to not escaped + ## + class EscapedEruby < Eruby + include EscapeEnhancer + end + + + ## + ## sanitize expression (<%= ... %>) by default + ## + ## this is equivalent to EscapedEruby and is prepared only for compatibility. + ## + class XmlEruby < Eruby + include EscapeEnhancer + end + + + class PI::Eruby < PI::Engine + include RubyEvaluator + include RubyGenerator + + def init_converter(properties={}) + @pi = 'rb' + super(properties) + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/escheme.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/escheme.rb new file mode 100644 index 000000000..3f0042881 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/escheme.rb @@ -0,0 +1,114 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/engine' +require 'erubis/enhancer' + + +module Erubis + + + module SchemeGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [ + [:func, '_add', "function name (ex. 'display')"], + ] + end + + def init_generator(properties={}) + super + @escapefunc ||= 'escape' + @func = properties[:func] || '_add' # or 'display' + end + + def add_preamble(src) + return unless @func == '_add' + src << "(let ((_buf '())) " + \ + "(define (_add x) (set! _buf (cons x _buf))) " + #src << "(let* ((_buf '())" + \ + # " (_add (lambda (x) (set! _buf (cons x _buf))))) " + end + + def escape_text(text) + @table_ ||= { '"'=>'\\"', '\\'=>'\\\\' } + text.gsub!(/["\\]/) { |m| @table_[m] } + return text + end + + def escaped_expr(code) + code.strip! + return "(#{@escapefunc} #{code})" + end + + def add_text(src, text) + return if text.empty? + t = escape_text(text) + if t[-1] == ?\n + t[-1, 1] = '' + src << "(#{@func} \"" << t << "\\n\")\n" + else + src << "(#{@func} \"" << t << '")' + end + end + + def add_stmt(src, code) + src << code + end + + def add_expr_literal(src, code) + code.strip! + src << "(#{@func} #{code})" + end + + def add_expr_escaped(src, code) + add_expr_literal(src, escaped_expr(code)) + end + + def add_expr_debug(src, code) + s = (code.strip! || code).gsub(/\"/, '\\"') + src << "(display \"*** debug: #{s}=\")(display #{code.strip})(display \"\\n\")" + end + + def add_postamble(src) + return unless @func == '_add' + src << "\n" unless src[-1] == ?\n + src << " (reverse _buf))\n" + end + + end + + + ## + ## engine for Scheme + ## + class Escheme < Basic::Engine + include SchemeGenerator + end + + + class EscapedEscheme < Escheme + include EscapeEnhancer + end + + + #class XmlEscheme < Escheme + # include EscapeEnhancer + #end + + + class PI::Escheme < PI::Engine + include SchemeGenerator + + def init_converter(properties={}) + @pi = 'scheme' + super(properties) + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/optimized.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/optimized.rb new file mode 100644 index 000000000..593e14f74 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/optimized.rb @@ -0,0 +1,127 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +require 'erubis/engine/eruby' + + +module Erubis + + + module OptimizedGenerator + include Generator + + def self.supported_properties() # :nodoc: + return [] + end + + def init_generator(properties={}) + super + @escapefunc ||= "Erubis::XmlHelper.escape_xml" + @initialized = false + @prev_is_expr = false + end + + protected + + def escape_text(text) + text.gsub(/['\\]/, '\\\\\&') # "'" => "\\'", '\\' => '\\\\' + end + + def escaped_expr(code) + @escapefunc ||= 'Erubis::XmlHelper.escape_xml' + return "#{@escapefunc}(#{code})" + end + + def switch_to_expr(src) + return if @prev_is_expr + @prev_is_expr = true + src << ' _buf' + end + + def switch_to_stmt(src) + return unless @prev_is_expr + @prev_is_expr = false + src << ';' + end + + def add_preamble(src) + #@initialized = false + #@prev_is_expr = false + end + + def add_text(src, text) + return if text.empty? + if @initialized + switch_to_expr(src) + src << " << '" << escape_text(text) << "'" + else + src << "_buf = '" << escape_text(text) << "';" + @initialized = true + end + end + + def add_stmt(src, code) + switch_to_stmt(src) if @initialized + #super + src << code + src << ';' unless code[-1] == ?\n + end + + def add_expr_literal(src, code) + unless @initialized; src << "_buf = ''"; @initialized = true; end + switch_to_expr(src) + src << " << (" << code << ").to_s" + end + + def add_expr_escaped(src, code) + unless @initialized; src << "_buf = ''"; @initialized = true; end + switch_to_expr(src) + src << " << " << escaped_expr(code) + end + + def add_expr_debug(src, code) + code.strip! + s = (code.dump =~ /\A"(.*)"\z/) && $1 + src << ' $stderr.puts("*** debug: ' << s << '=#{(' << code << ').inspect}");' + end + + def add_postamble(src) + #super if @initialized + src << "\n_buf\n" if @initialized + end + + end # end of class OptimizedEruby + + + ## + ## Eruby class which generates optimized ruby code + ## + class OptimizedEruby < Basic::Engine # Eruby + include RubyEvaluator + include OptimizedGenerator + + def init_converter(properties={}) + @pi = 'rb' + super(properties) + end + + end + + + ## + ## XmlEruby class which generates optimized ruby code + ## + class OptimizedXmlEruby < OptimizedEruby + include EscapeEnhancer + + def add_expr_debug(src, code) + switch_to_stmt(src) if indicator == '===' && !@initialized + super + end + + end # end of class OptimizedXmlEruby + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/enhancer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/enhancer.rb new file mode 100644 index 000000000..9cece5711 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/enhancer.rb @@ -0,0 +1,723 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +module Erubis + + + ## + ## switch '<%= ... %>' to escaped and '<%== ... %>' to unescaped + ## + ## ex. + ## class XmlEruby < Eruby + ## include EscapeEnhancer + ## end + ## + ## this is language-indenedent. + ## + module EscapeEnhancer + + def self.desc # :nodoc: + "switch '<%= %>' to escaped and '<%== %>' to unescaped" + end + + #-- + #def self.included(klass) + # klass.class_eval <<-END + # alias _add_expr_literal add_expr_literal + # alias _add_expr_escaped add_expr_escaped + # alias add_expr_literal _add_expr_escaped + # alias add_expr_escaped _add_expr_literal + # END + #end + #++ + + def add_expr(src, code, indicator) + case indicator + when '=' + @escape ? add_expr_literal(src, code) : add_expr_escaped(src, code) + when '==' + @escape ? add_expr_escaped(src, code) : add_expr_literal(src, code) + when '===' + add_expr_debug(src, code) + end + end + + end + + + #-- + ## (obsolete) + #module FastEnhancer + #end + #++ + + + ## + ## use $stdout instead of string + ## + ## this is only for Eruby. + ## + module StdoutEnhancer + + def self.desc # :nodoc: + "use $stdout instead of array buffer or string buffer" + end + + def add_preamble(src) + src << "#{@bufvar} = $stdout;" + end + + def add_postamble(src) + src << "\n''\n" + end + + end + + + ## + ## use print statement instead of '_buf << ...' + ## + ## this is only for Eruby. + ## + module PrintOutEnhancer + + def self.desc # :nodoc: + "use print statement instead of '_buf << ...'" + end + + def add_preamble(src) + end + + def add_text(src, text) + src << " print '#{escape_text(text)}';" unless text.empty? + end + + def add_expr_literal(src, code) + src << " print((#{code}).to_s);" + end + + def add_expr_escaped(src, code) + src << " print #{escaped_expr(code)};" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + end + + end + + + ## + ## enable print function + ## + ## Notice: use Eruby#evaluate() and don't use Eruby#result() + ## to be enable print function. + ## + ## this is only for Eruby. + ## + module PrintEnabledEnhancer + + def self.desc # :nodoc: + "enable to use print function in '<% %>'" + end + + def add_preamble(src) + src << "@_buf = " + super + end + + def print(*args) + args.each do |arg| + @_buf << arg.to_s + end + end + + def evaluate(context=nil) + _src = @src + if context.is_a?(Hash) + context.each do |key, val| instance_variable_set("@#{key}", val) end + elsif context + context.instance_variables.each do |name| + instance_variable_set(name, context.instance_variable_get(name)) + end + end + return instance_eval(_src, (@filename || '(erubis)')) + end + + end + + + ## + ## return array instead of string + ## + ## this is only for Eruby. + ## + module ArrayEnhancer + + def self.desc # :nodoc: + "return array instead of string" + end + + def add_preamble(src) + src << "#{@bufvar} = [];" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "#{@bufvar}\n" + end + + end + + + ## + ## use an Array object as buffer (included in Eruby by default) + ## + ## this is only for Eruby. + ## + module ArrayBufferEnhancer + + def self.desc # :nodoc: + "use an Array object for buffering (included in Eruby class)" + end + + def add_preamble(src) + src << "_buf = [];" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "_buf.join\n" + end + + end + + + ## + ## use String class for buffering + ## + ## this is only for Eruby. + ## + module StringBufferEnhancer + + def self.desc # :nodoc: + "use a String object for buffering" + end + + def add_preamble(src) + src << "#{@bufvar} = '';" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "#{@bufvar}.to_s\n" + end + + end + + + ## + ## use StringIO class for buffering + ## + ## this is only for Eruby. + ## + module StringIOEnhancer # :nodoc: + + def self.desc # :nodoc: + "use a StringIO object for buffering" + end + + def add_preamble(src) + src << "#{@bufvar} = StringIO.new;" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "#{@bufvar}.string\n" + end + + end + + + ## + ## set buffer variable name to '_erbout' as well as '_buf' + ## + ## this is only for Eruby. + ## + module ErboutEnhancer + + def self.desc # :nodoc: + "set '_erbout = _buf = \"\";' to be compatible with ERB." + end + + def add_preamble(src) + src << "_erbout = #{@bufvar} = '';" + end + + def add_postamble(src) + src << "\n" unless src[-1] == ?\n + src << "#{@bufvar}.to_s\n" + end + + end + + + ## + ## remove text and leave code, especially useful when debugging. + ## + ## ex. + ## $ erubis -s -E NoText file.eruby | more + ## + ## this is language independent. + ## + module NoTextEnhancer + + def self.desc # :nodoc: + "remove text and leave code (useful when debugging)" + end + + def add_text(src, text) + src << ("\n" * text.count("\n")) + if text[-1] != ?\n + text =~ /^(.*?)\z/ + src << (' ' * $1.length) + end + end + + end + + + ## + ## remove code and leave text, especially useful when validating HTML tags. + ## + ## ex. + ## $ erubis -s -E NoCode file.eruby | tidy -errors + ## + ## this is language independent. + ## + module NoCodeEnhancer + + def self.desc # :nodoc: + "remove code and leave text (useful when validating HTML)" + end + + def add_preamble(src) + end + + def add_postamble(src) + end + + def add_text(src, text) + src << text + end + + def add_expr(src, code, indicator) + src << "\n" * code.count("\n") + end + + def add_stmt(src, code) + src << "\n" * code.count("\n") + end + + end + + + ## + ## get convert faster, but spaces around '<%...%>' are not trimmed. + ## + ## this is language-independent. + ## + module SimplifyEnhancer + + def self.desc # :nodoc: + "get convert faster but leave spaces around '<% %>'" + end + + #DEFAULT_REGEXP = /(^[ \t]*)?<%(=+|\#)?(.*?)-?%>([ \t]*\r?\n)?/m + SIMPLE_REGEXP = /<%(=+|\#)?(.*?)-?%>/m + + def convert(input) + src = "" + add_preamble(src) + #regexp = pattern_regexp(@pattern) + pos = 0 + input.scan(SIMPLE_REGEXP) do |indicator, code| + match = Regexp.last_match + index = match.begin(0) + text = input[pos, index - pos] + pos = match.end(0) + add_text(src, text) + if !indicator # <% %> + add_stmt(src, code) + elsif indicator[0] == ?\# # <%# %> + n = code.count("\n") + add_stmt(src, "\n" * n) + else # <%= %> + add_expr(src, code, indicator) + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + add_text(src, rest) + add_postamble(src) + return src + end + + end + + + ## + ## enable to use other embedded expression pattern (default is '\[= =\]'). + ## + ## notice! this is an experimental. spec may change in the future. + ## + ## ex. + ## input = < + ## <%= item %> : <%== item %> + ## [= item =] : [== item =] + ## <% end %> + ## END + ## + ## class BiPatternEruby + ## include BiPatternEnhancer + ## end + ## eruby = BiPatternEruby.new(input, :bipattern=>'\[= =\]') + ## list = ['
    ', 'b&b', '"c"'] + ## print eruby.result(binding()) + ## + ## ## output + ## : <a> + ## : <a> + ## b&b : b&b + ## b&b : b&b + ## "c" : "c" + ## "c" : "c" + ## + ## this is language independent. + ## + module BiPatternEnhancer + + def self.desc # :nodoc: + "another embedded expression pattern (default '\[= =\]')." + end + + def initialize(input, properties={}) + self.bipattern = properties[:bipattern] # or '\$\{ \}' + super + end + + ## when pat is nil then '\[= =\]' is used + def bipattern=(pat) # :nodoc: + @bipattern = pat || '\[= =\]' + pre, post = @bipattern.split() + @bipattern_regexp = /(.*?)#{pre}(=*)(.*?)#{post}/m + end + + def add_text(src, text) + return unless text + m = nil + text.scan(@bipattern_regexp) do |txt, indicator, code| + m = Regexp.last_match + super(src, txt) + add_expr(src, code, '=' + indicator) + end + #rest = $' || text # ruby1.8 + rest = m ? text[m.end(0)..-1] : text # ruby1.9 + super(src, rest) + end + + end + + + ## + ## regards lines starting with '^[ \t]*%' as program code + ## + ## in addition you can specify prefix character (default '%') + ## + ## this is language-independent. + ## + module PrefixedLineEnhancer + + def self.desc # :nodoc: + "regard lines matched to '^[ \t]*%' as program code" + end + + def init_generator(properties={}) + super + @prefixchar = properties[:prefixchar] + end + + def add_text(src, text) + unless @prefixrexp + @prefixchar ||= '%' + @prefixrexp = Regexp.compile("^([ \\t]*)\\#{@prefixchar}(.*?\\r?\\n)") + end + pos = 0 + text2 = '' + text.scan(@prefixrexp) do + space = $1 + line = $2 + space, line = '', $1 unless $2 + match = Regexp.last_match + len = match.begin(0) - pos + str = text[pos, len] + pos = match.end(0) + if text2.empty? + text2 = str + else + text2 << str + end + if line[0, 1] == @prefixchar + text2 << space << line + else + super(src, text2) + text2 = '' + add_stmt(src, space + line) + end + end + #rest = pos == 0 ? text : $' # ruby1.8 + rest = pos == 0 ? text : text[pos..-1] # ruby1.9 + unless text2.empty? + text2 << rest if rest + rest = text2 + end + super(src, rest) + end + + end + + + ## + ## regards lines starting with '%' as program code + ## + ## this is for compatibility to eruby and ERB. + ## + ## this is language-independent. + ## + module PercentLineEnhancer + include PrefixedLineEnhancer + + def self.desc # :nodoc: + "regard lines starting with '%' as program code" + end + + #-- + #def init_generator(properties={}) + # super + # @prefixchar = '%' + # @prefixrexp = /^\%(.*?\r?\n)/ + #end + #++ + + def add_text(src, text) + unless @prefixrexp + @prefixchar = '%' + @prefixrexp = /^\%(.*?\r?\n)/ + end + super(src, text) + end + + end + + + ## + ## [experimental] allow header and footer in eRuby script + ## + ## ex. + ## ==================== + ## ## without header and footer + ## $ cat ex1.eruby + ## <% def list_items(list) %> + ## <% for item in list %> + ##
  • <%= item %>
  • + ## <% end %> + ## <% end %> + ## + ## $ erubis -s ex1.eruby + ## _buf = []; def list_items(list) + ## ; for item in list + ## ; _buf << '
  • '; _buf << ( item ).to_s; _buf << '
  • + ## '; end + ## ; end + ## ; + ## _buf.join + ## + ## ## with header and footer + ## $ cat ex2.eruby + ## + ## <% for item in list %> + ##
  • <%= item %>
  • + ## <% end %> + ## + ## + ## $ erubis -s -c HeaderFooterEruby ex4.eruby + ## + ## def list_items(list) + ## _buf = []; _buf << ' + ## '; for item in list + ## ; _buf << '
  • '; _buf << ( item ).to_s; _buf << '
  • + ## '; end + ## ; _buf << ' + ## '; + ## _buf.join + ## end + ## + ## ==================== + ## + ## this is language-independent. + ## + module HeaderFooterEnhancer + + def self.desc # :nodoc: + "allow header/footer in document (ex. '')" + end + + HEADER_FOOTER_PATTERN = /(.*?)(^[ \t]*)?([ \t]*\r?\n)?/m + + def add_text(src, text) + m = nil + text.scan(HEADER_FOOTER_PATTERN) do |txt, lspace, word, content, rspace| + m = Regexp.last_match + flag_trim = @trim && lspace && rspace + super(src, txt) + content = "#{lspace}#{content}#{rspace}" if flag_trim + super(src, lspace) if !flag_trim && lspace + instance_variable_set("@#{word}", content) + super(src, rspace) if !flag_trim && rspace + end + #rest = $' || text # ruby1.8 + rest = m ? text[m.end(0)..-1] : text # ruby1.9 + super(src, rest) + end + + attr_accessor :header, :footer + + def convert(input) + source = super + return @src = "#{@header}#{source}#{@footer}" + end + + end + + + ## + ## delete indentation of HTML. + ## + ## this is language-independent. + ## + module DeleteIndentEnhancer + + def self.desc # :nodoc: + "delete indentation of HTML." + end + + def convert_input(src, input) + input = input.gsub(/^[ \t]+<%=title%>" into "_buf << %Q`

    #{title}

    `" + ## + ## this is only for Eruby. + ## + module InterpolationEnhancer + + def self.desc # :nodoc: + "convert '

    <%=text%>

    ' into '_buf << %Q`

    \#{text}

    `'" + end + + def convert_input(src, input) + pat = @pattern + regexp = pat.nil? || pat == '<% %>' ? Basic::Converter::DEFAULT_REGEXP : pattern_regexp(pat) + pos = 0 + is_bol = true # is beginning of line + str = '' + input.scan(regexp) do |indicator, code, tailch, rspace| + match = Regexp.last_match() + len = match.begin(0) - pos + text = input[pos, len] + pos = match.end(0) + ch = indicator ? indicator[0] : nil + lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol) + is_bol = rspace ? true : false + _add_text_to_str(str, text) + ## * when '<%= %>', do nothing + ## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>' + if ch == ?= # <%= %> + rspace = nil if tailch && !tailch.empty? + str << lspace if lspace + add_expr(str, code, indicator) + str << rspace if rspace + elsif ch == ?\# # <%# %> + n = code.count("\n") + (rspace ? 1 : 0) + if @trim && lspace && rspace + add_text(src, str) + str = '' + add_stmt(src, "\n" * n) + else + str << lspace if lspace + add_text(src, str) + str = '' + add_stmt(src, "\n" * n) + str << rspace if rspace + end + else # <% %> + if @trim && lspace && rspace + add_text(src, str) + str = '' + add_stmt(src, "#{lspace}#{code}#{rspace}") + else + str << lspace if lspace + add_text(src, str) + str = '' + add_stmt(src, code) + str << rspace if rspace + end + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + _add_text_to_str(str, rest) + add_text(src, str) + end + + def add_text(src, text) + return if !text || text.empty? + #src << " _buf << %Q`" << text << "`;" + if text[-1] == ?\n + text[-1] = "\\n" + src << " #{@bufvar} << %Q`#{text}`\n" + else + src << " #{@bufvar} << %Q`#{text}`;" + end + end + + def _add_text_to_str(str, text) + return if !text || text.empty? + str << text.gsub(/[`\#\\]/, '\\\\\&') + end + + def add_expr_escaped(str, code) + str << "\#{#{escaped_expr(code)}}" + end + + def add_expr_literal(str, code) + str << "\#{#{code}}" + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/error.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/error.rb new file mode 100644 index 000000000..657696354 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/error.rb @@ -0,0 +1,23 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +module Erubis + + + ## + ## base error class + ## + class ErubisError < StandardError + end + + + ## + ## raised when method or function is not supported + ## + class NotSupportedError < ErubisError + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb new file mode 100644 index 000000000..688b82126 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb @@ -0,0 +1,88 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/error' +require 'erubis/context' + + +module Erubis + + EMPTY_BINDING = binding() + + + ## + ## evaluate code + ## + module Evaluator + + def self.supported_properties # :nodoc: + return [] + end + + attr_accessor :src, :filename + + def init_evaluator(properties) + @filename = properties[:filename] + end + + def result(*args) + raise NotSupportedError.new("evaluation of code except Ruby is not supported.") + end + + def evaluate(*args) + raise NotSupportedError.new("evaluation of code except Ruby is not supported.") + end + + end + + + ## + ## evaluator for Ruby + ## + module RubyEvaluator + include Evaluator + + def self.supported_properties # :nodoc: + list = Evaluator.supported_properties + return list + end + + ## eval(@src) with binding object + def result(_binding_or_hash=TOPLEVEL_BINDING) + _arg = _binding_or_hash + if _arg.is_a?(Hash) + _b = binding() + eval _arg.collect{|k,v| "#{k} = _arg[#{k.inspect}]; "}.join, _b + elsif _arg.is_a?(Binding) + _b = _arg + elsif _arg.nil? + _b = binding() + else + raise ArgumentError.new("#{self.class.name}#result(): argument should be Binding or Hash but passed #{_arg.class.name} object.") + end + return eval(@src, _b, (@filename || '(erubis')) + end + + ## invoke context.instance_eval(@src) + def evaluate(_context=Context.new) + _context = Context.new(_context) if _context.is_a?(Hash) + #return _context.instance_eval(@src, @filename || '(erubis)') + #@_proc ||= eval("proc { #{@src} }", Erubis::EMPTY_BINDING, @filename || '(erubis)') + @_proc ||= eval("proc { #{@src} }", binding(), @filename || '(erubis)') + return _context.instance_eval(&@_proc) + end + + ## if object is an Class or Module then define instance method to it, + ## else define singleton method to it. + def def_method(object, method_name, filename=nil) + m = object.is_a?(Module) ? :module_eval : :instance_eval + object.__send__(m, "def #{method_name}; #{@src}; end", filename || @filename || '(erubis)') + end + + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/generator.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/generator.rb new file mode 100644 index 000000000..b9335fd60 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/generator.rb @@ -0,0 +1,85 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +require 'erubis/util' + +module Erubis + + + ## + ## code generator, called by Converter module + ## + module Generator + + def self.supported_properties() # :nodoc: + return [ + [:escapefunc, nil, "escape function name"], + ] + end + + attr_accessor :escapefunc + + def init_generator(properties={}) + @escapefunc = properties[:escapefunc] + end + + + ## (abstract) escape text string + ## + ## ex. + ## def escape_text(text) + ## return text.dump + ## # or return "'" + text.gsub(/['\\]/, '\\\\\&') + "'" + ## end + def escape_text(text) + not_implemented + end + + ## return escaped expression code (ex. 'h(...)' or 'htmlspecialchars(...)') + def escaped_expr(code) + code.strip! + return "#{@escapefunc}(#{code})" + end + + ## (abstract) add @preamble to src + def add_preamble(src) + not_implemented + end + + ## (abstract) add text string to src + def add_text(src, text) + not_implemented + end + + ## (abstract) add statement code to src + def add_stmt(src, code) + not_implemented + end + + ## (abstract) add expression literal code to src. this is called by add_expr(). + def add_expr_literal(src, code) + not_implemented + end + + ## (abstract) add escaped expression code to src. this is called by add_expr(). + def add_expr_escaped(src, code) + not_implemented + end + + ## (abstract) add expression code to src for debug. this is called by add_expr(). + def add_expr_debug(src, code) + not_implemented + end + + ## (abstract) add @postamble to src + def add_postamble(src) + not_implemented + end + + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helper.rb new file mode 100644 index 000000000..1a24c5866 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helper.rb @@ -0,0 +1,47 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + + +module Erubis + + ## + ## helper for xml + ## + module XmlHelper + + module_function + + ESCAPE_TABLE = { + '&' => '&', + '<' => '<', + '>' => '>', + '"' => '"', + "'" => ''', + } + + def escape_xml(value) + value.to_s.gsub(/[&<>"]/) { |s| ESCAPE_TABLE[s] } # or /[&<>"']/ + #value.to_s.gsub(/[&<>"]/) { ESCAPE_TABLE[$&] } + end + + def escape_xml2(value) + return value.to_s.gsub(/\&/,'&').gsub(//,'>').gsub(/"/,'"') + end + + alias h escape_xml + alias html_escape escape_xml + + def url_encode(str) + return str.gsub(/[^-_.a-zA-Z0-9]+/) { |s| + s.unpack('C*').collect { |i| "%%%02X" % i }.join + } + end + + alias u url_encode + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_form_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_form_helper.rb new file mode 100644 index 000000000..945698b9c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_form_helper.rb @@ -0,0 +1,197 @@ +### +### $Release: 2.7.0 $ +### copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +### + + +module Erubis + module Helpers + module RailsFormHelper + end + end +end + + +module Erubis::Helpers::RailsFormHelper + + +if ActionPack::VERSION::MAJOR == 1 ### Rails 1.X + def pp_template_filename(basename) + return "#{RAILS_ROOT}/app/views/#{controller.controller_name}/#{basename}.rhtml" + end +else ### Rails 2.X + def pp_template_filename(basename) + fname = "#{RAILS_ROOT}/app/views/#{controller.controller_name}/#{basename}.html.erb" + return fname if test(?f, fname) + return "#{RAILS_ROOT}/app/views/#{controller.controller_name}/#{basename}.rhtml" + end +end + + def pp_render_partial(basename) + basename = "_#{basename}" unless basename[0] == ?_ + filename = pp_template_filename(basename) + preprocessor = _create_preprocessor(File.read(filename)) + return preprocessor.evaluate(_preprocessing_context_object()) + end + + def pp_error_on(object_name, method) + s = '' + s << "<% _stag, _etag = _pp_error_tags(@#{object_name}.errors.on('#{method}')) %>" + s << "<%= _stag %>" + s << yield(object_name, method) + s << "<%= _etag %>" + return s + end + + def _pp_error_tags(value) + return value ? ['
    ', '
    '] : ['', ''] + end + + def _pp_remove_error_div(s) + s.sub!(/\A
    (.*)<\/div>\z/, '\1') + return s + end + + def pp_tag_helper(helper, object_name, method, options={}) + if object_name.is_a?(ActionView::Helpers::FormHelper) + object_name = object_name.object_name + end + unless options.key?(:value) || options.key?('value') + options['value'] = _?("h @#{object_name}.#{method}") + end + #$stderr.puts "*** debug: pp_tag_helper(): options=#{options.inspect}" + return pp_error_on(object_name, method) { + s = __send__(helper, object_name, method, options) + _pp_remove_error_div(s) + } + end + + def pp_form_tag(url_for_options={}, options={}, *parameters_for_url, &block) + return form_tag(url_for_options, options, *parameters_for_url, &block) + end + + #-- + #def pp_form_for(object_name, *args, &block) + # return form_for(object_name, *args, &block) + #end + #++ + + def pp_text_field(object_name, method, options={}) + return pp_tag_helper(:text_field, object_name, method, options) + end + + def pp_password_field(object_name, method, options={}) + return pp_tag_helper(:password_field, object_name, method, options) + end + + def pp_hidden_field(object_name, method, options={}) + return pp_tag_helper(:hidden_field, object_name, method, options) + end + + def pp_file_field(object_name, method, options={}) + return pp_tag_helper(:file_field, object_name, method, options) + end + + def pp_text_area(object_name, method, options={}) + return pp_tag_helper(:text_area, object_name, method, options) + end + + def pp_check_box(object_name, method, options={}, checked_value="1", unchecked_value="0") + s = check_box(object_name, method, options, checked_value, unchecked_value) + s.sub!(/\schecked=\"checked\"/, '') + s.sub!(/type="checkbox"/, "\\&<%= _pp_check_box_checked?(@#{object_name}.#{method}, #{checked_value.inspect}) ? ' checked=\"checked\"' : '' %>") + return pp_error_on(object_name, method) { _pp_remove_error_div(s) } + end + + def _pp_check_box_checked?(value, checked_value) + return ActionView::Helpers::InstanceTag::check_box_checked?(value, checked_value) + end + + def pp_radio_button(object_name, method, tag_value, options={}) + s = radio_button(object_name, method, tag_value, options) + s.sub!(/\schecked=\"checked\"/, '') + s.sub!(/type="radio"/, "\\&<%= _pp_radio_button_checked?(@#{object_name}.#{method}, #{tag_value.inspect}) ? ' checked=\"checked\"' : '' %>") + return pp_error_on(object_name, method) { _pp_remove_error_div(s) } + end + + def _pp_radio_button_checked?(value, tag_value) + return ActionView::Helpers::InstanceTag::radio_button_checked?(value, tag_value) + end + + def _pp_select(object, method, collection, priority_collection, options={}, html_options={}) + return pp_error_on(object, method) do + s = "" + ## start tag + s << "" + s + end + end + + def _pp_select_options(s, collection, selected, operator) + for item in collection + value, text = item.is_a?(Array) ? item : [item, item] + if !selected + t = '' + elsif operator == 'delete' + t = "<%= _table.delete(#{value.inspect}) %>" + else + t = "<%= _table[#{value.inspect}] %>" + end + s << "\n" + end + end + + def pp_select(object, method, collection, options={}, html_options={}) + return _pp_select(object, method, collection, nil, options, html_options) + end + + def pp_collection_select(object, method, collection, value_method, text_method, options={}, html_options={}) + collection2 = collection.collect { |e| + [e.__send__(value_method), e.__send__(text_method)] + } + return _pp_select(object, method, collection2, nil, options, html_options) + end + + def pp_country_select(object, method, priority_countries=nil, options={}, html_options={}) + collection = ActionView::Helpers::FormOptionsHelper::COUNTRIES + return _pp_select(object, method, collection, priority_countries, options, html_options) + end + + def pp_time_zone_select(object, method, priority_zones=nil, options={}, html_options={}) + model = options[:model] || options['model'] || TimeZone + collection = model.all.collect { |e| [e.name, e.to_s] } + return _pp_select(object, method, collection, priority_zones, options, html_options) + end + + def pp_submit_tag(value="Save changes", options={}) + return submit_tag(value, options) + end + + def pp_image_submit_tag(source, options={}) + return image_submit_tag(source, options) + end + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_helper.rb new file mode 100644 index 000000000..1c89c9bdc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_helper.rb @@ -0,0 +1,353 @@ +### +### $Release: 2.7.0 $ +### copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +### + + +require 'erubis' +require 'erubis/preprocessing' + + +module Erubis + + class Eruby + include ErboutEnhancer # will generate '_erbout = _buf = ""; ' + end + + class FastEruby + include ErboutEnhancer # will generate '_erbout = _buf = ""; ' + end + + module Helpers + + ## + ## helper module for Ruby on Rails + ## + ## howto: + ## + ## 1. add the folliwng code in your 'config/environment.rb' + ## + ## require 'erubis/helpers/rails_helper' + ## #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby # or Erubis::FastEruby + ## #Erubis::Helpers::RailsHelper.init_properties = {} + ## #Erubis::Helpers::RailsHelper.show_src = false # set true for debugging + ## #Erubis::Helpers::RailsHelper.preprocessing = true # set true to enable preprocessing + ## + ## 2. restart web server. + ## + ## if Erubis::Helper::Rails.show_src is true, Erubis prints converted Ruby code + ## into log file ('log/development.log' or so). if false, it doesn't. + ## if nil, Erubis prints converted Ruby code if ENV['RAILS_ENV'] == 'development'. + ## + module RailsHelper + + #cattr_accessor :init_properties + @@engine_class = ::Erubis::Eruby + #@@engine_class = ::Erubis::FastEruby + def self.engine_class + @@engine_class + end + def self.engine_class=(klass) + @@engine_class = klass + end + + #cattr_accessor :init_properties + @@init_properties = {} + def self.init_properties + @@init_properties + end + def self.init_properties=(hash) + @@init_properties = hash + end + + #cattr_accessor :show_src + @@show_src = nil + def self.show_src + @@show_src + end + def self.show_src=(flag) + @@show_src = flag + end + + #cattr_accessor :preprocessing + @@preprocessing = false + def self.preprocessing + @@preprocessing + end + def self.preprocessing=(flag) + @@preprocessing = flag + end + + + ## define class for backward-compatibility + class PreprocessingEruby < Erubis::PreprocessingEruby # :nodoc: + end + + + module TemplateConverter + ## covert eRuby string into ruby code + def _convert_template(template) # :nodoc: + #src = ::Erubis::Eruby.new(template).src + klass = ::Erubis::Helpers::RailsHelper.engine_class + properties = ::Erubis::Helpers::RailsHelper.init_properties + show_src = ::Erubis::Helpers::RailsHelper.show_src + show_src = ENV['RAILS_ENV'] == 'development' if show_src.nil? + ## preprocessing + if ::Erubis::Helpers::RailsHelper.preprocessing + preprocessor = _create_preprocessor(template) + template = preprocessor.evaluate(_preprocessing_context_object()) + _logger_info "** Erubis: preprocessed==<<'END'\n#{template}END\n" if show_src + end + ## convert into ruby code + src = klass.new(template, properties).src + #src.insert(0, '_erbout = ') + _logger_info "** Erubis: src==<<'END'\n#{src}END\n" if show_src + return src + end + def _create_preprocessor(template) + return PreprocessingEruby.new(template, :escape=>true) + end + def _preprocessing_context_object + return self + end + def _logger_info(message) + logger.info message + end + end + + end + + end + +end + + +class ActionView::Base # :nodoc: + include ::Erubis::Helpers::RailsHelper::TemplateConverter + include ::Erubis::PreprocessingHelper + private + # convert template into ruby code + def convert_template_into_ruby_code(template) + #ERB.new(template, nil, @@erb_trim_mode).src + return _convert_template(template) + end +end + + +require 'action_pack/version' + +rails22 = false + +if ActionPack::VERSION::MAJOR >= 2 ### Rails 2.X + + + if ActionPack::VERSION::MINOR >=2 ### Rails 2.2, 2.3 or higher + + rails22 = true + module ActionView + module TemplateHandlers + class ErubisHandler < TemplateHandler + include Compilable + include ::Erubis::Helpers::RailsHelper::TemplateConverter + include ::Erubis::PreprocessingHelper + def compile(template) + #src = ::ERB.new("<% __in_erb_template=true %>#{template.source}", nil, erb_trim_mode, '@output_buffer').src + return _convert_template("<% __in_erb_template=true %>#{template.source}") + end + end + end + handler_klass = TemplateHandlers::ErubisHandler + Template.register_default_template_handler :erb, handler_klass + Template.register_template_handler :rhtml, handler_klass + end + module Erubis::Helpers::RailsHelper::TemplateConverter + def _logger_info(message) + #logger.info message # logger.info seems not available in Rails 2.2 + ActionController::Base.new.logger.info message + end + end + + elsif ActionPack::VERSION::MINOR >=1 ### Rails 2.1 + + module ActionView + module TemplateHandlers # :nodoc: + class ErubisHandler < TemplateHandler + include Compilable + include Erubis::Helpers::RailsHelper::TemplateConverter + include Erubis::PreprocessingHelper + # + def compile(template) + return _convert_template(template.source) # template.is_a?(ActionView::Template) + end + def logger #:nodoc: + return @view.controller.logger + end + def _preprocessing_context_object #:nodoc: + return @view.controller.instance_variable_get('@template') + end + # + def cache_fragment(block, name = {}, options = nil) #:nodoc: + @view.fragment_for(block, name, options) do + #eval(ActionView::Base.erb_variable, block.binding) + eval('_buf', block.binding) + end + end + end + end + handler_klass = TemplateHandlers::ErubisHandler + Template.register_default_template_handler :erb, handler_klass + Template.register_template_handler :rhtml, handler_klass + end + + elsif ActionPack::VERSION::TINY >= 2 ### Rails 2.0.X (X >= 2) + + module ActionView + module TemplateHandlers # :nodoc: + class ErubisHandler < TemplateHandler + include Erubis::Helpers::RailsHelper::TemplateConverter + include Erubis::PreprocessingHelper + def compile(template) + return _convert_template(template) # template.is_a?(String) + end + def logger #:nodoc: + return @view.controller.logger + end + def _preprocessing_context_object #:nodoc: + return @view.controller.instance_variable_get('@template') + end + end + end + Base.class_eval do + handler_klass = TemplateHandlers::ErubisHandler + register_default_template_handler :erb, handler_klass + register_template_handler :rhtml, handler_klass + end + end + + else ### Rails 2.0.0 or 2.0.1 + + class ActionView::Base # :nodoc: + private + # Method to create the source code for a given template. + def create_template_source(extension, template, render_symbol, locals) + if template_requires_setup?(extension) + body = case extension.to_sym + when :rxml, :builder + content_type_handler = (controller.respond_to?(:response) ? "controller.response" : "controller") + "#{content_type_handler}.content_type ||= Mime::XML\n" + + "xml = Builder::XmlMarkup.new(:indent => 2)\n" + + template + + "\nxml.target!\n" + when :rjs + "controller.response.content_type ||= Mime::JS\n" + + "update_page do |page|\n#{template}\nend" + end + else + #body = ERB.new(template, nil, @@erb_trim_mode).src + body = convert_template_into_ruby_code(template) + end + # + @@template_args[render_symbol] ||= {} + locals_keys = @@template_args[render_symbol].keys | locals + @@template_args[render_symbol] = locals_keys.inject({}) { |h, k| h[k] = true; h } + # + locals_code = "" + locals_keys.each do |key| + locals_code << "#{key} = local_assigns[:#{key}]\n" + end + # + "def #{render_symbol}(local_assigns)\n#{locals_code}#{body}\nend" + end + end + + end #if + + +else ### Rails 1.X + + + if ActionPack::VERSION::MINOR > 12 ### Rails 1.2 + + class ActionView::Base # :nodoc: + private + # Create source code for given template + def create_template_source(extension, template, render_symbol, locals) + if template_requires_setup?(extension) + body = case extension.to_sym + when :rxml + "controller.response.content_type ||= 'application/xml'\n" + + "xml = Builder::XmlMarkup.new(:indent => 2)\n" + + template + when :rjs + "controller.response.content_type ||= 'text/javascript'\n" + + "update_page do |page|\n#{template}\nend" + end + else + #body = ERB.new(template, nil, @@erb_trim_mode).src + body = convert_template_into_ruby_code(template) + end + # + @@template_args[render_symbol] ||= {} + locals_keys = @@template_args[render_symbol].keys | locals + @@template_args[render_symbol] = locals_keys.inject({}) { |h, k| h[k] = true; h } + # + locals_code = "" + locals_keys.each do |key| + locals_code << "#{key} = local_assigns[:#{key}]\n" + end + # + "def #{render_symbol}(local_assigns)\n#{locals_code}#{body}\nend" + end + end + + else ### Rails 1.1 + + class ActionView::Base # :nodoc: + private + # Create source code for given template + def create_template_source(extension, template, render_symbol, locals) + if template_requires_setup?(extension) + body = case extension.to_sym + when :rxml + "xml = Builder::XmlMarkup.new(:indent => 2)\n" + + "@controller.headers['Content-Type'] ||= 'application/xml'\n" + + template + when :rjs + "@controller.headers['Content-Type'] ||= 'text/javascript'\n" + + "update_page do |page|\n#{template}\nend" + end + else + #body = ERB.new(template, nil, @@erb_trim_mode).src + body = convert_template_into_ruby_code(template) + end + # + @@template_args[render_symbol] ||= {} + locals_keys = @@template_args[render_symbol].keys | locals + @@template_args[render_symbol] = locals_keys.inject({}) { |h, k| h[k] = true; h } + # + locals_code = "" + locals_keys.each do |key| + locals_code << "#{key} = local_assigns[:#{key}] if local_assigns.has_key?(:#{key})\n" + end + # + "def #{render_symbol}(local_assigns)\n#{locals_code}#{body}\nend" + end + end + + end #if + + ## make h() method faster (only for Rails 1.X) + module ERB::Util # :nodoc: + ESCAPE_TABLE = { '&'=>'&', '<'=>'<', '>'=>'>', '"'=>'"', "'"=>''', } + def h(value) + value.to_s.gsub(/[&<>"]/) {|s| ESCAPE_TABLE[s] } + end + module_function :h + end + +end ### + + +## finish +ActionController::Base.new.logger.info "** Erubis #{::Erubis::VERSION}" +$stdout.puts "** Erubis #{::Erubis::VERSION}" if rails22 diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/local-setting.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/local-setting.rb new file mode 100644 index 000000000..17fd4ea1c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/local-setting.rb @@ -0,0 +1,9 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +## +## you can add site-local settings here. +## this files is required by erubis.rb +## diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/main.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/main.rb new file mode 100644 index 000000000..9997cf995 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/main.rb @@ -0,0 +1,516 @@ +### +### $Release: 2.7.0 $ +### copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +### + +require 'yaml' +require 'erubis' +require 'erubis/tiny' +require 'erubis/engine/enhanced' +require 'erubis/engine/optimized' +require 'erubis/engine/eruby' +require 'erubis/engine/ephp' +require 'erubis/engine/ec' +require 'erubis/engine/ecpp' +require 'erubis/engine/ejava' +require 'erubis/engine/escheme' +require 'erubis/engine/eperl' +require 'erubis/engine/ejavascript' + + +module Erubis + + + Ejs = Ejavascript + EscapedEjs = EscapedEjavascript + + + class CommandOptionError < ErubisError + end + + + ## + ## main class of command + ## + ## ex. + ## Main.main(ARGV) + ## + class Main + + def self.main(argv=ARGV) + status = 0 + begin + Main.new.execute(ARGV) + rescue CommandOptionError => ex + $stderr.puts ex.message + status = 1 + end + exit(status) + end + + def initialize + @single_options = "hvxztTSbeBXNUC" + @arg_options = "pcrfKIlaE" #C + @option_names = { + 'h' => :help, + 'v' => :version, + 'x' => :source, + 'z' => :syntax, + 'T' => :unexpand, + 't' => :untabify, # obsolete + 'S' => :intern, + 'b' => :bodyonly, + 'B' => :binding, + 'p' => :pattern, + 'c' => :context, + #'C' => :class, + 'e' => :escape, + 'r' => :requires, + 'f' => :datafiles, + 'K' => :kanji, + 'I' => :includes, + 'l' => :lang, + 'a' => :action, + 'E' => :enhancers, + 'X' => :notext, + 'N' => :linenum, + 'U' => :unique, + 'C' => :compact, + } + assert unless @single_options.length + @arg_options.length == @option_names.length + (@single_options + @arg_options).each_byte do |ch| + assert unless @option_names.key?(ch.chr) + end + end + + + def execute(argv=ARGV) + ## parse command-line options + options, properties = parse_argv(argv, @single_options, @arg_options) + filenames = argv + options['h'] = true if properties[:help] + opts = Object.new + arr = @option_names.collect {|ch, name| "def #{name}; @#{name}; end\n" } + opts.instance_eval arr.join + options.each do |ch, val| + name = @option_names[ch] + opts.instance_variable_set("@#{name}", val) + end + + ## help, version, enhancer list + if opts.help || opts.version + puts version() if opts.version + puts usage() if opts.help + puts show_properties() if opts.help + puts show_enhancers() if opts.help + return + end + + ## include path + opts.includes.split(/,/).each do |path| + $: << path + end if opts.includes + + ## require library + opts.requires.split(/,/).each do |library| + require library + end if opts.requires + + ## action + action = opts.action + action ||= 'syntax' if opts.syntax + action ||= 'convert' if opts.source || opts.notext + + ## lang + lang = opts.lang || 'ruby' + action ||= 'convert' if opts.lang + + ## class name of Eruby + #classname = opts.class + classname = nil + klass = get_classobj(classname, lang, properties[:pi]) + + ## kanji code + $KCODE = opts.kanji if opts.kanji + + ## read context values from yaml file + datafiles = opts.datafiles + context = load_datafiles(datafiles, opts) + + ## parse context data + if opts.context + context = parse_context_data(opts.context, opts) + end + + ## properties for engine + properties[:escape] = true if opts.escape && !properties.key?(:escape) + properties[:pattern] = opts.pattern if opts.pattern + #properties[:trim] = false if opts.notrim + properties[:preamble] = properties[:postamble] = false if opts.bodyonly + properties[:pi] = nil if properties[:pi] == true + + ## create engine and extend enhancers + engine = klass.new(nil, properties) + enhancers = get_enhancers(opts.enhancers) + #enhancers.push(Erubis::EscapeEnhancer) if opts.escape + enhancers.each do |enhancer| + engine.extend(enhancer) + engine.bipattern = properties[:bipattern] if enhancer == Erubis::BiPatternEnhancer + end + + ## no-text + engine.extend(Erubis::NoTextEnhancer) if opts.notext + + ## convert and execute + val = nil + msg = "Syntax OK\n" + if filenames && !filenames.empty? + filenames.each do |filename| + File.file?(filename) or + raise CommandOptionError.new("#{filename}: file not found.") + engine.filename = filename + engine.convert!(File.read(filename)) + val = do_action(action, engine, context, filename, opts) + msg = nil if val + end + else + engine.filename = filename = '(stdin)' + engine.convert!($stdin.read()) + val = do_action(action, engine, context, filename, opts) + msg = nil if val + end + print msg if action == 'syntax' && msg + + end + + private + + def do_action(action, engine, context, filename, opts) + case action + when 'convert' + s = manipulate_src(engine.src, opts) + when nil, 'exec', 'execute' + s = opts.binding ? engine.result(context.to_hash) : engine.evaluate(context) + when 'syntax' + s = check_syntax(filename, engine.src) + else + raise "*** internal error" + end + print s if s + return s + end + + def manipulate_src(source, opts) + flag_linenum = opts.linenum + flag_unique = opts.unique + flag_compact = opts.compact + if flag_linenum + n = 0 + source.gsub!(/^/) { n += 1; "%5d: " % n } + source.gsub!(/^ *\d+:\s+?\n/, '') if flag_compact + source.gsub!(/(^ *\d+:\s+?\n)+/, "\n") if flag_unique + else + source.gsub!(/^\s*?\n/, '') if flag_compact + source.gsub!(/(^\s*?\n)+/, "\n") if flag_unique + end + return source + end + + def usage(command=nil) + command ||= File.basename($0) + buf = [] + buf << "erubis - embedded program converter for multi-language" + buf << "Usage: #{command} [..options..] [file ...]" + buf << " -h, --help : help" + buf << " -v : version" + buf << " -x : show converted code" + buf << " -X : show converted code, only ruby code and no text part" + buf << " -N : numbering: add line numbers (for '-x/-X')" + buf << " -U : unique: compress empty lines to a line (for '-x/-X')" + buf << " -C : compact: remove empty lines (for '-x/-X')" + buf << " -b : body only: no preamble nor postamble (for '-x/-X')" + buf << " -z : syntax checking" + buf << " -e : escape (equal to '--E Escape')" + buf << " -p pattern : embedded pattern (default '<% %>')" + buf << " -l lang : convert but no execute (ruby/php/c/cpp/java/scheme/perl/js)" + buf << " -E e1,e2,... : enhancer names (Escape, PercentLine, BiPattern, ...)" + buf << " -I path : library include path" + buf << " -K kanji : kanji code (euc/sjis/utf8) (default none)" + buf << " -c context : context data string (yaml inline style or ruby code)" + buf << " -f datafile : context data file ('*.yaml', '*.yml', or '*.rb')" + #buf << " -t : expand tab characters in YAML file" + buf << " -T : don't expand tab characters in YAML file" + buf << " -S : convert mapping key from string to symbol in YAML file" + buf << " -B : invoke 'result(binding)' instead of 'evaluate(context)'" + buf << " --pi=name : parse '' instead of '<% ... %>'" + #' + # -T : don't trim spaces around '<% %>' + # -c class : class name (XmlEruby/PercentLineEruby/...) (default Eruby) + # -r library : require library + # -a : action (convert/execute) + return buf.join("\n") + end + + def collect_supported_properties(erubis_klass) + list = [] + erubis_klass.ancestors.each do |klass| + if klass.respond_to?(:supported_properties) + list.concat(klass.supported_properties) + end + end + return list + end + + def show_properties + s = "supported properties:\n" + basic_props = collect_supported_properties(Erubis::Basic::Engine) + pi_props = collect_supported_properties(Erubis::PI::Engine) + list = [] + common_props = basic_props & pi_props + list << ['(common)', common_props] + list << ['(basic)', basic_props - common_props] + list << ['(pi)', pi_props - common_props] + %w[ruby php c cpp java scheme perl javascript].each do |lang| + klass = Erubis.const_get("E#{lang}") + list << [lang, collect_supported_properties(klass) - basic_props] + end + list.each do |lang, props| + s << " * #{lang}\n" + props.each do |name, default_val, desc| + s << (" --%-23s : %s\n" % ["#{name}=#{default_val.inspect}", desc]) + end + end + s << "\n" + return s + end + + def show_enhancers + dict = {} + ObjectSpace.each_object(Module) do |mod| + dict[$1] = mod if mod.name =~ /\AErubis::(.*)Enhancer\z/ + end + s = "enhancers:\n" + dict.sort_by {|name, mod| name }.each do |name, mod| + s << (" %-13s : %s\n" % [name, mod.desc]) + end + return s + end + + def version + return Erubis::VERSION + end + + def parse_argv(argv, arg_none='', arg_required='', arg_optional='') + options = {} + context = {} + while argv[0] && argv[0][0] == ?- + optstr = argv.shift + optstr = optstr[1, optstr.length-1] + # + if optstr[0] == ?- # context + optstr =~ /\A\-([-\w]+)(?:=(.*))?/ or + raise CommandOptionError.new("-#{optstr}: invalid context value.") + name, value = $1, $2 + name = name.gsub(/-/, '_').intern + #value = value.nil? ? true : YAML.load(value) # error, why? + value = value.nil? ? true : YAML.load("---\n#{value}\n") + context[name] = value + # + else # options + while optstr && !optstr.empty? + optchar = optstr[0].chr + optstr = optstr[1..-1] + if arg_none.include?(optchar) + options[optchar] = true + elsif arg_required.include?(optchar) + arg = optstr.empty? ? argv.shift : optstr or + raise CommandOptionError.new("-#{optchar}: #{@option_names[optchar]} required.") + options[optchar] = arg + optstr = nil + elsif arg_optional.include?(optchar) + arg = optstr.empty? ? true : optstr + options[optchar] = arg + optstr = nil + else + raise CommandOptionError.new("-#{optchar}: unknown option.") + end + end + end + # + end # end of while + + return options, context + end + + + def untabify(str, width=8) + list = str.split(/\t/) + last = list.pop + sb = '' + list.each do |s| + column = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length + n = width - (column % width) + sb << s << (' ' * n) + end + sb << last + return sb + end + #-- + #def untabify(str, width=8) + # sb = '' + # str.scan(/(.*?)\t/m) do |s, | + # len = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length + # sb << s << (" " * (width - len % width)) + # end + # return $' ? (sb << $') : str + #end + #++ + + + def get_classobj(classname, lang, pi) + classname ||= "E#{lang}" + base_module = pi ? Erubis::PI : Erubis + begin + klass = base_module.const_get(classname) + rescue NameError + klass = nil + end + unless klass + if lang + msg = "-l #{lang}: invalid language name (class #{base_module.name}::#{classname} not found)." + else + msg = "-c #{classname}: invalid class name." + end + raise CommandOptionError.new(msg) + end + return klass + end + + def get_enhancers(enhancer_names) + return [] unless enhancer_names + enhancers = [] + shortname = nil + begin + enhancer_names.split(/,/).each do |name| + shortname = name + enhancers << Erubis.const_get("#{shortname}Enhancer") + end + rescue NameError + raise CommandOptionError.new("#{shortname}: no such Enhancer (try '-h' to show all enhancers).") + end + return enhancers + end + + def load_datafiles(filenames, opts) + context = Erubis::Context.new + return context unless filenames + filenames.split(/,/).each do |filename| + filename.strip! + test(?f, filename) or raise CommandOptionError.new("#{filename}: file not found.") + if filename =~ /\.ya?ml$/ + if opts.unexpand + ydoc = YAML.load_file(filename) + else + ydoc = YAML.load(untabify(File.read(filename))) + end + ydoc.is_a?(Hash) or raise CommandOptionError.new("#{filename}: root object is not a mapping.") + intern_hash_keys(ydoc) if opts.intern + context.update(ydoc) + elsif filename =~ /\.rb$/ + str = File.read(filename) + context2 = Erubis::Context.new + _instance_eval(context2, str) + context.update(context2) + else + CommandOptionError.new("#{filename}: '*.yaml', '*.yml', or '*.rb' required.") + end + end + return context + end + + def _instance_eval(_context, _str) + _context.instance_eval(_str) + end + + def parse_context_data(context_str, opts) + if context_str[0] == ?{ + require 'yaml' + ydoc = YAML.load(context_str) + unless ydoc.is_a?(Hash) + raise CommandOptionError.new("-c: root object is not a mapping.") + end + intern_hash_keys(ydoc) if opts.intern + return ydoc + else + context = Erubis::Context.new + context.instance_eval(context_str, '-c') + return context + end + end + + def intern_hash_keys(obj, done={}) + return if done.key?(obj.__id__) + case obj + when Hash + done[obj.__id__] = obj + obj.keys.each do |key| + obj[key.intern] = obj.delete(key) if key.is_a?(String) + end + obj.values.each do |val| + intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array) + end + when Array + done[obj.__id__] = obj + obj.each do |val| + intern_hash_keys(val, done) if val.is_a?(Hash) || val.is_a?(Array) + end + end + end + + def check_syntax(filename, src) + require 'open3' + #command = (ENV['_'] || 'ruby') + ' -wc' # ENV['_'] stores command name + bin = ENV['_'] && File.basename(ENV['_']) =~ /^ruby/ ? ENV['_'] : 'ruby' + command = bin + ' -wc' + stdin, stdout, stderr = Open3.popen3(command) + stdin.write(src) + stdin.close + result = stdout.read() + stdout.close() + errmsg = stderr.read() + stderr.close() + return nil unless errmsg && !errmsg.empty? + errmsg =~ /\A-:(\d+): / + linenum, message = $1, $' + return "#{filename}:#{linenum}: #{message}" + end + + if defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx" + def check_syntax(filename, src) + require 'compiler' + verbose = $VERBOSE + msg = nil + begin + $VERBOSE = true + Rubinius::Compiler.compile_string(src, filename) + rescue SyntaxError => ex + ex_linenum = ex.line + linenum = 0 + srcline = src.each_line do |line| + linenum += 1 + break line if linenum == ex_linenum + end + msg = "#{ex.message}\n" + msg << srcline + msg << "\n" unless srcline =~ /\n\z/ + msg << (" " * (ex.column-1)) << "^\n" + ensure + $VERBOSE = verbose + end + return msg + end + end + + end + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/preprocessing.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/preprocessing.rb new file mode 100644 index 000000000..c2ceb96f6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/preprocessing.rb @@ -0,0 +1,58 @@ +### +### $Release: 2.7.0 $ +### copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +### + +require 'cgi' + + +module Erubis + + + ## + ## for preprocessing + ## + class PreprocessingEruby < Erubis::Eruby + + def initialize(input, params={}) + params = params.dup + params[:pattern] ||= '\[% %\]' # use '[%= %]' instead of '<%= %>' + #params[:escape] = true # transport '[%= %]' and '[%== %]' + super + end + + def add_expr_escaped(src, code) + add_expr_literal(src, "_decode((#{code}))") + end + + end + + + ## + ## helper methods for preprocessing + ## + module PreprocessingHelper + + module_function + + def _p(arg) + return "<%=#{arg}%>" + end + + def _P(arg) + return "<%=h(#{arg})%>" + end + + alias _? _p + + def _decode(arg) + arg = arg.to_s + arg.gsub!(/%3C%25(?:=|%3D)(.*?)%25%3E/) { "<%=#{CGI.unescape($1)}%>" } + arg.gsub!(/<%=(.*?)%>/) { "<%=#{CGI.unescapeHTML($1)}%>" } + return arg + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/tiny.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/tiny.rb new file mode 100644 index 000000000..05360ee93 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/tiny.rb @@ -0,0 +1,144 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +module Erubis + + ## + ## tiny and the simplest implementation of eRuby + ## + ## ex. + ## eruby = TinyEruby.new(File.read('example.rhtml')) + ## print eruby.src # print ruby code + ## print eruby.result(binding()) # eval ruby code with Binding object + ## print eruby.evalute(context) # eval ruby code with context object + ## + class TinyEruby + + def initialize(input=nil) + @src = convert(input) if input + end + attr_reader :src + + EMBEDDED_PATTERN = /<%(=+|\#)?(.*?)-?%>/m + + def convert(input) + src = "_buf = '';" # preamble + pos = 0 + input.scan(EMBEDDED_PATTERN) do |indicator, code| + m = Regexp.last_match + text = input[pos...m.begin(0)] + pos = m.end(0) + #src << " _buf << '" << escape_text(text) << "';" + text.gsub!(/['\\]/, '\\\\\&') + src << " _buf << '" << text << "';" unless text.empty? + if !indicator # <% %> + src << code << ";" + elsif indicator == '#' # <%# %> + src << ("\n" * code.count("\n")) + else # <%= %> + src << " _buf << (" << code << ").to_s;" + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + #src << " _buf << '" << escape_text(rest) << "';" + rest.gsub!(/['\\]/, '\\\\\&') + src << " _buf << '" << rest << "';" unless rest.empty? + src << "\n_buf.to_s\n" # postamble + return src + end + + #def escape_text(text) + # return text.gsub!(/['\\]/, '\\\\\&') || text + #end + + def result(_binding=TOPLEVEL_BINDING) + eval @src, _binding + end + + def evaluate(_context=Object.new) + if _context.is_a?(Hash) + _obj = Object.new + _context.each do |k, v| _obj.instance_variable_set("@#{k}", v) end + _context = _obj + end + _context.instance_eval @src + end + + end + + + + module PI + end + + class PI::TinyEruby + + def initialize(input=nil, options={}) + @escape = options[:escape] || 'Erubis::XmlHelper.escape_xml' + @src = convert(input) if input + end + + attr_reader :src + + EMBEDDED_PATTERN = /(^[ \t]*)?<\?rb(\s.*?)\?>([ \t]*\r?\n)?|@(!+)?\{(.*?)\}@/m + + def convert(input) + src = "_buf = '';" # preamble + pos = 0 + input.scan(EMBEDDED_PATTERN) do |lspace, stmt, rspace, indicator, expr| + match = Regexp.last_match + len = match.begin(0) - pos + text = input[pos, len] + pos = match.end(0) + #src << " _buf << '" << escape_text(text) << "';" + text.gsub!(/['\\]/, '\\\\\&') + src << " _buf << '" << text << "';" unless text.empty? + if stmt # + if lspace && rspace + src << "#{lspace}#{stmt}#{rspace}" + else + src << " _buf << '" << lspace << "';" if lspace + src << stmt << ";" + src << " _buf << '" << rspace << "';" if rspace + end + else # ${...}, $!{...} + if !indicator + src << " _buf << " << @escape << "(" << expr << ");" + elsif indicator == '!' + src << " _buf << (" << expr << ").to_s;" + end + end + end + #rest = $' || input # ruby1.8 + rest = pos == 0 ? input : input[pos..-1] # ruby1.9 + #src << " _buf << '" << escape_text(rest) << "';" + rest.gsub!(/['\\]/, '\\\\\&') + src << " _buf << '" << rest << "';" unless rest.empty? + src << "\n_buf.to_s\n" # postamble + return src + end + + #def escape_text(text) + # return text.gsub!(/['\\]/, '\\\\\&') || text + #end + + def result(_binding=TOPLEVEL_BINDING) + eval @src, _binding + end + + def evaluate(_context=Object.new) + if _context.is_a?(Hash) + _obj = Object.new + _context.each do |k, v| _obj.instance_variable_set("@#{k}", v) end + _context = _obj + end + _context.instance_eval @src + end + + end + + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/util.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/util.rb new file mode 100644 index 000000000..0d02fbb50 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/util.rb @@ -0,0 +1,22 @@ +## +## $Release: 2.7.0 $ +## copyright(c) 2006-2011 kuwata-lab.com all rights reserved. +## + +module Kernel + + ## + ## raise NotImplementedError + ## + def not_implemented #:doc: + backtrace = caller() + method_name = (backtrace.shift =~ /`(\w+)'$/) && $1 + mesg = "class #{self.class.name} must implement abstract method '#{method_name}()'." + #mesg = "#{self.class.name}##{method_name}() is not implemented." + err = NotImplementedError.new mesg + err.set_backtrace backtrace + raise err + end + private :not_implemented + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/setup.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/setup.rb new file mode 100644 index 000000000..f1c9d9a62 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/erubis-2.7.0/setup.rb @@ -0,0 +1,1331 @@ +# +# setup.rb +# +# Copyright (c) 2000-2004 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the terms of +# the GNU Lesser General Public License version 2.1. +# + +# +# For backward compatibility +# + +unless Enumerable.method_defined?(:map) + module Enumerable + alias map collect + end +end + +unless Enumerable.method_defined?(:detect) + module Enumerable + alias detect find + end +end + +unless Enumerable.method_defined?(:select) + module Enumerable + alias select find_all + end +end + +unless Enumerable.method_defined?(:reject) + module Enumerable + def reject + result = [] + each do |i| + result.push i unless yield(i) + end + result + end + end +end + +unless Enumerable.method_defined?(:inject) + module Enumerable + def inject(result) + each do |i| + result = yield(result, i) + end + result + end + end +end + +unless Enumerable.method_defined?(:any?) + module Enumerable + def any? + each do |i| + return true if yield(i) + end + false + end + end +end + +unless File.respond_to?(:read) + def File.read(fname) + open(fname) {|f| + return f.read + } + end +end + +# +# Application independent utilities +# + +def File.binread(fname) + open(fname, 'rb') {|f| + return f.read + } +end + +# for corrupted windows stat(2) +def File.dir?(path) + File.directory?((path[-1,1] == '/') ? path : path + '/') +end + +# +# Config +# + +if arg = ARGV.detect{|arg| /\A--rbconfig=/ =~ arg } + ARGV.delete(arg) + require arg.split(/=/, 2)[1] + $".push 'rbconfig.rb' +else + require 'rbconfig' +end + +def multipackage_install? + FileTest.directory?(File.dirname($0) + '/packages') +end + + +class ConfigTable + + c = ::Config::CONFIG + + rubypath = c['bindir'] + '/' + c['ruby_install_name'] + + major = c['MAJOR'].to_i + minor = c['MINOR'].to_i + teeny = c['TEENY'].to_i + version = "#{major}.#{minor}" + + # ruby ver. >= 1.4.4? + newpath_p = ((major >= 2) or + ((major == 1) and + ((minor >= 5) or + ((minor == 4) and (teeny >= 4))))) + + subprefix = lambda {|path| + path.sub(/\A#{Regexp.quote(c['prefix'])}/o, '$prefix') + } + + if c['rubylibdir'] + # V < 1.6.3 + stdruby = subprefix.call(c['rubylibdir']) + siteruby = subprefix.call(c['sitedir']) + versite = subprefix.call(c['sitelibdir']) + sodir = subprefix.call(c['sitearchdir']) + elsif newpath_p + # 1.4.4 <= V <= 1.6.3 + stdruby = "$prefix/lib/ruby/#{version}" + siteruby = subprefix.call(c['sitedir']) + versite = siteruby + '/' + version + sodir = "$site-ruby/#{c['arch']}" + else + # V < 1.4.4 + stdruby = "$prefix/lib/ruby/#{version}" + siteruby = "$prefix/lib/ruby/#{version}/site_ruby" + versite = siteruby + sodir = "$site-ruby/#{c['arch']}" + end + + if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg } + makeprog = arg.sub(/'/, '').split(/=/, 2)[1] + else + makeprog = 'make' + end + + common_descripters = [ + [ 'prefix', [ c['prefix'], + 'path', + 'path prefix of target environment' ] ], + [ 'std-ruby', [ stdruby, + 'path', + 'the directory for standard ruby libraries' ] ], + [ 'site-ruby-common', [ siteruby, + 'path', + 'the directory for version-independent non-standard ruby libraries' ] ], + [ 'site-ruby', [ versite, + 'path', + 'the directory for non-standard ruby libraries' ] ], + [ 'bin-dir', [ '$prefix/bin', + 'path', + 'the directory for commands' ] ], + [ 'rb-dir', [ '$site-ruby', + 'path', + 'the directory for ruby scripts' ] ], + [ 'so-dir', [ sodir, + 'path', + 'the directory for ruby extentions' ] ], + [ 'data-dir', [ '$prefix/share', + 'path', + 'the directory for shared data' ] ], + [ 'ruby-path', [ rubypath, + 'path', + 'path to set to #! line' ] ], + [ 'ruby-prog', [ rubypath, + 'name', + 'the ruby program using for installation' ] ], + [ 'make-prog', [ makeprog, + 'name', + 'the make program to compile ruby extentions' ] ], + [ 'without-ext', [ 'no', + 'yes/no', + 'does not compile/install ruby extentions' ] ] + ] + multipackage_descripters = [ + [ 'with', [ '', + 'name,name...', + 'package names that you want to install', + 'ALL' ] ], + [ 'without', [ '', + 'name,name...', + 'package names that you do not want to install', + 'NONE' ] ] + ] + if multipackage_install? + DESCRIPTER = common_descripters + multipackage_descripters + else + DESCRIPTER = common_descripters + end + + SAVE_FILE = 'config.save' + + def ConfigTable.each_name(&block) + keys().each(&block) + end + + def ConfigTable.keys + DESCRIPTER.map {|name, *dummy| name } + end + + def ConfigTable.each_definition(&block) + DESCRIPTER.each(&block) + end + + def ConfigTable.get_entry(name) + name, ent = DESCRIPTER.assoc(name) + ent + end + + def ConfigTable.get_entry!(name) + get_entry(name) or raise ArgumentError, "no such config: #{name}" + end + + def ConfigTable.add_entry(name, vals) + ConfigTable::DESCRIPTER.push [name,vals] + end + + def ConfigTable.remove_entry(name) + get_entry(name) or raise ArgumentError, "no such config: #{name}" + DESCRIPTER.delete_if {|n, arr| n == name } + end + + def ConfigTable.config_key?(name) + get_entry(name) ? true : false + end + + def ConfigTable.bool_config?(name) + ent = get_entry(name) or return false + ent[1] == 'yes/no' + end + + def ConfigTable.value_config?(name) + ent = get_entry(name) or return false + ent[1] != 'yes/no' + end + + def ConfigTable.path_config?(name) + ent = get_entry(name) or return false + ent[1] == 'path' + end + + + class << self + alias newobj new + end + + def ConfigTable.new + c = newobj() + c.initialize_from_table + c + end + + def ConfigTable.load + c = newobj() + c.initialize_from_file + c + end + + def initialize_from_table + @table = {} + DESCRIPTER.each do |k, (default, vname, desc, default2)| + @table[k] = default + end + end + + def initialize_from_file + raise InstallError, "#{File.basename $0} config first"\ + unless File.file?(SAVE_FILE) + @table = {} + File.foreach(SAVE_FILE) do |line| + k, v = line.split(/=/, 2) + @table[k] = v.strip + end + end + + def save + File.open(SAVE_FILE, 'w') {|f| + @table.each do |k, v| + f.printf "%s=%s\n", k, v if v + end + } + end + + def []=(k, v) + raise InstallError, "unknown config option #{k}"\ + unless ConfigTable.config_key?(k) + @table[k] = v + end + + def [](key) + return nil unless @table[key] + @table[key].gsub(%r<\$([^/]+)>) { self[$1] } + end + + def set_raw(key, val) + @table[key] = val + end + + def get_raw(key) + @table[key] + end + +end + + +module MetaConfigAPI + + def eval_file_ifexist(fname) + instance_eval File.read(fname), fname, 1 if File.file?(fname) + end + + def config_names + ConfigTable.keys + end + + def config?(name) + ConfigTable.config_key?(name) + end + + def bool_config?(name) + ConfigTable.bool_config?(name) + end + + def value_config?(name) + ConfigTable.value_config?(name) + end + + def path_config?(name) + ConfigTable.path_config?(name) + end + + def add_config(name, argname, default, desc) + ConfigTable.add_entry name,[default,argname,desc] + end + + def add_path_config(name, default, desc) + add_config name, 'path', default, desc + end + + def add_bool_config(name, default, desc) + add_config name, 'yes/no', default ? 'yes' : 'no', desc + end + + def set_config_default(name, default) + if bool_config?(name) + ConfigTable.get_entry!(name)[0] = (default ? 'yes' : 'no') + else + ConfigTable.get_entry!(name)[0] = default + end + end + + def remove_config(name) + ent = ConfigTable.get_entry(name) + ConfigTable.remove_entry name + ent + end + +end + +# +# File Operations +# + +module FileOperations + + def mkdir_p(dirname, prefix = nil) + dirname = prefix + dirname if prefix + $stderr.puts "mkdir -p #{dirname}" if verbose? + return if no_harm? + + # does not check '/'... it's too abnormal case + dirs = dirname.split(%r<(?=/)>) + if /\A[a-z]:\z/i =~ dirs[0] + disk = dirs.shift + dirs[0] = disk + dirs[0] + end + dirs.each_index do |idx| + path = dirs[0..idx].join('') + Dir.mkdir path unless File.dir?(path) + end + end + + def rm_f(fname) + $stderr.puts "rm -f #{fname}" if verbose? + return if no_harm? + + if File.exist?(fname) or File.symlink?(fname) + File.chmod 0777, fname + File.unlink fname + end + end + + def rm_rf(dn) + $stderr.puts "rm -rf #{dn}" if verbose? + return if no_harm? + + Dir.chdir dn + Dir.foreach('.') do |fn| + next if fn == '.' + next if fn == '..' + if File.dir?(fn) + verbose_off { + rm_rf fn + } + else + verbose_off { + rm_f fn + } + end + end + Dir.chdir '..' + Dir.rmdir dn + end + + def move_file(src, dest) + File.unlink dest if File.exist?(dest) + begin + File.rename src, dest + rescue + File.open(dest, 'wb') {|f| f.write File.binread(src) } + File.chmod File.stat(src).mode, dest + File.unlink src + end + end + + def install(from, dest, mode, prefix = nil) + $stderr.puts "install #{from} #{dest}" if verbose? + return if no_harm? + + realdest = prefix + dest if prefix + realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest) + str = File.binread(from) + if diff?(str, realdest) + verbose_off { + rm_f realdest if File.exist?(realdest) + } + File.open(realdest, 'wb') {|f| + f.write str + } + File.chmod mode, realdest + + File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| + if prefix + f.puts realdest.sub(prefix, '') + else + f.puts realdest + end + } + end + end + + def diff?(new_content, path) + return true unless File.exist?(path) + new_content != File.binread(path) + end + + def command(str) + $stderr.puts str if verbose? + system str or raise RuntimeError, "'system #{str}' failed" + end + + def ruby(str) + command config('ruby-prog') + ' ' + str + end + + def make(task = '') + command config('make-prog') + ' ' + task + end + + def extdir?(dir) + File.exist?(dir + '/MANIFEST') + end + + def all_files_in(dirname) + Dir.open(dirname) {|d| + return d.select {|ent| File.file?("#{dirname}/#{ent}") } + } + end + + REJECT_DIRS = %w( + CVS SCCS RCS CVS.adm + ) + + def all_dirs_in(dirname) + Dir.open(dirname) {|d| + return d.select {|n| File.dir?("#{dirname}/#{n}") } - %w(. ..) - REJECT_DIRS + } + end + +end + +# +# Main Installer +# + +class InstallError < StandardError; end + + +module HookUtils + + def run_hook(name) + try_run_hook "#{curr_srcdir()}/#{name}" or + try_run_hook "#{curr_srcdir()}/#{name}.rb" + end + + def try_run_hook(fname) + return false unless File.file?(fname) + begin + instance_eval File.read(fname), fname, 1 + rescue + raise InstallError, "hook #{fname} failed:\n" + $!.message + end + true + end + +end + + +module HookScriptAPI + + def get_config(key) + @config[key] + end + + alias config get_config + + def set_config(key, val) + @config[key] = val + end + + # + # srcdir/objdir (works only in the package directory) + # + + #abstract srcdir_root + #abstract objdir_root + #abstract relpath + + def curr_srcdir + "#{srcdir_root()}/#{relpath()}" + end + + def curr_objdir + "#{objdir_root()}/#{relpath()}" + end + + def srcfile(path) + "#{curr_srcdir()}/#{path}" + end + + def srcexist?(path) + File.exist?(srcfile(path)) + end + + def srcdirectory?(path) + File.dir?(srcfile(path)) + end + + def srcfile?(path) + File.file? srcfile(path) + end + + def srcentries(path = '.') + Dir.open("#{curr_srcdir()}/#{path}") {|d| + return d.to_a - %w(. ..) + } + end + + def srcfiles(path = '.') + srcentries(path).select {|fname| + File.file?(File.join(curr_srcdir(), path, fname)) + } + end + + def srcdirectories(path = '.') + srcentries(path).select {|fname| + File.dir?(File.join(curr_srcdir(), path, fname)) + } + end + +end + + +class ToplevelInstaller + + Version = '3.2.4' + Copyright = 'Copyright (c) 2000-2004 Minero Aoki' + + TASKS = [ + [ 'config', 'saves your configurations' ], + [ 'show', 'shows current configuration' ], + [ 'setup', 'compiles ruby extentions and others' ], + [ 'install', 'installs files' ], + [ 'clean', "does `make clean' for each extention" ], + [ 'distclean',"does `make distclean' for each extention" ] + ] + + def ToplevelInstaller.invoke + instance().invoke + end + + @singleton = nil + + def ToplevelInstaller.instance + @singleton ||= new(File.dirname($0)) + @singleton + end + + include MetaConfigAPI + + def initialize(ardir_root) + @config = nil + @options = { 'verbose' => true } + @ardir = File.expand_path(ardir_root) + end + + def inspect + "#<#{self.class} #{__id__()}>" + end + + def invoke + run_metaconfigs + task = parsearg_global() + @config = load_config(task) + __send__ "parsearg_#{task}" + init_installers + __send__ "exec_#{task}" + end + + def run_metaconfigs + eval_file_ifexist "#{@ardir}/metaconfig" + end + + def load_config(task) + case task + when 'config' + ConfigTable.new + when 'clean', 'distclean' + if File.exist?('config.save') + then ConfigTable.load + else ConfigTable.new + end + else + ConfigTable.load + end + end + + def init_installers + @installer = Installer.new(@config, @options, @ardir, File.expand_path('.')) + end + + # + # Hook Script API bases + # + + def srcdir_root + @ardir + end + + def objdir_root + '.' + end + + def relpath + '.' + end + + # + # Option Parsing + # + + def parsearg_global + valid_task = /\A(?:#{TASKS.map {|task,desc| task }.join '|'})\z/ + + while arg = ARGV.shift + case arg + when /\A\w+\z/ + raise InstallError, "invalid task: #{arg}" unless valid_task =~ arg + return arg + + when '-q', '--quiet' + @options['verbose'] = false + + when '--verbose' + @options['verbose'] = true + + when '-h', '--help' + print_usage $stdout + exit 0 + + when '-v', '--version' + puts "#{File.basename($0)} version #{Version}" + exit 0 + + when '--copyright' + puts Copyright + exit 0 + + else + raise InstallError, "unknown global option '#{arg}'" + end + end + + raise InstallError, <" + out.puts " ruby #{File.basename $0} [] []" + + fmt = " %-20s %s\n" + out.puts + out.puts 'Global options:' + out.printf fmt, '-q,--quiet', 'suppress message outputs' + out.printf fmt, ' --verbose', 'output messages verbosely' + out.printf fmt, '-h,--help', 'print this message' + out.printf fmt, '-v,--version', 'print version and quit' + out.printf fmt, ' --copyright', 'print copyright and quit' + + out.puts + out.puts 'Tasks:' + TASKS.each do |name, desc| + out.printf " %-10s %s\n", name, desc + end + + out.puts + out.puts 'Options for config:' + ConfigTable.each_definition do |name, (default, arg, desc, default2)| + out.printf " %-20s %s [%s]\n", + '--'+ name + (ConfigTable.bool_config?(name) ? '' : '='+arg), + desc, + default2 || default + end + out.printf " %-20s %s [%s]\n", + '--rbconfig=path', 'your rbconfig.rb to load', "running ruby's" + + out.puts + out.puts 'Options for install:' + out.printf " %-20s %s [%s]\n", + '--no-harm', 'only display what to do if given', 'off' + out.printf " %-20s %s [%s]\n", + '--prefix', 'install path prefix', '$prefix' + + out.puts + end + + # + # Task Handlers + # + + def exec_config + @installer.exec_config + @config.save # must be final + end + + def exec_setup + @installer.exec_setup + end + + def exec_install + @installer.exec_install + end + + def exec_show + ConfigTable.each_name do |k| + v = @config.get_raw(k) + if not v or v.empty? + v = '(not specified)' + end + printf "%-10s %s\n", k, v + end + end + + def exec_clean + @installer.exec_clean + end + + def exec_distclean + @installer.exec_distclean + end + +end + + +class ToplevelInstallerMulti < ToplevelInstaller + + include HookUtils + include HookScriptAPI + include FileOperations + + def initialize(ardir) + super + @packages = all_dirs_in("#{@ardir}/packages") + raise 'no package exists' if @packages.empty? + end + + def run_metaconfigs + eval_file_ifexist "#{@ardir}/metaconfig" + @packages.each do |name| + eval_file_ifexist "#{@ardir}/packages/#{name}/metaconfig" + end + end + + def init_installers + @installers = {} + @packages.each do |pack| + @installers[pack] = Installer.new(@config, @options, + "#{@ardir}/packages/#{pack}", + "packages/#{pack}") + end + + with = extract_selection(config('with')) + without = extract_selection(config('without')) + @selected = @installers.keys.select {|name| + (with.empty? or with.include?(name)) \ + and not without.include?(name) + } + end + + def extract_selection(list) + a = list.split(/,/) + a.each do |name| + raise InstallError, "no such package: #{name}" \ + unless @installers.key?(name) + end + a + end + + def print_usage(f) + super + f.puts 'Inluded packages:' + f.puts ' ' + @packages.sort.join(' ') + f.puts + end + + # + # multi-package metaconfig API + # + + attr_reader :packages + + def declare_packages(list) + raise 'package list is empty' if list.empty? + list.each do |name| + raise "directory packages/#{name} does not exist"\ + unless File.dir?("#{@ardir}/packages/#{name}") + end + @packages = list + end + + # + # Task Handlers + # + + def exec_config + run_hook 'pre-config' + each_selected_installers {|inst| inst.exec_config } + run_hook 'post-config' + @config.save # must be final + end + + def exec_setup + run_hook 'pre-setup' + each_selected_installers {|inst| inst.exec_setup } + run_hook 'post-setup' + end + + def exec_install + run_hook 'pre-install' + each_selected_installers {|inst| inst.exec_install } + run_hook 'post-install' + end + + def exec_clean + rm_f 'config.save' + run_hook 'pre-clean' + each_selected_installers {|inst| inst.exec_clean } + run_hook 'post-clean' + end + + def exec_distclean + rm_f 'config.save' + run_hook 'pre-distclean' + each_selected_installers {|inst| inst.exec_distclean } + run_hook 'post-distclean' + end + + # + # lib + # + + def each_selected_installers + Dir.mkdir 'packages' unless File.dir?('packages') + @selected.each do |pack| + $stderr.puts "Processing the package `#{pack}' ..." if @options['verbose'] + Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}") + Dir.chdir "packages/#{pack}" + yield @installers[pack] + Dir.chdir '../..' + end + end + + def verbose? + @options['verbose'] + end + + def no_harm? + @options['no-harm'] + end + +end + + +class Installer + + FILETYPES = %w( bin lib ext data ) + + include HookScriptAPI + include HookUtils + include FileOperations + + def initialize(config, opt, srcroot, objroot) + @config = config + @options = opt + @srcdir = File.expand_path(srcroot) + @objdir = File.expand_path(objroot) + @currdir = '.' + end + + def inspect + "#<#{self.class} #{File.basename(@srcdir)}>" + end + + # + # Hook Script API bases + # + + def srcdir_root + @srcdir + end + + def objdir_root + @objdir + end + + def relpath + @currdir + end + + # + # configs/options + # + + def no_harm? + @options['no-harm'] + end + + def verbose? + @options['verbose'] + end + + def verbose_off + begin + save, @options['verbose'] = @options['verbose'], false + yield + ensure + @options['verbose'] = save + end + end + + # + # TASK config + # + + def exec_config + exec_task_traverse 'config' + end + + def config_dir_bin(rel) + end + + def config_dir_lib(rel) + end + + def config_dir_ext(rel) + extconf if extdir?(curr_srcdir()) + end + + def extconf + opt = @options['config-opt'].join(' ') + command "#{config('ruby-prog')} #{curr_srcdir()}/extconf.rb #{opt}" + end + + def config_dir_data(rel) + end + + # + # TASK setup + # + + def exec_setup + exec_task_traverse 'setup' + end + + def setup_dir_bin(rel) + all_files_in(curr_srcdir()).each do |fname| + adjust_shebang "#{curr_srcdir()}/#{fname}" + end + end + + # modify: #!/usr/bin/ruby + # modify: #! /usr/bin/ruby + # modify: #!ruby + # not modify: #!/usr/bin/env ruby + SHEBANG_RE = /\A\#!\s*\S*ruby\S*/ + + def adjust_shebang(path) + return if no_harm? + + tmpfile = File.basename(path) + '.tmp' + begin + File.open(path, 'rb') {|r| + File.open(tmpfile, 'wb') {|w| + first = r.gets + return unless SHEBANG_RE =~ first + + $stderr.puts "adjusting shebang: #{File.basename path}" if verbose? + w.print first.sub(SHEBANG_RE, '#!' + config('ruby-path')) + w.write r.read + } + } + move_file tmpfile, File.basename(path) + ensure + File.unlink tmpfile if File.exist?(tmpfile) + end + end + + def setup_dir_lib(rel) + end + + def setup_dir_ext(rel) + make if extdir?(curr_srcdir()) + end + + def setup_dir_data(rel) + end + + # + # TASK install + # + + def exec_install + exec_task_traverse 'install' + end + + def install_dir_bin(rel) + install_files collect_filenames_auto(), "#{config('bin-dir')}/#{rel}", 0755 + end + + def install_dir_lib(rel) + install_files ruby_scripts(), "#{config('rb-dir')}/#{rel}", 0644 + end + + def install_dir_ext(rel) + return unless extdir?(curr_srcdir()) + install_files ruby_extentions('.'), + "#{config('so-dir')}/#{File.dirname(rel)}", + 0555 + end + + def install_dir_data(rel) + install_files collect_filenames_auto(), "#{config('data-dir')}/#{rel}", 0644 + end + + def install_files(list, dest, mode) + mkdir_p dest, @options['install-prefix'] + list.each do |fname| + install fname, dest, mode, @options['install-prefix'] + end + end + + def ruby_scripts + collect_filenames_auto().select {|n| /\.rb\z/ =~ n } + end + + # picked up many entries from cvs-1.11.1/src/ignore.c + reject_patterns = %w( + core RCSLOG tags TAGS .make.state + .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb + *~ *.old *.bak *.BAK *.orig *.rej _$* *$ + + *.org *.in .* + ) + mapping = { + '.' => '\.', + '$' => '\$', + '#' => '\#', + '*' => '.*' + } + REJECT_PATTERNS = Regexp.new('\A(?:' + + reject_patterns.map {|pat| + pat.gsub(/[\.\$\#\*]/) {|ch| mapping[ch] } + }.join('|') + + ')\z') + + def collect_filenames_auto + mapdir((existfiles() - hookfiles()).reject {|fname| + REJECT_PATTERNS =~ fname + }) + end + + def existfiles + all_files_in(curr_srcdir()) | all_files_in('.') + end + + def hookfiles + %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt| + %w( config setup install clean ).map {|t| sprintf(fmt, t) } + }.flatten + end + + def mapdir(filelist) + filelist.map {|fname| + if File.exist?(fname) # objdir + fname + else # srcdir + File.join(curr_srcdir(), fname) + end + } + end + + def ruby_extentions(dir) + _ruby_extentions(dir) or + raise InstallError, "no ruby extention exists: 'ruby #{$0} setup' first" + end + + DLEXT = /\.#{ ::Config::CONFIG['DLEXT'] }\z/ + + def _ruby_extentions(dir) + Dir.open(dir) {|d| + return d.select {|fname| DLEXT =~ fname } + } + end + + # + # TASK clean + # + + def exec_clean + exec_task_traverse 'clean' + rm_f 'config.save' + rm_f 'InstalledFiles' + end + + def clean_dir_bin(rel) + end + + def clean_dir_lib(rel) + end + + def clean_dir_ext(rel) + return unless extdir?(curr_srcdir()) + make 'clean' if File.file?('Makefile') + end + + def clean_dir_data(rel) + end + + # + # TASK distclean + # + + def exec_distclean + exec_task_traverse 'distclean' + rm_f 'config.save' + rm_f 'InstalledFiles' + end + + def distclean_dir_bin(rel) + end + + def distclean_dir_lib(rel) + end + + def distclean_dir_ext(rel) + return unless extdir?(curr_srcdir()) + make 'distclean' if File.file?('Makefile') + end + + # + # lib + # + + def exec_task_traverse(task) + run_hook "pre-#{task}" + FILETYPES.each do |type| + if config('without-ext') == 'yes' and type == 'ext' + $stderr.puts 'skipping ext/* by user option' if verbose? + next + end + traverse task, type, "#{task}_dir_#{type}" + end + run_hook "post-#{task}" + end + + def traverse(task, rel, mid) + dive_into(rel) { + run_hook "pre-#{task}" + __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '') + all_dirs_in(curr_srcdir()).each do |d| + traverse task, "#{rel}/#{d}", mid + end + run_hook "post-#{task}" + } + end + + def dive_into(rel) + return unless File.dir?("#{@srcdir}/#{rel}") + + dir = File.basename(rel) + Dir.mkdir dir unless File.dir?(dir) + prevdir = Dir.pwd + Dir.chdir dir + $stderr.puts '---> ' + rel if verbose? + @currdir = rel + yield + Dir.chdir prevdir + $stderr.puts '<--- ' + rel if verbose? + @currdir = File.dirname(rel) + end + +end + + +if $0 == __FILE__ + begin + if multipackage_install? + ToplevelInstallerMulti.invoke + else + ToplevelInstaller.invoke + end + rescue + raise if $DEBUG + $stderr.puts $!.message + $stderr.puts "Try 'ruby #{$0} --help' for detailed usage." + exit 1 + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/CHANGELOG.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/CHANGELOG.md new file mode 100644 index 000000000..cc982691e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/CHANGELOG.md @@ -0,0 +1,1681 @@ +# Haml Changelog + +## 6.4.0 + +* Authorize characters in attribute name for vuejs https://github.com/haml/haml/pull/1172 +* Compile new-style attributes statically https://github.com/haml/haml/pull/1165 +* Remove newlines from template annotation comments https://github.com/haml/haml/pull/1186 +* Fix line numbers within a :ruby filter https://github.com/haml/haml/pull/1166 +* Fix .class + nested class array bug https://github.com/haml/haml/pull/1191 + +## 6.3.1 + +* Optimize string transformation using `String#tr` https://github.com/haml/haml/pull/1168 +* Provide a Changelog link on rubygems.org https://github.com/haml/haml/pull/1157 + +## 6.3.0 + +* Remove `Haml::RailsTemplate#default_format` that was added in v6.1.3 for Turbo [#1152](https://github.com/haml/haml/issues/1152), [#1154](https://github.com/haml/haml/issues/1154) ([discussion](https://github.com/haml/haml/pull/1144#issuecomment-1755088572)) + * See [the reference](https://github.com/haml/haml/blob/v6.3.0/REFERENCE.md#turbo) for suggested alternatives. + +## 6.2.5 + +* Deprecate `Haml::RailsTemplate#default_format` that was added in v6.1.3 for Turbo ([discussion](https://github.com/haml/haml/pull/1144#issuecomment-1755088572)) + +## 6.2.4 + +* Support case-in statement [#1155](https://github.com/haml/haml/issues/1155) + +## 6.2.3 + +* Resurrect RDFa doctype support [#1147](https://github.com/haml/haml/issues/1147) + +## 6.2.2 + +* Allow adding custom attributes to `Haml::BOOLEAN_ATTRIBUTES` [#1148](https://github.com/haml/haml/issues/1148) +* Consider `aria-xxx: false` as a boolean attribute + +## 6.2.1 + +* Fix v6.2.0's bug in rendering dynamic `aria` attributes [#1149](https://github.com/haml/haml/issues/1149) + +## 6.2.0 + +* Drop the C extension [#1146](https://github.com/haml/haml/issues/1146) + +## 6.1.4 + +* Let `Haml::Util.escape_html` use `ERB::Escape` if available [#1145](https://github.com/haml/haml/issues/1145) + +## 6.1.3 + +* Add `Haml::RailsTemplate#default_format` for Turbo compatibility [#1144](https://github.com/haml/haml/issues/1144) + +## 6.1.2 + +* Use the rails template path as `filename` [#1140](https://github.com/haml/haml/issues/1140) + +## 6.1.1 + +* Fix an empty output of Ruby 3.1's Hash shorthand syntax [#1083](https://github.com/haml/haml/issues/1083) + +## 6.1.0 + +* Optimize away a `to_s` call on `=` scripts +* Fix escaping for objects that return an `html_safe` string on `to_s` [#1117](https://github.com/haml/haml/issues/1117) + +## 6.0.12 + +* Fix a whitespace removal with `>` and an `if`-`else` statement [#1114](https://github.com/haml/haml/issues/1114) + +## 6.0.11 + +* Fix a whitespace removal with `>` and an `if` statement [#1114](https://github.com/haml/haml/issues/1114) + +## 6.0.10 + +* Evaluate :erb filter in the template context like Haml 5 + +## 6.0.9 + +* Support sass-embedded [#1112](https://github.com/haml/haml/issues/1112) + +## 6.0.8 + +* Support interpolation in HTML comments, which has not been working since 6.0.0 + [#1107](https://github.com/haml/haml/issues/1107) + +## 6.0.7 + +* `Haml::Engine` and `Haml::Template` use StringBuffer instead of ArrayBuffer + * It seems more performant in many cases with recent Ruby versions. + * `Haml::RailsTemplate` is not affected. + +## 6.0.6 + +* Prevent CRuby from accidentally using the Ruby implementation fallback + * Reversing what v6.0.3 and v6.0.4 did, but still supporting Wasm. + +## 6.0.5 + +* Resurrect `#haml_object_ref` support in an object reference [#1097](https://github.com/haml/haml/issues/1097) + * This was removed in 6.0.0, and added back in this version. +* Stop warning `remove_whitespace: true` option. + +## 6.0.4 + +Released on October 2, 2022 +([diff](https://github.com/haml/haml/compare/v6.0.3...v6.0.4)). + +* Fix a parse failure of `%` in attributes [#1096](https://github.com/haml/haml/issues/1096) +* Add another fallback from C to Ruby for Wasm. + +## 6.0.3 + +Released on September 28, 2022 +([diff](https://github.com/haml/haml/compare/v6.0.2...v6.0.3)). + +* For Wasm, fallback to Ruby when C extension is not available. + +## 6.0.2 + +Released on September 28, 2022 +([diff](https://github.com/haml/haml/compare/v6.0.1...v6.0.2)). + +* Unescape HTML-safe arguments for `surround`, `succeed`, and `precede` on Rails + [#1088](https://github.com/haml/haml/issues/1088) + +## 6.0.1 + +Released on September 23, 2022 +([diff](https://github.com/haml/haml/compare/v6.0.0...v6.0.1)). + +* Unescape HTML-safe interpolation on Rails [#1084](https://github.com/haml/haml/issues/1084) +* Resurrect Haml 5's `AttributeParser.available?` for syntax\_tree-haml [#1085](https://github.com/haml/haml/issues/1085) + +## 6.0.0 + +Released on September 21, 2022 +([diff](https://github.com/haml/haml/compare/v5.2.2...v6.0.0)). + +* Replace the implementation with Hamlit + * Haml 6 is about 1.7x faster than Haml 5 in [this benchmark](benchmark/slim/run-benchmarks.rb). + * The parser is kept as is, but everything else is replaced. + * The `haml` CLI interface was also replaced. + * The interface of `Haml::Engine` is changed. `Haml::Template` is most likely what you need now. + * before: `Haml::Engine.new("%p Haml code!").render` + * after: `Haml::Template.new { "%p Haml code!" }.render` + * Most Haml helpers are removed. + * Rails: + * Kept: `find_and_reserve`, `preserve`, `surround`, `precede`, `succeed`, `capture_haml` + * Removed: `block_is_haml?`, `flatten`, `haml_concat`, `haml_indent`, `haml_tag`, `haml_tag_if`, `html_attrs`, + `html_escape`, `init_haml_helpers`, `is_haml?`, `list_of`, `non_haml`, `tab_down`, `tab_up`, `with_tabs` + * Tilt: + * Kept: `preserve` + * Removed: `block_is_haml?`, `capture_haml`, `escape_once`, `find_and_preserve`, `flatten`, `haml_concat`, + `haml_indent`, `haml_tag`, `haml_tag_if`, `html_attrs`, `html_escape`, `init_haml_helpers`, `is_haml?`, + `list_of`, `non_haml`, `precede`, `succeed`, `surround`, `tab_down`, `tab_up`, `with_tabs` + * `:ruby` filter + * Removed: `haml_io` + * Alternatives to the removed helpers: + * Some simple ones could work by copying [the original definition](https://github.com/haml/haml/blob/v5.2.2/lib/haml/helpers.rb). + * For helpers generating general HTML tags, also consider using what your framework provides, e.g. Rails `content_tag`. + Same applies to `capture_haml`, e.g. Rails `capture`. + * Ones that rely on `Haml::Buffer` have no direct alternative by design. They existed at the cost of performance. + You need to define a helper, instantiate a String buffer in it, append stuff to it, and call it inside `=`. + * Only the following attributes and `aria`/`data` attributes are considered boolean attributes: + * `allowfullscreen`, `async`, `autobuffer`, `autofocus`, `autoplay`, `checked`, `controls`, `default`, + `defer`, `disabled`, `download`, `formnovalidate`, `hidden`, `inert`, `ismap`, `itemscope`, `loop`, + `multiple`, `muted`, `novalidate`, `open`, `pubdate`, `readonly`, `required`, `reversed`, `scoped`, + `seamless`, `selected`, `sortable`, `truespeed`, `typemustmatch` + * Only `data` and `aria` attributes support using a nested Hash to render hyphenated attributes, e.g. + `data: { foo: 'bar' }` becomes `data-foo="bar"`, but this no longer works for non-`data`/`aria` attributes. + * Some legacy Rails integration is removed. + * The default value of `escape_html` option became true. + * `-` script lines no longer support capturing. Only `=` lines are supported to yield a nested block. + * Overriding `data` attributes with another falsy `data-*` attribute that has the same name + is no longer supported. [#1105](https://github.com/haml/haml/issues/1105) + * :erb filter is not executed in the template context (fixed in 6.0.10) + +## 5.2.2 + +Released on July 27, 2021 +([diff](https://github.com/haml/haml/compare/v5.2.1...v5.2.2)). + +* Support `config.action_view.annotate_rendered_view_with_filenames = true` of Rails 6.1 + +## 5.2.1 + +Released on November 30, 2020 +([diff](https://github.com/haml/haml/compare/v5.2.0...v5.2.1)). + +* Add in improved "multiline" support for attributes [#1043](https://github.com/haml/haml/issues/1043) + +## 5.2 + +Released on September 28, 2020 +([diff](https://github.com/haml/haml/compare/v5.1.2...v5.2.0)). + +* Fix crash in the attribute optimizer when `#inspect` is overridden in TrueClass / FalseClass [#972](https://github.com/haml/haml/issues/972) +* Do not HTML-escape templates that are declared to be plaintext [#1014](https://github.com/haml/haml/issues/1014) (Thanks [@cesarizu](https://github.com/cesarizu)) +* Class names are no longer ordered alphabetically, and now follow a new specification as laid out in REFERENCE [#306](https://github.com/haml/haml/issues/306) + +## 5.1.2 + +Released on August 6, 2019 +([diff](https://github.com/haml/haml/compare/v5.1.1...v5.1.2)). + +* Fix crash in some environments such as New Relic by unfreezing string literals for ParseNode#inspect. [#1016](https://github.com/haml/haml/pull/1016) (thanks [Jalyna](https://github.com/jalyna)) + +## 5.1.1 + +Released on May 25, 2019 +([diff](https://github.com/haml/haml/compare/v5.1.0...v5.1.1)). + +* Fix NameError bug that happens on ruby 2.6.1-2.6.3 + haml 5.1.0 + rails < 5.1 + erubi. (Akira Matsuda) + +## 5.1.0 + +Released on May 16, 2019 +([diff](https://github.com/haml/haml/compare/v5.0.4...v5.1.0)). + +* Rails 6 support [#1008](https://github.com/haml/haml/pull/1008) (thanks [Seb Jacobs](https://github.com/sebjacobs)) +* Add `escape_filter_interpolations` option for backwards compatibility with haml 4 defaults [#984](https://github.com/haml/haml/pull/984) (thanks [Will Jordan](https://github.com/wjordan)) +* Fix error on empty :javascript and :css filter blocks [#986](https://github.com/haml/haml/pull/986) (thanks [Will Jordan](https://github.com/wjordan)) +* Respect changes in Haml::Options.defaults in `Haml::TempleEngine` options (Takashi Kokubun) +* Un-freeze TempleEngine precompiled string literals [#983](https://github.com/haml/haml/pull/983) (thanks [Will Jordan](https://github.com/wjordan)) +* Various performance/memory improvements [#965](https://github.com/haml/haml/pull/965), [#966](https://github.com/haml/haml/pull/966), [#963](https://github.com/haml/haml/pull/963) (thanks [Dillon Welch](https://github.com/oniofchaos)) +* Enable `frozen_string_literal` magic comment for all .rb files [#967](https://github.com/haml/haml/pull/967) (thanks [Dillon Welch](https://github.com/oniofchaos)) + +## 5.0.4 + +Released on October 13, 2017 +([diff](https://github.com/haml/haml/compare/v5.0.3...v5.0.4)). + +* Fix `haml -c --stdin` regression in 5.0.2. [#958](https://github.com/haml/haml/pull/958) (thanks [Timo Göllner](https://github.com/TeaMoe)) +* Ruby 2.5 support (it wasn't working due to Ripper API change). (Akira Matsuda) + +## 5.0.3 + +Released on September 7, 2017 +([diff](https://github.com/haml/haml/compare/v5.0.2...v5.0.3)). + +* Use `String#dump` instead of `String#inspect` to generate string literal. (Takashi Kokubun) +* Fix Erubi superclass mismatch error. [#952](https://github.com/haml/haml/pull/952) (thanks [Robin Daugherty](https://github.com/RobinDaugherty)) + +## 5.0.2 + +Released on August 1, 2017 +([diff](https://github.com/haml/haml/compare/v5.0.1...v5.0.2)). + +* Let `haml -c` fail if generated Ruby code is syntax error. [#880](https://github.com/haml/haml/issues/880) (Takashi Kokubun) +* Fix `NoMethodError` bug caused with Sprockets 3 and :sass filter. [#930](https://github.com/haml/haml/pull/930) (thanks [Gonzalez Maximiliano](https://github.com/emaxi)) +* Fix `list_of` helper with multi-line content. [#933](https://github.com/haml/haml/pull/933) (thanks [Benoit Larroque](https://github.com/zetaben)) +* Optimize rendering performance by changing timing to fix textareas. [#941](https://github.com/haml/haml/pull/941) (Takashi Kokubun) +* Fix `TypeError` with empty :ruby filter. [#942](https://github.com/haml/haml/pull/942) (Takashi Kokubun) +* Fix inconsistent attribute sort order. (Takashi Kokubun) + +## 5.0.1 + +Released on May 3, 2017 +([diff](https://github.com/haml/haml/compare/v5.0.0...v5.0.1)). + +* Fix parsing attributes including string interpolation. [#917](https://github.com/haml/haml/pull/917) [#921](https://github.com/haml/haml/issues/921) +* Stop distributing test files in gem package and allow installing on Windows. +* Use ActionView's Erubi/Erubis handler for erb filter only on ActionView. [#914](https://github.com/haml/haml/pull/914) + +## 5.0.0 + +Released on April 26, 2017 +([diff](https://github.com/haml/haml/compare/4.0.7...v5.0.0)). + +Breaking Changes + +* Haml now requires Ruby 2.0.0 or above. +* Rails 3 is no longer supported, matching the official + [Maintenance Policy for Ruby on Rails](http://weblog.rubyonrails.org/2013/2/24/maintenance-policy-for-ruby-on-rails/). + Use Haml 4 if you want to use Rails 3. + (Tee Parham) +* Remove `:ugly` option ([#894](https://github.com/haml/haml/pull/894)) +* The `haml` command's debug option (`-d`) no longer executes the Haml code, but + rather checks the generated Ruby syntax for errors. +* Drop parser/compiler accessor from `Haml::Engine`. Modify `Haml::Engine#initialize` options + or `Haml::Template.options` instead. (Takashi Kokubun) +* Drop dynamic quotes support and always escape `'` for `escape_html`/`escape_attrs` instead. + Also, escaped results are slightly changed and always unified to the same characters. (Takashi Kokubun) +* Don't preserve newlines in attributes. (Takashi Kokubun) +* HTML escape interpolated code in filters. + [#770](https://github.com/haml/haml/pull/770) + (Matt Wildig) + + :javascript + #{JSON.generate(foo: "bar")} + Haml 4 output: {"foo":"bar"} + Haml 5 output: {"foo":"bar"} + +Added + +* Add a tracing option. When enabled, Haml will output a data-trace attribute on each tag showing the path + to the source Haml file from which it was generated. Thanks [Alex Babkin](https://github.com/ababkin). +* Add `haml_tag_if` to render a block, conditionally wrapped in another element (Matt Wildig) +* Support Rails 5.1 Erubi template handler. +* Support Sprockets 3. Thanks [Sam Davies](https://github.com/samphilipd) and [Jeremy Venezia](https://github.com/jvenezia). +* General performance and memory usage improvements. (Akira Matsuda) +* Analyze attribute values by Ripper and render static attributes beforehand. (Takashi Kokubun) +* Optimize attribute rendering about 3x faster. (Takashi Kokubun) +* Add temple gem as dependency and create `Haml::TempleEngine` class. + Some methods in `Haml::Compiler` are migrated to `Haml::TempleEngine`. (Takashi Kokubun) + +Fixed + +* Fix for attribute merging. When an attribute method (or literal nested hash) + was used in an old style attribute hash and there is also a (non-static) new + style hash there is an error. The fix can result in different behavior in + some circumstances. See the [commit message](https://github.com/haml/haml/tree/e475b015d3171fb4c4f140db304f7970c787d6e3) + for detailed info. (Matt Wildig) +* Make escape_once respect hexadecimal references. (Matt Wildig) +* Don't treat the 'data' attribute specially when merging attribute hashes. (Matt Wildig and Norman Clarke) +* Fix #@foo and #$foo style interpolation that was not working in html_safe mode. (Akira Matsuda) +* Allow `@` as tag's class name. Thanks [Joe Bartlett](https://github.com/redoPop). +* Raise `Haml::InvalidAttributeNameError` when attribute name includes invalid characters. (Takashi Kokubun) +* Don't ignore unexpected exceptions on initializing `ActionView::OutputBuffer`. (Takashi Kokubun) + +## 4.0.7 + +Released on August 10, 2015 +([diff](https://github.com/haml/haml/compare/4.0.6...4.0.7)). + +* Significantly improve performance of regexp used to fix whitespace handling in textareas (thanks [Stan Hu](https://github.com/stanhu)). + +## 4.0.6 + +Released on Dec 1, 2014 ([diff](https://github.com/haml/haml/compare/4.0.5...4.0.6)). + +* Fix warning on Ruby 1.8.7 "regexp has invalid interval" (thanks [Elia Schito](https://github.com/elia)). + +## 4.0.5 + +Released on Jan 7, 2014 ([diff](https://github.com/haml/haml/compare/4.0.4...4.0.5)). + +* Fix haml_concat appending unescaped HTML after a call to haml_tag. +* Fix for bug whereby when HAML :ugly option is "true", + ActionView::Helpers::CaptureHelper::capture returns the whole view buffer + when passed a block that returns nothing (thanks [Mircea + Moise](https://github.com/mmircea16)). + +## 4.0.4 + +Released on November 5, 2013 ([diff](https://github.com/haml/haml/compare/4.0.3...4.0.4)). + +* Check for Rails::Railtie rather than Rails (thanks [Konstantin Shabanov](https://github.com/etehtsea)). +* Parser fix to allow literal '#' with suppress_eval (Matt Wildig). +* Helpers#escape_once works on frozen strings (as does + ERB::Util.html_escape_once for which it acts as a replacement in + Rails (thanks [Patrik Metzmacher](https://github.com/patrik)). +* Minor test fix (thanks [Mircea Moise](https://github.com/mmircea16)). + +## 4.0.3 + +Released May 21, 2013 ([diff](https://github.com/haml/haml/compare/4.0.2...4.0.3)). + +* Compatibility with newer versions of Rails's Erubis handler. +* Fix Erubis handler for compatibility with Tilt 1.4.x, too. +* Small performance optimization for html_escape. +(thanks [Lachlan Sylvester](https://github.com/lsylvester)) +* Documentation fixes. +* Documented some helper methods that were left out of the reference. +(thanks [Shane Riley](https://github.com/shaneriley)) + +## 4.0.2 + +Released April 5, 2013 ([diff](https://github.com/haml/haml/compare/4.0.1...4.0.2)). + +* Explicitly require Erubis to work around bug in older versions of Tilt. +* Fix :erb filter printing duplicate content in Rails views. +(thanks [Jori Hardman](https://github.com/jorihardman)) +* Replace range with slice to reduce objects created by `capture_haml`. +(thanks [Tieg Zaharia](https://github.com/tiegz)) +* Correct/improve some documentation. + +## 4.0.1 + +Released March 21, 2013 ([diff](https://github.com/haml/haml/compare/4.0.0...4.0.1)). + +* Remove Rails 3.2.3+ textarea hack in favor of a more general solution. +* Fix some performance regressions. +* Fix support for Rails 4 `text_area` helper method. +* Fix data attribute flattening with singleton objects. +(thanks [Alisdair McDiarmid](https://github.com/alisdair)) +* Fix support for sass-rails 4.0 beta. +(thanks [Ryunosuke SATO](https://github.com/tricknotes)) +* Load "haml/template" in Railtie in order to prevent user options set in a + Rails initializer from being overwritten +* Don't depend on Rails in haml/template to allow using Haml with ActionView + but without Rails itself. (thanks [Hunter Haydel](https://github.com/wedgex)) + +## 4.0.0 + +* The Haml executable now accepts an `--autoclose` option. You can now + specify a list of tags that should be autoclosed + +* The `:ruby` filter no longer redirects $stdout to the Haml document, as this + is not thread safe. Instead it provides a `haml_io` local variable, which is + an IO object that writes to the document. + +* HTML5 is now the default output format rather than XHTML. This was already + the default on Rails 3+, so many users will notice no difference. + +* The :sass filter now wraps its output in a style tag, as do the new :less and + :scss filters. The :coffee filter wraps its output in a script tag. + +* Haml now supports only Rails 3 and above, and Ruby 1.8.7 and above. If you + still need support for Rails 2 and Ruby 1.8.6, please use Haml 3.1.x which + will continue to be maintained for bug fixes. + +* The :javascript and :css filters no longer add CDATA tags when the format is + html4 or html5. This can be overridden by setting the `cdata` option to + `true`. CDATA tags are always added when the format is xhtml. + +* HTML2Haml has been extracted to a separate gem, creatively named "html2haml". + +* The `:erb` filter now uses Rails's safe output buffer to provide XSS safety. + +* Haml's internals have been refactored to move the parser, compiler and options + handling into independent classes, rather than including them all in the + Engine module. You can also specify your own custom Haml parser or compiler + class in Haml::Options in order to extend or modify Haml reasonably easily. + +* Add an {file:REFERENCE.md#hyphenate_data_attrs-option `:hyphenate_data_attrs` + option} that converts underscores to hyphens in your HTML5 data keys. This is + a language change from 3.1 and is enabled by default. + (thanks to [Andrew Smith](https://github.com/fullsailor)) + +* All Hash attribute values are now treated as HTML5 data, regardless of key. + Previously only the "data" key was treated this way. Allowing arbitrary keys + means you can now easily use this feature for Aria attributes, among other + uses. + (thanks to [Elvin Efendi](https://github.com/ElvinEfendi)) + +* Added `remove_whitespace` option to always remove all whitespace around Haml + tags. (thanks to [Tim van der Horst](https://github.com/vdh)) + +* Haml now flattens deeply nested data attribute hashes. For example: + + `.foo{:data => {:a => "b", :c => {:d => "e", :f => "g"}}}` + + would render to: + + `
    ` + + (thanks to [Péter Pál Koszta](https://github.com/koszta)) + +* Filters that rely on third-party template engines are now implemented using + [Tilt](http://github.com/rtomayko/tilt). Several new filters have been added, namely + SCSS (:scss), LessCSS, (:less), and Coffeescript (:coffee/:coffeescript). + + Though the list of "official" filters is kept intentionally small, Haml comes + with a helper method that makes adding support for other Tilt-based template + engines trivial. + + As of 4.0, Haml will also ship with a "haml-contrib" gem that includes useful + but less-frequently used filters and helpers. This includes several additional + filters such as Nokogiri, Yajl, Markaby, and others. + +* Generate object references based on `#to_key` if it exists in preference to + `#id`. + +* Performance improvements. + (thanks to [Chris Heald](https://github.com/cheald)) + +* Helper `list_of` takes an extra argument that is rendered into list item + attributes. + (thanks [Iain Barnett](http://iainbarnett.me.uk/)) + +* Fix parser to allow lines ending with `some_method?` to be a Ruby multinline. + (thanks to [Brad Ediger](https://github.com/bradediger)) + +* Always use :xhtml format when the mime_type of the rendered template is + 'text/xml'. + (thanks to [Stephen Bannasch](https://github.com/stepheneb)) + +* html2haml now includes an `--html-attributes` option. + (thanks [Stefan Natchev](https://github.com/snatchev)) + +* Fix for inner whitespace removal in loops. + (thanks [Richard Michael](https://github.com/richardkmichael)) + +* Use numeric character references rather than HTML entities when escaping + double quotes and apostrophes in attributes. This works around some bugs in + Internet Explorer earlier than version 9. + (thanks [Doug Mayer](https://github.com/doxavore)) + +* Fix multiline silent comments: Haml previously did not allow free indentation + inside multline silent comments. + +* Fix ordering bug with partial layouts on Rails. + (thanks [Sam Pohlenz](https://github.com/spohlenz)) + +* Add command-line option to suppress script evaluation. + +* It's now possible to use Rails's asset helpers inside the Sass and SCSS + filters. Note that to do so, you must make sure sass-rails is loaded in + production, usually by moving it out of the assets gem group. + +* The Haml project now uses [semantic versioning](http://semver.org/). + +## 3.2.0 + +The Haml 3.2 series was released only as far as 3.2.0.rc.4, but then was +renamed to Haml 4.0 when the project adopted semantic versioning. + +## 3.1.8 + +* Fix for line numbers reported from exceptions in nested blocks + (thanks to Grant Hutchins & Sabrina Staedt). + +## 3.1.7 + +* Fix for compatibility with Sass 3.2.x. + (thanks [Michael Westbom](https://github.com/totallymike)). + +## 3.1.6 + +* In indented mode, don't reindent buffers that contain preserved tags, and + provide a better workaround for Rails 3.2.3's textarea helpers. + +## 3.1.5 + +* Respect Rails' `html_safe` flag when escaping attribute values + (thanks to [Gerad Suyderhoud](https://github.com/gerad)). + +* Fix for Rails 3.2.3 textarea helpers + (thanks to [James Coleman](https://github.com/jcoleman) and others). + +## 3.1.4 + +* Fix the use of `FormBuilder#block` with a label in Haml. +* Fix indentation after a self-closing tag with dynamic attributes. + +## 3.1.3 + +* Stop partial layouts from being displayed twice. + +## 3.1.2 + +* If the ActionView `#capture` helper is used in a Haml template but without any Haml being run in the block, + return the value of the block rather than the captured buffer. + +* Don't throw errors when text is nested within comments. + +* Fix html2haml. + +* Fix an issue where destructive modification was sometimes performed on Rails SafeBuffers. + +* Use character code entities for attribute value replacements instead of named/keyword entities. + +## 3.1.1 + +* Update the vendored Sass to version 3.1.0. + +## 3.1.0 + +* Don't add a `type` attribute to ` + + is now transformed into: + + :javascript + function foo() { + return 12; + } + +* `
    ` and `
    +    

    + +However, if a helper is generating the tag, +Haml can't detect that and so you'll have to call {Haml::Helpers#find_and_preserve} yourself. +You can also use `~`, which is the same as `=` +except that it automatically runs `find_and_preserve` on its input. +For example: + + %p= find_and_preserve "" + +is the same as + + %p~ "" + +and renders + +

    + +### How do I make my long lines of Ruby code look nicer in my Haml document? {#q-multiline} + +Put them in a helper or your model. + +Haml purposefully makes it annoying to put lots of Ruby code into your templates, +because lots of code doesn't belong in the view. +If you take that huge `link_to_remote` call +and move it to a `update_sidebar_link` helper, +it'll make your view both easier to read and more semantic. + +If you absolutely must put lots of code in your template, +Haml offers a somewhat awkward multiline-continuation tool. +Put a `|` (pipe character) at the end of each line you want to be merged into one +(including the last line!). +For example: + + %p= @this.is(way.too.much). | + code("and I should"). | + really_move.it.into( | + :a => @helper) | + +Note that sometimes it is valid to include lots of Ruby in a template +when that Ruby is a helper call that passes in a lot of template information. +Thus when a function has lots of arguments, +it's possible to wrap it across multiple lines +as long as each line ends in a comma. +For example: + + = link_to_remote "Add to cart", + :url => { :action => "add", :id => product.id }, + :update => { :success => "cart", :failure => "error" } + +### `form_for` is printing the form tag twice! + +Make sure you're calling it with `-`, not `=`. +Just like in ERB, you have to do + + <% form_for stuff do %> + ... + <% end %> + +in Haml, you have to do + + - form_for stuff do + ... + +### I have Haml installed. Why is Rails (only looking for `.html.erb` files | rendering Haml files as plain text | rendering Haml files as blank pages)? {#q-blank-page} + +There are several reasons these things might be happening. +First of all, make sure that Haml really is installed; +either you've loaded the gem (via `config.gem` in Rails 2.3 or in the Gemfile in Rails 3), +or `vendor/plugins/haml` exists and contains files. +Then try restarting Mongrel or WEBrick or whatever you might be using. + +Finally, if none of these work, +chances are you've got some localization plugin like Globalize installed. +Such plugins often don't play nicely with Haml. +Luckily, there's usually an easy fix. +For Globalize, just edit `globalize/lib/globalize/rails/action_view.rb` +and change + + @@re_extension = /\.(rjs|rhtml|rxml)$/ + +to + + @@re_extension = /\.(rjs|rhtml|rxml|erb|builder|haml)$/ + +For other plugins, a little searching will probably turn up a way to fix them as well. + +## You still haven't answered my question! + +Sorry! Try looking at the [Haml](https://haml.info/docs/yardoc/file.REFERENCE.html) reference, +If you can't find an answer there, +feel free to ask in `#haml` on irc.freenode.net +or send an email to the [mailing list](http://groups.google.com/group/haml). diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/Gemfile b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/Gemfile new file mode 100644 index 000000000..1d2316eed --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/Gemfile @@ -0,0 +1,34 @@ +source 'https://rubygems.org' + +git_source(:github) do |repo_name| + repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") + "https://github.com/#{repo_name}.git" +end + +# Specify your gem's dependencies in haml.gemspec +gemspec + +gem 'benchmark-ips', '2.3.0' +gem 'maxitest' +gem 'pry' + +if /java/ === RUBY_PLATFORM # JRuby + gem 'pandoc-ruby' +else + gem 'redcarpet' + + if RUBY_PLATFORM !~ /mswin|mingw/ && RUBY_ENGINE != 'truffleruby' + gem 'stackprof' + end +end + +if RUBY_VERSION < '2.6' + gem 'rake-compiler', '< 1.2.4' +end + +# Temporary workaround to ensure Ruby 2.5 and 2.6 can pass tests with Rails 6.1 +# Reference: https://github.com/rails/rails/issues/54260 +# TODO: Remove this workaround when dropping support for Rails versions below 7.1 +if RUBY_VERSION < '2.7' + gem 'concurrent-ruby', '< 1.3.5' +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/MIT-LICENSE b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/MIT-LICENSE new file mode 100644 index 000000000..61b6a20ae --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2006-2021 Hampton Catlin, Natalie Weizenbaum and Takashi Kokubun + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/README.md new file mode 100644 index 000000000..68887f759 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/README.md @@ -0,0 +1,205 @@ +# Haml + +[![Gem Version](https://badge.fury.io/rb/haml.svg)](https://rubygems.org/gems/haml) +[![test](https://github.com/haml/haml/actions/workflows/test.yml/badge.svg)](https://github.com/haml/haml/actions/workflows/test.yml) +[![Code Climate](https://codeclimate.com/github/haml/haml/badges/gpa.svg)](https://codeclimate.com/github/haml/haml) +[![Inline docs](https://inch-ci.org/github/haml/haml.svg)](https://inch-ci.org/github/haml/haml) +[![Discord Server](https://dcbadge.limes.pink/api/server/https://discord.gg/G8dEAwvV2Y)](https://discord.gg/G8dEAwvV2Y) + +Haml is a templating engine for HTML. It's designed to make it both easier and +more pleasant to write HTML documents, by eliminating redundancy, reflecting the +underlying structure that the document represents, and providing an elegant syntax +that's both powerful and easy to understand. + +## Basic Usage + +Haml can be used from the command line or as part of a Ruby web framework. The +first step is to install the gem: + +~~~sh +gem install haml +~~~ + +After you write some Haml, you can run + +~~~sh +haml render document.haml +~~~ + +to compile it to HTML. For more information on these commands, check out + +~~~sh +haml --help +~~~ + +To use Haml programmatically, check out the [YARD documentation](https://haml.info/docs/yardoc/). + +## Using Haml with Rails + +To use Haml with Rails, simply add Haml to your Gemfile and run `bundle`. + +~~~ruby +gem 'haml' +~~~ + +If you'd like to replace Rails's ERB-based generators with Haml, add +[haml-rails](https://github.com/haml/haml-rails) to your Gemfile as well. + +## Formatting + +The most basic element of Haml is a shorthand for creating HTML: + +~~~haml +%tagname{:attr1 => 'value1', :attr2 => 'value2'} Contents +~~~ + +No end-tag is needed; Haml handles that automatically. If you prefer HTML-style +attributes, you can also use: + +~~~haml +%tagname(attr1='value1' attr2='value2') Contents +~~~ + +Adding `class` and `id` attributes is even easier. Haml uses the same syntax as +the CSS that styles the document: + +~~~haml +%tagname#id.class +~~~ + +In fact, when you're using the `
    ` tag, it becomes _even easier_. Because +`
    ` is such a common element, a tag without a name defaults to a div. So + +~~~haml +#foo Hello! +~~~ + +becomes + +~~~html +
    Hello!
    +~~~ + +Haml uses indentation to bring the individual elements to represent the HTML +structure. A tag's children are indented beneath than the parent tag. Again, a +closing tag is automatically added. For example: + +~~~haml +%ul + %li Salt + %li Pepper +~~~ + +becomes: + +~~~html +
      +
    • Salt
    • +
    • Pepper
    • +
    +~~~ + +You can also put plain text as a child of an element: + +~~~haml +%p + Hello, + World! +~~~ + +It's also possible to embed Ruby code into Haml documents. An equals sign, `=`, +will output the result of the code. A hyphen, `-`, will run the code but not +output the result. You can even use control statements like `if` and `while`: + +~~~haml +%p + Date/Time: + - now = DateTime.now + %strong= now + - if now > DateTime.parse("December 31, 2006") + = "Happy new " + "year!" +~~~ + +Haml provides far more tools than those presented here. Check out the [reference +documentation](https://haml.info/docs/yardoc/file.REFERENCE.html) +for full details. + +### Indentation + +Haml's indentation can be made up of one or more tabs or spaces. However, +indentation must be consistent within a given document. Hard tabs and spaces +can't be mixed, and the same number of tabs or spaces must be used throughout. + +## Contributing + +Contributions are welcomed, but before you get started please read the +[guidelines](https://haml.info/development.html#contributing). + +After forking and then cloning the repo locally, install Bundler and then use it +to install the development gem dependencies: +~~~sh +gem install bundler +bundle install +~~~ + +Once this is complete, you should be able to run the test suite: +~~~sh +rake +~~~ + +At this point `rake` should run without error or warning and you are ready to +start working on your patch! + +Note that you can also run just one test out of the test suite if you're working +on a specific area: + +~~~sh +ruby -Itest test/helper_test.rb -n test_buffer_access +~~~ + +Haml currently supports Ruby 2.0.0 and higher, so please make sure your changes run on 2.0+. + +## Team + +### Current Maintainers + +* [Akira Matsuda](https://github.com/amatsuda) +* [Matt Wildig](https://github.com/mattwildig) +* [Tee Parham](https://github.com/teeparham) +* [Takashi Kokubun](https://github.com/k0kubun) + +### Alumni + +Haml was created by [Hampton Catlin](http://hamptoncatlin.com), the author of +the original implementation. Hampton is no longer involved in day-to-day coding, +but still consults on language issues. + +[Natalie Weizenbaum](http://nex-3.com) was for many years the primary developer +and architect of the "modern" Ruby implementation of Haml. + +[Norman Clarke](https://github.com/norman) was the primary maintainer of Haml from 2012 to 2016. + +## License + +Some of Natalie's work on Haml was supported by Unspace Interactive. + +Beyond that, the implementation is licensed under the MIT License. + +Copyright (c) 2006-2019 Hampton Catlin, Natalie Weizenbaum and the Haml team + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/REFERENCE.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/REFERENCE.md new file mode 100644 index 000000000..751b4792d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/REFERENCE.md @@ -0,0 +1,1309 @@ +# Haml (HTML Abstraction Markup Language) + +Haml is a markup language that's used to cleanly and simply describe the HTML of +any web document, without the use of inline code. Haml functions as a +replacement for inline page templating systems such as PHP, ERB, and ASP. +However, Haml avoids the need for explicitly coding HTML into the template, +because it is actually an abstract description of the HTML, with some code to +generate dynamic content. + +## Features + +* Whitespace active +* Well-formatted markup +* DRY +* Follows CSS conventions +* Integrates Ruby code +* Implements Rails templates with the .haml extension + +## Using Haml + +Haml can be used in three ways: + +* as a command-line tool, +* as a plugin for Ruby on Rails, +* and as a standalone Ruby module. + +The first step for all of these is to install the Haml gem: + + gem install haml + +To run Haml from the command line, just use + + haml render input.haml > output.html + +Use `haml --help` for full documentation. + +To use Haml with Rails, add the following line to the Gemfile: + + gem "haml" + +Once it's installed, all view files with the `".html.haml"` extension will be +compiled using Haml. + +You can access instance variables in Haml templates the same way you do in ERB +templates. Helper methods are also available in Haml templates. For example: + + # file: app/controllers/movies_controller.rb + + class MoviesController < ApplicationController + def index + @title = "Teen Wolf" + end + end + + -# file: app/views/movies/index.html.haml + + #content + .title + %h1= @title + = link_to 'Home', home_url + +may be compiled to: + +
    + +### Ruby Module + +Haml can also be used completely separately from Rails and ActionView. To do +this, install the gem with RubyGems: + + gem install haml + +You can then use it by including the `haml` gem in Ruby code, and using +{Haml::Template} like so: + + engine = Haml::Template.new { "%p Haml code!" } + engine.render #=> "

    Haml code!

    \n" + +### Options + +Haml understands various configuration options that affect its performance and +output. + +In Rails, options can be set by using `Haml::RailsTemplate.set_options` in an initializer: + +```ruby +# config/initializers/haml.rb +Haml::RailsTemplate.set_options(escape_html: false) +``` + +Outside Rails, you can set them by configuring them globally in `Haml::Template.options`: + +```ruby +Haml::Template.options[:escape_html] = false +``` + +In sinatra specifically, you can set them in global config with: +```ruby +set :haml, { escape_html: false } +``` + +Finally, you can also set them by passing an options hash to `Haml::Engine.new` or `Haml::Template.new`. +For the complete list of available options, please see [`Haml::Engine`](https://github.com/haml/haml/blob/main/lib/haml/engine.rb). + +## Plain Text + +A substantial portion of any HTML document is its content, which is plain old +text. Any Haml line that's not interpreted as something else is taken to be +plain text, and passed through unmodified. For example: + + %gee + %whiz + Wow this is cool! + +is compiled to: + + + + Wow this is cool! + + + +Note that HTML tags are passed through unmodified as well. If you have some HTML +you don't want to convert to Haml, or you're converting a file line-by-line, you +can just include it as-is. For example: + + %p +
    Blah!
    + +is compiled to: + +

    +

    Blah!
    +

    + +### Escaping: `\` + +The backslash character escapes the first character of a line, allowing use of +otherwise interpreted characters as plain text. For example: + + %title + = @title + \= @title + +is compiled to: + + + MyPage + = @title + + +## HTML Elements + +### Element Name: `%` + +The percent character is placed at the beginning of a line. It's followed +immediately by the name of an element, then optionally by modifiers (see below), +a space, and text to be rendered inside the element. It creates an element in +the form of ``. For example: + + %one + %two + %three Hey there + +is compiled to: + + + + Hey there + + + +Any string is a valid element name; Haml will automatically generate opening and +closing tags for any element. + +### Attributes: `{}` or `()` {#attributes} + +Braces represent a Ruby hash that is used for specifying the attributes of an +element. It is literally evaluated as a Ruby hash, so logic will work in it and +local variables may be used. Quote characters within the attribute will be +replaced with appropriate escape sequences. The hash is placed after the tag is +defined. For example: + + %html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"} + +is compiled to: + + + +Attribute hashes can also be stretched out over multiple lines to accommodate +many attributes. + + %script{ + "type": text/javascript", + "src": javascripts/script_#{2 + 7}", + "data": { + "controller": "reporter", + }, + } + +is compiled to: + + + +#### `:class` and `:id` Attributes {#class-and-id-attributes} + +The `:class` and `:id` attributes can also be specified as a Ruby array whose +elements will be joined together. A `:class` array is joined with `" "` and an +`:id` array is joined with `"_"`. For example: + + %div{:id => [@item.type, @item.number], :class => [@item.type, @item.urgency]} + +is equivalent to: + + %div{:id => "#{@item.type}_#{@item.number}", :class => "#{@item.type} #{@item.urgency}"} + +The array will first be flattened and any elements that do not test as true will +be removed. The remaining elements will be converted to strings. For example: + + %div{:class => [@item.type, @item == @sortcol && [:sort, @sortdir]] } Contents + +could render as any of: + +
    Contents
    +
    Contents
    +
    Contents
    +
    Contents
    + +depending on whether `@item.type` is `"numeric"` or `nil`, whether `@item == @sortcol`, +and whether `@sortdir` is `"ascending"` or `"descending"`. + +If a single value is specified and it evaluates to false it is ignored; +otherwise it gets converted to a string. For example: + + .item{:class => @item.is_empty? && "empty"} + +could render as either of: + + class="item" + class="item empty" + +#### HTML-style Attributes: `()` + +Haml also supports a terser, less Ruby-specific attribute syntax based on HTML's +attributes. These are used with parentheses instead of braces, like so: + + %html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en") + +Ruby variables can be used by omitting the quotes. Local variables or instance +variables can be used. For example: + + %a(title=@title href=href) Stuff + +This is the same as: + + %a{:title => @title, :href => href} Stuff + +Because there are no commas separating attributes, though, more complicated +expressions aren't allowed. For those you'll have to use the `{}` syntax. You +can, however, use both syntaxes together: + + %a(title=@title){:href => @link.href} Stuff + +You can also use `#{}` interpolation to insert complicated expressions in a +HTML-style attribute: + + %span(class="widget_#{@widget.number}") + +HTML-style attributes can be stretched across multiple lines just like +hash-style attributes: + + %script(type="text/javascript" + src="javascripts/script_#{2 + 7}") + +#### Ruby 1.9-style Hashes + +Haml also supports Ruby's new hash syntax: + + %a{title: @title, href: href} Stuff + +#### Boolean Attributes + +Some attributes, such as "checked" for `input` tags or "selected" for `option` +tags, are "boolean" in the sense that their values don't matter - it only +matters whether or not they're present. In HTML (but not XHTML), these +attributes can be written as + + + +To do this in Haml using hash-style attributes, just assign a Ruby `true` value +to the attribute: + + %input{:selected => true} + +In XHTML, the only valid value for these attributes is the name of the +attribute. Thus this will render in XHTML as + + + +To set these attributes to false, simply assign them to a Ruby false value. In +both XHTML and HTML, + + %input{:selected => false} + +will just render as: + + + +HTML-style boolean attributes can be written just like HTML: + + %input(selected) + +or using `true` and `false`: + + %input(selected=true) + +This feature works only for attributes that are included in +[`Haml::BOOLEAN_ATTRIBUTES`](https://github.com/haml/haml/blob/main/lib/haml/attribute_compiler.rb#L8), +as well as `data-` and `aria-` attributes. + + %input{'data-hidden' => false} + %input{'aria-hidden' => false} + %input{'xyz-hidden' => false} + +will render as: + + + + + + + + + +#### Data Attributes + +HTML5 allows for adding +[custom non-visible data attributes](http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#embedding-custom-non-visible-data-with-the-data-*-attributes) +to elements using attribute names beginning with `data-`. The +[Accessible Rich Internet Applications](http://www.w3.org/WAI/intro/aria) +specification makes use of attributes beginning with `aria-`. + +Haml can help generate collections of attributes that share a prefix like +these. Any entry in an `data` or `aria` attribute hash that has a Hash as its +value is expanded into a series of attributes, one for each key/value pair in +the hash, with the attribute name formed by joining the “parent” key name to +the key name with a hyphen. This works only for `data` or `aria`. + +For example: + + %a{:href=>"/posts", :data => {:author_id => 123, :category => 7}} Posts By Author + +will render as: + + Posts By Author + +This expansion of hashes is recursive – any value of the child hash that is +itself a hash will create an attribute for each entry, with the attribute name +prefixed with all ancestor keys. For example: + + .book-info{:data => {:book => {:id => 123, :genre => 'programming'}, :category => 7}} + +will render as: + +
    + +### Class and ID: `.` and `#` + +The period and pound sign are borrowed from CSS. They are used as shortcuts to +specify the `class` and `id` attributes of an element, respectively. Multiple +class names can be specified in a similar way to CSS, by chaining the class +names together with periods. They are placed immediately after the tag and +before an attributes hash. For example: + + %div#things + %span#rice Chicken Fried + %p.beans{ :food => 'true' } The magical fruit + %h1.class.otherclass#id La La La + +is compiled to: + +
    + Chicken Fried +

    The magical fruit

    +

    La La La

    +
    + +And, + + %div#content + %div.articles + %div.article.title Doogie Howser Comes Out + %div.article.date 2006-11-05 + %div.article.entry + Neil Patrick Harris would like to dispel any rumors that he is straight + +is compiled to: + +
    +
    +
    Doogie Howser Comes Out
    +
    2006-11-05
    +
    + Neil Patrick Harris would like to dispel any rumors that he is straight +
    +
    +
    + +These shortcuts can be combined with long-hand attributes; the two values will +be merged together as though they were all placed in an array (see [the +documentation on `:class` and `:id` attributes](#class-and-id-attributes)). For +example: + + %div#Article.article.entry{:id => @article.number, :class => @article.visibility} + +is equivalent to + + %div{:id => ['Article', @article.number], :class => ['article', 'entry', @article.visibility]} Gabba Hey + +and could compile to: + +
    Gabba Hey
    + +#### Implicit Div Elements + +Because divs are used so often, they're the default elements. If you only define +a class and/or id using `.` or `#`, a div is automatically used. For example: + + #collection + .item + .description What a cool item! + +is the same as: + + %div#collection + %div.item + %div.description What a cool item! + +and is compiled to: + +
    +
    +
    What a cool item!
    +
    +
    + +#### Class Name Merging and Ordering + +Class names are ordered in the following way: + +1) Tag identifiers in order (aka, ".alert.me" => "alert me") +2) Classes appearing in HTML-style attributes +3) Classes appearing in Hash-style attributes + +For instance, this is a complicated and unintuitive test case illustrating the ordering + + .foo.moo{:class => ['bar', 'alpha']}(class='baz') + +The resulting HTML would be as follows: + +
    + +*Versions of Haml prior to 5.0 would alphabetically sort class names.* + +### Empty (void) Tags: `/` + +The forward slash character, when placed at the end of a tag definition, causes +Haml to treat it as being an empty (or void) element. Depending on the format, +the tag will be rendered either without a closing tag (`:html4` or `:html5`), or +as a self-closing tag (`:xhtml`). + +Taking the following as an example: + + %br/ + %meta{'http-equiv' => 'Content-Type', :content => 'text/html'}/ + +When the format is `:html4` or `:html5` this is compiled to: + +
    + + +and when the format is `:xhtml` it is compiled to: + +
    + + +Some tags are automatically treated as being empty, as long as they have no +content in the Haml source. `meta`, `img`, `link`, `br`, `hr`, `input`, +`area`, `param`, `col` and `base` tags are treated as empty by default. This +list can be customized by setting the {Haml::Options#autoclose `:autoclose`} +option. + +### Whitespace Removal: `>` and `<` + +`>` and `<` give you more control over the whitespace near a tag. `>` will +remove all whitespace surrounding a tag, while `<` will remove all whitespace +immediately within a tag. You can think of them as alligators eating the +whitespace: `>` faces out of the tag and eats the whitespace on the outside, and +`<` faces into the tag and eats the whitespace on the inside. They're placed at +the end of a tag definition, after class, id, and attribute declarations but +before `/` or `=`. For example: + + %blockquote< + %div + Foo! + +is compiled to: + +
    + Foo! +
    + +And: + + %img + %img> + %img + +is compiled to: + + + +And: + + %p<= "Foo\nBar" + +is compiled to: + +

    Foo + Bar

    + +And finally: + + %img + %pre>< + foo + bar + %img + +is compiled to: + +
    foo
    +    bar
    + +### Object Reference: `[]` + +Square brackets follow a tag definition and contain a Ruby object that is used +to set the class and id of that tag. The class is set to the object's class +(transformed to use underlines rather than camel case) and the id is set to the +object's class, followed by the value of its `#to_key` or `#id` method (in that +order). This is most useful for elements that represent instances of Active +Model models. Additionally, the second argument (if present) will be used as a +prefix for both the id and class attributes. For example: + + # file: app/controllers/users_controller.rb + + def show + @user = FriendlyUser.find(15) + end + + -# file: app/views/users/show.haml + + %div[@user, :greeting] + %bar[290]/ + Hello! + +is compiled to: + +
    + + Hello! +
    + +If you require that the class be something other than the underscored object's +class, you can implement the `haml_object_ref` method on the object. + + # file: app/models/friendly_user.rb + + class FriendlyUser < ActiveRecord::Base + def haml_object_ref + "a_friendly_user" + end + end + + -# file: app/views/users/show.haml + + %div[@user] + Hello! + +is compiled to: + +
    + Hello! +
    + +The `:class` attribute may be used in conjunction with an object +reference. The compiled element will have the union of all classes. + + - user = User.find(1) + %p[user]{:class => 'alpha bravo'} +

    + +## Doctype: `!!!` + +When describing HTML documents with Haml, you can have a document type or XML +prolog generated automatically by including the characters `!!!`. For example: + + !!! XML + !!! + %html + %head + %title Myspace + %body + %h1 I am the international space station + %p Sign my guestbook + +is compiled to: + + + + + + Myspace + + +

    I am the international space station

    +

    Sign my guestbook

    + + + +You can also specify the specific doctype after the `!!!` When the +{Haml::Options#format `:format`} is set to `:xhtml`. The following doctypes are +supported: + +`!!!` +: XHTML 1.0 Transitional
    + `` + +`!!! Strict` +: XHTML 1.0 Strict
    + `` + +`!!! Frameset` +: XHTML 1.0 Frameset
    + `` + +`!!! 5` +: XHTML 5
    + ``
    + +`!!! 1.1` +: XHTML 1.1
    + `` + +`!!! Basic` +: XHTML Basic 1.1
    + ` ` + +`!!! Mobile` +: XHTML Mobile 1.2
    + `` + +`!!! RDFa` +: XHTML+RDFa 1.0
    + `` + +When the {Haml::Options#format `:format`} option is set to `:html4`, the following +doctypes are supported: + +`!!!` +: HTML 4.01 Transitional
    + `` + +`!!! Strict` +: HTML 4.01 Strict
    + `` + +`!!! Frameset` +: HTML 4.01 Frameset
    + `` + +When the {Haml::Options#format `:format`} option is set to `:html5`, +`!!!` is always ``. + +If you're not using the UTF-8 character set for your document, you can specify +which encoding should appear in the XML prolog in a similar way. For example: + + !!! XML iso-8859-1 + +is compiled to: + + + +If the mime_type of the template being rendered is `text/xml` then a format of +`:xhtml` will be used even if the global output format is set to `:html4` or +`:html5`. + +## Comments + +Haml supports two sorts of comments: those that show up in the HTML output and +those that don't. + +### HTML Comments: `/` + +The forward slash character, when placed at the beginning of a line, wraps all +text after it in an HTML comment. For example: + + %peanutbutterjelly + / This is the peanutbutterjelly element + I like sandwiches! + +is compiled to: + + + + I like sandwiches! + + +The forward slash can also wrap indented sections of code. For example: + + / + %p This doesn't render... + %div + %h1 Because it's commented out! + +is compiled to: + + + +#### Conditional Comments: `/[]` + +You can also use [Internet Explorer conditional +comments](http://www.quirksmode.org/css/condcom.html) by enclosing the condition +in square brackets after the `/`. For example: + + /[if IE] + %a{ :href => 'http://www.mozilla.com/en-US/firefox/' } + %h1 Get Firefox + +is compiled to: + + + +To generate “downlevel-revealed” conditional comments, where the content is +hidden from IE but not other browsers, add a `!` before the brackets: `/![]`. +Haml will produce valid HTML when generating this kind of conditional comment. + +For example: + + /![if !IE] + You are not using Internet Explorer, or are using version 10+. + +is compiled to: + + + You are not using Internet Explorer, or are using version 10+. + + +### Haml Comments: `-#` + +The hyphen followed immediately by the pound sign signifies a silent comment. +Any text following this isn't rendered in the resulting document at all. + +For example: + + %p foo + -# This is a comment + %p bar + +is compiled to: + +

    foo

    +

    bar

    + +You can also nest text beneath a silent comment. None of this text will be +rendered. For example: + + %p foo + -# + This won't be displayed + Nor will this + Nor will this. + %p bar + +is compiled to: + +

    foo

    +

    bar

    + +## Ruby Evaluation + +### Inserting Ruby: `=` {#inserting_ruby} + +The equals character is followed by Ruby code. This code is evaluated and the +output is inserted into the document. For example: + + %p + = ['hi', 'there', 'reader!'].join " " + = "yo" + +is compiled to: + +

    + hi there reader! + yo +

    + +If the {Haml::Options#escape_html `:escape_html`} option is set, `=` will sanitize +any HTML-sensitive characters generated by the script. For example: + + = '' + +would be compiled to + + <script>alert("I'm evil!");</script> + +`=` can also be used at the end of a tag to insert Ruby code within that tag. +For example: + + %p= "hello" + +would be compiled to: + +

    hello

    + +A line of Ruby code can be stretched over multiple lines as long as each line +but the last ends with a comma. For example: + + = link_to_remote "Add to cart", + :url => { :action => "add", :id => product.id }, + :update => { :success => "cart", :failure => "error" } + +Note that it's illegal to nest code within a tag that ends with `=`. + +### Running Ruby: `-` + +The hyphen character is also followed by Ruby code. This code is evaluated but +*not* inserted into the document. + +**It is not recommended that you use this widely; almost all processing code and +logic should be restricted to Controllers, Helpers, or partials.** + +For example: + + - foo = "hello" + - foo << " there" + - foo << " you!" + %p= foo + +is compiled to: + +

    + hello there you! +

    + +A line of Ruby code can be stretched over multiple lines as long as each line +but the last ends with a comma. For example: + + - links = {:home => "/", + :docs => "/docs", + :about => "/about"} + +#### Ruby Blocks + +Ruby blocks, like XHTML tags, don't need to be explicitly closed in Haml. +Rather, they're automatically closed, based on indentation. A block begins +whenever the indentation is increased after a Ruby evaluation command. It ends +when the indentation decreases (as long as it's not an `else` clause or +something similar). For example: + + - (42...47).each do |i| + %p= i + %p See, I can count! + +is compiled to: + +

    42

    +

    43

    +

    44

    +

    45

    +

    46

    +

    See, I can count!

    + +Another example: + + %p + - case 2 + - when 1 + = "1!" + - when 2 + = "2?" + - when 3 + = "3." + +is compiled to: + +

    + 2? +

    + +### Whitespace Preservation: `~` {#tilde} + +`~` works just like `=`, except that it runs {Haml::Helpers.preserve} +on its input. For example, + + ~ "Foo\n
    Bar\nBaz
    " + +is the same as: + + = find_and_preserve("Foo\n
    Bar\nBaz
    ") + +and is compiled to: + + Foo +
    Bar
    Baz
    + +See also [Whitespace Preservation](#whitespace_preservation). + +### Ruby Interpolation: `#{}` + +Ruby code can also be interpolated within plain text using `#{}`, similarly to +Ruby string interpolation. For example, + + %p This is #{h quality} cake! + +is the same as + + %p= "This is #{h quality} cake!" + +and might compile to: + +

    This is scrumptious cake!

    + +Backslashes can be used to escape `#{}` strings, but they don't act as escapes +anywhere else in the string. For example: + + %p + Look at \\#{h word} lack of backslash: \#{foo} + And yon presence thereof: \{foo} + +might compile to: + +

    + Look at \yon lack of backslash: #{foo} + And yon presence thereof: \{foo} +

    + +Interpolation can also be used within [filters](#filters). For example: + + :javascript + $(document).ready(function() { + alert(#{@message.to_json}); + }); + +might compile to: + + + +#### Gotchas + +Haml uses an overly simplistic regular expression to identify string +interpolation rather than a full-blown Ruby parser. This is fast and works for +most code but you may have errors with code like the following: + + %span #{'{'} + +This code will generate a syntax error, complaining about unbalanced braces. +In cases like this, the recommended workaround is output the code as a Ruby +string to force Haml to parse the code with Ruby. + + %span= "#{'{'}" + + +### Escaping HTML: `&=` {#escaping_html} + +An ampersand followed by one or two equals characters evaluates Ruby code just +like the equals without the ampersand, but sanitizes any HTML-sensitive +characters in the result of the code. For example: + + &= "I like cheese & crackers" + +compiles to + + I like cheese & crackers + +If the {Haml::Options#escape_html `:escape_html`} option is set, `&=` behaves +identically to `=`. + +`&` can also be used on its own so that `#{}` interpolation is escaped. For +example, + + & I like #{"cheese & crackers"} + +compiles to: + + I like cheese & crackers + +### Unescaping HTML: `!=` {#unescaping_html} + +An exclamation mark followed by one or two equals characters evaluates Ruby code +just like the equals would, but never sanitizes the HTML. + +By default, the single equals doesn't sanitize HTML either. However, if the +{Haml::Options#escape_html `:escape_html`} option is set, `=` will sanitize the +HTML, but `!=` still won't. For example, if `:escape_html` is set: + + = "I feel !" + != "I feel !" + +compiles to + + I feel <strong>! + I feel ! + +`!` can also be used on its own so that `#{}` interpolation is unescaped. +For example, + + ! I feel #{""}! + +compiles to + + I feel ! + +## Filters {#filters} + +The colon character designates a filter. This allows you to pass an indented +block of text as input to another filtering program and add the result to the +output of Haml. The syntax is simply a colon followed by the name of the filter. +For example: + + %p + :markdown + # Greetings + + Hello, *World* + +is compiled to: + +

    +

    Greetings

    + +

    Hello, World

    +

    + +Filters can have Ruby code interpolated with `#{}`. For example: + + - flavor = "raspberry" + #content + :textile + I *really* prefer _#{flavor}_ jam. + +is compiled to + +
    +

    I really prefer raspberry jam.

    +
    + +The functionality of some filters such as Markdown can be provided by many +different libraries. Usually you don't have to worry about this - you can just +load the gem of your choice and Haml will automatically use it. + +However in some cases you may want to make Haml explicitly use a specific gem to +be used by a filter. In these cases you can do this via Tilt, the library Haml +uses to implement many of its filters: + + Tilt.prefer Tilt::RedCarpetTemplate + +See the [Tilt documentation](https://github.com/rtomayko/tilt) for +more info. + +Haml comes with the following filters defined: + +### `:cdata` {#cdata-filter} + +Surrounds the filtered text with CDATA tags. + +### `:coffee` {#coffee-filter} + +Compiles the filtered text to JavaScript in `"] + temple + end + end + + CoffeeScript = Coffee + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/css.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/css.rb new file mode 100644 index 000000000..b94841672 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/css.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true +module Haml + class Filters + class Css < TextBase + def compile(node) + case @format + when :xhtml + compile_xhtml(node) + else + compile_html(node) + end + end + + private + + def compile_html(node) + temple = [:multi] + temple << [:static, ""] + temple + end + + def compile_xhtml(node) + temple = [:multi] + temple << [:static, ""] + temple + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/erb.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/erb.rb new file mode 100644 index 000000000..88fe8dfac --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/erb.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Haml + class Filters + class Erb < TiltBase + def compile(node) + precompiled_with_tilt(node, 'erb') + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/escaped.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/escaped.rb new file mode 100644 index 000000000..eb7abdf4e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/escaped.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Haml + class Filters + class Escaped < Base + def compile(node) + text = node.value[:text].rstrip + temple = compile_text(text) + [:escape, true, temple] + end + + private + + def compile_text(text) + if ::Haml::Util.contains_interpolation?(text) + [:dynamic, ::Haml::Util.unescape_interpolation(text)] + else + [:static, text] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/javascript.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/javascript.rb new file mode 100644 index 000000000..3468123b1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/javascript.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true +module Haml + class Filters + class Javascript < TextBase + def compile(node) + case @format + when :xhtml + compile_xhtml(node) + else + compile_html(node) + end + end + + private + + def compile_html(node) + temple = [:multi] + temple << [:static, ""] + temple + end + + def compile_xhtml(node) + temple = [:multi] + temple << [:static, ""] + temple + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/less.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/less.rb new file mode 100644 index 000000000..b191118c7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/less.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +# LESS support is deprecated since it requires therubyracer.gem, +# which is hard to maintain. +# +# It's not supported in Sprockets 3.0+ too. +# https://github.com/sstephenson/sprockets/pull/547 +module Haml + class Filters + class Less < TiltBase + def compile(node) + require 'tilt/less' if explicit_require?('less') + temple = [:multi] + temple << [:static, "'] + temple + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/markdown.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/markdown.rb new file mode 100644 index 000000000..dd335b8d6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/markdown.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +module Haml + class Filters + class Markdown < TiltBase + def compile(node) + require 'tilt/redcarpet' if explicit_require?('markdown') + compile_with_tilt(node, 'markdown') + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/plain.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/plain.rb new file mode 100644 index 000000000..6f6811cd8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/plain.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +require 'haml/string_splitter' + +module Haml + class Filters + class Plain < Base + def compile(node) + text = node.value[:text] + text = text.rstrip unless ::Haml::Util.contains_interpolation?(text) # for compatibility + [:multi, [:newline], *compile_plain(text)] + end + + private + + def compile_plain(text) + string_literal = ::Haml::Util.unescape_interpolation(text) + StringSplitter.compile(string_literal).map do |temple| + type, str = temple + case type + when :dynamic + [:escape, false, [:dynamic, str]] + else + temple + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/preserve.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/preserve.rb new file mode 100644 index 000000000..0f42a0ab0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/preserve.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Haml + class Filters + class Preserve < Base + def compile(node) + text = node.value[:text].rstrip + "\n" + text = text.gsub("\n", ' ') + compile_text(text) + end + + private + + def compile_text(text) + if ::Haml::Util.contains_interpolation?(text) + [:dynamic, ::Haml::Util.unescape_interpolation(text)] + else + [:static, text] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/ruby.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/ruby.rb new file mode 100644 index 000000000..4509ec1f0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/ruby.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Haml + class Filters + class Ruby < Base + def compile(node) + [:multi, [:newline], [:code, node.value[:text]]] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/sass.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/sass.rb new file mode 100644 index 000000000..3833ff38a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/sass.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +module Haml + class Filters + class Sass < TiltBase + def compile(node) + require 'tilt/sass' if explicit_require?('sass') + temple = [:multi] + temple << [:static, ""] + temple + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/scss.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/scss.rb new file mode 100644 index 000000000..28023b166 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/scss.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +module Haml + class Filters + class Scss < TiltBase + def compile(node) + require 'tilt/sass' if explicit_require?('scss') + temple = [:multi] + temple << [:static, ""] + temple + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/text_base.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/text_base.rb new file mode 100644 index 000000000..f79ed748e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/text_base.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true +module Haml + class Filters + class TextBase < Base + def compile_text!(temple, node, prefix) + text = node.value[:text].rstrip.gsub(/^/, prefix) + if ::Haml::Util.contains_interpolation?(node.value[:text]) + # original: Haml::Filters#compile + text = ::Haml::Util.unescape_interpolation(text).gsub(/(\\+)n/) do |s| + escapes = $1.size + next s if escapes % 2 == 0 + "#{'\\' * (escapes - 1)}\n" + end + text.prepend("\n") + temple << [:dynamic, text] + else + node.value[:text].split("\n").size.times do + temple << [:newline] + end + temple << [:static, text] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/tilt_base.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/tilt_base.rb new file mode 100644 index 000000000..23e36d0e7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/filters/tilt_base.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true +require 'tilt' + +module Haml + class Filters + class TiltBase < Base + def self.render(name, source, indent_width: 0) + text = ::Tilt["t.#{name}"].new { source }.render + return text if indent_width == 0 + if text.frozen? + text.gsub(/^/, ' ' * indent_width) + else + text.gsub!(/^/, ' ' * indent_width) + end + end + + def explicit_require?(needed_registration) + Gem::Version.new(Tilt::VERSION) >= Gem::Version.new('2.0.0') && + !Tilt.registered?(needed_registration) + end + + private + + # TODO: support interpolation + def precompiled_with_tilt(node, name) + src = ::Tilt["t.#{name}"].new { node.value[:text] }.send(:precompiled, {}).first + [:dynamic, src] + end + + def compile_with_tilt(node, name, indent_width: 0) + if ::Haml::Util.contains_interpolation?(node.value[:text]) + dynamic_compile(node, name, indent_width: indent_width) + else + static_compile(node, name, indent_width: indent_width) + end + end + + def static_compile(node, name, indent_width: 0) + temple = [:multi, [:static, TiltBase.render(name, node.value[:text], indent_width: indent_width)]] + node.value[:text].split("\n").size.times do + temple << [:newline] + end + temple + end + + def dynamic_compile(node, name, indent_width: 0) + # original: Haml::Filters#compile + text = ::Haml::Util.unescape_interpolation(node.value[:text]).gsub(/(\\+)n/) do |s| + escapes = $1.size + next s if escapes % 2 == 0 + "#{'\\' * (escapes - 1)}\n" + end + text.prepend("\n").sub!(/\n"\z/, '"') + + [:dynamic, "::Haml::Filters::TiltBase.render('#{name}', #{text}, indent_width: #{indent_width})"] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/force_escape.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/force_escape.rb new file mode 100644 index 000000000..9288dc056 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/force_escape.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +require 'haml/escape' + +module Haml + # This module allows Temple::Filter to dispatch :fescape on `#compile`. + module FescapeDispathcer + def on_fescape(flag, exp) + [:fescape, flag, compile(exp)] + end + end + ::Temple::Filter.include FescapeDispathcer + + # Unlike Haml::Escape, this escapes value even if it's html_safe. + class ForceEscape < Escape + def initialize(opts = {}) + super + @escape_code = options[:escape_code] || "::Haml::Util.escape_html((%s))" + @escaper = eval("proc {|v| #{@escape_code % 'v'} }") + end + + alias_method :on_fescape, :on_escape + + # ForceEscape doesn't touch :escape expression. + # This method is not used if it's inserted after Haml::Escape. + def on_escape(flag, exp) + [:escape, flag, compile(exp)] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/helpers.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/helpers.rb new file mode 100644 index 000000000..32a72d1fc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/helpers.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +module Haml + module Helpers + def self.preserve(input) + s = input.to_s.chomp("\n") + s.gsub!(/\n/, ' ') + s.delete!("\r") + s + end + + def preserve(input) + Helpers.preserve(input) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/html.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/html.rb new file mode 100644 index 000000000..7c4ca2350 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/html.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Haml + class HTML < Temple::HTML::Fast + DEPRECATED_FORMATS = %i[html4 html5].freeze + + def initialize(opts = {}) + if DEPRECATED_FORMATS.include?(opts[:format]) + opts = opts.dup + opts[:format] = :html + end + super(opts) + end + + # This dispatcher supports Haml's "revealed" conditional comment. + def on_html_condcomment(condition, content, revealed = false) + on_html_comment [:multi, + [:static, "[#{condition}]>#{'' if revealed}"], + content, + [:static, "#{'", + postamble: "", + ) + end + + Engine.new(options).call(source) + end + + def supports_streaming? + RailsTemplate.options[:streaming] + end + end + ActionView::Template.register_template_handler(:haml, RailsTemplate.new) +end + +# Haml extends Haml::Helpers in ActionView each time. +# It costs much, so Haml includes a compatible module at first. +ActiveSupport.on_load(:action_view) do + include Haml::RailsHelpers +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/railtie.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/railtie.rb new file mode 100644 index 000000000..faeb55063 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/railtie.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +require 'rails' + +module Haml + class Railtie < ::Rails::Railtie + initializer :haml, before: :load_config_initializers do |app| + require 'haml/rails_template' + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/ruby_expression.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/ruby_expression.rb new file mode 100644 index 000000000..b1e15c809 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/ruby_expression.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true +require 'ripper' + +module Haml + class RubyExpression < Ripper + class ParseError < StandardError; end + + def self.syntax_error?(code) + self.new(code).parse + false + rescue ParseError + true + end + + def self.string_literal?(code) + return false if syntax_error?(code) + + type, instructions = Ripper.sexp(code) + return false if type != :program + return false if instructions.size > 1 + + type, _ = instructions.first + type == :string_literal + end + + private + + def on_parse_error(*) + raise ParseError + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/string_splitter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/string_splitter.rb new file mode 100644 index 000000000..d0c8e3a1d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/string_splitter.rb @@ -0,0 +1,140 @@ +# frozen_string_literal: true +begin + require 'ripper' +rescue LoadError +end + +module Haml + # Compile [:dynamic, "foo#{bar}"] to [:multi, [:static, 'foo'], [:dynamic, 'bar']] + class StringSplitter < Temple::Filter + if defined?(Ripper) && RUBY_VERSION >= "2.0.0" && Ripper.respond_to?(:lex) + class << self + # `code` param must be valid string literal + def compile(code) + [].tap do |exps| + tokens = Ripper.lex(code.strip) + tokens.pop while tokens.last && [:on_comment, :on_sp].include?(tokens.last[1]) + + if tokens.size < 2 + raise(Haml::InternalError, "Expected token size >= 2 but got: #{tokens.size}") + end + compile_tokens!(exps, tokens) + end + end + + private + + def strip_quotes!(tokens) + _, type, beg_str = tokens.shift + if type != :on_tstring_beg + raise(Haml::InternalError, "Expected :on_tstring_beg but got: #{type}") + end + + _, type, end_str = tokens.pop + if type != :on_tstring_end + raise(Haml::InternalError, "Expected :on_tstring_end but got: #{type}") + end + + [beg_str, end_str] + end + + def compile_tokens!(exps, tokens) + beg_str, end_str = strip_quotes!(tokens) + + until tokens.empty? + _, type, str = tokens.shift + + case type + when :on_tstring_content + beg_str, end_str = escape_quotes(beg_str, end_str) + exps << [:static, eval("#{beg_str}#{str}#{end_str}").to_s] + when :on_embexpr_beg + embedded = shift_balanced_embexpr(tokens) + exps << [:dynamic, embedded] unless embedded.empty? + end + end + end + + # Some quotes are split-unsafe. Replace such quotes with null characters. + def escape_quotes(beg_str, end_str) + case [beg_str[-1], end_str] + when ['(', ')'], ['[', ']'], ['{', '}'] + [beg_str.sub(/.\z/) { "\0" }, "\0"] + else + [beg_str, end_str] + end + end + + def shift_balanced_embexpr(tokens) + String.new.tap do |embedded| + embexpr_open = 1 + + until tokens.empty? + _, type, str = tokens.shift + case type + when :on_embexpr_beg + embexpr_open += 1 + when :on_embexpr_end + embexpr_open -= 1 + break if embexpr_open == 0 + end + + embedded << str + end + end + end + end + + def on_dynamic(code) + return [:dynamic, code] unless string_literal?(code) + return [:dynamic, code] if code.include?("\n") + + temple = [:multi] + StringSplitter.compile(code).each do |type, content| + case type + when :static + temple << [:static, content] + when :dynamic + temple << on_dynamic(content) + end + end + temple + end + + private + + def string_literal?(code) + return false if SyntaxChecker.syntax_error?(code) + + type, instructions = Ripper.sexp(code) + return false if type != :program + return false if instructions.size > 1 + + type, _ = instructions.first + type == :string_literal + end + + class SyntaxChecker < Ripper + class ParseError < StandardError; end + + def self.syntax_error?(code) + self.new(code).parse + false + rescue ParseError + true + end + + private + + def on_parse_error(*) + raise ParseError + end + end + else + # Do nothing if ripper is unavailable + def call(ast) + ast + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/template.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/template.rb new file mode 100644 index 000000000..2e4f7cc99 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/template.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: false +require 'temple' +require 'haml/engine' +require 'haml/helpers' + +module Haml + Template = Temple::Templates::Tilt.create( + Haml::Engine, + register_as: [:haml, :haml], + ) + + module TemplateExtension + # Activate Haml::Helpers for tilt templates. + # https://github.com/judofyr/temple/blob/v0.7.6/lib/temple/mixins/template.rb#L7-L11 + def compile(*) + "extend Haml::Helpers; #{super}" + end + end + Template.send(:extend, TemplateExtension) +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/temple_line_counter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/temple_line_counter.rb new file mode 100644 index 000000000..eed541e73 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/temple_line_counter.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +module Haml + # A module to count lines of expected code. This would be faster than actual code generation + # and counting newlines in it. + module TempleLineCounter + class UnexpectedExpression < StandardError; end + + def self.count_lines(exp) + type, *args = exp + case type + when :multi + args.map { |a| count_lines(a) }.reduce(:+) || 0 + when :dynamic, :code + args.first.count("\n") + when :static + 0 # It has not real newline "\n" but escaped "\\n". + when :case + arg, *cases = args + arg.count("\n") + cases.map do |cond, e| + (cond == :else ? 0 : cond.count("\n")) + count_lines(e) + end.reduce(:+) + when :escape + count_lines(args[1]) + when :newline + 1 + else + raise UnexpectedExpression.new("[HAML BUG] Unexpected Temple expression '#{type}' is given!") + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/util.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/util.rb new file mode 100644 index 000000000..b7308fe22 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/haml-6.4.0/lib/haml/util.rb @@ -0,0 +1,262 @@ +# frozen_string_literal: true + +begin + require 'erubis/tiny' +rescue LoadError + require 'erb' +end +require 'set' +require 'stringio' +require 'strscan' + +module Haml + # A module containing various useful functions. + module Util + extend self + + begin # Ruby 3.2+ or ERB 4+ + require 'erb/escape' + + define_singleton_method(:escape_html, ERB::Escape.instance_method(:html_escape)) + rescue LoadError + require 'cgi/escape' + + def self.escape_html(html) + CGI.escapeHTML(html.to_s) + end + end + + # TODO: Remove unescape_interpolation's workaround and get rid of `respond_to?`. + def self.escape_html_safe(html) + html = html.to_s + (html.respond_to?(:html_safe?) && html.html_safe?) ? html : escape_html(html) + end + + # Silence all output to STDERR within a block. + # + # @yield A block in which no output will be printed to STDERR + def silence_warnings + the_real_stderr, $stderr = $stderr, StringIO.new + yield + ensure + $stderr = the_real_stderr + end + + ## Rails XSS Safety + + # Whether or not ActionView's XSS protection is available and enabled, + # as is the default for Rails 3.0+, and optional for version 2.3.5+. + # Overridden in haml/template.rb if this is the case. + # + # @return [Boolean] + def rails_xss_safe? + false + end + + # Checks that the encoding of a string is valid + # and cleans up potential encoding gotchas like the UTF-8 BOM. + # If it's not, yields an error string describing the invalid character + # and the line on which it occurs. + # + # @param str [String] The string of which to check the encoding + # @yield [msg] A block in which an encoding error can be raised. + # Only yields if there is an encoding error + # @yieldparam msg [String] The error message to be raised + # @return [String] `str`, potentially with encoding gotchas like BOMs removed + def check_encoding(str) + if str.valid_encoding? + # Get rid of the Unicode BOM if possible + # Shortcut for UTF-8 which might be the majority case + if str.encoding == Encoding::UTF_8 + return str.gsub(/\A\uFEFF/, '') + elsif str.encoding.name =~ /^UTF-(16|32)(BE|LE)?$/ + return str.gsub(Regexp.new("\\A\uFEFF".encode(str.encoding)), '') + else + return str + end + end + + encoding = str.encoding + newlines = Regexp.new("\r\n|\r|\n".encode(encoding).force_encoding(Encoding::ASCII_8BIT)) + str.force_encoding(Encoding::ASCII_8BIT).split(newlines).each_with_index do |line, i| + begin + line.encode(encoding) + rescue Encoding::UndefinedConversionError => e + yield < + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/Changelog.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/Changelog.md new file mode 100644 index 000000000..e61950fa3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/Changelog.md @@ -0,0 +1,658 @@ +## Change Log + +Below is a complete listing of changes for each revision of HighLine. + +### 3.1.2 / 2025-01-05 +* PR #279 - Upgrades and adjustments for Ruby 3.4 release (@abinoam) +* PR #278 - Prevent ArgumentError for #col_count_calculate when items exceed 80 chars (@davidjkling, @justintsteele) + +### 3.1.1 / 2024-08-18 +* PR #276 - Update #say to always flush the output after a #puts (@blipper) +* PR #274 / I #273 (@costa) + * Add Highline#add_to_color_scheme + * Dockerize the test environment. Just run `bin/test` and voilá! + +### 3.1.0 / 2024-07-15 +* PR #272 / I #271 - Readline is now completed deprecated over Reline (@abinoam, issue by @64kramsystem) +* PR #269 - Provide a 'Changelog' link on rubygems.org/gems/highline (@mark-young-atg) + +### 3.0.1 / 2024-01-20 +* PR #268 - Remove unused abbrev dependency (@zvkemp) + +### 3.0.0 / 2024-01-05 +* PR #265 - Change Readline for Reline for Ruby 3.3 compat (@abinoam) +* PR #264 - Add abbrev gem as dependency (@mathieujobin) +* PR #263 - Release 3.0.0.pre.1 + * Raise minimum Ruby version requirement to 3.0 +* PR #262 - Do not call stty on non-tty (@kbrock) +* PR #260 / I #43 - Ctrl-U (erase line) handling (@abinoam, issue by @gutenye) +* PR #259 / I #236 - Handle Ctrl-C when Question#echo = false (@abinoam, @Fahhetah, issue by @aspyct) +* PR #258 / I #246 - Add validation class support (@abinoam, issue by @Joshfindit) + * Make it dry-types compatible through the use of `#valid?` + * Solve the multiple answers in one line problem with a combination of custom coercion (parser) and custom validation +* PR #257 / I #233 - Show Question#default hint for non String values (@abinoam, issue by @branch14) + * Add Question#default_hint_show to allow disabling it. +* PR #256 / I #249 - Fix Array validation in Question#in (@abinoam, issue by @esotericpig) + +### 2.1.0 / 2022-12-31 +* PR #255 - Change minimum Ruby version requirement to 2.3 (@abinoam) +* PR #254 - Improve Github Actions file (@abinoam) +* PR #253, PR #251 - Setup GitHub Actions and remove Travis (@petergoldstein, rev by @AlexWayfer) +* PR #250 - Fix file permissions (@bdunne) + +### 2.0.3 / 2019-10-11 +* PR #245 - Suppress `Psych.safe_load` arg warn (@koic) + +### 2.0.2 / 2019-04-08 +* PR #243 - Add new capital_letter option to menu index (@Ana06) + * This is a really special PR. It has come from "The Biggest + Mobprogramming Session Ever" and around 250 people + participated in crafting it! +* PR #241 - CI: Add 2.6 (@olleolleolle) +* PR #240 - Avoid YARD warning UnknownParam (@olleolleolle) + +### 2.0.1 / 2019-01-23 +* PR #238 / I #237 - Rescue Errno::ENOTTY when pipeing + +### 2.0.0 / 2018-06-10 +* Release 2.0.0 (major version release). + +### 2.0.0-develop.16 / 2018-05-12 +* PR #231 - Deprecate safe_level of ERB.new in Ruby 2.6 (@koic) +* PR #230 - Fix behavior when shell and gather options are selected together + +### 2.0.0-develop.15 / 2017-12-28 +* PR #229 - Update .travis.yml. Add Ruby 2.5 to matrix (@abinoam) + +### 2.0.0-develop.14 / 2017-11-21 +* PR #222 / I #221 - Fix inconsistent behaviour when using agree with readline (@abinoam, @ailisp) + +### 2.0.0-develop.13 / 2017-11-05 +* PR #219 - Make possible to use a callable as response (@abinoam) + +### 2.0.0-develop.12 / 2017-10-19 +* PR #218 - Ease transition from 1.7.x to 2.0.x (@abinoam) + * Copy use_color from HighLine.default_instance + * Expose IOConsoleCompatible +* PR #216 - Update .appveyor.yml - Fix Windows CI (@abinoam) + +### 2.0.0-develop.11 / 2017-09-25 +* PR #215 - Apply several Rubocop stylistic suggestions (@abinoam) + * Update gemspec/Gemfile to newer standards + * Update travis configuration fixing 1.9 problem + * Adjust .rubocop.yml with things we don't want to change + +### 2.0.0-develop.10 / 2017-06-29 +* PR #214 - Remove `$terminal` (global variable) (@abinoam) + * Use HighLine.default_instance instead + * Reorganize/Group code at lib/highline.rb + +### 2.0.0-develop.9 / 2017-06-24 + +* PR #211 / PR #212 - HighLine#use_color= and use_color? as instance methods (@abinoam, @phiggins) +* PR #203 / I #191 - Default values are shown in menus by Frederico (@fredrb) +* PR #201 / I #198 - Confirm in question now accepts Proc (@mmihira) +* PR #197 - Some HighLine::Menu improvements + * Move Menu::MenuItem to Menu::Item with its own file + * Some small refactorings + +### 2.0.0-develop.8 / 2016-06-03 + +* PR #195 - Add PRONTO to development group at Gemfile by Abinoam Jr. (@abinoam) + +### 2.0.0-develop.7 / 2016-05-31 + +* PR #194 - Indices coloring on HighLine::Menu by Aregic (@aregic) +* PR #190 - Add Ruby 2.3.0 to travis matrix by Koichi (@koic/ruby-23) +* PR #189 - Improve #agree tests by @kevinoid + +### 2.0.0-develop.6 / 2016-02-01 + +* PR #184 - Menu improvements, bug fixes, and more tests by Geoff Lee (@matrinox) + * Add third arg to menu that overides the choice displayed to the user + * FIX: autocomplete prompt does not include menu choices after the first + * Add specs to cover the new features and the bug fix +* PR #183 - Fix menu example in README.md by Fabien Foerster (@fabienfoerster) + +### 2.0.0-develop.5 / 2015-12-27 + +* Fix #180 with PR #181 - Make it possible to overwrite the menu prompt shown on errors. + +### 2.0.0-develop.4 / 2015-12-14 + +This versions makes the code documentation 100% 'A' grade on inch. +We have used inch and http://inch-ci.org to guide the priorities +on documentation production. + +The grade 'A' (on inch) number of objects on master branch was 44,22% (153/346). +After this PR we have a 100% grade 'A' (344 objects). + +There's already a inch-ci.org badge on README.md. And now it's all green! + +We also bring some improvement on CodeClimate scores. + +#### CHANGES SUMMARY + +* PR #179 - Make inch happy. Grade "A" for the whole HighLine documentation. By Abinoam Jr. (@abinoam) +* PR #178 - Improve score on Code Climate by applying some refactoring. By Abinoam Jr. (@abinoam) +* PR #172 - Initial work on documentation by Abinoam Jr. (@abinoam) + * Use yard + * Use inch + * New Readme file +* Fix #166 with PR #173 by (@matugm) + + +### 2.0.0-develop.3 / 2015-10-28 + +This version brings some improvements on documentation (switch to Yardoc). +This is the first 2.0.0-develop.x version to be release as gem. + +### 2.0.0-develop.2 / 2015-09-09 + +(by Abinoam P. Marques Jr. - @abinoam) + +#### NOTES + +This version brings greater compatibility with JRuby and Windows. +But we still have a lot of small issues in both platforms. +We were able to unify/converge all approaches into using io/console, +so we could delete old code that relied solely on stty, termios, java api and +windows apis (DL and Fiddle). + +Another improvement is the beginning of what I called "acceptance tests". +If you type ```rake acceptance``` you'll be guided through some tests +where you have to input some thing and see if everything work as expected. +This makes easier to catch bugs that otherwise would be over-sighted. + +#### CHANGES SUMMARY + +* Fix Simplecov - it was reporting erroneous code coverage +* Add new tests. Improves code coverage +* Extract HighLine::BuiltinStyles +* Try to avoid nil checking +* Try to avoid class variables (mis)use +* Fix RDoc include path and some small fixes to the docs +* Move HighLine::String to its own file +* Add HighLine::Terminal::IOConsole + - Add an IOConsoleCompatibility module with some stubbed + methods for using at StringIO, File and Tempfile to help + on tests. + - Any enviroment that can require 'io/console' will + use HighLine::Terminal::IOConsole by default. This kind + of unifies most environments where HighLine runs. For + example, we can use Terminal::IOConsole on JRuby!!! +* Add ruby-head and JRuby (19mode and head) to Travis CI matrix. Yes, this + our first step to a more peaceful JRuby compatibility. +* Add AppVeyor Continuous Integration for Windows +* Add _acceptance_ tests for HighLine + - Use ```rake acceptance``` to run them + - Basically it interactively asks the user to confirm if + some expected HighLine behavior is actually happening. + After that it gather some environment debug information, + so the use could send to the HighLine contributors in case + of failure. +* Remove old and unused files (as a result of relying on io/console) + - JRuby + - Windows (DL and Fiddle) + - Termios +* Fix some small (old and new) bugs +* Make some more tuning for Windows compatibility +* Make some more tuning for JRuby compatibility + +### 2.0.0-develop.1 / 2015-06-11 + +This is the first development version of the 2.0.0 series. It's the begining of a refactoring phase on HighLine development cycle. + +#### SOME HISTORY + +In 2014 I emailed James Edward Gray II (@JEG2) about HighLine. One of his ideas was to completely refactor the library so that it could be easier to reuse and improve it. I've began my contributions to HighLine trying to fix some of the open issues at that time so that we could "freeze" a stable version of HighLine that people could rely on. Then I've began to study HighLine source code with James' help and started to refactor some parts of the code. Abinoam P. Marques Jr. (@abinoam) + +#### NOTES + +* This release differs from current master branch by more than 180 commits. +* The main changes will be only summarized bellow (as there are many, and a detailed description of each is not productive). +* You could try `git log -p` to see all of them. +* During the last commits, all possible efforts were taken to preserve the tests passing status. +* 100% test passing gives you no guarantee that this new version will work for you. This happens for many reasons. One of them is that we don't currently have 100% test coverage. +* So, this version is not suitable for use in production. +* [Metric_fu](https://github.com/metricfu/metric_fu) and [Code Climate](https://codeclimate.com/github/abinoam/highline) were used here not to strictly "guide" what should be changed, but to have some way to objectively measure the progresses made so far. + +#### CHANGES SUMMARY +* Extracted a lot of smaller methods from bigger ones +* Extracted smaller classes/modules from bigger ones, so they could be self contained with less external dependencies as possible, for example: + * HighLine::Statement + * HighLine::List + * HighLine::ListRenderer + * HighLine::TemplateRenderer + * HighLine::Question::AnswerConverter + * HighLine::Terminal + * HighLine::Terminal::UnixStty + * HighLine::Paginator + * HighLine::Wrapper +* After extracting each class/module some refactoring were applied to them lowering code complexity + +#### METRICS SUMMARY +Some of the metrics used to track progress are summarized bellow. Some of them have got a lot better as Flay, Flog and Reek, others like Cane haven't (probably because we didn't commented out the new code yet) + +__CODECLIMATE__ + +* GPA: 3.60 -> 3.67 (higher is better) + +__CANE__ - reports code quality threshold violations (lower is better) + +* Total 92 -> 105 + * Methods exceeding allowed Abc complexity: 14 -> 10 + * Lines violating style requirements: 69 -> 72 + * Class definitions requiring comments: 9 -> 23 + +__FLAY__ - analyzes ruby code for structural similarities (code duplication - lower is better) + +* Total: 490 -> 94 + +__FLOG__ - measures code complexity (lower is better) + +* Top 5% average: 127.9458 -> 40.99812 +* Average: 17.37982 -> 7.663875 +* Total: 2158.5 -> 1969.6 + +__REEK__ - detects common code smells in ruby code (lower is better) + +* DuplicateMethodCall: 144 -> 54 +* TooManyStatements: 26 -> 30 + +### 1.7.3 / 2015-06-29 +* Add HighLine::Simulator tests (Bala Paranj (@bparanj) and Abinoam Marques Jr. (@abinoam), #142, PR #143) + +### 1.7.2 / 2015-04-19 + +#### Bug fixes +* Fix #138 (a regression of #131). PR #139. + +### 1.7.1 / 2015-02-24 + +#### Enhancements +* Add travis CI configuration (Eli Young (@elyscape), #130) +* Add Rubinius to Build Matrix with Allowed Failure (Brandon Fish +(bjfish), #132) +* Make some adjustments on tests (Abinoam Marques Jr., #133, #134) +* Drop support for Ruby 1.8 (Abinoam Marques Jr., #134) + +#### Bug fixes +* Fix IO.console.winsize returning reversed column and line values (Fission Xuiptz (@fissionxuiptz)), #131) + +### 1.7.0 / 2015-02-18 + +#### Bug fixes +* Fix correct encoding of statements to output encoding (Dāvis (davispuh), #110) +* Fix character echoing when echo is false and multibyte character is typed (Abinoam Marques Jr., #117 #118) +* Fix backspace support on Cyrillic (Abinoam Marques Jr., #115 #118) +* Fix returning wrong encoding when echo is false (Abinoam Marques Jr., #116 #118) +* Fix Question #limit and #realine incompatibilities (Abinoam Marques Jr. #113 #120) +* Fix/improve string coercion on #say (Abinoam Marques Jr., #98 #122) +* Fix #terminal_size returning nil in some terminals (Abinoam Marques Jr., #85 #123) + +#### Enhancements +* Improve #format_statement String coercion (Michael Bishop +(michaeljbishop), #104) +* Update homepage url on gemspec (Rubyforge->GitHub) (Edward Anderson +(nilbus), #107) +* Update COPYING file (Vít Ondruch (voxik), #109) +* Improve multi-byte encoding support (Abinoam Marques Jr., #115 #116 #117 #118) +* Make :grey -> :gray and :light -> :bright aliases (Abinoam Marques Jr., #114 #119) +* Return the default object (as it is) when no answer given (Abinoam Marques Jr., #112 #121) +* Added test for Yaml serialization of HighLine::String (Abinoam Marques Jr., #69 #124) +* Make improvements on Changelog and Rakefile (Abinoam Marques Jr., #126 #127 #128) + +### 1.6.21 + +* Improved Windows integration (by Ronie Henrich). +* Clarified menu choice error messages (by Keith Bennett). + +### 1.6.20 + +* Fixed a bug with FFI::NCurses integration (by agentdave). +* Improved StringExtensions performance (by John Leach). +* Various JRuby fixes (by presidentbeef). + +### 1.6.19 + +* Fixed `terminal_size()` with jline2 (by presidentbeef). + +### 1.6.18 + +* Fixed a long supported interface that was accidentally broken with a recent change (by Rubem Nakamura Carneiro). + +### 1.6.17 + +* Added encoding support to menus (by David Lyons). +* Some minor fixes to SystemExtensions (by whiteleaf and presidentbeef). + +### 1.6.16 + +* Added the new indention feature (by davispuh). +* Separated auto-completion from the answer type (by davispuh). +* Improved JRuby support (by rsutphin). +* General code clean up (by stomar). +* Made HighLine#say() a little smarter with regard to color escapes (by Kenneth Murphy). + +### 1.6.15 + +* Added support for nil arguments in lists (by Eric Saxby). +* Fixed HighLine's termios integration (by Jens Wille). + +### 1.6.14 + +* Added JRuby 1.7 support (by Mina Nagy). +* Take into account color escape sequences when wrapping text (by Mark J. + Titorenko). + +### 1.6.13 + +* Removed unneeded Shebang lines (by Scott Gonyea). +* Protect the String passed to Question.new from modification (by michael). +* Added a retype-to-verify setting (by michael). + +### 1.6.12 + +* Silenced warnings (by James McEwan). + +### 1.6.11 + +* Fixed a bad test. (Fix by Diego Elio Pettenò.) + +### 1.6.10 + +* Fixed a regression that prevented asking for String arguments (by Jeffery + Sman.) +* Fixed a testing incompatibility (by Hans de Graaff.) + +### 1.6.9 + +* The new list modes now properly ignore escapes when sizing. +* Added a project gemspec file. +* Fixed a bug that prevented the use of termios (by tomdz). +* Switch to JLine to provide better echo support on JRuby (by tomdz). + +### 1.6.8 + +* Fix missing ERASE_CHAR reference (by Aaron Gifford). + +### 1.6.7 + +* Fixed bug introduced in 1.6.6 attempted fix (by Aaron Gifford). + +### 1.6.6 + +* Fixed old style references causing HighLine::String errors (by Aaron Gifford). + +### 1.6.5 + +* HighLine#list() now correctly handles empty lists (fix by Lachlan Dowding). +* HighLine#list() now supports :uneven_columns_across and + :uneven_columns_down modes. + +### 1.6.4 + +* Add introspection methods to color_scheme: definition, keys, to_hash. +* Add tests for new methods. + +### 1.6.3 + +* Add color NONE. +* Add RGB color capability. +* Made 'color' available as a class or instance method of HighLine, for + instance: HighLine.color("foo", :blue)) or highline_obj.color("foo", :blue) + are now both possible and equivalent. +* Add HighLine::String class with convenience methods: #color (alias + #foreground), #on (alias #background), colors, and styles. See + lib/string_extensions.rb. +* Add (optional) ability to extend String with the same convenience methods from + HighLine::String, using Highline.colorize_strings. + +### 1.6.2 + +* Correctly handle STDIN being closed before we receive any data (fix by + mleinart). +* Try if msvcrt, if we can't load crtdll on Windows (fix by pepijnve). +* A fix for nil_on_handled not running the action (reported by Andrew Davey). + +### 1.6.1 + +* Fixed raw_no_echo_mode so that it uses stty -icanon rather than cbreak + as cbreak does not appear to be the posixly correct argument. It fails + on Solaris if cbreak is used. +* Fixed an issue that kept Menu from showing the correct choices for + disambiguation. +* Removed a circular require that kept Ruby 1.9.2 from loading HighLine. +* Fixed a bug that caused infinite looping when wrapping text without spaces. +* Fixed it so that :auto paging accounts for the two lines it adds. +* On JRuby, improved error message about ffi-ncurses. Before 1.5.3, + HighLine was silently swallowing error messages when ffi-ncurses gem + was installed without ncurses present on the system. +* Reverted Aaron Simmons's patch to allow redirecting STDIN on Windows. This + is the only way we could find to restore HighLine's character reading to + working order. + +### 1.5.2 + +* Added support for using the ffi-ncurses gem which is supported in JRuby. +* Added gem build instructions. + +### 1.5.1 + +* Fixed the long standing echo true bug. + (reported by Lauri Tuominen) +* Improved Windows API calls to support the redirection of STDIN. + (patch by Aaron Simmons) +* Updated gem specification to avoid a deprecated call. +* Made a minor documentation clarification about character mode support. +* Worked around some API changes in Ruby's standard library in Ruby 1.9. + (patch by Jake Benilov) + +### 1.5.0 + +* Fixed a bug that would prevent Readline from showing all completions. + (reported by Yaohan Chen) +* Added the ability to pass a block to HighLine#agree(). + (patch by Yaohan Chen) + +### 1.4.0 + +* Made the code grabbing terminal size a little more cross-platform by + adding support for Solaris. (patch by Ronald Braswell and Coey Minear) + +### 1.2.9 + +* Additional work on the backspacing issue. (patch by Jeremy Hinegardner) +* Fixed Readline prompt bug. (patch by Jeremy Hinegardner) + +### 1.2.8 + +* Fixed backspacing past the prompt and interrupting a prompt bugs. + (patch by Jeremy Hinegardner) + +### 1.2.7 + +* Fixed the stty indent bug. +* Fixed the echo backspace bug. +* Added HighLine::track_eof=() setting to work are threaded eof?() calls. + +### 1.2.6 + +Patch by Jeremy Hinegardner: + +* Added ColorScheme support. +* Added HighLine::Question.overwrite mode. +* Various documentation fixes. + +### 1.2.5 + +* Really fixed the bug I tried to fix in 1.2.4. + +### 1.2.4 + +* Fixed a crash causing bug when using menus, reported by Patrick Hof. + +### 1.2.3 + +* Treat Cygwin like a Posix OS, instead of a native Windows environment. + +### 1.2.2 + +* Minor documentation corrections. +* Applied Thomas Werschleiln's patch to fix termio buffering on Solaris. +* Applied Justin Bailey's patch to allow canceling paged output. +* Fixed a documentation bug in the description of character case settings. +* Added a notice about termios in HighLine::Question#echo. +* Finally working around the infamous "fast typing" bug + +### 1.2.1 + +* Applied Justin Bailey's fix for the page_print() infinite loop bug. +* Made a SystemExtensions module to expose OS level functionality other + libraries may want to access. +* Publicly exposed the get_character() method, per user requests. +* Added terminal_size(), output_cols(), and output_rows() methods. +* Added :auto setting for warp_at=() and page_at=(). + +### 1.2.0 + +* Improved RubyForge and gem spec project descriptions. +* Added basic examples to README. +* Added a VERSION constant. +* Added support for hidden menu commands. +* Added Object.or_ask() when using highline/import. + +### 1.0.4 + +* Moved the HighLine project to Subversion. +* HighLine's color escapes can now be disabled. +* Fixed EOF bug introduced in the last release. +* Updated HighLine web page. +* Moved to a forked development/stable version numbering. + +### 1.0.2 + +* Removed old and broken help tests. +* Fixed test case typo found by David A. Black. +* Added ERb escapes processing to lists, for coloring list items. Color escapes + do not add to list element size. +* HighLine now throws EOFError when input is exhausted. + +### 1.0.1 + +* Minor bug fix: Moved help initialization to before response building, so help + would show up in the default responses. + +### 1.0.0 + +* Fixed documentation typo pointed out by Gavin Kistner. +* Added gather = ... option to question for fetching entire Arrays or + Hashes filled with answers. You can set +gather+ to a count of answers to + collect, a String or Regexp matching the end of input, or a Hash where each + key can be used in a new question. +* Added File support to HighLine.ask(). You can specify a _directory_ and a + _glob_ pattern that combine into a list of file choices the user can select + from. You can choose to receive the user's answer as an open filehandle or as + a Pathname object. +* Added Readline support for history and editing. +* Added tab completion for menu and file selection selection (requires + Readline). +* Added an optional character limit for input. +* Added a complete help system to HighLine's shell menu creation tools. + +### 0.6.1 + +* Removed termios dependancy in gem, to fix Windows' install. + +### 0.6.0 + +* Implemented HighLine.choose() for menu handling. + * Provided shortcut choose(item1, item2, ...) for simple menus. + * Allowed Ruby code to be attached to each menu item, to create a complete + menu solution. + * Provided for total customization of the menu layout. + * Allowed for menu selection by index, name or both. + * Added a _shell_ mode to allow menu selection with additional details + following the name. +* Added a list() utility method that can be invoked just like color(). It can + layout Arrays for you in any output in the modes :columns_across, + :columns_down, :inline and :rows +* Added support for echo = "*" style settings. User code can now + choose the echo character this way. +* Modified HighLine to user the "termios" library for character input, if + available. Will return to old behavior (using "stty"), if "termios" cannot be + loaded. +* Improved "stty" state restoring code. +* Fixed "stty" code to handle interrupt signals. +* Improved the default auto-complete error message and exposed this message + through the +responses+ interface as :no_completion. + +### 0.5.0 + +* Implemented echo = false for HighLine::Question objects, primarily to + make fetching passwords trivial. +* Fixed an auto-complete bug that could cause a crash when the user gave an + answer that didn't complete to any valid choice. +* Implemented +case+ for HighLine::Question objects to provide character case + conversions on given answers. Can be set to :up, :down, or + :capitalize. +* Exposed @answer to the response system, to allow response that are + aware of incorrect input. +* Implemented +confirm+ for HighLine::Question objects to allow for verification + for sensitive user choices. If set to +true+, user will have to answer an + "Are you sure? " question. Can also be set to the question to confirm with + the user. + +### 0.4.0 + +* Added @wrap_at and @page_at settings and accessors to + HighLine, to control text flow. +* Implemented line wrapping with adjustable limit. +* Implemented paged printing with adjustable limit. + +### 0.3.0 + +* Added support for installing with setup.rb. +* All output is now treated as an ERb sequence, allowing Ruby code to be + embedded in output strings. +* Added support for ANSI color sequences in say(). (And everything else + by extension.) +* Added whitespace handling for answers. Can be set to :strip, + :chomp, :collapse, :strip_and_collapse, + :chomp_and_collapse, :remove, or :none. +* Exposed question details to ERb completion through @question, to allow for + intelligent responses. +* Simplified HighLine internals using @question. +* Added support for fetching single character input either with getc() or + HighLine's own cross-platform terminal input routine. +* Improved type conversion to handle user defined classes. + +### 0.2.0 / 2005-04-29 + +* Added Unit Tests to cover an already fixed output bug in the future. +* Added Rakefile and setup test action (default). +* Renamed HighLine::Answer to HighLine::Question to better illustrate its role. +* Renamed fetch_line() to get_response() to better define its goal. +* Simplified explain_error in terms of the Question object. +* Renamed accept?() to in_range?() to better define purpose. +* Reworked valid?() into valid_answer?() to better fit Question object. +* Reworked @member into @in, to make it easier to remember and + switched implementation to include?(). +* Added range checks for @above and @below. +* Fixed the bug causing ask() to swallow NoMethodErrors. +* Rolled ask_on_error() into responses. +* Redirected imports to Kernel from Object. +* Added support for validate = lambda { ... }. +* Added default answer support. +* Fixed bug that caused ask() to die with an empty question. +* Added complete documentation. +* Improve the implemetation of agree() to be the intended "yes" or "no" only + question. +* Added Rake tasks for documentation and packaging. +* Moved project to RubyForge. + +### 0.1.0 + +* Initial release as the solution to + {Ruby Quiz #29}[http://www.rubyquiz.com/quiz29.html]. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/Gemfile b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/Gemfile new file mode 100644 index 000000000..2c9d8e4cb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/Gemfile @@ -0,0 +1,21 @@ +# encoding: utf-8 + +source "https://rubygems.org" + +git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } + +# Specify your gem's dependencies in tgem.gemspec +gemspec + +gem "simplecov", group: :test, require: false + +group :code_quality do + gem "flog", require: false + gem "pronto", require: false, platform: :ruby + gem "pronto-flay", require: false, platform: :ruby + gem "path_expander", "1.1.1", require: false # Remove this lock when path_expander > 1.1.2 and flay > 2.13.3 is released. + # gem "pronto-poper", require: false, platform: :ruby + gem "pronto-reek", require: false, platform: :ruby + gem "pronto-rubocop", require: false, platform: :ruby + gem "base64", require: false +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/LICENSE b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/LICENSE new file mode 100644 index 000000000..ff6f232c8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/LICENSE @@ -0,0 +1,7 @@ += License Terms + +Distributed under the user's choice of the {GPL Version 2}[http://www.gnu.org/licenses/old-licenses/gpl-2.0.html] (see COPYING for details) or the +{Ruby software license}[http://www.ruby-lang.org/en/LICENSE.txt] by +James Edward Gray II and Greg Brown. + +Please email James[mailto:james@grayproductions.net] with any questions. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/README.md new file mode 100644 index 000000000..9b52e0aa6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/README.md @@ -0,0 +1,240 @@ +HighLine +======== + +[![Tests](https://github.com/JEG2/highline/actions/workflows/ci.yml/badge.svg)](https://github.com/JEG2/highline/actions/workflows/ci.yml) +[![Gem Version](https://badge.fury.io/rb/highline.svg)](https://badge.fury.io/rb/highline) +[![Code Climate](https://codeclimate.com/github/JEG2/highline/badges/gpa.svg)](https://codeclimate.com/github/JEG2/highline) +[![Test Coverage](https://codeclimate.com/github/JEG2/highline/badges/coverage.svg)](https://codeclimate.com/github/JEG2/highline/coverage) +[![Inline docs](http://inch-ci.org/github/JEG2/highline.svg?branch=master)](http://inch-ci.org/github/JEG2/highline) + +Description +----------- + +Welcome to HighLine. + +HighLine was designed to ease the tedious tasks of doing console input and +output with low-level methods like ```gets``` and ```puts```. HighLine provides a +robust system for requesting data from a user, without needing to code all the +error checking and validation rules and without needing to convert the typed +Strings into what your program really needs. Just tell HighLine what you're +after, and let it do all the work. + +Documentation +------------- + +See: [Rubydoc.info for HighLine](http://www.rubydoc.info/github/JEG2/highline/master). +Specially [HighLine](http://www.rubydoc.info/github/JEG2/highline/master/HighLine) and [HighLine::Question](http://www.rubydoc.info/github/JEG2/highline/master/HighLine/Question). + +Usage +----- + +```ruby + +require 'highline' + +# Basic usage + +cli = HighLine.new +answer = cli.ask "What do you think?" +puts "You have answered: #{answer}" + + +# Default answer + +cli.ask("Company? ") { |q| q.default = "none" } + +## Disable default value hint showing + +my_special_default_object = Object.new + +cli.ask("Question? ") do |q| + q.default = my_special_default_object + q.default_hint_show = false +end + + +# Validation + +cli.ask("Age? ", Integer) { |q| q.in = 0..105 } +cli.ask("Name? (last, first) ") { |q| q.validate = /\A\w+, ?\w+\Z/ } + +## Validation with custom class +class ZeroToTwentyFourValidator + def self.valid?(answer) + (0..24).include? answer.to_i + end + + def self.inspect + "(0..24) rule" + end +end + +cli.ask("What hour of the day is it?: ", Integer) do |q| + q.validate = ZeroToTwentyFourValidator +end + +## Validation with Dry::Types +## `Dry::Types` provides a `valid?` method so it can be used effortlessly + +require 'dry-type' + +module Types + include Dry.Types +end + +cli.ask("Type an integer:", Integer) do |q| + q.validate = Types::Coercible::Integer +end + +# Type conversion for answers: + +cli.ask("Birthday? ", Date) +cli.ask("Interests? (comma sep list) ", lambda { |str| str.split(/,\s*/) }) + + +# Reading passwords: + +cli.ask("Enter your password: ") { |q| q.echo = false } +cli.ask("Enter your password: ") { |q| q.echo = "x" } + + +# ERb based output (with HighLine's ANSI color tools): + +cli.say("This should be <%= color('bold', BOLD) %>!") + + +# Menus: + +cli.choose do |menu| + menu.prompt = "Please choose your favorite programming language? " + menu.choice(:ruby) { cli.say("Good choice!") } + menu.choices(:python, :perl) { cli.say("Not from around here, are you?") } + menu.default = :ruby +end + +## Using colored indices on Menus + +HighLine::Menu.index_color = :rgb_77bbff # set default index color + +cli.choose do |menu| + menu.index_color = :rgb_999999 # override default color of index + # you can also use constants like :blue + menu.prompt = "Please choose your favorite programming language? " + menu.choice(:ruby) { cli.say("Good choice!") } + menu.choices(:python, :perl) { cli.say("Not from around here, are you?") } +end +``` + +If you want to save some characters, you can inject/import HighLine methods on Kernel by doing the following. Just be sure to avoid name collisions in the top-level namespace. + + +```ruby +require 'highline/import' + +say "Now you can use #say directly" +``` + +For more examples see the examples/ directory of this project. + +Requirements +------------ + +HighLine from version >= 3.0.0 requires ruby >= 3.0.0 + +Installing +---------- + +To install HighLine, use the following command: + +```sh +$ gem install highline +``` + +(Add `sudo` if you're installing under a POSIX system as root) + +If you're using [Bundler](http://bundler.io/), add this to your Gemfile: + +```ruby +source "https://rubygems.org" +gem 'highline' +``` + +And then run: + +```sh +$ bundle +``` + +If you want to build the gem locally, use the following command from the root of the sources: + +```sh +$ rake package +``` + +You can also build and install directly: + +```sh +$ rake install +``` + +Contributing +------------ + +1. Open an issue + - https://github.com/JEG2/highline/issues + +2. Fork the repository + - https://github.com/JEG2/highline/fork + +3. Clone it locally + - ```git clone git@github.com:YOUR-USERNAME/highline.git``` + +4. Add the main HighLine repository as the __upstream__ remote + - ```cd highline``` # to enter the cloned repository directory. + - ```git remote add upstream https://github.com/JEG2/highline``` + +5. Keep your fork in sync with __upstream__ + - ```git fetch upstream``` + - ```git checkout master``` + - ```git merge upstream/master``` + +6. Create your feature branch + - ```git checkout -b your_branch``` + +7. Hack the source code, run the tests and __pronto__ + - ```rake test``` + - ```rake acceptance``` + - ```pronto run``` + + Alternatively, if you're in a [Docker](https://www.docker.com)ised environment, + don't care about installing anything locally -- just run `bin/test` instead. + +8. Commit your changes + - ```git commit -am "Your commit message"``` + +9. Push it + - ```git push``` + +10. Open a pull request + - https://github.com/JEG2/highline/pulls + +Details on: + +* GitHub Guide to Contributing to Open Source - https://guides.github.com/activities/contributing-to-open-source/ +* GitHub issues - https://guides.github.com/features/issues/ +* Forking - https://help.github.com/articles/fork-a-repo/ +* Cloning - https://help.github.com/articles/cloning-a-repository/ +* Adding upstream - https://help.github.com/articles/configuring-a-remote-for-a-fork/ +* Syncing your fork - https://help.github.com/articles/syncing-a-fork/ +* Branching - https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging +* Commiting - https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository +* Pushing - https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes + +The Core HighLine Team +---------------------- + +* [James Edward Gray II](https://github.com/JEG2) - Author +* [Gregory Brown](https://github.com/practicingruby) - Core contributor +* [Abinoam P. Marques Jr.](https://github.com/abinoam) - Core contributor + +_For a list of people who have contributed to the codebase, see [GitHub's list of contributors](https://github.com/JEG2/highline/contributors)._ diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/TODO b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/TODO new file mode 100644 index 000000000..89c5306ed --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/TODO @@ -0,0 +1,6 @@ += To Do List + +The following is a list of planned expansions for HighLine, in no particular +order. + +* Rent this space. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/highline.gemspec b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/highline.gemspec new file mode 100644 index 000000000..fa77e0eca --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/highline.gemspec @@ -0,0 +1,40 @@ +# coding: utf-8 + +lib = File.expand_path("../lib", __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require "highline/version" + +Gem::Specification.new do |spec| + spec.name = "highline" + spec.version = HighLine::VERSION + spec.author = "James Edward Gray II" + spec.email = "james@graysoftinc.com" + + spec.summary = "HighLine is a high-level command-line IO library." + spec.description = <(yn) { yn.downcase[0] == "y" }) do |q| + q.validate = /\A(?:y(?:es)?|no?)\Z/i + q.responses[:not_valid] = 'Please enter "yes" or "no".' + q.responses[:ask_on_error] = :question + q.character = character + q.completion = %w[yes no] + + yield q if block_given? + end + end + + # + # This method is the primary interface for user input. Just provide a + # _question_ to ask the user, the _answer_type_ you want returned, and + # optionally a code block setting up details of how you want the question + # handled. See {#say} for details on the format of _question_, and + # {Question} for more information about _answer_type_ and what's + # valid in the code block. + # + # Raises EOFError if input is exhausted. + # + # @param (see Question.build) + # @return answer converted to the class in answer_type + def ask(template_or_question, answer_type = nil, &details) + question = Question.build(template_or_question, answer_type, &details) + + if question.gather + QuestionAsker.new(question, self).gather_answers + else + QuestionAsker.new(question, self).ask_once + end + end + + # + # This method is HighLine's menu handler. For simple usage, you can just + # pass all the menu items you wish to display. At that point, choose() will + # build and display a menu, walk the user through selection, and return + # their choice among the provided items. You might use this in a case + # statement for quick and dirty menus. + # + # However, choose() is capable of much more. If provided, a block will be + # passed a HighLine::Menu object to configure. Using this method, you can + # customize all the details of menu handling from index display, to building + # a complete shell-like menuing system. See HighLine::Menu for all the + # methods it responds to. + # + # Raises EOFError if input is exhausted. + # + # @param items [Array] + # @param details [Proc] to be passed to Menu.new + # @return [String] answer + def choose(*items, &details) + menu = Menu.new(&details) + menu.choices(*items) unless items.empty? + + # Set auto-completion + menu.completion = menu.options + + # Set _answer_type_ so we can double as the Question for ask(). + # menu.option = normal menu selection, by index or name + menu.answer_type = menu.shell ? shell_style_lambda(menu) : menu.options + + selected = ask(menu) + return unless selected + + if menu.shell + if menu.gather + selection = [] + details = [] + selected.each do |value| + selection << value[0] + details << value[1] + end + else + selection, details = selected + end + else + selection = selected + end + + if menu.gather + menu.gather_selected(self, selection, details) + else + menu.select(self, selection, details) + end + end + + # Convenience method to craft a lambda suitable for + # beind used in autocompletion operations by {#choose} + # @return [lambda] lambda to be used in autocompletion operations + + def shell_style_lambda(menu) + lambda do |command| # shell-style selection + first_word = command.to_s.split.first || "" + + options = menu.options + options.extend(OptionParser::Completion) + answer = options.complete(first_word) + + raise Question::NoAutoCompleteMatch unless answer + + [answer.last, command.sub(/^\s*#{first_word}\s*/, "")] + end + end + + # + # This method provides easy access to ANSI color sequences, without the user + # needing to remember to CLEAR at the end of each sequence. Just pass the + # _string_ to color, followed by a list of _colors_ you would like it to be + # affected by. The _colors_ can be HighLine class constants, or symbols + # (:blue for BLUE, for example). A CLEAR will automatically be embedded to + # the end of the returned String. + # + # This method returns the original _string_ unchanged if use_color? + # is +false+. + # + # @param string [String] string to be colored + # @param colors [Array] array of colors like [:red, :blue] + # @return [String] (ANSI escaped) colored string + # @example + # cli = HighLine.new + # cli.color("Sustainable", :green, :bold) + # # => "\e[32m\e[1mSustainable\e[0m" + # + # # As class method (delegating to HighLine.default_instance) + # HighLine.color("Sustainable", :green, :bold) + # + def color(string, *colors) + return string unless use_color? + HighLine.Style(*colors).color(string) + end + + # In case you just want the color code, without the embedding and + # the CLEAR sequence. + # + # @param colors [Array] + # @return [String] ANSI escape code for the given colors. + # + # @example + # s = HighLine.Style(:red, :blue) + # s.code # => "\e[31m\e[34m" + # + # HighLine.color_code(:red, :blue) # => "\e[31m\e[34m" + # + # cli = HighLine.new + # cli.color_code(:red, :blue) # => "\e[31m\e[34m" + # + def color_code(*colors) + HighLine.Style(*colors).code + end + + # Remove color codes from a string. + # @param string [String] to be decolorized + # @return [String] without the ANSI escape sequence (colors) + def uncolor(string) + Style.uncolor(string) + end + + # Renders a list of itens using a {ListRenderer} + # @param items [Array] + # @param mode [Symbol] + # @param option + # @return [String] + # @see ListRenderer#initialize ListRenderer#initialize for parameter details + def list(items, mode = :rows, option = nil) + ListRenderer.new(items, mode, option, self).render + end + + # + # The basic output method for HighLine objects. If the provided _statement_ + # ends with a space or tab character, a newline will not be appended (output + # will be flush()ed). All other cases are passed straight to Kernel.puts(). + # + # The _statement_ argument is processed as an ERb template, supporting + # embedded Ruby code. The template is evaluated within a HighLine + # instance's binding for providing easy access to the ANSI color constants + # and the HighLine#color() method. + # + # @param statement [Statement, String] what to be said + def say(statement) + statement = render_and_ident_statement(statement) + return statement if statement.empty? + + # Don't add a newline if statement ends with whitespace, OR + # if statement ends with whitespace before a color escape code. + if /[ \t](\e\[\d+(;\d+)*m)?\Z/ =~ statement + output.print(statement) + else + output.puts(statement) + end + output.flush # See: https://github.com/JEG2/highline/pull/276 + end + + # Renders and indents a statement. + # + # Note: extracted here to be used by readline to render its prompt. + # + # @param statement [String] The statement to be rendered and indented. + # @return [String] The rendered and indented statement. + def render_and_ident_statement(statement) + statement = render_statement(statement) + statement = (indentation + statement) unless statement.empty? + statement + end + + # Renders a statement using {HighLine::Statement} + # @param statement [String] any string + # @return [Statement] rendered statement + def render_statement(statement) + Statement.new(statement, self).to_s + end + + # + # Set to an integer value to cause HighLine to wrap output lines at the + # indicated character limit. When +nil+, the default, no wrapping occurs. If + # set to :auto, HighLine will attempt to determine the columns + # available for the @output or use a sensible default. + # + def wrap_at=(setting) + @wrap_at = setting == :auto ? output_cols : setting + end + + # + # Set to an integer value to cause HighLine to page output lines over the + # indicated line limit. When +nil+, the default, no paging occurs. If + # set to :auto, HighLine will attempt to determine the rows available + # for the @output or use a sensible default. + # + def page_at=(setting) + @page_at = setting == :auto ? output_rows - 2 : setting + end + + # + # Outputs indentation with current settings + # + def indentation + " " * @indent_size * @indent_level + end + + # + # Executes block or outputs statement with indentation + # + # @param increase [Integer] how much to increase indentation + # @param statement [Statement, String] to be said + # @param multiline [Boolean] + # @return [void] + # @see #multi_indent + def indent(increase = 1, statement = nil, multiline = nil) + @indent_level += increase + multi = @multi_indent + @multi_indent ||= multiline + begin + if block_given? + yield self + else + say(statement) + end + ensure + @multi_indent = multi + @indent_level -= increase + end + end + + # + # Outputs newline + # + def newline + @output.puts + end + + # + # Returns the number of columns for the console, or a default it they cannot + # be determined. + # + def output_cols + return 80 unless @output.tty? + terminal.terminal_size.first + rescue NoMethodError + return 80 + end + + # + # Returns the number of rows for the console, or a default if they cannot be + # determined. + # + def output_rows + return 24 unless @output.tty? + terminal.terminal_size.last + rescue NoMethodError + return 24 + end + + # Call #puts on the HighLine's output stream + # @param args [String] same args for Kernel#puts + def puts(*args) + @output.puts(*args) + end + + # + # Creates a new HighLine instance with the same options + # + def new_scope + self.class.new(@input, @output, @wrap_at, + @page_at, @indent_size, @indent_level) + end + + private + + # Adds a layer of scope (new_scope) to ask a question inside a + # question, without destroying instance data + def confirm(question) + new_scope.agree(question.confirm_question(self)) + end + + # + # A helper method used by HighLine::Question.verify_match + # for finding whether a list of answers match or differ + # from each other. + # + def unique_answers(list) + (list.respond_to?(:values) ? list.values : list).uniq + end + + def last_answer(answers) + answers.respond_to?(:values) ? answers.values.last : answers.last + end + + # Get response one line at time + # @param question [Question] + # @return [String] response + def get_response_line_mode(question) + if question.echo == true && !question.limit + get_line(question) + else + get_line_raw_no_echo_mode(question) + end + end + + # + # Read a line of input from the input stream and process whitespace as + # requested by the Question object. + # + # If Question's _readline_ property is set, that library will be used to + # fetch input. *WARNING*: This ignores the currently set input stream. + # + # Raises EOFError if input is exhausted. + # + def get_line(question) + terminal.get_line(question, self) + end + + def get_line_raw_no_echo_mode(question) + line = "" + + terminal.raw_no_echo_mode_exec do + loop do + character = terminal.get_character + + case character + when "\u0003" # Ctrl+C (Interrupt) + raise Interrupt + when nil # No character received + break + when "\n", "\r" # Newline or carriage return + break + when "\b", "\u007F" # Backspace and delete + unless line.empty? + line = line.chop + output_erase_char if question.echo + end + when "\cU" # Clear line + line.size.times { output_erase_char } if question.echo + line = "" + when "\e" # Escape key + ignore_arrow_key + else # Any other character + line += character + say_last_char_or_echo_char(line, question) + end + + @output.flush + + break if line_overflow_for_question?(line, question) + end + end + + say_new_line_or_overwrite(question) + + question.format_answer(line) + end + + def say_new_line_or_overwrite(question) + if question.overwrite + @output.print("\r#{HighLine.Style(:erase_line).code}") + @output.flush + else + say("\n") + end + end + + def ignore_arrow_key + 2.times do + terminal.get_character + end + end + + def say_last_char_or_echo_char(line, question) + @output.print(line[-1]) if question.echo == true + @output.print(question.echo) if question.echo && question.echo != true + end + + def line_overflow_for_question?(line, question) + question.limit && line.size == question.limit + end + + def output_erase_char + @output.print("\b#{HighLine.Style(:erase_char).code}") + end + + # Get response using #getc + # @param question [Question] + # @return [String] response + def get_response_getc_mode(question) + terminal.raw_no_echo_mode_exec do + response = @input.getc + question.format_answer(response) + end + end + + # Get response each character per turn + # @param question [Question] + # @return [String] response + def get_response_character_mode(question) + terminal.raw_no_echo_mode_exec do + response = terminal.get_character + if question.overwrite + erase_current_line + else + echo = question.get_echo_for_response(response) + say("#{echo}\n") + end + question.format_answer(response) + end + end + + def erase_current_line + @output.print("\r#{HighLine.Style(:erase_line).code}") + @output.flush + end + + public :get_response_character_mode, :get_response_line_mode + public :get_response_getc_mode + + def actual_length(text) + Wrapper.actual_length text + end + + # Check to see if there's already a HighLine.default_instance or if + # this is the first time the method is called (eg: at + # HighLine.default_instance initialization). + # If there's already one, copy use_color settings. + # This is here most to help migrate code from HighLine 1.7.x to 2.0.x + # + # @return [Boolean] + def default_use_color + if HighLine.default_instance + HighLine.default_instance.use_color + else + true + end + end +end + +HighLine.default_instance = HighLine.new + +require "highline/string" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/builtin_styles.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/builtin_styles.rb new file mode 100644 index 000000000..71c24293d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/builtin_styles.rb @@ -0,0 +1,129 @@ +# coding: utf-8 + +class HighLine + # Builtin Styles that are included at HighLine initialization. + # It has the basic styles like :bold and :underline. + module BuiltinStyles + # Included callback + # @param base [Class, Module] base class + def self.included(base) + base.extend ClassMethods + end + + # Basic styles' ANSI escape codes like :bold => "\e[1m" + STYLE_LIST = { + erase_line: "\e[K", + erase_char: "\e[P", + clear: "\e[0m", + reset: "\e[0m", + bold: "\e[1m", + dark: "\e[2m", + underline: "\e[4m", + underscore: "\e[4m", + blink: "\e[5m", + reverse: "\e[7m", + concealed: "\e[8m" + }.freeze + + STYLE_LIST.each do |style_name, code| + style = String(style_name).upcase + + const_set style, code + const_set style + "_STYLE", + Style.new(name: style_name, code: code, builtin: true) + end + + # Basic Style names like CLEAR, BOLD, UNDERLINE + STYLES = %w[CLEAR RESET BOLD DARK UNDERLINE + UNDERSCORE BLINK REVERSE CONCEALED].freeze + + # A Hash with the basic colors an their ANSI escape codes. + COLOR_LIST = { + black: { code: "\e[30m", rgb: [0, 0, 0] }, + red: { code: "\e[31m", rgb: [128, 0, 0] }, + green: { code: "\e[32m", rgb: [0, 128, 0] }, + blue: { code: "\e[34m", rgb: [0, 0, 128] }, + yellow: { code: "\e[33m", rgb: [128, 128, 0] }, + magenta: { code: "\e[35m", rgb: [128, 0, 128] }, + cyan: { code: "\e[36m", rgb: [0, 128, 128] }, + white: { code: "\e[37m", rgb: [192, 192, 192] }, + gray: { code: "\e[37m", rgb: [192, 192, 192] }, + grey: { code: "\e[37m", rgb: [192, 192, 192] }, + none: { code: "\e[38m", rgb: [0, 0, 0] } + }.freeze + + COLOR_LIST.each do |color_name, attributes| + color = String(color_name).upcase + + style = Style.new( + name: color_name, + code: attributes[:code], + rgb: attributes[:rgb], + builtin: true + ) + + const_set color + "_STYLE", style + end + + # The builtin styles basic colors like black, red, green. + BASIC_COLORS = + %w[BLACK RED GREEN YELLOW BLUE + MAGENTA CYAN WHITE GRAY GREY NONE].freeze + + colors = BASIC_COLORS.dup + BASIC_COLORS.each do |color| + bright_color = "BRIGHT_#{color}" + colors << bright_color + const_set bright_color + "_STYLE", const_get(color + "_STYLE").bright + + light_color = "LIGHT_#{color}" + colors << light_color + const_set light_color + "_STYLE", const_get(color + "_STYLE").light + end + + # The builtin styles' colors like LIGHT_RED and BRIGHT_BLUE. + COLORS = colors + + colors.each do |color| + const_set color, const_get("#{color}_STYLE").code + const_set "ON_#{color}_STYLE", const_get("#{color}_STYLE").on + const_set "ON_#{color}", const_get("ON_#{color}_STYLE").code + end + + ON_NONE_STYLE.rgb = [255, 255, 255] # Override; white background + + # BuiltinStyles class methods to be extended. + module ClassMethods + # Regexp to match against RGB style constant names. + RGB_COLOR_PATTERN = /^(ON_)?(RGB_)([A-F0-9]{6})(_STYLE)?$/ + + # const_missing callback for automatically respond to + # builtin constants (without explicitly defining them) + # @param name [Symbol] missing constant name + def const_missing(name) + raise NameError, "Bad color or uninitialized constant #{name}" unless + name.to_s =~ RGB_COLOR_PATTERN + + on = Regexp.last_match(1) + suffix = Regexp.last_match(4) + + code_name = if suffix + Regexp.last_match(1).to_s + + Regexp.last_match(2) + + Regexp.last_match(3) + else + name.to_s + end + + style_name = code_name + "_STYLE" + style = Style.rgb(Regexp.last_match(3)) + style = style.on if on + + const_set(style_name, style) + const_set(code_name, style.code) + + suffix ? style : style.code + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/color_scheme.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/color_scheme.rb new file mode 100644 index 000000000..e1bec8876 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/color_scheme.rb @@ -0,0 +1,151 @@ +# coding: utf-8 + +#-- +# color_scheme.rb +# +# Created by Jeremy Hinegardner on 2007-01-24 +# Copyright 2007. All rights reserved +# +# This is Free Software. See LICENSE and COPYING for details + +class HighLine + # + # ColorScheme objects encapsulate a named set of colors to be used in the + # {HighLine.color} method call. For example, by applying a ColorScheme that + # has a :warning color then the following could be used: + # + # color("This is a warning", :warning) + # + # A ColorScheme contains named sets of HighLine color constants. + # + # @example Instantiating a color scheme, applying it to HighLine, + # and using it: + # ft = HighLine::ColorScheme.new do |cs| + # cs[:headline] = [ :bold, :yellow, :on_black ] + # cs[:horizontal_line] = [ :bold, :white ] + # cs[:even_row] = [ :green ] + # cs[:odd_row] = [ :magenta ] + # end + # + # HighLine.color_scheme = ft + # say("<%= color('Headline', :headline) %>") + # say("<%= color('-'*20, :horizontal_line) %>") + # i = true + # ("A".."D").each do |row| + # if i then + # say("<%= color('#{row}', :even_row ) %>") + # else + # say("<%= color('#{row}', :odd_row) %>") + # end + # i = !i + # end + # + # + class ColorScheme + # + # Create an instance of HighLine::ColorScheme. The customization can + # happen as a passed in Hash or via the yielded block. Keys are + # converted to :symbols and values are converted to HighLine + # constants. + # + # @param h [Hash] + def initialize(h = nil) + @scheme = {} + load_from_hash(h) if h + yield self if block_given? + end + + # Load multiple colors from key/value pairs. + # @param h [Hash] + def load_from_hash(h) + h.each_pair do |color_tag, constants| + self[color_tag] = constants + end + end + + # Does this color scheme include the given tag name? + # @param color_tag [#to_sym] + # @return [Boolean] + def include?(color_tag) + @scheme.keys.include?(to_symbol(color_tag)) + end + + # Allow the scheme to be accessed like a Hash. + # @param color_tag [#to_sym] + # @return [Style] + def [](color_tag) + @scheme[to_symbol(color_tag)] + end + + # Retrieve the original form of the scheme + # @param color_tag [#to_sym] + def definition(color_tag) + style = @scheme[to_symbol(color_tag)] + style && style.list + end + + # Retrieve the keys in the scheme + # @return [Array] of keys + def keys + @scheme.keys + end + + # Allow the scheme to be set like a Hash. + # @param color_tag [#to_sym] + # @param constants [Array] Array of Style symbols + def []=(color_tag, constants) + @scheme[to_symbol(color_tag)] = + HighLine::Style.new(name: color_tag.to_s.downcase.to_sym, + list: constants, + no_index: true) + end + + # Retrieve the color scheme hash (in original definition format) + # @return [Hash] scheme as Hash. It may be reused in a new ColorScheme. + def to_hash + @scheme.each_with_object({}) do |pair, hsh| + key, value = pair + hsh[key] = value.list + end + end + + private + + # Return a normalized representation of a color name. + def to_symbol(t) + t.to_s.downcase + end + + # Return a normalized representation of a color setting. + def to_constant(v) + v = v.to_s if v.is_a?(Symbol) + if v.is_a?(::String) + HighLine.const_get(v.upcase) + else + v + end + end + end + + # A sample ColorScheme. + class SampleColorScheme < ColorScheme + SAMPLE_SCHEME = { + critical: [:yellow, :on_red], + error: [:bold, :red], + warning: [:bold, :yellow], + notice: [:bold, :magenta], + info: [:bold, :cyan], + debug: [:bold, :green], + row_even: [:cyan], + row_odd: [:magenta] + }.freeze + # + # Builds the sample scheme with settings for :critical, + # :error, :warning, :notice, :info, + # :debug, :row_even, and :row_odd colors. + # + def initialize(_h = nil) + super(SAMPLE_SCHEME) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/compatibility.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/compatibility.rb new file mode 100644 index 000000000..ee13fd657 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/compatibility.rb @@ -0,0 +1,23 @@ +# coding: utf-8 + +unless STDIN.respond_to? :getbyte + # HighLine adds #getbyte alias to #getc when #getbyte is not available. + class IO + # alias to #getc when #getbyte is not available + alias getbyte getc + end + + # HighLine adds #getbyte alias to #getc when #getbyte is not available. + class StringIO + # alias to #getc when #getbyte is not available + alias getbyte getc + end +end + +unless "".respond_to? :each_line + # HighLine adds #each_line alias to #each when each_line is not available. + class String + # alias to #each when each_line is not available. + alias each_line each + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/custom_errors.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/custom_errors.rb new file mode 100644 index 000000000..28e97df6f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/custom_errors.rb @@ -0,0 +1,57 @@ +# encoding: utf-8 + +class HighLine + # Internal HighLine errors. + module CustomErrors + # An error that responds to :explanation_key + class ExplainableError < StandardError + # Explanation key as Symbol or nil. Used to + # select the proper error message to be displayed. + # @return [nil, Symbol] explanation key to get the + # proper error message. + def explanation_key + nil + end + end + + # Bare Question error + class QuestionError < ExplainableError + # (see ExplainableError#explanation_key) + def explanation_key + nil + end + end + + # Invalid Question error + class NotValidQuestionError < ExplainableError + # (see ExplainableError#explanation_key) + def explanation_key + :not_valid + end + end + + # Out of Range Question error + class NotInRangeQuestionError < ExplainableError + # (see ExplainableError#explanation_key) + def explanation_key + :not_in_range + end + end + + # Unconfirmed Question error + class NoConfirmationQuestionError < ExplainableError + # (see ExplainableError#explanation_key) + def explanation_key + nil + end + end + + # Unavailable auto complete error + class NoAutoCompleteMatch < ExplainableError + # (see ExplainableError#explanation_key) + def explanation_key + :no_completion + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/import.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/import.rb new file mode 100644 index 000000000..46cb3db04 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/import.rb @@ -0,0 +1,48 @@ +# coding: utf-8 + +# import.rb +# +# Created by James Edward Gray II on 2005-04-26. +# Copyright 2005 Gray Productions. All rights reserved. +# +# This is Free Software. See LICENSE and COPYING for details. + +require "highline" +require "forwardable" + +# +# require "highline/import" adds shortcut methods to Kernel, making +# {HighLine#agree}, {HighLine#ask}, {HighLine#choose} and {HighLine#say} +# globally available. This is handy for +# quick and dirty input and output. These methods use HighLine.default_instance +# which is initialized to use $stdin and $stdout (you are free +# to change this). +# Otherwise, these methods are identical to their {HighLine} counterparts, +# see that class for detailed explanations. +# +module Kernel + extend Forwardable + def_instance_delegators :HighLine, :agree, :ask, :choose, :say +end + +# When requiring 'highline/import' HighLine adds {#or_ask} to Object so +# it is globally available. +class Object + # + # Tries this object as a _first_answer_ for a HighLine::Question. See that + # attribute for details. + # + # *Warning*: This Object will be passed to String() before set. + # + # @param args [Array<#to_s>] + # @param details [lambda] block to be called with the question + # instance as argument. + # @return [String] answer + def or_ask(*args, &details) + ask(*args) do |question| + question.first_answer = String(self) + + yield(question) if details + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/io_console_compatible.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/io_console_compatible.rb new file mode 100644 index 000000000..7fa388c85 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/io_console_compatible.rb @@ -0,0 +1,37 @@ +# coding: utf-8 + +require "stringio" +require "tempfile" + +# +# On tests, we try to simulate input output with +# StringIO, Tempfile and File objects. +# +# For this to be accomplished, we have to do some +# tweaking so that they respond adequately to the +# called methods during tests. +# + +module IOConsoleCompatible + def getch(min:nil, time:nil, intr: nil) + getc + end + + attr_accessor :echo + + def winsize + [24, 80] + end +end + +class Tempfile + include IOConsoleCompatible +end + +class File + include IOConsoleCompatible +end + +class StringIO + include IOConsoleCompatible +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/list.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/list.rb new file mode 100644 index 000000000..6ca876fb4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/list.rb @@ -0,0 +1,177 @@ +# coding: utf-8 + +class HighLine + # List class with some convenience methods like {#col_down}. + class List + # Original given *items* argument. + # It's frozen at initialization time and + # all later transformations will happen on {#list}. + # @return [Array] + attr_reader :items + + # Number of columns for each list row. + # @return [Integer] + attr_reader :cols + + # Columns turn into rows in transpose mode. + # @return [Boolean] + # + # @example A two columns array like this: + # [ [ "a", "b" ], + # [ "c", "d" ], + # [ "e", "f" ], + # [ "g", "h" ], + # [ "i", "j" ] ] + # + # @example When in transpose mode will be like this: + # [ [ "a", "c", "e", "g", "i" ], + # [ "b", "d", "f", "h", "j" ] ] + # + # @see #col_down_mode + + attr_reader :transpose_mode + + # Content are distributed first by column in col down mode. + # @return [Boolean] + # + # @example A two columns array like this: + # [ [ "a", "b" ], + # [ "c", "d" ], + # [ "e", "f" ], + # [ "g", "h" ], + # [ "i", "j" ] ] + # + # @example In col down mode will be like this: + # [ [ "a", "f"], + # [ "b", "g"], + # [ "c", "h"], + # [ "d", "i"], + # [ "e", "j"] ] + # + # @see #transpose_mode + + attr_reader :col_down_mode + + # @param items [#to_a] an array of items to compose the list. + # @param options [Hash] a hash of options to tailor the list. + # @option options [Boolean] :transpose (false) set {#transpose_mode}. + # @option options [Boolean] :col_down (false) set {#col_down_mode}. + # @option options [Integer] :cols (1) set {#cols}. + + def initialize(items, options = {}) + @items = items.to_a.dup.freeze + @transpose_mode = options.fetch(:transpose) { false } + @col_down_mode = options.fetch(:col_down) { false } + @cols = options.fetch(:cols) { 1 } + build + end + + # Transpose the (already sliced by rows) list, + # turning its rows into columns. + # @return [self] + def transpose + first_row = @list[0] + other_rows = @list[1..-1] + @list = first_row.zip(*other_rows) + self + end + + # Slice the list by rows and transpose it. + # @return [self] + def col_down + slice_by_rows + transpose + self + end + + # Slice the list by rows. The row count is calculated + # indirectly based on the {#cols} param and the items count. + # @return [self] + def slice_by_rows + @list = items_sliced_by_rows + self + end + + # Slice the list by cols based on the {#cols} param. + # @return [self] + def slice_by_cols + @list = items_sliced_by_cols + self + end + + # Set the cols number. + # @return [self] + def cols=(cols) + @cols = cols + build + end + + # Returns an Array representation of the list + # in its current state. + # @return [Array] @list.dup + def list + @list.dup + end + + # (see #list) + def to_a + list + end + + # Stringfies the list in its current state. + # It joins each individual _cell_ with the current + # {#row_join_string} between them. + # It joins each individual row with a + # newline character. So the returned String is + # suitable to be directly outputed + # to the screen, preserving row/columns divisions. + # @return [String] + def to_s + list.map { |row| stringfy(row) }.join + end + + # The String that will be used to join each + # cell of the list and stringfying it. + # @return [String] defaults to " " (space) + def row_join_string + @row_join_string ||= " " + end + + # Set the {#row_join_string}. + # @see #row_join_string + attr_writer :row_join_string + + # Returns the row join string size. + # Useful for calculating the actual size of + # rendered list. + # @return [Integer] + def row_join_str_size + row_join_string.size + end + + private + + def build + slice_by_cols + transpose if transpose_mode + col_down if col_down_mode + self + end + + def items_sliced_by_cols + items.each_slice(cols).to_a + end + + def items_sliced_by_rows + items.each_slice(row_count).to_a + end + + def row_count + (items.count / cols.to_f).ceil + end + + def stringfy(row) + row.compact.join(row_join_string) + "\n" + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/list_renderer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/list_renderer.rb new file mode 100644 index 000000000..cbd161e93 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/list_renderer.rb @@ -0,0 +1,261 @@ +# coding: utf-8 + +require "highline/template_renderer" +require "highline/wrapper" +require "highline/list" + +class HighLine + # + # This class is a utility for quickly and easily laying out lists + # to be used by HighLine. + # + class ListRenderer + # Items list + # @return [Array] + attr_reader :items + + # @return [Symbol] the current mode the List is being rendered + # @see #initialize for more details see mode parameter of #initialize + attr_reader :mode + + # Changes the behaviour of some modes. Example, in :inline mode + # the option is treated as the 'end separator' (defaults to " or ") + # @return option parameter that changes the behaviour of some modes. + attr_reader :option + + # @return [HighLine] context + attr_reader :highline + + # The only required parameters are _items_ and _highline_. + # @param items [Array] the Array of items to list + # @param mode [Symbol] controls how that list is formed + # @param option has different effects, depending on the _mode_. + # @param highline [HighLine] a HighLine instance to direct the output to. + # + # Recognized modes are: + # + # :columns_across:: _items_ will be placed in columns, + # flowing from left to right. If given, + # _option_ is the number of columns to be + # used. When absent, columns will be + # determined based on _wrap_at_ or a + # default of 80 characters. + # :columns_down:: Identical to :columns_across, + # save flow goes down. + # :uneven_columns_across:: Like :columns_across but each + # column is sized independently. + # :uneven_columns_down:: Like :columns_down but each + # column is sized independently. + # :inline:: All _items_ are placed on a single + # line. The last two _items_ are + # separated by _option_ or a default of + # " or ". All other _items_ are + # separated by ", ". + # :rows:: The default mode. Each of the _items_ + # is placed on its own line. The _option_ + # parameter is ignored in this mode. + # + # Each member of the _items_ Array is passed through ERb and thus can + # contain their own expansions. Color escape expansions do not contribute to + # the final field width. + + def initialize(items, mode = :rows, option = nil, highline) + @highline = highline + @mode = mode + @option = option + @items = render_list_items(items) + end + + # Render the list using the appropriate mode and options. + # @return [String] rendered list as String + def render + return "" if items.empty? + + case mode + when :inline + list_inline_mode + when :columns_across + list_columns_across_mode + when :columns_down + list_columns_down_mode + when :uneven_columns_across + list_uneven_columns_mode + when :uneven_columns_down + list_uneven_columns_down_mode + else + list_default_mode + end + end + + private + + def render_list_items(items) + items.to_ary.map do |item| + item = String(item) + template = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+ + ERB.new(item, trim_mode: "%") + else + ERB.new(item, nil, "%") + end + template_renderer = + HighLine::TemplateRenderer.new(template, self, highline) + template_renderer.render + end + end + + def list_default_mode + items.map { |i| "#{i}\n" }.join + end + + def list_inline_mode + end_separator = option || " or " + + if items.size == 1 + items.first + else + items[0..-2].join(", ") + "#{end_separator}#{items.last}" + end + end + + def list_columns_across_mode + HighLine::List.new(right_padded_items, cols: col_count).to_s + end + + def list_columns_down_mode + HighLine::List.new( + right_padded_items, + cols: col_count, + col_down: true + ).to_s + end + + def list_uneven_columns_mode(list = nil) + list ||= HighLine::List.new(items) + + col_max = option || items.size + col_max.downto(1) do |column_count| + list.cols = column_count + widths = get_col_widths(list) + + if column_count == 1 || # last guess + inside_line_size_limit?(widths) || # good guess + option # defined by user + return pad_uneven_rows(list, widths) + end + end + end + + def list_uneven_columns_down_mode + list = HighLine::List.new(items, col_down: true) + list_uneven_columns_mode(list) + end + + def pad_uneven_rows(list, widths) + right_padded_list = Array(list).map do |row| + right_pad_row(row.compact, widths) + end + stringfy_list(right_padded_list) + end + + def stringfy_list(list) + list.map { |row| row_to_s(row) }.join + end + + def row_to_s(row) + row.compact.join(row_join_string) + "\n" + end + + def right_pad_row(row, widths) + row.zip(widths).map do |field, width| + right_pad_field(field, width) + end + end + + def right_pad_field(field, width) + field = String(field) # nil protection + pad_size = width - actual_length(field) + field + (pad_char * pad_size) + end + + def get_col_widths(lines) + lines = transpose(lines) + get_segment_widths(lines) + end + + def get_row_widths(lines) + get_segment_widths(lines) + end + + def get_segment_widths(lines) + lines.map do |col| + actual_lengths_for(col).max + end + end + + def actual_lengths_for(line) + line.map do |item| + actual_length(item) + end + end + + def transpose(lines) + lines = Array(lines) + first_line = lines.shift + first_line.zip(*lines) + end + + def inside_line_size_limit?(widths) + line_size = widths.reduce(0) { |sum, n| sum + n + row_join_str_size } + line_size <= line_size_limit + row_join_str_size + end + + def actual_length(text) + HighLine::Wrapper.actual_length text + end + + def items_max_length + @items_max_length ||= max_length(items) + end + + def max_length(items) + items.map { |item| actual_length(item) }.max + end + + def line_size_limit + @line_size_limit ||= (highline.wrap_at || 80) + end + + def row_join_string + @row_join_string ||= " " + end + + attr_writer :row_join_string + + def row_join_str_size + row_join_string.size + end + + def col_count_calculate + result = (line_size_limit + row_join_str_size) / (items_max_length + row_join_str_size) + result == 0 ? 1 : result + end + + def col_count + option || col_count_calculate + end + + def right_padded_items + items.map do |item| + right_pad_field(item, items_max_length) + end + end + + def pad_char + " " + end + + def row_count + (items.count / col_count.to_f).ceil + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/menu.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/menu.rb new file mode 100644 index 000000000..36128cff4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/menu.rb @@ -0,0 +1,578 @@ +# coding: utf-8 + +#-- +# menu.rb +# +# Created by Gregory Thomas Brown on 2005-05-10. +# Copyright 2005. All rights reserved. +# +# This is Free Software. See LICENSE and COPYING for details. + +require "highline/question" +require "highline/menu/item" + +class HighLine + # + # Menu objects encapsulate all the details of a call to + # {HighLine#choose HighLine#choose}. + # Using the accessors and {Menu#choice} and {Menu#choices}, the block passed + # to {HighLine#choose} can detail all aspects of menu display and control. + # + class Menu < Question + # Pass +false+ to _color_ to turn off HighLine::Menu's + # index coloring. + # Pass a color and the Menu's indices will be colored. + class << self + attr_writer :index_color + end + + # Initialize it + self.index_color = false + + # Returns color used for coloring Menu's indices + class << self + attr_reader :index_color + end + + # + # Create an instance of HighLine::Menu. All customization is done + # through the passed block, which should call accessors, {#choice} and + # {#choices} as needed to define the Menu. Note that Menus are also + # {HighLine::Question Questions}, so all that functionality is available + # to the block as well. + # + # @example Implicit menu creation through HighLine#choose + # cli = HighLine.new + # answer = cli.choose do |menu| + # menu.prompt = "Please choose your favorite programming language? " + # menu.choice(:ruby) { say("Good choice!") } + # menu.choices(:python, :perl) { say("Not from around here, are you?") } + # end + + def initialize + # + # Initialize Question objects with ignored values, we'll + # adjust ours as needed. + # + super("Ignored", [], &nil) # avoiding passing the block along + + @items = [] + @hidden_items = [] + @help = Hash.new("There's no help for that topic.") + + @index = :number + @index_suffix = ". " + @select_by = :index_or_name + @flow = :rows + @list_option = nil + @header = nil + @prompt = "? " + @layout = :list + @shell = false + @nil_on_handled = false + + # Used for coloring Menu indices. + # Set it to default. But you may override it. + @index_color = self.class.index_color + + # Override Questions responses, we'll set our own. + @responses = {} + # Context for action code. + @highline = nil + + yield self if block_given? + + init_help if @shell && !@help.empty? + end + + # + # An _index_ to append to each menu item in display. See + # Menu.index=() for details. + # + attr_reader :index + # + # The String placed between an _index_ and a menu item. Defaults to + # ". ". Switches to " ", when _index_ is set to a String (like "-"). + # + attr_accessor :index_suffix + # + # The _select_by_ attribute controls how the user is allowed to pick a + # menu item. The available choices are: + # + # :index:: The user is allowed to type the numerical + # or alphabetical index for their selection. + # :index_or_name:: Allows both methods from the + # :index option and the + # :name option. + # :name:: Menu items are selected by typing a portion + # of the item name that will be + # auto-completed. + # + attr_accessor :select_by + # + # This attribute is passed directly on as the mode to HighLine.list() by + # all the preset layouts. See that method for appropriate settings. + # + attr_accessor :flow + # + # This setting is passed on as the third parameter to HighLine.list() + # by all the preset layouts. See that method for details of its + # effects. Defaults to +nil+. + # + attr_accessor :list_option + # + # Used by all the preset layouts to display title and/or introductory + # information, when set. Defaults to +nil+. + # + attr_accessor :header + # + # Used by all the preset layouts to ask the actual question to fetch a + # menu selection from the user. Defaults to "? ". + # + attr_accessor :prompt + # + # An ERb _layout_ to use when displaying this Menu object. See + # Menu.layout=() for details. + # + attr_reader :layout + # + # When set to +true+, responses are allowed to be an entire line of + # input, including details beyond the command itself. Only the first + # "word" of input will be matched against the menu choices, but both the + # command selected and the rest of the line will be passed to provided + # action blocks. Defaults to +false+. + # + attr_accessor :shell + # + # When +true+, any selected item handled by provided action code will + # return +nil+, instead of the results to the action code. This may + # prove handy when dealing with mixed menus where only the names of + # items without any code (and +nil+, of course) will be returned. + # Defaults to +false+. + # + attr_accessor :nil_on_handled + # + # The color of the index when displaying the menu. See Style class for + # available colors. + # + attr_accessor :index_color + + # + # Adds _name_ to the list of available menu items. Menu items will be + # displayed in the order they are added. + # + # An optional _action_ can be associated with this name and if provided, + # it will be called if the item is selected. The result of the method + # will be returned, unless _nil_on_handled_ is set (when you would get + # +nil+ instead). In _shell_ mode, a provided block will be passed the + # command chosen and any details that followed the command. Otherwise, + # just the command is passed. The @highline variable is set to + # the current HighLine context before the action code is called and can + # thus be used for adding output and the like. + # + # @param name [#to_s] menu item title/header/name to be displayed. + # @param action [Proc] callback action to be run when the item is selected. + # @param help [String] help/hint string to be displayed. + # @return [void] + # @example (see HighLine::Menu#initialize) + # @example Use of help string on menu items + # cli = HighLine.new + # cli.choose do |menu| + # menu.shell = true + # + # menu.choice(:load, text: 'Load a file', + # help: "Load a file using your favourite editor.") + # menu.choice(:save, help: "Save data in file.") + # menu.choice(:quit, help: "Exit program.") + # + # menu.help("rules", "The rules of this system are as follows...") + # end + + def choice(name, help = nil, text = nil, &action) + item = Menu::Item.new(name, text: text, help: help, action: action) + @items << item + @help.merge!(item.item_help) + update_responses # rebuild responses based on our settings + end + + # + # This method helps reduce the namespaces in the original call, + # which would look like this: HighLine::Menu::Item.new(...) + # With #build_item, it looks like this: menu.build_item(...) + # @param *args splat args, the same args you would pass to an + # initialization of HighLine::Menu::Item + # @return [HighLine::Menu::Item] the menu item + + def build_item(*args) + Menu::Item.new(*args) + end + + # + # Adds an item directly to the menu. If you want more configuration + # or options, use this method + # + # @param item [Menu::Item] item containing choice fields and more + # @return [void] + + def add_item(item) + @items << item + @help.merge!(item.item_help) + update_responses + end + + # + # A shortcut for multiple calls to the sister method {#choice}. Be + # warned: An _action_ set here will apply to *all* provided + # _names_. This is considered to be a feature, so you can easily + # hand-off interface processing to a different chunk of code. + # @param names [Array<#to_s>] menu item titles/headers/names to be + # displayed. + # @param action (see #choice) + # @return [void] + # @example (see HighLine::Menu#initialize) + # + # choice has more options available to you, like longer text or help (and + # of course, individual actions) + # + def choices(*names, &action) + names.each { |n| choice(n, &action) } + end + + # Identical to {#choice}, but the item will not be listed for the user. + # @see #choice + # @param name (see #choice) + # @param help (see #choice) + # @param action (see #choice) + # @return (see #choice) + + def hidden(name, help = nil, &action) + item = Menu::Item.new(name, text: name, help: help, action: action) + @hidden_items << item + @help.merge!(item.item_help) + end + + # + # Sets the indexing style for this Menu object. Indexes are appended to + # menu items, when displayed in list form. The available settings are: + # + # :number:: Menu items will be indexed numerically, starting + # with 1. This is the default method of indexing. + # :letter:: Items will be indexed alphabetically, starting + # with a. + # :none:: No index will be appended to menu items. + # any String:: Will be used as the literal _index_. + # + # Setting the _index_ to :none or a literal String also adjusts + # _index_suffix_ to a single space and _select_by_ to :name. + # Because of this, you should make a habit of setting the _index_ first. + # + def index=(style) + @index = style + + return unless @index == :none || @index.is_a?(::String) + + # Default settings. + @index_suffix = " " + @select_by = :name + end + + # + # Initializes the help system by adding a :help choice, some + # action code, and the default help listing. + # + def init_help + return if @items.include?(:help) + + topics = @help.keys.sort + help_help = + if @help.include?("help") + @help["help"] + else + "This command will display helpful messages about " \ + "functionality, like this one. To see the help for " \ + "a specific topic enter:\n\thelp [TOPIC]\nTry asking " \ + "for help on any of the following:\n\n" \ + "<%= list(#{topics.inspect}, :columns_across) %>" + end + + choice(:help, help_help) do |_command, topic| + topic.strip! + topic.downcase! + if topic.empty? + @highline.say(@help["help"]) + else + @highline.say("= #{topic}\n\n#{@help[topic]}") + end + end + end + + # + # Used to set help for arbitrary topics. Use the topic "help" + # to override the default message. Mainly for internal use. + # + # @param topic [String] the menu item header/title/name to be associated + # with a help message. + # @param help [String] the help message to be associated with the menu + # item/title/name. + def help(topic, help) + @help[topic] = help + end + + # + # Setting a _layout_ with this method also adjusts some other attributes + # of the Menu object, to ideal defaults for the chosen _layout_. To + # account for that, you probably want to set a _layout_ first in your + # configuration block, if needed. + # + # Accepted settings for _layout_ are: + # + # :list:: The default _layout_. The _header_ if set + # will appear at the top on its own line with + # a trailing colon. Then the list of menu + # items will follow. Finally, the _prompt_ + # will be used as the ask()-like question. + # :one_line:: A shorter _layout_ that fits on one line. + # The _header_ comes first followed by a + # colon and spaces, then the _prompt_ with menu + # items between trailing parenthesis. + # :menu_only:: Just the menu items, followed up by a likely + # short _prompt_. + # any ERb String:: Will be taken as the literal _layout_. This + # String can access header, + # menu and prompt, but is + # otherwise evaluated in the TemplateRenderer + # context so each method is properly delegated. + # + # If set to either :one_line, or :menu_only, _index_ + # will default to :none and _flow_ will default to + # :inline. + # + def layout=(new_layout) + @layout = new_layout + + # Default settings. + case @layout + when :one_line, :menu_only + self.index = :none + @flow = :inline + end + end + + # + # This method returns all possible options for auto-completion, based + # on the settings of _index_ and _select_by_. + # + def options + case @select_by + when :index + map_items_by_index + when :name + map_items_by_name + else + map_items_by_index + map_items_by_name + end + end + + def map_items_by_index + size = all_items.size + case @index + when :letter + ("a".."z").first(size) + when :capital_letter + ("A".."Z").first(size) + else + (1..size).map(&:to_s) + end + end + + def map_items_by_name + all_items.map(&:name) + end + + def all_items + @items + @hidden_items + end + + # + # This method processes the auto-completed user selection, based on the + # rules for this Menu object. If an action was provided for the + # selection, it will be executed as described in {#choice}. + # + # @param highline_context [HighLine] a HighLine instance to be used + # as context. + # @param selection [String, Integer] index or title of the selected + # menu item. + # @param details additional parameter to be passed when in shell mode. + # @return [nil, Object] if @nil_on_handled is set it returns +nil+, + # else it returns the action return value. + def select(highline_context, selection, details = nil) + # add in any hidden menu commands + items = all_items + + # Find the selected action. + selected_item = find_item_from_selection(items, selection) + + # Run or return it. + @highline = highline_context + value_for_selected_item(selected_item, details) + end + + def find_item_from_selection(items, selection) + if selection =~ /^\d+$/ # is a number? + get_item_by_number(items, selection) + else + get_item_by_letter(items, selection) + end + end + + # Returns the menu item referenced by its index + # @param selection [Integer] menu item's index. + def get_item_by_number(items, selection) + items[selection.to_i - 1] + end + + # Returns the menu item referenced by its title/header/name. + # @param selection [String] menu's title/header/name + def get_item_by_letter(items, selection) + item = items.find { |i| i.name == selection } + return item if item + + # 97 is the "a" letter at ascii table + # Ex: For "a" it will return 0, and for "c" it will return 2 + index = selection.downcase.ord - 97 + items[index] + end + + def value_for_selected_item(item, details) + if item.action + result = if @shell + item.action.call(item.name, details) + else + item.action.call(item.name) + end + @nil_on_handled ? nil : result + else + item.name + end + end + + def gather_selected(highline_context, selections, details = nil) + @highline = highline_context + # add in any hidden menu commands + items = all_items + + if selections.is_a?(Array) + value_for_array_selections(items, selections, details) + elsif selections.is_a?(Hash) + value_for_hash_selections(items, selections, details) + else + raise ArgumentError, "selections must be either Array or Hash" + end + end + + def value_for_array_selections(items, selections, details) + # Find the selected items and return values + selected_items = selections.map do |selection| + find_item_from_selection(items, selection) + end + index = 0 + selected_items.map do |selected_item| + value = value_for_selected_item(selected_item, self.shell ? details[index] : nil) + index += 1 + value + end + end + + def value_for_hash_selections(items, selections, details) + # Find the selected items and return in hash form + index = 0 + selections.each_with_object({}) do |(key, selection), memo| + selected_item = find_item_from_selection(items, selection) + value = value_for_selected_item(selected_item, self.shell ? details[index] : nil) + index += 1 + memo[key] = value + end + end + + def decorate_index(index) + if index_color + HighLine.color(index, index_color) + else + index + end + end + + # + # Allows Menu objects to pass as Arrays, for use with HighLine.list(). + # This method returns all menu items to be displayed, complete with + # indexes. + # + def to_ary + @items.map.with_index { |item, ix| decorate_item(item.text.to_s, ix) } + end + + def decorate_item(text, ix) + decorated, non_decorated = mark_for_decoration(text, ix) + decorate_index(decorated) + non_decorated + end + + def mark_for_decoration(text, ix) + case @index + when :number + ["#{ix + 1}#{@index_suffix}", text] + when :letter, :capital_letter + first_letter = (@index == :capital_letter ? 'A' : 'a') + ["#{(first_letter.ord + ix).chr}#{@index_suffix}", text] + when :none + [text, ""] + else + ["#{index}#{@index_suffix}", text] + end + end + + # + # Allows Menu to behave as a String, just like Question. Returns the + # _layout_ to be rendered, which is used by HighLine.say(). + # + def to_s + case @layout + when :list + %(<%= header ? "#{header}:\n" : '' %>) + + parse_list + + show_default_if_any + + "<%= prompt %>" + when :one_line + %(<%= header ? "#{header}: " : '' %>) + + "<%= prompt %>" \ + "(" + parse_list + ")" + + show_default_if_any + + "<%= prompt[/\s*$/] %>" + when :menu_only + parse_list + + show_default_if_any + + "<%= prompt %>" + else + @layout + end + end + + def parse_list + "<%= list( menu, #{@flow.inspect}, + #{@list_option.inspect} ) %>" + end + + def show_default_if_any + default.to_s.empty? ? "" : "(#{default}) " + end + + # + # This method will update the intelligent responses to account for + # Menu specific differences. Calls the superclass' (Question's) + # build_responses method, overriding its default arguments to specify + # 'options' will be used to populate choice lists. + # + def update_responses + build_responses(options) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/menu/item.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/menu/item.rb new file mode 100644 index 000000000..78594cf61 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/menu/item.rb @@ -0,0 +1,32 @@ +# encoding: utf-8 + +class HighLine + class Menu < Question + # Represents an Item of a HighLine::Menu. + # + class Item + attr_reader :name, :text, :help, :action + + # + # @param name [String] The name that is matched against the user input + # @param attributes [Hash] options Hash to tailor menu item to your needs + # @option attributes text: [String] The text that displays for that + # choice (defaults to name) + # @option attributes help: [String] help/hint string to be displayed. + # @option attributes action: [Block] a block that gets called when choice + # is selected + # + def initialize(name, attributes) + @name = name + @text = attributes[:text] || @name + @help = attributes[:help] + @action = attributes[:action] + end + + def item_help + return {} unless help + { name.to_s.downcase => help } + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/paginator.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/paginator.rb new file mode 100644 index 000000000..9da873535 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/paginator.rb @@ -0,0 +1,52 @@ +# coding: utf-8 + +class HighLine + # Take the task of paginating some piece of text given a HighLine context + class Paginator + # @return [HighLine] HighLine context + attr_reader :highline + + # Returns a HighLine::Paginator instance where you can + # call {#page_print} on it. + # @param highline [HighLine] context + # @example + # HighLine::Paginator.new(highline).page_print(statement) + def initialize(highline) + @highline = highline + end + + # + # Page print a series of at most _page_at_ lines for _output_. After each + # page is printed, HighLine will pause until the user presses enter/return + # then display the next page of data. + # + # Note that the final page of _output_ is *not* printed, but returned + # instead. This is to support any special handling for the final sequence. + # + # @param text [String] text to be paginated + # @return [String] last line if paging is aborted + def page_print(text) + return text unless highline.page_at + + lines = text.lines.to_a + while lines.size > highline.page_at + highline.puts lines.slice!(0...highline.page_at).join + highline.puts + # Return last line if user wants to abort paging + return "...\n#{lines.last}" unless continue_paging? + end + lines.join + end + + # + # Ask user if they wish to continue paging output. Allows them to + # type "q" to cancel the paging process. + # + def continue_paging? + command = highline.new_scope.ask( + "-- press enter/return to continue or q to stop -- " + ) { |q| q.character = true } + command !~ /\A[qQ]\Z/ # Only continue paging if Q was not hit. + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question.rb new file mode 100644 index 000000000..6d4351534 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question.rb @@ -0,0 +1,640 @@ +# coding: utf-8 + +#-- +# question.rb +# +# Created by James Edward Gray II on 2005-04-26. +# Copyright 2005 Gray Productions. All rights reserved. +# +# This is Free Software. See LICENSE and COPYING for details. + +require "English" +require "optparse" +require "date" +require "pathname" +require "highline/question/answer_converter" + +class HighLine + # + # Question objects contain all the details of a single invocation of + # HighLine.ask(). The object is initialized by the parameters passed to + # HighLine.ask() and then queried to make sure each step of the input + # process is handled according to the users wishes. + # + class Question + include CustomErrors + + # + # If _template_or_question_ is already a Question object just return it. + # If not, build it. + # + # @param template_or_question [String, Question] what to ask + # @param answer_type [Class] to what class to convert the answer + # @param details to be passed to Question.new + # @return [Question] + def self.build(template_or_question, answer_type = nil, &details) + if template_or_question.is_a? Question + template_or_question + else + Question.new(template_or_question, answer_type, &details) + end + end + + # + # Create an instance of HighLine::Question. Expects a _template_ to ask + # (can be "") and an _answer_type_ to convert the answer to. + # The _answer_type_ parameter must be a type recognized by + # Question.convert(). If given, a block is yielded the new Question + # object to allow custom initialization. + # + # @param template [String] any String + # @param answer_type [Class] the type the answer will be converted to it. + def initialize(template, answer_type) + # initialize instance data + @template = String(template).dup + @answer_type = answer_type + @completion = @answer_type + + @echo = true + @default_hint_show = true + @whitespace = :strip + @case = nil + @in = nil + @first_answer = nil + @glob = "*" + @overwrite = false + @user_responses = {} + @internal_responses = default_responses_hash + @directory = Pathname.new(File.expand_path(File.dirname($PROGRAM_NAME))) + + # allow block to override settings + yield self if block_given? + + # finalize responses based on settings + build_responses + end + + # The ERb template of the question to be asked. + attr_accessor :template + + # The answer, set by HighLine#ask + attr_accessor :answer + + # The type that will be used to convert this answer. + attr_accessor :answer_type + # For Auto-completion + attr_accessor :completion + # + # Can be set to +true+ to use HighLine's cross-platform character reader + # instead of fetching an entire line of input. (Note: HighLine's character + # reader *ONLY* supports STDIN on Windows and Unix.) Can also be set to + # :getc to use that method on the input stream. + # + # *WARNING*: The _echo_ and _overwrite_ attributes for a question are + # ignored when using the :getc method. + # + attr_accessor :character + # + # Allows you to set a character limit for input. + # + # *WARNING*: This option forces a character by character read. + # + attr_accessor :limit + # + # Can be set to +true+ or +false+ to control whether or not input will + # be echoed back to the user. A setting of +true+ will cause echo to + # match input, but any other true value will be treated as a String to + # echo for each character typed. + # + # This requires HighLine's character reader. See the _character_ + # attribute for details. + # + # *Note*: When using HighLine to manage echo on Unix based systems, we + # recommend installing the termios gem. Without it, it's possible to type + # fast enough to have letters still show up (when reading character by + # character only). + # + attr_accessor :echo + # + # Use the Reline library to fetch input. This allows input editing as + # well as keeping a history. In addition, tab will auto-complete + # within an Array of choices or a file listing. + # + # *WARNING*: This option is incompatible with all of HighLine's + # character reading modes and it causes HighLine to ignore the + # specified _input_ stream. + # + attr_accessor :readline + + # + # Used to control whitespace processing for the answer to this question. + # See HighLine::Question.remove_whitespace() for acceptable settings. + # + attr_accessor :whitespace + # + # Used to control character case processing for the answer to this question. + # See HighLine::Question.change_case() for acceptable settings. + # + attr_accessor :case + # Used to provide a default answer to this question. + attr_accessor :default + # Set it to a truthy or falsy value to enable or disable showing the default + # value hint between vertical bars (pipes) when asking the question. + # Defaults to +true+ + attr_accessor :default_hint_show + # + # If set to a Regexp, the answer must match (before type conversion). + # Can also be set to a Proc which will be called with the provided + # answer to validate with a +true+ or +false+ return. + # It's possible to use a custom validator class. It must respond to + # `#valid?`. The result of `#inspect` will be used in error messages. + # See README.md for details. + # + attr_accessor :validate + # Used to control range checks for answer. + attr_accessor :above, :below + # If set, answer must pass an include?() check on this object. + attr_accessor :in + # + # Asks a yes or no confirmation question, to ensure a user knows what + # they have just agreed to. The confirm attribute can be set to : + # +true+ : In this case the question will be, "Are you sure?". + # Proc : The Proc is yielded the answer given. The Proc must + # output a string which is then used as the confirm + # question. + # String : The String must use ERB syntax. The String is + # evaluated with access to question and answer and + # is then used as the confirm question. + # When set to +false+ or +nil+ (the default), answers are not confirmed. + attr_accessor :confirm + # + # When set, the user will be prompted for multiple answers which will + # be collected into an Array or Hash and returned as the final answer. + # + # You can set _gather_ to an Integer to have an Array of exactly that + # many answers collected, or a String/Regexp to match an end input which + # will not be returned in the Array. + # + # Optionally _gather_ can be set to a Hash. In this case, the question + # will be asked once for each key and the answers will be returned in a + # Hash, mapped by key. The @key variable is set before each + # question is evaluated, so you can use it in your question. + # + attr_accessor :gather + # + # When set to +true+ multiple entries will be collected according to + # the setting for _gather_, except they will be required to match + # each other. Multiple identical entries will return a single answer. + # + attr_accessor :verify_match + # + # When set to a non *nil* value, this will be tried as an answer to the + # question. If this answer passes validations, it will become the result + # without the user ever being prompted. Otherwise this value is discarded, + # and this Question is resolved as a normal call to HighLine.ask(). + # + attr_writer :first_answer + # + # The directory from which a user will be allowed to select files, when + # File or Pathname is specified as an _answer_type_. Initially set to + # Pathname.new(File.expand_path(File.dirname($0))). + # + attr_accessor :directory + # + # The glob pattern used to limit file selection when File or Pathname is + # specified as an _answer_type_. Initially set to "*". + # + attr_accessor :glob + # + # A Hash that stores the various responses used by HighLine to notify + # the user. The currently used responses and their purpose are as + # follows: + # + # :ambiguous_completion:: Used to notify the user of an + # ambiguous answer the auto-completion + # system cannot resolve. + # :ask_on_error:: This is the question that will be + # redisplayed to the user in the event + # of an error. Can be set to + # :question to repeat the + # original question. + # :invalid_type:: The error message shown when a type + # conversion fails. + # :no_completion:: Used to notify the user that their + # selection does not have a valid + # auto-completion match. + # :not_in_range:: Used to notify the user that a + # provided answer did not satisfy + # the range requirement tests. + # :not_valid:: The error message shown when + # validation checks fail. + # + def responses + @user_responses + end + # + # When set to +true+ the question is asked, but output does not progress to + # the next line. The Cursor is moved back to the beginning of the question + # line and it is cleared so that all the contents of the line disappear from + # the screen. + # + attr_accessor :overwrite + + # + # Returns the provided _answer_string_ or the default answer for this + # Question if a default was set and the answer is empty. + # + # @param answer_string [String] + # @return [String] the answer itself or a default message. + def answer_or_default(answer_string) + return default if answer_string.empty? && default + answer_string + end + + # + # Called late in the initialization process to build intelligent + # responses based on the details of this Question object. + # Also used by Menu#update_responses. + # + # @return [Hash] responses Hash winner (new and old merge). + # @param message_source [Class] Array or String for example. + # Same as {#answer_type}. + + def build_responses(message_source = answer_type) + append_default_to_template if default_hint_show + + new_hash = build_responses_new_hash(message_source) + # Update our internal responses with the new hash + # generated from the message source + @internal_responses = @internal_responses.merge(new_hash) + end + + def default_responses_hash + { + ask_on_error: "? ", + mismatch: "Your entries didn't match." + } + end + + # When updating the responses hash, it generates the new one. + # @param message_source (see #build_responses) + # @return [Hash] responses hash + def build_responses_new_hash(message_source) + { ambiguous_completion: "Ambiguous choice. Please choose one of " + + choice_error_str(message_source) + ".", + invalid_type: "You must enter a valid #{message_source}.", + no_completion: "You must choose one of " + + choice_error_str(message_source) + ".", + not_in_range: "Your answer isn't within the expected range " \ + "(#{expected_range}).", + not_valid: "Your answer isn't valid (must match " \ + "#{validate.inspect})." } + end + + # This is the actual responses hash that gets used in determining output + # Notice that we give @user_responses precedence over the responses + # generated internally via build_response + def final_responses + @internal_responses.merge(@user_responses) + end + + def final_response(error) + response = final_responses[error] + if response.respond_to?(:call) + response.call(answer) + else + response + end + end + + # + # Returns the provided _answer_string_ after changing character case by + # the rules of this Question. Valid settings for whitespace are: + # + # +nil+:: Do not alter character case. + # (Default.) + # :up:: Calls upcase(). + # :upcase:: Calls upcase(). + # :down:: Calls downcase(). + # :downcase:: Calls downcase(). + # :capitalize:: Calls capitalize(). + # + # An unrecognized choice (like :none) is treated as +nil+. + # + # @param answer_string [String] + # @return [String] upcased, downcased, capitalized + # or unchanged answer String. + def change_case(answer_string) + if [:up, :upcase].include?(@case) + answer_string.upcase + elsif [:down, :downcase].include?(@case) + answer_string.downcase + elsif @case == :capitalize + answer_string.capitalize + else + answer_string + end + end + + # + # Transforms the given _answer_string_ into the expected type for this + # Question. Currently supported conversions are: + # + # [...]:: Answer must be a member of the passed Array. + # Auto-completion is used to expand partial + # answers. + # lambda {...}:: Answer is passed to lambda for conversion. + # Date:: Date.parse() is called with answer. + # DateTime:: DateTime.parse() is called with answer. + # File:: The entered file name is auto-completed in + # terms of _directory_ + _glob_, opened, and + # returned. + # Float:: Answer is converted with Kernel.Float(). + # Integer:: Answer is converted with Kernel.Integer(). + # +nil+:: Answer is left in String format. (Default.) + # Pathname:: Same as File, save that a Pathname object is + # returned. + # String:: Answer is converted with Kernel.String(). + # HighLine::String:: Answer is converted with HighLine::String() + # Regexp:: Answer is fed to Regexp.new(). + # Symbol:: The method to_sym() is called on answer and + # the result returned. + # any other Class:: The answer is passed on to + # Class.parse(). + # + # This method throws ArgumentError, if the conversion cannot be + # completed for any reason. + # + def convert + AnswerConverter.new(self).convert + end + + # Run {#in_range?} and raise an error if not succesful + def check_range + raise NotInRangeQuestionError unless in_range? + end + + # Try to auto complete answer_string + # @param answer_string [String] + # @return [String] + def choices_complete(answer_string) + # cheating, using OptionParser's Completion module + choices = selection + choices.extend(OptionParser::Completion) + answer = choices.complete(answer_string) + raise NoAutoCompleteMatch unless answer + answer + end + + # Returns an English explanation of the current range settings. + def expected_range + expected = [] + + expected << "above #{above}" if above + expected << "below #{below}" if below + expected << "included in #{@in.inspect}" if @in + + case expected.size + when 0 then "" + when 1 then expected.first + when 2 then expected.join(" and ") + else expected[0..-2].join(", ") + ", and #{expected.last}" + end + end + + # Returns _first_answer_, which will be unset following this call. + def first_answer + @first_answer + ensure + @first_answer = nil + end + + # Returns true if _first_answer_ is set. + def first_answer? + true if @first_answer + end + + # + # Returns +true+ if the _answer_object_ is greater than the _above_ + # attribute, less than the _below_ attribute and include?()ed in the + # _in_ attribute. Otherwise, +false+ is returned. Any +nil+ attributes + # are not checked. + # + def in_range? + (!above || answer > above) && + (!below || answer < below) && + (!@in || @in.include?(answer)) + end + + # + # Returns the provided _answer_string_ after processing whitespace by + # the rules of this Question. Valid settings for whitespace are: + # + # +nil+:: Do not alter whitespace. + # :strip:: Calls strip(). (Default.) + # :chomp:: Calls chomp(). + # :collapse:: Collapses all whitespace runs to a + # single space. + # :strip_and_collapse:: Calls strip(), then collapses all + # whitespace runs to a single space. + # :chomp_and_collapse:: Calls chomp(), then collapses all + # whitespace runs to a single space. + # :remove:: Removes all whitespace. + # + # An unrecognized choice (like :none) is treated as +nil+. + # + # This process is skipped for single character input. + # + # @param answer_string [String] + # @return [String] answer string with whitespaces removed + def remove_whitespace(answer_string) + if !whitespace + answer_string + elsif [:strip, :chomp].include?(whitespace) + answer_string.send(whitespace) + elsif whitespace == :collapse + answer_string.gsub(/\s+/, " ") + elsif [:strip_and_collapse, :chomp_and_collapse].include?(whitespace) + result = answer_string.send(whitespace.to_s[/^[a-z]+/]) + result.gsub(/\s+/, " ") + elsif whitespace == :remove + answer_string.gsub(/\s+/, "") + else + answer_string + end + end + + # Convert to String, remove whitespace and change case + # when necessary + # @param answer_string [String] + # @return [String] converted String + def format_answer(answer_string) + answer_string = String(answer_string) + answer_string = remove_whitespace(answer_string) + change_case(answer_string) + end + + # + # Returns an Array of valid answers to this question. These answers are + # only known when _answer_type_ is set to an Array of choices, File, or + # Pathname. Any other time, this method will return an empty Array. + # + def selection + if completion.is_a?(Array) + completion + elsif [File, Pathname].include?(completion) + Dir[File.join(directory.to_s, glob)].map do |file| + File.basename(file) + end + else + [] + end + end + + # Stringifies the template to be asked. + def to_s + template + end + + # + # Returns +true+ if the provided _answer_string_ is accepted by the + # _validate_ attribute or +false+ if it's not. + # + # It's important to realize that an answer is validated after whitespace + # and case handling. + # + def valid_answer? + !validate || + (validate.is_a?(Regexp) && answer =~ validate) || + (validate.is_a?(Proc) && validate[answer]) || + (validate.respond_to?(:valid?) && validate.valid?(answer)) + end + + # + # Return a line or character of input, as requested for this question. + # Character input will be returned as a single character String, + # not an Integer. + # + # This question's _first_answer_ will be returned instead of input, if set. + # + # Raises EOFError if input is exhausted. + # + # @param highline [HighLine] context + # @return [String] a character or line + + def get_response(highline) + return first_answer if first_answer? + + case character + when :getc + highline.get_response_getc_mode(self) + when true + highline.get_response_character_mode(self) + else + highline.get_response_line_mode(self) + end + end + + # Uses {#get_response} but returns a default answer + # using {#answer_or_default} in case no answers was + # returned. + # + # @param highline [HighLine] context + # @return [String] + + def get_response_or_default(highline) + self.answer = answer_or_default(get_response(highline)) + end + + # Returns the String to be shown when asking for an answer confirmation. + # @param highline [HighLine] context + # @return [String] default "Are you sure?" if {#confirm} is +true+ + # @return [String] {#confirm} rendered as a template if it is a String + def confirm_question(highline) + if confirm == true + "Are you sure? " + elsif confirm.is_a?(Proc) + confirm.call(answer) + else + # evaluate ERb under initial scope, so it will have + # access to question and answer + template = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+ + ERB.new(confirm, trim_mode: "%") + else + ERB.new(confirm, nil, "%") + end + template_renderer = TemplateRenderer.new(template, self, highline) + template_renderer.render + end + end + + # Provides the String to be asked when at an error situation. + # It may be just the question itself (repeat on error). + # @return [self] if :ask_on_error on responses Hash is set to :question + # @return [String] if :ask_on_error on responses Hash is set to + # something else + def ask_on_error_msg + if final_responses[:ask_on_error] == :question + self + elsif final_responses[:ask_on_error] + final_responses[:ask_on_error] + end + end + + # @param highline [HighLine] context + # @return [void] + def show_question(highline) + highline.say(self) + end + + # Returns an echo string that is adequate for this Question settings. + # @param response [String] + # @return [String] the response itself if {#echo} is +true+. + # @return [String] echo character if {#echo} is truethy. Mainly a String. + # @return [String] empty string if {#echo} is falsy. + def get_echo_for_response(response) + # actually true, not only truethy value + if echo == true + response + # any truethy value, probably a String + elsif echo + echo + # any falsy value, false or nil + else + "" + end + end + + private + + # + # Adds the default choice to the end of question between |...|. + # Trailing whitespace is preserved so the function of HighLine.say() is + # not affected. + # + def append_default_to_template + return unless default.respond_to? :to_s + + default_str = default.to_s + return if default_str.empty? + + if template =~ /([\t ]+)\Z/ + template << "|#{default_str}|#{Regexp.last_match(1)}" + elsif template == "" + template << "|#{default_str}| " + elsif template[-1, 1] == "\n" + template[-2, 0] = " |#{default_str}|" + else + template << " |#{default_str}|" + end + end + + def choice_error_str(message_source) + if message_source.is_a? Array + "[" + message_source.join(", ") + "]" + else + message_source.inspect + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question/answer_converter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question/answer_converter.rb new file mode 100644 index 000000000..6a4585c2c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question/answer_converter.rb @@ -0,0 +1,100 @@ +# coding: utf-8 + +require "forwardable" + +class HighLine + class Question + # It provides all answer conversion flow. + class AnswerConverter + extend Forwardable + + def_delegators :@question, + :answer, :answer=, + :directory, :answer_type, :choices_complete + + # It should be initialized with a Question object. + # The class will get the answer from {Question#answer} + # and then convert it to the proper {Question#answer_type}. + # It is mainly used by {Question#convert} + # + # @param question [Question] + def initialize(question) + @question = question + end + + # Based on the given Question object's settings, + # it makes the conversion and returns the answer. + # @return [Object] the converted answer. + def convert + self.answer = convert_by_answer_type if answer_type + answer + end + + # @return [HighLine::String] answer converted to a HighLine::String + def to_string + HighLine::String(answer) + end + + # That's a weird name for a method! + # But it's working ;-) + define_method "to_highline::string" do + HighLine::String(answer) + end + + # @return [Integer] answer converted to an Integer + def to_integer + Kernel.send(:Integer, answer) + end + + # @return [Float] answer converted to a Float + def to_float + Kernel.send(:Float, answer) + end + + # @return [Symbol] answer converted to an Symbol + def to_symbol + answer.to_sym + end + + # @return [Regexp] answer converted to a Regexp + def to_regexp + Regexp.new(answer) + end + + # @return [File] answer converted to a File + def to_file + self.answer = choices_complete(answer) + File.open(File.join(directory.to_s, answer.last)) + end + + # @return [Pathname] answer converted to an Pathname + def to_pathname + self.answer = choices_complete(answer) + Pathname.new(File.join(directory.to_s, answer.last)) + end + + # @return [Array] answer converted to an Array + def to_array + self.answer = choices_complete(answer) + answer.last + end + + # @return [Proc] answer converted to an Proc + def to_proc + answer_type.call(answer) + end + + private + + def convert_by_answer_type + if answer_type.respond_to? :parse + answer_type.parse(answer) + elsif answer_type.is_a? Class + send("to_#{answer_type.name.downcase}") + else + send("to_#{answer_type.class.name.downcase}") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question_asker.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question_asker.rb new file mode 100644 index 000000000..4cd392169 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/question_asker.rb @@ -0,0 +1,152 @@ +# encoding: utf-8 + +class HighLine + # Deals with the task of "asking" a question + class QuestionAsker + # @return [Question] question to be asked + attr_reader :question + + include CustomErrors + + # To do its work QuestionAsker needs a Question + # to be asked and a HighLine context where to + # direct output. + # + # @param question [Question] question to be asked + # @param highline [HighLine] context + def initialize(question, highline) + @question = question + @highline = highline + end + + # + # Gets just one answer, as opposed to #gather_answers + # + # @return [String] answer + def ask_once + # If in readline mode, let reline take care of the prompt + question.show_question(@highline) unless question.readline + + begin + question.get_response_or_default(@highline) + raise NotValidQuestionError unless question.valid_answer? + + question.convert + question.check_range + + if question.confirm + confirmation = @highline.send(:confirm, question) + raise NoConfirmationQuestionError unless confirmation + end + rescue ExplainableError => e + explain_error(e.explanation_key) + retry + rescue ArgumentError => error + case error.message + when /ambiguous/ + # the assumption here is that OptionParser::Completion#complete + # (used for ambiguity resolution) throws exceptions containing + # the word 'ambiguous' whenever resolution fails + explain_error(:ambiguous_completion) + retry + when /invalid value for/ + explain_error(:invalid_type) + retry + else + raise + end + end + + question.answer + end + + ## Multiple questions + + # + # Collects an Array/Hash full of answers as described in + # HighLine::Question.gather(). + # + # @return [Array, Hash] answers + def gather_answers + verify_match = question.verify_match + answers = [] + + # when verify_match is set this loop will repeat until unique_answers == 1 + loop do + answers = gather_answers_based_on_type + + break unless verify_match && + (@highline.send(:unique_answers, answers).size > 1) + + explain_error(:mismatch) + end + + verify_match ? @highline.send(:last_answer, answers) : answers + end + + # Gather multiple integer values based on {Question#gather} count + # @return [Array] answers + def gather_integer + gather_with_array do |answers| + (question.gather - 1).times { answers << ask_once } + end + end + + # Gather multiple values until any of them matches the + # {Question#gather} Regexp. + # @return [Array] answers + def gather_regexp + gather_with_array do |answers| + answers << ask_once until answer_matches_regex(answers.last) + answers.pop + end + end + + # Gather multiple values and store them on a Hash + # with keys provided by the Hash on {Question#gather} + # @return [Hash] + def gather_hash + sorted_keys = question.gather.keys.sort_by(&:to_s) + sorted_keys.each_with_object({}) do |key, answers| + @highline.key = key + answers[key] = ask_once + end + end + + private + + ## Delegate to Highline + def explain_error(explanation_key) # eg: :not_valid, :not_in_range + @highline.say(question.final_response(explanation_key)) + @highline.say(question.ask_on_error_msg) + end + + def gather_with_array + [].tap do |answers| + answers << ask_once + question.template = "" + + yield answers + end + end + + def answer_matches_regex(answer) + if question.gather.is_a?(::String) || question.gather.is_a?(Symbol) + answer.to_s == question.gather.to_s + elsif question.gather.is_a?(Regexp) + answer.to_s =~ question.gather + end + end + + def gather_answers_based_on_type + case question.gather + when Integer + gather_integer + when ::String, Symbol, Regexp + gather_regexp + when Hash + gather_hash + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/simulate.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/simulate.rb new file mode 100644 index 000000000..f92eaa319 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/simulate.rb @@ -0,0 +1,59 @@ +# coding: utf-8 + +#-- +# simulate.rb +# +# Created by Andy Rossmeissl on 2012-04-29. +# Copyright 2005 Gray Productions. All rights reserved. +# +# This is Free Software. See LICENSE and COPYING for details. +# +# adapted from https://gist.github.com/194554 + +class HighLine + # Simulates Highline input for use in tests. + class Simulate + # Creates a simulator with an array of Strings as a script + # @param strings [Array] preloaded string to be used + # as input buffer when simulating. + def initialize(strings) + @strings = strings + end + + # Simulate StringIO#gets by shifting a string off of the script + def gets + @strings.shift + end + + # Simulate StringIO#getbyte by shifting a single character off of + # the next line of the script + def getbyte + line = gets + return if line.empty? + + char = line.slice! 0 + @strings.unshift line + char + end + + # The simulator handles its own EOF + def eof? + false + end + + # A wrapper method that temporarily replaces the Highline + # instance in HighLine.default_instance with an instance of this object + # for the duration of the block + # + # @param strings [String] preloaded string buffer that + # will feed the input operations when simulating. + + def self.with(*strings) + @input = HighLine.default_instance.instance_variable_get :@input + HighLine.default_instance.instance_variable_set :@input, new(strings) + yield + ensure + HighLine.default_instance.instance_variable_set :@input, @input + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/statement.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/statement.rb new file mode 100644 index 000000000..6f1486881 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/statement.rb @@ -0,0 +1,88 @@ +# coding: utf-8 + +require "highline/wrapper" +require "highline/paginator" +require "highline/template_renderer" + +class HighLine + # This class handles proper formatting based + # on a HighLine context, applying wrapping, + # pagination, indentation and color rendering + # when necessary. It's used by {HighLine#render_statement} + # @see HighLine#render_statement + class Statement + # The source object to be stringfied and formatted. + attr_reader :source + + # The HighLine context + # @return [HighLine] + attr_reader :highline + + # The stringfied source object + # @return [String] + attr_reader :template_string + + # It needs the input String and the HighLine context + # @param source [#to_s] + # @param highline [HighLine] context + def initialize(source, highline) + @highline = highline + @source = source + @template_string = stringfy(source) + end + + # Returns the formated statement. + # Applies wrapping, pagination, indentation and color rendering + # based on HighLine instance settings. + # @return [String] formated statement + def statement + @statement ||= format_statement + end + + # (see #statement) + # Delegates to {#statement} + def to_s + statement + end + + def self.const_missing(constant) + HighLine.const_get(constant) + end + + private + + def stringfy(template_string) + String(template_string || "").dup + end + + def format_statement + return template_string if template_string.empty? + + statement = render_template + + statement = HighLine::Wrapper.wrap(statement, highline.wrap_at) + statement = HighLine::Paginator.new(highline).page_print(statement) + + statement = statement.gsub(/\n(?!$)/, "\n#{highline.indentation}") if + highline.multi_indent + + statement + end + + def render_template + # Assigning to a local var so it may be + # used inside instance eval block + + template_renderer = TemplateRenderer.new(template, source, highline) + template_renderer.render + end + + def template + @template ||= if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+ + ERB.new(template_string, trim_mode: "%") + else + ERB.new(template_string, nil, "%") + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/string.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/string.rb new file mode 100644 index 000000000..8d2e0a631 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/string.rb @@ -0,0 +1,36 @@ +# coding: utf-8 + +require "highline/string_extensions" + +class HighLine + # + # HighLine::String is a subclass of String with convenience methods added + # for colorization. + # + # Available convenience methods include: + # * 'color' method e.g. highline_string.color(:bright_blue, + # :underline) + # * colors e.g. highline_string.magenta + # * RGB colors e.g. highline_string.rgb_ff6000 + # or highline_string.rgb(255,96,0) + # * background colors e.g. highline_string.on_magenta + # * RGB background colors e.g. highline_string.on_rgb_ff6000 + # or highline_string.on_rgb(255,96,0) + # * styles e.g. highline_string.underline + # + # Additionally, convenience methods can be chained, for instance the + # following are equivalent: + # highline_string.bright_blue.blink.underline + # highline_string.color(:bright_blue, :blink, :underline) + # HighLine.color(highline_string, :bright_blue, :blink, :underline) + # + # For those less squeamish about possible conflicts, the same convenience + # methods can be added to the built-in String class, as follows: + # + # require 'highline' + # Highline.colorize_strings + # + class String < ::String + include StringExtensions + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/string_extensions.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/string_extensions.rb new file mode 100644 index 000000000..f6c4c6bd7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/string_extensions.rb @@ -0,0 +1,130 @@ +# coding: utf-8 + +class HighLine #:nodoc: + # Returns a HighLine::String from any given String. + # @param s [String] + # @return [HighLine::String] from the given string. + def self.String(s) # rubocop:disable Naming/MethodName + HighLine::String.new(s) + end + + # HighLine extensions for String class. + # Included by HighLine::String. + module StringExtensions + STYLE_METHOD_NAME_PATTERN = /^(on_)?rgb_([0-9a-fA-F]{6})$/ + + # Included hook. Actions to take when being included. + # @param base [Class, Module] base class + def self.included(base) + define_builtin_style_methods(base) + define_style_support_methods(base) + end + + # At include time, it defines all basic style + # support method like #color, #on, #uncolor, + # #rgb, #on_rgb and the #method_missing callback + # @return [void] + # @param base [Class, Module] the base class/module + # + def self.define_style_support_methods(base) + base.class_eval do + undef :color if method_defined? :color + undef :foreground if method_defined? :foreground + def color(*args) + self.class.new(HighLine.color(self, *args)) + end + alias_method :foreground, :color + + undef :on if method_defined? :on + def on(arg) + color(("on_" + arg.to_s).to_sym) + end + + undef :uncolor if method_defined? :uncolor + def uncolor + self.class.new(HighLine.uncolor(self)) + end + + undef :rgb if method_defined? :rgb + def rgb(*colors) + color_code = setup_color_code(*colors) + color("rgb_#{color_code}".to_sym) + end + + undef :on_rgb if method_defined? :on_rgb + def on_rgb(*colors) + color_code = setup_color_code(*colors) + color("on_rgb_#{color_code}".to_sym) + end + + # @todo Chain existing method_missing? + undef :method_missing if method_defined? :method_missing + def method_missing(method, *_args) + if method.to_s =~ STYLE_METHOD_NAME_PATTERN + color(method) + else + super + end + end + + undef :respond_to_missing if method_defined? :respond_to_missing + def respond_to_missing?(method_name, include_private = false) + method_name.to_s =~ STYLE_METHOD_NAME_PATTERN || super + end + + private + + def setup_color_code(*colors) + color_code = colors.map do |color| + if color.is_a?(Numeric) + format("%02x", color) + else + color.to_s + end + end.join + + raise "Bad RGB color #{colors.inspect}" unless + color_code =~ /^[a-fA-F0-9]{6}/ + + color_code + end + end + end + + # At include time, it defines all basic builtin styles. + # @param base [Class, Module] base Class/Module + def self.define_builtin_style_methods(base) + HighLine::COLORS.each do |color| + color = color.downcase + base.class_eval <<-METHOD_DEFINITION + undef :#{color} if method_defined? :#{color} + def #{color} + color(:#{color}) + end + METHOD_DEFINITION + + base.class_eval <<-METHOD_DEFINITION + undef :on_#{color} if method_defined? :on_#{color} + def on_#{color} + on(:#{color}) + end + METHOD_DEFINITION + + HighLine::STYLES.each do |style| + style = style.downcase + base.class_eval <<-METHOD_DEFINITION + undef :#{style} if method_defined? :#{style} + def #{style} + color(:#{style}) + end + METHOD_DEFINITION + end + end + end + end + + # Adds color support to the base String class + def self.colorize_strings + ::String.send(:include, StringExtensions) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/style.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/style.rb new file mode 100644 index 000000000..773cba01a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/style.rb @@ -0,0 +1,325 @@ +# coding: utf-8 + +#-- +# originally color_scheme.rb +# +# Created by Richard LeBer on 2011-06-27. +# Copyright 2011. All rights reserved +# +# This is Free Software. See LICENSE and COPYING for details + +class HighLine #:nodoc: + # Creates a style using {.find_or_create_style} or + # {.find_or_create_style_list} + # @param args [Array] style properties + # @return [Style] + def self.Style(*args) + args = args.compact.flatten + if args.size == 1 + find_or_create_style(args.first) + else + find_or_create_style_list(*args) + end + end + + # Search for a Style with the given properties and return it. + # If there's no matched Style, it creates one. + # You can pass a Style, String or a Hash. + # @param arg [Style, String, Hash] style properties + # @return [Style] found or creted Style + def self.find_or_create_style(arg) + if arg.is_a?(Style) + Style.list[arg.name] || Style.index(arg) + elsif arg.is_a?(::String) && arg =~ /^\e\[/ # arg is a code + styles = Style.code_index[arg] + if styles + styles.first + else + Style.new(code: arg) + end + elsif Style.list[arg] + Style.list[arg] + elsif HighLine.color_scheme && HighLine.color_scheme[arg] + HighLine.color_scheme[arg] + elsif arg.is_a?(Hash) + Style.new(arg) + elsif arg.to_s.downcase =~ /^rgb_([a-f0-9]{6})$/ + Style.rgb(Regexp.last_match(1)) + elsif arg.to_s.downcase =~ /^on_rgb_([a-f0-9]{6})$/ + Style.rgb(Regexp.last_match(1)).on + else + raise NameError, "#{arg.inspect} is not a defined Style" + end + end + + # Find a Style list or create a new one. + # @param args [Array] an Array of Symbols of each style + # that will be on the style list. + # @return [Style] Style list + # @example Creating a Style list of the combined RED and BOLD styles. + # style_list = HighLine.find_or_create_style_list(:red, :bold) + + def self.find_or_create_style_list(*args) + name = args + Style.list[name] || Style.new(list: args) + end + + # ANSI styles to be used by HighLine. + class Style + # Index the given style. + # Uses @code_index (Hash) as repository. + # @param style [Style] + # @return [Style] the given style + def self.index(style) + if style.name + @styles ||= {} + @styles[style.name] = style + end + unless style.list + @code_index ||= {} + @code_index[style.code] ||= [] + @code_index[style.code].reject! do |indexed_style| + indexed_style.name == style.name + end + @code_index[style.code] << style + end + style + end + + # Clear all custom Styles, restoring the Style index to + # builtin styles only. + # @return [void] + def self.clear_index + # reset to builtin only styles + @styles = list.select { |_name, style| style.builtin } + @code_index = {} + @styles.each_value { |style| index(style) } + end + + # Converts all given color codes to hexadecimal and + # join them in a single string. If any given color code + # is already a String, doesn't perform any convertion. + # + # @param colors [Array] color codes + # @return [String] all color codes joined + # @example + # HighLine::Style.rgb_hex(9, 10, "11") # => "090a11" + def self.rgb_hex(*colors) + colors.map do |color| + color.is_a?(Numeric) ? format("%02x", color) : color.to_s + end.join + end + + # Split an rgb code string into its 3 numerical compounds. + # @param hex [String] rgb code string like "010F0F" + # @return [Array] numerical compounds like [1, 15, 15] + # @example + # HighLine::Style.rgb_parts("090A0B") # => [9, 10, 11] + + def self.rgb_parts(hex) + hex.scan(/../).map { |part| part.to_i(16) } + end + + # Search for or create a new Style from the colors provided. + # @param colors (see .rgb_hex) + # @return [Style] a Style with the rgb colors provided. + # @example Creating a new Style based on rgb code + # rgb_style = HighLine::Style.rgb(9, 10, 11) + # + # rgb_style.name # => :rgb_090a0b + # rgb_style.code # => "\e[38;5;16m" + # rgb_style.rgb # => [9, 10, 11] + # + def self.rgb(*colors) + hex = rgb_hex(*colors) + name = ("rgb_" + hex).to_sym + style = list[name] + return style if style + + parts = rgb_parts(hex) + new(name: name, code: "\e[38;5;#{rgb_number(parts)}m", rgb: parts) + end + + # Returns the rgb number to be used as escape code on ANSI terminals. + # @param parts [Array] three numerical codes for red, green + # and blue + # @return [Numeric] to be used as escape code on ANSI terminals + def self.rgb_number(*parts) + parts = parts.flatten + 16 + parts.reduce(0) do |kode, part| + kode * 6 + (part / 256.0 * 6.0).floor + end + end + + # From an ANSI number (color escape code), craft an 'rgb_hex' code of it + # @param ansi_number [Integer] ANSI escape code + # @return [String] all color codes joined as {.rgb_hex} + def self.ansi_rgb_to_hex(ansi_number) + raise "Invalid ANSI rgb code #{ansi_number}" unless + (16..231).cover?(ansi_number) + parts = (ansi_number - 16). + to_s(6). + rjust(3, "0"). + scan(/./). + map { |d| (d.to_i * 255.0 / 6.0).ceil } + + rgb_hex(*parts) + end + + # @return [Hash] list of all cached Styles + def self.list + @styles ||= {} + end + + # @return [Hash] list of all cached Style codes + def self.code_index + @code_index ||= {} + end + + # Remove any ANSI color escape sequence of the given String. + # @param string [String] + # @return [String] + def self.uncolor(string) + string.gsub(/\e\[\d+(;\d+)*m/, "") + end + + # Style name + # @return [Symbol] the name of the Style + attr_reader :name + + # When a compound Style, returns a list of its components. + # @return [Array] components of a Style list + attr_reader :list + + # @return [Array] the three numerical rgb codes. Ex: [10, 12, 127] + attr_accessor :rgb + + # @return [Boolean] true if the Style is builtin or not. + attr_accessor :builtin + + # Single color/styles have :name, :code, :rgb (possibly), :builtin + # Compound styles have :name, :list, :builtin + # + # @param defn [Hash] options for the Style to be created. + def initialize(defn = {}) + @definition = defn + @name = defn[:name] + @code = defn[:code] + @rgb = defn[:rgb] + @list = defn[:list] + @builtin = defn[:builtin] + if @rgb + hex = self.class.rgb_hex(@rgb) + @name ||= "rgb_" + hex + elsif @list + @name ||= @list + end + self.class.index self unless defn[:no_index] + end + + # Duplicate current Style using the same definition used to create it. + # @return [Style] duplicated Style + def dup + self.class.new(@definition) + end + + # @return [Hash] the definition used to create this Style + def to_hash + @definition + end + + # Uses the Style definition to add ANSI color escape codes + # to a a given String + # @param string [String] to be colored + # @return [String] an ANSI colored string + def color(string) + code + string + HighLine::CLEAR + end + + # @return [String] all codes of the Style list joined together + # (if a Style list) + # @return [String] the Style code + def code + if @list + @list.map { |element| HighLine.Style(element).code }.join + else + @code + end + end + + # @return [Integer] the RED component of the rgb code + def red + @rgb && @rgb[0] + end + + # @return [Integer] the GREEN component of the rgb code + def green + @rgb && @rgb[1] + end + + # @return [Integer] the BLUE component of the rgb code + def blue + @rgb && @rgb[2] + end + + # Duplicate Style with some minor changes + # @param new_name [Symbol] + # @param options [Hash] Style attributes to be changed + # @return [Style] new Style with changed attributes + def variant(new_name, options = {}) + raise "Cannot create a variant of a style list (#{inspect})" if @list + new_code = options[:code] || code + if options[:increment] + raise "Unexpected code in #{inspect}" unless + new_code =~ /^(.*?)(\d+)(.*)/ + + new_code = + Regexp.last_match(1) + + (Regexp.last_match(2).to_i + + options[:increment]).to_s + + Regexp.last_match(3) + end + new_rgb = options[:rgb] || @rgb + self.class.new(to_hash.merge(name: new_name, + code: new_code, + rgb: new_rgb)) + end + + # Uses the color as background and return a new style. + # @return [Style] + def on + new_name = ("on_" + @name.to_s).to_sym + self.class.list[new_name] ||= variant(new_name, increment: 10) + end + + # @return [Style] a brighter version of this Style + def bright + create_bright_variant(:bright) + end + + # @return [Style] a lighter version of this Style + def light + create_bright_variant(:light) + end + + private + + def create_bright_variant(variant_name) + raise "Cannot create a #{name} variant of a style list (#{inspect})" if + @list + new_name = ("#{variant_name}_" + @name.to_s).to_sym + new_rgb = + if @rgb == [0, 0, 0] + [128, 128, 128] + else + @rgb.map { |color| color.zero? ? 0 : [color + 128, 255].min } + end + + find_style(new_name) || variant(new_name, increment: 60, rgb: new_rgb) + end + + def find_style(name) + self.class.list[name] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/template_renderer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/template_renderer.rb new file mode 100644 index 000000000..e948c0677 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/template_renderer.rb @@ -0,0 +1,62 @@ +# coding: utf-8 + +require "forwardable" + +class HighLine + # Renders an erb template taking a {Question} and a {HighLine} instance + # as context. + class TemplateRenderer + extend Forwardable + + def_delegators :@highline, :color, :list, :key + def_delegators :@source, :answer_type, :prompt, :header, :answer + + # @return [ERB] ERB template being rendered + attr_reader :template + + # @return [Question, Menu] Question instance used as context + attr_reader :source + + # @return [HighLine] HighLine instance used as context + attr_reader :highline + + # Initializes the TemplateRenderer object with its template and + # HighLine and Question contexts. + # + # @param template [ERB] ERB template. + # @param source [Question] question object. + # @param highline [HighLine] HighLine instance. + + def initialize(template, source, highline) + @template = template + @source = source + @highline = highline + end + + # @return [String] rendered template + def render + template.result(binding) + end + + # Returns an error message when the called method + # is not available. + # @return [String] error message. + def method_missing(method, *args) + "Method #{method} with args #{args.inspect} " \ + "is not available on #{inspect}. " \ + "Try #{methods(false).sort.inspect}" + end + + # @return [Question, Menu] {#source} attribute. + def menu + source + end + + # If some constant is missing at this TemplateRenderer instance, + # get it from HighLine. Useful to get color and style contants. + # @param name [Symbol] automatically passed constant's name as Symbol + def self.const_missing(name) + HighLine.const_get(name) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal.rb new file mode 100644 index 000000000..7e0078fb4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal.rb @@ -0,0 +1,192 @@ +# coding: utf-8 + +#-- +# terminal.rb +# +# Originally created by James Edward Gray II on 2006-06-14 as +# system_extensions.rb. +# Copyright 2006 Gray Productions. All rights reserved. +# +# This is Free Software. See LICENSE and COPYING for details. + +require "highline/compatibility" + +class HighLine + # Basic Terminal class which HighLine will direct + # input and output to. + # The specialized Terminals all decend from this HighLine::Terminal class + class Terminal + # Probe for and return a suitable Terminal instance + # @param input [IO] input stream + # @param output [IO] output stream + def self.get_terminal(input, output) + # First of all, probe for io/console + begin + require "io/console" + require "highline/terminal/io_console" + terminal = HighLine::Terminal::IOConsole.new(input, output) + rescue LoadError + require "highline/terminal/unix_stty" + terminal = HighLine::Terminal::UnixStty.new(input, output) + end + + terminal.initialize_system_extensions + terminal + end + + # @return [IO] input stream + attr_reader :input + + # @return [IO] output stream + attr_reader :output + + # Creates a terminal instance based on given input and output streams. + # @param input [IO] input stream + # @param output [IO] output stream + def initialize(input, output) + @input = input + @output = output + end + + # An initialization callback. + # It is called by {.get_terminal}. + def initialize_system_extensions; end + + # @return [Array] two value terminal + # size like [columns, lines] + def terminal_size + [80, 24] + end + + # Enter Raw No Echo mode. + def raw_no_echo_mode; end + + # Yieds a block to be executed in Raw No Echo mode and + # then restore the terminal state. + def raw_no_echo_mode_exec + raw_no_echo_mode + yield + ensure + restore_mode + end + + # Restore terminal to its default mode + def restore_mode; end + + # Get one character from the terminal + # @return [String] one character + def get_character; end # rubocop:disable Naming/AccessorMethodName + + # Get one line from the terminal and format accordling. + # Use readline if question has readline mode set. + # @param question [HighLine::Question] + # @param highline [HighLine] + def get_line(question, highline) + raw_answer = + if question.readline + get_line_with_readline(question, highline) + else + get_line_default(highline) + end + + question.format_answer(raw_answer) + end + + # Get one line using #readline_read + # @param (see #get_line) + def get_line_with_readline(question, highline) + require "reline" # load only if needed + + raw_answer = readline_read(question, highline) + + if !raw_answer && highline.track_eof? + raise EOFError, "The input stream is exhausted." + end + + raw_answer || "" + end + + # Use readline to read one line + # @param question [HighLine::Question] question from where to get + # autocomplete candidate strings + def readline_read(question, highline) + # prep auto-completion + unless question.selection.empty? + Reline.completion_proc = lambda do |str| + question.selection.grep(/\A#{Regexp.escape(str)}/) + end + end + + # TODO: Check if this is still needed after Reline + # work-around ugly readline() warnings + old_verbose = $VERBOSE + $VERBOSE = nil + + raw_answer = run_preserving_stty do + prompt = highline.render_and_ident_statement(question) + Reline.readline(prompt, true) + end + + $VERBOSE = old_verbose + + raw_answer + end + + # Get one line from terminal using default #gets method. + # @param highline (see #get_line) + def get_line_default(highline) + raise EOFError, "The input stream is exhausted." if highline.track_eof? && + highline.input.eof? + highline.input.gets + end + + # @!group Enviroment queries + + # Running on JRuby? + def jruby? + defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" + end + + # Running on Rubinius? + def rubinius? + defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx" + end + + # Running on Windows? + def windows? + defined?(RUBY_PLATFORM) && (RUBY_PLATFORM =~ /mswin|mingw|cygwin/) + end + + # @!endgroup + + # Returns the class name as String. Useful for debuggin. + # @return [String] class name. Ex: "HighLine::Terminal::IOConsole" + def character_mode + self.class.name + end + + private + + # Yield a block using stty shell commands to preserve the terminal state. + def run_preserving_stty + save_stty + yield + ensure + restore_stty + end + + # Saves terminal state using shell stty command. + def save_stty + @stty_save = begin + `stty -g`.chomp if input.tty? + rescue StandardError + nil + end + end + + # Restores terminal state using shell stty command. + def restore_stty + system("stty", @stty_save) if @stty_save + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/io_console.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/io_console.rb new file mode 100644 index 000000000..9374f0914 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/io_console.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class HighLine + class Terminal + # io/console option for HighLine::Terminal. + # It's the most used terminal. + # TODO: We're rescuing when not a terminal. + # We should make a more robust implementation. + class IOConsole < Terminal + # (see Terminal#terminal_size) + def terminal_size + output.winsize.reverse + rescue Errno::ENOTTY + end + + # (see Terminal#raw_no_echo_mode) + def raw_no_echo_mode + input.echo = false + rescue Errno::ENOTTY + end + + # (see Terminal#restore_mode) + def restore_mode + input.echo = true + rescue Errno::ENOTTY + end + + # (see Terminal#get_character) + def get_character + input.getch(intr: true) # from ruby io/console + rescue Errno::ENOTTY + input.getc + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/ncurses.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/ncurses.rb new file mode 100644 index 000000000..72ffac8b0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/ncurses.rb @@ -0,0 +1,38 @@ +# coding: utf-8 + +class HighLine + class Terminal + # NCurses HighLine::Terminal + # @note Code migrated +UNTESTED+ from the old code base to the new + # terminal api. + class NCurses < Terminal + require "ffi-ncurses" + + # (see Terminal#raw_no_echo_mode) + def raw_no_echo_mode + FFI::NCurses.initscr + FFI::NCurses.cbreak + end + + # (see Terminal#restore_mode) + def restore_mode + FFI::NCurses.endwin + end + + # + # (see Terminal#terminal_size) + # A ncurses savvy method to fetch the console columns, and rows. + # + def terminal_size + size = [80, 40] + FFI::NCurses.initscr + begin + size = FFI::NCurses.getmaxyx(FFI::NCurses.stdscr).reverse + ensure + FFI::NCurses.endwin + end + size + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/unix_stty.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/unix_stty.rb new file mode 100644 index 000000000..df1460b36 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/terminal/unix_stty.rb @@ -0,0 +1,53 @@ +# coding: utf-8 + +class HighLine + class Terminal + # HighLine::Terminal option that uses external "stty" program + # to control terminal options. + class UnixStty < Terminal + # A Unix savvy method using stty to fetch the console columns, and rows. + # ... stty does not work in JRuby + # @return (see Terminal#terminal_size) + def terminal_size + begin + require "io/console" + winsize = begin + IO.console.winsize.reverse + rescue NoMethodError + nil + end + return winsize if winsize + rescue LoadError + end + + if !@output.tty? + [80, 24] + elsif /solaris/ =~ RUBY_PLATFORM && + `stty` =~ /\brows = (\d+).*\bcolumns = (\d+)/ + [Regexp.last_match(2), Regexp.last_match(1)].map(&:to_i) + elsif `stty size` =~ /^(\d+)\s(\d+)$/ + [Regexp.last_match(2).to_i, Regexp.last_match(1).to_i] + else + [80, 24] + end + end + + # (see Terminal#raw_no_echo_mode) + def raw_no_echo_mode + save_stty + system "stty raw -echo -icanon isig" if input.tty? + end + + # (see Terminal#restore_mode) + def restore_mode + restore_stty + print "\r" + end + + # (see Terminal#get_character) + def get_character(input = STDIN) + input.getc + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/version.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/version.rb new file mode 100644 index 000000000..10851f684 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/version.rb @@ -0,0 +1,6 @@ +# coding: utf-8 + +class HighLine + # The version of the installed library. + VERSION = "3.1.2".freeze +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/wrapper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/wrapper.rb new file mode 100644 index 000000000..a2ab4ac10 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/highline-3.1.2/lib/highline/wrapper.rb @@ -0,0 +1,53 @@ +# coding: utf-8 + +require "English" + +class HighLine + # A simple Wrapper module that is aware of ANSI escape codes. + # It compensates for the ANSI escape codes so it works on the + # actual (visual) line length. + module Wrapper + # + # Wrap a sequence of _lines_ at _wrap_at_ characters per line. Existing + # newlines will not be affected by this process, but additional newlines + # may be added. + # + # @param text [String] text to be wrapped + # @param wrap_at [#to_i] column count to wrap the text into + def self.wrap(text, wrap_at) + return text unless wrap_at + wrap_at = Integer(wrap_at) + + wrapped = [] + text.each_line do |line| + # take into account color escape sequences when wrapping + wrap_at += (line.length - actual_length(line)) + while line =~ /([^\n]{#{wrap_at + 1},})/ + search = Regexp.last_match(1).dup + replace = Regexp.last_match(1).dup + index = replace.rindex(" ", wrap_at) + if index + replace[index, 1] = "\n" + replace.sub!(/\n[ \t]+/, "\n") + line.sub!(search, replace) + else + line[$LAST_MATCH_INFO.begin(1) + wrap_at, 0] = "\n" + end + end + wrapped << line + end + wrapped.join + end + + # + # Returns the length of the passed +string_with_escapes+, minus and color + # sequence escapes. + # + # @param string_with_escapes [String] any ANSI colored String + # @return [Integer] length based on the visual size of the String + # (without the escape codes) + def self.actual_length(string_with_escapes) + string_with_escapes.to_s.gsub(/\e\[\d{1,2}m/, "").length + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/MIT-LICENSE.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/MIT-LICENSE.txt new file mode 100644 index 000000000..a8889b2a7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (C) 2013 Michael Grosser + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/lib/parallel.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/lib/parallel.rb new file mode 100644 index 000000000..d0c3f373a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/lib/parallel.rb @@ -0,0 +1,708 @@ +# frozen_string_literal: true +require 'rbconfig' +require 'parallel/version' + +module Parallel + Stop = Object.new.freeze + + class DeadWorker < StandardError + end + + class Break < StandardError + attr_reader :value + + def initialize(value = nil) + super() + @value = value + end + end + + class Kill < Break + end + + class UndumpableException < StandardError + attr_reader :backtrace + + def initialize(original) + super("#{original.class}: #{original.message}") + @backtrace = original.backtrace + end + end + + class ExceptionWrapper + attr_reader :exception + + def initialize(exception) + # Remove the bindings stack added by the better_errors gem, + # because it cannot be marshalled + if exception.instance_variable_defined? :@__better_errors_bindings_stack + exception.send :remove_instance_variable, :@__better_errors_bindings_stack + end + + @exception = + begin + Marshal.dump(exception) && exception + rescue StandardError + UndumpableException.new(exception) + end + end + end + + class Worker + attr_reader :pid, :read, :write + attr_accessor :thread + + def initialize(read, write, pid) + @read = read + @write = write + @pid = pid + end + + def stop + close_pipes + wait # if it goes zombie, rather wait here to be able to debug + end + + # might be passed to started_processes and simultaneously closed by another thread + # when running in isolation mode, so we have to check if it is closed before closing + def close_pipes + read.close unless read.closed? + write.close unless write.closed? + end + + def work(data) + begin + Marshal.dump(data, write) + rescue Errno::EPIPE + raise DeadWorker + end + + result = begin + Marshal.load(read) + rescue EOFError + raise DeadWorker + end + raise result.exception if result.is_a?(ExceptionWrapper) + result + end + + private + + def wait + Process.wait(pid) + rescue Interrupt + # process died + end + end + + class JobFactory + def initialize(source, mutex) + @lambda = (source.respond_to?(:call) && source) || queue_wrapper(source) + @source = source.to_a unless @lambda # turn Range and other Enumerable-s into an Array + @mutex = mutex + @index = -1 + @stopped = false + end + + def next + if producer? + # - index and item stay in sync + # - do not call lambda after it has returned Stop + item, index = @mutex.synchronize do + return if @stopped + item = @lambda.call + @stopped = (item == Stop) + return if @stopped + [item, @index += 1] + end + else + index = @mutex.synchronize { @index += 1 } + return if index >= size + item = @source[index] + end + [item, index] + end + + def size + if producer? + Float::INFINITY + else + @source.size + end + end + + # generate item that is sent to workers + # just index is faster + less likely to blow up with unserializable errors + def pack(item, index) + producer? ? [item, index] : index + end + + # unpack item that is sent to workers + def unpack(data) + producer? ? data : [@source[data], data] + end + + private + + def producer? + @lambda + end + + def queue_wrapper(array) + array.respond_to?(:num_waiting) && array.respond_to?(:pop) && -> { array.pop(false) } + end + end + + class UserInterruptHandler + INTERRUPT_SIGNAL = :SIGINT + + class << self + # kill all these pids or threads if user presses Ctrl+c + def kill_on_ctrl_c(pids, options) + @to_be_killed ||= [] + old_interrupt = nil + signal = options.fetch(:interrupt_signal, INTERRUPT_SIGNAL) + + if @to_be_killed.empty? + old_interrupt = trap_interrupt(signal) do + warn 'Parallel execution interrupted, exiting ...' + @to_be_killed.flatten.each { |pid| kill(pid) } + end + end + + @to_be_killed << pids + + yield + ensure + @to_be_killed.pop # do not kill pids that could be used for new processes + restore_interrupt(old_interrupt, signal) if @to_be_killed.empty? + end + + def kill(thing) + Process.kill(:KILL, thing) + rescue Errno::ESRCH + # some linux systems already automatically killed the children at this point + # so we just ignore them not being there + end + + private + + def trap_interrupt(signal) + old = Signal.trap signal, 'IGNORE' + + Signal.trap signal do + yield + if !old || old == "DEFAULT" + raise Interrupt + else + old.call + end + end + + old + end + + def restore_interrupt(old, signal) + Signal.trap signal, old + end + end + end + + class << self + def in_threads(options = { count: 2 }) + threads = [] + count, = extract_count_from_options(options) + + Thread.handle_interrupt(Exception => :never) do + Thread.handle_interrupt(Exception => :immediate) do + count.times do |i| + threads << Thread.new { yield(i) } + end + threads.map(&:value) + end + ensure + threads.each(&:kill) + end + end + + def in_processes(options = {}, &block) + count, options = extract_count_from_options(options) + count ||= processor_count + map(0...count, options.merge(in_processes: count), &block) + end + + def each(array, options = {}, &block) + map(array, options.merge(preserve_results: false), &block) + end + + def any?(*args, &block) + raise "You must provide a block when calling #any?" if block.nil? + !each(*args) { |*a| raise Kill if block.call(*a) } + end + + def all?(*args, &block) + raise "You must provide a block when calling #all?" if block.nil? + !!each(*args) { |*a| raise Kill unless block.call(*a) } + end + + def each_with_index(array, options = {}, &block) + each(array, options.merge(with_index: true), &block) + end + + def map(source, options = {}, &block) + options = options.dup + options[:mutex] = Mutex.new + + if options[:in_processes] && options[:in_threads] + raise ArgumentError, "Please specify only one of `in_processes` or `in_threads`." + elsif RUBY_PLATFORM =~ (/java/) && !options[:in_processes] + method = :in_threads + size = options[method] || processor_count + elsif options[:in_threads] + method = :in_threads + size = options[method] + elsif options[:in_ractors] + method = :in_ractors + size = options[method] + else + method = :in_processes + if Process.respond_to?(:fork) + size = options[method] || processor_count + else + warn "Process.fork is not supported by this Ruby" + size = 0 + end + end + + job_factory = JobFactory.new(source, options[:mutex]) + size = [job_factory.size, size].min + + options[:return_results] = (options[:preserve_results] != false || !!options[:finish]) + add_progress_bar!(job_factory, options) + + result = + if size == 0 + work_direct(job_factory, options, &block) + elsif method == :in_threads + work_in_threads(job_factory, options.merge(count: size), &block) + elsif method == :in_ractors + work_in_ractors(job_factory, options.merge(count: size), &block) + else + work_in_processes(job_factory, options.merge(count: size), &block) + end + + return result.value if result.is_a?(Break) + raise result if result.is_a?(Exception) + options[:return_results] ? result : source + end + + def map_with_index(array, options = {}, &block) + map(array, options.merge(with_index: true), &block) + end + + def flat_map(...) + map(...).flatten(1) + end + + def filter_map(...) + map(...).compact + end + + # Number of physical processor cores on the current system. + def physical_processor_count + @physical_processor_count ||= begin + ppc = + case RbConfig::CONFIG["target_os"] + when /darwin[12]/ + IO.popen("/usr/sbin/sysctl -n hw.physicalcpu").read.to_i + when /linux/ + cores = {} # unique physical ID / core ID combinations + phy = 0 + File.read("/proc/cpuinfo").scan(/^physical id.*|^core id.*/) do |ln| + if ln.start_with?("physical") + phy = ln[/\d+/] + elsif ln.start_with?("core") + cid = "#{phy}:#{ln[/\d+/]}" + cores[cid] = true unless cores[cid] + end + end + cores.count + when /mswin|mingw/ + physical_processor_count_windows + else + processor_count + end + # fall back to logical count if physical info is invalid + ppc > 0 ? ppc : processor_count + end + end + + # Number of processors seen by the OS or value considering CPU quota if the process is inside a cgroup, + # used for process scheduling + def processor_count + @processor_count ||= Integer(ENV['PARALLEL_PROCESSOR_COUNT'] || available_processor_count) + end + + def worker_number + Thread.current[:parallel_worker_number] + end + + # TODO: this does not work when doing threads in forks, so should remove and yield the number instead if needed + def worker_number=(worker_num) + Thread.current[:parallel_worker_number] = worker_num + end + + private + + def physical_processor_count_windows + # Get-CimInstance introduced in PowerShell 3 or earlier: https://learn.microsoft.com/en-us/previous-versions/powershell/module/cimcmdlets/get-ciminstance?view=powershell-3.0 + result = run( + 'powershell -command "Get-CimInstance -ClassName Win32_Processor -Property NumberOfCores ' \ + '| Select-Object -Property NumberOfCores"' + ) + if !result || $?.exitstatus != 0 + # fallback to deprecated wmic for older systems + result = run("wmic cpu get NumberOfCores") + end + if !result || $?.exitstatus != 0 + # Bail out if both commands returned something unexpected + warn "guessing pyhsical processor count" + processor_count + else + # powershell: "\nNumberOfCores\n-------------\n 4\n\n\n" + # wmic: "NumberOfCores \n\n4 \n\n\n\n" + result.scan(/\d+/).map(&:to_i).reduce(:+) + end + end + + def run(command) + IO.popen(command, &:read) + rescue Errno::ENOENT + # Ignore + end + + def add_progress_bar!(job_factory, options) + if (progress_options = options[:progress]) + raise "Progressbar can only be used with array like items" if job_factory.size == Float::INFINITY + require 'ruby-progressbar' + + if progress_options == true + progress_options = { title: "Progress" } + elsif progress_options.respond_to? :to_str + progress_options = { title: progress_options.to_str } + end + + progress_options = { + total: job_factory.size, + format: '%t |%E | %B | %a' + }.merge(progress_options) + + progress = ProgressBar.create(progress_options) + old_finish = options[:finish] + options[:finish] = lambda do |item, i, result| + old_finish.call(item, i, result) if old_finish + progress.increment + end + end + end + + def work_direct(job_factory, options, &block) + self.worker_number = 0 + results = [] + exception = nil + begin + while (set = job_factory.next) + item, index = set + results << with_instrumentation(item, index, options) do + call_with_index(item, index, options, &block) + end + end + rescue StandardError + exception = $! + end + exception || results + ensure + self.worker_number = nil + end + + def work_in_threads(job_factory, options, &block) + raise "interrupt_signal is no longer supported for threads" if options[:interrupt_signal] + results = [] + results_mutex = Mutex.new # arrays are not thread-safe on jRuby + exception = nil + + in_threads(options) do |worker_num| + self.worker_number = worker_num + # as long as there are more jobs, work on one of them + while !exception && (set = job_factory.next) + begin + item, index = set + result = with_instrumentation item, index, options do + call_with_index(item, index, options, &block) + end + results_mutex.synchronize { results[index] = result } + rescue StandardError + exception = $! + end + end + end + + exception || results + end + + def work_in_ractors(job_factory, options) + exception = nil + results = [] + results_mutex = Mutex.new # arrays are not thread-safe on jRuby + + callback = options[:ractor] + if block_given? || !callback + raise ArgumentError, "pass the code you want to execute as `ractor: [ClassName, :method_name]`" + end + + # build + ractors = Array.new(options.fetch(:count)) do + Ractor.new do + loop do + got = receive + (klass, method_name), item, index = got + break if index == :break + begin + Ractor.yield [nil, klass.send(method_name, item), item, index] + rescue StandardError => e + Ractor.yield [e, nil, item, index] + end + end + end + end + + # start + ractors.dup.each do |ractor| + if (set = job_factory.next) + item, index = set + instrument_start item, index, options + ractor.send [callback, item, index] + else + ractor.send([[nil, nil], nil, :break]) # stop the ractor + ractors.delete ractor + end + end + + # replace with new items + while (set = job_factory.next) + item_next, index_next = set + done, (exception, result, item, index) = Ractor.select(*ractors) + if exception + ractors.delete done + break + end + instrument_finish item, index, result, options + results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) } + + instrument_start item_next, index_next, options + done.send([callback, item_next, index_next]) + end + + # finish + ractors.each do |ractor| + (new_exception, result, item, index) = ractor.take + exception ||= new_exception + next if new_exception + instrument_finish item, index, result, options + results_mutex.synchronize { results[index] = (options[:preserve_results] == false ? nil : result) } + ractor.send([[nil, nil], nil, :break]) # stop the ractor + end + + exception || results + end + + def work_in_processes(job_factory, options, &blk) + workers = create_workers(job_factory, options, &blk) + results = [] + results_mutex = Mutex.new # arrays are not thread-safe + exception = nil + + UserInterruptHandler.kill_on_ctrl_c(workers.map(&:pid), options) do + in_threads(options) do |i| + worker = workers[i] + worker.thread = Thread.current + worked = false + + begin + loop do + break if exception + item, index = job_factory.next + break unless index + + if options[:isolation] + worker = replace_worker(job_factory, workers, i, options, blk) if worked + worked = true + worker.thread = Thread.current + end + + begin + result = with_instrumentation item, index, options do + worker.work(job_factory.pack(item, index)) + end + results_mutex.synchronize { results[index] = result } # arrays are not threads safe on jRuby + rescue StandardError => e + exception = e + if exception.is_a?(Kill) + (workers - [worker]).each do |w| + w.thread&.kill + UserInterruptHandler.kill(w.pid) + end + end + end + end + ensure + worker.stop + end + end + end + + exception || results + end + + def replace_worker(job_factory, workers, index, options, blk) + options[:mutex].synchronize do + # old worker is no longer used ... stop it + worker = workers[index] + worker.stop + + # create a new replacement worker + running = workers - [worker] + workers[index] = worker(job_factory, options.merge(started_workers: running, worker_number: index), &blk) + end + end + + def create_workers(job_factory, options, &block) + workers = [] + Array.new(options[:count]).each_with_index do |_, i| + workers << worker(job_factory, options.merge(started_workers: workers, worker_number: i), &block) + end + workers + end + + def worker(job_factory, options, &block) + child_read, parent_write = IO.pipe + parent_read, child_write = IO.pipe + + pid = Process.fork do + self.worker_number = options[:worker_number] + + begin + options.delete(:started_workers).each(&:close_pipes) + + parent_write.close + parent_read.close + + process_incoming_jobs(child_read, child_write, job_factory, options, &block) + ensure + child_read.close + child_write.close + end + end + + child_read.close + child_write.close + + Worker.new(parent_read, parent_write, pid) + end + + def process_incoming_jobs(read, write, job_factory, options, &block) + until read.eof? + data = Marshal.load(read) + item, index = job_factory.unpack(data) + + result = + begin + call_with_index(item, index, options, &block) + # https://github.com/rspec/rspec-support/blob/673133cdd13b17077b3d88ece8d7380821f8d7dc/lib/rspec/support.rb#L132-L140 + rescue NoMemoryError, SignalException, Interrupt, SystemExit # rubocop:disable Lint/ShadowedException + raise $! + rescue Exception # # rubocop:disable Lint/RescueException + ExceptionWrapper.new($!) + end + + begin + Marshal.dump(result, write) + rescue Errno::EPIPE + return # parent thread already dead + end + end + end + + # options is either a Integer or a Hash with :count + def extract_count_from_options(options) + if options.is_a?(Hash) + count = options[:count] + else + count = options + options = {} + end + [count, options] + end + + def call_with_index(item, index, options, &block) + args = [item] + args << index if options[:with_index] + results = block.call(*args) + if options[:return_results] + results + else + nil # avoid GC overhead of passing large results around + end + end + + def with_instrumentation(item, index, options) + instrument_start(item, index, options) + result = yield + instrument_finish(item, index, result, options) + result unless options[:preserve_results] == false + end + + def instrument_finish(item, index, result, options) + return unless (on_finish = options[:finish]) + return instrument_finish_in_order(item, index, result, options) if options[:finish_in_order] + options[:mutex].synchronize { on_finish.call(item, index, result) } + end + + # yield results in the order of the input items + # needs to use `options` to store state between executions + # needs to use `done` index since a nil result would also be valid + def instrument_finish_in_order(item, index, result, options) + options[:mutex].synchronize do + # initialize our state + options[:finish_done] ||= [] + options[:finish_expecting] ||= 0 # we wait for item at index 0 + + # store current result + options[:finish_done][index] = [item, result] + + # yield all results that are now in order + break unless index == options[:finish_expecting] + index.upto(options[:finish_done].size).each do |i| + break unless (done = options[:finish_done][i]) + options[:finish_done][i] = nil # allow GC to free this item and result + options[:finish].call(done[0], i, done[1]) + options[:finish_expecting] += 1 + end + end + end + + def instrument_start(item, index, options) + return unless (on_start = options[:start]) + options[:mutex].synchronize { on_start.call(item, index) } + end + + def available_processor_count + gem 'concurrent-ruby', '>= 1.3.4' + require 'concurrent-ruby' + Concurrent.available_processor_count.floor + rescue LoadError + require 'etc' + Etc.nprocessors + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/lib/parallel/version.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/lib/parallel/version.rb new file mode 100644 index 000000000..4397fbbbc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/parallel-1.27.0/lib/parallel/version.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true +module Parallel + VERSION = Version = '1.27.0' # rubocop:disable Naming/ConstantName +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/BSDL b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/BSDL new file mode 100644 index 000000000..a009caefe --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/BSDL @@ -0,0 +1,22 @@ +Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/COPYING b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/COPYING new file mode 100644 index 000000000..426810a7f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/COPYING @@ -0,0 +1,56 @@ +Ruby is copyrighted free software by Yukihiro Matsumoto . +You can redistribute it and/or modify it under either the terms of the +2-clause BSDL (see the file BSDL), or the conditions below: + + 1. You may make and give away verbatim copies of the source form of the + software without restriction, provided that you duplicate all of the + original copyright notices and associated disclaimers. + + 2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b) use the modified software only within your corporation or + organization. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + + 3. You may distribute the software in object code or binary form, + provided that you do at least ONE of the following: + + a) distribute the binaries and library files of the software, + together with instructions (in the manual page or equivalent) + on where to get the original distribution. + + b) accompany the distribution with the machine-readable source of + the software. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + + 4. You may modify and include the part of the software into any other + software (possibly commercial). But some files in the distribution + are not written by the author, so that they are not under these terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + + 5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whomever generated them, + and may be sold commercially, and may be aggregated with this + software. + + 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/README.md new file mode 100644 index 000000000..f4b405065 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/README.md @@ -0,0 +1,94 @@ +[![Gem Version](https://badge.fury.io/rb/reline.svg)](https://badge.fury.io/rb/reline) +[![CI](https://github.com/ruby/reline/actions/workflows/reline.yml/badge.svg)](https://github.com/ruby/reline/actions/workflows/reline.yml) + +This is a screen capture of *IRB improved by Reline*. + +![IRB improved by Reline](https://raw.githubusercontent.com/wiki/ruby/reline/images/irb_improved_by_reline.gif) + +# Reline + +Reline is compatible with the API of Ruby's stdlib 'readline', GNU Readline and Editline by pure Ruby implementation. + +## Usage + +### Single line editing mode + +It's compatible with the readline standard library. + +See [the document of readline stdlib](https://ruby-doc.org/stdlib/exts/readline/Readline.html) or [bin/example](https://github.com/ruby/reline/blob/master/bin/example). + +### Multi-line editing mode + +```ruby +require "reline" + +prompt = 'prompt> ' +use_history = true + +begin + while true + text = Reline.readmultiline(prompt, use_history) do |multiline_input| + # Accept the input until `end` is entered + multiline_input.split.last == "end" + end + + puts 'You entered:' + puts text + end +# If you want to exit, type Ctrl-C +rescue Interrupt + puts '^C' + exit 0 +end +``` + +```bash +$ ruby example.rb +prompt> aaa +prompt> bbb +prompt> end +You entered: +aaa +bbb +end +``` + +See also: [test/reline/yamatanooroti/multiline_repl](https://github.com/ruby/reline/blob/master/test/reline/yamatanooroti/multiline_repl) + +## Documentation + +### Reline::Face + +You can modify the text color and text decorations in your terminal emulator. +See [doc/reline/face.md](./doc/reline/face.md) + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/reline. + +### Run tests + +> **Note** +> Please make sure you have `libvterm` installed for `yamatanooroti` tests (integration tests). + +If you use Homebrew, you can install it by running `brew install libvterm`. + +```bash +WITH_VTERM=1 bundle install +WITH_VTERM=1 bundle exec rake test test_yamatanooroti +``` + +## Releasing + +```bash +rake release +gh release create vX.Y.Z --generate-notes +``` + +## License + +The gem is available as open source under the terms of the [Ruby License](https://www.ruby-lang.org/en/about/license.txt). + +## Acknowledgments for [rb-readline](https://github.com/ConnorAtherton/rb-readline) + +In developing Reline, we have used some of the rb-readline implementation, so this library includes [copyright notice, list of conditions and the disclaimer](license_of_rb-readline) under the 3-Clause BSD License. Reline would never have been developed without rb-readline. Thank you for the tremendous accomplishments. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline.rb new file mode 100644 index 000000000..03e4b745c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline.rb @@ -0,0 +1,527 @@ +require 'io/console' +require 'forwardable' +require 'reline/version' +require 'reline/config' +require 'reline/key_actor' +require 'reline/key_stroke' +require 'reline/line_editor' +require 'reline/history' +require 'reline/io' +require 'reline/face' +require 'rbconfig' + +module Reline + # NOTE: For making compatible with the rb-readline gem + FILENAME_COMPLETION_PROC = nil # :nodoc: + USERNAME_COMPLETION_PROC = nil # :nodoc: + + class ConfigEncodingConversionError < StandardError; end # :nodoc: + + # EOF key: { char: nil, method_symbol: nil } + # Other key: { char: String, method_symbol: Symbol } + Key = Struct.new(:char, :method_symbol, :unused_boolean) do + # For dialog_proc `key.match?(dialog.name)` + def match?(sym) + method_symbol && method_symbol == sym + end + end # :nodoc: + CursorPos = Struct.new(:x, :y) # :nodoc: + DialogRenderInfo = Struct.new( + :pos, + :contents, + :face, + :bg_color, # For the time being, this line should stay here for the compatibility with IRB. + :width, + :height, + :scrollbar, + keyword_init: true + ) # :nodoc: + + class Core + ATTR_READER_NAMES = %i( + completion_append_character + basic_word_break_characters + completer_word_break_characters + basic_quote_characters + completer_quote_characters + filename_quote_characters + special_prefixes + completion_proc + output_modifier_proc + prompt_proc + auto_indent_proc + pre_input_hook + dig_perfect_match_proc + ).each(&method(:attr_reader)) + + attr_accessor :config + attr_accessor :key_stroke + attr_accessor :line_editor + attr_accessor :last_incremental_search + attr_reader :output + + extend Forwardable + def_delegators :config, + :autocompletion, + :autocompletion= + + def initialize + self.output = STDOUT + @mutex = Mutex.new + @dialog_proc_list = {} + yield self + @completion_quote_character = nil + end + + def io_gate + Reline::IOGate + end + + def encoding + io_gate.encoding + end + + def completion_append_character=(val) + if val.nil? + @completion_append_character = nil + elsif val.size == 1 + @completion_append_character = val.encode(encoding) + elsif val.size > 1 + @completion_append_character = val[0].encode(encoding) + else + @completion_append_character = nil + end + end + + def basic_word_break_characters=(v) + @basic_word_break_characters = v.encode(encoding) + end + + def completer_word_break_characters=(v) + @completer_word_break_characters = v.encode(encoding) + end + + def basic_quote_characters=(v) + @basic_quote_characters = v.encode(encoding) + end + + def completer_quote_characters=(v) + @completer_quote_characters = v.encode(encoding) + end + + def filename_quote_characters=(v) + @filename_quote_characters = v.encode(encoding) + end + + def special_prefixes=(v) + @special_prefixes = v.encode(encoding) + end + + def completion_case_fold=(v) + @config.completion_ignore_case = v + end + + def completion_case_fold + @config.completion_ignore_case + end + + def completion_quote_character + @completion_quote_character + end + + def completion_proc=(p) + raise ArgumentError unless p.respond_to?(:call) or p.nil? + @completion_proc = p + end + + def output_modifier_proc=(p) + raise ArgumentError unless p.respond_to?(:call) or p.nil? + @output_modifier_proc = p + end + + def prompt_proc=(p) + raise ArgumentError unless p.respond_to?(:call) or p.nil? + @prompt_proc = p + end + + def auto_indent_proc=(p) + raise ArgumentError unless p.respond_to?(:call) or p.nil? + @auto_indent_proc = p + end + + def pre_input_hook=(p) + @pre_input_hook = p + end + + def dig_perfect_match_proc=(p) + raise ArgumentError unless p.respond_to?(:call) or p.nil? + @dig_perfect_match_proc = p + end + + DialogProc = Struct.new(:dialog_proc, :context) + def add_dialog_proc(name_sym, p, context = nil) + raise ArgumentError unless name_sym.instance_of?(Symbol) + if p.nil? + @dialog_proc_list.delete(name_sym) + else + raise ArgumentError unless p.respond_to?(:call) + @dialog_proc_list[name_sym] = DialogProc.new(p, context) + end + end + + def dialog_proc(name_sym) + @dialog_proc_list[name_sym] + end + + def input=(val) + raise TypeError unless val.respond_to?(:getc) or val.nil? + if val.respond_to?(:getc) && io_gate.respond_to?(:input=) + io_gate.input = val + end + end + + def output=(val) + raise TypeError unless val.respond_to?(:write) or val.nil? + @output = val + io_gate.output = val + end + + def vi_editing_mode + config.editing_mode = :vi_insert + nil + end + + def emacs_editing_mode + config.editing_mode = :emacs + nil + end + + def vi_editing_mode? + config.editing_mode_is?(:vi_insert, :vi_command) + end + + def emacs_editing_mode? + config.editing_mode_is?(:emacs) + end + + def get_screen_size + io_gate.get_screen_size + end + + Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE = ->() { + # autocomplete + return unless config.autocompletion + + journey_data = completion_journey_data + return unless journey_data + + target = journey_data.list.first + completed = journey_data.list[journey_data.pointer] + result = journey_data.list.drop(1) + pointer = journey_data.pointer - 1 + return if completed.empty? || (result == [completed] && pointer < 0) + + target_width = Reline::Unicode.calculate_width(target) + completed_width = Reline::Unicode.calculate_width(completed) + if cursor_pos.x <= completed_width - target_width + # When target is rendered on the line above cursor position + x = screen_width - completed_width + y = -1 + else + x = [cursor_pos.x - completed_width, 0].max + y = 0 + end + cursor_pos_to_render = Reline::CursorPos.new(x, y) + if context and context.is_a?(Array) + context.clear + context.push(cursor_pos_to_render, result, pointer, dialog) + end + dialog.pointer = pointer + DialogRenderInfo.new( + pos: cursor_pos_to_render, + contents: result, + scrollbar: true, + height: [15, preferred_dialog_height].min, + face: :completion_dialog + ) + } # :nodoc: + Reline::DEFAULT_DIALOG_CONTEXT = Array.new # :nodoc: + + def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination) + @mutex.synchronize do + unless confirm_multiline_termination + raise ArgumentError.new('#readmultiline needs block to confirm multiline termination') + end + + io_gate.with_raw_input do + inner_readline(prompt, add_hist, true, &confirm_multiline_termination) + end + + whole_buffer = line_editor.whole_buffer.dup + whole_buffer.taint if RUBY_VERSION < '2.7' + if add_hist and whole_buffer and whole_buffer.chomp("\n").size > 0 + Reline::HISTORY << whole_buffer + end + + if line_editor.eof? + line_editor.reset_line + # Return nil if the input is aborted by C-d. + nil + else + whole_buffer + end + end + end + + def readline(prompt = '', add_hist = false) + @mutex.synchronize do + io_gate.with_raw_input do + inner_readline(prompt, add_hist, false) + end + + line = line_editor.line.dup + line.taint if RUBY_VERSION < '2.7' + if add_hist and line and line.chomp("\n").size > 0 + Reline::HISTORY << line.chomp("\n") + end + + line_editor.reset_line if line_editor.line.nil? + line + end + end + + private def inner_readline(prompt, add_hist, multiline, &confirm_multiline_termination) + if ENV['RELINE_STDERR_TTY'] + if io_gate.win? + $stderr = File.open(ENV['RELINE_STDERR_TTY'], 'a') + else + $stderr.reopen(ENV['RELINE_STDERR_TTY'], 'w') + end + $stderr.sync = true + $stderr.puts "Reline is used by #{Process.pid}" + end + unless config.test_mode or config.loaded? + config.read + io_gate.set_default_key_bindings(config) + end + otio = io_gate.prep + + may_req_ambiguous_char_width + key_stroke.encoding = encoding + line_editor.reset(prompt) + if multiline + line_editor.multiline_on + if block_given? + line_editor.confirm_multiline_termination_proc = confirm_multiline_termination + end + else + line_editor.multiline_off + end + line_editor.completion_proc = completion_proc + line_editor.completion_append_character = completion_append_character + line_editor.output_modifier_proc = output_modifier_proc + line_editor.prompt_proc = prompt_proc + line_editor.auto_indent_proc = auto_indent_proc + line_editor.dig_perfect_match_proc = dig_perfect_match_proc + + pre_input_hook&.call + + unless Reline::IOGate.dumb? + @dialog_proc_list.each_pair do |name_sym, d| + line_editor.add_dialog_proc(name_sym, d.dialog_proc, d.context) + end + end + + line_editor.update_dialogs + line_editor.rerender + + begin + line_editor.set_signal_handlers + loop do + read_io(config.keyseq_timeout) { |inputs| + inputs.each do |key| + case key.method_symbol + when :bracketed_paste_start + # io_gate is Reline::ANSI because the key :bracketed_paste_start is only assigned in Reline::ANSI + key = Reline::Key.new(io_gate.read_bracketed_paste, :insert_multiline_text) + when :quoted_insert, :ed_quoted_insert + char = io_gate.read_single_char(config.keyseq_timeout.fdiv(1000)) + key = Reline::Key.new(char || '', :insert_raw_char) + end + line_editor.set_pasting_state(io_gate.in_pasting?) + line_editor.update(key) + end + } + if line_editor.finished? + line_editor.render_finished + break + else + line_editor.rerender + end + end + io_gate.move_cursor_column(0) + rescue Errno::EIO + # Maybe the I/O has been closed. + ensure + line_editor.finalize + io_gate.deprep(otio) + end + end + + # GNU Readline watis for "keyseq-timeout" milliseconds when the input is + # ambiguous whether it is matching or matched. + # If the next character does not arrive within the specified timeout, input + # is considered as matched. + # `ESC` is ambiguous because it can be a standalone ESC (matched) or part of + # `ESC char` or part of CSI sequence (matching). + private def read_io(keyseq_timeout, &block) + buffer = [] + status = KeyStroke::MATCHING + loop do + timeout = status == KeyStroke::MATCHING_MATCHED ? keyseq_timeout.fdiv(1000) : Float::INFINITY + c = io_gate.getc(timeout) + if c.nil? || c == -1 + if status == KeyStroke::MATCHING_MATCHED + status = KeyStroke::MATCHED + elsif buffer.empty? + # io_gate is closed and reached EOF + block.call([Key.new(nil, nil, false)]) + return + else + status = KeyStroke::UNMATCHED + end + else + buffer << c + status = key_stroke.match_status(buffer) + end + + if status == KeyStroke::MATCHED || status == KeyStroke::UNMATCHED + expanded, rest_bytes = key_stroke.expand(buffer) + rest_bytes.reverse_each { |c| io_gate.ungetc(c) } + block.call(expanded) + return + end + end + end + + def ambiguous_width + may_req_ambiguous_char_width unless defined? @ambiguous_width + @ambiguous_width + end + + private def may_req_ambiguous_char_width + @ambiguous_width = 1 if io_gate.dumb? || !STDIN.tty? || !STDOUT.tty? + return if defined? @ambiguous_width + io_gate.move_cursor_column(0) + begin + output.write "\u{25bd}" + rescue Encoding::UndefinedConversionError + # LANG=C + @ambiguous_width = 1 + else + @ambiguous_width = io_gate.cursor_pos.x == 2 ? 2 : 1 + end + io_gate.move_cursor_column(0) + io_gate.erase_after_cursor + end + end + + extend Forwardable + extend SingleForwardable + + #-------------------------------------------------------- + # Documented API + #-------------------------------------------------------- + + (Core::ATTR_READER_NAMES).each { |name| + def_single_delegators :core, :"#{name}", :"#{name}=" + } + def_single_delegators :core, :input=, :output= + def_single_delegators :core, :vi_editing_mode, :emacs_editing_mode + + ## + # :singleton-method: readmultiline + # :call-seq: + # readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination) -> string or nil + def_single_delegators :core, :readmultiline + + ## + # :singleton-method: readline + # :call-seq: + # readline(prompt = '', add_hist = false) -> string or nil + def_single_delegators :core, :readline + def_single_delegators :core, :completion_case_fold, :completion_case_fold= + def_single_delegators :core, :completion_quote_character + def_instance_delegators self, :readline + private :readline + + + #-------------------------------------------------------- + # Undocumented API + #-------------------------------------------------------- + + # Testable in original + def_single_delegators :core, :get_screen_size + def_single_delegators :line_editor, :eof? + def_instance_delegators self, :eof? + def_single_delegators :line_editor, :delete_text + def_single_delegator :line_editor, :line, :line_buffer + def_single_delegator :line_editor, :byte_pointer, :point + def_single_delegator :line_editor, :byte_pointer=, :point= + + def self.insert_text(text) + line_editor.insert_multiline_text(text) + self + end + + # Untestable in original + def_single_delegator :line_editor, :rerender, :redisplay + def_single_delegators :core, :vi_editing_mode?, :emacs_editing_mode? + def_single_delegators :core, :ambiguous_width + def_single_delegators :core, :last_incremental_search + def_single_delegators :core, :last_incremental_search= + def_single_delegators :core, :add_dialog_proc + def_single_delegators :core, :dialog_proc + def_single_delegators :core, :autocompletion, :autocompletion= + + def_instance_delegators self, :readmultiline + private :readmultiline + + def self.encoding_system_needs # :nodoc: + self.core.encoding + end + + def self.core + @core ||= Core.new { |core| + core.config = Reline::Config.new + core.key_stroke = Reline::KeyStroke.new(core.config, core.encoding) + core.line_editor = Reline::LineEditor.new(core.config) + + core.basic_word_break_characters = " \t\n`><=;|&{(" + core.completer_word_break_characters = " \t\n`><=;|&{(" + core.basic_quote_characters = '"\'' + core.completer_quote_characters = '"\'' + core.filename_quote_characters = "" + core.special_prefixes = "" + core.add_dialog_proc(:autocomplete, Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE, Reline::DEFAULT_DIALOG_CONTEXT) + } + end + + def self.ungetc(c) + core.io_gate.ungetc(c) + end + + def self.line_editor + core.line_editor + end +end + + +Reline::IOGate = Reline::IO.decide_io_gate + +# Deprecated +Reline::GeneralIO = Reline::Dumb.new # :nodoc: + +Reline::Face.load_initial_configs + +Reline::HISTORY = Reline::History.new(Reline.core.config) diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/config.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/config.rb new file mode 100644 index 000000000..d43715665 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/config.rb @@ -0,0 +1,378 @@ +class Reline::Config + attr_reader :test_mode + + KEYSEQ_PATTERN = /\\(?:C|Control)-[A-Za-z_]|\\(?:M|Meta)-[0-9A-Za-z_]|\\(?:C|Control)-\\(?:M|Meta)-[A-Za-z_]|\\(?:M|Meta)-\\(?:C|Control)-[A-Za-z_]|\\e|\\[\\\"\'abdfnrtv]|\\\d{1,3}|\\x\h{1,2}|./ + + class InvalidInputrc < RuntimeError + attr_accessor :file, :lineno + end + + VARIABLE_NAMES = %w{ + completion-ignore-case + convert-meta + disable-completion + history-size + keyseq-timeout + show-all-if-ambiguous + show-mode-in-prompt + vi-cmd-mode-string + vi-ins-mode-string + emacs-mode-string + enable-bracketed-paste + isearch-terminators + } + VARIABLE_NAME_SYMBOLS = VARIABLE_NAMES.map { |v| :"#{v.tr(?-, ?_)}" } + VARIABLE_NAME_SYMBOLS.each do |v| + attr_accessor v + end + + attr_accessor :autocompletion + + def initialize + reset_variables + end + + def reset + if editing_mode_is?(:vi_command) + @editing_mode_label = :vi_insert + end + @oneshot_key_bindings.clear + end + + def reset_variables + @additional_key_bindings = { # from inputrc + emacs: Reline::KeyActor::Base.new, + vi_insert: Reline::KeyActor::Base.new, + vi_command: Reline::KeyActor::Base.new + } + @oneshot_key_bindings = Reline::KeyActor::Base.new + @editing_mode_label = :emacs + @keymap_label = :emacs + @keymap_prefix = [] + @default_key_bindings = { + emacs: Reline::KeyActor::Base.new(Reline::KeyActor::EMACS_MAPPING), + vi_insert: Reline::KeyActor::Base.new(Reline::KeyActor::VI_INSERT_MAPPING), + vi_command: Reline::KeyActor::Base.new(Reline::KeyActor::VI_COMMAND_MAPPING) + } + @vi_cmd_mode_string = '(cmd)' + @vi_ins_mode_string = '(ins)' + @emacs_mode_string = '@' + # https://tiswww.case.edu/php/chet/readline/readline.html#IDX25 + @history_size = -1 # unlimited + @keyseq_timeout = 500 + @test_mode = false + @autocompletion = false + @convert_meta = seven_bit_encoding?(Reline::IOGate.encoding) + @loaded = false + @enable_bracketed_paste = true + @show_mode_in_prompt = false + @default_inputrc_path = nil + end + + def editing_mode + @default_key_bindings[@editing_mode_label] + end + + def editing_mode=(val) + @editing_mode_label = val + end + + def editing_mode_is?(*val) + val.any?(@editing_mode_label) + end + + def keymap + @default_key_bindings[@keymap_label] + end + + def loaded? + @loaded + end + + def inputrc_path + case ENV['INPUTRC'] + when nil, '' + else + return File.expand_path(ENV['INPUTRC']) + end + + # In the XDG Specification, if ~/.config/readline/inputrc exists, then + # ~/.inputrc should not be read, but for compatibility with GNU Readline, + # if ~/.inputrc exists, then it is given priority. + home_rc_path = File.expand_path('~/.inputrc') + return home_rc_path if File.exist?(home_rc_path) + + case path = ENV['XDG_CONFIG_HOME'] + when nil, '' + else + path = File.join(path, 'readline/inputrc') + return path if File.exist?(path) and path == File.expand_path(path) + end + + path = File.expand_path('~/.config/readline/inputrc') + return path if File.exist?(path) + + return home_rc_path + end + + private def default_inputrc_path + @default_inputrc_path ||= inputrc_path + end + + def read(file = nil) + @loaded = true + file ||= default_inputrc_path + begin + if file.respond_to?(:readlines) + lines = file.readlines + else + lines = File.readlines(file) + end + rescue Errno::ENOENT + return nil + end + + read_lines(lines, file) + self + rescue InvalidInputrc => e + warn e.message + nil + end + + def key_bindings + # The key bindings for each editing mode will be overwritten by the user-defined ones. + Reline::KeyActor::Composite.new([@oneshot_key_bindings, @additional_key_bindings[@editing_mode_label], @default_key_bindings[@editing_mode_label]]) + end + + def add_oneshot_key_binding(keystroke, target) + # IRB sets invalid keystroke [Reline::Key]. We should ignore it. + return unless keystroke.all? { |c| c.is_a?(Integer) } + + @oneshot_key_bindings.add(keystroke, target) + end + + def reset_oneshot_key_bindings + @oneshot_key_bindings.clear + end + + def add_default_key_binding_by_keymap(keymap, keystroke, target) + @default_key_bindings[keymap].add(keystroke, target) + end + + def add_default_key_binding(keystroke, target) + add_default_key_binding_by_keymap(@keymap_label, keystroke, target) + end + + def read_lines(lines, file = nil) + if not lines.empty? and lines.first.encoding != Reline.encoding_system_needs + begin + lines = lines.map do |l| + l.encode(Reline.encoding_system_needs) + rescue Encoding::UndefinedConversionError + mes = "The inputrc encoded in #{lines.first.encoding.name} can't be converted to the locale #{Reline.encoding_system_needs.name}." + raise Reline::ConfigEncodingConversionError.new(mes) + end + end + end + if_stack = [] + + lines.each_with_index do |line, no| + # Even after encoding conversion, we need to verify the encoding is valid + # as some invalid byte sequences might pass through the conversion. + unless line.valid_encoding? + raise InvalidInputrc, "#{file}:#{no + 1}: can't be converted to the locale #{Reline.encoding_system_needs.name}" + end + next if line.match(/\A\s*#/) + + no += 1 + + line = line.chomp.lstrip + if line.start_with?('$') + handle_directive(line[1..-1], file, no, if_stack) + next + end + + next if if_stack.any? { |_no, skip| skip } + + case line + when /^set +([^ ]+) +(.+)/i + # value ignores everything after a space, raw_value does not. + var, value, raw_value = $1.downcase, $2.partition(' ').first, $2 + bind_variable(var, value, raw_value) + when /^\s*(?:M|Meta)-([a-zA-Z_])\s*:\s*(.*)\s*$/o + bind_key("\"\\M-#$1\"", $2) + when /^\s*(?:C|Control)-([a-zA-Z_])\s*:\s*(.*)\s*$/o + bind_key("\"\\C-#$1\"", $2) + when /^\s*(?:(?:C|Control)-(?:M|Meta)|(?:M|Meta)-(?:C|Control))-([a-zA-Z_])\s*:\s*(.*)\s*$/o + bind_key("\"\\M-\\C-#$1\"", $2) + when /^\s*("#{KEYSEQ_PATTERN}+")\s*:\s*(.*)\s*$/o + bind_key($1, $2) + end + end + unless if_stack.empty? + raise InvalidInputrc, "#{file}:#{if_stack.last[0]}: unclosed if" + end + end + + def handle_directive(directive, file, no, if_stack) + directive, args = directive.split(' ') + case directive + when 'if' + condition = false + case args + when /^mode=(vi|emacs)$/i + mode = $1.downcase + # NOTE: mode=vi means vi-insert mode + mode = 'vi_insert' if mode == 'vi' + if @editing_mode_label == mode.to_sym + condition = true + end + when 'term' + when 'version' + else # application name + condition = true if args == 'Ruby' + condition = true if args == 'Reline' + end + if_stack << [no, !condition] + when 'else' + if if_stack.empty? + raise InvalidInputrc, "#{file}:#{no}: unmatched else" + end + if_stack.last[1] = !if_stack.last[1] + when 'endif' + if if_stack.empty? + raise InvalidInputrc, "#{file}:#{no}: unmatched endif" + end + if_stack.pop + when 'include' + read(File.expand_path(args)) + end + end + + def bind_variable(name, value, raw_value) + case name + when 'history-size' + begin + @history_size = Integer(value) + rescue ArgumentError + @history_size = 500 + end + when 'isearch-terminators' + @isearch_terminators = retrieve_string(raw_value) + when 'editing-mode' + case value + when 'emacs' + @editing_mode_label = :emacs + @keymap_label = :emacs + @keymap_prefix = [] + when 'vi' + @editing_mode_label = :vi_insert + @keymap_label = :vi_insert + @keymap_prefix = [] + end + when 'keymap' + case value + when 'emacs', 'emacs-standard' + @keymap_label = :emacs + @keymap_prefix = [] + when 'emacs-ctlx' + @keymap_label = :emacs + @keymap_prefix = [?\C-x.ord] + when 'emacs-meta' + @keymap_label = :emacs + @keymap_prefix = [?\e.ord] + when 'vi', 'vi-move', 'vi-command' + @keymap_label = :vi_command + @keymap_prefix = [] + when 'vi-insert' + @keymap_label = :vi_insert + @keymap_prefix = [] + end + when 'keyseq-timeout' + @keyseq_timeout = value.to_i + when 'show-mode-in-prompt' + case value + when 'off' + @show_mode_in_prompt = false + when 'on' + @show_mode_in_prompt = true + else + @show_mode_in_prompt = false + end + when 'vi-cmd-mode-string' + @vi_cmd_mode_string = retrieve_string(raw_value) + when 'vi-ins-mode-string' + @vi_ins_mode_string = retrieve_string(raw_value) + when 'emacs-mode-string' + @emacs_mode_string = retrieve_string(raw_value) + when *VARIABLE_NAMES then + variable_name = :"@#{name.tr(?-, ?_)}" + instance_variable_set(variable_name, value.nil? || value == '1' || value == 'on') + end + end + + def retrieve_string(str) + str = $1 if str =~ /\A"(.*)"\z/ + parse_keyseq(str).map { |c| c.chr(Reline.encoding_system_needs) }.join + end + + def bind_key(key, value) + keystroke, func = parse_key_binding(key, value) + @additional_key_bindings[@keymap_label].add(@keymap_prefix + keystroke, func) if keystroke + end + + def parse_key_binding(key, func_name) + if key =~ /\A"(.*)"\z/ + keyseq = parse_keyseq($1) + else + keyseq = nil + end + if func_name =~ /"(.*)"/ + func = parse_keyseq($1) + else + func = func_name.split.first.tr(?-, ?_).to_sym # It must be macro. + end + [keyseq, func] + end + + def key_notation_to_code(notation) + case notation + when /(?:\\(?:C|Control)-\\(?:M|Meta)|\\(?:M|Meta)-\\(?:C|Control))-([A-Za-z_])/ + [?\e.ord, $1.ord % 32] + when /\\(?:C|Control)-([A-Za-z_])/ + ($1.upcase.ord % 32) + when /\\(?:M|Meta)-([0-9A-Za-z_])/ + [?\e.ord, $1.ord] + when /\\(\d{1,3})/ then $1.to_i(8) # octal + when /\\x(\h{1,2})/ then $1.to_i(16) # hexadecimal + when "\\e" then ?\e.ord + when "\\\\" then ?\\.ord + when "\\\"" then ?".ord + when "\\'" then ?'.ord + when "\\a" then ?\a.ord + when "\\b" then ?\b.ord + when "\\d" then ?\d.ord + when "\\f" then ?\f.ord + when "\\n" then ?\n.ord + when "\\r" then ?\r.ord + when "\\t" then ?\t.ord + when "\\v" then ?\v.ord + else notation.ord + end + end + + def parse_keyseq(str) + str.scan(KEYSEQ_PATTERN).flat_map do |notation| + key_notation_to_code(notation) + end + end + + def reload + reset_variables + read + end + + private def seven_bit_encoding?(encoding) + encoding == Encoding::US_ASCII + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/face.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/face.rb new file mode 100644 index 000000000..5b4464a62 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/face.rb @@ -0,0 +1,199 @@ +# frozen_string_literal: true + +class Reline::Face + SGR_PARAMETERS = { + foreground: { + black: 30, + red: 31, + green: 32, + yellow: 33, + blue: 34, + magenta: 35, + cyan: 36, + white: 37, + bright_black: 90, + gray: 90, + bright_red: 91, + bright_green: 92, + bright_yellow: 93, + bright_blue: 94, + bright_magenta: 95, + bright_cyan: 96, + bright_white: 97 + }, + background: { + black: 40, + red: 41, + green: 42, + yellow: 43, + blue: 44, + magenta: 45, + cyan: 46, + white: 47, + bright_black: 100, + gray: 100, + bright_red: 101, + bright_green: 102, + bright_yellow: 103, + bright_blue: 104, + bright_magenta: 105, + bright_cyan: 106, + bright_white: 107, + }, + style: { + reset: 0, + bold: 1, + faint: 2, + italicized: 3, + underlined: 4, + slowly_blinking: 5, + blinking: 5, + rapidly_blinking: 6, + negative: 7, + concealed: 8, + crossed_out: 9 + } + }.freeze + + class Config + ESSENTIAL_DEFINE_NAMES = %i(default enhanced scrollbar).freeze + RESET_SGR = "\e[0m".freeze + + def initialize(name, &block) + @definition = {} + block.call(self) + ESSENTIAL_DEFINE_NAMES.each do |name| + @definition[name] ||= { style: :reset, escape_sequence: RESET_SGR } + end + end + + attr_reader :definition + + def define(name, **values) + values[:escape_sequence] = format_to_sgr(values.to_a).freeze + @definition[name] = values + end + + def reconfigure + @definition.each_value do |values| + values.delete(:escape_sequence) + values[:escape_sequence] = format_to_sgr(values.to_a).freeze + end + end + + def [](name) + @definition.dig(name, :escape_sequence) or raise ArgumentError, "unknown face: #{name}" + end + + private + + def sgr_rgb(key, value) + return nil unless rgb_expression?(value) + if Reline::Face.truecolor? + sgr_rgb_truecolor(key, value) + else + sgr_rgb_256color(key, value) + end + end + + def sgr_rgb_truecolor(key, value) + case key + when :foreground + "38;2;" + when :background + "48;2;" + end + value[1, 6].scan(/../).map(&:hex).join(";") + end + + def sgr_rgb_256color(key, value) + # 256 colors are + # 0..15: standard colors, high intensity colors + # 16..232: 216 colors (R, G, B each 6 steps) + # 233..255: grayscale colors (24 steps) + # This methods converts rgb_expression to 216 colors + rgb = value[1, 6].scan(/../).map(&:hex) + # Color steps are [0, 95, 135, 175, 215, 255] + r, g, b = rgb.map { |v| v <= 95 ? v / 48 : (v - 35) / 40 } + color = (16 + 36 * r + 6 * g + b) + case key + when :foreground + "38;5;#{color}" + when :background + "48;5;#{color}" + end + end + + def format_to_sgr(ordered_values) + sgr = "\e[" + ordered_values.map do |key_value| + key, value = key_value + case key + when :foreground, :background + case value + when Symbol + SGR_PARAMETERS[key][value] + when String + sgr_rgb(key, value) + end + when :style + [ value ].flatten.map do |style_name| + SGR_PARAMETERS[:style][style_name] + end.then do |sgr_parameters| + sgr_parameters.include?(nil) ? nil : sgr_parameters + end + end.then do |rendition_expression| + unless rendition_expression + raise ArgumentError, "invalid SGR parameter: #{value.inspect}" + end + rendition_expression + end + end.join(';') + "m" + sgr == RESET_SGR ? RESET_SGR : RESET_SGR + sgr + end + + def rgb_expression?(color) + color.respond_to?(:match?) and color.match?(/\A#[0-9a-fA-F]{6}\z/) + end + end + + private_constant :SGR_PARAMETERS, :Config + + def self.truecolor? + @force_truecolor || %w[truecolor 24bit].include?(ENV['COLORTERM']) + end + + def self.force_truecolor + @force_truecolor = true + @configs&.each_value(&:reconfigure) + end + + def self.[](name) + @configs[name] + end + + def self.config(name, &block) + @configs ||= {} + @configs[name] = Config.new(name, &block) + end + + def self.configs + @configs.transform_values(&:definition) + end + + def self.load_initial_configs + config(:default) do |conf| + conf.define :default, style: :reset + conf.define :enhanced, style: :reset + conf.define :scrollbar, style: :reset + end + config(:completion_dialog) do |conf| + conf.define :default, foreground: :bright_white, background: :gray + conf.define :enhanced, foreground: :black, background: :white + conf.define :scrollbar, foreground: :white, background: :gray + end + end + + def self.reset_to_initial_configs + @configs = {} + load_initial_configs + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/history.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/history.rb new file mode 100644 index 000000000..47c68ba77 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/history.rb @@ -0,0 +1,76 @@ +class Reline::History < Array + def initialize(config) + @config = config + end + + def to_s + 'HISTORY' + end + + def delete_at(index) + index = check_index(index) + super(index) + end + + def [](index) + index = check_index(index) unless index.is_a?(Range) + super(index) + end + + def []=(index, val) + index = check_index(index) + super(index, Reline::Unicode.safe_encode(val, Reline.encoding_system_needs)) + end + + def concat(*val) + val.each do |v| + push(*v) + end + end + + def push(*val) + # If history_size is zero, all histories are dropped. + return self if @config.history_size.zero? + # If history_size is negative, history size is unlimited. + if @config.history_size.positive? + diff = size + val.size - @config.history_size + if diff > 0 + if diff <= size + shift(diff) + else + diff -= size + clear + val.shift(diff) + end + end + end + super(*(val.map{ |v| + Reline::Unicode.safe_encode(v, Reline.encoding_system_needs) + })) + end + + def <<(val) + # If history_size is zero, all histories are dropped. + return self if @config.history_size.zero? + # If history_size is negative, history size is unlimited. + if @config.history_size.positive? + shift if size + 1 > @config.history_size + end + super(Reline::Unicode.safe_encode(val, Reline.encoding_system_needs)) + end + + private def check_index(index) + index += size if index < 0 + if index < -2147483648 or 2147483647 < index + raise RangeError.new("integer #{index} too big to convert to 'int'") + end + # If history_size is negative, history size is unlimited. + if @config.history_size.positive? + if index < -@config.history_size or @config.history_size < index + raise RangeError.new("index=<#{index}>") + end + end + raise IndexError.new("index=<#{index}>") if index < 0 or size <= index + index + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io.rb new file mode 100644 index 000000000..17c3a3cd1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io.rb @@ -0,0 +1,55 @@ + +module Reline + class IO + RESET_COLOR = "\e[0m" + + def self.decide_io_gate + if ENV['TERM'] == 'dumb' + Reline::Dumb.new + else + require 'reline/io/ansi' + + case RbConfig::CONFIG['host_os'] + when /mswin|msys|mingw|cygwin|bccwin|wince|emc/ + require 'reline/io/windows' + io = Reline::Windows.new + if io.msys_tty? + Reline::ANSI.new + else + io + end + else + Reline::ANSI.new + end + end + end + + def dumb? + false + end + + def win? + false + end + + def reset_color_sequence + self.class::RESET_COLOR + end + + # Read a single encoding valid character from the input. + def read_single_char(timeout_second) + buffer = String.new(encoding: Encoding::ASCII_8BIT) + loop do + timeout = buffer.empty? ? Float::INFINITY : timeout_second + c = getc(timeout) + return unless c + + buffer << c + encoded = buffer.dup.force_encoding(encoding) + return encoded if encoded.valid_encoding? + end + end + end +end + +require 'reline/io/dumb' diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/ansi.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/ansi.rb new file mode 100644 index 000000000..c600b97f2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/ansi.rb @@ -0,0 +1,322 @@ +require 'io/console' +require 'io/wait' + +class Reline::ANSI < Reline::IO + ANSI_CURSOR_KEY_BINDINGS = { + # Up + 'A' => [:ed_prev_history, {}], + # Down + 'B' => [:ed_next_history, {}], + # Right + 'C' => [:ed_next_char, { ctrl: :em_next_word, meta: :em_next_word }], + # Left + 'D' => [:ed_prev_char, { ctrl: :ed_prev_word, meta: :ed_prev_word }], + # End + 'F' => [:ed_move_to_end, {}], + # Home + 'H' => [:ed_move_to_beg, {}], + } + + attr_writer :input, :output + + def initialize + @input = STDIN + @output = STDOUT + @buf = [] + @output_buffer = nil + @old_winch_handler = nil + end + + def encoding + @input.external_encoding || Encoding.default_external + rescue IOError + # STDIN.external_encoding raises IOError in Ruby <= 3.0 when STDIN is closed + Encoding.default_external + end + + def set_default_key_bindings(config) + set_bracketed_paste_key_bindings(config) + set_default_key_bindings_ansi_cursor(config) + set_default_key_bindings_comprehensive_list(config) + { + [27, 91, 90] => :completion_journey_up, # S-Tab + }.each_pair do |key, func| + config.add_default_key_binding_by_keymap(:emacs, key, func) + config.add_default_key_binding_by_keymap(:vi_insert, key, func) + end + { + # default bindings + [27, 32] => :em_set_mark, # M- + [24, 24] => :em_exchange_mark, # C-x C-x + }.each_pair do |key, func| + config.add_default_key_binding_by_keymap(:emacs, key, func) + end + end + + def set_bracketed_paste_key_bindings(config) + [:emacs, :vi_insert, :vi_command].each do |keymap| + config.add_default_key_binding_by_keymap(keymap, START_BRACKETED_PASTE.bytes, :bracketed_paste_start) + end + end + + def set_default_key_bindings_ansi_cursor(config) + ANSI_CURSOR_KEY_BINDINGS.each do |char, (default_func, modifiers)| + bindings = [ + ["\e[#{char}", default_func], # CSI + char + ["\eO#{char}", default_func] # SS3 + char, application cursor key mode + ] + if modifiers[:ctrl] + # CSI + ctrl_key_modifier + char + bindings << ["\e[1;5#{char}", modifiers[:ctrl]] + end + if modifiers[:meta] + # CSI + meta_key_modifier + char + bindings << ["\e[1;3#{char}", modifiers[:meta]] + # Meta(ESC) + CSI + char + bindings << ["\e\e[#{char}", modifiers[:meta]] + end + bindings.each do |sequence, func| + key = sequence.bytes + config.add_default_key_binding_by_keymap(:emacs, key, func) + config.add_default_key_binding_by_keymap(:vi_insert, key, func) + config.add_default_key_binding_by_keymap(:vi_command, key, func) + end + end + end + + def set_default_key_bindings_comprehensive_list(config) + { + # xterm + [27, 91, 51, 126] => :key_delete, # kdch1 + [27, 91, 53, 126] => :ed_search_prev_history, # kpp + [27, 91, 54, 126] => :ed_search_next_history, # knp + + # Console (80x25) + [27, 91, 49, 126] => :ed_move_to_beg, # Home + [27, 91, 52, 126] => :ed_move_to_end, # End + + # urxvt / exoterm + [27, 91, 55, 126] => :ed_move_to_beg, # Home + [27, 91, 56, 126] => :ed_move_to_end, # End + }.each_pair do |key, func| + config.add_default_key_binding_by_keymap(:emacs, key, func) + config.add_default_key_binding_by_keymap(:vi_insert, key, func) + config.add_default_key_binding_by_keymap(:vi_command, key, func) + end + end + + def with_raw_input + if @input.tty? + @input.raw(intr: true) { yield } + else + yield + end + end + + def inner_getc(timeout_second) + unless @buf.empty? + return @buf.shift + end + until @input.wait_readable(0.01) + timeout_second -= 0.01 + return nil if timeout_second <= 0 + + Reline.core.line_editor.handle_signal + end + c = @input.getbyte + + # When "Escape non-ASCII Input with Control-V" is enabled in macOS Terminal.app, + # all non-ascii bytes are automatically escaped with `C-v`. + # "\xE3\x81\x82" (U+3042) becomes "\x16\xE3\x16\x81\x16\x82". + (c == 0x16 && @input.tty? && @input.raw(min: 0, time: 0, &:getbyte)) || c + rescue Errno::EIO + # Maybe the I/O has been closed. + nil + end + + START_BRACKETED_PASTE = String.new("\e[200~", encoding: Encoding::ASCII_8BIT) + END_BRACKETED_PASTE = String.new("\e[201~", encoding: Encoding::ASCII_8BIT) + def read_bracketed_paste + buffer = String.new(encoding: Encoding::ASCII_8BIT) + until buffer.end_with?(END_BRACKETED_PASTE) + c = inner_getc(Float::INFINITY) + break unless c + buffer << c + end + string = buffer.delete_suffix(END_BRACKETED_PASTE).force_encoding(encoding) + string.valid_encoding? ? string : '' + end + + # if the usage expects to wait indefinitely, use Float::INFINITY for timeout_second + def getc(timeout_second) + inner_getc(timeout_second) + end + + def in_pasting? + not empty_buffer? + end + + def empty_buffer? + unless @buf.empty? + return false + end + !@input.wait_readable(0) + end + + def ungetc(c) + @buf.unshift(c) + end + + def retrieve_keybuffer + begin + return unless @input.wait_readable(0.001) + str = @input.read_nonblock(1024) + str.bytes.each do |c| + @buf.push(c) + end + rescue EOFError + end + end + + def get_screen_size + s = @input.winsize + return s if s[0] > 0 && s[1] > 0 + s = [ENV["LINES"].to_i, ENV["COLUMNS"].to_i] + return s if s[0] > 0 && s[1] > 0 + [24, 80] + rescue SystemCallError + [24, 80] + end + + def set_screen_size(rows, columns) + @input.winsize = [rows, columns] + self + rescue SystemCallError + self + end + + private def cursor_pos_internal(timeout:) + match = nil + @input.raw do |stdin| + @output << "\e[6n" + @output.flush + timeout_at = Time.now + timeout + buf = +'' + while (wait = timeout_at - Time.now) > 0 && stdin.wait_readable(wait) + buf << stdin.readpartial(1024) + if (match = buf.match(/\e\[(?\d+);(?\d+)R/)) + buf = match.pre_match + match.post_match + break + end + end + @buf.concat buf.bytes + end + [match[:column].to_i - 1, match[:row].to_i - 1] if match + end + + def cursor_pos + col, row = cursor_pos_internal(timeout: 0.5) if both_tty? + Reline::CursorPos.new(col || 0, row || 0) + end + + def both_tty? + @input.tty? && @output.tty? + end + + def write(string) + if @output_buffer + @output_buffer << string + else + @output.write(string) + end + end + + def buffered_output + @output_buffer = +'' + yield + @output.write(@output_buffer) + ensure + @output_buffer = nil + end + + def move_cursor_column(x) + write "\e[#{x + 1}G" + end + + def move_cursor_up(x) + if x > 0 + write "\e[#{x}A" + elsif x < 0 + move_cursor_down(-x) + end + end + + def move_cursor_down(x) + if x > 0 + write "\e[#{x}B" + elsif x < 0 + move_cursor_up(-x) + end + end + + def hide_cursor + write "\e[?25l" + end + + def show_cursor + write "\e[?25h" + end + + def erase_after_cursor + write "\e[K" + end + + # This only works when the cursor is at the bottom of the scroll range + # For more details, see https://github.com/ruby/reline/pull/577#issuecomment-1646679623 + def scroll_down(x) + return if x.zero? + # We use `\n` instead of CSI + S because CSI + S would cause https://github.com/ruby/reline/issues/576 + write "\n" * x + end + + def clear_screen + write "\e[2J" + write "\e[1;1H" + end + + def set_winch_handler(&handler) + @old_winch_handler = Signal.trap('WINCH') do |arg| + handler.call + @old_winch_handler.call(arg) if @old_winch_handler.respond_to?(:call) + end + @old_cont_handler = Signal.trap('CONT') do |arg| + @input.raw!(intr: true) if @input.tty? + # Rerender the screen. Note that screen size might be changed while suspended. + handler.call + @old_cont_handler.call(arg) if @old_cont_handler.respond_to?(:call) + end + rescue ArgumentError + # Signal.trap may raise an ArgumentError if the platform doesn't support the signal. + end + + def read_single_char(timeout_second) + # Disable intr to read `C-c` `C-z` `C-\` for quoted insert + @input.raw(intr: false) do + super + end + end + + def prep + # Enable bracketed paste + write "\e[?2004h" if Reline.core.config.enable_bracketed_paste && both_tty? + retrieve_keybuffer + nil + end + + def deprep(otio) + # Disable bracketed paste + write "\e[?2004l" if Reline.core.config.enable_bracketed_paste && both_tty? + Signal.trap('WINCH', @old_winch_handler) if @old_winch_handler + Signal.trap('CONT', @old_cont_handler) if @old_cont_handler + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/dumb.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/dumb.rb new file mode 100644 index 000000000..0c04c755d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/dumb.rb @@ -0,0 +1,120 @@ +require 'io/wait' + +class Reline::Dumb < Reline::IO + RESET_COLOR = '' # Do not send color reset sequence + + attr_writer :output + + def initialize(encoding: nil) + @input = STDIN + @output = STDOUT + @buf = [] + @pasting = false + @encoding = encoding + @screen_size = [24, 80] + end + + def dumb? + true + end + + def encoding + if @encoding + @encoding + elsif RUBY_PLATFORM =~ /mswin|mingw/ + Encoding::UTF_8 + else + @input.external_encoding || Encoding.default_external + end + rescue IOError + # STDIN.external_encoding raises IOError in Ruby <= 3.0 when STDIN is closed + Encoding.default_external + end + + def set_default_key_bindings(_) + end + + def input=(val) + @input = val + end + + def with_raw_input + yield + end + + def write(string) + @output.write(string) + end + + def buffered_output + yield + end + + def getc(_timeout_second) + unless @buf.empty? + return @buf.shift + end + c = nil + loop do + Reline.core.line_editor.handle_signal + result = @input.wait_readable(0.1) + next if result.nil? + c = @input.read(1) + break + end + c&.ord + end + + def ungetc(c) + @buf.unshift(c) + end + + def get_screen_size + @screen_size + end + + def cursor_pos + Reline::CursorPos.new(0, 0) + end + + def hide_cursor + end + + def show_cursor + end + + def move_cursor_column(val) + end + + def move_cursor_up(val) + end + + def move_cursor_down(val) + end + + def erase_after_cursor + end + + def scroll_down(val) + end + + def clear_screen + end + + def set_screen_size(rows, columns) + @screen_size = [rows, columns] + end + + def set_winch_handler(&handler) + end + + def in_pasting? + @pasting + end + + def prep + end + + def deprep(otio) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/windows.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/windows.rb new file mode 100644 index 000000000..5c1ab6d08 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/io/windows.rb @@ -0,0 +1,530 @@ +require 'fiddle/import' + +class Reline::Windows < Reline::IO + + attr_writer :output + + def initialize + @input_buf = [] + @output_buf = [] + + @output = STDOUT + @hsg = nil + @getwch = Win32API.new('msvcrt', '_getwch', [], 'I') + @kbhit = Win32API.new('msvcrt', '_kbhit', [], 'I') + @GetKeyState = Win32API.new('user32', 'GetKeyState', ['L'], 'L') + @GetConsoleScreenBufferInfo = Win32API.new('kernel32', 'GetConsoleScreenBufferInfo', ['L', 'P'], 'L') + @SetConsoleCursorPosition = Win32API.new('kernel32', 'SetConsoleCursorPosition', ['L', 'L'], 'L') + @GetStdHandle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') + @FillConsoleOutputCharacter = Win32API.new('kernel32', 'FillConsoleOutputCharacter', ['L', 'L', 'L', 'L', 'P'], 'L') + @ScrollConsoleScreenBuffer = Win32API.new('kernel32', 'ScrollConsoleScreenBuffer', ['L', 'P', 'P', 'L', 'P'], 'L') + @hConsoleHandle = @GetStdHandle.call(STD_OUTPUT_HANDLE) + @hConsoleInputHandle = @GetStdHandle.call(STD_INPUT_HANDLE) + @GetNumberOfConsoleInputEvents = Win32API.new('kernel32', 'GetNumberOfConsoleInputEvents', ['L', 'P'], 'L') + @ReadConsoleInputW = Win32API.new('kernel32', 'ReadConsoleInputW', ['L', 'P', 'L', 'P'], 'L') + @GetFileType = Win32API.new('kernel32', 'GetFileType', ['L'], 'L') + @GetFileInformationByHandleEx = Win32API.new('kernel32', 'GetFileInformationByHandleEx', ['L', 'I', 'P', 'L'], 'I') + @FillConsoleOutputAttribute = Win32API.new('kernel32', 'FillConsoleOutputAttribute', ['L', 'L', 'L', 'L', 'P'], 'L') + @SetConsoleCursorInfo = Win32API.new('kernel32', 'SetConsoleCursorInfo', ['L', 'P'], 'L') + + @GetConsoleMode = Win32API.new('kernel32', 'GetConsoleMode', ['L', 'P'], 'L') + @SetConsoleMode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'L') + @WaitForSingleObject = Win32API.new('kernel32', 'WaitForSingleObject', ['L', 'L'], 'L') + + @legacy_console = getconsolemode & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0 + end + + def encoding + Encoding::UTF_8 + end + + def win? + true + end + + def win_legacy_console? + @legacy_console + end + + def set_default_key_bindings(config) + { + [224, 72] => :ed_prev_history, # ↑ + [224, 80] => :ed_next_history, # ↓ + [224, 77] => :ed_next_char, # → + [224, 75] => :ed_prev_char, # ← + [224, 83] => :key_delete, # Del + [224, 71] => :ed_move_to_beg, # Home + [224, 79] => :ed_move_to_end, # End + [ 0, 72] => :ed_prev_history, # ↑ + [ 0, 80] => :ed_next_history, # ↓ + [ 0, 77] => :ed_next_char, # → + [ 0, 75] => :ed_prev_char, # ← + [ 0, 83] => :key_delete, # Del + [ 0, 71] => :ed_move_to_beg, # Home + [ 0, 79] => :ed_move_to_end # End + }.each_pair do |key, func| + config.add_default_key_binding_by_keymap(:emacs, key, func) + config.add_default_key_binding_by_keymap(:vi_insert, key, func) + config.add_default_key_binding_by_keymap(:vi_command, key, func) + end + + { + [27, 32] => :em_set_mark, # M- + [24, 24] => :em_exchange_mark, # C-x C-x + }.each_pair do |key, func| + config.add_default_key_binding_by_keymap(:emacs, key, func) + end + + # Emulate ANSI key sequence. + { + [27, 91, 90] => :completion_journey_up, # S-Tab + }.each_pair do |key, func| + config.add_default_key_binding_by_keymap(:emacs, key, func) + config.add_default_key_binding_by_keymap(:vi_insert, key, func) + end + end + + if defined? JRUBY_VERSION + require 'win32api' + else + class Win32API + DLL = {} + TYPEMAP = {"0" => Fiddle::TYPE_VOID, "S" => Fiddle::TYPE_VOIDP, "I" => Fiddle::TYPE_LONG} + POINTER_TYPE = Fiddle::SIZEOF_VOIDP == Fiddle::SIZEOF_LONG_LONG ? 'q*' : 'l!*' + + WIN32_TYPES = "VPpNnLlIi" + DL_TYPES = "0SSI" + + def initialize(dllname, func, import, export = "0", calltype = :stdcall) + @proto = [import].join.tr(WIN32_TYPES, DL_TYPES).sub(/^(.)0*$/, '\1') + import = @proto.chars.map {|win_type| TYPEMAP[win_type.tr(WIN32_TYPES, DL_TYPES)]} + export = TYPEMAP[export.tr(WIN32_TYPES, DL_TYPES)] + calltype = Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[calltype] + + handle = DLL[dllname] ||= + begin + Fiddle.dlopen(dllname) + rescue Fiddle::DLError + raise unless File.extname(dllname).empty? + Fiddle.dlopen(dllname + ".dll") + end + + @func = Fiddle::Function.new(handle[func], import, export, calltype) + rescue Fiddle::DLError => e + raise LoadError, e.message, e.backtrace + end + + def call(*args) + import = @proto.split("") + args.each_with_index do |x, i| + args[i], = [x == 0 ? nil : +x].pack("p").unpack(POINTER_TYPE) if import[i] == "S" + args[i], = [x].pack("I").unpack("i") if import[i] == "I" + end + ret, = @func.call(*args) + return ret || 0 + end + end + end + + VK_RETURN = 0x0D + VK_MENU = 0x12 # ALT key + VK_LMENU = 0xA4 + VK_CONTROL = 0x11 + VK_SHIFT = 0x10 + VK_DIVIDE = 0x6F + + KEY_EVENT = 0x01 + WINDOW_BUFFER_SIZE_EVENT = 0x04 + + CAPSLOCK_ON = 0x0080 + ENHANCED_KEY = 0x0100 + LEFT_ALT_PRESSED = 0x0002 + LEFT_CTRL_PRESSED = 0x0008 + NUMLOCK_ON = 0x0020 + RIGHT_ALT_PRESSED = 0x0001 + RIGHT_CTRL_PRESSED = 0x0004 + SCROLLLOCK_ON = 0x0040 + SHIFT_PRESSED = 0x0010 + + VK_TAB = 0x09 + VK_END = 0x23 + VK_HOME = 0x24 + VK_LEFT = 0x25 + VK_UP = 0x26 + VK_RIGHT = 0x27 + VK_DOWN = 0x28 + VK_DELETE = 0x2E + + STD_INPUT_HANDLE = -10 + STD_OUTPUT_HANDLE = -11 + FILE_TYPE_PIPE = 0x0003 + FILE_NAME_INFO = 2 + ENABLE_WRAP_AT_EOL_OUTPUT = 2 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 + + # Calling Win32API with console handle is reported to fail after executing some external command. + # We need to refresh console handle and retry the call again. + private def call_with_console_handle(win32func, *args) + val = win32func.call(@hConsoleHandle, *args) + return val if val != 0 + + @hConsoleHandle = @GetStdHandle.call(STD_OUTPUT_HANDLE) + win32func.call(@hConsoleHandle, *args) + end + + private def getconsolemode + mode = +"\0\0\0\0" + call_with_console_handle(@GetConsoleMode, mode) + mode.unpack1('L') + end + + private def setconsolemode(mode) + call_with_console_handle(@SetConsoleMode, mode) + end + + #if @legacy_console + # setconsolemode(getconsolemode() | ENABLE_VIRTUAL_TERMINAL_PROCESSING) + # @legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0) + #end + + def msys_tty?(io = @hConsoleInputHandle) + # check if fd is a pipe + if @GetFileType.call(io) != FILE_TYPE_PIPE + return false + end + + bufsize = 1024 + p_buffer = "\0" * bufsize + res = @GetFileInformationByHandleEx.call(io, FILE_NAME_INFO, p_buffer, bufsize - 2) + return false if res == 0 + + # get pipe name: p_buffer layout is: + # struct _FILE_NAME_INFO { + # DWORD FileNameLength; + # WCHAR FileName[1]; + # } FILE_NAME_INFO + len = p_buffer[0, 4].unpack1("L") + name = p_buffer[4, len].encode(Encoding::UTF_8, Encoding::UTF_16LE, invalid: :replace) + + # Check if this could be a MSYS2 pty pipe ('\msys-XXXX-ptyN-XX') + # or a cygwin pty pipe ('\cygwin-XXXX-ptyN-XX') + name =~ /(msys-|cygwin-).*-pty/ ? true : false + end + + KEY_MAP = [ + # It's treated as Meta+Enter on Windows. + [ { control_keys: :CTRL, virtual_key_code: 0x0D }, "\e\r".bytes ], + [ { control_keys: :SHIFT, virtual_key_code: 0x0D }, "\e\r".bytes ], + + # It's treated as Meta+Space on Windows. + [ { control_keys: :CTRL, char_code: 0x20 }, "\e ".bytes ], + + # Emulate getwch() key sequences. + [ { control_keys: [], virtual_key_code: VK_UP }, [0, 72] ], + [ { control_keys: [], virtual_key_code: VK_DOWN }, [0, 80] ], + [ { control_keys: [], virtual_key_code: VK_RIGHT }, [0, 77] ], + [ { control_keys: [], virtual_key_code: VK_LEFT }, [0, 75] ], + [ { control_keys: [], virtual_key_code: VK_DELETE }, [0, 83] ], + [ { control_keys: [], virtual_key_code: VK_HOME }, [0, 71] ], + [ { control_keys: [], virtual_key_code: VK_END }, [0, 79] ], + + # Emulate ANSI key sequence. + [ { control_keys: :SHIFT, virtual_key_code: VK_TAB }, [27, 91, 90] ], + ] + + def process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state) + + # high-surrogate + if 0xD800 <= char_code and char_code <= 0xDBFF + @hsg = char_code + return + end + # low-surrogate + if 0xDC00 <= char_code and char_code <= 0xDFFF + if @hsg + char_code = 0x10000 + (@hsg - 0xD800) * 0x400 + char_code - 0xDC00 + @hsg = nil + else + # no high-surrogate. ignored. + return + end + else + # ignore high-surrogate without low-surrogate if there + @hsg = nil + end + + key = KeyEventRecord.new(virtual_key_code, char_code, control_key_state) + + match = KEY_MAP.find { |args,| key.match?(**args) } + unless match.nil? + @output_buf.concat(match.last) + return + end + + # no char, only control keys + return if key.char_code == 0 and key.control_keys.any? + + @output_buf.push("\e".ord) if key.control_keys.include?(:ALT) and !key.control_keys.include?(:CTRL) + + @output_buf.concat(key.char.bytes) + end + + def check_input_event + num_of_events = 0.chr * 8 + while @output_buf.empty? + Reline.core.line_editor.handle_signal + if @WaitForSingleObject.(@hConsoleInputHandle, 100) != 0 # max 0.1 sec + # prevent for background consolemode change + @legacy_console = getconsolemode & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0 + next + end + next if @GetNumberOfConsoleInputEvents.(@hConsoleInputHandle, num_of_events) == 0 or num_of_events.unpack1('L') == 0 + input_records = 0.chr * 20 * 80 + read_event = 0.chr * 4 + if @ReadConsoleInputW.(@hConsoleInputHandle, input_records, 80, read_event) != 0 + read_events = read_event.unpack1('L') + 0.upto(read_events) do |idx| + input_record = input_records[idx * 20, 20] + event = input_record[0, 2].unpack1('s*') + case event + when WINDOW_BUFFER_SIZE_EVENT + @winch_handler.() + when KEY_EVENT + key_down = input_record[4, 4].unpack1('l*') + repeat_count = input_record[8, 2].unpack1('s*') + virtual_key_code = input_record[10, 2].unpack1('s*') + virtual_scan_code = input_record[12, 2].unpack1('s*') + char_code = input_record[14, 2].unpack1('S*') + control_key_state = input_record[16, 2].unpack1('S*') + is_key_down = key_down.zero? ? false : true + if is_key_down + process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state) + end + end + end + end + end + end + + def with_raw_input + yield + end + + def write(string) + @output.write(string) + end + + def buffered_output + yield + end + + def getc(_timeout_second) + check_input_event + @output_buf.shift + end + + def ungetc(c) + @output_buf.unshift(c) + end + + def in_pasting? + not empty_buffer? + end + + def empty_buffer? + if not @output_buf.empty? + false + elsif @kbhit.call == 0 + true + else + false + end + end + + def get_console_screen_buffer_info + # CONSOLE_SCREEN_BUFFER_INFO + # [ 0,2] dwSize.X + # [ 2,2] dwSize.Y + # [ 4,2] dwCursorPositions.X + # [ 6,2] dwCursorPositions.Y + # [ 8,2] wAttributes + # [10,2] srWindow.Left + # [12,2] srWindow.Top + # [14,2] srWindow.Right + # [16,2] srWindow.Bottom + # [18,2] dwMaximumWindowSize.X + # [20,2] dwMaximumWindowSize.Y + csbi = 0.chr * 22 + if call_with_console_handle(@GetConsoleScreenBufferInfo, csbi) != 0 + # returns [width, height, x, y, attributes, left, top, right, bottom] + csbi.unpack("s9") + else + return nil + end + end + + ALTERNATIVE_CSBI = [80, 24, 0, 0, 7, 0, 0, 79, 23].freeze + + def get_screen_size + width, _, _, _, _, _, top, _, bottom = get_console_screen_buffer_info || ALTERNATIVE_CSBI + [bottom - top + 1, width] + end + + def cursor_pos + _, _, x, y, _, _, top, = get_console_screen_buffer_info || ALTERNATIVE_CSBI + Reline::CursorPos.new(x, y - top) + end + + def move_cursor_column(val) + _, _, _, y, = get_console_screen_buffer_info + call_with_console_handle(@SetConsoleCursorPosition, y * 65536 + val) if y + end + + def move_cursor_up(val) + if val > 0 + _, _, x, y, _, _, top, = get_console_screen_buffer_info + return unless y + y = (y - top) - val + y = 0 if y < 0 + call_with_console_handle(@SetConsoleCursorPosition, (y + top) * 65536 + x) + elsif val < 0 + move_cursor_down(-val) + end + end + + def move_cursor_down(val) + if val > 0 + _, _, x, y, _, _, top, _, bottom = get_console_screen_buffer_info + return unless y + screen_height = bottom - top + y = (y - top) + val + y = screen_height if y > screen_height + call_with_console_handle(@SetConsoleCursorPosition, (y + top) * 65536 + x) + elsif val < 0 + move_cursor_up(-val) + end + end + + def erase_after_cursor + width, _, x, y, attributes, = get_console_screen_buffer_info + return unless x + written = 0.chr * 4 + call_with_console_handle(@FillConsoleOutputCharacter, 0x20, width - x, y * 65536 + x, written) + call_with_console_handle(@FillConsoleOutputAttribute, attributes, width - x, y * 65536 + x, written) + end + + # This only works when the cursor is at the bottom of the scroll range + # For more details, see https://github.com/ruby/reline/pull/577#issuecomment-1646679623 + def scroll_down(x) + return if x.zero? + # We use `\n` instead of CSI + S because CSI + S would cause https://github.com/ruby/reline/issues/576 + @output.write "\n" * x + end + + def clear_screen + if @legacy_console + width, _, _, _, attributes, _, top, _, bottom = get_console_screen_buffer_info + return unless width + fill_length = width * (bottom - top + 1) + screen_topleft = top * 65536 + written = 0.chr * 4 + call_with_console_handle(@FillConsoleOutputCharacter, 0x20, fill_length, screen_topleft, written) + call_with_console_handle(@FillConsoleOutputAttribute, attributes, fill_length, screen_topleft, written) + call_with_console_handle(@SetConsoleCursorPosition, screen_topleft) + else + @output.write "\e[2J" "\e[H" + end + end + + def set_screen_size(rows, columns) + raise NotImplementedError + end + + def hide_cursor + size = 100 + visible = 0 # 0 means false + cursor_info = [size, visible].pack('Li') + call_with_console_handle(@SetConsoleCursorInfo, cursor_info) + end + + def show_cursor + size = 100 + visible = 1 # 1 means true + cursor_info = [size, visible].pack('Li') + call_with_console_handle(@SetConsoleCursorInfo, cursor_info) + end + + def set_winch_handler(&handler) + @winch_handler = handler + end + + def prep + # do nothing + nil + end + + def deprep(otio) + # do nothing + end + + def disable_auto_linewrap(setting = true, &block) + mode = getconsolemode + if 0 == (mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) + if block + begin + setconsolemode(mode & ~ENABLE_WRAP_AT_EOL_OUTPUT) + block.call + ensure + setconsolemode(mode | ENABLE_WRAP_AT_EOL_OUTPUT) + end + else + if setting + setconsolemode(mode & ~ENABLE_WRAP_AT_EOL_OUTPUT) + else + setconsolemode(mode | ENABLE_WRAP_AT_EOL_OUTPUT) + end + end + else + block.call if block + end + end + + class KeyEventRecord + + attr_reader :virtual_key_code, :char_code, :control_key_state, :control_keys + + def initialize(virtual_key_code, char_code, control_key_state) + @virtual_key_code = virtual_key_code + @char_code = char_code + @control_key_state = control_key_state + @enhanced = control_key_state & ENHANCED_KEY != 0 + + (@control_keys = []).tap do |control_keys| + # symbols must be sorted to make comparison is easier later on + control_keys << :ALT if control_key_state & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED) != 0 + control_keys << :CTRL if control_key_state & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) != 0 + control_keys << :SHIFT if control_key_state & SHIFT_PRESSED != 0 + end.freeze + end + + def char + @char_code.chr(Encoding::UTF_8) + end + + def enhanced? + @enhanced + end + + # Verifies if the arguments match with this key event. + # Nil arguments are ignored, but at least one must be passed as non-nil. + # To verify that no control keys were pressed, pass an empty array: `control_keys: []`. + def match?(control_keys: nil, virtual_key_code: nil, char_code: nil) + raise ArgumentError, 'No argument was passed to match key event' if control_keys.nil? && virtual_key_code.nil? && char_code.nil? + + (control_keys.nil? || [*control_keys].sort == @control_keys) && + (virtual_key_code.nil? || @virtual_key_code == virtual_key_code) && + (char_code.nil? || char_code == @char_code) + end + + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor.rb new file mode 100644 index 000000000..0ac760455 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor.rb @@ -0,0 +1,8 @@ +module Reline::KeyActor +end + +require 'reline/key_actor/base' +require 'reline/key_actor/composite' +require 'reline/key_actor/emacs' +require 'reline/key_actor/vi_command' +require 'reline/key_actor/vi_insert' diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/base.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/base.rb new file mode 100644 index 000000000..5bd8609cd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/base.rb @@ -0,0 +1,37 @@ +class Reline::KeyActor::Base + def initialize(mappings = nil) + @matching_bytes = {} + @key_bindings = {} + add_mappings(mappings) if mappings + end + + def add_mappings(mappings) + add([27], :ed_ignore) + 128.times do |key| + func = mappings[key] + meta_func = mappings[key | 0b10000000] + add([key], func) if func + add([27, key], meta_func) if meta_func + end + end + + def add(key, func) + (1...key.size).each do |size| + @matching_bytes[key.take(size)] = true + end + @key_bindings[key] = func + end + + def matching?(key) + @matching_bytes[key] + end + + def get(key) + @key_bindings[key] + end + + def clear + @matching_bytes.clear + @key_bindings.clear + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/composite.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/composite.rb new file mode 100644 index 000000000..37e94ce6c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/composite.rb @@ -0,0 +1,17 @@ +class Reline::KeyActor::Composite + def initialize(key_actors) + @key_actors = key_actors + end + + def matching?(key) + @key_actors.any? { |key_actor| key_actor.matching?(key) } + end + + def get(key) + @key_actors.each do |key_actor| + func = key_actor.get(key) + return func if func + end + nil + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/emacs.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/emacs.rb new file mode 100644 index 000000000..15c45253e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/emacs.rb @@ -0,0 +1,517 @@ +module Reline::KeyActor + EMACS_MAPPING = [ + # 0 ^@ + :em_set_mark, + # 1 ^A + :ed_move_to_beg, + # 2 ^B + :ed_prev_char, + # 3 ^C + :ed_ignore, + # 4 ^D + :em_delete, + # 5 ^E + :ed_move_to_end, + # 6 ^F + :ed_next_char, + # 7 ^G + nil, + # 8 ^H + :em_delete_prev_char, + # 9 ^I + :complete, + # 10 ^J + :ed_newline, + # 11 ^K + :ed_kill_line, + # 12 ^L + :ed_clear_screen, + # 13 ^M + :ed_newline, + # 14 ^N + :ed_next_history, + # 15 ^O + :ed_ignore, + # 16 ^P + :ed_prev_history, + # 17 ^Q + :ed_quoted_insert, + # 18 ^R + :vi_search_prev, + # 19 ^S + :vi_search_next, + # 20 ^T + :ed_transpose_chars, + # 21 ^U + :unix_line_discard, + # 22 ^V + :ed_quoted_insert, + # 23 ^W + :em_kill_region, + # 24 ^X + nil, + # 25 ^Y + :em_yank, + # 26 ^Z + :ed_ignore, + # 27 ^[ + nil, + # 28 ^\ + :ed_ignore, + # 29 ^] + :ed_ignore, + # 30 ^^ + nil, + # 31 ^_ + :undo, + # 32 SPACE + :ed_insert, + # 33 ! + :ed_insert, + # 34 " + :ed_insert, + # 35 # + :ed_insert, + # 36 $ + :ed_insert, + # 37 % + :ed_insert, + # 38 & + :ed_insert, + # 39 ' + :ed_insert, + # 40 ( + :ed_insert, + # 41 ) + :ed_insert, + # 42 * + :ed_insert, + # 43 + + :ed_insert, + # 44 , + :ed_insert, + # 45 - + :ed_insert, + # 46 . + :ed_insert, + # 47 / + :ed_insert, + # 48 0 + :ed_digit, + # 49 1 + :ed_digit, + # 50 2 + :ed_digit, + # 51 3 + :ed_digit, + # 52 4 + :ed_digit, + # 53 5 + :ed_digit, + # 54 6 + :ed_digit, + # 55 7 + :ed_digit, + # 56 8 + :ed_digit, + # 57 9 + :ed_digit, + # 58 : + :ed_insert, + # 59 ; + :ed_insert, + # 60 < + :ed_insert, + # 61 = + :ed_insert, + # 62 > + :ed_insert, + # 63 ? + :ed_insert, + # 64 @ + :ed_insert, + # 65 A + :ed_insert, + # 66 B + :ed_insert, + # 67 C + :ed_insert, + # 68 D + :ed_insert, + # 69 E + :ed_insert, + # 70 F + :ed_insert, + # 71 G + :ed_insert, + # 72 H + :ed_insert, + # 73 I + :ed_insert, + # 74 J + :ed_insert, + # 75 K + :ed_insert, + # 76 L + :ed_insert, + # 77 M + :ed_insert, + # 78 N + :ed_insert, + # 79 O + :ed_insert, + # 80 P + :ed_insert, + # 81 Q + :ed_insert, + # 82 R + :ed_insert, + # 83 S + :ed_insert, + # 84 T + :ed_insert, + # 85 U + :ed_insert, + # 86 V + :ed_insert, + # 87 W + :ed_insert, + # 88 X + :ed_insert, + # 89 Y + :ed_insert, + # 90 Z + :ed_insert, + # 91 [ + :ed_insert, + # 92 \ + :ed_insert, + # 93 ] + :ed_insert, + # 94 ^ + :ed_insert, + # 95 _ + :ed_insert, + # 96 ` + :ed_insert, + # 97 a + :ed_insert, + # 98 b + :ed_insert, + # 99 c + :ed_insert, + # 100 d + :ed_insert, + # 101 e + :ed_insert, + # 102 f + :ed_insert, + # 103 g + :ed_insert, + # 104 h + :ed_insert, + # 105 i + :ed_insert, + # 106 j + :ed_insert, + # 107 k + :ed_insert, + # 108 l + :ed_insert, + # 109 m + :ed_insert, + # 110 n + :ed_insert, + # 111 o + :ed_insert, + # 112 p + :ed_insert, + # 113 q + :ed_insert, + # 114 r + :ed_insert, + # 115 s + :ed_insert, + # 116 t + :ed_insert, + # 117 u + :ed_insert, + # 118 v + :ed_insert, + # 119 w + :ed_insert, + # 120 x + :ed_insert, + # 121 y + :ed_insert, + # 122 z + :ed_insert, + # 123 { + :ed_insert, + # 124 | + :ed_insert, + # 125 } + :ed_insert, + # 126 ~ + :ed_insert, + # 127 ^? + :em_delete_prev_char, + # 128 M-^@ + nil, + # 129 M-^A + nil, + # 130 M-^B + nil, + # 131 M-^C + nil, + # 132 M-^D + nil, + # 133 M-^E + nil, + # 134 M-^F + nil, + # 135 M-^G + nil, + # 136 M-^H + :ed_delete_prev_word, + # 137 M-^I + nil, + # 138 M-^J + :key_newline, + # 139 M-^K + nil, + # 140 M-^L + :ed_clear_screen, + # 141 M-^M + :key_newline, + # 142 M-^N + nil, + # 143 M-^O + nil, + # 144 M-^P + nil, + # 145 M-^Q + nil, + # 146 M-^R + nil, + # 147 M-^S + nil, + # 148 M-^T + nil, + # 149 M-^U + nil, + # 150 M-^V + nil, + # 151 M-^W + nil, + # 152 M-^X + nil, + # 153 M-^Y + :em_yank_pop, + # 154 M-^Z + nil, + # 155 M-^[ + nil, + # 156 M-^\ + nil, + # 157 M-^] + nil, + # 158 M-^^ + nil, + # 159 M-^_ + :redo, + # 160 M-SPACE + :em_set_mark, + # 161 M-! + nil, + # 162 M-" + nil, + # 163 M-# + nil, + # 164 M-$ + nil, + # 165 M-% + nil, + # 166 M-& + nil, + # 167 M-' + nil, + # 168 M-( + nil, + # 169 M-) + nil, + # 170 M-* + nil, + # 171 M-+ + nil, + # 172 M-, + nil, + # 173 M-- + nil, + # 174 M-. + nil, + # 175 M-/ + nil, + # 176 M-0 + :ed_argument_digit, + # 177 M-1 + :ed_argument_digit, + # 178 M-2 + :ed_argument_digit, + # 179 M-3 + :ed_argument_digit, + # 180 M-4 + :ed_argument_digit, + # 181 M-5 + :ed_argument_digit, + # 182 M-6 + :ed_argument_digit, + # 183 M-7 + :ed_argument_digit, + # 184 M-8 + :ed_argument_digit, + # 185 M-9 + :ed_argument_digit, + # 186 M-: + nil, + # 187 M-; + nil, + # 188 M-< + :beginning_of_history, + # 189 M-= + nil, + # 190 M-> + :end_of_history, + # 191 M-? + nil, + # 192 M-@ + nil, + # 193 M-A + nil, + # 194 M-B + :ed_prev_word, + # 195 M-C + :em_capitol_case, + # 196 M-D + :em_delete_next_word, + # 197 M-E + nil, + # 198 M-F + :em_next_word, + # 199 M-G + nil, + # 200 M-H + nil, + # 201 M-I + nil, + # 202 M-J + nil, + # 203 M-K + nil, + # 204 M-L + :em_lower_case, + # 205 M-M + nil, + # 206 M-N + :vi_search_next, + # 207 M-O + nil, + # 208 M-P + :vi_search_prev, + # 209 M-Q + nil, + # 210 M-R + nil, + # 211 M-S + nil, + # 212 M-T + nil, + # 213 M-U + :em_upper_case, + # 214 M-V + nil, + # 215 M-W + nil, + # 216 M-X + nil, + # 217 M-Y + :em_yank_pop, + # 218 M-Z + nil, + # 219 M-[ + nil, + # 220 M-\ + nil, + # 221 M-] + nil, + # 222 M-^ + nil, + # 223 M-_ + nil, + # 224 M-` + nil, + # 225 M-a + nil, + # 226 M-b + :ed_prev_word, + # 227 M-c + :em_capitol_case, + # 228 M-d + :em_delete_next_word, + # 229 M-e + nil, + # 230 M-f + :em_next_word, + # 231 M-g + nil, + # 232 M-h + nil, + # 233 M-i + nil, + # 234 M-j + nil, + # 235 M-k + nil, + # 236 M-l + :em_lower_case, + # 237 M-m + nil, + # 238 M-n + :vi_search_next, + # 239 M-o + nil, + # 240 M-p + :vi_search_prev, + # 241 M-q + nil, + # 242 M-r + nil, + # 243 M-s + nil, + # 244 M-t + :ed_transpose_words, + # 245 M-u + :em_upper_case, + # 246 M-v + nil, + # 247 M-w + nil, + # 248 M-x + nil, + # 249 M-y + nil, + # 250 M-z + nil, + # 251 M-{ + nil, + # 252 M-| + nil, + # 253 M-} + nil, + # 254 M-~ + nil, + # 255 M-^? + :ed_delete_prev_word + # EOF + ] +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/vi_command.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/vi_command.rb new file mode 100644 index 000000000..400f88477 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/vi_command.rb @@ -0,0 +1,518 @@ +module Reline::KeyActor + VI_COMMAND_MAPPING = [ + # 0 ^@ + nil, + # 1 ^A + :ed_move_to_beg, + # 2 ^B + nil, + # 3 ^C + :ed_ignore, + # 4 ^D + :vi_end_of_transmission, + # 5 ^E + :ed_move_to_end, + # 6 ^F + nil, + # 7 ^G + nil, + # 8 ^H + :ed_prev_char, + # 9 ^I + nil, + # 10 ^J + :ed_newline, + # 11 ^K + :ed_kill_line, + # 12 ^L + :ed_clear_screen, + # 13 ^M + :ed_newline, + # 14 ^N + :ed_next_history, + # 15 ^O + :ed_ignore, + # 16 ^P + :ed_prev_history, + # 17 ^Q + :ed_ignore, + # 18 ^R + :vi_search_prev, + # 19 ^S + :ed_ignore, + # 20 ^T + :ed_transpose_chars, + # 21 ^U + :vi_kill_line_prev, + # 22 ^V + :ed_quoted_insert, + # 23 ^W + :ed_delete_prev_word, + # 24 ^X + nil, + # 25 ^Y + :em_yank, + # 26 ^Z + nil, + # 27 ^[ + nil, + # 28 ^\ + :ed_ignore, + # 29 ^] + nil, + # 30 ^^ + nil, + # 31 ^_ + nil, + # 32 SPACE + :ed_next_char, + # 33 ! + nil, + # 34 " + nil, + # 35 # + :vi_comment_out, + # 36 $ + :ed_move_to_end, + # 37 % + nil, + # 38 & + nil, + # 39 ' + nil, + # 40 ( + nil, + # 41 ) + nil, + # 42 * + nil, + # 43 + + :ed_next_history, + # 44 , + nil, + # 45 - + :ed_prev_history, + # 46 . + nil, + # 47 / + :vi_search_prev, + # 48 0 + :vi_zero, + # 49 1 + :ed_argument_digit, + # 50 2 + :ed_argument_digit, + # 51 3 + :ed_argument_digit, + # 52 4 + :ed_argument_digit, + # 53 5 + :ed_argument_digit, + # 54 6 + :ed_argument_digit, + # 55 7 + :ed_argument_digit, + # 56 8 + :ed_argument_digit, + # 57 9 + :ed_argument_digit, + # 58 : + nil, + # 59 ; + nil, + # 60 < + nil, + # 61 = + nil, + # 62 > + nil, + # 63 ? + :vi_search_next, + # 64 @ + :vi_alias, + # 65 A + :vi_add_at_eol, + # 66 B + :vi_prev_big_word, + # 67 C + :vi_change_to_eol, + # 68 D + :ed_kill_line, + # 69 E + :vi_end_big_word, + # 70 F + :vi_prev_char, + # 71 G + :vi_to_history_line, + # 72 H + nil, + # 73 I + :vi_insert_at_bol, + # 74 J + :vi_join_lines, + # 75 K + :vi_search_prev, + # 76 L + nil, + # 77 M + nil, + # 78 N + nil, + # 79 O + nil, + # 80 P + :vi_paste_prev, + # 81 Q + nil, + # 82 R + nil, + # 83 S + nil, + # 84 T + :vi_to_prev_char, + # 85 U + nil, + # 86 V + nil, + # 87 W + :vi_next_big_word, + # 88 X + :ed_delete_prev_char, + # 89 Y + nil, + # 90 Z + nil, + # 91 [ + nil, + # 92 \ + nil, + # 93 ] + nil, + # 94 ^ + :vi_first_print, + # 95 _ + nil, + # 96 ` + nil, + # 97 a + :vi_add, + # 98 b + :vi_prev_word, + # 99 c + :vi_change_meta, + # 100 d + :vi_delete_meta, + # 101 e + :vi_end_word, + # 102 f + :vi_next_char, + # 103 g + nil, + # 104 h + :ed_prev_char, + # 105 i + :vi_insert, + # 106 j + :ed_next_history, + # 107 k + :ed_prev_history, + # 108 l + :ed_next_char, + # 109 m + nil, + # 110 n + nil, + # 111 o + nil, + # 112 p + :vi_paste_next, + # 113 q + nil, + # 114 r + :vi_replace_char, + # 115 s + nil, + # 116 t + :vi_to_next_char, + # 117 u + nil, + # 118 v + :vi_histedit, + # 119 w + :vi_next_word, + # 120 x + :ed_delete_next_char, + # 121 y + :vi_yank, + # 122 z + nil, + # 123 { + nil, + # 124 | + :vi_to_column, + # 125 } + nil, + # 126 ~ + nil, + # 127 ^? + :em_delete_prev_char, + # 128 M-^@ + nil, + # 129 M-^A + nil, + # 130 M-^B + nil, + # 131 M-^C + nil, + # 132 M-^D + nil, + # 133 M-^E + nil, + # 134 M-^F + nil, + # 135 M-^G + nil, + # 136 M-^H + nil, + # 137 M-^I + nil, + # 138 M-^J + nil, + # 139 M-^K + nil, + # 140 M-^L + nil, + # 141 M-^M + nil, + # 142 M-^N + nil, + # 143 M-^O + nil, + # 144 M-^P + nil, + # 145 M-^Q + nil, + # 146 M-^R + nil, + # 147 M-^S + nil, + # 148 M-^T + nil, + # 149 M-^U + nil, + # 150 M-^V + nil, + # 151 M-^W + nil, + # 152 M-^X + nil, + # 153 M-^Y + nil, + # 154 M-^Z + nil, + # 155 M-^[ + nil, + # 156 M-^\ + nil, + # 157 M-^] + nil, + # 158 M-^^ + nil, + # 159 M-^_ + nil, + # 160 M-SPACE + nil, + # 161 M-! + nil, + # 162 M-" + nil, + # 163 M-# + nil, + # 164 M-$ + nil, + # 165 M-% + nil, + # 166 M-& + nil, + # 167 M-' + nil, + # 168 M-( + nil, + # 169 M-) + nil, + # 170 M-* + nil, + # 171 M-+ + nil, + # 172 M-, + nil, + # 173 M-- + nil, + # 174 M-. + nil, + # 175 M-/ + nil, + # 176 M-0 + nil, + # 177 M-1 + nil, + # 178 M-2 + nil, + # 179 M-3 + nil, + # 180 M-4 + nil, + # 181 M-5 + nil, + # 182 M-6 + nil, + # 183 M-7 + nil, + # 184 M-8 + nil, + # 185 M-9 + nil, + # 186 M-: + nil, + # 187 M-; + nil, + # 188 M-< + nil, + # 189 M-= + nil, + # 190 M-> + nil, + # 191 M-? + nil, + # 192 M-@ + nil, + # 193 M-A + nil, + # 194 M-B + nil, + # 195 M-C + nil, + # 196 M-D + nil, + # 197 M-E + nil, + # 198 M-F + nil, + # 199 M-G + nil, + # 200 M-H + nil, + # 201 M-I + nil, + # 202 M-J + nil, + # 203 M-K + nil, + # 204 M-L + nil, + # 205 M-M + nil, + # 206 M-N + nil, + # 207 M-O + nil, + # 208 M-P + nil, + # 209 M-Q + nil, + # 210 M-R + nil, + # 211 M-S + nil, + # 212 M-T + nil, + # 213 M-U + nil, + # 214 M-V + nil, + # 215 M-W + nil, + # 216 M-X + nil, + # 217 M-Y + nil, + # 218 M-Z + nil, + # 219 M-[ + nil, + # 220 M-\ + nil, + # 221 M-] + nil, + # 222 M-^ + nil, + # 223 M-_ + nil, + # 224 M-` + nil, + # 225 M-a + nil, + # 226 M-b + nil, + # 227 M-c + nil, + # 228 M-d + nil, + # 229 M-e + nil, + # 230 M-f + nil, + # 231 M-g + nil, + # 232 M-h + nil, + # 233 M-i + nil, + # 234 M-j + nil, + # 235 M-k + nil, + # 236 M-l + nil, + # 237 M-m + nil, + # 238 M-n + nil, + # 239 M-o + nil, + # 240 M-p + nil, + # 241 M-q + nil, + # 242 M-r + nil, + # 243 M-s + nil, + # 244 M-t + nil, + # 245 M-u + nil, + # 246 M-v + nil, + # 247 M-w + nil, + # 248 M-x + nil, + # 249 M-y + nil, + # 250 M-z + nil, + # 251 M-{ + nil, + # 252 M-| + nil, + # 253 M-} + nil, + # 254 M-~ + nil, + # 255 M-^? + nil + # EOF + ] +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/vi_insert.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/vi_insert.rb new file mode 100644 index 000000000..235b6fdf3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_actor/vi_insert.rb @@ -0,0 +1,517 @@ +module Reline::KeyActor + VI_INSERT_MAPPING = [ + # 0 ^@ + nil, + # 1 ^A + :ed_insert, + # 2 ^B + :ed_insert, + # 3 ^C + :ed_insert, + # 4 ^D + :vi_list_or_eof, + # 5 ^E + :ed_insert, + # 6 ^F + :ed_insert, + # 7 ^G + :ed_insert, + # 8 ^H + :vi_delete_prev_char, + # 9 ^I + :complete, + # 10 ^J + :ed_newline, + # 11 ^K + :ed_insert, + # 12 ^L + :ed_insert, + # 13 ^M + :ed_newline, + # 14 ^N + :menu_complete, + # 15 ^O + :ed_insert, + # 16 ^P + :menu_complete_backward, + # 17 ^Q + :ed_ignore, + # 18 ^R + :vi_search_prev, + # 19 ^S + :vi_search_next, + # 20 ^T + :ed_transpose_chars, + # 21 ^U + :vi_kill_line_prev, + # 22 ^V + :ed_quoted_insert, + # 23 ^W + :ed_delete_prev_word, + # 24 ^X + :ed_insert, + # 25 ^Y + :em_yank, + # 26 ^Z + :ed_insert, + # 27 ^[ + :vi_command_mode, + # 28 ^\ + :ed_ignore, + # 29 ^] + :ed_insert, + # 30 ^^ + :ed_insert, + # 31 ^_ + :ed_insert, + # 32 SPACE + :ed_insert, + # 33 ! + :ed_insert, + # 34 " + :ed_insert, + # 35 # + :ed_insert, + # 36 $ + :ed_insert, + # 37 % + :ed_insert, + # 38 & + :ed_insert, + # 39 ' + :ed_insert, + # 40 ( + :ed_insert, + # 41 ) + :ed_insert, + # 42 * + :ed_insert, + # 43 + + :ed_insert, + # 44 , + :ed_insert, + # 45 - + :ed_insert, + # 46 . + :ed_insert, + # 47 / + :ed_insert, + # 48 0 + :ed_digit, + # 49 1 + :ed_digit, + # 50 2 + :ed_digit, + # 51 3 + :ed_digit, + # 52 4 + :ed_digit, + # 53 5 + :ed_digit, + # 54 6 + :ed_digit, + # 55 7 + :ed_digit, + # 56 8 + :ed_digit, + # 57 9 + :ed_digit, + # 58 : + :ed_insert, + # 59 ; + :ed_insert, + # 60 < + :ed_insert, + # 61 = + :ed_insert, + # 62 > + :ed_insert, + # 63 ? + :ed_insert, + # 64 @ + :ed_insert, + # 65 A + :ed_insert, + # 66 B + :ed_insert, + # 67 C + :ed_insert, + # 68 D + :ed_insert, + # 69 E + :ed_insert, + # 70 F + :ed_insert, + # 71 G + :ed_insert, + # 72 H + :ed_insert, + # 73 I + :ed_insert, + # 74 J + :ed_insert, + # 75 K + :ed_insert, + # 76 L + :ed_insert, + # 77 M + :ed_insert, + # 78 N + :ed_insert, + # 79 O + :ed_insert, + # 80 P + :ed_insert, + # 81 Q + :ed_insert, + # 82 R + :ed_insert, + # 83 S + :ed_insert, + # 84 T + :ed_insert, + # 85 U + :ed_insert, + # 86 V + :ed_insert, + # 87 W + :ed_insert, + # 88 X + :ed_insert, + # 89 Y + :ed_insert, + # 90 Z + :ed_insert, + # 91 [ + :ed_insert, + # 92 \ + :ed_insert, + # 93 ] + :ed_insert, + # 94 ^ + :ed_insert, + # 95 _ + :ed_insert, + # 96 ` + :ed_insert, + # 97 a + :ed_insert, + # 98 b + :ed_insert, + # 99 c + :ed_insert, + # 100 d + :ed_insert, + # 101 e + :ed_insert, + # 102 f + :ed_insert, + # 103 g + :ed_insert, + # 104 h + :ed_insert, + # 105 i + :ed_insert, + # 106 j + :ed_insert, + # 107 k + :ed_insert, + # 108 l + :ed_insert, + # 109 m + :ed_insert, + # 110 n + :ed_insert, + # 111 o + :ed_insert, + # 112 p + :ed_insert, + # 113 q + :ed_insert, + # 114 r + :ed_insert, + # 115 s + :ed_insert, + # 116 t + :ed_insert, + # 117 u + :ed_insert, + # 118 v + :ed_insert, + # 119 w + :ed_insert, + # 120 x + :ed_insert, + # 121 y + :ed_insert, + # 122 z + :ed_insert, + # 123 { + :ed_insert, + # 124 | + :ed_insert, + # 125 } + :ed_insert, + # 126 ~ + :ed_insert, + # 127 ^? + :vi_delete_prev_char, + # 128 M-^@ + nil, + # 129 M-^A + nil, + # 130 M-^B + nil, + # 131 M-^C + nil, + # 132 M-^D + nil, + # 133 M-^E + nil, + # 134 M-^F + nil, + # 135 M-^G + nil, + # 136 M-^H + nil, + # 137 M-^I + nil, + # 138 M-^J + :key_newline, + # 139 M-^K + nil, + # 140 M-^L + nil, + # 141 M-^M + :key_newline, + # 142 M-^N + nil, + # 143 M-^O + nil, + # 144 M-^P + nil, + # 145 M-^Q + nil, + # 146 M-^R + nil, + # 147 M-^S + nil, + # 148 M-^T + nil, + # 149 M-^U + nil, + # 150 M-^V + nil, + # 151 M-^W + nil, + # 152 M-^X + nil, + # 153 M-^Y + nil, + # 154 M-^Z + nil, + # 155 M-^[ + nil, + # 156 M-^\ + nil, + # 157 M-^] + nil, + # 158 M-^^ + nil, + # 159 M-^_ + nil, + # 160 M-SPACE + nil, + # 161 M-! + nil, + # 162 M-" + nil, + # 163 M-# + nil, + # 164 M-$ + nil, + # 165 M-% + nil, + # 166 M-& + nil, + # 167 M-' + nil, + # 168 M-( + nil, + # 169 M-) + nil, + # 170 M-* + nil, + # 171 M-+ + nil, + # 172 M-, + nil, + # 173 M-- + nil, + # 174 M-. + nil, + # 175 M-/ + nil, + # 176 M-0 + nil, + # 177 M-1 + nil, + # 178 M-2 + nil, + # 179 M-3 + nil, + # 180 M-4 + nil, + # 181 M-5 + nil, + # 182 M-6 + nil, + # 183 M-7 + nil, + # 184 M-8 + nil, + # 185 M-9 + nil, + # 186 M-: + nil, + # 187 M-; + nil, + # 188 M-< + nil, + # 189 M-= + nil, + # 190 M-> + nil, + # 191 M-? + nil, + # 192 M-@ + nil, + # 193 M-A + nil, + # 194 M-B + nil, + # 195 M-C + nil, + # 196 M-D + nil, + # 197 M-E + nil, + # 198 M-F + nil, + # 199 M-G + nil, + # 200 M-H + nil, + # 201 M-I + nil, + # 202 M-J + nil, + # 203 M-K + nil, + # 204 M-L + nil, + # 205 M-M + nil, + # 206 M-N + nil, + # 207 M-O + nil, + # 208 M-P + nil, + # 209 M-Q + nil, + # 210 M-R + nil, + # 211 M-S + nil, + # 212 M-T + nil, + # 213 M-U + nil, + # 214 M-V + nil, + # 215 M-W + nil, + # 216 M-X + nil, + # 217 M-Y + nil, + # 218 M-Z + nil, + # 219 M-[ + nil, + # 220 M-\ + nil, + # 221 M-] + nil, + # 222 M-^ + nil, + # 223 M-_ + nil, + # 224 M-` + nil, + # 225 M-a + nil, + # 226 M-b + nil, + # 227 M-c + nil, + # 228 M-d + nil, + # 229 M-e + nil, + # 230 M-f + nil, + # 231 M-g + nil, + # 232 M-h + nil, + # 233 M-i + nil, + # 234 M-j + nil, + # 235 M-k + nil, + # 236 M-l + nil, + # 237 M-m + nil, + # 238 M-n + nil, + # 239 M-o + nil, + # 240 M-p + nil, + # 241 M-q + nil, + # 242 M-r + nil, + # 243 M-s + nil, + # 244 M-t + nil, + # 245 M-u + nil, + # 246 M-v + nil, + # 247 M-w + nil, + # 248 M-x + nil, + # 249 M-y + nil, + # 250 M-z + nil, + # 251 M-{ + nil, + # 252 M-| + nil, + # 253 M-} + nil, + # 254 M-~ + nil, + # 255 M-^? + nil + # EOF + ] +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_stroke.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_stroke.rb new file mode 100644 index 000000000..4999225c9 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/key_stroke.rb @@ -0,0 +1,119 @@ +class Reline::KeyStroke + ESC_BYTE = 27 + CSI_PARAMETER_BYTES_RANGE = 0x30..0x3f + CSI_INTERMEDIATE_BYTES_RANGE = (0x20..0x2f) + + attr_accessor :encoding + + def initialize(config, encoding) + @config = config + @encoding = encoding + end + + # Input exactly matches to a key sequence + MATCHING = :matching + # Input partially matches to a key sequence + MATCHED = :matched + # Input matches to a key sequence and the key sequence is a prefix of another key sequence + MATCHING_MATCHED = :matching_matched + # Input does not match to any key sequence + UNMATCHED = :unmatched + + def match_status(input) + matching = key_mapping.matching?(input) + matched = key_mapping.get(input) + if matching && matched + MATCHING_MATCHED + elsif matching + MATCHING + elsif matched + MATCHED + elsif input[0] == ESC_BYTE + match_unknown_escape_sequence(input, vi_mode: @config.editing_mode_is?(:vi_insert, :vi_command)) + else + s = input.pack('c*').force_encoding(@encoding) + if s.valid_encoding? + s.size == 1 ? MATCHED : UNMATCHED + else + # Invalid string is MATCHING (part of valid string) or MATCHED (invalid bytes to be ignored) + MATCHING_MATCHED + end + end + end + + def expand(input) + matched_bytes = nil + (1..input.size).each do |i| + bytes = input.take(i) + status = match_status(bytes) + matched_bytes = bytes if status == MATCHED || status == MATCHING_MATCHED + break if status == MATCHED || status == UNMATCHED + end + return [[], []] unless matched_bytes + + func = key_mapping.get(matched_bytes) + s = matched_bytes.pack('c*').force_encoding(@encoding) + if func.is_a?(Array) + # Perform simple macro expansion for single byte key bindings. + # Multibyte key bindings and recursive macro expansion are not supported yet. + macro = func.pack('c*').force_encoding(@encoding) + keys = macro.chars.map do |c| + f = key_mapping.get(c.bytes) + Reline::Key.new(c, f.is_a?(Symbol) ? f : :ed_insert, false) + end + elsif func + keys = [Reline::Key.new(s, func, false)] + else + if s.valid_encoding? && s.size == 1 + keys = [Reline::Key.new(s, :ed_insert, false)] + else + keys = [] + end + end + + [keys, input.drop(matched_bytes.size)] + end + + private + + # returns match status of CSI/SS3 sequence and matched length + def match_unknown_escape_sequence(input, vi_mode: false) + idx = 0 + return UNMATCHED unless input[idx] == ESC_BYTE + idx += 1 + idx += 1 if input[idx] == ESC_BYTE + + case input[idx] + when nil + if idx == 1 # `ESC` + return MATCHING_MATCHED + else # `ESC ESC` + return MATCHING + end + when 91 # == '['.ord + # CSI sequence `ESC [ ... char` + idx += 1 + idx += 1 while idx < input.size && CSI_PARAMETER_BYTES_RANGE.cover?(input[idx]) + idx += 1 while idx < input.size && CSI_INTERMEDIATE_BYTES_RANGE.cover?(input[idx]) + when 79 # == 'O'.ord + # SS3 sequence `ESC O char` + idx += 1 + else + # `ESC char` or `ESC ESC char` + return UNMATCHED if vi_mode + end + + case input.size + when idx + MATCHING + when idx + 1 + MATCHED + else + UNMATCHED + end + end + + def key_mapping + @config.key_bindings + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/kill_ring.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/kill_ring.rb new file mode 100644 index 000000000..201f6f3ca --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/kill_ring.rb @@ -0,0 +1,125 @@ +class Reline::KillRing + include Enumerable + + module State + FRESH = :fresh + CONTINUED = :continued + PROCESSED = :processed + YANK = :yank + end + + RingPoint = Struct.new(:backward, :forward, :str) do + def initialize(str) + super(nil, nil, str) + end + + def ==(other) + equal?(other) + end + end + + class RingBuffer + attr_reader :size + attr_reader :head + + def initialize(max = 1024) + @max = max + @size = 0 + @head = nil # reading head of ring-shaped tape + end + + def <<(point) + if @size.zero? + @head = point + @head.backward = @head + @head.forward = @head + @size = 1 + elsif @size >= @max + tail = @head.forward + new_tail = tail.forward + @head.forward = point + point.backward = @head + new_tail.backward = point + point.forward = new_tail + @head = point + else + tail = @head.forward + @head.forward = point + point.backward = @head + tail.backward = point + point.forward = tail + @head = point + @size += 1 + end + end + + def empty? + @size.zero? + end + end + + def initialize(max = 1024) + @ring = RingBuffer.new(max) + @ring_pointer = nil + @buffer = nil + @state = State::FRESH + end + + def append(string, before_p = false) + case @state + when State::FRESH, State::YANK + @ring << RingPoint.new(+string) + @state = State::CONTINUED + when State::CONTINUED, State::PROCESSED + if before_p + @ring.head.str.prepend(string) + else + @ring.head.str.concat(string) + end + @state = State::CONTINUED + end + end + + def process + case @state + when State::FRESH + # nothing to do + when State::CONTINUED + @state = State::PROCESSED + when State::PROCESSED + @state = State::FRESH + when State::YANK + # nothing to do + end + end + + def yank + unless @ring.empty? + @state = State::YANK + @ring_pointer = @ring.head + @ring_pointer.str + else + nil + end + end + + def yank_pop + if @state == State::YANK + prev_yank = @ring_pointer.str + @ring_pointer = @ring_pointer.backward + [@ring_pointer.str, prev_yank] + else + nil + end + end + + def each + start = head = @ring.head + loop do + break if head.nil? + yield head.str + head = head.backward + break if head == start + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/line_editor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/line_editor.rb new file mode 100644 index 000000000..763a2171e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/line_editor.rb @@ -0,0 +1,2356 @@ +require 'reline/kill_ring' +require 'reline/unicode' + +require 'tempfile' + +class Reline::LineEditor + # TODO: Use "private alias_method" idiom after drop Ruby 2.5. + attr_reader :byte_pointer + attr_accessor :confirm_multiline_termination_proc + attr_accessor :completion_proc + attr_accessor :completion_append_character + attr_accessor :output_modifier_proc + attr_accessor :prompt_proc + attr_accessor :auto_indent_proc + attr_accessor :dig_perfect_match_proc + + VI_MOTIONS = %i{ + ed_prev_char + ed_next_char + vi_zero + ed_move_to_beg + ed_move_to_end + vi_to_column + vi_next_char + vi_prev_char + vi_next_word + vi_prev_word + vi_to_next_char + vi_to_prev_char + vi_end_word + vi_next_big_word + vi_prev_big_word + vi_end_big_word + } + + module CompletionState + NORMAL = :normal + MENU = :menu + MENU_WITH_PERFECT_MATCH = :menu_with_perfect_match + PERFECT_MATCH = :perfect_match + end + + RenderedScreen = Struct.new(:base_y, :lines, :cursor_y, keyword_init: true) + + CompletionJourneyState = Struct.new(:line_index, :pre, :target, :post, :list, :pointer) + NullActionState = [nil, nil].freeze + + class MenuInfo + attr_reader :list + + def initialize(list) + @list = list + end + + def lines(screen_width) + return [] if @list.empty? + + list = @list.sort + sizes = list.map { |item| Reline::Unicode.calculate_width(item) } + item_width = sizes.max + 2 + num_cols = [screen_width / item_width, 1].max + num_rows = list.size.fdiv(num_cols).ceil + list_with_padding = list.zip(sizes).map { |item, size| item + ' ' * (item_width - size) } + aligned = (list_with_padding + [nil] * (num_rows * num_cols - list_with_padding.size)).each_slice(num_rows).to_a.transpose + aligned.map do |row| + row.join.rstrip + end + end + end + + MINIMUM_SCROLLBAR_HEIGHT = 1 + + def initialize(config) + @config = config + @completion_append_character = '' + @screen_size = [0, 0] # Should be initialized with actual winsize in LineEditor#reset + reset_variables + end + + def io_gate + Reline::IOGate + end + + def encoding + io_gate.encoding + end + + def set_pasting_state(in_pasting) + # While pasting, text to be inserted is stored to @continuous_insertion_buffer. + # After pasting, this buffer should be force inserted. + process_insert(force: true) if @in_pasting && !in_pasting + @in_pasting = in_pasting + end + + private def check_mode_string + if @config.show_mode_in_prompt + if @config.editing_mode_is?(:vi_command) + @config.vi_cmd_mode_string + elsif @config.editing_mode_is?(:vi_insert) + @config.vi_ins_mode_string + elsif @config.editing_mode_is?(:emacs) + @config.emacs_mode_string + else + '?' + end + end + end + + private def check_multiline_prompt(buffer, mode_string) + if @vi_arg + prompt = "(arg: #{@vi_arg}) " + elsif @searching_prompt + prompt = @searching_prompt + else + prompt = @prompt + end + if !@is_multiline + mode_string = check_mode_string + prompt = mode_string + prompt if mode_string + [prompt] + [''] * (buffer.size - 1) + elsif @prompt_proc + prompt_list = @prompt_proc.(buffer).map { |pr| pr.gsub("\n", "\\n") } + prompt_list.map!{ prompt } if @vi_arg or @searching_prompt + prompt_list = [prompt] if prompt_list.empty? + prompt_list = prompt_list.map{ |pr| mode_string + pr } if mode_string + prompt = prompt_list[@line_index] + prompt = prompt_list[0] if prompt.nil? + prompt = prompt_list.last if prompt.nil? + if buffer.size > prompt_list.size + (buffer.size - prompt_list.size).times do + prompt_list << prompt_list.last + end + end + prompt_list + else + prompt = mode_string + prompt if mode_string + [prompt] * buffer.size + end + end + + def reset(prompt = '') + @screen_size = Reline::IOGate.get_screen_size + reset_variables(prompt) + @rendered_screen.base_y = Reline::IOGate.cursor_pos.y + if ENV.key?('RELINE_ALT_SCROLLBAR') + @full_block = '::' + @upper_half_block = "''" + @lower_half_block = '..' + @block_elem_width = 2 + elsif Reline::IOGate.win? + @full_block = '█' + @upper_half_block = '▀' + @lower_half_block = '▄' + @block_elem_width = 1 + elsif encoding == Encoding::UTF_8 + @full_block = '█' + @upper_half_block = '▀' + @lower_half_block = '▄' + @block_elem_width = Reline::Unicode.calculate_width('█') + else + @full_block = '::' + @upper_half_block = "''" + @lower_half_block = '..' + @block_elem_width = 2 + end + end + + def handle_signal + handle_interrupted + handle_resized + end + + private def handle_resized + return unless @resized + + @screen_size = Reline::IOGate.get_screen_size + @resized = false + scroll_into_view + Reline::IOGate.move_cursor_up @rendered_screen.cursor_y + @rendered_screen.base_y = Reline::IOGate.cursor_pos.y + clear_rendered_screen_cache + render + end + + private def handle_interrupted + return unless @interrupted + + @interrupted = false + clear_dialogs + render + cursor_to_bottom_offset = @rendered_screen.lines.size - @rendered_screen.cursor_y + Reline::IOGate.scroll_down cursor_to_bottom_offset + Reline::IOGate.move_cursor_column 0 + clear_rendered_screen_cache + case @old_trap + when 'DEFAULT', 'SYSTEM_DEFAULT' + raise Interrupt + when 'IGNORE' + # Do nothing + when 'EXIT' + exit + else + @old_trap.call if @old_trap.respond_to?(:call) + end + end + + def set_signal_handlers + Reline::IOGate.set_winch_handler do + @resized = true + end + @old_trap = Signal.trap('INT') do + @interrupted = true + end + end + + def finalize + Signal.trap('INT', @old_trap) + end + + def eof? + @eof + end + + def reset_variables(prompt = '') + @prompt = prompt.gsub("\n", "\\n") + @mark_pointer = nil + @is_multiline = false + @finished = false + @history_pointer = nil + @kill_ring ||= Reline::KillRing.new + @vi_clipboard = '' + @vi_arg = nil + @waiting_proc = nil + @vi_waiting_operator = nil + @vi_waiting_operator_arg = nil + @completion_journey_state = nil + @completion_state = CompletionState::NORMAL + @perfect_matched = nil + @menu_info = nil + @searching_prompt = nil + @just_cursor_moving = false + @eof = false + @continuous_insertion_buffer = String.new(encoding: encoding) + @scroll_partial_screen = 0 + @drop_terminate_spaces = false + @in_pasting = false + @auto_indent_proc = nil + @dialogs = [] + @interrupted = false + @resized = false + @cache = {} + @rendered_screen = RenderedScreen.new(base_y: 0, lines: [], cursor_y: 0) + @undo_redo_history = [[[""], 0, 0]] + @undo_redo_index = 0 + @restoring = false + @prev_action_state = NullActionState + @next_action_state = NullActionState + reset_line + end + + def reset_line + @byte_pointer = 0 + @buffer_of_lines = [String.new(encoding: encoding)] + @line_index = 0 + @cache.clear + @line_backup_in_history = nil + end + + def multiline_on + @is_multiline = true + end + + def multiline_off + @is_multiline = false + end + + private def insert_new_line(cursor_line, next_line) + @buffer_of_lines.insert(@line_index + 1, String.new(next_line, encoding: encoding)) + @buffer_of_lines[@line_index] = cursor_line + @line_index += 1 + @byte_pointer = 0 + if @auto_indent_proc && !@in_pasting + if next_line.empty? + ( + # For compatibility, use this calculation instead of just `process_auto_indent @line_index - 1, cursor_dependent: false` + indent1 = @auto_indent_proc.(@buffer_of_lines.take(@line_index - 1).push(''), @line_index - 1, 0, true) + indent2 = @auto_indent_proc.(@buffer_of_lines.take(@line_index), @line_index - 1, @buffer_of_lines[@line_index - 1].bytesize, false) + indent = indent2 || indent1 + @buffer_of_lines[@line_index - 1] = ' ' * indent + @buffer_of_lines[@line_index - 1].gsub(/\A\s*/, '') + ) + process_auto_indent @line_index, add_newline: true + else + process_auto_indent @line_index - 1, cursor_dependent: false + process_auto_indent @line_index, add_newline: true # Need for compatibility + process_auto_indent @line_index, cursor_dependent: false + end + end + end + + private def split_line_by_width(str, max_width, offset: 0) + Reline::Unicode.split_line_by_width(str, max_width, encoding, offset: offset) + end + + def current_byte_pointer_cursor + calculate_width(current_line.byteslice(0, @byte_pointer)) + end + + private def calculate_nearest_cursor(cursor) + line_to_calc = current_line + new_cursor_max = calculate_width(line_to_calc) + new_cursor = 0 + new_byte_pointer = 0 + height = 1 + max_width = screen_width + if @config.editing_mode_is?(:vi_command) + last_byte_size = Reline::Unicode.get_prev_mbchar_size(line_to_calc, line_to_calc.bytesize) + if last_byte_size > 0 + last_mbchar = line_to_calc.byteslice(line_to_calc.bytesize - last_byte_size, last_byte_size) + last_width = Reline::Unicode.get_mbchar_width(last_mbchar) + end_of_line_cursor = new_cursor_max - last_width + else + end_of_line_cursor = new_cursor_max + end + else + end_of_line_cursor = new_cursor_max + end + line_to_calc.grapheme_clusters.each do |gc| + mbchar = gc.encode(Encoding::UTF_8) + mbchar_width = Reline::Unicode.get_mbchar_width(mbchar) + now = new_cursor + mbchar_width + if now > end_of_line_cursor or now > cursor + break + end + new_cursor += mbchar_width + if new_cursor > max_width * height + height += 1 + end + new_byte_pointer += gc.bytesize + end + @byte_pointer = new_byte_pointer + end + + def with_cache(key, *deps) + cached_deps, value = @cache[key] + if cached_deps != deps + @cache[key] = [deps, value = yield(*deps, cached_deps, value)] + end + value + end + + def modified_lines + with_cache(__method__, whole_lines, finished?) do |whole, complete| + modify_lines(whole, complete) + end + end + + def prompt_list + with_cache(__method__, whole_lines, check_mode_string, @vi_arg, @searching_prompt) do |lines, mode_string| + check_multiline_prompt(lines, mode_string) + end + end + + def screen_height + @screen_size.first + end + + def screen_width + @screen_size.last + end + + def screen_scroll_top + @scroll_partial_screen + end + + def wrapped_prompt_and_input_lines + with_cache(__method__, @buffer_of_lines.size, modified_lines, prompt_list, screen_width) do |n, lines, prompts, width, prev_cache_key, cached_value| + prev_n, prev_lines, prev_prompts, prev_width = prev_cache_key + cached_wraps = {} + if prev_width == width + prev_n.times do |i| + cached_wraps[[prev_prompts[i], prev_lines[i]]] = cached_value[i] + end + end + + n.times.map do |i| + prompt = prompts[i] || '' + line = lines[i] || '' + if (cached = cached_wraps[[prompt, line]]) + next cached + end + *wrapped_prompts, code_line_prompt = split_line_by_width(prompt, width) + wrapped_lines = split_line_by_width(line, width, offset: calculate_width(code_line_prompt, true)) + wrapped_prompts.map { |p| [p, ''] } + [[code_line_prompt, wrapped_lines.first]] + wrapped_lines.drop(1).map { |c| ['', c] } + end + end + end + + def calculate_overlay_levels(overlay_levels) + levels = [] + overlay_levels.each do |x, w, l| + levels.fill(l, x, w) + end + levels + end + + def render_line_differential(old_items, new_items) + old_levels = calculate_overlay_levels(old_items.zip(new_items).each_with_index.map {|((x, w, c), (nx, _nw, nc)), i| [x, w, c == nc && x == nx ? i : -1] if x }.compact) + new_levels = calculate_overlay_levels(new_items.each_with_index.map { |(x, w), i| [x, w, i] if x }.compact).take(screen_width) + base_x = 0 + new_levels.zip(old_levels).chunk { |n, o| n == o ? :skip : n || :blank }.each do |level, chunk| + width = chunk.size + if level == :skip + # do nothing + elsif level == :blank + Reline::IOGate.move_cursor_column base_x + Reline::IOGate.write "#{Reline::IOGate.reset_color_sequence}#{' ' * width}" + else + x, w, content = new_items[level] + cover_begin = base_x != 0 && new_levels[base_x - 1] == level + cover_end = new_levels[base_x + width] == level + pos = 0 + unless x == base_x && w == width + content, pos = Reline::Unicode.take_mbchar_range(content, base_x - x, width, cover_begin: cover_begin, cover_end: cover_end, padding: true) + end + Reline::IOGate.move_cursor_column x + pos + Reline::IOGate.write "#{Reline::IOGate.reset_color_sequence}#{content}#{Reline::IOGate.reset_color_sequence}" + end + base_x += width + end + if old_levels.size > new_levels.size + Reline::IOGate.move_cursor_column new_levels.size + Reline::IOGate.erase_after_cursor + end + end + + # Calculate cursor position in word wrapped content. + def wrapped_cursor_position + prompt_width = calculate_width(prompt_list[@line_index], true) + line_before_cursor = Reline::Unicode.escape_for_print(whole_lines[@line_index].byteslice(0, @byte_pointer)) + wrapped_line_before_cursor = split_line_by_width(' ' * prompt_width + line_before_cursor, screen_width) + wrapped_cursor_y = wrapped_prompt_and_input_lines[0...@line_index].sum(&:size) + wrapped_line_before_cursor.size - 1 + wrapped_cursor_x = calculate_width(wrapped_line_before_cursor.last) + [wrapped_cursor_x, wrapped_cursor_y] + end + + def clear_dialogs + @dialogs.each do |dialog| + dialog.contents = nil + dialog.trap_key = nil + end + end + + def update_dialogs(key = nil) + wrapped_cursor_x, wrapped_cursor_y = wrapped_cursor_position + @dialogs.each do |dialog| + dialog.trap_key = nil + update_each_dialog(dialog, wrapped_cursor_x, wrapped_cursor_y - screen_scroll_top, key) + end + end + + def render_finished + Reline::IOGate.buffered_output do + render_differential([], 0, 0) + lines = @buffer_of_lines.size.times.map do |i| + line = Reline::Unicode.strip_non_printing_start_end(prompt_list[i]) + modified_lines[i] + wrapped_lines = split_line_by_width(line, screen_width) + wrapped_lines.last.empty? ? "#{line} " : line + end + Reline::IOGate.write lines.map { |l| "#{l}\r\n" }.join + end + end + + def render + wrapped_cursor_x, wrapped_cursor_y = wrapped_cursor_position + new_lines = wrapped_prompt_and_input_lines.flatten(1)[screen_scroll_top, screen_height].map do |prompt, line| + prompt_width = Reline::Unicode.calculate_width(prompt, true) + [[0, prompt_width, prompt], [prompt_width, Reline::Unicode.calculate_width(line, true), line]] + end + if @menu_info + @menu_info.lines(screen_width).each do |item| + new_lines << [[0, Reline::Unicode.calculate_width(item), item]] + end + @menu_info = nil # TODO: do not change state here + end + + @dialogs.each_with_index do |dialog, index| + next unless dialog.contents + + x_range, y_range = dialog_range dialog, wrapped_cursor_y - screen_scroll_top + y_range.each do |row| + next if row < 0 || row >= screen_height + + dialog_rows = new_lines[row] ||= [] + # index 0 is for prompt, index 1 is for line, index 2.. is for dialog + dialog_rows[index + 2] = [x_range.begin, dialog.width, dialog.contents[row - y_range.begin]] + end + end + + Reline::IOGate.buffered_output do + render_differential new_lines, wrapped_cursor_x, wrapped_cursor_y - screen_scroll_top + end + end + + # Reflects lines to be rendered and new cursor position to the screen + # by calculating the difference from the previous render. + + private def render_differential(new_lines, new_cursor_x, new_cursor_y) + Reline::IOGate.disable_auto_linewrap(true) if Reline::IOGate.win? + rendered_lines = @rendered_screen.lines + cursor_y = @rendered_screen.cursor_y + if new_lines != rendered_lines + # Hide cursor while rendering to avoid cursor flickering. + Reline::IOGate.hide_cursor + num_lines = [[new_lines.size, rendered_lines.size].max, screen_height].min + if @rendered_screen.base_y + num_lines > screen_height + Reline::IOGate.scroll_down(num_lines - cursor_y - 1) + @rendered_screen.base_y = screen_height - num_lines + cursor_y = num_lines - 1 + end + num_lines.times do |i| + rendered_line = rendered_lines[i] || [] + line_to_render = new_lines[i] || [] + next if rendered_line == line_to_render + + Reline::IOGate.move_cursor_down i - cursor_y + cursor_y = i + unless rendered_lines[i] + Reline::IOGate.move_cursor_column 0 + Reline::IOGate.erase_after_cursor + end + render_line_differential(rendered_line, line_to_render) + end + @rendered_screen.lines = new_lines + Reline::IOGate.show_cursor + end + Reline::IOGate.move_cursor_column new_cursor_x + new_cursor_y = new_cursor_y.clamp(0, screen_height - 1) + Reline::IOGate.move_cursor_down new_cursor_y - cursor_y + @rendered_screen.cursor_y = new_cursor_y + ensure + Reline::IOGate.disable_auto_linewrap(false) if Reline::IOGate.win? + end + + private def clear_rendered_screen_cache + @rendered_screen.lines = [] + @rendered_screen.cursor_y = 0 + end + + def upper_space_height(wrapped_cursor_y) + wrapped_cursor_y - screen_scroll_top + end + + def rest_height(wrapped_cursor_y) + screen_height - wrapped_cursor_y + screen_scroll_top - @rendered_screen.base_y - 1 + end + + def rerender + render unless @in_pasting + end + + class DialogProcScope + CompletionJourneyData = Struct.new(:preposing, :postposing, :list, :pointer) + + def initialize(line_editor, config, proc_to_exec, context) + @line_editor = line_editor + @config = config + @proc_to_exec = proc_to_exec + @context = context + @cursor_pos = Reline::CursorPos.new + end + + def context + @context + end + + def retrieve_completion_block(_unused = false) + preposing, target, postposing, _quote = @line_editor.retrieve_completion_block + [preposing, target, postposing] + end + + def call_completion_proc_with_checking_args(pre, target, post) + @line_editor.call_completion_proc_with_checking_args(pre, target, post) + end + + def set_dialog(dialog) + @dialog = dialog + end + + def dialog + @dialog + end + + def set_cursor_pos(col, row) + @cursor_pos.x = col + @cursor_pos.y = row + end + + def set_key(key) + @key = key + end + + def key + @key + end + + def cursor_pos + @cursor_pos + end + + def just_cursor_moving + @line_editor.instance_variable_get(:@just_cursor_moving) + end + + def screen_width + @line_editor.screen_width + end + + def screen_height + @line_editor.screen_height + end + + def preferred_dialog_height + _wrapped_cursor_x, wrapped_cursor_y = @line_editor.wrapped_cursor_position + [@line_editor.upper_space_height(wrapped_cursor_y), @line_editor.rest_height(wrapped_cursor_y), (screen_height + 6) / 5].max + end + + def completion_journey_data + @line_editor.dialog_proc_scope_completion_journey_data + end + + def config + @config + end + + def call + instance_exec(&@proc_to_exec) + end + end + + class Dialog + attr_reader :name, :contents, :width + attr_accessor :scroll_top, :pointer, :column, :vertical_offset, :trap_key + + def initialize(name, config, proc_scope) + @name = name + @config = config + @proc_scope = proc_scope + @width = nil + @scroll_top = 0 + @trap_key = nil + end + + def set_cursor_pos(col, row) + @proc_scope.set_cursor_pos(col, row) + end + + def width=(v) + @width = v + end + + def contents=(contents) + @contents = contents + if contents and @width.nil? + @width = contents.map{ |line| Reline::Unicode.calculate_width(line, true) }.max + end + end + + def call(key) + @proc_scope.set_dialog(self) + @proc_scope.set_key(key) + dialog_render_info = @proc_scope.call + if @trap_key + if @trap_key.any?{ |i| i.is_a?(Array) } # multiple trap + @trap_key.each do |t| + @config.add_oneshot_key_binding(t, @name) + end + else + @config.add_oneshot_key_binding(@trap_key, @name) + end + end + dialog_render_info + end + end + + def add_dialog_proc(name, p, context = nil) + dialog = Dialog.new(name, @config, DialogProcScope.new(self, @config, p, context)) + if index = @dialogs.find_index { |d| d.name == name } + @dialogs[index] = dialog + else + @dialogs << dialog + end + end + + DIALOG_DEFAULT_HEIGHT = 20 + + private def dialog_range(dialog, dialog_y) + x_range = dialog.column...dialog.column + dialog.width + y_range = dialog_y + dialog.vertical_offset...dialog_y + dialog.vertical_offset + dialog.contents.size + [x_range, y_range] + end + + private def update_each_dialog(dialog, cursor_column, cursor_row, key = nil) + dialog.set_cursor_pos(cursor_column, cursor_row) + dialog_render_info = dialog.call(key) + if dialog_render_info.nil? or dialog_render_info.contents.nil? or dialog_render_info.contents.empty? + dialog.contents = nil + dialog.trap_key = nil + return + end + contents = dialog_render_info.contents + pointer = dialog.pointer + if dialog_render_info.width + dialog.width = dialog_render_info.width + else + dialog.width = contents.map { |l| calculate_width(l, true) }.max + end + height = dialog_render_info.height || DIALOG_DEFAULT_HEIGHT + height = contents.size if contents.size < height + if contents.size > height + if dialog.pointer + if dialog.pointer < 0 + dialog.scroll_top = 0 + elsif (dialog.pointer - dialog.scroll_top) >= (height - 1) + dialog.scroll_top = dialog.pointer - (height - 1) + elsif (dialog.pointer - dialog.scroll_top) < 0 + dialog.scroll_top = dialog.pointer + end + pointer = dialog.pointer - dialog.scroll_top + else + dialog.scroll_top = 0 + end + contents = contents[dialog.scroll_top, height] + end + if dialog_render_info.scrollbar and dialog_render_info.contents.size > height + bar_max_height = height * 2 + moving_distance = (dialog_render_info.contents.size - height) * 2 + position_ratio = dialog.scroll_top.zero? ? 0.0 : ((dialog.scroll_top * 2).to_f / moving_distance) + bar_height = (bar_max_height * ((contents.size * 2).to_f / (dialog_render_info.contents.size * 2))).floor.to_i + bar_height = MINIMUM_SCROLLBAR_HEIGHT if bar_height < MINIMUM_SCROLLBAR_HEIGHT + scrollbar_pos = ((bar_max_height - bar_height) * position_ratio).floor.to_i + else + scrollbar_pos = nil + end + dialog.column = dialog_render_info.pos.x + dialog.width += @block_elem_width if scrollbar_pos + diff = (dialog.column + dialog.width) - screen_width + if diff > 0 + dialog.column -= diff + end + if rest_height(screen_scroll_top + cursor_row) - dialog_render_info.pos.y >= height + dialog.vertical_offset = dialog_render_info.pos.y + 1 + elsif cursor_row >= height + dialog.vertical_offset = dialog_render_info.pos.y - height + else + dialog.vertical_offset = dialog_render_info.pos.y + 1 + end + if dialog.column < 0 + dialog.column = 0 + dialog.width = screen_width + end + face = Reline::Face[dialog_render_info.face || :default] + scrollbar_sgr = face[:scrollbar] + default_sgr = face[:default] + enhanced_sgr = face[:enhanced] + dialog.contents = contents.map.with_index do |item, i| + line_sgr = i == pointer ? enhanced_sgr : default_sgr + str_width = dialog.width - (scrollbar_pos.nil? ? 0 : @block_elem_width) + str, = Reline::Unicode.take_mbchar_range(item, 0, str_width, padding: true) + colored_content = "#{line_sgr}#{str}" + if scrollbar_pos + if scrollbar_pos <= (i * 2) and (i * 2 + 1) < (scrollbar_pos + bar_height) + colored_content + scrollbar_sgr + @full_block + elsif scrollbar_pos <= (i * 2) and (i * 2) < (scrollbar_pos + bar_height) + colored_content + scrollbar_sgr + @upper_half_block + elsif scrollbar_pos <= (i * 2 + 1) and (i * 2) < (scrollbar_pos + bar_height) + colored_content + scrollbar_sgr + @lower_half_block + else + colored_content + scrollbar_sgr + ' ' * @block_elem_width + end + else + colored_content + end + end + end + + private def modify_lines(before, complete) + if after = @output_modifier_proc&.call("#{before.join("\n")}\n", complete: complete) + after.lines("\n").map { |l| l.chomp('') } + else + before.map { |l| Reline::Unicode.escape_for_print(l) } + end + end + + def editing_mode + @config.editing_mode + end + + private def menu(list) + @menu_info = MenuInfo.new(list) + end + + private def filter_normalize_candidates(target, list) + target = target.downcase if @config.completion_ignore_case + list.select do |item| + next unless item + unless Encoding.compatible?(target.encoding, item.encoding) + # Workaround for Readline test + if defined?(::Readline) && ::Readline == ::Reline + raise Encoding::CompatibilityError, "incompatible character encodings: #{target.encoding} and #{item.encoding}" + end + end + + if @config.completion_ignore_case + item.downcase.start_with?(target) + else + item.start_with?(target) + end + end.map do |item| + item.unicode_normalize + rescue Encoding::CompatibilityError + item + end.uniq + end + + private def perform_completion(preposing, target, postposing, quote, list) + candidates = filter_normalize_candidates(target, list) + + case @completion_state + when CompletionState::PERFECT_MATCH + if @dig_perfect_match_proc + @dig_perfect_match_proc.call(@perfect_matched) + return + end + when CompletionState::MENU + menu(candidates) + return + when CompletionState::MENU_WITH_PERFECT_MATCH + menu(candidates) + @completion_state = CompletionState::PERFECT_MATCH + return + end + + completed = Reline::Unicode.common_prefix(candidates, ignore_case: @config.completion_ignore_case) + return if completed.empty? + + append_character = '' + if candidates.include?(completed) + if candidates.one? + append_character = quote || completion_append_character.to_s + @completion_state = CompletionState::PERFECT_MATCH + elsif @config.show_all_if_ambiguous + menu(candidates) + @completion_state = CompletionState::PERFECT_MATCH + else + @completion_state = CompletionState::MENU_WITH_PERFECT_MATCH + end + @perfect_matched = completed + else + @completion_state = CompletionState::MENU + menu(candidates) if @config.show_all_if_ambiguous + end + @buffer_of_lines[@line_index] = (preposing + completed + append_character + postposing).split("\n")[@line_index] || String.new(encoding: encoding) + line_to_pointer = (preposing + completed + append_character).split("\n")[@line_index] || String.new(encoding: encoding) + @byte_pointer = line_to_pointer.bytesize + end + + def dialog_proc_scope_completion_journey_data + return nil unless @completion_journey_state + line_index = @completion_journey_state.line_index + pre_lines = @buffer_of_lines[0...line_index].map { |line| line + "\n" } + post_lines = @buffer_of_lines[(line_index + 1)..-1].map { |line| line + "\n" } + DialogProcScope::CompletionJourneyData.new( + pre_lines.join + @completion_journey_state.pre, + @completion_journey_state.post + post_lines.join, + @completion_journey_state.list, + @completion_journey_state.pointer + ) + end + + private def move_completed_list(direction) + @completion_journey_state ||= retrieve_completion_journey_state + return false unless @completion_journey_state + + if (delta = { up: -1, down: +1 }[direction]) + @completion_journey_state.pointer = (@completion_journey_state.pointer + delta) % @completion_journey_state.list.size + end + completed = @completion_journey_state.list[@completion_journey_state.pointer] + set_current_line(@completion_journey_state.pre + completed + @completion_journey_state.post, @completion_journey_state.pre.bytesize + completed.bytesize) + true + end + + private def retrieve_completion_journey_state + preposing, target, postposing, quote = retrieve_completion_block + list = call_completion_proc(preposing, target, postposing, quote) + return unless list.is_a?(Array) + + candidates = list.select{ |item| item.start_with?(target) } + return if candidates.empty? + + pre = preposing.split("\n", -1).last || '' + post = postposing.split("\n", -1).first || '' + CompletionJourneyState.new( + @line_index, pre, target, post, [target] + candidates, 0 + ) + end + + private def run_for_operators(key, method_symbol) + # Reject multibyte input (converted to ed_insert) in vi_command mode + return if method_symbol == :ed_insert && @config.editing_mode_is?(:vi_command) && !@waiting_proc + + if ARGUMENT_DIGIT_METHODS.include?(method_symbol) && !@waiting_proc + wrap_method_call(method_symbol, key, false) + return + end + + if @vi_waiting_operator + if @waiting_proc || VI_MOTIONS.include?(method_symbol) + old_byte_pointer = @byte_pointer + @vi_arg = (@vi_arg || 1) * @vi_waiting_operator_arg + wrap_method_call(method_symbol, key, true) + unless @waiting_proc + byte_pointer_diff = @byte_pointer - old_byte_pointer + @byte_pointer = old_byte_pointer + __send__(@vi_waiting_operator, byte_pointer_diff) + cleanup_waiting + end + else + # Ignores operator when not motion is given. + wrap_method_call(method_symbol, key, false) + cleanup_waiting + end + else + wrap_method_call(method_symbol, key, false) + end + @vi_arg = nil + @kill_ring.process + end + + private def argumentable?(method_obj) + method_obj and method_obj.parameters.any? { |param| param[0] == :key and param[1] == :arg } + end + + private def inclusive?(method_obj) + # If a motion method with the keyword argument "inclusive" follows the + # operator, it must contain the character at the cursor position. + method_obj and method_obj.parameters.any? { |param| param[0] == :key and param[1] == :inclusive } + end + + def wrap_method_call(method_symbol, key, with_operator) + if @waiting_proc + @waiting_proc.call(key) + return + end + + return unless respond_to?(method_symbol, true) + method_obj = method(method_symbol) + if @vi_arg and argumentable?(method_obj) + if inclusive?(method_obj) + method_obj.(key, arg: @vi_arg, inclusive: with_operator) + else + method_obj.(key, arg: @vi_arg) + end + else + if inclusive?(method_obj) + method_obj.(key, inclusive: with_operator) + else + method_obj.(key) + end + end + end + + private def cleanup_waiting + @waiting_proc = nil + @vi_waiting_operator = nil + @vi_waiting_operator_arg = nil + @searching_prompt = nil + @drop_terminate_spaces = false + end + + ARGUMENT_DIGIT_METHODS = %i[ed_digit vi_zero ed_argument_digit] + VI_WAITING_ACCEPT_METHODS = %i[vi_change_meta vi_delete_meta vi_yank ed_insert ed_argument_digit] + + private def process_key(key, method_symbol) + if @waiting_proc + cleanup_waiting unless key.size == 1 + end + if @vi_waiting_operator + cleanup_waiting unless VI_WAITING_ACCEPT_METHODS.include?(method_symbol) || VI_MOTIONS.include?(method_symbol) + end + + process_insert(force: method_symbol != :ed_insert) + + run_for_operators(key, method_symbol) + end + + def update(key) + modified = input_key(key) + unless @in_pasting + scroll_into_view + @just_cursor_moving = !modified + update_dialogs(key) + @just_cursor_moving = false + end + end + + def input_key(key) + old_buffer_of_lines = @buffer_of_lines.dup + @config.reset_oneshot_key_bindings + if key.char.nil? + process_insert(force: true) + @eof = buffer_empty? + finish + return + end + return if @dialogs.any? { |dialog| dialog.name == key.method_symbol } + + @completion_occurs = false + + process_key(key.char, key.method_symbol) + if @config.editing_mode_is?(:vi_command) and @byte_pointer > 0 and @byte_pointer == current_line.bytesize + byte_size = Reline::Unicode.get_prev_mbchar_size(@buffer_of_lines[@line_index], @byte_pointer) + @byte_pointer -= byte_size + end + + @prev_action_state, @next_action_state = @next_action_state, NullActionState + + unless @completion_occurs + @completion_state = CompletionState::NORMAL + @completion_journey_state = nil + end + + modified = old_buffer_of_lines != @buffer_of_lines + + push_undo_redo(modified) unless @restoring + @restoring = false + + if @in_pasting + clear_dialogs + return + end + + if !@completion_occurs && modified && !@config.disable_completion && @config.autocompletion + # Auto complete starts only when edited + process_insert(force: true) + @completion_journey_state = retrieve_completion_journey_state + end + modified + end + + MAX_UNDO_REDO_HISTORY_SIZE = 100 + def push_undo_redo(modified) + if modified + @undo_redo_history = @undo_redo_history[0..@undo_redo_index] + @undo_redo_history.push([@buffer_of_lines.dup, @byte_pointer, @line_index]) + if @undo_redo_history.size > MAX_UNDO_REDO_HISTORY_SIZE + @undo_redo_history.shift + end + @undo_redo_index = @undo_redo_history.size - 1 + else + @undo_redo_history[@undo_redo_index] = [@buffer_of_lines.dup, @byte_pointer, @line_index] + end + end + + def scroll_into_view + _wrapped_cursor_x, wrapped_cursor_y = wrapped_cursor_position + if wrapped_cursor_y < screen_scroll_top + @scroll_partial_screen = wrapped_cursor_y + end + if wrapped_cursor_y >= screen_scroll_top + screen_height + @scroll_partial_screen = wrapped_cursor_y - screen_height + 1 + end + end + + def call_completion_proc(pre, target, post, quote) + Reline.core.instance_variable_set(:@completion_quote_character, quote) + result = call_completion_proc_with_checking_args(pre, target, post) + Reline.core.instance_variable_set(:@completion_quote_character, nil) + result + end + + def call_completion_proc_with_checking_args(pre, target, post) + if @completion_proc and target + argnum = @completion_proc.parameters.inject(0) { |result, item| + case item.first + when :req, :opt + result + 1 + when :rest + break 3 + end + } + case argnum + when 1 + result = @completion_proc.(target) + when 2 + result = @completion_proc.(target, pre) + when 3..Float::INFINITY + result = @completion_proc.(target, pre, post) + end + end + result + end + + private def process_auto_indent(line_index = @line_index, cursor_dependent: true, add_newline: false) + return if @in_pasting + return unless @auto_indent_proc + + line = @buffer_of_lines[line_index] + byte_pointer = cursor_dependent && @line_index == line_index ? @byte_pointer : line.bytesize + new_indent = @auto_indent_proc.(@buffer_of_lines.take(line_index + 1).push(''), line_index, byte_pointer, add_newline) + return unless new_indent + + new_line = ' ' * new_indent + line.lstrip + @buffer_of_lines[line_index] = new_line + if @line_index == line_index + indent_diff = new_line.bytesize - line.bytesize + @byte_pointer = [@byte_pointer + indent_diff, 0].max + end + end + + def line() + @buffer_of_lines.join("\n") unless eof? + end + + def current_line + @buffer_of_lines[@line_index] + end + + def set_current_line(line, byte_pointer = nil) + cursor = current_byte_pointer_cursor + @buffer_of_lines[@line_index] = line + if byte_pointer + @byte_pointer = byte_pointer + else + calculate_nearest_cursor(cursor) + end + process_auto_indent + end + + def retrieve_completion_block + quote_characters = Reline.completer_quote_characters + before = current_line.byteslice(0, @byte_pointer).grapheme_clusters + quote = nil + # Calculate closing quote when cursor is at the end of the line + if current_line.bytesize == @byte_pointer && !quote_characters.empty? + escaped = false + before.each do |c| + if escaped + escaped = false + next + elsif c == '\\' + escaped = true + elsif quote + quote = nil if c == quote + elsif quote_characters.include?(c) + quote = c + end + end + end + + word_break_characters = quote_characters + Reline.completer_word_break_characters + break_index = before.rindex { |c| word_break_characters.include?(c) || quote_characters.include?(c) } || -1 + preposing = before.take(break_index + 1).join + target = before.drop(break_index + 1).join + postposing = current_line.byteslice(@byte_pointer, current_line.bytesize - @byte_pointer) + lines = whole_lines + if @line_index > 0 + preposing = lines[0..(@line_index - 1)].join("\n") + "\n" + preposing + end + if (lines.size - 1) > @line_index + postposing = postposing + "\n" + lines[(@line_index + 1)..-1].join("\n") + end + [preposing.encode(encoding), target.encode(encoding), postposing.encode(encoding), quote&.encode(encoding)] + end + + def confirm_multiline_termination + temp_buffer = @buffer_of_lines.dup + @confirm_multiline_termination_proc.(temp_buffer.join("\n") + "\n") + end + + def insert_multiline_text(text) + pre = @buffer_of_lines[@line_index].byteslice(0, @byte_pointer) + post = @buffer_of_lines[@line_index].byteslice(@byte_pointer..) + lines = (pre + Reline::Unicode.safe_encode(text, encoding).gsub(/\r\n?/, "\n") + post).split("\n", -1) + lines << '' if lines.empty? + @buffer_of_lines[@line_index, 1] = lines + @line_index += lines.size - 1 + @byte_pointer = @buffer_of_lines[@line_index].bytesize - post.bytesize + end + + def insert_text(text) + if @buffer_of_lines[@line_index].bytesize == @byte_pointer + @buffer_of_lines[@line_index] += text + else + @buffer_of_lines[@line_index] = byteinsert(@buffer_of_lines[@line_index], @byte_pointer, text) + end + @byte_pointer += text.bytesize + process_auto_indent + end + + def delete_text(start = nil, length = nil) + if start.nil? and length.nil? + if @buffer_of_lines.size == 1 + @buffer_of_lines[@line_index] = '' + @byte_pointer = 0 + elsif @line_index == (@buffer_of_lines.size - 1) and @line_index > 0 + @buffer_of_lines.pop + @line_index -= 1 + @byte_pointer = 0 + elsif @line_index < (@buffer_of_lines.size - 1) + @buffer_of_lines.delete_at(@line_index) + @byte_pointer = 0 + end + elsif not start.nil? and not length.nil? + if current_line + before = current_line.byteslice(0, start) + after = current_line.byteslice(start + length, current_line.bytesize) + set_current_line(before + after) + end + elsif start.is_a?(Range) + range = start + first = range.first + last = range.last + last = current_line.bytesize - 1 if last > current_line.bytesize + last += current_line.bytesize if last < 0 + first += current_line.bytesize if first < 0 + range = range.exclude_end? ? first...last : first..last + line = current_line.bytes.reject.with_index{ |c, i| range.include?(i) }.map{ |c| c.chr(Encoding::ASCII_8BIT) }.join.force_encoding(encoding) + set_current_line(line) + else + set_current_line(current_line.byteslice(0, start)) + end + end + + def byte_pointer=(val) + @byte_pointer = val + end + + def whole_lines + @buffer_of_lines.dup + end + + def whole_buffer + whole_lines.join("\n") + end + + private def buffer_empty? + current_line.empty? and @buffer_of_lines.size == 1 + end + + def finished? + @finished + end + + def finish + @finished = true + @config.reset + end + + private def byteslice!(str, byte_pointer, size) + new_str = str.byteslice(0, byte_pointer) + new_str << str.byteslice(byte_pointer + size, str.bytesize) + [new_str, str.byteslice(byte_pointer, size)] + end + + private def byteinsert(str, byte_pointer, other) + new_str = str.byteslice(0, byte_pointer) + new_str << other + new_str << str.byteslice(byte_pointer, str.bytesize) + new_str + end + + private def calculate_width(str, allow_escape_code = false) + Reline::Unicode.calculate_width(str, allow_escape_code) + end + + private def key_delete(key) + if @config.editing_mode_is?(:vi_insert) + ed_delete_next_char(key) + elsif @config.editing_mode_is?(:emacs) + em_delete(key) + end + end + + private def key_newline(key) + if @is_multiline + next_line = current_line.byteslice(@byte_pointer, current_line.bytesize - @byte_pointer) + cursor_line = current_line.byteslice(0, @byte_pointer) + insert_new_line(cursor_line, next_line) + end + end + + private def complete(_key) + return if @config.disable_completion + + process_insert(force: true) + if @config.autocompletion + @completion_state = CompletionState::NORMAL + @completion_occurs = move_completed_list(:down) + else + @completion_journey_state = nil + pre, target, post, quote = retrieve_completion_block + result = call_completion_proc(pre, target, post, quote) + if result.is_a?(Array) + @completion_occurs = true + perform_completion(pre, target, post, quote, result) + end + end + end + + private def completion_journey_move(direction) + return if @config.disable_completion + + process_insert(force: true) + @completion_state = CompletionState::NORMAL + @completion_occurs = move_completed_list(direction) + end + + private def menu_complete(_key) + completion_journey_move(:down) + end + + private def menu_complete_backward(_key) + completion_journey_move(:up) + end + + private def completion_journey_up(_key) + completion_journey_move(:up) if @config.autocompletion + end + + # Editline:: +ed-unassigned+ This editor command always results in an error. + # GNU Readline:: There is no corresponding macro. + private def ed_unassigned(key) end # do nothing + + private def process_insert(force: false) + return if @continuous_insertion_buffer.empty? or (@in_pasting and not force) + insert_text(@continuous_insertion_buffer) + @continuous_insertion_buffer.clear + end + + # Editline:: +ed-insert+ (vi input: almost all; emacs: printable characters) + # In insert mode, insert the input character left of the cursor + # position. In replace mode, overwrite the character at the + # cursor and move the cursor to the right by one character + # position. Accept an argument to do this repeatedly. It is an + # error if the input character is the NUL character (+Ctrl-@+). + # Failure to enlarge the edit buffer also results in an error. + # Editline:: +ed-digit+ (emacs: 0 to 9) If in argument input mode, append + # the input digit to the argument being read. Otherwise, call + # +ed-insert+. It is an error if the input character is not a + # digit or if the existing argument is already greater than a + # million. + # GNU Readline:: +self-insert+ (a, b, A, 1, !, …) Insert yourself. + private def ed_insert(str) + begin + str.encode(Encoding::UTF_8) + rescue Encoding::UndefinedConversionError + return + end + if @in_pasting + @continuous_insertion_buffer << str + return + elsif not @continuous_insertion_buffer.empty? + process_insert + end + + insert_text(str) + end + alias_method :self_insert, :ed_insert + + private def ed_digit(key) + if @vi_arg + ed_argument_digit(key) + else + ed_insert(key) + end + end + + private def insert_raw_char(str, arg: 1) + arg.times do + if str == "\C-j" or str == "\C-m" + key_newline(str) + elsif str != "\0" + # Ignore NUL. + ed_insert(str) + end + end + end + + private def ed_next_char(key, arg: 1) + byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) + if (@byte_pointer < current_line.bytesize) + @byte_pointer += byte_size + elsif @config.editing_mode_is?(:emacs) and @byte_pointer == current_line.bytesize and @line_index < @buffer_of_lines.size - 1 + @byte_pointer = 0 + @line_index += 1 + end + arg -= 1 + ed_next_char(key, arg: arg) if arg > 0 + end + alias_method :forward_char, :ed_next_char + + private def ed_prev_char(key, arg: 1) + if @byte_pointer > 0 + byte_size = Reline::Unicode.get_prev_mbchar_size(current_line, @byte_pointer) + @byte_pointer -= byte_size + elsif @config.editing_mode_is?(:emacs) and @byte_pointer == 0 and @line_index > 0 + @line_index -= 1 + @byte_pointer = current_line.bytesize + end + arg -= 1 + ed_prev_char(key, arg: arg) if arg > 0 + end + alias_method :backward_char, :ed_prev_char + + private def vi_first_print(key) + @byte_pointer = Reline::Unicode.vi_first_print(current_line) + end + + private def ed_move_to_beg(key) + @byte_pointer = 0 + end + alias_method :beginning_of_line, :ed_move_to_beg + + private def vi_zero(key) + if @vi_arg + ed_argument_digit(key) + else + ed_move_to_beg(key) + end + end + + private def ed_move_to_end(key) + @byte_pointer = current_line.bytesize + end + alias_method :end_of_line, :ed_move_to_end + + private def generate_searcher(search_key) + search_word = String.new(encoding: encoding) + hit_pointer = nil + lambda do |key| + search_again = false + case key + when "\C-h", "\C-?" + grapheme_clusters = search_word.grapheme_clusters + if grapheme_clusters.size > 0 + grapheme_clusters.pop + search_word = grapheme_clusters.join + end + when "\C-r", "\C-s" + search_again = true if search_key == key + search_key = key + else + search_word << key + end + hit = nil + if not search_word.empty? and @line_backup_in_history&.include?(search_word) + hit_pointer = Reline::HISTORY.size + hit = @line_backup_in_history + else + if search_again + if search_word.empty? and Reline.last_incremental_search + search_word = Reline.last_incremental_search + end + if @history_pointer + case search_key + when "\C-r" + history_pointer_base = 0 + history = Reline::HISTORY[0..(@history_pointer - 1)] + when "\C-s" + history_pointer_base = @history_pointer + 1 + history = Reline::HISTORY[(@history_pointer + 1)..-1] + end + else + history_pointer_base = 0 + history = Reline::HISTORY + end + elsif @history_pointer + case search_key + when "\C-r" + history_pointer_base = 0 + history = Reline::HISTORY[0..@history_pointer] + when "\C-s" + history_pointer_base = @history_pointer + history = Reline::HISTORY[@history_pointer..-1] + end + else + history_pointer_base = 0 + history = Reline::HISTORY + end + case search_key + when "\C-r" + hit_index = history.rindex { |item| + item.include?(search_word) + } + when "\C-s" + hit_index = history.index { |item| + item.include?(search_word) + } + end + if hit_index + hit_pointer = history_pointer_base + hit_index + hit = Reline::HISTORY[hit_pointer] + end + end + case search_key + when "\C-r" + prompt_name = 'reverse-i-search' + when "\C-s" + prompt_name = 'i-search' + end + prompt_name = "failed #{prompt_name}" unless hit + [search_word, prompt_name, hit_pointer] + end + end + + private def incremental_search_history(key) + backup = @buffer_of_lines.dup, @line_index, @byte_pointer, @history_pointer, @line_backup_in_history + searcher = generate_searcher(key) + @searching_prompt = "(reverse-i-search)`': " + termination_keys = ["\C-j"] + termination_keys.concat(@config.isearch_terminators.chars) if @config.isearch_terminators + @waiting_proc = ->(k) { + if k == "\C-g" + # cancel search and restore buffer + @buffer_of_lines, @line_index, @byte_pointer, @history_pointer, @line_backup_in_history = backup + @searching_prompt = nil + @waiting_proc = nil + elsif !termination_keys.include?(k) && (k.match?(/[[:print:]]/) || k == "\C-h" || k == "\C-?" || k == "\C-r" || k == "\C-s") + search_word, prompt_name, hit_pointer = searcher.call(k) + Reline.last_incremental_search = search_word + @searching_prompt = "(%s)`%s'" % [prompt_name, search_word] + @searching_prompt += ': ' unless @is_multiline + move_history(hit_pointer, line: :end, cursor: :end) if hit_pointer + else + # terminaton_keys and other keys will terminalte + move_history(@history_pointer, line: :end, cursor: :start) + @searching_prompt = nil + @waiting_proc = nil + end + } + end + + private def vi_search_prev(key) + incremental_search_history(key) + end + alias_method :reverse_search_history, :vi_search_prev + + private def vi_search_next(key) + incremental_search_history(key) + end + alias_method :forward_search_history, :vi_search_next + + private def search_history(prefix, pointer_range) + pointer_range.each do |pointer| + lines = Reline::HISTORY[pointer].split("\n") + lines.each_with_index do |line, index| + return [pointer, index] if line.start_with?(prefix) + end + end + nil + end + + private def ed_search_prev_history(key, arg: 1) + substr = prev_action_state_value(:search_history) == :empty ? '' : current_line.byteslice(0, @byte_pointer) + return if @history_pointer == 0 + return if @history_pointer.nil? && substr.empty? && !current_line.empty? + + history_range = 0...(@history_pointer || Reline::HISTORY.size) + h_pointer, line_index = search_history(substr, history_range.reverse_each) + return unless h_pointer + move_history(h_pointer, line: line_index || :start, cursor: substr.empty? ? :end : @byte_pointer) + arg -= 1 + set_next_action_state(:search_history, :empty) if substr.empty? + ed_search_prev_history(key, arg: arg) if arg > 0 + end + alias_method :history_search_backward, :ed_search_prev_history + + private def ed_search_next_history(key, arg: 1) + substr = prev_action_state_value(:search_history) == :empty ? '' : current_line.byteslice(0, @byte_pointer) + return if @history_pointer.nil? + + history_range = @history_pointer + 1...Reline::HISTORY.size + h_pointer, line_index = search_history(substr, history_range) + return if h_pointer.nil? and not substr.empty? + + move_history(h_pointer, line: line_index || :start, cursor: substr.empty? ? :end : @byte_pointer) + arg -= 1 + set_next_action_state(:search_history, :empty) if substr.empty? + ed_search_next_history(key, arg: arg) if arg > 0 + end + alias_method :history_search_forward, :ed_search_next_history + + private def move_history(history_pointer, line:, cursor:) + history_pointer ||= Reline::HISTORY.size + return if history_pointer < 0 || history_pointer > Reline::HISTORY.size + old_history_pointer = @history_pointer || Reline::HISTORY.size + if old_history_pointer == Reline::HISTORY.size + @line_backup_in_history = whole_buffer + else + Reline::HISTORY[old_history_pointer] = whole_buffer + end + if history_pointer == Reline::HISTORY.size + buf = @line_backup_in_history + @history_pointer = @line_backup_in_history = nil + else + buf = Reline::HISTORY[history_pointer] + @history_pointer = history_pointer + end + @buffer_of_lines = buf.split("\n") + @buffer_of_lines = [String.new(encoding: encoding)] if @buffer_of_lines.empty? + @line_index = line == :start ? 0 : line == :end ? @buffer_of_lines.size - 1 : line + @byte_pointer = cursor == :start ? 0 : cursor == :end ? current_line.bytesize : cursor + end + + private def ed_prev_history(key, arg: 1) + if @line_index > 0 + cursor = current_byte_pointer_cursor + @line_index -= 1 + calculate_nearest_cursor(cursor) + return + end + move_history( + (@history_pointer || Reline::HISTORY.size) - 1, + line: :end, + cursor: @config.editing_mode_is?(:vi_command) ? :start : :end, + ) + arg -= 1 + ed_prev_history(key, arg: arg) if arg > 0 + end + alias_method :previous_history, :ed_prev_history + + private def ed_next_history(key, arg: 1) + if @line_index < (@buffer_of_lines.size - 1) + cursor = current_byte_pointer_cursor + @line_index += 1 + calculate_nearest_cursor(cursor) + return + end + move_history( + (@history_pointer || Reline::HISTORY.size) + 1, + line: :start, + cursor: @config.editing_mode_is?(:vi_command) ? :start : :end, + ) + arg -= 1 + ed_next_history(key, arg: arg) if arg > 0 + end + alias_method :next_history, :ed_next_history + + private def ed_beginning_of_history(key) + move_history(0, line: :end, cursor: :end) + end + alias_method :beginning_of_history, :ed_beginning_of_history + + private def ed_end_of_history(key) + move_history(Reline::HISTORY.size, line: :end, cursor: :end) + end + alias_method :end_of_history, :ed_end_of_history + + private def ed_newline(key) + process_insert(force: true) + if @is_multiline + if @config.editing_mode_is?(:vi_command) + if @line_index < (@buffer_of_lines.size - 1) + ed_next_history(key) # means cursor down + else + # should check confirm_multiline_termination to finish? + finish + end + else + if @line_index == @buffer_of_lines.size - 1 && confirm_multiline_termination + finish + else + key_newline(key) + end + end + else + finish + end + end + + private def ed_force_submit(_key) + process_insert(force: true) + finish + end + + private def em_delete_prev_char(key, arg: 1) + arg.times do + if @byte_pointer == 0 and @line_index > 0 + @byte_pointer = @buffer_of_lines[@line_index - 1].bytesize + @buffer_of_lines[@line_index - 1] += @buffer_of_lines.delete_at(@line_index) + @line_index -= 1 + elsif @byte_pointer > 0 + byte_size = Reline::Unicode.get_prev_mbchar_size(current_line, @byte_pointer) + line, = byteslice!(current_line, @byte_pointer - byte_size, byte_size) + set_current_line(line, @byte_pointer - byte_size) + end + end + process_auto_indent + end + alias_method :backward_delete_char, :em_delete_prev_char + + # Editline:: +ed-kill-line+ (vi command: +D+, +Ctrl-K+; emacs: +Ctrl-K+, + # +Ctrl-U+) + Kill from the cursor to the end of the line. + # GNU Readline:: +kill-line+ (+C-k+) Kill the text from point to the end of + # the line. With a negative numeric argument, kill backward + # from the cursor to the beginning of the current line. + private def ed_kill_line(key) + if current_line.bytesize > @byte_pointer + line, deleted = byteslice!(current_line, @byte_pointer, current_line.bytesize - @byte_pointer) + set_current_line(line, line.bytesize) + @kill_ring.append(deleted) + elsif @byte_pointer == current_line.bytesize and @buffer_of_lines.size > @line_index + 1 + set_current_line(current_line + @buffer_of_lines.delete_at(@line_index + 1), current_line.bytesize) + end + end + alias_method :kill_line, :ed_kill_line + + # Editline:: +vi_change_to_eol+ (vi command: +C+) + Kill and change from the cursor to the end of the line. + private def vi_change_to_eol(key) + ed_kill_line(key) + + @config.editing_mode = :vi_insert + end + + # Editline:: +vi-kill-line-prev+ (vi: +Ctrl-U+) Delete the string from the + # beginning of the edit buffer to the cursor and save it to the + # cut buffer. + # GNU Readline:: +unix-line-discard+ (+C-u+) Kill backward from the cursor + # to the beginning of the current line. + private def vi_kill_line_prev(key) + if @byte_pointer > 0 + line, deleted = byteslice!(current_line, 0, @byte_pointer) + set_current_line(line, 0) + @kill_ring.append(deleted, true) + end + end + alias_method :unix_line_discard, :vi_kill_line_prev + + # Editline:: +em-kill-line+ (not bound) Delete the entire contents of the + # edit buffer and save it to the cut buffer. +vi-kill-line-prev+ + # GNU Readline:: +kill-whole-line+ (not bound) Kill all characters on the + # current line, no matter where point is. + private def em_kill_line(key) + if current_line.size > 0 + @kill_ring.append(current_line.dup, true) + set_current_line('', 0) + end + end + alias_method :kill_whole_line, :em_kill_line + + private def em_delete(key) + if buffer_empty? and key == "\C-d" + @eof = true + finish + elsif @byte_pointer < current_line.bytesize + splitted_last = current_line.byteslice(@byte_pointer, current_line.bytesize) + mbchar = splitted_last.grapheme_clusters.first + line, = byteslice!(current_line, @byte_pointer, mbchar.bytesize) + set_current_line(line) + elsif @byte_pointer == current_line.bytesize and @buffer_of_lines.size > @line_index + 1 + set_current_line(current_line + @buffer_of_lines.delete_at(@line_index + 1), current_line.bytesize) + end + end + alias_method :delete_char, :em_delete + + private def em_delete_or_list(key) + if current_line.empty? or @byte_pointer < current_line.bytesize + em_delete(key) + elsif !@config.autocompletion # show completed list + pre, target, post, quote = retrieve_completion_block + result = call_completion_proc(pre, target, post, quote) + if result.is_a?(Array) + candidates = filter_normalize_candidates(target, result) + menu(candidates) + end + end + end + alias_method :delete_char_or_list, :em_delete_or_list + + private def em_yank(key) + yanked = @kill_ring.yank + insert_text(yanked) if yanked + end + alias_method :yank, :em_yank + + private def em_yank_pop(key) + yanked, prev_yank = @kill_ring.yank_pop + if yanked + line, = byteslice!(current_line, @byte_pointer - prev_yank.bytesize, prev_yank.bytesize) + set_current_line(line, @byte_pointer - prev_yank.bytesize) + insert_text(yanked) + end + end + alias_method :yank_pop, :em_yank_pop + + private def ed_clear_screen(key) + Reline::IOGate.clear_screen + @screen_size = Reline::IOGate.get_screen_size + @rendered_screen.base_y = 0 + clear_rendered_screen_cache + end + alias_method :clear_screen, :ed_clear_screen + + private def em_next_word(key) + if current_line.bytesize > @byte_pointer + byte_size = Reline::Unicode.em_forward_word(current_line, @byte_pointer) + @byte_pointer += byte_size + end + end + alias_method :forward_word, :em_next_word + + private def ed_prev_word(key) + if @byte_pointer > 0 + byte_size = Reline::Unicode.em_backward_word(current_line, @byte_pointer) + @byte_pointer -= byte_size + end + end + alias_method :backward_word, :ed_prev_word + + private def em_delete_next_word(key) + if current_line.bytesize > @byte_pointer + byte_size = Reline::Unicode.em_forward_word(current_line, @byte_pointer) + line, word = byteslice!(current_line, @byte_pointer, byte_size) + set_current_line(line) + @kill_ring.append(word) + end + end + alias_method :kill_word, :em_delete_next_word + + private def ed_delete_prev_word(key) + if @byte_pointer > 0 + byte_size = Reline::Unicode.em_backward_word(current_line, @byte_pointer) + line, word = byteslice!(current_line, @byte_pointer - byte_size, byte_size) + set_current_line(line, @byte_pointer - byte_size) + @kill_ring.append(word, true) + end + end + alias_method :backward_kill_word, :ed_delete_prev_word + + private def ed_transpose_chars(key) + if @byte_pointer > 0 + if @byte_pointer < current_line.bytesize + byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) + @byte_pointer += byte_size + end + back1_byte_size = Reline::Unicode.get_prev_mbchar_size(current_line, @byte_pointer) + if (@byte_pointer - back1_byte_size) > 0 + back2_byte_size = Reline::Unicode.get_prev_mbchar_size(current_line, @byte_pointer - back1_byte_size) + back2_pointer = @byte_pointer - back1_byte_size - back2_byte_size + line, back2_mbchar = byteslice!(current_line, back2_pointer, back2_byte_size) + set_current_line(byteinsert(line, @byte_pointer - back2_byte_size, back2_mbchar)) + end + end + end + alias_method :transpose_chars, :ed_transpose_chars + + private def ed_transpose_words(key) + left_word_start, middle_start, right_word_start, after_start = Reline::Unicode.ed_transpose_words(current_line, @byte_pointer) + before = current_line.byteslice(0, left_word_start) + left_word = current_line.byteslice(left_word_start, middle_start - left_word_start) + middle = current_line.byteslice(middle_start, right_word_start - middle_start) + right_word = current_line.byteslice(right_word_start, after_start - right_word_start) + after = current_line.byteslice(after_start, current_line.bytesize - after_start) + return if left_word.empty? or right_word.empty? + from_head_to_left_word = before + right_word + middle + left_word + set_current_line(from_head_to_left_word + after, from_head_to_left_word.bytesize) + end + alias_method :transpose_words, :ed_transpose_words + + private def em_capitol_case(key) + if current_line.bytesize > @byte_pointer + byte_size, new_str = Reline::Unicode.em_forward_word_with_capitalization(current_line, @byte_pointer) + before = current_line.byteslice(0, @byte_pointer) + after = current_line.byteslice((@byte_pointer + byte_size)..-1) + set_current_line(before + new_str + after, @byte_pointer + new_str.bytesize) + end + end + alias_method :capitalize_word, :em_capitol_case + + private def em_lower_case(key) + if current_line.bytesize > @byte_pointer + byte_size = Reline::Unicode.em_forward_word(current_line, @byte_pointer) + part = current_line.byteslice(@byte_pointer, byte_size).grapheme_clusters.map { |mbchar| + mbchar =~ /[A-Z]/ ? mbchar.downcase : mbchar + }.join + rest = current_line.byteslice((@byte_pointer + byte_size)..-1) + line = current_line.byteslice(0, @byte_pointer) + part + set_current_line(line + rest, line.bytesize) + end + end + alias_method :downcase_word, :em_lower_case + + private def em_upper_case(key) + if current_line.bytesize > @byte_pointer + byte_size = Reline::Unicode.em_forward_word(current_line, @byte_pointer) + part = current_line.byteslice(@byte_pointer, byte_size).grapheme_clusters.map { |mbchar| + mbchar =~ /[a-z]/ ? mbchar.upcase : mbchar + }.join + rest = current_line.byteslice((@byte_pointer + byte_size)..-1) + line = current_line.byteslice(0, @byte_pointer) + part + set_current_line(line + rest, line.bytesize) + end + end + alias_method :upcase_word, :em_upper_case + + private def em_kill_region(key) + if @byte_pointer > 0 + byte_size = Reline::Unicode.em_big_backward_word(current_line, @byte_pointer) + line, deleted = byteslice!(current_line, @byte_pointer - byte_size, byte_size) + set_current_line(line, @byte_pointer - byte_size) + @kill_ring.append(deleted, true) + end + end + alias_method :unix_word_rubout, :em_kill_region + + private def copy_for_vi(text) + if @config.editing_mode_is?(:vi_insert) or @config.editing_mode_is?(:vi_command) + @vi_clipboard = text + end + end + + private def vi_insert(key) + @config.editing_mode = :vi_insert + end + + private def vi_add(key) + @config.editing_mode = :vi_insert + ed_next_char(key) + end + + private def vi_command_mode(key) + ed_prev_char(key) + @config.editing_mode = :vi_command + end + alias_method :vi_movement_mode, :vi_command_mode + + private def vi_next_word(key, arg: 1) + if current_line.bytesize > @byte_pointer + byte_size = Reline::Unicode.vi_forward_word(current_line, @byte_pointer, @drop_terminate_spaces) + @byte_pointer += byte_size + end + arg -= 1 + vi_next_word(key, arg: arg) if arg > 0 + end + + private def vi_prev_word(key, arg: 1) + if @byte_pointer > 0 + byte_size = Reline::Unicode.vi_backward_word(current_line, @byte_pointer) + @byte_pointer -= byte_size + end + arg -= 1 + vi_prev_word(key, arg: arg) if arg > 0 + end + + private def vi_end_word(key, arg: 1, inclusive: false) + if current_line.bytesize > @byte_pointer + byte_size = Reline::Unicode.vi_forward_end_word(current_line, @byte_pointer) + @byte_pointer += byte_size + end + arg -= 1 + if inclusive and arg.zero? + byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) + if byte_size > 0 + @byte_pointer += byte_size + end + end + vi_end_word(key, arg: arg) if arg > 0 + end + + private def vi_next_big_word(key, arg: 1) + if current_line.bytesize > @byte_pointer + byte_size = Reline::Unicode.vi_big_forward_word(current_line, @byte_pointer) + @byte_pointer += byte_size + end + arg -= 1 + vi_next_big_word(key, arg: arg) if arg > 0 + end + + private def vi_prev_big_word(key, arg: 1) + if @byte_pointer > 0 + byte_size = Reline::Unicode.vi_big_backward_word(current_line, @byte_pointer) + @byte_pointer -= byte_size + end + arg -= 1 + vi_prev_big_word(key, arg: arg) if arg > 0 + end + + private def vi_end_big_word(key, arg: 1, inclusive: false) + if current_line.bytesize > @byte_pointer + byte_size = Reline::Unicode.vi_big_forward_end_word(current_line, @byte_pointer) + @byte_pointer += byte_size + end + arg -= 1 + if inclusive and arg.zero? + byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) + if byte_size > 0 + @byte_pointer += byte_size + end + end + vi_end_big_word(key, arg: arg) if arg > 0 + end + + private def vi_delete_prev_char(key) + if @byte_pointer == 0 and @line_index > 0 + @byte_pointer = @buffer_of_lines[@line_index - 1].bytesize + @buffer_of_lines[@line_index - 1] += @buffer_of_lines.delete_at(@line_index) + @line_index -= 1 + process_auto_indent cursor_dependent: false + elsif @byte_pointer > 0 + byte_size = Reline::Unicode.get_prev_mbchar_size(current_line, @byte_pointer) + @byte_pointer -= byte_size + line, _ = byteslice!(current_line, @byte_pointer, byte_size) + set_current_line(line) + end + end + + private def vi_insert_at_bol(key) + ed_move_to_beg(key) + @config.editing_mode = :vi_insert + end + + private def vi_add_at_eol(key) + ed_move_to_end(key) + @config.editing_mode = :vi_insert + end + + private def ed_delete_prev_char(key, arg: 1) + deleted = +'' + arg.times do + if @byte_pointer > 0 + byte_size = Reline::Unicode.get_prev_mbchar_size(current_line, @byte_pointer) + @byte_pointer -= byte_size + line, mbchar = byteslice!(current_line, @byte_pointer, byte_size) + set_current_line(line) + deleted.prepend(mbchar) + end + end + copy_for_vi(deleted) + end + + private def vi_change_meta(key, arg: nil) + if @vi_waiting_operator + set_current_line('', 0) if @vi_waiting_operator == :vi_change_meta_confirm && arg.nil? + @vi_waiting_operator = nil + @vi_waiting_operator_arg = nil + else + @drop_terminate_spaces = true + @vi_waiting_operator = :vi_change_meta_confirm + @vi_waiting_operator_arg = arg || 1 + end + end + + private def vi_change_meta_confirm(byte_pointer_diff) + vi_delete_meta_confirm(byte_pointer_diff) + @config.editing_mode = :vi_insert + @drop_terminate_spaces = false + end + + private def vi_delete_meta(key, arg: nil) + if @vi_waiting_operator + set_current_line('', 0) if @vi_waiting_operator == :vi_delete_meta_confirm && arg.nil? + @vi_waiting_operator = nil + @vi_waiting_operator_arg = nil + else + @vi_waiting_operator = :vi_delete_meta_confirm + @vi_waiting_operator_arg = arg || 1 + end + end + + private def vi_delete_meta_confirm(byte_pointer_diff) + if byte_pointer_diff > 0 + line, cut = byteslice!(current_line, @byte_pointer, byte_pointer_diff) + elsif byte_pointer_diff < 0 + line, cut = byteslice!(current_line, @byte_pointer + byte_pointer_diff, -byte_pointer_diff) + else + return + end + copy_for_vi(cut) + set_current_line(line, @byte_pointer + (byte_pointer_diff < 0 ? byte_pointer_diff : 0)) + end + + private def vi_yank(key, arg: nil) + if @vi_waiting_operator + copy_for_vi(current_line) if @vi_waiting_operator == :vi_yank_confirm && arg.nil? + @vi_waiting_operator = nil + @vi_waiting_operator_arg = nil + else + @vi_waiting_operator = :vi_yank_confirm + @vi_waiting_operator_arg = arg || 1 + end + end + + private def vi_yank_confirm(byte_pointer_diff) + if byte_pointer_diff > 0 + cut = current_line.byteslice(@byte_pointer, byte_pointer_diff) + elsif byte_pointer_diff < 0 + cut = current_line.byteslice(@byte_pointer + byte_pointer_diff, -byte_pointer_diff) + else + return + end + copy_for_vi(cut) + end + + private def vi_list_or_eof(key) + if buffer_empty? + @eof = true + finish + else + ed_newline(key) + end + end + alias_method :vi_end_of_transmission, :vi_list_or_eof + alias_method :vi_eof_maybe, :vi_list_or_eof + + private def ed_delete_next_char(key, arg: 1) + byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) + unless current_line.empty? || byte_size == 0 + line, mbchar = byteslice!(current_line, @byte_pointer, byte_size) + copy_for_vi(mbchar) + if @byte_pointer > 0 && current_line.bytesize == @byte_pointer + byte_size + byte_size = Reline::Unicode.get_prev_mbchar_size(line, @byte_pointer) + set_current_line(line, @byte_pointer - byte_size) + else + set_current_line(line, @byte_pointer) + end + end + arg -= 1 + ed_delete_next_char(key, arg: arg) if arg > 0 + end + + private def vi_to_history_line(key) + if Reline::HISTORY.empty? + return + end + move_history(0, line: :start, cursor: :start) + end + + private def vi_histedit(key) + path = Tempfile.open { |fp| + fp.write whole_lines.join("\n") + fp.path + } + system("#{ENV['EDITOR']} #{path}") + @buffer_of_lines = File.read(path).split("\n") + @buffer_of_lines = [String.new(encoding: encoding)] if @buffer_of_lines.empty? + @line_index = 0 + finish + end + + private def vi_paste_prev(key, arg: 1) + if @vi_clipboard.size > 0 + cursor_point = @vi_clipboard.grapheme_clusters[0..-2].join + set_current_line(byteinsert(current_line, @byte_pointer, @vi_clipboard), @byte_pointer + cursor_point.bytesize) + end + arg -= 1 + vi_paste_prev(key, arg: arg) if arg > 0 + end + + private def vi_paste_next(key, arg: 1) + if @vi_clipboard.size > 0 + byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) + line = byteinsert(current_line, @byte_pointer + byte_size, @vi_clipboard) + set_current_line(line, @byte_pointer + @vi_clipboard.bytesize) + end + arg -= 1 + vi_paste_next(key, arg: arg) if arg > 0 + end + + private def ed_argument_digit(key) + # key is expected to be `ESC digit` or `digit` + num = key[/\d/].to_i + @vi_arg = (@vi_arg || 0) * 10 + num + end + + private def vi_to_column(key, arg: 0) + # Implementing behavior of vi, not Readline's vi-mode. + @byte_pointer, = current_line.grapheme_clusters.inject([0, 0]) { |(total_byte_size, total_width), gc| + mbchar_width = Reline::Unicode.get_mbchar_width(gc) + break [total_byte_size, total_width] if (total_width + mbchar_width) >= arg + [total_byte_size + gc.bytesize, total_width + mbchar_width] + } + end + + private def vi_replace_char(key, arg: 1) + @waiting_proc = ->(k) { + if arg == 1 + byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) + before = current_line.byteslice(0, @byte_pointer) + remaining_point = @byte_pointer + byte_size + after = current_line.byteslice(remaining_point, current_line.bytesize - remaining_point) + set_current_line(before + k + after) + @waiting_proc = nil + elsif arg > 1 + byte_size = 0 + arg.times do + byte_size += Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer + byte_size) + end + before = current_line.byteslice(0, @byte_pointer) + remaining_point = @byte_pointer + byte_size + after = current_line.byteslice(remaining_point, current_line.bytesize - remaining_point) + replaced = k * arg + set_current_line(before + replaced + after, @byte_pointer + replaced.bytesize) + @waiting_proc = nil + end + } + end + + private def vi_next_char(key, arg: 1, inclusive: false) + @waiting_proc = ->(key_for_proc) { search_next_char(key_for_proc, arg, inclusive: inclusive) } + end + + private def vi_to_next_char(key, arg: 1, inclusive: false) + @waiting_proc = ->(key_for_proc) { search_next_char(key_for_proc, arg, need_prev_char: true, inclusive: inclusive) } + end + + private def search_next_char(key, arg, need_prev_char: false, inclusive: false) + prev_total = nil + total = nil + found = false + current_line.byteslice(@byte_pointer..-1).grapheme_clusters.each do |mbchar| + # total has [byte_size, cursor] + unless total + # skip cursor point + width = Reline::Unicode.get_mbchar_width(mbchar) + total = [mbchar.bytesize, width] + else + if key == mbchar + arg -= 1 + if arg.zero? + found = true + break + end + end + width = Reline::Unicode.get_mbchar_width(mbchar) + prev_total = total + total = [total.first + mbchar.bytesize, total.last + width] + end + end + if not need_prev_char and found and total + byte_size, _ = total + @byte_pointer += byte_size + elsif need_prev_char and found and prev_total + byte_size, _ = prev_total + @byte_pointer += byte_size + end + if inclusive + byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) + if byte_size > 0 + @byte_pointer += byte_size + end + end + @waiting_proc = nil + end + + private def vi_prev_char(key, arg: 1) + @waiting_proc = ->(key_for_proc) { search_prev_char(key_for_proc, arg) } + end + + private def vi_to_prev_char(key, arg: 1) + @waiting_proc = ->(key_for_proc) { search_prev_char(key_for_proc, arg, true) } + end + + private def search_prev_char(key, arg, need_next_char = false) + prev_total = nil + total = nil + found = false + current_line.byteslice(0..@byte_pointer).grapheme_clusters.reverse_each do |mbchar| + # total has [byte_size, cursor] + unless total + # skip cursor point + width = Reline::Unicode.get_mbchar_width(mbchar) + total = [mbchar.bytesize, width] + else + if key == mbchar + arg -= 1 + if arg.zero? + found = true + break + end + end + width = Reline::Unicode.get_mbchar_width(mbchar) + prev_total = total + total = [total.first + mbchar.bytesize, total.last + width] + end + end + if not need_next_char and found and total + byte_size, _ = total + @byte_pointer -= byte_size + elsif need_next_char and found and prev_total + byte_size, _ = prev_total + @byte_pointer -= byte_size + end + @waiting_proc = nil + end + + private def vi_join_lines(key, arg: 1) + if @buffer_of_lines.size > @line_index + 1 + next_line = @buffer_of_lines.delete_at(@line_index + 1).lstrip + set_current_line(current_line + ' ' + next_line, current_line.bytesize) + end + arg -= 1 + vi_join_lines(key, arg: arg) if arg > 0 + end + + private def em_set_mark(key) + @mark_pointer = [@byte_pointer, @line_index] + end + alias_method :set_mark, :em_set_mark + + private def em_exchange_mark(key) + return unless @mark_pointer + new_pointer = [@byte_pointer, @line_index] + @byte_pointer, @line_index = @mark_pointer + @mark_pointer = new_pointer + end + alias_method :exchange_point_and_mark, :em_exchange_mark + + private def emacs_editing_mode(key) + @config.editing_mode = :emacs + end + + private def vi_editing_mode(key) + @config.editing_mode = :vi_insert + end + + private def move_undo_redo(direction) + @restoring = true + return unless (0..@undo_redo_history.size - 1).cover?(@undo_redo_index + direction) + + @undo_redo_index += direction + buffer_of_lines, byte_pointer, line_index = @undo_redo_history[@undo_redo_index] + @buffer_of_lines = buffer_of_lines.dup + @line_index = line_index + @byte_pointer = byte_pointer + end + + private def undo(_key) + move_undo_redo(-1) + end + + private def redo(_key) + move_undo_redo(+1) + end + + private def prev_action_state_value(type) + @prev_action_state[0] == type ? @prev_action_state[1] : nil + end + + private def set_next_action_state(type, value) + @next_action_state = [type, value] + end + + private def re_read_init_file(_key) + @config.reload + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/unicode.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/unicode.rb new file mode 100644 index 000000000..79f39a5b9 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/unicode.rb @@ -0,0 +1,421 @@ +class Reline::Unicode + EscapedPairs = { + 0x00 => '^@', + 0x01 => '^A', # C-a + 0x02 => '^B', + 0x03 => '^C', + 0x04 => '^D', + 0x05 => '^E', + 0x06 => '^F', + 0x07 => '^G', + 0x08 => '^H', # Backspace + 0x09 => '^I', + 0x0A => '^J', + 0x0B => '^K', + 0x0C => '^L', + 0x0D => '^M', # Enter + 0x0E => '^N', + 0x0F => '^O', + 0x10 => '^P', + 0x11 => '^Q', + 0x12 => '^R', + 0x13 => '^S', + 0x14 => '^T', + 0x15 => '^U', + 0x16 => '^V', + 0x17 => '^W', + 0x18 => '^X', + 0x19 => '^Y', + 0x1A => '^Z', # C-z + 0x1B => '^[', # C-[ C-3 + 0x1C => '^\\', # C-\ + 0x1D => '^]', # C-] + 0x1E => '^^', # C-~ C-6 + 0x1F => '^_', # C-_ C-7 + 0x7F => '^?', # C-? C-8 + } + + NON_PRINTING_START = "\1" + NON_PRINTING_END = "\2" + CSI_REGEXP = /\e\[[\d;]*[ABCDEFGHJKSTfminsuhl]/ + OSC_REGEXP = /\e\]\d+(?:;[^;\a\e]+)*(?:\a|\e\\)/ + WIDTH_SCANNER = /\G(?:(#{NON_PRINTING_START})|(#{NON_PRINTING_END})|(#{CSI_REGEXP})|(#{OSC_REGEXP})|(\X))/o + + def self.escape_for_print(str) + str.chars.map! { |gr| + case gr + when -"\n" + gr + when -"\t" + -' ' + else + EscapedPairs[gr.ord] || gr + end + }.join + end + + def self.safe_encode(str, encoding) + # Reline only supports utf-8 convertible string. + converted = str.encode(encoding, invalid: :replace, undef: :replace) + return converted if str.encoding == Encoding::UTF_8 || converted.encoding == Encoding::UTF_8 || converted.ascii_only? + + # This code is essentially doing the same thing as + # `str.encode(utf8, **replace_options).encode(encoding, **replace_options)` + # but also avoids unnecessary irreversible encoding conversion. + converted.gsub(/\X/) do |c| + c.encode(Encoding::UTF_8) + c + rescue Encoding::UndefinedConversionError + '?' + end + end + + require 'reline/unicode/east_asian_width' + + def self.east_asian_width(ord) + chunk_index = EastAsianWidth::CHUNK_LAST.bsearch_index { |o| ord <= o } + size = EastAsianWidth::CHUNK_WIDTH[chunk_index] + size == -1 ? Reline.ambiguous_width : size + end + + def self.get_mbchar_width(mbchar) + ord = mbchar.ord + if ord <= 0x1F # in EscapedPairs + return 2 + elsif mbchar.length == 1 && ord <= 0x7E # printable ASCII chars + return 1 + end + + utf8_mbchar = mbchar.encode(Encoding::UTF_8) + zwj = false + utf8_mbchar.chars.sum do |c| + if zwj + zwj = false + 0 + elsif c.ord == 0x200D # Zero Width Joiner + zwj = true + 0 + else + east_asian_width(c.ord) + end + end + end + + def self.calculate_width(str, allow_escape_code = false) + if allow_escape_code + width = 0 + rest = str.encode(Encoding::UTF_8) + in_zero_width = false + rest.scan(WIDTH_SCANNER) do |non_printing_start, non_printing_end, csi, osc, gc| + case + when non_printing_start + in_zero_width = true + when non_printing_end + in_zero_width = false + when csi, osc + when gc + unless in_zero_width + width += get_mbchar_width(gc) + end + end + end + width + else + str.encode(Encoding::UTF_8).grapheme_clusters.inject(0) { |w, gc| + w + get_mbchar_width(gc) + } + end + end + + # This method is used by IRB + def self.split_by_width(str, max_width) + lines = split_line_by_width(str, max_width) + [lines, lines.size] + end + + def self.split_line_by_width(str, max_width, encoding = str.encoding, offset: 0) + lines = [String.new(encoding: encoding)] + width = offset + rest = str.encode(Encoding::UTF_8) + in_zero_width = false + seq = String.new(encoding: encoding) + rest.scan(WIDTH_SCANNER) do |non_printing_start, non_printing_end, csi, osc, gc| + case + when non_printing_start + in_zero_width = true + when non_printing_end + in_zero_width = false + when csi + lines.last << csi + unless in_zero_width + if csi == -"\e[m" || csi == -"\e[0m" + seq.clear + else + seq << csi + end + end + when osc + lines.last << osc + seq << osc unless in_zero_width + when gc + unless in_zero_width + mbchar_width = get_mbchar_width(gc) + if (width += mbchar_width) > max_width + width = mbchar_width + lines << seq.dup + end + end + lines.last << gc + end + end + # The cursor moves to next line in first + if width == max_width + lines << String.new(encoding: encoding) + end + lines + end + + def self.strip_non_printing_start_end(prompt) + prompt.gsub(/\x01([^\x02]*)(?:\x02|\z)/) { $1 } + end + + # Take a chunk of a String cut by width with escape sequences. + def self.take_range(str, start_col, max_width) + take_mbchar_range(str, start_col, max_width).first + end + + def self.take_mbchar_range(str, start_col, width, cover_begin: false, cover_end: false, padding: false) + chunk = String.new(encoding: str.encoding) + + end_col = start_col + width + total_width = 0 + rest = str.encode(Encoding::UTF_8) + in_zero_width = false + chunk_start_col = nil + chunk_end_col = nil + has_csi = false + rest.scan(WIDTH_SCANNER) do |non_printing_start, non_printing_end, csi, osc, gc| + case + when non_printing_start + in_zero_width = true + when non_printing_end + in_zero_width = false + when csi + has_csi = true + chunk << csi + when osc + chunk << osc + when gc + if in_zero_width + chunk << gc + next + end + + mbchar_width = get_mbchar_width(gc) + prev_width = total_width + total_width += mbchar_width + + if (cover_begin || padding ? total_width <= start_col : prev_width < start_col) + # Current character haven't reached start_col yet + next + elsif padding && !cover_begin && prev_width < start_col && start_col < total_width + # Add preceding padding. This padding might have background color. + chunk << ' ' * (total_width - start_col) + chunk_start_col ||= start_col + chunk_end_col = total_width + next + elsif (cover_end ? prev_width < end_col : total_width <= end_col) + # Current character is in the range + chunk << gc + chunk_start_col ||= prev_width + chunk_end_col = total_width + break if total_width >= end_col + else + # Current character exceeds end_col + if padding && end_col < total_width + # Add succeeding padding. This padding might have background color. + chunk << ' ' * (end_col - prev_width) + chunk_start_col ||= prev_width + chunk_end_col = end_col + end + break + end + end + end + chunk_start_col ||= start_col + chunk_end_col ||= start_col + if padding && chunk_end_col < end_col + # Append padding. This padding should not include background color. + chunk << "\e[0m" if has_csi + chunk << ' ' * (end_col - chunk_end_col) + chunk_end_col = end_col + end + [chunk, chunk_start_col, chunk_end_col - chunk_start_col] + end + + def self.get_next_mbchar_size(line, byte_pointer) + grapheme = line.byteslice(byte_pointer..-1).grapheme_clusters.first + grapheme ? grapheme.bytesize : 0 + end + + def self.get_prev_mbchar_size(line, byte_pointer) + if byte_pointer.zero? + 0 + else + grapheme = line.byteslice(0..(byte_pointer - 1)).grapheme_clusters.last + grapheme ? grapheme.bytesize : 0 + end + end + + def self.em_forward_word(line, byte_pointer) + gcs = line.byteslice(byte_pointer..).grapheme_clusters + nonwords = gcs.take_while { |c| !word_character?(c) } + words = gcs.drop(nonwords.size).take_while { |c| word_character?(c) } + nonwords.sum(&:bytesize) + words.sum(&:bytesize) + end + + def self.em_forward_word_with_capitalization(line, byte_pointer) + gcs = line.byteslice(byte_pointer..).grapheme_clusters + nonwords = gcs.take_while { |c| !word_character?(c) } + words = gcs.drop(nonwords.size).take_while { |c| word_character?(c) } + [nonwords.sum(&:bytesize) + words.sum(&:bytesize), nonwords.join + words.join.capitalize] + end + + def self.em_backward_word(line, byte_pointer) + gcs = line.byteslice(0, byte_pointer).grapheme_clusters.reverse + nonwords = gcs.take_while { |c| !word_character?(c) } + words = gcs.drop(nonwords.size).take_while { |c| word_character?(c) } + nonwords.sum(&:bytesize) + words.sum(&:bytesize) + end + + def self.em_big_backward_word(line, byte_pointer) + gcs = line.byteslice(0, byte_pointer).grapheme_clusters.reverse + spaces = gcs.take_while { |c| space_character?(c) } + nonspaces = gcs.drop(spaces.size).take_while { |c| !space_character?(c) } + spaces.sum(&:bytesize) + nonspaces.sum(&:bytesize) + end + + def self.ed_transpose_words(line, byte_pointer) + gcs = line.byteslice(0, byte_pointer).grapheme_clusters + pos = gcs.size + gcs += line.byteslice(byte_pointer..).grapheme_clusters + pos += 1 while pos < gcs.size && !word_character?(gcs[pos]) + if pos == gcs.size # 'aaa bbb [cursor] ' + pos -= 1 while pos > 0 && !word_character?(gcs[pos - 1]) + second_word_end = gcs.size + else # 'aaa [cursor]bbb' + pos += 1 while pos < gcs.size && word_character?(gcs[pos]) + second_word_end = pos + end + pos -= 1 while pos > 0 && word_character?(gcs[pos - 1]) + second_word_start = pos + pos -= 1 while pos > 0 && !word_character?(gcs[pos - 1]) + first_word_end = pos + pos -= 1 while pos > 0 && word_character?(gcs[pos - 1]) + first_word_start = pos + + [first_word_start, first_word_end, second_word_start, second_word_end].map do |idx| + gcs.take(idx).sum(&:bytesize) + end + end + + def self.vi_big_forward_word(line, byte_pointer) + gcs = line.byteslice(byte_pointer..).grapheme_clusters + nonspaces = gcs.take_while { |c| !space_character?(c) } + spaces = gcs.drop(nonspaces.size).take_while { |c| space_character?(c) } + nonspaces.sum(&:bytesize) + spaces.sum(&:bytesize) + end + + def self.vi_big_forward_end_word(line, byte_pointer) + gcs = line.byteslice(byte_pointer..).grapheme_clusters + first = gcs.shift(1) + spaces = gcs.take_while { |c| space_character?(c) } + nonspaces = gcs.drop(spaces.size).take_while { |c| !space_character?(c) } + matched = spaces + nonspaces + matched.pop + first.sum(&:bytesize) + matched.sum(&:bytesize) + end + + def self.vi_big_backward_word(line, byte_pointer) + gcs = line.byteslice(0, byte_pointer).grapheme_clusters.reverse + spaces = gcs.take_while { |c| space_character?(c) } + nonspaces = gcs.drop(spaces.size).take_while { |c| !space_character?(c) } + spaces.sum(&:bytesize) + nonspaces.sum(&:bytesize) + end + + def self.vi_forward_word(line, byte_pointer, drop_terminate_spaces = false) + gcs = line.byteslice(byte_pointer..).grapheme_clusters + return 0 if gcs.empty? + + c = gcs.first + matched = + if word_character?(c) + gcs.take_while { |c| word_character?(c) } + elsif space_character?(c) + gcs.take_while { |c| space_character?(c) } + else + gcs.take_while { |c| !word_character?(c) && !space_character?(c) } + end + + return matched.sum(&:bytesize) if drop_terminate_spaces + + spaces = gcs.drop(matched.size).take_while { |c| space_character?(c) } + matched.sum(&:bytesize) + spaces.sum(&:bytesize) + end + + def self.vi_forward_end_word(line, byte_pointer) + gcs = line.byteslice(byte_pointer..).grapheme_clusters + return 0 if gcs.empty? + return gcs.first.bytesize if gcs.size == 1 + + start = gcs.shift + skips = [start] + if space_character?(start) || space_character?(gcs.first) + spaces = gcs.take_while { |c| space_character?(c) } + skips += spaces + gcs.shift(spaces.size) + end + start_with_word = word_character?(gcs.first) + matched = gcs.take_while { |c| start_with_word ? word_character?(c) : !word_character?(c) && !space_character?(c) } + matched.pop + skips.sum(&:bytesize) + matched.sum(&:bytesize) + end + + def self.vi_backward_word(line, byte_pointer) + gcs = line.byteslice(0, byte_pointer).grapheme_clusters.reverse + spaces = gcs.take_while { |c| space_character?(c) } + gcs.shift(spaces.size) + start_with_word = word_character?(gcs.first) + matched = gcs.take_while { |c| start_with_word ? word_character?(c) : !word_character?(c) && !space_character?(c) } + spaces.sum(&:bytesize) + matched.sum(&:bytesize) + end + + def self.common_prefix(list, ignore_case: false) + return '' if list.empty? + + common_prefix_gcs = list.first.grapheme_clusters + list.each do |item| + gcs = item.grapheme_clusters + common_prefix_gcs = common_prefix_gcs.take_while.with_index do |gc, i| + ignore_case ? gc.casecmp?(gcs[i]) : gc == gcs[i] + end + end + common_prefix_gcs.join + end + + def self.vi_first_print(line) + gcs = line.grapheme_clusters + spaces = gcs.take_while { |c| space_character?(c) } + spaces.sum(&:bytesize) + end + + def self.word_character?(s) + s.encode(Encoding::UTF_8).match?(/\p{Word}/) if s + rescue Encoding::UndefinedConversionError + false + end + + def self.space_character?(s) + s.match?(/\s/) if s + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/unicode/east_asian_width.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/unicode/east_asian_width.rb new file mode 100644 index 000000000..725d88bce --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/unicode/east_asian_width.rb @@ -0,0 +1,1292 @@ +class Reline::Unicode::EastAsianWidth + # This is based on EastAsianWidth.txt + # UNICODE_VERSION = '16.0.0' + + CHUNK_LAST, CHUNK_WIDTH = [ + [0x1f, 2], + [0x7e, 1], + [0x7f, 2], + [0xa0, 1], + [0xa1, -1], + [0xa3, 1], + [0xa4, -1], + [0xa6, 1], + [0xa8, -1], + [0xa9, 1], + [0xaa, -1], + [0xac, 1], + [0xae, -1], + [0xaf, 1], + [0xb4, -1], + [0xb5, 1], + [0xba, -1], + [0xbb, 1], + [0xbf, -1], + [0xc5, 1], + [0xc6, -1], + [0xcf, 1], + [0xd0, -1], + [0xd6, 1], + [0xd8, -1], + [0xdd, 1], + [0xe1, -1], + [0xe5, 1], + [0xe6, -1], + [0xe7, 1], + [0xea, -1], + [0xeb, 1], + [0xed, -1], + [0xef, 1], + [0xf0, -1], + [0xf1, 1], + [0xf3, -1], + [0xf6, 1], + [0xfa, -1], + [0xfb, 1], + [0xfc, -1], + [0xfd, 1], + [0xfe, -1], + [0x100, 1], + [0x101, -1], + [0x110, 1], + [0x111, -1], + [0x112, 1], + [0x113, -1], + [0x11a, 1], + [0x11b, -1], + [0x125, 1], + [0x127, -1], + [0x12a, 1], + [0x12b, -1], + [0x130, 1], + [0x133, -1], + [0x137, 1], + [0x138, -1], + [0x13e, 1], + [0x142, -1], + [0x143, 1], + [0x144, -1], + [0x147, 1], + [0x14b, -1], + [0x14c, 1], + [0x14d, -1], + [0x151, 1], + [0x153, -1], + [0x165, 1], + [0x167, -1], + [0x16a, 1], + [0x16b, -1], + [0x1cd, 1], + [0x1ce, -1], + [0x1cf, 1], + [0x1d0, -1], + [0x1d1, 1], + [0x1d2, -1], + [0x1d3, 1], + [0x1d4, -1], + [0x1d5, 1], + [0x1d6, -1], + [0x1d7, 1], + [0x1d8, -1], + [0x1d9, 1], + [0x1da, -1], + [0x1db, 1], + [0x1dc, -1], + [0x250, 1], + [0x251, -1], + [0x260, 1], + [0x261, -1], + [0x2c3, 1], + [0x2c4, -1], + [0x2c6, 1], + [0x2c7, -1], + [0x2c8, 1], + [0x2cb, -1], + [0x2cc, 1], + [0x2cd, -1], + [0x2cf, 1], + [0x2d0, -1], + [0x2d7, 1], + [0x2db, -1], + [0x2dc, 1], + [0x2dd, -1], + [0x2de, 1], + [0x2df, -1], + [0x2ff, 1], + [0x36f, 0], + [0x390, 1], + [0x3a1, -1], + [0x3a2, 1], + [0x3a9, -1], + [0x3b0, 1], + [0x3c1, -1], + [0x3c2, 1], + [0x3c9, -1], + [0x400, 1], + [0x401, -1], + [0x40f, 1], + [0x44f, -1], + [0x450, 1], + [0x451, -1], + [0x482, 1], + [0x489, 0], + [0x590, 1], + [0x5bd, 0], + [0x5be, 1], + [0x5bf, 0], + [0x5c0, 1], + [0x5c2, 0], + [0x5c3, 1], + [0x5c5, 0], + [0x5c6, 1], + [0x5c7, 0], + [0x60f, 1], + [0x61a, 0], + [0x64a, 1], + [0x65f, 0], + [0x66f, 1], + [0x670, 0], + [0x6d5, 1], + [0x6dc, 0], + [0x6de, 1], + [0x6e4, 0], + [0x6e6, 1], + [0x6e8, 0], + [0x6e9, 1], + [0x6ed, 0], + [0x710, 1], + [0x711, 0], + [0x72f, 1], + [0x74a, 0], + [0x7a5, 1], + [0x7b0, 0], + [0x7ea, 1], + [0x7f3, 0], + [0x7fc, 1], + [0x7fd, 0], + [0x815, 1], + [0x819, 0], + [0x81a, 1], + [0x823, 0], + [0x824, 1], + [0x827, 0], + [0x828, 1], + [0x82d, 0], + [0x858, 1], + [0x85b, 0], + [0x896, 1], + [0x89f, 0], + [0x8c9, 1], + [0x8e1, 0], + [0x8e2, 1], + [0x902, 0], + [0x939, 1], + [0x93a, 0], + [0x93b, 1], + [0x93c, 0], + [0x940, 1], + [0x948, 0], + [0x94c, 1], + [0x94d, 0], + [0x950, 1], + [0x957, 0], + [0x961, 1], + [0x963, 0], + [0x980, 1], + [0x981, 0], + [0x9bb, 1], + [0x9bc, 0], + [0x9c0, 1], + [0x9c4, 0], + [0x9cc, 1], + [0x9cd, 0], + [0x9e1, 1], + [0x9e3, 0], + [0x9fd, 1], + [0x9fe, 0], + [0xa00, 1], + [0xa02, 0], + [0xa3b, 1], + [0xa3c, 0], + [0xa40, 1], + [0xa42, 0], + [0xa46, 1], + [0xa48, 0], + [0xa4a, 1], + [0xa4d, 0], + [0xa50, 1], + [0xa51, 0], + [0xa6f, 1], + [0xa71, 0], + [0xa74, 1], + [0xa75, 0], + [0xa80, 1], + [0xa82, 0], + [0xabb, 1], + [0xabc, 0], + [0xac0, 1], + [0xac5, 0], + [0xac6, 1], + [0xac8, 0], + [0xacc, 1], + [0xacd, 0], + [0xae1, 1], + [0xae3, 0], + [0xaf9, 1], + [0xaff, 0], + [0xb00, 1], + [0xb01, 0], + [0xb3b, 1], + [0xb3c, 0], + [0xb3e, 1], + [0xb3f, 0], + [0xb40, 1], + [0xb44, 0], + [0xb4c, 1], + [0xb4d, 0], + [0xb54, 1], + [0xb56, 0], + [0xb61, 1], + [0xb63, 0], + [0xb81, 1], + [0xb82, 0], + [0xbbf, 1], + [0xbc0, 0], + [0xbcc, 1], + [0xbcd, 0], + [0xbff, 1], + [0xc00, 0], + [0xc03, 1], + [0xc04, 0], + [0xc3b, 1], + [0xc3c, 0], + [0xc3d, 1], + [0xc40, 0], + [0xc45, 1], + [0xc48, 0], + [0xc49, 1], + [0xc4d, 0], + [0xc54, 1], + [0xc56, 0], + [0xc61, 1], + [0xc63, 0], + [0xc80, 1], + [0xc81, 0], + [0xcbb, 1], + [0xcbc, 0], + [0xcbe, 1], + [0xcbf, 0], + [0xcc5, 1], + [0xcc6, 0], + [0xccb, 1], + [0xccd, 0], + [0xce1, 1], + [0xce3, 0], + [0xcff, 1], + [0xd01, 0], + [0xd3a, 1], + [0xd3c, 0], + [0xd40, 1], + [0xd44, 0], + [0xd4c, 1], + [0xd4d, 0], + [0xd61, 1], + [0xd63, 0], + [0xd80, 1], + [0xd81, 0], + [0xdc9, 1], + [0xdca, 0], + [0xdd1, 1], + [0xdd4, 0], + [0xdd5, 1], + [0xdd6, 0], + [0xe30, 1], + [0xe31, 0], + [0xe33, 1], + [0xe3a, 0], + [0xe46, 1], + [0xe4e, 0], + [0xeb0, 1], + [0xeb1, 0], + [0xeb3, 1], + [0xebc, 0], + [0xec7, 1], + [0xece, 0], + [0xf17, 1], + [0xf19, 0], + [0xf34, 1], + [0xf35, 0], + [0xf36, 1], + [0xf37, 0], + [0xf38, 1], + [0xf39, 0], + [0xf70, 1], + [0xf7e, 0], + [0xf7f, 1], + [0xf84, 0], + [0xf85, 1], + [0xf87, 0], + [0xf8c, 1], + [0xf97, 0], + [0xf98, 1], + [0xfbc, 0], + [0xfc5, 1], + [0xfc6, 0], + [0x102c, 1], + [0x1030, 0], + [0x1031, 1], + [0x1037, 0], + [0x1038, 1], + [0x103a, 0], + [0x103c, 1], + [0x103e, 0], + [0x1057, 1], + [0x1059, 0], + [0x105d, 1], + [0x1060, 0], + [0x1070, 1], + [0x1074, 0], + [0x1081, 1], + [0x1082, 0], + [0x1084, 1], + [0x1086, 0], + [0x108c, 1], + [0x108d, 0], + [0x109c, 1], + [0x109d, 0], + [0x10ff, 1], + [0x115f, 2], + [0x11ff, 0], + [0x135c, 1], + [0x135f, 0], + [0x1711, 1], + [0x1714, 0], + [0x1731, 1], + [0x1733, 0], + [0x1751, 1], + [0x1753, 0], + [0x1771, 1], + [0x1773, 0], + [0x17b3, 1], + [0x17b5, 0], + [0x17b6, 1], + [0x17bd, 0], + [0x17c5, 1], + [0x17c6, 0], + [0x17c8, 1], + [0x17d3, 0], + [0x17dc, 1], + [0x17dd, 0], + [0x180a, 1], + [0x180d, 0], + [0x180e, 1], + [0x180f, 0], + [0x1884, 1], + [0x1886, 0], + [0x18a8, 1], + [0x18a9, 0], + [0x191f, 1], + [0x1922, 0], + [0x1926, 1], + [0x1928, 0], + [0x1931, 1], + [0x1932, 0], + [0x1938, 1], + [0x193b, 0], + [0x1a16, 1], + [0x1a18, 0], + [0x1a1a, 1], + [0x1a1b, 0], + [0x1a55, 1], + [0x1a56, 0], + [0x1a57, 1], + [0x1a5e, 0], + [0x1a5f, 1], + [0x1a60, 0], + [0x1a61, 1], + [0x1a62, 0], + [0x1a64, 1], + [0x1a6c, 0], + [0x1a72, 1], + [0x1a7c, 0], + [0x1a7e, 1], + [0x1a7f, 0], + [0x1aaf, 1], + [0x1ace, 0], + [0x1aff, 1], + [0x1b03, 0], + [0x1b33, 1], + [0x1b34, 0], + [0x1b35, 1], + [0x1b3a, 0], + [0x1b3b, 1], + [0x1b3c, 0], + [0x1b41, 1], + [0x1b42, 0], + [0x1b6a, 1], + [0x1b73, 0], + [0x1b7f, 1], + [0x1b81, 0], + [0x1ba1, 1], + [0x1ba5, 0], + [0x1ba7, 1], + [0x1ba9, 0], + [0x1baa, 1], + [0x1bad, 0], + [0x1be5, 1], + [0x1be6, 0], + [0x1be7, 1], + [0x1be9, 0], + [0x1bec, 1], + [0x1bed, 0], + [0x1bee, 1], + [0x1bf1, 0], + [0x1c2b, 1], + [0x1c33, 0], + [0x1c35, 1], + [0x1c37, 0], + [0x1ccf, 1], + [0x1cd2, 0], + [0x1cd3, 1], + [0x1ce0, 0], + [0x1ce1, 1], + [0x1ce8, 0], + [0x1cec, 1], + [0x1ced, 0], + [0x1cf3, 1], + [0x1cf4, 0], + [0x1cf7, 1], + [0x1cf9, 0], + [0x1dbf, 1], + [0x1dff, 0], + [0x200f, 1], + [0x2010, -1], + [0x2012, 1], + [0x2016, -1], + [0x2017, 1], + [0x2019, -1], + [0x201b, 1], + [0x201d, -1], + [0x201f, 1], + [0x2022, -1], + [0x2023, 1], + [0x2027, -1], + [0x202f, 1], + [0x2030, -1], + [0x2031, 1], + [0x2033, -1], + [0x2034, 1], + [0x2035, -1], + [0x203a, 1], + [0x203b, -1], + [0x203d, 1], + [0x203e, -1], + [0x2073, 1], + [0x2074, -1], + [0x207e, 1], + [0x207f, -1], + [0x2080, 1], + [0x2084, -1], + [0x20ab, 1], + [0x20ac, -1], + [0x20cf, 1], + [0x20f0, 0], + [0x2102, 1], + [0x2103, -1], + [0x2104, 1], + [0x2105, -1], + [0x2108, 1], + [0x2109, -1], + [0x2112, 1], + [0x2113, -1], + [0x2115, 1], + [0x2116, -1], + [0x2120, 1], + [0x2122, -1], + [0x2125, 1], + [0x2126, -1], + [0x212a, 1], + [0x212b, -1], + [0x2152, 1], + [0x2154, -1], + [0x215a, 1], + [0x215e, -1], + [0x215f, 1], + [0x216b, -1], + [0x216f, 1], + [0x2179, -1], + [0x2188, 1], + [0x2189, -1], + [0x218f, 1], + [0x2199, -1], + [0x21b7, 1], + [0x21b9, -1], + [0x21d1, 1], + [0x21d2, -1], + [0x21d3, 1], + [0x21d4, -1], + [0x21e6, 1], + [0x21e7, -1], + [0x21ff, 1], + [0x2200, -1], + [0x2201, 1], + [0x2203, -1], + [0x2206, 1], + [0x2208, -1], + [0x220a, 1], + [0x220b, -1], + [0x220e, 1], + [0x220f, -1], + [0x2210, 1], + [0x2211, -1], + [0x2214, 1], + [0x2215, -1], + [0x2219, 1], + [0x221a, -1], + [0x221c, 1], + [0x2220, -1], + [0x2222, 1], + [0x2223, -1], + [0x2224, 1], + [0x2225, -1], + [0x2226, 1], + [0x222c, -1], + [0x222d, 1], + [0x222e, -1], + [0x2233, 1], + [0x2237, -1], + [0x223b, 1], + [0x223d, -1], + [0x2247, 1], + [0x2248, -1], + [0x224b, 1], + [0x224c, -1], + [0x2251, 1], + [0x2252, -1], + [0x225f, 1], + [0x2261, -1], + [0x2263, 1], + [0x2267, -1], + [0x2269, 1], + [0x226b, -1], + [0x226d, 1], + [0x226f, -1], + [0x2281, 1], + [0x2283, -1], + [0x2285, 1], + [0x2287, -1], + [0x2294, 1], + [0x2295, -1], + [0x2298, 1], + [0x2299, -1], + [0x22a4, 1], + [0x22a5, -1], + [0x22be, 1], + [0x22bf, -1], + [0x2311, 1], + [0x2312, -1], + [0x2319, 1], + [0x231b, 2], + [0x2328, 1], + [0x232a, 2], + [0x23e8, 1], + [0x23ec, 2], + [0x23ef, 1], + [0x23f0, 2], + [0x23f2, 1], + [0x23f3, 2], + [0x245f, 1], + [0x24e9, -1], + [0x24ea, 1], + [0x254b, -1], + [0x254f, 1], + [0x2573, -1], + [0x257f, 1], + [0x258f, -1], + [0x2591, 1], + [0x2595, -1], + [0x259f, 1], + [0x25a1, -1], + [0x25a2, 1], + [0x25a9, -1], + [0x25b1, 1], + [0x25b3, -1], + [0x25b5, 1], + [0x25b7, -1], + [0x25bb, 1], + [0x25bd, -1], + [0x25bf, 1], + [0x25c1, -1], + [0x25c5, 1], + [0x25c8, -1], + [0x25ca, 1], + [0x25cb, -1], + [0x25cd, 1], + [0x25d1, -1], + [0x25e1, 1], + [0x25e5, -1], + [0x25ee, 1], + [0x25ef, -1], + [0x25fc, 1], + [0x25fe, 2], + [0x2604, 1], + [0x2606, -1], + [0x2608, 1], + [0x2609, -1], + [0x260d, 1], + [0x260f, -1], + [0x2613, 1], + [0x2615, 2], + [0x261b, 1], + [0x261c, -1], + [0x261d, 1], + [0x261e, -1], + [0x262f, 1], + [0x2637, 2], + [0x263f, 1], + [0x2640, -1], + [0x2641, 1], + [0x2642, -1], + [0x2647, 1], + [0x2653, 2], + [0x265f, 1], + [0x2661, -1], + [0x2662, 1], + [0x2665, -1], + [0x2666, 1], + [0x266a, -1], + [0x266b, 1], + [0x266d, -1], + [0x266e, 1], + [0x266f, -1], + [0x267e, 1], + [0x267f, 2], + [0x2689, 1], + [0x268f, 2], + [0x2692, 1], + [0x2693, 2], + [0x269d, 1], + [0x269f, -1], + [0x26a0, 1], + [0x26a1, 2], + [0x26a9, 1], + [0x26ab, 2], + [0x26bc, 1], + [0x26be, 2], + [0x26bf, -1], + [0x26c3, 1], + [0x26c5, 2], + [0x26cd, -1], + [0x26ce, 2], + [0x26d3, -1], + [0x26d4, 2], + [0x26e1, -1], + [0x26e2, 1], + [0x26e3, -1], + [0x26e7, 1], + [0x26e9, -1], + [0x26ea, 2], + [0x26f1, -1], + [0x26f3, 2], + [0x26f4, -1], + [0x26f5, 2], + [0x26f9, -1], + [0x26fa, 2], + [0x26fc, -1], + [0x26fd, 2], + [0x26ff, -1], + [0x2704, 1], + [0x2705, 2], + [0x2709, 1], + [0x270b, 2], + [0x2727, 1], + [0x2728, 2], + [0x273c, 1], + [0x273d, -1], + [0x274b, 1], + [0x274c, 2], + [0x274d, 1], + [0x274e, 2], + [0x2752, 1], + [0x2755, 2], + [0x2756, 1], + [0x2757, 2], + [0x2775, 1], + [0x277f, -1], + [0x2794, 1], + [0x2797, 2], + [0x27af, 1], + [0x27b0, 2], + [0x27be, 1], + [0x27bf, 2], + [0x2b1a, 1], + [0x2b1c, 2], + [0x2b4f, 1], + [0x2b50, 2], + [0x2b54, 1], + [0x2b55, 2], + [0x2b59, -1], + [0x2cee, 1], + [0x2cf1, 0], + [0x2d7e, 1], + [0x2d7f, 0], + [0x2ddf, 1], + [0x2dff, 0], + [0x2e7f, 1], + [0x2e99, 2], + [0x2e9a, 1], + [0x2ef3, 2], + [0x2eff, 1], + [0x2fd5, 2], + [0x2fef, 1], + [0x3029, 2], + [0x302d, 0], + [0x303e, 2], + [0x3040, 1], + [0x3096, 2], + [0x3098, 1], + [0x309a, 0], + [0x30ff, 2], + [0x3104, 1], + [0x312f, 2], + [0x3130, 1], + [0x318e, 2], + [0x318f, 1], + [0x31e5, 2], + [0x31ee, 1], + [0x321e, 2], + [0x321f, 1], + [0x3247, 2], + [0x324f, -1], + [0xa48c, 2], + [0xa48f, 1], + [0xa4c6, 2], + [0xa66e, 1], + [0xa672, 0], + [0xa673, 1], + [0xa67d, 0], + [0xa69d, 1], + [0xa69f, 0], + [0xa6ef, 1], + [0xa6f1, 0], + [0xa801, 1], + [0xa802, 0], + [0xa805, 1], + [0xa806, 0], + [0xa80a, 1], + [0xa80b, 0], + [0xa824, 1], + [0xa826, 0], + [0xa82b, 1], + [0xa82c, 0], + [0xa8c3, 1], + [0xa8c5, 0], + [0xa8df, 1], + [0xa8f1, 0], + [0xa8fe, 1], + [0xa8ff, 0], + [0xa925, 1], + [0xa92d, 0], + [0xa946, 1], + [0xa951, 0], + [0xa95f, 1], + [0xa97c, 2], + [0xa97f, 1], + [0xa982, 0], + [0xa9b2, 1], + [0xa9b3, 0], + [0xa9b5, 1], + [0xa9b9, 0], + [0xa9bb, 1], + [0xa9bd, 0], + [0xa9e4, 1], + [0xa9e5, 0], + [0xaa28, 1], + [0xaa2e, 0], + [0xaa30, 1], + [0xaa32, 0], + [0xaa34, 1], + [0xaa36, 0], + [0xaa42, 1], + [0xaa43, 0], + [0xaa4b, 1], + [0xaa4c, 0], + [0xaa7b, 1], + [0xaa7c, 0], + [0xaaaf, 1], + [0xaab0, 0], + [0xaab1, 1], + [0xaab4, 0], + [0xaab6, 1], + [0xaab8, 0], + [0xaabd, 1], + [0xaabf, 0], + [0xaac0, 1], + [0xaac1, 0], + [0xaaeb, 1], + [0xaaed, 0], + [0xaaf5, 1], + [0xaaf6, 0], + [0xabe4, 1], + [0xabe5, 0], + [0xabe7, 1], + [0xabe8, 0], + [0xabec, 1], + [0xabed, 0], + [0xabff, 1], + [0xd7a3, 2], + [0xd7af, 1], + [0xd7c6, 0], + [0xd7ca, 1], + [0xd7fb, 0], + [0xdfff, 1], + [0xf8ff, -1], + [0xfaff, 2], + [0xfb1d, 1], + [0xfb1e, 0], + [0xfdff, 1], + [0xfe0f, 0], + [0xfe19, 2], + [0xfe1f, 1], + [0xfe2f, 0], + [0xfe52, 2], + [0xfe53, 1], + [0xfe66, 2], + [0xfe67, 1], + [0xfe6b, 2], + [0xff00, 1], + [0xff60, 2], + [0xffdf, 1], + [0xffe6, 2], + [0xfffc, 1], + [0xfffd, -1], + [0x101fc, 1], + [0x101fd, 0], + [0x102df, 1], + [0x102e0, 0], + [0x10375, 1], + [0x1037a, 0], + [0x10a00, 1], + [0x10a03, 0], + [0x10a04, 1], + [0x10a06, 0], + [0x10a0b, 1], + [0x10a0f, 0], + [0x10a37, 1], + [0x10a3a, 0], + [0x10a3e, 1], + [0x10a3f, 0], + [0x10ae4, 1], + [0x10ae6, 0], + [0x10d23, 1], + [0x10d27, 0], + [0x10d68, 1], + [0x10d6d, 0], + [0x10eaa, 1], + [0x10eac, 0], + [0x10efb, 1], + [0x10eff, 0], + [0x10f45, 1], + [0x10f50, 0], + [0x10f81, 1], + [0x10f85, 0], + [0x11000, 1], + [0x11001, 0], + [0x11037, 1], + [0x11046, 0], + [0x1106f, 1], + [0x11070, 0], + [0x11072, 1], + [0x11074, 0], + [0x1107e, 1], + [0x11081, 0], + [0x110b2, 1], + [0x110b6, 0], + [0x110b8, 1], + [0x110ba, 0], + [0x110c1, 1], + [0x110c2, 0], + [0x110ff, 1], + [0x11102, 0], + [0x11126, 1], + [0x1112b, 0], + [0x1112c, 1], + [0x11134, 0], + [0x11172, 1], + [0x11173, 0], + [0x1117f, 1], + [0x11181, 0], + [0x111b5, 1], + [0x111be, 0], + [0x111c8, 1], + [0x111cc, 0], + [0x111ce, 1], + [0x111cf, 0], + [0x1122e, 1], + [0x11231, 0], + [0x11233, 1], + [0x11234, 0], + [0x11235, 1], + [0x11237, 0], + [0x1123d, 1], + [0x1123e, 0], + [0x11240, 1], + [0x11241, 0], + [0x112de, 1], + [0x112df, 0], + [0x112e2, 1], + [0x112ea, 0], + [0x112ff, 1], + [0x11301, 0], + [0x1133a, 1], + [0x1133c, 0], + [0x1133f, 1], + [0x11340, 0], + [0x11365, 1], + [0x1136c, 0], + [0x1136f, 1], + [0x11374, 0], + [0x113ba, 1], + [0x113c0, 0], + [0x113cd, 1], + [0x113ce, 0], + [0x113cf, 1], + [0x113d0, 0], + [0x113d1, 1], + [0x113d2, 0], + [0x113e0, 1], + [0x113e2, 0], + [0x11437, 1], + [0x1143f, 0], + [0x11441, 1], + [0x11444, 0], + [0x11445, 1], + [0x11446, 0], + [0x1145d, 1], + [0x1145e, 0], + [0x114b2, 1], + [0x114b8, 0], + [0x114b9, 1], + [0x114ba, 0], + [0x114be, 1], + [0x114c0, 0], + [0x114c1, 1], + [0x114c3, 0], + [0x115b1, 1], + [0x115b5, 0], + [0x115bb, 1], + [0x115bd, 0], + [0x115be, 1], + [0x115c0, 0], + [0x115db, 1], + [0x115dd, 0], + [0x11632, 1], + [0x1163a, 0], + [0x1163c, 1], + [0x1163d, 0], + [0x1163e, 1], + [0x11640, 0], + [0x116aa, 1], + [0x116ab, 0], + [0x116ac, 1], + [0x116ad, 0], + [0x116af, 1], + [0x116b5, 0], + [0x116b6, 1], + [0x116b7, 0], + [0x1171c, 1], + [0x1171d, 0], + [0x1171e, 1], + [0x1171f, 0], + [0x11721, 1], + [0x11725, 0], + [0x11726, 1], + [0x1172b, 0], + [0x1182e, 1], + [0x11837, 0], + [0x11838, 1], + [0x1183a, 0], + [0x1193a, 1], + [0x1193c, 0], + [0x1193d, 1], + [0x1193e, 0], + [0x11942, 1], + [0x11943, 0], + [0x119d3, 1], + [0x119d7, 0], + [0x119d9, 1], + [0x119db, 0], + [0x119df, 1], + [0x119e0, 0], + [0x11a00, 1], + [0x11a0a, 0], + [0x11a32, 1], + [0x11a38, 0], + [0x11a3a, 1], + [0x11a3e, 0], + [0x11a46, 1], + [0x11a47, 0], + [0x11a50, 1], + [0x11a56, 0], + [0x11a58, 1], + [0x11a5b, 0], + [0x11a89, 1], + [0x11a96, 0], + [0x11a97, 1], + [0x11a99, 0], + [0x11c2f, 1], + [0x11c36, 0], + [0x11c37, 1], + [0x11c3d, 0], + [0x11c3e, 1], + [0x11c3f, 0], + [0x11c91, 1], + [0x11ca7, 0], + [0x11ca9, 1], + [0x11cb0, 0], + [0x11cb1, 1], + [0x11cb3, 0], + [0x11cb4, 1], + [0x11cb6, 0], + [0x11d30, 1], + [0x11d36, 0], + [0x11d39, 1], + [0x11d3a, 0], + [0x11d3b, 1], + [0x11d3d, 0], + [0x11d3e, 1], + [0x11d45, 0], + [0x11d46, 1], + [0x11d47, 0], + [0x11d8f, 1], + [0x11d91, 0], + [0x11d94, 1], + [0x11d95, 0], + [0x11d96, 1], + [0x11d97, 0], + [0x11ef2, 1], + [0x11ef4, 0], + [0x11eff, 1], + [0x11f01, 0], + [0x11f35, 1], + [0x11f3a, 0], + [0x11f3f, 1], + [0x11f40, 0], + [0x11f41, 1], + [0x11f42, 0], + [0x11f59, 1], + [0x11f5a, 0], + [0x1343f, 1], + [0x13440, 0], + [0x13446, 1], + [0x13455, 0], + [0x1611d, 1], + [0x16129, 0], + [0x1612c, 1], + [0x1612f, 0], + [0x16aef, 1], + [0x16af4, 0], + [0x16b2f, 1], + [0x16b36, 0], + [0x16f4e, 1], + [0x16f4f, 0], + [0x16f8e, 1], + [0x16f92, 0], + [0x16fdf, 1], + [0x16fe3, 2], + [0x16fe4, 0], + [0x16fef, 1], + [0x16ff1, 2], + [0x16fff, 1], + [0x187f7, 2], + [0x187ff, 1], + [0x18cd5, 2], + [0x18cfe, 1], + [0x18d08, 2], + [0x1afef, 1], + [0x1aff3, 2], + [0x1aff4, 1], + [0x1affb, 2], + [0x1affc, 1], + [0x1affe, 2], + [0x1afff, 1], + [0x1b122, 2], + [0x1b131, 1], + [0x1b132, 2], + [0x1b14f, 1], + [0x1b152, 2], + [0x1b154, 1], + [0x1b155, 2], + [0x1b163, 1], + [0x1b167, 2], + [0x1b16f, 1], + [0x1b2fb, 2], + [0x1bc9c, 1], + [0x1bc9e, 0], + [0x1ceff, 1], + [0x1cf2d, 0], + [0x1cf2f, 1], + [0x1cf46, 0], + [0x1d166, 1], + [0x1d169, 0], + [0x1d17a, 1], + [0x1d182, 0], + [0x1d184, 1], + [0x1d18b, 0], + [0x1d1a9, 1], + [0x1d1ad, 0], + [0x1d241, 1], + [0x1d244, 0], + [0x1d2ff, 1], + [0x1d356, 2], + [0x1d35f, 1], + [0x1d376, 2], + [0x1d9ff, 1], + [0x1da36, 0], + [0x1da3a, 1], + [0x1da6c, 0], + [0x1da74, 1], + [0x1da75, 0], + [0x1da83, 1], + [0x1da84, 0], + [0x1da9a, 1], + [0x1da9f, 0], + [0x1daa0, 1], + [0x1daaf, 0], + [0x1dfff, 1], + [0x1e006, 0], + [0x1e007, 1], + [0x1e018, 0], + [0x1e01a, 1], + [0x1e021, 0], + [0x1e022, 1], + [0x1e024, 0], + [0x1e025, 1], + [0x1e02a, 0], + [0x1e08e, 1], + [0x1e08f, 0], + [0x1e12f, 1], + [0x1e136, 0], + [0x1e2ad, 1], + [0x1e2ae, 0], + [0x1e2eb, 1], + [0x1e2ef, 0], + [0x1e4eb, 1], + [0x1e4ef, 0], + [0x1e5ed, 1], + [0x1e5ef, 0], + [0x1e8cf, 1], + [0x1e8d6, 0], + [0x1e943, 1], + [0x1e94a, 0], + [0x1f003, 1], + [0x1f004, 2], + [0x1f0ce, 1], + [0x1f0cf, 2], + [0x1f0ff, 1], + [0x1f10a, -1], + [0x1f10f, 1], + [0x1f12d, -1], + [0x1f12f, 1], + [0x1f169, -1], + [0x1f16f, 1], + [0x1f18d, -1], + [0x1f18e, 2], + [0x1f190, -1], + [0x1f19a, 2], + [0x1f1ac, -1], + [0x1f1ff, 1], + [0x1f202, 2], + [0x1f20f, 1], + [0x1f23b, 2], + [0x1f23f, 1], + [0x1f248, 2], + [0x1f24f, 1], + [0x1f251, 2], + [0x1f25f, 1], + [0x1f265, 2], + [0x1f2ff, 1], + [0x1f320, 2], + [0x1f32c, 1], + [0x1f335, 2], + [0x1f336, 1], + [0x1f37c, 2], + [0x1f37d, 1], + [0x1f393, 2], + [0x1f39f, 1], + [0x1f3ca, 2], + [0x1f3ce, 1], + [0x1f3d3, 2], + [0x1f3df, 1], + [0x1f3f0, 2], + [0x1f3f3, 1], + [0x1f3f4, 2], + [0x1f3f7, 1], + [0x1f43e, 2], + [0x1f43f, 1], + [0x1f440, 2], + [0x1f441, 1], + [0x1f4fc, 2], + [0x1f4fe, 1], + [0x1f53d, 2], + [0x1f54a, 1], + [0x1f54e, 2], + [0x1f54f, 1], + [0x1f567, 2], + [0x1f579, 1], + [0x1f57a, 2], + [0x1f594, 1], + [0x1f596, 2], + [0x1f5a3, 1], + [0x1f5a4, 2], + [0x1f5fa, 1], + [0x1f64f, 2], + [0x1f67f, 1], + [0x1f6c5, 2], + [0x1f6cb, 1], + [0x1f6cc, 2], + [0x1f6cf, 1], + [0x1f6d2, 2], + [0x1f6d4, 1], + [0x1f6d7, 2], + [0x1f6db, 1], + [0x1f6df, 2], + [0x1f6ea, 1], + [0x1f6ec, 2], + [0x1f6f3, 1], + [0x1f6fc, 2], + [0x1f7df, 1], + [0x1f7eb, 2], + [0x1f7ef, 1], + [0x1f7f0, 2], + [0x1f90b, 1], + [0x1f93a, 2], + [0x1f93b, 1], + [0x1f945, 2], + [0x1f946, 1], + [0x1f9ff, 2], + [0x1fa6f, 1], + [0x1fa7c, 2], + [0x1fa7f, 1], + [0x1fa89, 2], + [0x1fa8e, 1], + [0x1fac6, 2], + [0x1facd, 1], + [0x1fadc, 2], + [0x1fade, 1], + [0x1fae9, 2], + [0x1faef, 1], + [0x1faf8, 2], + [0x1ffff, 1], + [0x2fffd, 2], + [0x2ffff, 1], + [0x3fffd, 2], + [0xe00ff, 1], + [0xe01ef, 0], + [0xeffff, 1], + [0xffffd, -1], + [0xfffff, 1], + [0x10fffd, -1], + [0x7fffffff, 1] + ].transpose.map(&:freeze) +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/version.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/version.rb new file mode 100644 index 000000000..227d2ea4c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/lib/reline/version.rb @@ -0,0 +1,3 @@ +module Reline + VERSION = '0.6.2' +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/license_of_rb-readline b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/license_of_rb-readline new file mode 100644 index 000000000..fe5606c0a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/reline-0.6.2/license_of_rb-readline @@ -0,0 +1,25 @@ +Copyright (c) 2009, Park Heesob +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of Park Heesob nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/LICENSE.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/LICENSE.txt new file mode 100644 index 000000000..a009caefe --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/NEWS.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/NEWS.md new file mode 100644 index 000000000..146271212 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/NEWS.md @@ -0,0 +1,843 @@ +# News + +## 3.4.4 - 2025-09-10 {#version-3-4-4} + +### Improvement + + * Accept `REXML::Document.new("")` for backward compatibility + * GH-296 + * GH-295 + * Patch by NAITOH Jun + * Reported by Joe Rafaniello + +### Thanks + + * NAITOH Jun + + * Joe Rafaniello + +## 3.4.3 - 2025-09-07 {#version-3-4-3} + +### Improvement + + * Reject no root element XML as an invalid XML + * GH-289 + * GH-291 + * Patch by NAITOH Jun + * Reported by Sutou Kouhei + +### Fixes + + * Fixed an issue with `IOSource#read_until` when reaching the end of a file + * GH-287 + * GH-288 + * Patch by NAITOH Jun + * Reported by Jason Thomas + +### Thanks + + * NAITOH Jun + + * Sutou Kouhei + + * Jason Thomas + +## 3.4.2 - 2025-08-26 {#version-3-4-2} + +### Improvement + + * Improved performance. + * GH-244 + * GH-245 + * GH-246 + * GH-249 + * GH-256 + * Patch by NAITOH Jun + + * Raise appropriate exception when failing to match start tag in DOCTYPE + * GH-247 + * Patch by NAITOH Jun + + * Deprecate accepting array as an element in XPath.match, first and each + * GH-252 + * Patch by tomoya ishida + + * Don't call needless encoding_updated + * GH-259 + * Patch by Sutou Kouhei + + * Reuse XPath::match + * GH-263 + * Patch by pboling + + * Cache redundant calls for doctype + * GH-264 + * Patch by pboling + + * Use Safe Navigation (&.) from Ruby 2.3 + * GH-265 + * Patch by pboling + + * Remove redundant return statements + * GH-266 + * Patch by pboling + + * Added XML declaration check & Source#skip_spaces method + * GH-282 + * Patch by NAITOH Jun + * Reported by Sofi Aberegg + +### Fixes + + * Fix docs typo + * GH-248 + * Patch by James Coleman + + * Fix reverse sort in xpath_parser + * GH-251 + * Patch by tomoya ishida + + * Fix duplicate responses in XPath following, following-sibling, preceding, preceding-sibling + * GH-255 + * Patch by NAITOH Jun + + * Fix wrong Encoding resolution + * GH-258 + * Patch by Sutou Kouhei + + * Handle nil when parsing fragment + * GH-267 + * GH-268 + * Patch by pboling + + * [Documentation] Use # to reference instance methods + * GH-269 + * GH-270 + * Patch by pboling + + * Fix & Deprecate REXML::Text#text_indent + * GH-273 + * GH-275 + * Patch by pboling + + * remove bundler from dev deps + * GH-276 + * GH-277 + * Patch by pboling + + * remove ostruct from dev deps + * GH-280 + * GH-281 + * Patch by pboling + +### Thanks + + * NAITOH Jun + + * tomoya ishida + + * James Coleman + + * pboling + + * Sutou Kouhei + + * Sofi Aberegg + +## 3.4.1 - 2025-02-16 {#version-3-4-1} + +### Improvement + + * Improved performance. + * GH-226 + * GH-227 + * GH-237 + * Patch by NAITOH Jun + +### Fixes + + * Fix serialization of ATTLIST is incorrect + * GH-233 + * GH-234 + * Patch by OlofKalufs + * Reported by OlofKalufs + +### Thanks + + * NAITOH Jun + + * OlofKalufs + +## 3.4.0 - 2024-12-15 {#version-3-4-0} + +### Improvement + + * Improved performance. + * GH-216 + * Patch by NAITOH Jun + + * JRuby: Improved parse performance. + * GH-219 + * Patch by João Duarte + + * Added support for reusing pull parser. + * GH-214 + * GH-220 + * Patch by Dmitry Pogrebnoy + + * Improved error handling when source is `IO`. + * GH-221 + * Patch by NAITOH Jun + +### Thanks + + * NAITOH Jun + + * João Duarte + + * Dmitry Pogrebnoy + +## 3.3.9 - 2024-10-24 {#version-3-3-9} + +### Improvements + + * Improved performance. + * GH-210 + * Patch by NAITOH Jun. + +### Fixes + + * Fixed a parse bug for text only invalid XML. + * GH-215 + * Patch by NAITOH Jun. + + * Fixed a parse bug that `�x...;` is accepted as a character + reference. + +### Thanks + + * NAITOH Jun + +## 3.3.8 - 2024-09-29 {#version-3-3-8} + +### Improvements + + * SAX2: Improve parse performance. + * GH-207 + * Patch by NAITOH Jun. + +### Fixes + + * Fixed a bug that unexpected attribute namespace conflict error for + the predefined "xml" namespace is reported. + * GH-208 + * Patch by KITAITI Makoto + +### Thanks + + * NAITOH Jun + + * KITAITI Makoto + +## 3.3.7 - 2024-09-04 {#version-3-3-7} + +### Improvements + + * Added local entity expansion limit methods + * GH-192 + * GH-202 + * Reported by takuya kodama. + * Patch by NAITOH Jun. + + * Removed explicit strscan dependency + * GH-204 + * Patch by Bo Anderson. + +### Thanks + + * takuya kodama + + * NAITOH Jun + + * Bo Anderson + +## 3.3.6 - 2024-08-22 {#version-3-3-6} + +### Improvements + + * Removed duplicated entity expansions for performance. + * GH-194 + * Patch by Viktor Ivarsson. + + * Improved namespace conflicted attribute check performance. It was + too slow for deep elements. + * Reported by l33thaxor. + +### Fixes + + * Fixed a bug that default entity expansions are counted for + security check. Default entity expansions should not be counted + because they don't have a security risk. + * GH-198 + * GH-199 + * Patch Viktor Ivarsson + + * Fixed a parser bug that parameter entity references in internal + subsets are expanded. It's not allowed in the XML specification. + * GH-191 + * Patch by NAITOH Jun. + + * Fixed a stream parser bug that user-defined entity references in + text aren't expanded. + * GH-200 + * Patch by NAITOH Jun. + +### Thanks + + * Viktor Ivarsson + + * NAITOH Jun + + * l33thaxor + +## 3.3.5 - 2024-08-12 {#version-3-3-5} + +### Fixes + + * Fixed a bug that `REXML::Security.entity_expansion_text_limit` + check has wrong text size calculation in SAX and pull parsers. + * GH-193 + * GH-195 + * Reported by Viktor Ivarsson. + * Patch by NAITOH Jun. + +### Thanks + + * Viktor Ivarsson + + * NAITOH Jun + +## 3.3.4 - 2024-08-01 {#version-3-3-4} + +### Fixes + + * Fixed a bug that `REXML::Security` isn't defined when + `REXML::Parsers::StreamParser` is used and + `rexml/parsers/streamparser` is only required. + * GH-189 + * Patch by takuya kodama. + +### Thanks + + * takuya kodama + +## 3.3.3 - 2024-08-01 {#version-3-3-3} + +### Improvements + + * Added support for detecting invalid XML that has unsupported + content before root element + * GH-184 + * Patch by NAITOH Jun. + + * Added support for `REXML::Security.entity_expansion_limit=` and + `REXML::Security.entity_expansion_text_limit=` in SAX2 and pull + parsers + * GH-187 + * Patch by NAITOH Jun. + + * Added more tests for invalid XMLs. + * GH-183 + * Patch by Watson. + + * Added more performance tests. + * Patch by Watson. + + * Improved parse performance. + * GH-186 + * Patch by tomoya ishida. + +### Thanks + + * NAITOH Jun + + * Watson + + * tomoya ishida + +## 3.3.2 - 2024-07-16 {#version-3-3-2} + +### Improvements + + * Improved parse performance. + * GH-160 + * Patch by NAITOH Jun. + + * Improved parse performance. + * GH-169 + * GH-170 + * GH-171 + * GH-172 + * GH-173 + * GH-174 + * GH-175 + * GH-176 + * GH-177 + * Patch by Watson. + + * Added support for raising a parse exception when an XML has extra + content after the root element. + * GH-161 + * Patch by NAITOH Jun. + + * Added support for raising a parse exception when an XML + declaration exists in wrong position. + * GH-162 + * Patch by NAITOH Jun. + + * Removed needless a space after XML declaration in pretty print mode. + * GH-164 + * Patch by NAITOH Jun. + + * Stopped to emit `:text` event after the root element. + * GH-167 + * Patch by NAITOH Jun. + +### Fixes + + * Fixed a bug that SAX2 parser doesn't expand predefined entities for + `characters` callback. + * GH-168 + * Patch by NAITOH Jun. + +### Thanks + + * NAITOH Jun + + * Watson + +## 3.3.1 - 2024-06-25 {#version-3-3-1} + +### Improvements + + * Added support for detecting malformed top-level comments. + * GH-145 + * Patch by Hiroya Fujinami. + + * Improved `REXML::Element#attribute` performance. + * GH-146 + * Patch by Hiroya Fujinami. + + * Added support for detecting malformed `` comments. + * GH-147 + * Patch by Hiroya Fujinami. + + * Added support for detecting unclosed `DOCTYPE`. + * GH-152 + * Patch by Hiroya Fujinami. + + * Added `changlog_uri` metadata to gemspec. + * GH-156 + * Patch by fynsta. + + * Improved parse performance. + * GH-157 + * GH-158 + * Patch by NAITOH Jun. + +### Fixes + + * Fixed a bug that large XML can't be parsed. + * GH-154 + * Patch by NAITOH Jun. + + * Fixed a bug that private constants are visible. + * GH-155 + * Patch by NAITOH Jun. + +### Thanks + + * Hiroya Fujinami + + * NAITOH Jun + + * fynsta + +## 3.3.0 - 2024-06-11 {#version-3-3-0} + +### Improvements + + * Added support for strscan 0.7.0 installed with Ruby 2.6. + * GH-142 + * Reported by Fernando Trigoso. + +### Thanks + + * Fernando Trigoso + +## 3.2.9 - 2024-06-09 {#version-3-2-9} + +### Improvements + + * Added support for old strscan. + * GH-132 + * Reported by Adam. + + * Improved attribute value parse performance. + * GH-135 + * Patch by NAITOH Jun. + + * Improved `REXML::Node#each_recursive` performance. + * GH-134 + * GH-139 + * Patch by Hiroya Fujinami. + + * Improved text parse performance. + * Reported by mprogrammer. + +### Thanks + + * Adam + * NAITOH Jun + * Hiroya Fujinami + * mprogrammer + +## 3.2.8 - 2024-05-16 {#version-3-2-8} + +### Fixes + + * Suppressed a warning + +## 3.2.7 - 2024-05-16 {#version-3-2-7} + +### Improvements + + * Improve parse performance by using `StringScanner`. + + * GH-106 + * GH-107 + * GH-108 + * GH-109 + * GH-112 + * GH-113 + * GH-114 + * GH-115 + * GH-116 + * GH-117 + * GH-118 + * GH-119 + * GH-121 + + * Patch by NAITOH Jun. + + * Improved parse performance when an attribute has many `>`s. + + * GH-126 + +### Fixes + + * XPath: Fixed a bug of `normalize_space(array)`. + + * GH-110 + * GH-111 + + * Patch by flatisland. + + * XPath: Fixed a bug that wrong position is used with nested path. + + * GH-110 + * GH-122 + + * Reported by jcavalieri. + * Patch by NAITOH Jun. + + * Fixed a bug that an exception message can't be generated for + invalid encoding XML. + + * GH-29 + * GH-123 + + * Reported by DuKewu. + * Patch by NAITOH Jun. + +### Thanks + + * NAITOH Jun + * flatisland + * jcavalieri + * DuKewu + +## 3.2.6 - 2023-07-27 {#version-3-2-6} + +### Improvements + + * Required Ruby 2.5 or later explicitly. + [GH-69][gh-69] + [Patch by Ivo Anjo] + + * Added documentation for maintenance cycle. + [GH-71][gh-71] + [Patch by Ivo Anjo] + + * Added tutorial. + [GH-77][gh-77] + [GH-78][gh-78] + [Patch by Burdette Lamar] + + * Improved performance and memory usage. + [GH-94][gh-94] + [Patch by fatkodima] + + * `REXML::Parsers::XPathParser#abbreviate`: Added support for + function arguments. + [GH-95][gh-95] + [Reported by pulver] + + * `REXML::Parsers::XPathParser#abbreviate`: Added support for string + literal that contains double-quote. + [GH-96][gh-96] + [Patch by pulver] + + * `REXML::Parsers::XPathParser#abbreviate`: Added missing `/` to + `:descendant_or_self/:self/:parent`. + [GH-97][gh-97] + [Reported by pulver] + + * `REXML::Parsers::XPathParser#abbreviate`: Added support for more patterns. + [GH-97][gh-97] + [Reported by pulver] + +### Fixes + + * Fixed a typo in NEWS. + [GH-72][gh-72] + [Patch by Spencer Goodman] + + * Fixed a typo in NEWS. + [GH-75][gh-75] + [Patch by Andrew Bromwich] + + * Fixed documents. + [GH-87][gh-87] + [Patch by Alexander Ilyin] + + * Fixed a bug that `Attriute` convert `'` and `'` even when + `attribute_quote: :quote` is used. + [GH-92][gh-92] + [Reported by Edouard Brière] + + * Fixed links in tutorial. + [GH-99][gh-99] + [Patch by gemmaro] + + +### Thanks + + * Ivo Anjo + + * Spencer Goodman + + * Andrew Bromwich + + * Burdette Lamar + + * Alexander Ilyin + + * Edouard Brière + + * fatkodima + + * pulver + + * gemmaro + +[gh-69]:https://github.com/ruby/rexml/issues/69 +[gh-71]:https://github.com/ruby/rexml/issues/71 +[gh-72]:https://github.com/ruby/rexml/issues/72 +[gh-75]:https://github.com/ruby/rexml/issues/75 +[gh-77]:https://github.com/ruby/rexml/issues/77 +[gh-87]:https://github.com/ruby/rexml/issues/87 +[gh-92]:https://github.com/ruby/rexml/issues/92 +[gh-94]:https://github.com/ruby/rexml/issues/94 +[gh-95]:https://github.com/ruby/rexml/issues/95 +[gh-96]:https://github.com/ruby/rexml/issues/96 +[gh-97]:https://github.com/ruby/rexml/issues/97 +[gh-98]:https://github.com/ruby/rexml/issues/98 +[gh-99]:https://github.com/ruby/rexml/issues/99 + +## 3.2.5 - 2021-04-05 {#version-3-2-5} + +### Improvements + + * Add more validations to XPath parser. + + * `require "rexml/document"` by default. + [GitHub#36][Patch by Koichi ITO] + + * Don't add `#dclone` method to core classes globally. + [GitHub#37][Patch by Akira Matsuda] + + * Add more documentations. + [Patch by Burdette Lamar] + + * Added `REXML::Elements#parent`. + [GitHub#52][Patch by Burdette Lamar] + +### Fixes + + * Fixed a bug that `REXML::DocType#clone` doesn't copy external ID + information. + + * Fixed round-trip vulnerability bugs. + See also: https://www.ruby-lang.org/en/news/2021/04/05/xml-round-trip-vulnerability-in-rexml-cve-2021-28965/ + [HackerOne#1104077][CVE-2021-28965][Reported by Juho Nurminen] + +### Thanks + + * Koichi ITO + + * Akira Matsuda + + * Burdette Lamar + + * Juho Nurminen + +## 3.2.4 - 2020-01-31 {#version-3-2-4} + +### Improvements + + * Don't use `taint` with Ruby 2.7 or later. + [GitHub#21][Patch by Jeremy Evans] + +### Fixes + + * Fixed a `elsif` typo. + [GitHub#22][Patch by Nobuyoshi Nakada] + +### Thanks + + * Jeremy Evans + + * Nobuyoshi Nakada + +## 3.2.3 - 2019-10-12 {#version-3-2-3} + +### Fixes + + * Fixed a bug that `REXML::XMLDecl#close` doesn't copy `@writethis`. + [GitHub#20][Patch by hirura] + +### Thanks + + * hirura + +## 3.2.2 - 2019-06-03 {#version-3-2-2} + +### Fixes + + * xpath: Fixed a bug for equality and relational expressions. + [GitHub#17][Reported by Mirko Budszuhn] + + * xpath: Fixed `boolean()` implementation. + + * xpath: Fixed `local_name()` with nonexistent node. + + * xpath: Fixed `number()` implementation with node set. + [GitHub#18][Reported by Mirko Budszuhn] + +### Thanks + + * Mirko Budszuhn + +## 3.2.1 - 2019-05-04 {#version-3-2-1} + +### Improvements + + * Improved error message. + [GitHub#12][Patch by FUJI Goro] + + * Improved error message. + [GitHub#16][Patch by ujihisa] + + * Improved documentation markup. + [GitHub#14][Patch by Alyssa Ross] + +### Fixes + + * Fixed a bug that `nil` variable value raises an unexpected exception. + [GitHub#13][Patch by Alyssa Ross] + +### Thanks + + * FUJI Goro + + * Alyssa Ross + + * ujihisa + +## 3.2.0 - 2019-01-01 {#version-3-2-0} + +### Fixes + + * Fixed a bug that no namespace attribute isn't matched with prefix. + + [ruby-list:50731][Reported by Yasuhiro KIMURA] + + * Fixed a bug that the default namespace is applied to attribute names. + + NOTE: It's a backward incompatible change. If your program has any + problem with this change, please report it. We may revert this fix. + + * `REXML::Attribute#prefix` returns `""` for no namespace attribute. + + * `REXML::Attribute#namespace` returns `""` for no namespace attribute. + +### Thanks + + * Yasuhiro KIMURA + +## 3.1.9 - 2018-12-20 {#version-3-1-9} + +### Improvements + + * Improved backward compatibility. + + Restored `REXML::Parsers::BaseParser::UNQME_STR` because it's used + by kramdown. + +## 3.1.8 - 2018-12-20 {#version-3-1-8} + +### Improvements + + * Added support for customizing quote character in prologue. + [GitHub#8][Bug #9367][Reported by Takashi Oguma] + + * You can use `"` as quote character by specifying `:quote` to + `REXML::Document#context[:prologue_quote]`. + + * You can use `'` as quote character by specifying `:apostrophe` + to `REXML::Document#context[:prologue_quote]`. + + * Added processing instruction target check. The target must not nil. + [GitHub#7][Reported by Ariel Zelivansky] + + * Added name check for element and attribute. + [GitHub#7][Reported by Ariel Zelivansky] + + * Stopped to use `Exception`. + [GitHub#9][Patch by Jean Boussier] + +### Fixes + + * Fixed a bug that `REXML::Text#clone` escapes value twice. + [ruby-dev:50626][Bug #15058][Reported by Ryosuke Nanba] + +### Thanks + + * Takashi Oguma + + * Ariel Zelivansky + + * Jean Boussier + + * Ryosuke Nanba diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/README.md new file mode 100644 index 000000000..e8ab50821 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/README.md @@ -0,0 +1,57 @@ +# REXML + +REXML was inspired by the Electric XML library for Java, which features an easy-to-use API, small size, and speed. Hopefully, REXML, designed with the same philosophy, has these same features. I've tried to keep the API as intuitive as possible, and have followed the Ruby methodology for method naming and code flow, rather than mirroring the Java API. + +REXML supports both tree and stream document parsing. Stream parsing is faster (about 1.5 times as fast). However, with stream parsing, you don't get access to features such as XPath. + +## API + +See the [API documentation](https://ruby.github.io/rexml/). + +## Usage + +We'll start with parsing an XML document + +```ruby +require "rexml/document" +file = File.new( "mydoc.xml" ) +doc = REXML::Document.new file +``` + +Line 3 creates a new document and parses the supplied file. You can also do the following + +```ruby +require "rexml/document" +include REXML # so that we don't have to prefix everything with REXML::... +string = < + Text, text, text + +EOF +doc = Document.new string +``` + +So parsing a string is just as easy as parsing a file. + +## Support + +REXML support follows the same maintenance cycle as Ruby releases, as shown on . + +If you are running on an end-of-life Ruby, do not expect modern REXML releases to be compatible with it; in fact, it's recommended that you DO NOT use this gem, and instead use the REXML version that came bundled with your end-of-life Ruby version. + +The `required_ruby_version` on the gemspec is kept updated on a [best-effort basis](https://github.com/ruby/rexml/pull/70) by the community. +Up to version 3.2.5, this information was not set. That version [is known broken with at least Ruby < 2.3](https://github.com/ruby/rexml/issues/69). + +## Development + +After checking out the repo, run `rake test` to run the tests. + +To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/rexml. + +## License + +The gem is available as open source under the terms of the [BSD-2-Clause](LICENSE.txt). diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml.rb new file mode 100644 index 000000000..eee246e43 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative "rexml/document" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/attlistdecl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/attlistdecl.rb new file mode 100644 index 000000000..44a91d66d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/attlistdecl.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: false +#vim:ts=2 sw=2 noexpandtab: +require_relative 'child' +require_relative 'source' + +module REXML + # This class needs: + # * Documentation + # * Work! Not all types of attlists are intelligently parsed, so we just + # spew back out what we get in. This works, but it would be better if + # we formatted the output ourselves. + # + # AttlistDecls provide *just* enough support to allow namespace + # declarations. If you need some sort of generalized support, or have an + # interesting idea about how to map the hideous, terrible design of DTD + # AttlistDecls onto an intuitive Ruby interface, let me know. I'm desperate + # for anything to make DTDs more palateable. + class AttlistDecl < Child + include Enumerable + + # What is this? Got me. + attr_reader :element_name + + # Create an AttlistDecl, pulling the information from a Source. Notice + # that this isn't very convenient; to create an AttlistDecl, you basically + # have to format it yourself, and then have the initializer parse it. + # Sorry, but for the foreseeable future, DTD support in REXML is pretty + # weak on convenience. Have I mentioned how much I hate DTDs? + def initialize(source) + super() + if (source.kind_of? Array) + @element_name, @pairs, @contents = *source + end + end + + # Access the attlist attribute/value pairs. + # value = attlist_decl[ attribute_name ] + def [](key) + @pairs[key] + end + + # Whether an attlist declaration includes the given attribute definition + # if attlist_decl.include? "xmlns:foobar" + def include?(key) + @pairs.keys.include? key + end + + # Iterate over the key/value pairs: + # attlist_decl.each { |attribute_name, attribute_value| ... } + def each(&block) + @pairs.each(&block) + end + + # Write out exactly what we got in. + def write out, indent=-1 + out << @contents + end + + def node_type + :attlistdecl + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/attribute.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/attribute.rb new file mode 100644 index 000000000..c56732497 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/attribute.rb @@ -0,0 +1,210 @@ +# frozen_string_literal: true +require_relative "namespace" +require_relative 'text' + +module REXML + # Defines an Element Attribute; IE, a attribute=value pair, as in: + # . Attributes can be in their own + # namespaces. General users of REXML will not interact with the + # Attribute class much. + class Attribute + include Node + include Namespace + + # The element to which this attribute belongs + attr_reader :element + PATTERN = /\s*(#{NAME_STR})\s*=\s*(["'])(.*?)\2/um + + NEEDS_A_SECOND_CHECK = /(<|&((#{Entity::NAME});|(#0*((?:\d+)|(?:x[a-fA-F0-9]+)));)?)/um + + # Constructor. + # FIXME: The parser doesn't catch illegal characters in attributes + # + # first:: + # Either: an Attribute, which this new attribute will become a + # clone of; or a String, which is the name of this attribute + # second:: + # If +first+ is an Attribute, then this may be an Element, or nil. + # If nil, then the Element parent of this attribute is the parent + # of the +first+ Attribute. If the first argument is a String, + # then this must also be a String, and is the content of the attribute. + # If this is the content, it must be fully normalized (contain no + # illegal characters). + # parent:: + # Ignored unless +first+ is a String; otherwise, may be the Element + # parent of this attribute, or nil. + # + # + # Attribute.new( attribute_to_clone ) + # Attribute.new( attribute_to_clone, parent_element ) + # Attribute.new( "attr", "attr_value" ) + # Attribute.new( "attr", "attr_value", parent_element ) + def initialize( first, second=nil, parent=nil ) + @normalized = @unnormalized = @element = nil + if first.kind_of? Attribute + self.name = first.expanded_name + @unnormalized = first.value + if second.kind_of? Element + @element = second + else + @element = first.element + end + elsif first.kind_of? String + @element = parent + self.name = first + @normalized = second.to_s + else + raise "illegal argument #{first.class.name} to Attribute constructor" + end + end + + # Returns the namespace of the attribute. + # + # e = Element.new( "elns:myelement" ) + # e.add_attribute( "nsa:a", "aval" ) + # e.add_attribute( "b", "bval" ) + # e.attributes.get_attribute( "a" ).prefix # -> "nsa" + # e.attributes.get_attribute( "b" ).prefix # -> "" + # a = Attribute.new( "x", "y" ) + # a.prefix # -> "" + def prefix + super + end + + # Returns the namespace URL, if defined, or nil otherwise + # + # e = Element.new("el") + # e.add_namespace("ns", "http://url") + # e.add_attribute("ns:a", "b") + # e.add_attribute("nsx:a", "c") + # e.attribute("ns:a").namespace # => "http://url" + # e.attribute("nsx:a").namespace # => nil + # + # This method always returns "" for no namespace attribute. Because + # the default namespace doesn't apply to attribute names. + # + # From https://www.w3.org/TR/xml-names/#uniqAttrs + # + # > the default namespace does not apply to attribute names + # + # e = REXML::Element.new("el") + # e.add_namespace("", "http://example.com/") + # e.namespace # => "http://example.com/" + # e.add_attribute("a", "b") + # e.attribute("a").namespace # => "" + def namespace arg=nil + arg = prefix if arg.nil? + if arg == "" + "" + else + @element.namespace(arg) + end + end + + # Returns true if other is an Attribute and has the same name and value, + # false otherwise. + def ==( other ) + other.kind_of?(Attribute) and other.name==name and other.value==value + end + + # Creates (and returns) a hash from both the name and value + def hash + name.hash + value.hash + end + + # Returns this attribute out as XML source, expanding the name + # + # a = Attribute.new( "x", "y" ) + # a.to_string # -> "x='y'" + # b = Attribute.new( "ns:x", "y" ) + # b.to_string # -> "ns:x='y'" + def to_string + value = to_s + if @element and @element.context and @element.context[:attribute_quote] == :quote + value = value.gsub('"', '"') if value.include?('"') + %Q^#@expanded_name="#{value}"^ + else + value = value.gsub("'", ''') if value.include?("'") + "#@expanded_name='#{value}'" + end + end + + def doctype + @element&.document&.doctype + end + + # Returns the attribute value, with entities replaced + def to_s + return @normalized if @normalized + + @normalized = Text::normalize( @unnormalized, doctype ) + @normalized + end + + # Returns the UNNORMALIZED value of this attribute. That is, entities + # have been expanded to their values + def value + return @unnormalized if @unnormalized + + @unnormalized = Text::unnormalize(@normalized, doctype, + entity_expansion_text_limit: @element&.document&.entity_expansion_text_limit) + end + + # The normalized value of this attribute. That is, the attribute with + # entities intact. + def normalized=(new_normalized) + @normalized = new_normalized + @unnormalized = nil + end + + # Returns a copy of this attribute + def clone + Attribute.new self + end + + # Sets the element of which this object is an attribute. Normally, this + # is not directly called. + # + # Returns this attribute + def element=( element ) + @element = element + + if @normalized + Text.check( @normalized, NEEDS_A_SECOND_CHECK ) + end + + self + end + + # Removes this Attribute from the tree, and returns true if successful + # + # This method is usually not called directly. + def remove + @element.attributes.delete self.name unless @element.nil? + end + + # Writes this attribute (EG, puts 'key="value"' to the output) + def write( output, indent=-1 ) + output << to_string + end + + def node_type + :attribute + end + + def inspect + rv = +"" + write( rv ) + rv + end + + def xpath + @element.xpath + "/@#{self.expanded_name}" + end + + def document + @element&.document + end + end +end +#vim:ts=2 sw=2 noexpandtab: diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/cdata.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/cdata.rb new file mode 100644 index 000000000..264ad6426 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/cdata.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: false +require_relative "text" + +module REXML + class CData < Text + START = '' + ILLEGAL = /(\]\]>)/ + + # Constructor. CData is data between + # + # _Examples_ + # CData.new( source ) + # CData.new( "Here is some CDATA" ) + # CData.new( "Some unprocessed data", respect_whitespace_TF, parent_element ) + def initialize( first, whitespace=true, parent=nil ) + super( first, whitespace, parent, false, true, ILLEGAL ) + end + + # Make a copy of this object + # + # _Examples_ + # c = CData.new( "Some text" ) + # d = c.clone + # d.to_s # -> "Some text" + def clone + CData.new self + end + + # Returns the content of this CData object + # + # _Examples_ + # c = CData.new( "Some text" ) + # c.to_s # -> "Some text" + def to_s + @string + end + + def value + @string + end + + # == DEPRECATED + # See the rexml/formatters package + # + # Generates XML output of this object + # + # output:: + # Where to write the string. Defaults to $stdout + # indent:: + # The amount to indent this node by + # transitive:: + # Ignored + # ie_hack:: + # Ignored + # + # _Examples_ + # c = CData.new( " Some text " ) + # c.write( $stdout ) #-> + def write( output=$stdout, indent=-1, transitive=false, ie_hack=false ) + Kernel.warn( "#{self.class.name}#write is deprecated", uplevel: 1) + indent( output, indent ) + output << START + output << @string + output << STOP + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/child.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/child.rb new file mode 100644 index 000000000..2718040fd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/child.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: false +require_relative "node" + +module REXML + ## + # A Child object is something contained by a parent, and this class + # contains methods to support that. Most user code will not use this + # class directly. + class Child + include Node + attr_reader :parent # The Parent of this object + + # Constructor. Any inheritors of this class should call super to make + # sure this method is called. + # parent:: + # if supplied, the parent of this child will be set to the + # supplied value, and self will be added to the parent + def initialize( parent = nil ) + @parent = nil + # Declare @parent, but don't define it. The next line sets the + # parent. + parent.add( self ) if parent + end + + # Replaces this object with another object. Basically, calls + # Parent.replace_child + # + # Returns:: self + def replace_with( child ) + @parent.replace_child( self, child ) + self + end + + # Removes this child from the parent. + # + # Returns:: self + def remove + unless @parent.nil? + @parent.delete self + end + self + end + + # Sets the parent of this child to the supplied argument. + # + # other:: + # Must be a Parent object. If this object is the same object as the + # existing parent of this child, no action is taken. Otherwise, this + # child is removed from the current parent (if one exists), and is added + # to the new parent. + # Returns:: The parent added + def parent=( other ) + return @parent if @parent == other + @parent.delete self if defined? @parent and @parent + @parent = other + end + + alias :next_sibling :next_sibling_node + alias :previous_sibling :previous_sibling_node + + # Sets the next sibling of this child. This can be used to insert a child + # after some other child. + # a = Element.new("a") + # b = a.add_element("b") + # c = Element.new("c") + # b.next_sibling = c + # # => + def next_sibling=( other ) + parent.insert_after self, other + end + + # Sets the previous sibling of this child. This can be used to insert a + # child before some other child. + # a = Element.new("a") + # b = a.add_element("b") + # c = Element.new("c") + # b.previous_sibling = c + # # => + def previous_sibling=(other) + parent.insert_before self, other + end + + # Returns:: the document this child belongs to, or nil if this child + # belongs to no document + def document + parent&.document + end + + # This doesn't yet handle encodings + def bytes + document&.encoding + + to_s + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/comment.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/comment.rb new file mode 100644 index 000000000..e7e104d43 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/comment.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: false +require_relative "child" + +module REXML + ## + # Represents an XML comment; that is, text between \ + class Comment < Child + include Comparable + START = "" + + # The content text + + attr_accessor :string + + ## + # Constructor. The first argument can be one of three types: + # @param first If String, the contents of this comment are set to the + # argument. If Comment, the argument is duplicated. If + # Source, the argument is scanned for a comment. + # @param second If the first argument is a Source, this argument + # should be nil, not supplied, or a Parent to be set as the parent + # of this object + def initialize( first, second = nil ) + super(second) + if first.kind_of? String + @string = first + elsif first.kind_of? Comment + @string = first.string + end + end + + def clone + Comment.new self + end + + # == DEPRECATED + # See REXML::Formatters + # + # output:: + # Where to write the string + # indent:: + # An integer. If -1, no indenting will be used; otherwise, the + # indentation will be this number of spaces, and children will be + # indented an additional amount. + # transitive:: + # Ignored by this class. The contents of comments are never modified. + # ie_hack:: + # Needed for conformity to the child API, but not used by this class. + def write( output, indent=-1, transitive=false, ie_hack=false ) + Kernel.warn("#{self.class.name}#write is deprecated. See REXML::Formatters", uplevel: 1) + indent( output, indent ) + output << START + output << @string + output << STOP + end + + alias :to_s :string + + ## + # Compares this Comment to another; the contents of the comment are used + # in the comparison. + def <=>(other) + other.to_s <=> @string + end + + ## + # Compares this Comment to another; the contents of the comment are used + # in the comparison. + def ==( other ) + other.kind_of? Comment and + (other <=> self) == 0 + end + + def node_type + :comment + end + end +end +#vim:ts=2 sw=2 noexpandtab: diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/doctype.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/doctype.rb new file mode 100644 index 000000000..a9cf9f7ee --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/doctype.rb @@ -0,0 +1,306 @@ +# frozen_string_literal: false +require_relative "parent" +require_relative "parseexception" +require_relative "namespace" +require_relative 'entity' +require_relative 'attlistdecl' +require_relative 'xmltokens' + +module REXML + class ReferenceWriter + def initialize(id_type, + public_id_literal, + system_literal, + context=nil) + @id_type = id_type + @public_id_literal = public_id_literal + @system_literal = system_literal + if context and context[:prologue_quote] == :apostrophe + @default_quote = "'" + else + @default_quote = "\"" + end + end + + def write(output) + output << " #{@id_type}" + if @public_id_literal + if @public_id_literal.include?("'") + quote = "\"" + else + quote = @default_quote + end + output << " #{quote}#{@public_id_literal}#{quote}" + end + if @system_literal + if @system_literal.include?("'") + quote = "\"" + elsif @system_literal.include?("\"") + quote = "'" + else + quote = @default_quote + end + output << " #{quote}#{@system_literal}#{quote}" + end + end + end + + # Represents an XML DOCTYPE declaration; that is, the contents of . DOCTYPES can be used to declare the DTD of a document, as well as + # being used to declare entities used in the document. + class DocType < Parent + include XMLTokens + START = "" + SYSTEM = "SYSTEM" + PUBLIC = "PUBLIC" + DEFAULT_ENTITIES = { + 'gt'=>EntityConst::GT, + 'lt'=>EntityConst::LT, + 'quot'=>EntityConst::QUOT, + "apos"=>EntityConst::APOS + } + + # name is the name of the doctype + # external_id is the referenced DTD, if given + attr_reader :name, :external_id, :entities, :namespaces + + # Constructor + # + # dt = DocType.new( 'foo', '-//I/Hate/External/IDs' ) + # # + # dt = DocType.new( doctype_to_clone ) + # # Incomplete. Shallow clone of doctype + # + # +Note+ that the constructor: + # + # Doctype.new( Source.new( "" ) ) + # + # is _deprecated_. Do not use it. It will probably disappear. + def initialize( first, parent=nil ) + @entities = DEFAULT_ENTITIES + @long_name = @uri = nil + if first.kind_of? String + super() + @name = first + @external_id = parent + elsif first.kind_of? DocType + super( parent ) + @name = first.name + @external_id = first.external_id + @long_name = first.instance_variable_get(:@long_name) + @uri = first.instance_variable_get(:@uri) + elsif first.kind_of? Array + super( parent ) + @name = first[0] + @external_id = first[1] + @long_name = first[2] + @uri = first[3] + elsif first.kind_of? Source + super( parent ) + parser = Parsers::BaseParser.new( first ) + event = parser.pull + if event[0] == :start_doctype + @name, @external_id, @long_name, @uri, = event[1..-1] + end + else + super() + end + end + + def node_type + :doctype + end + + def attributes_of element + rv = [] + each do |child| + child.each do |key,val| + rv << Attribute.new(key,val) + end if child.kind_of? AttlistDecl and child.element_name == element + end + rv + end + + def attribute_of element, attribute + att_decl = find do |child| + child.kind_of? AttlistDecl and + child.element_name == element and + child.include? attribute + end + return nil unless att_decl + att_decl[attribute] + end + + def clone + DocType.new self + end + + # output:: + # Where to write the string + # indent:: + # An integer. If -1, no indentation will be used; otherwise, the + # indentation will be this number of spaces, and children will be + # indented an additional amount. + # transitive:: + # Ignored + # ie_hack:: + # Ignored + def write( output, indent=0, transitive=false, ie_hack=false ) + f = REXML::Formatters::Default.new + indent( output, indent ) + output << START + output << ' ' + output << @name + if @external_id + reference_writer = ReferenceWriter.new(@external_id, + @long_name, + @uri, + context) + reference_writer.write(output) + end + unless @children.empty? + output << ' [' + @children.each { |child| + output << "\n" + f.write( child, output ) + } + output << "\n]" + end + output << STOP + end + + def context + @parent&.context + end + + def entity( name ) + @entities[name]&.unnormalized + end + + def add child + super(child) + @entities = DEFAULT_ENTITIES.clone if @entities == DEFAULT_ENTITIES + @entities[ child.name ] = child if child.kind_of? Entity + end + + # This method retrieves the public identifier identifying the document's + # DTD. + # + # Method contributed by Henrik Martensson + def public + case @external_id + when "SYSTEM" + nil + when "PUBLIC" + @long_name + end + end + + # This method retrieves the system identifier identifying the document's DTD + # + # Method contributed by Henrik Martensson + def system + case @external_id + when "SYSTEM" + @long_name + when "PUBLIC" + @uri.kind_of?(String) ? @uri : nil + end + end + + # This method returns a list of notations that have been declared in the + # _internal_ DTD subset. Notations in the external DTD subset are not + # listed. + # + # Method contributed by Henrik Martensson + def notations + children().select {|node| node.kind_of?(REXML::NotationDecl)} + end + + # Retrieves a named notation. Only notations declared in the internal + # DTD subset can be retrieved. + # + # Method contributed by Henrik Martensson + def notation(name) + notations.find { |notation_decl| + notation_decl.name == name + } + end + end + + # We don't really handle any of these since we're not a validating + # parser, so we can be pretty dumb about them. All we need to be able + # to do is spew them back out on a write() + + # This is an abstract class. You never use this directly; it serves as a + # parent class for the specific declarations. + class Declaration < Child + def initialize src + super() + @string = src + end + + def to_s + @string+'>' + end + + # == DEPRECATED + # See REXML::Formatters + # + def write( output, indent ) + output << to_s + end + end + + public + class ElementDecl < Declaration + def initialize( src ) + super + end + end + + class ExternalEntity < Child + def initialize( src ) + super() + @entity = src + end + def to_s + @entity + end + def write( output, indent ) + output << @entity + end + end + + class NotationDecl < Child + attr_accessor :public, :system + def initialize name, middle, pub, sys + super(nil) + @name = name + @middle = middle + @public = pub + @system = sys + end + + def to_s + context = parent&.context + notation = "" + notation + end + + def write( output, indent=-1 ) + output << to_s + end + + # This method retrieves the name of the notation. + # + # Method contributed by Henrik Martensson + def name + @name + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/document.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/document.rb new file mode 100644 index 000000000..bd3a00452 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/document.rb @@ -0,0 +1,471 @@ +# frozen_string_literal: false +require_relative "security" +require_relative "element" +require_relative "xmldecl" +require_relative "source" +require_relative "comment" +require_relative "doctype" +require_relative "instruction" +require_relative "rexml" +require_relative "parseexception" +require_relative "output" +require_relative "parsers/baseparser" +require_relative "parsers/streamparser" +require_relative "parsers/treeparser" + +module REXML + # Represents an XML document. + # + # A document may have: + # + # - A single child that may be accessed via method #root. + # - An XML declaration. + # - A document type. + # - Processing instructions. + # + # == In a Hurry? + # + # If you're somewhat familiar with XML + # and have a particular task in mind, + # you may want to see the + # {tasks pages}[../doc/rexml/tasks/tocs/master_toc_rdoc.html], + # and in particular, the + # {tasks page for documents}[../doc/rexml/tasks/tocs/document_toc_rdoc.html]. + # + class Document < Element + # A convenient default XML declaration. Use: + # + # mydoc << XMLDecl.default + # + DECLARATION = XMLDecl.default + + # :call-seq: + # new(string = nil, context = {}) -> new_document + # new(io_stream = nil, context = {}) -> new_document + # new(document = nil, context = {}) -> new_document + # + # Returns a new \REXML::Document object. + # + # When no arguments are given, + # returns an empty document: + # + # d = REXML::Document.new + # d.to_s # => "" + # + # When argument +string+ is given, it must be a string + # containing a valid XML document: + # + # xml_string = 'FooBar' + # d = REXML::Document.new(xml_string) + # d.to_s # => "FooBar" + # + # When argument +io_stream+ is given, it must be an \IO object + # that is opened for reading, and when read must return a valid XML document: + # + # File.write('t.xml', xml_string) + # d = File.open('t.xml', 'r') do |io| + # REXML::Document.new(io) + # end + # d.to_s # => "FooBar" + # + # When argument +document+ is given, it must be an existing + # document object, whose context and attributes (but not children) + # are cloned into the new document: + # + # d = REXML::Document.new(xml_string) + # d.children # => [ ... ] + # d.context = {raw: :all, compress_whitespace: :all} + # d.add_attributes({'bar' => 0, 'baz' => 1}) + # d1 = REXML::Document.new(d) + # d1.children # => [] + # d1.context # => {:raw=>:all, :compress_whitespace=>:all} + # d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'} + # + # When argument +context+ is given, it must be a hash + # containing context entries for the document; + # see {Element Context}[../doc/rexml/context_rdoc.html]: + # + # context = {raw: :all, compress_whitespace: :all} + # d = REXML::Document.new(xml_string, context) + # d.context # => {:raw=>:all, :compress_whitespace=>:all} + # + def initialize( source = nil, context = {} ) + @entity_expansion_count = 0 + @entity_expansion_limit = Security.entity_expansion_limit + @entity_expansion_text_limit = Security.entity_expansion_text_limit + super() + @context = context + # `source = ""` is an invalid usage because no root element XML is an invalid XML. + # But we accept `""` for backward compatibility. + return if source.nil? or source == "" + if source.kind_of? Document + @context = source.context + super source + else + build( source ) + end + end + + # :call-seq: + # node_type -> :document + # + # Returns the symbol +:document+. + # + def node_type + :document + end + + # :call-seq: + # clone -> new_document + # + # Returns the new document resulting from executing + # Document.new(self). See Document.new. + # + def clone + Document.new self + end + + # :call-seq: + # expanded_name -> empty_string + # + # Returns an empty string. + # + def expanded_name + '' + #d = doc_type + #d ? d.name : "UNDEFINED" + end + alias :name :expanded_name + + # :call-seq: + # add(xml_decl) -> self + # add(doc_type) -> self + # add(object) -> self + # + # Adds an object to the document; returns +self+. + # + # When argument +xml_decl+ is given, + # it must be an REXML::XMLDecl object, + # which becomes the XML declaration for the document, + # replacing the previous XML declaration if any: + # + # d = REXML::Document.new + # d.xml_decl.to_s # => "" + # d.add(REXML::XMLDecl.new('2.0')) + # d.xml_decl.to_s # => "" + # + # When argument +doc_type+ is given, + # it must be an REXML::DocType object, + # which becomes the document type for the document, + # replacing the previous document type, if any: + # + # d = REXML::Document.new + # d.doctype.to_s # => "" + # d.add(REXML::DocType.new('foo')) + # d.doctype.to_s # => "" + # + # When argument +object+ (not an REXML::XMLDecl or REXML::DocType object) + # is given it is added as the last child: + # + # d = REXML::Document.new + # d.add(REXML::Element.new('foo')) + # d.to_s # => "" + # + def add( child ) + if child.kind_of? XMLDecl + if @children[0].kind_of? XMLDecl + @children[0] = child + else + @children.unshift child + end + child.parent = self + elsif child.kind_of? DocType + # Find first Element or DocType node and insert the decl right + # before it. If there is no such node, just insert the child at the + # end. If there is a child and it is an DocType, then replace it. + insert_before_index = @children.find_index { |x| + x.kind_of?(Element) || x.kind_of?(DocType) + } + if insert_before_index # Not null = not end of list + if @children[ insert_before_index ].kind_of? DocType + @children[ insert_before_index ] = child + else + @children[ insert_before_index-1, 0 ] = child + end + else # Insert at end of list + @children << child + end + child.parent = self + else + rv = super + raise "attempted adding second root element to document" if @elements.size > 1 + rv + end + end + alias :<< :add + + # :call-seq: + # add_element(name_or_element = nil, attributes = nil) -> new_element + # + # Adds an element to the document by calling REXML::Element.add_element: + # + # REXML::Element.add_element(name_or_element, attributes) + def add_element(arg=nil, arg2=nil) + rv = super + raise "attempted adding second root element to document" if @elements.size > 1 + rv + end + + # :call-seq: + # root -> root_element or nil + # + # Returns the root element of the document, if it exists, otherwise +nil+: + # + # d = REXML::Document.new('') + # d.root # => + # d = REXML::Document.new('') + # d.root # => nil + # + def root + elements[1] + #self + #@children.find { |item| item.kind_of? Element } + end + + # :call-seq: + # doctype -> doc_type or nil + # + # Returns the DocType object for the document, if it exists, otherwise +nil+: + # + # d = REXML::Document.new('') + # d.doctype.class # => REXML::DocType + # d = REXML::Document.new('') + # d.doctype.class # => nil + # + def doctype + @children.find { |item| item.kind_of? DocType } + end + + # :call-seq: + # xml_decl -> xml_decl + # + # Returns the XMLDecl object for the document, if it exists, + # otherwise the default XMLDecl object: + # + # d = REXML::Document.new('') + # d.xml_decl.class # => REXML::XMLDecl + # d.xml_decl.to_s # => "" + # d = REXML::Document.new('') + # d.xml_decl.class # => REXML::XMLDecl + # d.xml_decl.to_s # => "" + # + def xml_decl + rv = @children[0] + return rv if rv.kind_of? XMLDecl + @children.unshift(XMLDecl.default)[0] + end + + # :call-seq: + # version -> version_string + # + # Returns the XMLDecl version of this document as a string, + # if it has been set, otherwise the default version: + # + # d = REXML::Document.new('') + # d.version # => "2.0" + # d = REXML::Document.new('') + # d.version # => "1.0" + # + def version + xml_decl().version + end + + # :call-seq: + # encoding -> encoding_string + # + # Returns the XMLDecl encoding of the document, + # if it has been set, otherwise the default encoding: + # + # d = REXML::Document.new('') + # d.encoding # => "UTF-16" + # d = REXML::Document.new('') + # d.encoding # => "UTF-8" + # + def encoding + xml_decl().encoding + end + + # :call-seq: + # stand_alone? + # + # Returns the XMLDecl standalone value of the document as a string, + # if it has been set, otherwise the default standalone value: + # + # d = REXML::Document.new('') + # d.stand_alone? # => "yes" + # d = REXML::Document.new('') + # d.stand_alone? # => nil + # + def stand_alone? + xml_decl().stand_alone? + end + + # :call-seq: + # doc.write(output=$stdout, indent=-1, transitive=false, ie_hack=false, encoding=nil) + # doc.write(options={:output => $stdout, :indent => -1, :transitive => false, :ie_hack => false, :encoding => nil}) + # + # Write the XML tree out, optionally with indent. This writes out the + # entire XML document, including XML declarations, doctype declarations, + # and processing instructions (if any are given). + # + # A controversial point is whether Document should always write the XML + # declaration () whether or not one is given by the + # user (or source document). REXML does not write one if one was not + # specified, because it adds unnecessary bandwidth to applications such + # as XML-RPC. + # + # Accept Nth argument style and options Hash style as argument. + # The recommended style is options Hash style for one or more + # arguments case. + # + # _Examples_ + # Document.new("").write + # + # output = "" + # Document.new("").write(output) + # + # output = "" + # Document.new("").write(:output => output, :indent => 2) + # + # See also the classes in the rexml/formatters package for the proper way + # to change the default formatting of XML output. + # + # _Examples_ + # + # output = "" + # tr = Transitive.new + # tr.write(Document.new(""), output) + # + # output:: + # output an object which supports '<< string'; this is where the + # document will be written. + # indent:: + # An integer. If -1, no indenting will be used; otherwise, the + # indentation will be twice this number of spaces, and children will be + # indented an additional amount. For a value of 3, every item will be + # indented 3 more levels, or 6 more spaces (2 * 3). Defaults to -1 + # transitive:: + # If transitive is true and indent is >= 0, then the output will be + # pretty-printed in such a way that the added whitespace does not affect + # the absolute *value* of the document -- that is, it leaves the value + # and number of Text nodes in the document unchanged. + # ie_hack:: + # This hack inserts a space before the /> on empty tags to address + # a limitation of Internet Explorer. Defaults to false + # encoding:: + # Encoding name as String. Change output encoding to specified encoding + # instead of encoding in XML declaration. + # Defaults to nil. It means encoding in XML declaration is used. + def write(*arguments) + if arguments.size == 1 and arguments[0].class == Hash + options = arguments[0] + + output = options[:output] + indent = options[:indent] + transitive = options[:transitive] + ie_hack = options[:ie_hack] + encoding = options[:encoding] + else + output, indent, transitive, ie_hack, encoding, = *arguments + end + + output ||= $stdout + indent ||= -1 + transitive = false if transitive.nil? + ie_hack = false if ie_hack.nil? + encoding ||= xml_decl.encoding + + if encoding != 'UTF-8' && !output.kind_of?(Output) + output = Output.new( output, encoding ) + end + formatter = if indent > -1 + if transitive + require_relative "formatters/transitive" + REXML::Formatters::Transitive.new( indent, ie_hack ) + else + REXML::Formatters::Pretty.new( indent, ie_hack ) + end + else + REXML::Formatters::Default.new( ie_hack ) + end + formatter.write( self, output ) + end + + + def Document::parse_stream( source, listener ) + Parsers::StreamParser.new( source, listener ).parse + end + + # Set the entity expansion limit. By default the limit is set to 10000. + # + # Deprecated. Use REXML::Security.entity_expansion_limit= instead. + def Document::entity_expansion_limit=( val ) + Security.entity_expansion_limit = val + end + + # Get the entity expansion limit. By default the limit is set to 10000. + # + # Deprecated. Use REXML::Security.entity_expansion_limit= instead. + def Document::entity_expansion_limit + Security.entity_expansion_limit + end + + # Set the entity expansion limit. By default the limit is set to 10240. + # + # Deprecated. Use REXML::Security.entity_expansion_text_limit= instead. + def Document::entity_expansion_text_limit=( val ) + Security.entity_expansion_text_limit = val + end + + # Get the entity expansion limit. By default the limit is set to 10240. + # + # Deprecated. Use REXML::Security.entity_expansion_text_limit instead. + def Document::entity_expansion_text_limit + Security.entity_expansion_text_limit + end + + attr_reader :entity_expansion_count + attr_writer :entity_expansion_limit + attr_accessor :entity_expansion_text_limit + + def record_entity_expansion + @entity_expansion_count += 1 + if @entity_expansion_count > @entity_expansion_limit + raise "number of entity expansions exceeded, processing aborted." + end + end + + def document + self + end + + private + + attr_accessor :namespaces_cache + + # New document level cache is created and available in this block. + # This API is thread unsafe. Users can't change this document in this block. + def enable_cache + @namespaces_cache = {} + begin + yield + ensure + @namespaces_cache = nil + end + end + + def build( source ) + Parsers::TreeParser.new( source, self ).parse + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/attlistdecl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/attlistdecl.rb new file mode 100644 index 000000000..1326cb21e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/attlistdecl.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: false +require_relative "../child" +module REXML + module DTD + class AttlistDecl < Child + START = ")/um + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/dtd.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/dtd.rb new file mode 100644 index 000000000..8b0f2d753 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/dtd.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: false +require_relative "elementdecl" +require_relative "entitydecl" +require_relative "../comment" +require_relative "notationdecl" +require_relative "attlistdecl" +require_relative "../parent" + +module REXML + module DTD + class Parser + def Parser.parse( input ) + case input + when String + parse_helper input + when File + parse_helper input.read + end + end + + # Takes a String and parses it out + def Parser.parse_helper( input ) + contents = Parent.new + while input.size > 0 + case input + when ElementDecl.PATTERN_RE + match = $& + contents << ElementDecl.new( match ) + when AttlistDecl.PATTERN_RE + matchdata = $~ + contents << AttlistDecl.new( matchdata ) + when EntityDecl.PATTERN_RE + matchdata = $~ + contents << EntityDecl.new( matchdata ) + when Comment.PATTERN_RE + matchdata = $~ + contents << Comment.new( matchdata ) + when NotationDecl.PATTERN_RE + matchdata = $~ + contents << NotationDecl.new( matchdata ) + end + end + contents + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/elementdecl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/elementdecl.rb new file mode 100644 index 000000000..20ed02324 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/elementdecl.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: false +require_relative "../child" +module REXML + module DTD + class ElementDecl < Child + START = "/um + PATTERN_RE = /^\s*#{START}\s+((?:[:\w][-\.\w]*:)?[-!\*\.\w]*)(.*?)>/ + #\s*((((["']).*?\5)|[^\/'">]*)*?)(\/)?>/um, true) + + def initialize match + @name = match[1] + @rest = match[2] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/entitydecl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/entitydecl.rb new file mode 100644 index 000000000..312df655f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/entitydecl.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: false +require_relative "../child" +module REXML + module DTD + class EntityDecl < Child + START = "/um + SYSTEM = /^\s*#{START}\s+(?:%\s+)?(\w+)\s+SYSTEM\s+((["']).*?\3)(?:\s+NDATA\s+\w+)?\s*>/um + PLAIN = /^\s*#{START}\s+(\w+)\s+((["']).*?\3)\s*>/um + PERCENT = /^\s*#{START}\s+%\s+(\w+)\s+((["']).*?\3)\s*>/um + # + # + def initialize src + super() + md = nil + if src.match( PUBLIC ) + md = src.match( PUBLIC, true ) + @middle = "PUBLIC" + @content = "#{md[2]} #{md[4]}" + elsif src.match( SYSTEM ) + md = src.match( SYSTEM, true ) + @middle = "SYSTEM" + @content = md[2] + elsif src.match( PLAIN ) + md = src.match( PLAIN, true ) + @middle = "" + @content = md[2] + elsif src.match( PERCENT ) + md = src.match( PERCENT, true ) + @middle = "" + @content = md[2] + end + raise ParseException.new("failed Entity match", src) if md.nil? + @name = md[1] + end + + def to_s + rv = " 0 + rv << @content + rv + end + + def write( output, indent ) + indent( output, indent ) + output << to_s + end + + def EntityDecl.parse_source source, listener + md = source.match( PATTERN_RE, true ) + thing = md[0].squeeze(" \t\n\r") + listener.send inspect.downcase, thing + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/notationdecl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/notationdecl.rb new file mode 100644 index 000000000..04a9b08aa --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/dtd/notationdecl.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: false +require_relative "../child" +module REXML + module DTD + class NotationDecl < Child + START = "/um + SYSTEM = /^\s*#{START}\s+(\w[\w-]*)\s+(SYSTEM)\s+((["']).*?\4)\s*>/um + def initialize src + super() + if src.match( PUBLIC ) + md = src.match( PUBLIC, true ) + elsif src.match( SYSTEM ) + md = src.match( SYSTEM, true ) + else + raise ParseException.new( "error parsing notation: no matching pattern", src ) + end + @name = md[1] + @middle = md[2] + @rest = md[3] + end + + def to_s + "" + end + + def write( output, indent ) + indent( output, indent ) + output << to_s + end + + def NotationDecl.parse_source source, listener + md = source.match( PATTERN_RE, true ) + thing = md[0].squeeze(" \t\n\r") + listener.send inspect.downcase, thing + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/element.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/element.rb new file mode 100644 index 000000000..0d74811e4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/element.rb @@ -0,0 +1,2578 @@ +# frozen_string_literal: false +require_relative "parent" +require_relative "namespace" +require_relative "attribute" +require_relative "cdata" +require_relative "xpath" +require_relative "parseexception" + +module REXML + # An \REXML::Element object represents an XML element. + # + # An element: + # + # - Has a name (string). + # - May have a parent (another element). + # - Has zero or more children + # (other elements, text, CDATA, processing instructions, and comments). + # - Has zero or more siblings + # (other elements, text, CDATA, processing instructions, and comments). + # - Has zero or more named attributes. + # + # == In a Hurry? + # + # If you're somewhat familiar with XML + # and have a particular task in mind, + # you may want to see the + # {tasks pages}[../doc/rexml/tasks/tocs/master_toc_rdoc.html], + # and in particular, the + # {tasks page for elements}[../doc/rexml/tasks/tocs/element_toc_rdoc.html]. + # + # === Name + # + # An element has a name, which is initially set when the element is created: + # + # e = REXML::Element.new('foo') + # e.name # => "foo" + # + # The name may be changed: + # + # e.name = 'bar' + # e.name # => "bar" + # + # + # === \Parent + # + # An element may have a parent. + # + # Its parent may be assigned explicitly when the element is created: + # + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new('bar', e0) + # e1.parent # => ... + # + # Note: the representation of an element always shows the element's name. + # If the element has children, the representation indicates that + # by including an ellipsis (...). + # + # The parent may be assigned explicitly at any time: + # + # e2 = REXML::Element.new('baz') + # e1.parent = e2 + # e1.parent # => + # + # When an element is added as a child, its parent is set automatically: + # + # e1.add_element(e0) + # e0.parent # => ... + # + # For an element that has no parent, method +parent+ returns +nil+. + # + # === Children + # + # An element has zero or more children. + # The children are an ordered collection + # of all objects whose parent is the element itself. + # + # The children may include any combination of elements, text, comments, + # processing instructions, and CDATA. + # (This example keeps things clean by controlling whitespace + # via a +context+ setting.) + # + # xml_string = <<-EOT + # + # + # text 0 + # + # + # + # + # text 1 + # + # + # + # + # EOT + # context = {ignore_whitespace_nodes: :all, compress_whitespace: :all} + # d = REXML::Document.new(xml_string, context) + # root = d.root + # root.children.size # => 10 + # root.each {|child| p "#{child.class}: #{child}" } + # + # Output: + # + # "REXML::Element: " + # "REXML::Text: \n text 0\n " + # "REXML::Comment: comment 0" + # "REXML::Instruction: " + # "REXML::CData: cdata 0" + # "REXML::Element: " + # "REXML::Text: \n text 1\n " + # "REXML::Comment: comment 1" + # "REXML::Instruction: " + # "REXML::CData: cdata 1" + # + # A child may be added using inherited methods + # Parent#insert_before or Parent#insert_after: + # + # xml_string = '' + # d = REXML::Document.new(xml_string) + # root = d.root + # c = d.root[1] # => + # root.insert_before(c, REXML::Element.new('b')) + # root.to_a # => [, , , ] + # + # A child may be replaced using Parent#replace_child: + # + # root.replace_child(c, REXML::Element.new('x')) + # root.to_a # => [, , , ] + # + # A child may be removed using Parent#delete: + # + # x = root[2] # => + # root.delete(x) + # root.to_a # => [, , ] + # + # === Siblings + # + # An element has zero or more siblings, + # which are the other children of the element's parent. + # + # In the example above, element +ele_1+ is between a CDATA sibling + # and a text sibling: + # + # ele_1 = root[5] # => + # ele_1.previous_sibling # => "cdata 0" + # ele_1.next_sibling # => "\n text 1\n " + # + # === \Attributes + # + # An element has zero or more named attributes. + # + # A new element has no attributes: + # + # e = REXML::Element.new('foo') + # e.attributes # => {} + # + # Attributes may be added: + # + # e.add_attribute('bar', 'baz') + # e.add_attribute('bat', 'bam') + # e.attributes.size # => 2 + # e['bar'] # => "baz" + # e['bat'] # => "bam" + # + # An existing attribute may be modified: + # + # e.add_attribute('bar', 'bad') + # e.attributes.size # => 2 + # e['bar'] # => "bad" + # + # An existing attribute may be deleted: + # + # e.delete_attribute('bar') + # e.attributes.size # => 1 + # e['bar'] # => nil + # + # == What's Here + # + # To begin with, what's elsewhere? + # + # \Class \REXML::Element inherits from its ancestor classes: + # + # - REXML::Child + # - REXML::Parent + # + # \REXML::Element itself and its ancestors also include modules: + # + # - {Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html] + # - REXML::Namespace + # - REXML::Node + # - REXML::XMLTokens + # + # === Methods for Creating an \Element + # + # ::new:: Returns a new empty element. + # #clone:: Returns a clone of another element. + # + # === Methods for Attributes + # + # {[attribute_name]}[#method-i-5B-5D]:: Returns an attribute value. + # #add_attribute:: Adds a new attribute. + # #add_attributes:: Adds multiple new attributes. + # #attribute:: Returns the attribute value for a given name and optional namespace. + # #delete_attribute:: Removes an attribute. + # + # === Methods for Children + # + # {[index]}[#method-i-5B-5D]:: Returns the child at the given offset. + # #add_element:: Adds an element as the last child. + # #delete_element:: Deletes a child element. + # #each_element:: Calls the given block with each child element. + # #each_element_with_attribute:: Calls the given block with each child element + # that meets given criteria, + # which can include the attribute name. + # #each_element_with_text:: Calls the given block with each child element + # that meets given criteria, + # which can include text. + # #get_elements:: Returns an array of element children that match a given xpath. + # + # === Methods for \Text Children + # + # #add_text:: Adds a text node to the element. + # #get_text:: Returns a text node that meets specified criteria. + # #text:: Returns the text string from the first node that meets specified criteria. + # #texts:: Returns an array of the text children of the element. + # #text=:: Adds, removes, or replaces the first text child of the element + # + # === Methods for Other Children + # + # #cdatas:: Returns an array of the cdata children of the element. + # #comments:: Returns an array of the comment children of the element. + # #instructions:: Returns an array of the instruction children of the element. + # + # === Methods for Namespaces + # + # #add_namespace:: Adds a namespace to the element. + # #delete_namespace:: Removes a namespace from the element. + # #namespace:: Returns the string namespace URI for the element. + # #namespaces:: Returns a hash of all defined namespaces in the element. + # #prefixes:: Returns an array of the string prefixes (names) + # of all defined namespaces in the element + # + # === Methods for Querying + # + # #document:: Returns the document, if any, that the element belongs to. + # #root:: Returns the most distant element (not document) ancestor of the element. + # #root_node:: Returns the most distant ancestor of the element. + # #xpath:: Returns the string xpath to the element + # relative to the most distant parent + # #has_attributes?:: Returns whether the element has attributes. + # #has_elements?:: Returns whether the element has elements. + # #has_text?:: Returns whether the element has text. + # #next_element:: Returns the next sibling that is an element. + # #previous_element:: Returns the previous sibling that is an element. + # #raw:: Returns whether raw mode is set for the element. + # #whitespace:: Returns whether whitespace is respected for the element. + # #ignore_whitespace_nodes:: Returns whether whitespace nodes + # are to be ignored for the element. + # #node_type:: Returns symbol :element. + # + # === One More Method + # + # #inspect:: Returns a string representation of the element. + # + # === Accessors + # + # #elements:: Returns the REXML::Elements object for the element. + # #attributes:: Returns the REXML::Attributes object for the element. + # #context:: Returns or sets the context hash for the element. + # + class Element < Parent + include Namespace + + UNDEFINED = "UNDEFINED"; # The default name + + # Mechanisms for accessing attributes and child elements of this + # element. + attr_reader :attributes, :elements + # The context holds information about the processing environment, such as + # whitespace handling. + attr_accessor :context + + # :call-seq: + # Element.new(name = 'UNDEFINED', parent = nil, context = nil) -> new_element + # Element.new(element, parent = nil, context = nil) -> new_element + # + # Returns a new \REXML::Element object. + # + # When no arguments are given, + # returns an element with name 'UNDEFINED': + # + # e = REXML::Element.new # => + # e.class # => REXML::Element + # e.name # => "UNDEFINED" + # + # When only argument +name+ is given, + # returns an element of the given name: + # + # REXML::Element.new('foo') # => + # + # When only argument +element+ is given, it must be an \REXML::Element object; + # returns a shallow copy of the given element: + # + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new(e0) # => + # + # When argument +parent+ is also given, it must be an REXML::Parent object: + # + # e = REXML::Element.new('foo', REXML::Parent.new) + # e.parent # => #]> + # + # When argument +context+ is also given, it must be a hash + # representing the context for the element; + # see {Element Context}[../doc/rexml/context_rdoc.html]: + # + # e = REXML::Element.new('foo', nil, {raw: :all}) + # e.context # => {:raw=>:all} + # + def initialize( arg = UNDEFINED, parent=nil, context=nil ) + super(parent) + + @elements = Elements.new(self) + @attributes = Attributes.new(self) + @context = context + + if arg.kind_of? String + self.name = arg + elsif arg.kind_of? Element + self.name = arg.expanded_name + arg.attributes.each_attribute{ |attribute| + @attributes << Attribute.new( attribute ) + } + @context = arg.context + end + end + + # :call-seq: + # inspect -> string + # + # Returns a string representation of the element. + # + # For an element with no attributes and no children, shows the element name: + # + # REXML::Element.new.inspect # => "" + # + # Shows attributes, if any: + # + # e = REXML::Element.new('foo') + # e.add_attributes({'bar' => 0, 'baz' => 1}) + # e.inspect # => "" + # + # Shows an ellipsis (...), if there are child elements: + # + # e.add_element(REXML::Element.new('bar')) + # e.add_element(REXML::Element.new('baz')) + # e.inspect # => " ... " + # + def inspect + rv = "<#@expanded_name" + + @attributes.each_attribute do |attr| + rv << " " + attr.write( rv, 0 ) + end + + if children.size > 0 + rv << "> ... " + else + rv << "/>" + end + end + + # :call-seq: + # clone -> new_element + # + # Returns a shallow copy of the element, containing the name and attributes, + # but not the parent or children: + # + # e = REXML::Element.new('foo') + # e.add_attributes({'bar' => 0, 'baz' => 1}) + # e.clone # => + # + def clone + self.class.new self + end + + # :call-seq: + # root_node -> document or element + # + # Returns the most distant ancestor of +self+. + # + # When the element is part of a document, + # returns the root node of the document. + # Note that the root node is different from the document element; + # in this example +a+ is document element and the root node is its parent: + # + # d = REXML::Document.new('') + # top_element = d.first # => ... + # child = top_element.first # => ... + # d.root_node == d # => true + # top_element.root_node == d # => true + # child.root_node == d # => true + # + # When the element is not part of a document, but does have ancestor elements, + # returns the most distant ancestor element: + # + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new('bar') + # e1.parent = e0 + # e2 = REXML::Element.new('baz') + # e2.parent = e1 + # e2.root_node == e0 # => true + # + # When the element has no ancestor elements, + # returns +self+: + # + # e = REXML::Element.new('foo') + # e.root_node == e # => true + # + # Related: #root, #document. + # + def root_node + parent.nil? ? self : parent.root_node + end + + # :call-seq: + # root -> element + # + # Returns the most distant _element_ (not document) ancestor of the element: + # + # d = REXML::Document.new('') + # top_element = d.first + # child = top_element.first + # top_element.root == top_element # => true + # child.root == top_element # => true + # + # For a document, returns the topmost element: + # + # d.root == top_element # => true + # + # Related: #root_node, #document. + # + def root + target = self + while target + return target.elements[1] if target.kind_of? Document + parent = target.parent + return target if parent.kind_of? Document or parent.nil? + target = parent + end + nil + end + + # :call-seq: + # document -> document or nil + # + # If the element is part of a document, returns that document: + # + # d = REXML::Document.new('') + # top_element = d.first + # child = top_element.first + # top_element.document == d # => true + # child.document == d # => true + # + # If the element is not part of a document, returns +nil+: + # + # REXML::Element.new.document # => nil + # + # For a document, returns +self+: + # + # d.document == d # => true + # + # Related: #root, #root_node. + # + def document + root&.parent + end + + # :call-seq: + # whitespace + # + # Returns +true+ if whitespace is respected for this element, + # +false+ otherwise. + # + # See {Element Context}[../doc/rexml/context_rdoc.html]. + # + # The evaluation is tested against the element's +expanded_name+, + # and so is namespace-sensitive. + def whitespace + @whitespace = nil + if @context + if @context[:respect_whitespace] + @whitespace = (@context[:respect_whitespace] == :all or + @context[:respect_whitespace].include? expanded_name) + end + @whitespace = false if (@context[:compress_whitespace] and + (@context[:compress_whitespace] == :all or + @context[:compress_whitespace].include? expanded_name) + ) + end + @whitespace = true unless @whitespace == false + @whitespace + end + + # :call-seq: + # ignore_whitespace_nodes + # + # Returns +true+ if whitespace nodes are ignored for the element. + # + # See {Element Context}[../doc/rexml/context_rdoc.html]. + # + def ignore_whitespace_nodes + @ignore_whitespace_nodes = false + if @context + if @context[:ignore_whitespace_nodes] + @ignore_whitespace_nodes = + (@context[:ignore_whitespace_nodes] == :all or + @context[:ignore_whitespace_nodes].include? expanded_name) + end + end + end + + # :call-seq: + # raw + # + # Returns +true+ if raw mode is set for the element. + # + # See {Element Context}[../doc/rexml/context_rdoc.html]. + # + # The evaluation is tested against +expanded_name+, and so is namespace + # sensitive. + def raw + @raw = (@context and @context[:raw] and + (@context[:raw] == :all or + @context[:raw].include? expanded_name)) + @raw + end + + #once :whitespace, :raw, :ignore_whitespace_nodes + + ################################################# + # Namespaces # + ################################################# + + # :call-seq: + # prefixes -> array_of_namespace_prefixes + # + # Returns an array of the string prefixes (names) of all defined namespaces + # in the element and its ancestors: + # + # xml_string = <<-EOT + # + # + # + # + # + # + # EOT + # d = REXML::Document.new(xml_string, {compress_whitespace: :all}) + # d.elements['//a'].prefixes # => ["x", "y"] + # d.elements['//b'].prefixes # => ["x", "y"] + # d.elements['//c'].prefixes # => ["x", "y", "z"] + # + def prefixes + prefixes = [] + prefixes = parent.prefixes if parent + prefixes |= attributes.prefixes + prefixes + end + + # :call-seq: + # namespaces -> array_of_namespace_names + # + # Returns a hash of all defined namespaces + # in the element and its ancestors: + # + # xml_string = <<-EOT + # + # + # + # + # + # + # EOT + # d = REXML::Document.new(xml_string) + # d.elements['//a'].namespaces # => {"x"=>"1", "y"=>"2"} + # d.elements['//b'].namespaces # => {"x"=>"1", "y"=>"2"} + # d.elements['//c'].namespaces # => {"x"=>"1", "y"=>"2", "z"=>"3"} + # + def namespaces + namespaces_cache = document&.__send__(:namespaces_cache) + if namespaces_cache + namespaces_cache[self] ||= calculate_namespaces + else + calculate_namespaces + end + end + + # :call-seq: + # namespace(prefix = nil) -> string_uri or nil + # + # Returns the string namespace URI for the element, + # possibly deriving from one of its ancestors. + # + # xml_string = <<-EOT + # + # + # + # + # + # + # EOT + # d = REXML::Document.new(xml_string) + # b = d.elements['//b'] + # b.namespace # => "1" + # b.namespace('y') # => "2" + # b.namespace('nosuch') # => nil + # + def namespace(prefix=nil) + if prefix.nil? + prefix = prefix() + end + prefix = (prefix == '') ? 'xmlns' : prefix.delete_prefix("xmlns:") + ns = namespaces[prefix] + + ns = '' if ns.nil? and prefix == 'xmlns' + ns + end + + # :call-seq: + # add_namespace(prefix, uri = nil) -> self + # + # Adds a namespace to the element; returns +self+. + # + # With the single argument +prefix+, + # adds a namespace using the given +prefix+ and the namespace URI: + # + # e = REXML::Element.new('foo') + # e.add_namespace('bar') + # e.namespaces # => {"xmlns"=>"bar"} + # + # With both arguments +prefix+ and +uri+ given, + # adds a namespace using both arguments: + # + # e.add_namespace('baz', 'bat') + # e.namespaces # => {"xmlns"=>"bar", "baz"=>"bat"} + # + def add_namespace( prefix, uri=nil ) + unless uri + @attributes["xmlns"] = prefix + else + prefix = "xmlns:#{prefix}" unless prefix =~ /^xmlns:/ + @attributes[ prefix ] = uri + end + self + end + + # :call-seq: + # delete_namespace(namespace = 'xmlns') -> self + # + # Removes a namespace from the element. + # + # With no argument, removes the default namespace: + # + # d = REXML::Document.new "" + # d.to_s # => "" + # d.root.delete_namespace # => + # d.to_s # => "" + # + # With argument +namespace+, removes the specified namespace: + # + # d.root.delete_namespace('foo') + # d.to_s # => "" + # + # Does nothing if no such namespace is found: + # + # d.root.delete_namespace('nosuch') + # d.to_s # => "" + # + def delete_namespace namespace="xmlns" + namespace = "xmlns:#{namespace}" unless namespace == 'xmlns' + attribute = attributes.get_attribute(namespace) + attribute.remove unless attribute.nil? + self + end + + ################################################# + # Elements # + ################################################# + + # :call-seq: + # add_element(name, attributes = nil) -> new_element + # add_element(element, attributes = nil) -> element + # + # Adds a child element, optionally setting attributes + # on the added element; returns the added element. + # + # With string argument +name+, creates a new element with that name + # and adds the new element as a child: + # + # e0 = REXML::Element.new('foo') + # e0.add_element('bar') + # e0[0] # => + # + # + # With argument +name+ and hash argument +attributes+, + # sets attributes on the new element: + # + # e0.add_element('baz', {'bat' => '0', 'bam' => '1'}) + # e0[1] # => + # + # With element argument +element+, adds that element as a child: + # + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new('bar') + # e0.add_element(e1) + # e0[0] # => + # + # With argument +element+ and hash argument +attributes+, + # sets attributes on the added element: + # + # e0.add_element(e1, {'bat' => '0', 'bam' => '1'}) + # e0[1] # => + # + def add_element element, attrs=nil + raise "First argument must be either an element name, or an Element object" if element.nil? + el = @elements.add(element) + attrs.each do |key, value| + el.attributes[key]=value + end if attrs.kind_of? Hash + el + end + + # :call-seq: + # delete_element(index) -> removed_element or nil + # delete_element(element) -> removed_element or nil + # delete_element(xpath) -> removed_element or nil + # + # Deletes a child element. + # + # When 1-based integer argument +index+ is given, + # removes and returns the child element at that offset if it exists; + # indexing does not include text nodes; + # returns +nil+ if the element does not exist: + # + # d = REXML::Document.new 'text' + # a = d.root # => ... + # a.delete_element(1) # => + # a.delete_element(1) # => + # a.delete_element(1) # => nil + # + # When element argument +element+ is given, + # removes and returns that child element if it exists, + # otherwise returns +nil+: + # + # d = REXML::Document.new 'text' + # a = d.root # => ... + # c = a[2] # => + # a.delete_element(c) # => + # a.delete_element(c) # => nil + # + # When xpath argument +xpath+ is given, + # removes and returns the element at xpath if it exists, + # otherwise returns +nil+: + # + # d = REXML::Document.new 'text' + # a = d.root # => ... + # a.delete_element('//c') # => + # a.delete_element('//c') # => nil + # + def delete_element element + @elements.delete element + end + + # :call-seq: + # has_elements? + # + # Returns +true+ if the element has one or more element children, + # +false+ otherwise: + # + # d = REXML::Document.new 'text' + # a = d.root # => ... + # a.has_elements? # => true + # b = a[0] # => + # b.has_elements? # => false + # + def has_elements? + !@elements.empty? + end + + # :call-seq: + # each_element_with_attribute(attr_name, value = nil, max = 0, xpath = nil) {|e| ... } + # + # Calls the given block with each child element that meets given criteria. + # + # When only string argument +attr_name+ is given, + # calls the block with each child element that has that attribute: + # + # d = REXML::Document.new '' + # a = d.root + # a.each_element_with_attribute('id') {|e| p e } + # + # Output: + # + # + # + # + # + # With argument +attr_name+ and string argument +value+ given, + # calls the block with each child element that has that attribute + # with that value: + # + # a.each_element_with_attribute('id', '1') {|e| p e } + # + # Output: + # + # + # + # + # With arguments +attr_name+, +value+, and integer argument +max+ given, + # calls the block with at most +max+ child elements: + # + # a.each_element_with_attribute('id', '1', 1) {|e| p e } + # + # Output: + # + # + # + # With all arguments given, including +xpath+, + # calls the block with only those child elements + # that meet the first three criteria, + # and also match the given +xpath+: + # + # a.each_element_with_attribute('id', '1', 2, '//d') {|e| p e } + # + # Output: + # + # + # + def each_element_with_attribute( key, value=nil, max=0, name=nil, &block ) # :yields: Element + each_with_something( proc {|child| + if value.nil? + child.attributes[key] != nil + else + child.attributes[key]==value + end + }, max, name, &block ) + end + + # :call-seq: + # each_element_with_text(text = nil, max = 0, xpath = nil) {|e| ... } + # + # Calls the given block with each child element that meets given criteria. + # + # With no arguments, calls the block with each child element that has text: + # + # d = REXML::Document.new 'bbd' + # a = d.root + # a.each_element_with_text {|e| p e } + # + # Output: + # + # ... + # ... + # ... + # + # With the single string argument +text+, + # calls the block with each element that has exactly that text: + # + # a.each_element_with_text('b') {|e| p e } + # + # Output: + # + # ... + # ... + # + # With argument +text+ and integer argument +max+, + # calls the block with at most +max+ elements: + # + # a.each_element_with_text('b', 1) {|e| p e } + # + # Output: + # + # ... + # + # With all arguments given, including +xpath+, + # calls the block with only those child elements + # that meet the first two criteria, + # and also match the given +xpath+: + # + # a.each_element_with_text('b', 2, '//c') {|e| p e } + # + # Output: + # + # ... + # + def each_element_with_text( text=nil, max=0, name=nil, &block ) # :yields: Element + each_with_something( proc {|child| + if text.nil? + child.has_text? + else + child.text == text + end + }, max, name, &block ) + end + + # :call-seq: + # each_element {|e| ... } + # + # Calls the given block with each child element: + # + # d = REXML::Document.new 'bbd' + # a = d.root + # a.each_element {|e| p e } + # + # Output: + # + # ... + # ... + # ... + # + # + def each_element( xpath=nil, &block ) # :yields: Element + @elements.each( xpath, &block ) + end + + # :call-seq: + # get_elements(xpath) + # + # Returns an array of the elements that match the given +xpath+: + # + # xml_string = <<-EOT + # + # + # + # + # + # EOT + # d = REXML::Document.new(xml_string) + # d.root.get_elements('//a') # => [ ... , ] + # + def get_elements( xpath ) + @elements.to_a( xpath ) + end + + # :call-seq: + # next_element + # + # Returns the next sibling that is an element if it exists, + # +niL+ otherwise: + # + # d = REXML::Document.new 'text' + # d.root.elements['b'].next_element #-> + # d.root.elements['c'].next_element #-> nil + # + def next_element + element = next_sibling + element = element.next_sibling until element.nil? or element.kind_of? Element + element + end + + # :call-seq: + # previous_element + # + # Returns the previous sibling that is an element if it exists, + # +niL+ otherwise: + # + # d = REXML::Document.new 'text' + # d.root.elements['c'].previous_element #-> + # d.root.elements['b'].previous_element #-> nil + # + def previous_element + element = previous_sibling + element = element.previous_sibling until element.nil? or element.kind_of? Element + element + end + + + ################################################# + # Text # + ################################################# + + # :call-seq: + # has_text? -> true or false + # + # Returns +true+ if the element has one or more text noded, + # +false+ otherwise: + # + # d = REXML::Document.new 'text' + # a = d.root + # a.has_text? # => true + # b = a[0] + # b.has_text? # => false + # + def has_text? + not text().nil? + end + + # :call-seq: + # text(xpath = nil) -> text_string or nil + # + # Returns the text string from the first text node child + # in a specified element, if it exists, +nil+ otherwise. + # + # With no argument, returns the text from the first text node in +self+: + # + # d = REXML::Document.new "

    some text this is bold! more text

    " + # d.root.text.class # => String + # d.root.text # => "some text " + # + # With argument +xpath+, returns text from the first text node + # in the element that matches +xpath+: + # + # d.root.text(1) # => "this is bold!" + # + # Note that an element may have multiple text nodes, + # possibly separated by other non-text children, as above. + # Even so, the returned value is the string text from the first such node. + # + # Note also that the text note is retrieved by method get_text, + # and so is always normalized text. + # + def text( path = nil ) + rv = get_text(path) + rv&.value + end + + # :call-seq: + # get_text(xpath = nil) -> text_node or nil + # + # Returns the first text node child in a specified element, if it exists, + # +nil+ otherwise. + # + # With no argument, returns the first text node from +self+: + # + # d = REXML::Document.new "

    some text this is bold! more text

    " + # d.root.get_text.class # => REXML::Text + # d.root.get_text # => "some text " + # + # With argument +xpath+, returns the first text node from the element + # that matches +xpath+: + # + # d.root.get_text(1) # => "this is bold!" + # + def get_text path = nil + rv = nil + if path + element = @elements[ path ] + rv = element.get_text unless element.nil? + else + rv = @children.find { |node| node.kind_of? Text } + end + rv + end + + # :call-seq: + # text = string -> string + # text = nil -> nil + # + # Adds, replaces, or removes the first text node child in the element. + # + # With string argument +string+, + # creates a new \REXML::Text node containing that string, + # honoring the current settings for whitespace and row, + # then places the node as the first text child in the element; + # returns +string+. + # + # If the element has no text child, the text node is added: + # + # d = REXML::Document.new '' + # d.root.text = 'foo' #-> 'foo' + # + # If the element has a text child, it is replaced: + # + # d.root.text = 'bar' #-> 'bar' + # + # With argument +nil+, removes the first text child: + # + # d.root.text = nil #-> '' + # + def text=( text ) + if text.kind_of? String + text = Text.new( text, whitespace(), nil, raw() ) + elsif !text.nil? and !text.kind_of? Text + text = Text.new( text.to_s, whitespace(), nil, raw() ) + end + old_text = get_text + if text.nil? + old_text.remove unless old_text.nil? + else + if old_text.nil? + self << text + else + old_text.replace_with( text ) + end + end + self + end + + # :call-seq: + # add_text(string) -> nil + # add_text(text_node) -> self + # + # Adds text to the element. + # + # When string argument +string+ is given, returns +nil+. + # + # If the element has no child text node, + # creates a \REXML::Text object using the string, + # honoring the current settings for whitespace and raw, + # then adds that node to the element: + # + # d = REXML::Document.new('') + # a = d.root + # a.add_text('foo') + # a.to_a # => [, "foo"] + # + # If the element has child text nodes, + # appends the string to the _last_ text node: + # + # d = REXML::Document.new('foobar') + # a = d.root + # a.add_text('baz') + # a.to_a # => ["foo", , "barbaz"] + # a.add_text('baz') + # a.to_a # => ["foo", , "barbazbaz"] + # + # When text node argument +text_node+ is given, + # appends the node as the last text node in the element; + # returns +self+: + # + # d = REXML::Document.new('foobar') + # a = d.root + # a.add_text(REXML::Text.new('baz')) + # a.to_a # => ["foo", , "bar", "baz"] + # a.add_text(REXML::Text.new('baz')) + # a.to_a # => ["foo", , "bar", "baz", "baz"] + # + def add_text( text ) + if text.kind_of? String + if @children[-1].kind_of? Text + @children[-1] << text + return + end + text = Text.new( text, whitespace(), nil, raw() ) + end + self << text unless text.nil? + self + end + + # :call-seq: + # node_type -> :element + # + # Returns symbol :element: + # + # d = REXML::Document.new('') + # a = d.root # => + # a.node_type # => :element + # + def node_type + :element + end + + # :call-seq: + # xpath -> string_xpath + # + # Returns the string xpath to the element + # relative to the most distant parent: + # + # d = REXML::Document.new('') + # a = d.root # => ... + # b = a[0] # => ... + # c = b[0] # => + # d.xpath # => "" + # a.xpath # => "/a" + # b.xpath # => "/a/b" + # c.xpath # => "/a/b/c" + # + # If there is no parent, returns the expanded name of the element: + # + # e = REXML::Element.new('foo') + # e.xpath # => "foo" + # + def xpath + path_elements = [] + cur = self + path_elements << __to_xpath_helper( self ) + while cur.parent + cur = cur.parent + path_elements << __to_xpath_helper( cur ) + end + path_elements.reverse.join( "/" ) + end + + ################################################# + # Attributes # + ################################################# + + # :call-seq: + # [index] -> object + # [attr_name] -> attr_value + # [attr_sym] -> attr_value + # + # With integer argument +index+ given, + # returns the child at offset +index+, or +nil+ if none: + # + # d = REXML::Document.new '>textmore
    ' + # root = d.root + # (0..root.size).each do |index| + # node = root[index] + # p "#{index}: #{node} (#{node.class})" + # end + # + # Output: + # + # "0: (REXML::Element)" + # "1: text (REXML::Text)" + # "2: (REXML::Element)" + # "3: more (REXML::Text)" + # "4: (REXML::Element)" + # "5: (NilClass)" + # + # With string argument +attr_name+ given, + # returns the string value for the given attribute name if it exists, + # otherwise +nil+: + # + # d = REXML::Document.new('') + # root = d.root + # root['attr'] # => "value" + # root['nosuch'] # => nil + # + # With symbol argument +attr_sym+ given, + # returns [attr_sym.to_s]: + # + # root[:attr] # => "value" + # root[:nosuch] # => nil + # + def [](name_or_index) + case name_or_index + when String + attributes[name_or_index] + when Symbol + attributes[name_or_index.to_s] + else + super + end + end + + + # :call-seq: + # attribute(name, namespace = nil) + # + # Returns the string value for the given attribute name. + # + # With only argument +name+ given, + # returns the value of the named attribute if it exists, otherwise +nil+: + # + # xml_string = <<-EOT + # + # + # + # + #
    + # EOT + # d = REXML::Document.new(xml_string) + # root = d.root + # a = root[1] # => + # a.attribute('attr') # => attr='value' + # a.attribute('nope') # => nil + # + # With arguments +name+ and +namespace+ given, + # returns the value of the named attribute if it exists, otherwise +nil+: + # + # xml_string = "" + # document = REXML::Document.new(xml_string) + # document.root.attribute("x") # => x='x' + # document.root.attribute("x", "a") # => a:x='a:x' + # + def attribute( name, namespace=nil ) + prefix = namespaces.key(namespace) if namespace + prefix = nil if prefix == 'xmlns' + + ret_val = + attributes.get_attribute( prefix ? "#{prefix}:#{name}" : name ) + + return ret_val unless ret_val.nil? + return nil if prefix.nil? + + # now check that prefix'es namespace is not the same as the + # default namespace + return nil unless ( namespaces[ prefix ] == namespaces[ 'xmlns' ] ) + + attributes.get_attribute( name ) + end + + # :call-seq: + # has_attributes? -> true or false + # + # Returns +true+ if the element has attributes, +false+ otherwise: + # + # d = REXML::Document.new('') + # a, b = *d.root + # a.has_attributes? # => true + # b.has_attributes? # => false + # + def has_attributes? + !@attributes.empty? + end + + # :call-seq: + # add_attribute(name, value) -> value + # add_attribute(attribute) -> attribute + # + # Adds an attribute to this element, overwriting any existing attribute + # by the same name. + # + # With string argument +name+ and object +value+ are given, + # adds the attribute created with that name and value: + # + # e = REXML::Element.new + # e.add_attribute('attr', 'value') # => "value" + # e['attr'] # => "value" + # e.add_attribute('attr', 'VALUE') # => "VALUE" + # e['attr'] # => "VALUE" + # + # With only attribute object +attribute+ given, + # adds the given attribute: + # + # a = REXML::Attribute.new('attr', 'value') + # e.add_attribute(a) # => attr='value' + # e['attr'] # => "value" + # a = REXML::Attribute.new('attr', 'VALUE') + # e.add_attribute(a) # => attr='VALUE' + # e['attr'] # => "VALUE" + # + def add_attribute( key, value=nil ) + if key.kind_of? Attribute + @attributes << key + else + @attributes[key] = value + end + end + + # :call-seq: + # add_attributes(hash) -> hash + # add_attributes(array) + # + # Adds zero or more attributes to the element; + # returns the argument. + # + # If hash argument +hash+ is given, + # each key must be a string; + # adds each attribute created with the key/value pair: + # + # e = REXML::Element.new + # h = {'foo' => 'bar', 'baz' => 'bat'} + # e.add_attributes(h) + # + # If argument +array+ is given, + # each array member must be a 2-element array [name, value]; + # each name must be a string: + # + # e = REXML::Element.new + # a = [['foo' => 'bar'], ['baz' => 'bat']] + # e.add_attributes(a) + # + def add_attributes hash + if hash.kind_of? Hash + hash.each_pair {|key, value| @attributes[key] = value } + elsif hash.kind_of? Array + hash.each { |value| @attributes[ value[0] ] = value[1] } + end + end + + # :call-seq: + # delete_attribute(name) -> removed_attribute or nil + # + # Removes a named attribute if it exists; + # returns the removed attribute if found, otherwise +nil+: + # + # e = REXML::Element.new('foo') + # e.add_attribute('bar', 'baz') + # e.delete_attribute('bar') # => + # e.delete_attribute('bar') # => nil + # + def delete_attribute(key) + attr = @attributes.get_attribute(key) + attr.remove unless attr.nil? + end + + ################################################# + # Other Utilities # + ################################################# + + # :call-seq: + # cdatas -> array_of_cdata_children + # + # Returns a frozen array of the REXML::CData children of the element: + # + # xml_string = <<-EOT + # + # + # + # + # EOT + # d = REXML::Document.new(xml_string) + # cds = d.root.cdatas # => ["foo", "bar"] + # cds.frozen? # => true + # cds.map {|cd| cd.class } # => [REXML::CData, REXML::CData] + # + def cdatas + find_all { |child| child.kind_of? CData }.freeze + end + + # :call-seq: + # comments -> array_of_comment_children + # + # Returns a frozen array of the REXML::Comment children of the element: + # + # xml_string = <<-EOT + # + # + # + # + # EOT + # d = REXML::Document.new(xml_string) + # cs = d.root.comments + # cs.frozen? # => true + # cs.map {|c| c.class } # => [REXML::Comment, REXML::Comment] + # cs.map {|c| c.to_s } # => ["foo", "bar"] + # + def comments + find_all { |child| child.kind_of? Comment }.freeze + end + + # :call-seq: + # instructions -> array_of_instruction_children + # + # Returns a frozen array of the REXML::Instruction children of the element: + # + # xml_string = <<-EOT + # + # + # + # + # EOT + # d = REXML::Document.new(xml_string) + # is = d.root.instructions + # is.frozen? # => true + # is.map {|i| i.class } # => [REXML::Instruction, REXML::Instruction] + # is.map {|i| i.to_s } # => ["", ""] + # + def instructions + find_all { |child| child.kind_of? Instruction }.freeze + end + + # :call-seq: + # texts -> array_of_text_children + # + # Returns a frozen array of the REXML::Text children of the element: + # + # xml_string = 'textmore' + # d = REXML::Document.new(xml_string) + # ts = d.root.texts + # ts.frozen? # => true + # ts.map {|t| t.class } # => [REXML::Text, REXML::Text] + # ts.map {|t| t.to_s } # => ["text", "more"] + # + def texts + find_all { |child| child.kind_of? Text }.freeze + end + + # == DEPRECATED + # See REXML::Formatters + # + # Writes out this element, and recursively, all children. + # output:: + # output an object which supports '<< string'; this is where the + # document will be written. + # indent:: + # An integer. If -1, no indenting will be used; otherwise, the + # indentation will be this number of spaces, and children will be + # indented an additional amount. Defaults to -1 + # transitive:: + # If transitive is true and indent is >= 0, then the output will be + # pretty-printed in such a way that the added whitespace does not affect + # the parse tree of the document + # ie_hack:: + # This hack inserts a space before the /> on empty tags to address + # a limitation of Internet Explorer. Defaults to false + # + # out = '' + # doc.write( out ) #-> doc is written to the string 'out' + # doc.write( $stdout ) #-> doc written to the console + def write(output=$stdout, indent=-1, transitive=false, ie_hack=false) + Kernel.warn("#{self.class.name}#write is deprecated. See REXML::Formatters", uplevel: 1) + formatter = if indent > -1 + if transitive + require_relative "formatters/transitive" + REXML::Formatters::Transitive.new( indent, ie_hack ) + else + REXML::Formatters::Pretty.new( indent, ie_hack ) + end + else + REXML::Formatters::Default.new( ie_hack ) + end + formatter.write( self, output ) + end + + private + def calculate_namespaces + if parent + parent.namespaces.merge(attributes.namespaces) + else + attributes.namespaces + end + end + + def __to_xpath_helper node + rv = node.expanded_name.clone + if node.parent + results = node.parent.find_all {|n| + n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name + } + if results.length > 1 + idx = results.index( node ) + rv << "[#{idx+1}]" + end + end + rv + end + + # A private helper method + def each_with_something( test, max=0, name=nil ) + num = 0 + @elements.each( name ){ |child| + yield child if test.call(child) and num += 1 + return if max>0 and num == max + } + end + end + + ######################################################################## + # ELEMENTS # + ######################################################################## + + # A class which provides filtering of children for Elements, and + # XPath search support. You are expected to only encounter this class as + # the element.elements object. Therefore, you are + # _not_ expected to instantiate this yourself. + # + # xml_string = <<-EOT + # + # + # + # Everyday Italian + # Giada De Laurentiis + # 2005 + # 30.00 + # + # + # Harry Potter + # J K. Rowling + # 2005 + # 29.99 + # + # + # XQuery Kick Start + # James McGovern + # Per Bothner + # Kurt Cagle + # James Linn + # Vaidyanathan Nagarajan + # 2003 + # 49.99 + # + # + # Learning XML + # Erik T. Ray + # 2003 + # 39.95 + # + # + # EOT + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements # => # ... > + # + class Elements + include Enumerable + # :call-seq: + # new(parent) -> new_elements_object + # + # Returns a new \Elements object with the given +parent+. + # Does _not_ assign parent.elements = self: + # + # d = REXML::Document.new(xml_string) + # eles = REXML::Elements.new(d.root) + # eles # => # ... > + # eles == d.root.elements # => false + # + def initialize parent + @element = parent + end + + # :call-seq: + # parent + # + # Returns the parent element cited in creating the \Elements object. + # This element is also the default starting point for searching + # in the \Elements object. + # + # d = REXML::Document.new(xml_string) + # elements = REXML::Elements.new(d.root) + # elements.parent == d.root # => true + # + def parent + @element + end + + # :call-seq: + # elements[index] -> element or nil + # elements[xpath] -> element or nil + # elements[n, name] -> element or nil + # + # Returns the first \Element object selected by the arguments, + # if any found, or +nil+ if none found. + # + # Notes: + # - The +index+ is 1-based, not 0-based, so that: + # - The first element has index 1 + # - The _nth_ element has index +n+. + # - The selection ignores non-\Element nodes. + # + # When the single argument +index+ is given, + # returns the element given by the index, if any; otherwise, +nil+: + # + # d = REXML::Document.new(xml_string) + # eles = d.root.elements + # eles # => # ... > + # eles[1] # => ... + # eles.size # => 4 + # eles[4] # => ... + # eles[5] # => nil + # + # The node at this index is not an \Element, and so is not returned: + # + # eles = d.root.first.first # => ... </> + # eles.to_a # => ["Everyday Italian"] + # eles[1] # => nil + # + # When the single argument +xpath+ is given, + # returns the first element found via that +xpath+, if any; otherwise, +nil+: + # + # eles = d.root.elements # => #<REXML::Elements @element=<bookstore> ... </>> + # eles['/bookstore'] # => <bookstore> ... </> + # eles['//book'] # => <book category='cooking'> ... </> + # eles['//book [@category="children"]'] # => <book category='children'> ... </> + # eles['/nosuch'] # => nil + # eles['//nosuch'] # => nil + # eles['//book [@category="nosuch"]'] # => nil + # eles['.'] # => <bookstore> ... </> + # eles['..'].class # => REXML::Document + # + # With arguments +n+ and +name+ given, + # returns the _nth_ found element that has the given +name+, + # or +nil+ if there is no such _nth_ element: + # + # eles = d.root.elements # => #<REXML::Elements @element=<bookstore> ... </>> + # eles[1, 'book'] # => <book category='cooking'> ... </> + # eles[4, 'book'] # => <book category='web' cover='paperback'> ... </> + # eles[5, 'book'] # => nil + # + def []( index, name=nil) + if index.kind_of? Integer + raise "index (#{index}) must be >= 1" if index < 1 + name = literalize(name) if name + num = 0 + @element.find { |child| + child.kind_of? Element and + (name.nil? ? true : child.has_name?( name )) and + (num += 1) == index + } + else + XPath::first( @element, index ) + end + end + + # :call-seq: + # elements[] = index, replacement_element -> replacement_element or nil + # + # Replaces or adds an element. + # + # When <tt>eles[index]</tt> exists, replaces it with +replacement_element+ + # and returns +replacement_element+: + # + # d = REXML::Document.new(xml_string) + # eles = d.root.elements # => #<REXML::Elements @element=<bookstore> ... </>> + # eles[1] # => <book category='cooking'> ... </> + # eles[1] = REXML::Element.new('foo') + # eles[1] # => <foo/> + # + # Does nothing (or raises an exception) + # if +replacement_element+ is not an \Element: + # eles[2] # => <book category='web' cover='paperback'> ... </> + # eles[2] = REXML::Text.new('bar') + # eles[2] # => <book category='web' cover='paperback'> ... </> + # + # When <tt>eles[index]</tt> does not exist, + # adds +replacement_element+ to the element and returns + # + # d = REXML::Document.new(xml_string) + # eles = d.root.elements # => #<REXML::Elements @element=<bookstore> ... </>> + # eles.size # => 4 + # eles[50] = REXML::Element.new('foo') # => <foo/> + # eles.size # => 5 + # eles[5] # => <foo/> + # + # Does nothing (or raises an exception) + # if +replacement_element+ is not an \Element: + # + # eles[50] = REXML::Text.new('bar') # => "bar" + # eles.size # => 5 + # + def []=( index, element ) + previous = self[index] + if previous.nil? + @element.add element + else + previous.replace_with element + end + previous + end + + # :call-seq: + # empty? -> true or false + # + # Returns +true+ if there are no children, +false+ otherwise. + # + # d = REXML::Document.new('') + # d.elements.empty? # => true + # d = REXML::Document.new(xml_string) + # d.elements.empty? # => false + # + def empty? + @element.find{ |child| child.kind_of? Element}.nil? + end + + # :call-seq: + # index(element) + # + # Returns the 1-based index of the given +element+, if found; + # otherwise, returns -1: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # ele_1, ele_2, ele_3, ele_4 = *elements + # elements.index(ele_4) # => 4 + # elements.delete(ele_3) + # elements.index(ele_4) # => 3 + # elements.index(ele_3) # => -1 + # + def index element + rv = 0 + found = @element.find do |child| + child.kind_of? Element and + (rv += 1) and + child == element + end + return rv if found == element + -1 + end + + # :call-seq: + # delete(index) -> removed_element or nil + # delete(element) -> removed_element or nil + # delete(xpath) -> removed_element or nil + # + # Removes an element; returns the removed element, or +nil+ if none removed. + # + # With integer argument +index+ given, + # removes the child element at that offset: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.size # => 4 + # elements[2] # => <book category='children'> ... </> + # elements.delete(2) # => <book category='children'> ... </> + # elements.size # => 3 + # elements[2] # => <book category='web'> ... </> + # elements.delete(50) # => nil + # + # With element argument +element+ given, + # removes that child element: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # ele_1, ele_2, ele_3, ele_4 = *elements + # elements.size # => 4 + # elements[2] # => <book category='children'> ... </> + # elements.delete(ele_2) # => <book category='children'> ... </> + # elements.size # => 3 + # elements[2] # => <book category='web'> ... </> + # elements.delete(ele_2) # => nil + # + # With string argument +xpath+ given, + # removes the first element found via that xpath: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.delete('//book') # => <book category='cooking'> ... </> + # elements.delete('//book [@category="children"]') # => <book category='children'> ... </> + # elements.delete('//nosuch') # => nil + # + def delete element + if element.kind_of? Element + @element.delete element + else + el = self[element] + el.remove if el + end + end + + # :call-seq: + # delete_all(xpath) + # + # Removes all elements found via the given +xpath+; + # returns the array of removed elements, if any, else +nil+. + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.size # => 4 + # deleted_elements = elements.delete_all('//book [@category="web"]') + # deleted_elements.size # => 2 + # elements.size # => 2 + # deleted_elements = elements.delete_all('//book') + # deleted_elements.size # => 2 + # elements.size # => 0 + # elements.delete_all('//book') # => [] + # + def delete_all( xpath ) + rv = [] + XPath::each( @element, xpath) {|element| + rv << element if element.kind_of? Element + } + rv.each do |element| + @element.delete element + element.remove + end + rv + end + + # :call-seq: + # add -> new_element + # add(name) -> new_element + # add(element) -> element + # + # Adds an element; returns the element added. + # + # With no argument, creates and adds a new element. + # The new element has: + # + # - No name. + # - \Parent from the \Elements object. + # - Context from the that parent. + # + # Example: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # parent = elements.parent # => <bookstore> ... </> + # parent.context = {raw: :all} + # elements.size # => 4 + # new_element = elements.add # => </> + # elements.size # => 5 + # new_element.name # => nil + # new_element.parent # => <bookstore> ... </> + # new_element.context # => {:raw=>:all} + # + # With string argument +name+, creates and adds a new element. + # The new element has: + # + # - Name +name+. + # - \Parent from the \Elements object. + # - Context from the that parent. + # + # Example: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # parent = elements.parent # => <bookstore> ... </> + # parent.context = {raw: :all} + # elements.size # => 4 + # new_element = elements.add('foo') # => <foo/> + # elements.size # => 5 + # new_element.name # => "foo" + # new_element.parent # => <bookstore> ... </> + # new_element.context # => {:raw=>:all} + # + # With argument +element+, + # creates and adds a clone of the given +element+. + # The new element has name, parent, and context from the given +element+. + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.size # => 4 + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new('bar', e0, {raw: :all}) + # element = elements.add(e1) # => <bar/> + # elements.size # => 5 + # element.name # => "bar" + # element.parent # => <bookstore> ... </> + # element.context # => {:raw=>:all} + # + def add element=nil + if element.nil? + Element.new("", self, @element.context) + elsif not element.kind_of?(Element) + Element.new(element, self, @element.context) + else + @element << element + element.context = @element.context + element + end + end + + alias :<< :add + + # :call-seq: + # each(xpath = nil) {|element| ... } -> self + # + # Iterates over the elements. + # + # With no argument, calls the block with each element: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.each {|element| p element } + # + # Output: + # + # <book category='cooking'> ... </> + # <book category='children'> ... </> + # <book category='web'> ... </> + # <book category='web' cover='paperback'> ... </> + # + # With argument +xpath+, calls the block with each element + # that matches the given +xpath+: + # + # elements.each('//book [@category="web"]') {|element| p element } + # + # Output: + # + # <book category='web'> ... </> + # <book category='web' cover='paperback'> ... </> + # + def each( xpath=nil ) + XPath::each( @element, xpath ) {|e| yield e if e.kind_of? Element } + end + + # :call-seq: + # collect(xpath = nil) {|element| ... } -> array + # + # Iterates over the elements; returns the array of block return values. + # + # With no argument, iterates over all elements: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.collect {|element| element.size } # => [9, 9, 17, 9] + # + # With argument +xpath+, iterates over elements that match + # the given +xpath+: + # + # xpath = '//book [@category="web"]' + # elements.collect(xpath) {|element| element.size } # => [17, 9] + # + def collect( xpath=nil ) + collection = [] + XPath::each( @element, xpath ) {|e| + collection << yield(e) if e.kind_of?(Element) + } + collection + end + + # :call-seq: + # inject(xpath = nil, initial = nil) -> object + # + # Calls the block with elements; returns the last block return value. + # + # With no argument, iterates over the elements, calling the block + # <tt>elements.size - 1</tt> times. + # + # - The first call passes the first and second elements. + # - The second call passes the first block return value and the third element. + # - The third call passes the second block return value and the fourth element. + # - And so on. + # + # In this example, the block returns the passed element, + # which is then the object argument to the next call: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.inject do |object, element| + # p [elements.index(object), elements.index(element)] + # element + # end + # + # Output: + # + # [1, 2] + # [2, 3] + # [3, 4] + # + # With the single argument +xpath+, calls the block only with + # elements matching that xpath: + # + # elements.inject('//book [@category="web"]') do |object, element| + # p [elements.index(object), elements.index(element)] + # element + # end + # + # Output: + # + # [3, 4] + # + # With argument +xpath+ given as +nil+ + # and argument +initial+ also given, + # calls the block once for each element. + # + # - The first call passes the +initial+ and the first element. + # - The second call passes the first block return value and the second element. + # - The third call passes the second block return value and the third element. + # - And so on. + # + # In this example, the first object index is <tt>-1</tt> + # + # elements.inject(nil, 'Initial') do |object, element| + # p [elements.index(object), elements.index(element)] + # element + # end + # + # Output: + # + # [-1, 1] + # [1, 2] + # [2, 3] + # [3, 4] + # + # In this form the passed object can be used as an accumulator: + # + # elements.inject(nil, 0) do |total, element| + # total += element.size + # end # => 44 + # + # With both arguments +xpath+ and +initial+ are given, + # calls the block only with elements matching that xpath: + # + # elements.inject('//book [@category="web"]', 0) do |total, element| + # total += element.size + # end # => 26 + # + def inject( xpath=nil, initial=nil ) + first = true + XPath::each( @element, xpath ) {|e| + if (e.kind_of? Element) + if (first and initial == nil) + initial = e + first = false + else + initial = yield( initial, e ) if e.kind_of? Element + end + end + } + initial + end + + # :call-seq: + # size -> integer + # + # Returns the count of \Element children: + # + # d = REXML::Document.new '<a>sean<b/>elliott<b/>russell<b/></a>' + # d.root.elements.size # => 3 # Three elements. + # d.root.size # => 6 # Three elements plus three text nodes.. + # + def size + count = 0 + @element.each {|child| count+=1 if child.kind_of? Element } + count + end + + # :call-seq: + # to_a(xpath = nil) -> array_of_elements + # + # Returns an array of element children (not including non-element children). + # + # With no argument, returns an array of all element children: + # + # d = REXML::Document.new '<a>sean<b/>elliott<c/></a>' + # elements = d.root.elements + # elements.to_a # => [<b/>, <c/>] # Omits non-element children. + # children = d.root.children + # children # => ["sean", <b/>, "elliott", <c/>] # Includes non-element children. + # + # With argument +xpath+, returns an array of element children + # that match the xpath: + # + # elements.to_a('//c') # => [<c/>] + # + def to_a( xpath=nil ) + rv = XPath.match( @element, xpath ) + return rv.find_all{|e| e.kind_of? Element} if xpath + rv + end + + private + # Private helper class. Removes quotes from quoted strings + def literalize name + name = name[1..-2] if name[0] == ?' or name[0] == ?" #' + name + end + end + + ######################################################################## + # ATTRIBUTES # + ######################################################################## + + # A class that defines the set of Attributes of an Element and provides + # operations for accessing elements in that set. + class Attributes < Hash + + # :call-seq: + # new(element) + # + # Creates and returns a new \REXML::Attributes object. + # The element given by argument +element+ is stored, + # but its own attributes are not modified: + # + # ele = REXML::Element.new('foo') + # attrs = REXML::Attributes.new(ele) + # attrs.object_id == ele.attributes.object_id # => false + # + # Other instance methods in class \REXML::Attributes may refer to: + # + # - +element.document+. + # - +element.prefix+. + # - +element.expanded_name+. + # + def initialize element + @element = element + end + + # :call-seq: + # [name] -> attribute_value or nil + # + # Returns the value for the attribute given by +name+, + # if it exists; otherwise +nil+. + # The value returned is the unnormalized attribute value, + # with entities expanded: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # ele.attributes['att'] # => "<" + # ele.attributes['bar:att'] # => "2" + # ele.attributes['nosuch'] # => nil + # + # Related: get_attribute (returns an \Attribute object). + # + def [](name) + attr = get_attribute(name) + attr&.value + end + + # :call-seq: + # to_a -> array_of_attribute_objects + # + # Returns an array of \REXML::Attribute objects representing + # the attributes: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # attrs = ele.attributes.to_a # => [foo:att='1', bar:att='2', att='<'] + # attrs.first.class # => REXML::Attribute + # + def to_a + enum_for(:each_attribute).to_a + end + + # :call-seq: + # length + # + # Returns the count of attributes: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # ele.attributes.length # => 3 + # + def length + c = 0 + each_attribute { c+=1 } + c + end + alias :size :length + + # :call-seq: + # each_attribute {|attr| ... } + # + # Calls the given block with each \REXML::Attribute object: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # ele.attributes.each_attribute do |attr| + # p [attr.class, attr] + # end + # + # Output: + # + # [REXML::Attribute, foo:att='1'] + # [REXML::Attribute, bar:att='2'] + # [REXML::Attribute, att='<'] + # + def each_attribute # :yields: attribute + return to_enum(__method__) unless block_given? + each_value do |val| + if val.kind_of? Attribute + yield val + else + val.each_value { |atr| yield atr } + end + end + end + + # :call-seq: + # each {|expanded_name, value| ... } + # + # Calls the given block with each expanded-name/value pair: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # ele.attributes.each do |expanded_name, value| + # p [expanded_name, value] + # end + # + # Output: + # + # ["foo:att", "1"] + # ["bar:att", "2"] + # ["att", "<"] + # + def each + return to_enum(__method__) unless block_given? + each_attribute do |attr| + yield [attr.expanded_name, attr.value] + end + end + + # :call-seq: + # get_attribute(name) -> attribute_object or nil + # + # Returns the \REXML::Attribute object for the given +name+: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # attrs = ele.attributes + # attrs.get_attribute('foo:att') # => foo:att='1' + # attrs.get_attribute('foo:att').class # => REXML::Attribute + # attrs.get_attribute('bar:att') # => bar:att='2' + # attrs.get_attribute('att') # => att='<' + # attrs.get_attribute('nosuch') # => nil + # + def get_attribute( name ) + attr = fetch( name, nil ) + if attr.nil? + return nil if name.nil? + # Look for prefix + name =~ Namespace::NAMESPLIT + prefix, n = $1, $2 + if prefix + attr = fetch( n, nil ) + # check prefix + if attr == nil + elsif attr.kind_of? Attribute + return attr if prefix == attr.prefix + else + attr = attr[ prefix ] + return attr + end + end + doctype = @element.document&.doctype + if doctype + expn = @element.expanded_name + expn = doctype.name if expn.size == 0 + attr_val = doctype.attribute_of(expn, name) + return Attribute.new( name, attr_val ) if attr_val + end + return nil + end + if attr.kind_of? Hash + attr = attr[ @element.prefix ] + end + attr + end + + # :call-seq: + # [name] = value -> value + # + # When +value+ is non-+nil+, + # assigns that to the attribute for the given +name+, + # overwriting the previous value if it exists: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # attrs = ele.attributes + # attrs['foo:att'] = '2' # => "2" + # attrs['baz:att'] = '3' # => "3" + # + # When +value+ is +nil+, deletes the attribute if it exists: + # + # attrs['baz:att'] = nil + # attrs.include?('baz:att') # => false + # + def []=( name, value ) + if value.nil? # Delete the named attribute + attr = get_attribute(name) + delete attr + return + end + + unless value.kind_of? Attribute + doctype = @element.document&.doctype + if doctype + value = Text::normalize( value, doctype ) + else + value = Text::normalize( value, nil ) + end + value = Attribute.new(name, value) + end + value.element = @element + old_attr = fetch(value.name, nil) + if old_attr.nil? + store(value.name, value) + elsif old_attr.kind_of? Hash + old_attr[value.prefix] = value + elsif old_attr.prefix != value.prefix + store value.name, {old_attr.prefix => old_attr, + value.prefix => value} + else + store value.name, value + end + @element + end + + # :call-seq: + # prefixes -> array_of_prefix_strings + # + # Returns an array of prefix strings in the attributes. + # The array does not include the default + # namespace declaration, if one exists. + # + # xml_string = '<a xmlns="foo" xmlns:x="bar" xmlns:y="twee" z="glorp"/>' + # d = REXML::Document.new(xml_string) + # d.root.attributes.prefixes # => ["x", "y"] + # + def prefixes + ns = [] + each_attribute do |attribute| + ns << attribute.name if attribute.prefix == 'xmlns' + end + doctype = @element.document&.doctype + if doctype + expn = @element.expanded_name + expn = doctype.name if expn.size == 0 + doctype.attributes_of(expn).each { + |attribute| + ns << attribute.name if attribute.prefix == 'xmlns' + } + end + ns + end + + # :call-seq: + # namespaces + # + # Returns a hash of name/value pairs for the namespaces: + # + # xml_string = '<a xmlns="foo" xmlns:x="bar" xmlns:y="twee" z="glorp"/>' + # d = REXML::Document.new(xml_string) + # d.root.attributes.namespaces # => {"xmlns"=>"foo", "x"=>"bar", "y"=>"twee"} + # + def namespaces + namespaces = {} + each_attribute do |attribute| + namespaces[attribute.name] = attribute.value if attribute.prefix == 'xmlns' or attribute.name == 'xmlns' + end + doctype = @element.document&.doctype + if doctype + expn = @element.expanded_name + expn = doctype.name if expn.size == 0 + doctype.attributes_of(expn).each { + |attribute| + namespaces[attribute.name] = attribute.value if attribute.prefix == 'xmlns' or attribute.name == 'xmlns' + } + end + namespaces + end + + # :call-seq: + # delete(name) -> element + # delete(attribute) -> element + # + # Removes a specified attribute if it exists; + # returns the attributes' element. + # + # When string argument +name+ is given, + # removes the attribute of that name if it exists: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # attrs = ele.attributes + # attrs.delete('foo:att') # => <ele bar:att='2' att='<'/> + # attrs.delete('foo:att') # => <ele bar:att='2' att='<'/> + # + # When attribute argument +attribute+ is given, + # removes that attribute if it exists: + # + # attr = REXML::Attribute.new('bar:att', '2') + # attrs.delete(attr) # => <ele att='<'/> # => <ele att='<'/> + # attrs.delete(attr) # => <ele att='<'/> # => <ele/> + # + def delete( attribute ) + name = nil + prefix = nil + if attribute.kind_of? Attribute + name = attribute.name + prefix = attribute.prefix + else + attribute =~ Namespace::NAMESPLIT + prefix, name = $1, $2 + prefix = '' unless prefix + end + old = fetch(name, nil) + if old.kind_of? Hash # the supplied attribute is one of many + old.delete(prefix) + if old.size == 1 + repl = nil + old.each_value{|v| repl = v} + store name, repl + end + elsif old # the supplied attribute is a top-level one + super(name) + end + @element + end + + # :call-seq: + # add(attribute) -> attribute + # + # Adds attribute +attribute+, replacing the previous + # attribute of the same name if it exists; + # returns +attribute+: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # attrs = ele.attributes + # attrs # => {"att"=>{"foo"=>foo:att='1', "bar"=>bar:att='2', ""=>att='<'}} + # attrs.add(REXML::Attribute.new('foo:att', '2')) # => foo:att='2' + # attrs.add(REXML::Attribute.new('baz', '3')) # => baz='3' + # attrs.include?('baz') # => true + # + def add( attribute ) + self[attribute.name] = attribute + end + + alias :<< :add + + # :call-seq: + # delete_all(name) -> array_of_removed_attributes + # + # Removes all attributes matching the given +name+; + # returns an array of the removed attributes: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # attrs = ele.attributes + # attrs.delete_all('att') # => [att='<'] + # + def delete_all( name ) + rv = [] + each_attribute { |attribute| + rv << attribute if attribute.expanded_name == name + } + rv.each{ |attr| attr.remove } + rv + end + + # :call-seq: + # get_attribute_ns(namespace, name) + # + # Returns the \REXML::Attribute object among the attributes + # that matches the given +namespace+ and +name+: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='<'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='<'/> + # attrs = ele.attributes + # attrs.get_attribute_ns('http://foo', 'att') # => foo:att='1' + # attrs.get_attribute_ns('http://foo', 'nosuch') # => nil + # + def get_attribute_ns(namespace, name) + result = nil + each_attribute() { |attribute| + if name == attribute.name && + namespace == attribute.namespace() && + ( !namespace.empty? || !attribute.fully_expanded_name.index(':') ) + # foo will match xmlns:foo, but only if foo isn't also an attribute + result = attribute if !result or !namespace.empty? or + !attribute.fully_expanded_name.index(':') + end + } + result + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/encoding.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/encoding.rb new file mode 100644 index 000000000..7eb05f4da --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/encoding.rb @@ -0,0 +1,48 @@ +# coding: US-ASCII +# frozen_string_literal: false +module REXML + module Encoding + # ID ---> Encoding name + attr_reader :encoding + def encoding=(encoding) + encoding = encoding.name if encoding.is_a?(::Encoding) + if encoding.is_a?(String) + original_encoding = encoding + encoding = find_encoding(encoding) + unless encoding + raise ArgumentError, "Bad encoding name #{original_encoding}" + end + end + encoding = encoding.upcase if encoding + return false if defined?(@encoding) and encoding == @encoding + @encoding = encoding || "UTF-8" + true + end + + def encode(string) + string.encode(@encoding) + end + + def decode(string) + string.encode(::Encoding::UTF_8, @encoding) + end + + private + def find_encoding(name) + case name + when /\Ashift-jis\z/i + return "SHIFT_JIS" + when /\ACP-(\d+)\z/ + name = "CP#{$1}" + when /\AUTF-8\z/i + return name + end + begin + ::Encoding::Converter.search_convpath(name, 'UTF-8') + rescue ::Encoding::ConverterNotFoundError + return nil + end + name + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/entity.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/entity.rb new file mode 100644 index 000000000..1ba5a7bb7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/entity.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: false +require_relative 'child' +require_relative 'source' +require_relative 'xmltokens' + +module REXML + class Entity < Child + include XMLTokens + PUBIDCHAR = "\x20\x0D\x0Aa-zA-Z0-9\\-()+,./:=?;!*@$_%#" + SYSTEMLITERAL = %Q{((?:"[^"]*")|(?:'[^']*'))} + PUBIDLITERAL = %Q{("[#{PUBIDCHAR}']*"|'[#{PUBIDCHAR}]*')} + EXTERNALID = "(?:(?:(SYSTEM)\\s+#{SYSTEMLITERAL})|(?:(PUBLIC)\\s+#{PUBIDLITERAL}\\s+#{SYSTEMLITERAL}))" + NDATADECL = "\\s+NDATA\\s+#{NAME}" + PEREFERENCE = "%#{NAME};" + PEREFERENCE_RE = /#{PEREFERENCE}/um + ENTITYVALUE = %Q{((?:"(?:[^%&"]|#{PEREFERENCE}|#{REFERENCE})*")|(?:'([^%&']|#{PEREFERENCE}|#{REFERENCE})*'))} + PEDEF = "(?:#{ENTITYVALUE}|#{EXTERNALID})" + ENTITYDEF = "(?:#{ENTITYVALUE}|(?:#{EXTERNALID}(#{NDATADECL})?))" + PEDECL = "<!ENTITY\\s+(%)\\s+#{NAME}\\s+#{PEDEF}\\s*>" + GEDECL = "<!ENTITY\\s+#{NAME}\\s+#{ENTITYDEF}\\s*>" + ENTITYDECL = /\s*(?:#{GEDECL})|(?:#{PEDECL})/um + + attr_reader :name, :external, :ref, :ndata, :pubid, :value + + # Create a new entity. Simple entities can be constructed by passing a + # name, value to the constructor; this creates a generic, plain entity + # reference. For anything more complicated, you have to pass a Source to + # the constructor with the entity definition, or use the accessor methods. + # +WARNING+: There is no validation of entity state except when the entity + # is read from a stream. If you start poking around with the accessors, + # you can easily create a non-conformant Entity. + # + # e = Entity.new( 'amp', '&' ) + def initialize stream, value=nil, parent=nil, reference=false + super(parent) + @ndata = @pubid = @value = @external = nil + if stream.kind_of? Array + @name = stream[1] + if stream[-1] == '%' + @reference = true + stream.pop + else + @reference = false + end + if stream[2] =~ /SYSTEM|PUBLIC/ + @external = stream[2] + if @external == 'SYSTEM' + @ref = stream[3] + @ndata = stream[4] if stream.size == 5 + else + @pubid = stream[3] + @ref = stream[4] + end + else + @value = stream[2] + end + else + @reference = reference + @external = nil + @name = stream + @value = value + end + end + + # Evaluates whether the given string matches an entity definition, + # returning true if so, and false otherwise. + def Entity::matches? string + (ENTITYDECL =~ string) == 0 + end + + # Evaluates to the unnormalized value of this entity; that is, replacing + # &ent; entities. + def unnormalized + document&.record_entity_expansion + + return nil if @value.nil? + + @unnormalized = Text::unnormalize(@value, parent, + entity_expansion_text_limit: document&.entity_expansion_text_limit) + end + + #once :unnormalized + + # Returns the value of this entity unprocessed -- raw. This is the + # normalized value; that is, with all %ent; and &ent; entities intact + def normalized + @value + end + + # Write out a fully formed, correct entity definition (assuming the Entity + # object itself is valid.) + # + # out:: + # An object implementing <TT><<</TT> to which the entity will be + # output + # indent:: + # *DEPRECATED* and ignored + def write out, indent=-1 + out << '<!ENTITY ' + out << '% ' if @reference + out << @name + out << ' ' + if @external + out << @external << ' ' + if @pubid + q = @pubid.include?('"')?"'":'"' + out << q << @pubid << q << ' ' + end + q = @ref.include?('"')?"'":'"' + out << q << @ref << q + out << ' NDATA ' << @ndata if @ndata + else + q = @value.include?('"')?"'":'"' + out << q << @value << q + end + out << '>' + end + + # Returns this entity as a string. See write(). + def to_s + rv = '' + write rv + rv + end + end + + # This is a set of entity constants -- the ones defined in the XML + # specification. These are +gt+, +lt+, +amp+, +quot+ and +apos+. + # CAUTION: these entities does not have parent and document + module EntityConst + # +>+ + GT = Entity.new( 'gt', '>' ) + # +<+ + LT = Entity.new( 'lt', '<' ) + # +&+ + AMP = Entity.new( 'amp', '&' ) + # +"+ + QUOT = Entity.new( 'quot', '"' ) + # +'+ + APOS = Entity.new( 'apos', "'" ) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/default.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/default.rb new file mode 100644 index 000000000..811b2ff3d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/default.rb @@ -0,0 +1,116 @@ +# frozen_string_literal: false + +module REXML + module Formatters + class Default + # Prints out the XML document with no formatting -- except if ie_hack is + # set. + # + # ie_hack:: + # If set to true, then inserts whitespace before the close of an empty + # tag, so that IE's bad XML parser doesn't choke. + def initialize( ie_hack=false ) + @ie_hack = ie_hack + end + + # Writes the node to some output. + # + # node:: + # The node to write + # output:: + # A class implementing <TT><<</TT>. Pass in an Output object to + # change the output encoding. + def write( node, output ) + case node + + when Document + if node.xml_decl.encoding != 'UTF-8' && !output.kind_of?(Output) + output = Output.new( output, node.xml_decl.encoding ) + end + write_document( node, output ) + + when Element + write_element( node, output ) + + when Declaration, ElementDecl, NotationDecl, ExternalEntity, Entity, + Attribute, AttlistDecl + node.write( output,-1 ) + + when Instruction + write_instruction( node, output ) + + when DocType, XMLDecl + node.write( output ) + + when Comment + write_comment( node, output ) + + when CData + write_cdata( node, output ) + + when Text + write_text( node, output ) + + else + raise Exception.new("XML FORMATTING ERROR") + + end + end + + protected + def write_document( node, output ) + node.children.each { |child| write( child, output ) } + end + + def write_element( node, output ) + output << "<#{node.expanded_name}" + + node.attributes.to_a.map { |a| + Hash === a ? a.values : a + }.flatten.sort_by {|attr| attr.name}.each do |attr| + output << " " + attr.write( output ) + end unless node.attributes.empty? + + if node.children.empty? + output << " " if @ie_hack + output << "/" + else + output << ">" + node.children.each { |child| + write( child, output ) + } + output << "</#{node.expanded_name}" + end + output << ">" + end + + def write_text( node, output ) + output << node.to_s() + end + + def write_comment( node, output ) + output << Comment::START + output << node.to_s + output << Comment::STOP + end + + def write_cdata( node, output ) + output << CData::START + output << node.to_s + output << CData::STOP + end + + def write_instruction( node, output ) + output << Instruction::START + output << node.target + content = node.content + if content + output << ' ' + output << content + end + output << Instruction::STOP + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/pretty.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/pretty.rb new file mode 100644 index 000000000..a838d8357 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/pretty.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: true +require_relative 'default' + +module REXML + module Formatters + # Pretty-prints an XML document. This destroys whitespace in text nodes + # and will insert carriage returns and indentations. + # + # TODO: Add an option to print attributes on new lines + class Pretty < Default + + # If compact is set to true, then the formatter will attempt to use as + # little space as possible + attr_accessor :compact + # The width of a page. Used for formatting text + attr_accessor :width + + # Create a new pretty printer. + # + # output:: + # An object implementing '<<(String)', to which the output will be written. + # indentation:: + # An integer greater than 0. The indentation of each level will be + # this number of spaces. If this is < 1, the behavior of this object + # is undefined. Defaults to 2. + # ie_hack:: + # If true, the printer will insert whitespace before closing empty + # tags, thereby allowing Internet Explorer's XML parser to + # function. Defaults to false. + def initialize( indentation=2, ie_hack=false ) + @indentation = indentation + @level = 0 + @ie_hack = ie_hack + @width = 80 + @compact = false + end + + protected + def write_element(node, output) + output << ' '*@level + output << "<#{node.expanded_name}" + + node.attributes.each_attribute do |attr| + output << " " + attr.write( output ) + end unless node.attributes.empty? + + if node.children.empty? + if @ie_hack + output << " " + end + output << "/" + else + output << ">" + # If compact and all children are text, and if the formatted output + # is less than the specified width, then try to print everything on + # one line + skip = false + if compact + if node.children.inject(true) {|s,c| s & c.kind_of?(Text)} + string = +"" + old_level = @level + @level = 0 + node.children.each { |child| write( child, string ) } + @level = old_level + if string.length < @width + output << string + skip = true + end + end + end + unless skip + output << "\n" + @level += @indentation + node.children.each { |child| + next if child.kind_of?(Text) and child.to_s.strip.length == 0 + write( child, output ) + output << "\n" + } + @level -= @indentation + output << ' '*@level + end + output << "</#{node.expanded_name}" + end + output << ">" + end + + def write_text( node, output ) + s = node.to_s() + s.gsub!(/\s/,' ') + s.squeeze!(" ") + s = wrap(s, @width - @level) + s = indent_text(s, @level, " ", true) + output << (' '*@level + s) + end + + def write_comment( node, output) + output << ' ' * @level + super + end + + def write_cdata( node, output) + output << ' ' * @level + super + end + + def write_document( node, output ) + # Ok, this is a bit odd. All XML documents have an XML declaration, + # but it may not write itself if the user didn't specifically add it, + # either through the API or in the input document. If it doesn't write + # itself, then we don't need a carriage return... which makes this + # logic more complex. + node.children.each { |child| + next if child.instance_of?(Text) + unless child == node.children[0] or child.instance_of?(Text) or + (child == node.children[1] and !node.children[0].writethis) + output << "\n" + end + write( child, output ) + } + end + + private + def indent_text(string, level=1, style="\t", indentfirstline=true) + return string if level < 0 + string.gsub(/\n/, "\n#{style*level}") + end + + def wrap(string, width) + parts = [] + while string.length > width and place = string.rindex(' ', width) + parts << string[0...place] + string = string[place+1..-1] + end + parts << string + parts.join("\n") + end + + end + end +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/transitive.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/transitive.rb new file mode 100644 index 000000000..5ff51e10f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/formatters/transitive.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: false +require_relative 'pretty' + +module REXML + module Formatters + # The Transitive formatter writes an XML document that parses to an + # identical document as the source document. This means that no extra + # whitespace nodes are inserted, and whitespace within text nodes is + # preserved. Within these constraints, the document is pretty-printed, + # with whitespace inserted into the metadata to introduce formatting. + # + # Note that this is only useful if the original XML is not already + # formatted. Since this formatter does not alter whitespace nodes, the + # results of formatting already formatted XML will be odd. + class Transitive < Default + def initialize( indentation=2, ie_hack=false ) + @indentation = indentation + @level = 0 + @ie_hack = ie_hack + end + + protected + def write_element( node, output ) + output << "<#{node.expanded_name}" + + node.attributes.each_attribute do |attr| + output << " " + attr.write( output ) + end unless node.attributes.empty? + + output << "\n" + output << ' '*@level + if node.children.empty? + output << " " if @ie_hack + output << "/" + else + output << ">" + # If compact and all children are text, and if the formatted output + # is less than the specified width, then try to print everything on + # one line + @level += @indentation + node.children.each { |child| + write( child, output ) + } + @level -= @indentation + output << "</#{node.expanded_name}" + output << "\n" + output << ' '*@level + end + output << ">" + end + + def write_text( node, output ) + output << node.to_s() + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/functions.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/functions.rb new file mode 100644 index 000000000..60ae34e7a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/functions.rb @@ -0,0 +1,446 @@ +# frozen_string_literal: false +module REXML + # If you add a method, keep in mind two things: + # (1) the first argument will always be a list of nodes from which to + # filter. In the case of context methods (such as position), the function + # should return an array with a value for each child in the array. + # (2) all method calls from XML will have "-" replaced with "_". + # Therefore, in XML, "local-name()" is identical (and actually becomes) + # "local_name()" + module Functions + @@available_functions = {} + @@context = nil + @@namespace_context = {} + @@variables = {} + + INTERNAL_METHODS = [ + :namespace_context, + :namespace_context=, + :variables, + :variables=, + :context=, + :get_namespace, + :send, + ] + class << self + def singleton_method_added(name) + unless INTERNAL_METHODS.include?(name) + @@available_functions[name] = true + end + end + end + + def Functions::namespace_context=(x) ; @@namespace_context=x ; end + def Functions::variables=(x) ; @@variables=x ; end + def Functions::namespace_context ; @@namespace_context ; end + def Functions::variables ; @@variables ; end + + def Functions::context=(value); @@context = value; end + + def Functions::text( ) + if @@context[:node].node_type == :element + @@context[:node].find_all{|n| n.node_type == :text}.collect{|n| n.value} + elsif @@context[:node].node_type == :text + @@context[:node].value + else + false + end + end + + # Returns the last node of the given list of nodes. + def Functions::last( ) + @@context[:size] + end + + def Functions::position( ) + @@context[:index] + end + + # Returns the size of the given list of nodes. + def Functions::count( node_set ) + node_set.size + end + + # Since REXML is non-validating, this method is not implemented as it + # requires a DTD + def Functions::id( object ) + end + + def Functions::local_name(node_set=nil) + get_namespace(node_set) do |node| + return node.local_name + end + "" + end + + def Functions::namespace_uri( node_set=nil ) + get_namespace( node_set ) {|node| node.namespace} + end + + def Functions::name( node_set=nil ) + get_namespace( node_set ) do |node| + node.expanded_name + end + end + + # Helper method. + def Functions::get_namespace( node_set = nil ) + if node_set == nil + yield @@context[:node] if @@context[:node].respond_to?(:namespace) + else + if node_set.respond_to? :each + result = [] + node_set.each do |node| + result << yield(node) if node.respond_to?(:namespace) + end + result + elsif node_set.respond_to? :namespace + yield node_set + end + end + end + + # A node-set is converted to a string by returning the string-value of the + # node in the node-set that is first in document order. If the node-set is + # empty, an empty string is returned. + # + # A number is converted to a string as follows + # + # NaN is converted to the string NaN + # + # positive zero is converted to the string 0 + # + # negative zero is converted to the string 0 + # + # positive infinity is converted to the string Infinity + # + # negative infinity is converted to the string -Infinity + # + # if the number is an integer, the number is represented in decimal form + # as a Number with no decimal point and no leading zeros, preceded by a + # minus sign (-) if the number is negative + # + # otherwise, the number is represented in decimal form as a Number + # including a decimal point with at least one digit before the decimal + # point and at least one digit after the decimal point, preceded by a + # minus sign (-) if the number is negative; there must be no leading zeros + # before the decimal point apart possibly from the one required digit + # immediately before the decimal point; beyond the one required digit + # after the decimal point there must be as many, but only as many, more + # digits as are needed to uniquely distinguish the number from all other + # IEEE 754 numeric values. + # + # The boolean false value is converted to the string false. The boolean + # true value is converted to the string true. + # + # An object of a type other than the four basic types is converted to a + # string in a way that is dependent on that type. + def Functions::string( object=@@context[:node] ) + if object.respond_to?(:node_type) + case object.node_type + when :attribute + object.value + when :element + string_value(object) + when :document + string_value(object.root) + when :processing_instruction + object.content + else + object.to_s + end + else + case object + when Array + string(object[0]) + when Float + if object.nan? + "NaN" + else + integer = object.to_i + if object == integer + "%d" % integer + else + object.to_s + end + end + else + object.to_s + end + end + end + + # A node-set is converted to a string by + # returning the concatenation of the string-value + # of each of the children of the node in the + # node-set that is first in document order. + # If the node-set is empty, an empty string is returned. + def Functions::string_value( o ) + rv = "" + o.children.each { |e| + if e.node_type == :text + rv << e.to_s + elsif e.node_type == :element + rv << string_value( e ) + end + } + rv + end + + def Functions::concat( *objects ) + concatenated = "" + objects.each do |object| + concatenated << string(object) + end + concatenated + end + + # Fixed by Mike Stok + def Functions::starts_with( string, test ) + string(string).index(string(test)) == 0 + end + + # Fixed by Mike Stok + def Functions::contains( string, test ) + string(string).include?(string(test)) + end + + # Kouhei fixed this + def Functions::substring_before( string, test ) + ruby_string = string(string) + ruby_index = ruby_string.index(string(test)) + if ruby_index.nil? + "" + else + ruby_string[ 0...ruby_index ] + end + end + + # Kouhei fixed this too + def Functions::substring_after( string, test ) + ruby_string = string(string) + return $1 if ruby_string =~ /#{test}(.*)/ + "" + end + + # Take equal portions of Mike Stok and Sean Russell; mix + # vigorously, and pour into a tall, chilled glass. Serves 10,000. + def Functions::substring( string, start, length=nil ) + ruby_string = string(string) + ruby_length = if length.nil? + ruby_string.length.to_f + else + number(length) + end + ruby_start = number(start) + + # Handle the special cases + return '' if ( + ruby_length.nan? or + ruby_start.nan? or + ruby_start.infinite? + ) + + infinite_length = ruby_length.infinite? == 1 + ruby_length = ruby_string.length if infinite_length + + # Now, get the bounds. The XPath bounds are 1..length; the ruby bounds + # are 0..length. Therefore, we have to offset the bounds by one. + ruby_start = round(ruby_start) - 1 + ruby_length = round(ruby_length) + + if ruby_start < 0 + ruby_length += ruby_start unless infinite_length + ruby_start = 0 + end + return '' if ruby_length <= 0 + ruby_string[ruby_start,ruby_length] + end + + # UNTESTED + def Functions::string_length( string ) + string(string).length + end + + def Functions::normalize_space( string=nil ) + string = string(@@context[:node]) if string.nil? + if string.kind_of? Array + string.collect{|x| x.to_s.strip.gsub(/\s+/um, ' ') if x} + else + string.to_s.strip.gsub(/\s+/um, ' ') + end + end + + # This is entirely Mike Stok's beast + def Functions::translate( string, tr1, tr2 ) + from = string(tr1) + to = string(tr2) + + # the map is our translation table. + # + # if a character occurs more than once in the + # from string then we ignore the second & + # subsequent mappings + # + # if a character maps to nil then we delete it + # in the output. This happens if the from + # string is longer than the to string + # + # there's nothing about - or ^ being special in + # http://www.w3.org/TR/xpath#function-translate + # so we don't build ranges or negated classes + + map = Hash.new + 0.upto(from.length - 1) { |pos| + from_char = from[pos] + unless map.has_key? from_char + map[from_char] = + if pos < to.length + to[pos] + else + nil + end + end + } + + if ''.respond_to? :chars + string(string).chars.collect { |c| + if map.has_key? c then map[c] else c end + }.compact.join + else + string(string).unpack('U*').collect { |c| + if map.has_key? c then map[c] else c end + }.compact.pack('U*') + end + end + + def Functions::boolean(object=@@context[:node]) + case object + when true, false + object + when Float + return false if object.zero? + return false if object.nan? + true + when Numeric + not object.zero? + when String + not object.empty? + when Array + not object.empty? + else + object ? true : false + end + end + + # UNTESTED + def Functions::not( object ) + not boolean( object ) + end + + # UNTESTED + def Functions::true( ) + true + end + + # UNTESTED + def Functions::false( ) + false + end + + # UNTESTED + def Functions::lang( language ) + lang = false + node = @@context[:node] + attr = nil + until node.nil? + if node.node_type == :element + attr = node.attributes["xml:lang"] + unless attr.nil? + lang = compare_language(string(language), attr) + break + else + end + end + node = node.parent + end + lang + end + + def Functions::compare_language lang1, lang2 + lang2.downcase.index(lang1.downcase) == 0 + end + + # a string that consists of optional whitespace followed by an optional + # minus sign followed by a Number followed by whitespace is converted to + # the IEEE 754 number that is nearest (according to the IEEE 754 + # round-to-nearest rule) to the mathematical value represented by the + # string; any other string is converted to NaN + # + # boolean true is converted to 1; boolean false is converted to 0 + # + # a node-set is first converted to a string as if by a call to the string + # function and then converted in the same way as a string argument + # + # an object of a type other than the four basic types is converted to a + # number in a way that is dependent on that type + def Functions::number(object=@@context[:node]) + case object + when true + Float(1) + when false + Float(0) + when Array + number(string(object)) + when Numeric + object.to_f + else + str = string(object) + case str.strip + when /\A\s*(-?(?:\d+(?:\.\d*)?|\.\d+))\s*\z/ + $1.to_f + else + Float::NAN + end + end + end + + def Functions::sum( nodes ) + nodes = [nodes] unless nodes.kind_of? Array + nodes.inject(0) { |r,n| r + number(string(n)) } + end + + def Functions::floor( number ) + number(number).floor + end + + def Functions::ceiling( number ) + number(number).ceil + end + + def Functions::round( number ) + number = number(number) + begin + neg = number.negative? + number = number.abs.round + neg ? -number : number + rescue FloatDomainError + number + end + end + + def Functions::processing_instruction( node ) + node.node_type == :processing_instruction + end + + def Functions::send(name, *args) + if @@available_functions[name.to_sym] + super + else + # TODO: Maybe, this is not XPath spec behavior. + # This behavior must be reconsidered. + XPath.match(@@context[:node], name.to_s) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/instruction.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/instruction.rb new file mode 100644 index 000000000..a3dfbbec1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/instruction.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: false + +require_relative "child" +require_relative "source" + +module REXML + # Represents an XML Instruction; IE, <? ... ?> + # TODO: Add parent arg (3rd arg) to constructor + class Instruction < Child + START = "<?" + STOP = "?>" + + # target is the "name" of the Instruction; IE, the "tag" in <?tag ...?> + # content is everything else. + attr_accessor :target, :content + + # Constructs a new Instruction + # @param target can be one of a number of things. If String, then + # the target of this instruction is set to this. If an Instruction, + # then the Instruction is shallowly cloned (target and content are + # copied). + # @param content Must be either a String, or a Parent. Can only + # be a Parent if the target argument is a Source. Otherwise, this + # String is set as the content of this instruction. + def initialize(target, content=nil) + case target + when String + super() + @target = target + @content = content + when Instruction + super(content) + @target = target.target + @content = target.content + else + message = + "processing instruction target must be String or REXML::Instruction: " + message << "<#{target.inspect}>" + raise ArgumentError, message + end + @content.strip! if @content + end + + def clone + Instruction.new self + end + + # == DEPRECATED + # See the rexml/formatters package + # + def write writer, indent=-1, transitive=false, ie_hack=false + Kernel.warn( "#{self.class.name}#write is deprecated", uplevel: 1) + indent(writer, indent) + writer << START + writer << @target + if @content + writer << ' ' + writer << @content + end + writer << STOP + end + + # @return true if other is an Instruction, and the content and target + # of the other matches the target and content of this object. + def ==( other ) + other.kind_of? Instruction and + other.target == @target and + other.content == @content + end + + def node_type + :processing_instruction + end + + def inspect + "<?p-i #{target} ...?>" + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/light/node.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/light/node.rb new file mode 100644 index 000000000..3dab885b0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/light/node.rb @@ -0,0 +1,188 @@ +# frozen_string_literal: false +require_relative '../xmltokens' + +module REXML + module Light + # Represents a tagged XML element. Elements are characterized by + # having children, attributes, and names, and can themselves be + # children. + class Node + NAMESPLIT = /^(?:(#{XMLTokens::NCNAME_STR}):)?(#{XMLTokens::NCNAME_STR})/u + PARENTS = [ :element, :document, :doctype ] + # Create a new element. + def initialize node=nil + @node = node + if node.kind_of? String + node = [ :text, node ] + elsif node.nil? + node = [ :document, nil, nil ] + elsif node[0] == :start_element + node[0] = :element + elsif node[0] == :start_doctype + node[0] = :doctype + elsif node[0] == :start_document + node[0] = :document + end + end + + def size + if PARENTS.include? @node[0] + @node[-1].size + else + 0 + end + end + + def each + size.times { |x| yield( at(x+4) ) } + end + + def name + at(2) + end + + def name=( name_str, ns=nil ) + pfx = '' + pfx = "#{prefix(ns)}:" if ns + _old_put(2, "#{pfx}#{name_str}") + end + + def parent=( node ) + _old_put(1,node) + end + + def local_name + namesplit + @name + end + + def local_name=( name_str ) + _old_put( 1, "#@prefix:#{name_str}" ) + end + + def prefix( namespace=nil ) + prefix_of( self, namespace ) + end + + def namespace( prefix=prefix() ) + namespace_of( self, prefix ) + end + + def namespace=( namespace ) + @prefix = prefix( namespace ) + pfx = '' + pfx = "#@prefix:" if @prefix.size > 0 + _old_put(1, "#{pfx}#@name") + end + + def []( reference, ns=nil ) + if reference.kind_of? String + pfx = '' + pfx = "#{prefix(ns)}:" if ns + at(3)["#{pfx}#{reference}"] + elsif reference.kind_of? Range + _old_get( Range.new(4+reference.begin, reference.end, reference.exclude_end?) ) + else + _old_get( 4+reference ) + end + end + + def =~( path ) + XPath.match( self, path ) + end + + # Doesn't handle namespaces yet + def []=( reference, ns, value=nil ) + if reference.kind_of? String + value = ns unless value + at( 3 )[reference] = value + elsif reference.kind_of? Range + _old_put( Range.new(3+reference.begin, reference.end, reference.exclude_end?), ns ) + else + if value + _old_put( 4+reference, ns, value ) + else + _old_put( 4+reference, ns ) + end + end + end + + # Append a child to this element, optionally under a provided namespace. + # The namespace argument is ignored if the element argument is an Element + # object. Otherwise, the element argument is a string, the namespace (if + # provided) is the namespace the element is created in. + def << element + if node_type() == :text + at(-1) << element + else + newnode = Node.new( element ) + newnode.parent = self + self.push( newnode ) + end + at(-1) + end + + def node_type + _old_get(0) + end + + def text=( foo ) + replace = at(4).kind_of?(String)? 1 : 0 + self._old_put(4,replace, normalizefoo) + end + + def root + context = self + context = context.at(1) while context.at(1) + end + + def has_name?( name, namespace = '' ) + at(3) == name and namespace() == namespace + end + + def children + self + end + + def parent + at(1) + end + + def to_s + + end + + private + + def namesplit + return if @name.defined? + at(2) =~ NAMESPLIT + @prefix = '' || $1 + @name = $2 + end + + def namespace_of( node, prefix=nil ) + if not prefix + name = at(2) + name =~ NAMESPLIT + prefix = $1 + end + to_find = 'xmlns' + to_find = "xmlns:#{prefix}" if not prefix.nil? + ns = at(3)[ to_find ] + ns ? ns : namespace_of( @node[0], prefix ) + end + + def prefix_of( node, namespace=nil ) + if not namespace + name = node.name + name =~ NAMESPLIT + $1 + else + ns = at(3).find { |k,v| v == namespace } + ns ? ns : prefix_of( node.parent, namespace ) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/namespace.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/namespace.rb new file mode 100644 index 000000000..232b7ca48 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/namespace.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +require_relative 'xmltokens' + +module REXML + # Adds named attributes to an object. + module Namespace + # The name of the object, valid if set + attr_reader :name, :expanded_name + # The expanded name of the object, valid if name is set + attr_accessor :prefix + include XMLTokens + NAME_WITHOUT_NAMESPACE = /\A#{NCNAME_STR}\z/ + NAMESPLIT = /^(?:(#{NCNAME_STR}):)?(#{NCNAME_STR})/u + + # Sets the name and the expanded name + def name=( name ) + @expanded_name = name + if name.match?(NAME_WITHOUT_NAMESPACE) + @prefix = "" + @namespace = "" + @name = name + elsif name =~ NAMESPLIT + if $1 + @prefix = $1 + else + @prefix = "" + @namespace = "" + end + @name = $2 + elsif name == "" + @prefix = nil + @namespace = nil + @name = nil + else + message = "name must be \#{PREFIX}:\#{LOCAL_NAME} or \#{LOCAL_NAME}: " + message += "<#{name.inspect}>" + raise ArgumentError, message + end + end + + # Compares names optionally WITH namespaces + def has_name?( other, ns=nil ) + if ns + namespace() == ns and name() == other + elsif other.include? ":" + fully_expanded_name == other + else + name == other + end + end + + alias :local_name :name + + # Fully expand the name, even if the prefix wasn't specified in the + # source file. + def fully_expanded_name + ns = prefix + return "#{ns}:#@name" if ns.size > 0 + @name + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/node.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/node.rb new file mode 100644 index 000000000..bccacc518 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/node.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: false +require_relative "parseexception" +require_relative "formatters/pretty" +require_relative "formatters/default" + +module REXML + # Represents a node in the tree. Nodes are never encountered except as + # superclasses of other objects. Nodes have siblings. + module Node + # @return the next sibling (nil if unset) + def next_sibling_node + return nil if @parent.nil? + @parent[ @parent.index(self) + 1 ] + end + + # @return the previous sibling (nil if unset) + def previous_sibling_node + return nil if @parent.nil? + ind = @parent.index(self) + return nil if ind == 0 + @parent[ ind - 1 ] + end + + # indent:: + # *DEPRECATED* This parameter is now ignored. See the formatters in the + # REXML::Formatters package for changing the output style. + def to_s indent=nil + unless indent.nil? + Kernel.warn( "#{self.class.name}#to_s(indent) parameter is deprecated", uplevel: 1) + f = REXML::Formatters::Pretty.new( indent ) + f.write( self, rv = "" ) + else + f = REXML::Formatters::Default.new + f.write( self, rv = "" ) + end + return rv + end + + def indent to, ind + if @parent and @parent.context and not @parent.context[:indentstyle].nil? then + indentstyle = @parent.context[:indentstyle] + else + indentstyle = ' ' + end + to << indentstyle*ind unless ind<1 + end + + def parent? + false; + end + + + # Visit all subnodes of +self+ recursively + def each_recursive(&block) # :yields: node + stack = [] + each { |child| stack.unshift child if child.node_type == :element } + until stack.empty? + child = stack.pop + yield child + n = stack.size + child.each { |grandchild| stack.insert n, grandchild if grandchild.node_type == :element } + end + end + + # Find (and return) first subnode (recursively) for which the block + # evaluates to true. Returns +nil+ if none was found. + def find_first_recursive(&block) # :yields: node + each_recursive {|node| + return node if block.call(node) + } + nil + end + + # Returns the position that +self+ holds in its parent's array, indexed + # from 1. + def index_in_parent + parent.index(self)+1 + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/output.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/output.rb new file mode 100644 index 000000000..88a5fb378 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/output.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: false +require_relative 'encoding' + +module REXML + class Output + include Encoding + + attr_reader :encoding + + def initialize real_IO, encd="iso-8859-1" + @output = real_IO + self.encoding = encd + + @to_utf = encoding != 'UTF-8' + + if encoding == "UTF-16" + @output << "\ufeff".encode("UTF-16BE") + self.encoding = "UTF-16BE" + end + end + + def <<( content ) + @output << (@to_utf ? self.encode(content) : content) + end + + def to_s + "Output[#{encoding}]" + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parent.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parent.rb new file mode 100644 index 000000000..6a53b37a1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parent.rb @@ -0,0 +1,166 @@ +# frozen_string_literal: false +require_relative "child" + +module REXML + # A parent has children, and has methods for accessing them. The Parent + # class is never encountered except as the superclass for some other + # object. + class Parent < Child + include Enumerable + + # Constructor + # @param parent if supplied, will be set as the parent of this object + def initialize parent=nil + super(parent) + @children = [] + end + + def add( object ) + object.parent = self + @children << object + object + end + + alias :push :add + alias :<< :push + + def unshift( object ) + object.parent = self + @children.unshift object + end + + def delete( object ) + found = false + @children.delete_if {|c| c.equal?(object) and found = true } + object.parent = nil if found + found ? object : nil + end + + def each(&block) + @children.each(&block) + end + + def delete_if( &block ) + @children.delete_if(&block) + end + + def delete_at( index ) + @children.delete_at index + end + + def each_index( &block ) + @children.each_index(&block) + end + + # Fetches a child at a given index + # @param index the Integer index of the child to fetch + def []( index ) + @children[index] + end + + alias :each_child :each + + + + # Set an index entry. See Array.[]= + # @param index the index of the element to set + # @param opt either the object to set, or an Integer length + # @param child if opt is an Integer, this is the child to set + # @return the parent (self) + def []=( *args ) + args[-1].parent = self + @children[*args[0..-2]] = args[-1] + end + + # Inserts an child before another child + # @param child1 this is either an xpath or an Element. If an Element, + # child2 will be inserted before child1 in the child list of the parent. + # If an xpath, child2 will be inserted before the first child to match + # the xpath. + # @param child2 the child to insert + # @return the parent (self) + def insert_before( child1, child2 ) + if child1.kind_of? String + child1 = XPath.first( self, child1 ) + child1.parent.insert_before child1, child2 + else + ind = index(child1) + child2.parent.delete(child2) if child2.parent + @children[ind,0] = child2 + child2.parent = self + end + self + end + + # Inserts an child after another child + # @param child1 this is either an xpath or an Element. If an Element, + # child2 will be inserted after child1 in the child list of the parent. + # If an xpath, child2 will be inserted after the first child to match + # the xpath. + # @param child2 the child to insert + # @return the parent (self) + def insert_after( child1, child2 ) + if child1.kind_of? String + child1 = XPath.first( self, child1 ) + child1.parent.insert_after child1, child2 + else + ind = index(child1)+1 + child2.parent.delete(child2) if child2.parent + @children[ind,0] = child2 + child2.parent = self + end + self + end + + def to_a + @children.dup + end + + # Fetches the index of a given child + # @param child the child to get the index of + # @return the index of the child, or nil if the object is not a child + # of this parent. + def index( child ) + count = -1 + @children.find { |i| count += 1 ; i.hash == child.hash } + count + end + + # @return the number of children of this parent + def size + @children.size + end + + alias :length :size + + # Replaces one child with another, making sure the nodelist is correct + # @param to_replace the child to replace (must be a Child) + # @param replacement the child to insert into the nodelist (must be a + # Child) + def replace_child( to_replace, replacement ) + @children.map! {|c| c.equal?( to_replace ) ? replacement : c } + to_replace.parent = nil + replacement.parent = self + end + + # Deeply clones this object. This creates a complete duplicate of this + # Parent, including all descendants. + def deep_clone + cl = clone() + each do |child| + if child.kind_of? Parent + cl << child.deep_clone + else + cl << child.clone + end + end + cl + end + + alias :children :to_a + + def parent? + true + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parseexception.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parseexception.rb new file mode 100644 index 000000000..e57d05fd2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parseexception.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: false +module REXML + class ParseException < RuntimeError + attr_accessor :source, :parser, :continued_exception + + def initialize( message, source=nil, parser=nil, exception=nil ) + super(message) + @source = source + @parser = parser + @continued_exception = exception + end + + def to_s + # Quote the original exception, if there was one + if @continued_exception + err = @continued_exception.inspect + err << "\n" + err << @continued_exception.backtrace.join("\n") + err << "\n...\n" + else + err = "" + end + + # Get the stack trace and error message + err << super + + # Add contextual information + if @source + err << "\nLine: #{line}\n" + err << "Position: #{position}\n" + err << "Last 80 unconsumed characters:\n" + err.force_encoding("ASCII-8BIT") + err << @source.buffer[0..80].force_encoding("ASCII-8BIT").gsub(/\n/, ' ') + end + + err + end + + def position + @source.current_line[0] if @source and defined? @source.current_line and + @source.current_line + end + + def line + @source.current_line[2] if @source and defined? @source.current_line and + @source.current_line + end + + def context + @source.current_line + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/baseparser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/baseparser.rb new file mode 100644 index 000000000..8fe287a71 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/baseparser.rb @@ -0,0 +1,949 @@ +# frozen_string_literal: true +require_relative '../parseexception' +require_relative '../undefinednamespaceexception' +require_relative '../security' +require_relative '../source' +require 'set' +require "strscan" + +module REXML + module Parsers + unless [].respond_to?(:tally) + module EnumerableTally + refine Enumerable do + def tally + counts = {} + each do |item| + counts[item] ||= 0 + counts[item] += 1 + end + counts + end + end + end + using EnumerableTally + end + + if StringScanner::Version < "3.0.8" + module StringScannerCaptures + refine StringScanner do + def captures + values_at(*(1...size)) + end + end + end + using StringScannerCaptures + end + + # = Using the Pull Parser + # <em>This API is experimental, and subject to change.</em> + # parser = PullParser.new( "<a>text<b att='val'/>txet</a>" ) + # while parser.has_next? + # res = parser.next + # puts res[1]['att'] if res.start_tag? and res[0] == 'b' + # end + # See the PullEvent class for information on the content of the results. + # The data is identical to the arguments passed for the various events to + # the StreamListener API. + # + # Notice that: + # parser = PullParser.new( "<a>BAD DOCUMENT" ) + # while parser.has_next? + # res = parser.next + # raise res[1] if res.error? + # end + # + # Nat Price gave me some good ideas for the API. + class BaseParser + LETTER = '[:alpha:]' + DIGIT = '[:digit:]' + + COMBININGCHAR = '' # TODO + EXTENDER = '' # TODO + + NCNAME_STR= "[#{LETTER}_][-[:alnum:]._#{COMBININGCHAR}#{EXTENDER}]*" + QNAME_STR= "(?:(#{NCNAME_STR}):)?(#{NCNAME_STR})" + QNAME = /(#{QNAME_STR})/ + + # Just for backward compatibility. For example, kramdown uses this. + # It's not used in REXML. + UNAME_STR= "(?:#{NCNAME_STR}:)?#{NCNAME_STR}" + + NAMECHAR = '[\-\w\.:]' + NAME = "([\\w:]#{NAMECHAR}*)" + NMTOKEN = "(?:#{NAMECHAR})+" + NMTOKENS = "#{NMTOKEN}(\\s+#{NMTOKEN})*" + REFERENCE = "&(?:#{NAME};|#\\d+;|#x[0-9a-fA-F]+;)" + REFERENCE_RE = /#{REFERENCE}/ + + DOCTYPE_START = /\A\s*<!DOCTYPE\s/um + DOCTYPE_END = /\A\s*\]\s*>/um + ATTRIBUTE_PATTERN = /\s*(#{QNAME_STR})\s*=\s*(["'])(.*?)\4/um + COMMENT_START = /\A<!--/u + COMMENT_PATTERN = /<!--(.*?)-->/um + CDATA_START = /\A<!\[CDATA\[/u + CDATA_END = /\A\s*\]\s*>/um + CDATA_PATTERN = /<!\[CDATA\[(.*?)\]\]>/um + XMLDECL_START = /\A<\?xml\s/u; + XMLDECL_PATTERN = /<\?xml\s+(.*?)\?>/um + INSTRUCTION_START = /\A<\?/u + INSTRUCTION_PATTERN = /<\?#{NAME}(\s+.*?)?\?>/um + TAG_MATCH = /\A<((?>#{QNAME_STR}))/um + CLOSE_MATCH = /\A\s*<\/(#{QNAME_STR})\s*>/um + + VERSION = /\bversion\s*=\s*["'](.*?)['"]/um + ENCODING = /\bencoding\s*=\s*["'](.*?)['"]/um + STANDALONE = /\bstandalone\s*=\s*["'](.*?)['"]/um + + ENTITY_START = /\A\s*<!ENTITY/ + ELEMENTDECL_START = /\A\s*<!ELEMENT/um + ELEMENTDECL_PATTERN = /\A\s*(<!ELEMENT.*?)>/um + SYSTEMENTITY = /\A\s*(%.*?;)\s*$/um + ENUMERATION = "\\(\\s*#{NMTOKEN}(?:\\s*\\|\\s*#{NMTOKEN})*\\s*\\)" + NOTATIONTYPE = "NOTATION\\s+\\(\\s*#{NAME}(?:\\s*\\|\\s*#{NAME})*\\s*\\)" + ENUMERATEDTYPE = "(?:(?:#{NOTATIONTYPE})|(?:#{ENUMERATION}))" + ATTTYPE = "(CDATA|ID|IDREF|IDREFS|ENTITY|ENTITIES|NMTOKEN|NMTOKENS|#{ENUMERATEDTYPE})" + ATTVALUE = "(?:\"((?:[^<&\"]|#{REFERENCE})*)\")|(?:'((?:[^<&']|#{REFERENCE})*)')" + DEFAULTDECL = "(#REQUIRED|#IMPLIED|(?:(#FIXED\\s+)?#{ATTVALUE}))" + ATTDEF = "\\s+#{NAME}\\s+#{ATTTYPE}\\s+#{DEFAULTDECL}" + ATTDEF_RE = /#{ATTDEF}/ + ATTLISTDECL_START = /\A\s*<!ATTLIST/um + ATTLISTDECL_PATTERN = /\A\s*<!ATTLIST\s+#{NAME}(?:#{ATTDEF})*\s*>/um + + TEXT_PATTERN = /\A([^<]*)/um + + # Entity constants + PUBIDCHAR = "\x20\x0D\x0Aa-zA-Z0-9\\-()+,./:=?;!*@$_%#" + SYSTEMLITERAL = %Q{((?:"[^"]*")|(?:'[^']*'))} + PUBIDLITERAL = %Q{("[#{PUBIDCHAR}']*"|'[#{PUBIDCHAR}]*')} + EXTERNALID = "(?:(?:(SYSTEM)\\s+#{SYSTEMLITERAL})|(?:(PUBLIC)\\s+#{PUBIDLITERAL}\\s+#{SYSTEMLITERAL}))" + NDATADECL = "\\s+NDATA\\s+#{NAME}" + PEREFERENCE = "%#{NAME};" + ENTITYVALUE = %Q{((?:"(?:[^%&"]|#{PEREFERENCE}|#{REFERENCE})*")|(?:'([^%&']|#{PEREFERENCE}|#{REFERENCE})*'))} + PEDEF = "(?:#{ENTITYVALUE}|#{EXTERNALID})" + ENTITYDEF = "(?:#{ENTITYVALUE}|(?:#{EXTERNALID}(#{NDATADECL})?))" + PEDECL = "<!ENTITY\\s+(%)\\s+#{NAME}\\s+#{PEDEF}\\s*>" + GEDECL = "<!ENTITY\\s+#{NAME}\\s+#{ENTITYDEF}\\s*>" + ENTITYDECL = /\s*(?:#{GEDECL})|\s*(?:#{PEDECL})/um + + NOTATIONDECL_START = /\A\s*<!NOTATION/um + EXTERNAL_ID_PUBLIC = /\A\s*PUBLIC\s+#{PUBIDLITERAL}\s+#{SYSTEMLITERAL}\s*/um + EXTERNAL_ID_SYSTEM = /\A\s*SYSTEM\s+#{SYSTEMLITERAL}\s*/um + PUBLIC_ID = /\A\s*PUBLIC\s+#{PUBIDLITERAL}\s*/um + + EREFERENCE = /&(?!#{NAME};)/ + + DEFAULT_ENTITIES = { + 'gt' => [/>/, '>', '>', />/], + 'lt' => [/</, '<', '<', /</], + 'quot' => [/"/, '"', '"', /"/], + "apos" => [/'/, "'", "'", /'/] + } + + module Private + PEREFERENCE_PATTERN = /#{PEREFERENCE}/um + TAG_PATTERN = /((?>#{QNAME_STR}))\s*/um + CLOSE_PATTERN = /(#{QNAME_STR})\s*>/um + EQUAL_PATTERN = /\s*=\s*/um + ATTLISTDECL_END = /\s+#{NAME}(?:#{ATTDEF})*\s*>/um + NAME_PATTERN = /#{NAME}/um + GEDECL_PATTERN = "\\s+#{NAME}\\s+#{ENTITYDEF}\\s*>" + PEDECL_PATTERN = "\\s+(%)\\s+#{NAME}\\s+#{PEDEF}\\s*>" + ENTITYDECL_PATTERN = /(?:#{GEDECL_PATTERN})|(?:#{PEDECL_PATTERN})/um + CARRIAGE_RETURN_NEWLINE_PATTERN = /\r\n?/ + CHARACTER_REFERENCES = /&#((?:\d+)|(?:x[a-fA-F0-9]+));/ + DEFAULT_ENTITIES_PATTERNS = {} + default_entities = ['gt', 'lt', 'quot', 'apos', 'amp'] + default_entities.each do |term| + DEFAULT_ENTITIES_PATTERNS[term] = /&#{term};/ + end + XML_PREFIXED_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + end + private_constant :Private + + def initialize( source ) + self.stream = source + @listeners = [] + @prefixes = Set.new + @entity_expansion_count = 0 + @entity_expansion_limit = Security.entity_expansion_limit + @entity_expansion_text_limit = Security.entity_expansion_text_limit + @source.ensure_buffer + @version = nil + end + + def add_listener( listener ) + @listeners << listener + end + + attr_reader :source + attr_reader :entity_expansion_count + attr_writer :entity_expansion_limit + attr_writer :entity_expansion_text_limit + + def stream=( source ) + @source = SourceFactory.create_from( source ) + reset + end + + def reset + @closed = nil + @have_root = false + @document_status = nil + @tags = [] + @stack = [] + @entities = [] + @namespaces = {"xml" => Private::XML_PREFIXED_NAMESPACE} + @namespaces_restore_stack = [] + end + + def position + if @source.respond_to? :position + @source.position + else + # FIXME + 0 + end + end + + # Returns true if there are no more events + def empty? + (@source.empty? and @stack.empty?) + end + + # Returns true if there are more events. Synonymous with !empty? + def has_next? + !(@source.empty? and @stack.empty?) + end + + # Push an event back on the head of the stream. This method + # has (theoretically) infinite depth. + def unshift token + @stack.unshift(token) + end + + # Peek at the +depth+ event in the stack. The first element on the stack + # is at depth 0. If +depth+ is -1, will parse to the end of the input + # stream and return the last event, which is always :end_document. + # Be aware that this causes the stream to be parsed up to the +depth+ + # event, so you can effectively pre-parse the entire document (pull the + # entire thing into memory) using this method. + def peek depth=0 + raise %Q[Illegal argument "#{depth}"] if depth < -1 + temp = [] + if depth == -1 + temp.push(pull()) until empty? + else + while @stack.size+temp.size < depth+1 + temp.push(pull()) + end + end + @stack += temp if temp.size > 0 + @stack[depth] + end + + # Returns the next event. This is a +PullEvent+ object. + def pull + @source.drop_parsed_content + + pull_event.tap do |event| + @listeners.each do |listener| + listener.receive event + end + end + end + + def pull_event + if @closed + x, @closed = @closed, nil + return [ :end_element, x ] + end + if empty? + if @document_status == :in_doctype + raise ParseException.new("Malformed DOCTYPE: unclosed", @source) + end + unless @tags.empty? + path = "/" + @tags.join("/") + raise ParseException.new("Missing end tag for '#{path}'", @source) + end + + unless @document_status == :in_element + raise ParseException.new("Malformed XML: No root element", @source) + end + + return [ :end_document ] + end + return @stack.shift if @stack.size > 0 + #STDERR.puts @source.encoding + #STDERR.puts "BUFFER = #{@source.buffer.inspect}" + + @source.ensure_buffer + if @document_status == nil + start_position = @source.position + if @source.match?("<?", true) + return process_instruction + elsif @source.match?("<!", true) + if @source.match?("--", true) + return [ :comment, process_comment ] + elsif @source.match?("DOCTYPE", true) + base_error_message = "Malformed DOCTYPE" + unless @source.skip_spaces + if @source.match?(">") + message = "#{base_error_message}: name is missing" + else + message = "#{base_error_message}: invalid name" + end + @source.position = start_position + raise REXML::ParseException.new(message, @source) + end + name = parse_name(base_error_message) + @source.skip_spaces + if @source.match?("[", true) + id = [nil, nil, nil] + @document_status = :in_doctype + elsif @source.match?(">", true) + id = [nil, nil, nil] + @document_status = :after_doctype + @source.ensure_buffer + else + id = parse_id(base_error_message, + accept_external_id: true, + accept_public_id: false) + if id[0] == "SYSTEM" + # For backward compatibility + id[1], id[2] = id[2], nil + end + @source.skip_spaces + if @source.match?("[", true) + @document_status = :in_doctype + elsif @source.match?(">", true) + @document_status = :after_doctype + @source.ensure_buffer + else + message = "#{base_error_message}: garbage after external ID" + raise REXML::ParseException.new(message, @source) + end + end + args = [:start_doctype, name, *id] + if @document_status == :after_doctype + @source.skip_spaces + @stack << [ :end_doctype ] + end + return args + else + message = "Invalid XML" + raise REXML::ParseException.new(message, @source) + end + end + end + if @document_status == :in_doctype + @source.skip_spaces + start_position = @source.position + if @source.match?("<!", true) + if @source.match?("ELEMENT", true) + md = @source.match(/(.*?)>/um, true) + raise REXML::ParseException.new( "Bad ELEMENT declaration!", @source ) if md.nil? + return [ :elementdecl, "<!ELEMENT" + md[1] ] + elsif @source.match?("ENTITY", true) + match_data = @source.match(Private::ENTITYDECL_PATTERN, true) + unless match_data + raise REXML::ParseException.new("Malformed entity declaration", @source) + end + match = [:entitydecl, *match_data.captures.compact] + ref = false + if match[1] == '%' + ref = true + match.delete_at 1 + end + # Now we have to sort out what kind of entity reference this is + if match[2] == 'SYSTEM' + # External reference + match[3] = match[3][1..-2] # PUBID + match.delete_at(4) if match.size > 4 # Chop out NDATA decl + # match is [ :entity, name, SYSTEM, pubid(, ndata)? ] + elsif match[2] == 'PUBLIC' + # External reference + match[3] = match[3][1..-2] # PUBID + match[4] = match[4][1..-2] # HREF + match.delete_at(5) if match.size > 5 # Chop out NDATA decl + # match is [ :entity, name, PUBLIC, pubid, href(, ndata)? ] + elsif Private::PEREFERENCE_PATTERN.match?(match[2]) + raise REXML::ParseException.new("Parameter entity references forbidden in internal subset: #{match[2]}", @source) + else + match[2] = match[2][1..-2] + match.pop if match.size == 4 + # match is [ :entity, name, value ] + end + match << '%' if ref + return match + elsif @source.match?("ATTLIST", true) + md = @source.match(Private::ATTLISTDECL_END, true) + raise REXML::ParseException.new( "Bad ATTLIST declaration!", @source ) if md.nil? + element = md[1] + contents = "<!ATTLIST" + md[0] + + pairs = {} + values = md[0].strip.scan( ATTDEF_RE ) + values.each do |attdef| + unless attdef[3] == "#IMPLIED" + attdef.compact! + val = attdef[3] + val = attdef[4] if val == "#FIXED " + pairs[attdef[0]] = val + if attdef[0] =~ /^xmlns:(.*)/ + @namespaces[$1] = val + end + end + end + return [ :attlistdecl, element, pairs, contents ] + elsif @source.match?("NOTATION", true) + base_error_message = "Malformed notation declaration" + unless @source.skip_spaces + if @source.match?(">") + message = "#{base_error_message}: name is missing" + else + message = "#{base_error_message}: invalid name" + end + @source.position = start_position + raise REXML::ParseException.new(message, @source) + end + name = parse_name(base_error_message) + id = parse_id(base_error_message, + accept_external_id: true, + accept_public_id: true) + @source.skip_spaces + unless @source.match?(">", true) + message = "#{base_error_message}: garbage before end >" + raise REXML::ParseException.new(message, @source) + end + return [:notationdecl, name, *id] + elsif @source.match?("--", true) + return [ :comment, process_comment ] + else + raise REXML::ParseException.new("Malformed node: Started with '<!' but not a comment nor ELEMENT,ENTITY,ATTLIST,NOTATION", @source) + end + elsif match = @source.match(/(%.*?;)\s*/um, true) + return [ :externalentity, match[1] ] + elsif @source.match?(/\]\s*>/um, true) + @document_status = :after_doctype + return [ :end_doctype ] + else + raise ParseException.new("Malformed DOCTYPE: invalid declaration", @source) + end + end + if @document_status == :after_doctype + @source.skip_spaces + end + begin + start_position = @source.position + if @source.match?("<", true) + # :text's read_until may remain only "<" in buffer. In the + # case, buffer is empty here. So we need to fill buffer + # here explicitly. + @source.ensure_buffer + if @source.match?("/", true) + @namespaces_restore_stack.pop + last_tag = @tags.pop + md = @source.match(Private::CLOSE_PATTERN, true) + if md and !last_tag + message = "Unexpected top-level end tag (got '#{md[1]}')" + raise REXML::ParseException.new(message, @source) + end + if md.nil? or last_tag != md[1] + message = "Missing end tag for '#{last_tag}'" + message += " (got '#{md[1]}')" if md + @source.position = start_position if md.nil? + raise REXML::ParseException.new(message, @source) + end + return [ :end_element, last_tag ] + elsif @source.match?("!", true) + #STDERR.puts "SOURCE BUFFER = #{source.buffer}, #{source.buffer.size}" + if @source.match?("--", true) + return [ :comment, process_comment ] + elsif @source.match?("[CDATA[", true) + text = @source.read_until("]]>") + if text.chomp!("]]>") + return [ :cdata, text ] + else + raise REXML::ParseException.new("Malformed CDATA: Missing end ']]>'", @source) + end + else + raise REXML::ParseException.new("Malformed node: Started with '<!' but not a comment nor CDATA", @source) + end + elsif @source.match?("?", true) + return process_instruction + else + # Get the next tag + md = @source.match(Private::TAG_PATTERN, true) + unless md + @source.position = start_position + raise REXML::ParseException.new("malformed XML: missing tag start", @source) + end + tag = md[1] + @document_status = :in_element + @prefixes.clear + @prefixes << md[2] if md[2] + push_namespaces_restore + attributes, closed = parse_attributes(@prefixes) + # Verify that all of the prefixes have been defined + for prefix in @prefixes + unless @namespaces.key?(prefix) + raise UndefinedNamespaceException.new(prefix,@source,self) + end + end + + if closed + @closed = tag + pop_namespaces_restore + else + if @tags.empty? and @have_root + raise ParseException.new("Malformed XML: Extra tag at the end of the document (got '<#{tag}')", @source) + end + @tags.push( tag ) + end + @have_root = true + return [ :start_element, tag, attributes ] + end + else + text = @source.read_until("<") + if text.chomp!("<") + @source.position -= "<".bytesize + end + if @tags.empty? + unless /\A\s*\z/.match?(text) + if @have_root + raise ParseException.new("Malformed XML: Extra content at the end of the document (got '#{text}')", @source) + else + raise ParseException.new("Malformed XML: Content at the start of the document (got '#{text}')", @source) + end + end + return pull_event if @have_root + end + return [ :text, text ] + end + rescue REXML::UndefinedNamespaceException + raise + rescue REXML::ParseException + raise + rescue => error + raise REXML::ParseException.new( "Exception parsing", + @source, self, (error ? error : $!) ) + end + # NOTE: The end of the method never runs, because it is unreachable. + # All branches of code above have explicit unconditional return or raise statements. + end + private :pull_event + + def entity( reference, entities ) + return unless entities + + value = entities[ reference ] + return if value.nil? + + record_entity_expansion + unnormalize( value, entities ) + end + + # Escapes all possible entities + def normalize( input, entities=nil, entity_filter=nil ) + copy = input.clone + # Doing it like this rather than in a loop improves the speed + copy.gsub!( EREFERENCE, '&' ) + entities.each do |key, value| + copy.gsub!( value, "&#{key};" ) unless entity_filter and + entity_filter.include?(entity) + end if entities + copy.gsub!( EREFERENCE, '&' ) + DEFAULT_ENTITIES.each do |key, value| + copy.gsub!( value[3], value[1] ) + end + copy + end + + # Unescapes all possible entities + def unnormalize( string, entities=nil, filter=nil ) + if string.include?("\r") + rv = string.gsub( Private::CARRIAGE_RETURN_NEWLINE_PATTERN, "\n" ) + else + rv = string.dup + end + matches = rv.scan( REFERENCE_RE ) + return rv if matches.size == 0 + rv.gsub!( Private::CHARACTER_REFERENCES ) { + m=$1 + if m.start_with?("x") + code_point = Integer(m[1..-1], 16) + else + code_point = Integer(m, 10) + end + [code_point].pack('U*') + } + matches.collect!{|x|x[0]}.compact! + if filter + matches.reject! do |entity_reference| + filter.include?(entity_reference) + end + end + if matches.size > 0 + matches.tally.each do |entity_reference, n| + entity_expansion_count_before = @entity_expansion_count + entity_value = entity( entity_reference, entities ) + if entity_value + if n > 1 + entity_expansion_count_delta = + @entity_expansion_count - entity_expansion_count_before + record_entity_expansion(entity_expansion_count_delta * (n - 1)) + end + re = Private::DEFAULT_ENTITIES_PATTERNS[entity_reference] || /&#{entity_reference};/ + rv.gsub!( re, entity_value ) + if rv.bytesize > @entity_expansion_text_limit + raise "entity expansion has grown too large" + end + else + er = DEFAULT_ENTITIES[entity_reference] + rv.gsub!( er[0], er[2] ) if er + end + end + rv.gsub!( Private::DEFAULT_ENTITIES_PATTERNS['amp'], '&' ) + end + rv + end + + private + def add_namespace(prefix, uri) + @namespaces_restore_stack.last[prefix] = @namespaces[prefix] + if uri.nil? + @namespaces.delete(prefix) + else + @namespaces[prefix] = uri + end + end + + def push_namespaces_restore + namespaces_restore = {} + @namespaces_restore_stack.push(namespaces_restore) + namespaces_restore + end + + def pop_namespaces_restore + namespaces_restore = @namespaces_restore_stack.pop + namespaces_restore.each do |prefix, uri| + if uri.nil? + @namespaces.delete(prefix) + else + @namespaces[prefix] = uri + end + end + end + + def record_entity_expansion(delta=1) + @entity_expansion_count += delta + if @entity_expansion_count > @entity_expansion_limit + raise "number of entity expansions exceeded, processing aborted." + end + end + + def need_source_encoding_update?(xml_declaration_encoding) + return false if xml_declaration_encoding.nil? + return false if /\AUTF-16\z/i =~ xml_declaration_encoding + true + end + + def normalize_xml_declaration_encoding(xml_declaration_encoding) + /\AUTF-16(?:BE|LE)\z/i.match?(xml_declaration_encoding) ? "UTF-16" : nil + end + + def parse_name(base_error_message) + md = @source.match(Private::NAME_PATTERN, true) + unless md + if @source.match?(/\S/um) + message = "#{base_error_message}: invalid name" + else + message = "#{base_error_message}: name is missing" + end + raise REXML::ParseException.new(message, @source) + end + md[0] + end + + def parse_id(base_error_message, + accept_external_id:, + accept_public_id:) + if accept_external_id and (md = @source.match(EXTERNAL_ID_PUBLIC, true)) + pubid = system = nil + pubid_literal = md[1] + pubid = pubid_literal[1..-2] if pubid_literal # Remove quote + system_literal = md[2] + system = system_literal[1..-2] if system_literal # Remove quote + ["PUBLIC", pubid, system] + elsif accept_public_id and (md = @source.match(PUBLIC_ID, true)) + pubid = system = nil + pubid_literal = md[1] + pubid = pubid_literal[1..-2] if pubid_literal # Remove quote + ["PUBLIC", pubid, nil] + elsif accept_external_id and (md = @source.match(EXTERNAL_ID_SYSTEM, true)) + system = nil + system_literal = md[1] + system = system_literal[1..-2] if system_literal # Remove quote + ["SYSTEM", nil, system] + else + details = parse_id_invalid_details(accept_external_id: accept_external_id, + accept_public_id: accept_public_id) + message = "#{base_error_message}: #{details}" + raise REXML::ParseException.new(message, @source) + end + end + + def parse_id_invalid_details(accept_external_id:, + accept_public_id:) + public = /\A\s*PUBLIC/um + system = /\A\s*SYSTEM/um + if (accept_external_id or accept_public_id) and @source.match?(/#{public}/um) + if @source.match?(/#{public}(?:\s+[^'"]|\s*[\[>])/um) + return "public ID literal is missing" + end + unless @source.match?(/#{public}\s+#{PUBIDLITERAL}/um) + return "invalid public ID literal" + end + if accept_public_id + if @source.match?(/#{public}\s+#{PUBIDLITERAL}\s+[^'"]/um) + return "system ID literal is missing" + end + unless @source.match?(/#{public}\s+#{PUBIDLITERAL}\s+#{SYSTEMLITERAL}/um) + return "invalid system literal" + end + "garbage after system literal" + else + "garbage after public ID literal" + end + elsif accept_external_id and @source.match?(/#{system}/um) + if @source.match?(/#{system}(?:\s+[^'"]|\s*[\[>])/um) + return "system literal is missing" + end + unless @source.match?(/#{system}\s+#{SYSTEMLITERAL}/um) + return "invalid system literal" + end + "garbage after system literal" + else + unless @source.match?(/\A\s*(?:PUBLIC|SYSTEM)\s/um) + return "invalid ID type" + end + "ID type is missing" + end + end + + def process_comment + text = @source.read_until("-->") + unless text.chomp!("-->") + raise REXML::ParseException.new("Unclosed comment: Missing end '-->'", @source) + end + + if text.include? "--" or text.end_with?("-") + raise REXML::ParseException.new("Malformed comment", @source) + end + text + end + + def process_instruction + name = parse_name("Malformed XML: Invalid processing instruction node") + if name == "xml" + xml_declaration + else # PITarget + if @source.skip_spaces # e.g. <?name content?> + start_position = @source.position + content = @source.read_until("?>") + unless content.chomp!("?>") + @source.position = start_position + raise ParseException.new("Malformed XML: Unclosed processing instruction: <#{name}>", @source) + end + else # e.g. <?name?> + content = nil + unless @source.match?("?>", true) + raise ParseException.new("Malformed XML: Unclosed processing instruction: <#{name}>", @source) + end + end + [:processing_instruction, name, content] + end + end + + def xml_declaration + unless @version.nil? + raise ParseException.new("Malformed XML: XML declaration is duplicated", @source) + end + if @document_status + raise ParseException.new("Malformed XML: XML declaration is not at the start", @source) + end + unless @source.skip_spaces + raise ParseException.new("Malformed XML: XML declaration misses spaces before version", @source) + end + unless @source.match?("version", true) + raise ParseException.new("Malformed XML: XML declaration misses version", @source) + end + @version = parse_attribute_value_with_equal("xml") + unless @source.skip_spaces + unless @source.match?("?>", true) + raise ParseException.new("Malformed XML: Unclosed XML declaration", @source) + end + encoding = normalize_xml_declaration_encoding(@source.encoding) + return [ :xmldecl, @version, encoding, nil ] # e.g. <?xml version="1.0"?> + end + + if @source.match?("encoding", true) + encoding = parse_attribute_value_with_equal("xml") + unless @source.skip_spaces + unless @source.match?("?>", true) + raise ParseException.new("Malformed XML: Unclosed XML declaration", @source) + end + if need_source_encoding_update?(encoding) + @source.encoding = encoding + end + encoding ||= normalize_xml_declaration_encoding(@source.encoding) + return [ :xmldecl, @version, encoding, nil ] # e.g. <?xml version="1.1" encoding="UTF-8"?> + end + end + + if @source.match?("standalone", true) + standalone = parse_attribute_value_with_equal("xml") + case standalone + when "yes", "no" + else + raise ParseException.new("Malformed XML: XML declaration standalone is not yes or no : <#{standalone}>", @source) + end + end + @source.skip_spaces + unless @source.match?("?>", true) + raise ParseException.new("Malformed XML: Unclosed XML declaration", @source) + end + + if need_source_encoding_update?(encoding) + @source.encoding = encoding + end + encoding ||= normalize_xml_declaration_encoding(@source.encoding) + + # e.g. <?xml version="1.0" ?> + # <?xml version="1.1" encoding="UTF-8" ?> + # <?xml version="1.1" standalone="yes"?> + # <?xml version="1.1" encoding="UTF-8" standalone="yes" ?> + [ :xmldecl, @version, encoding, standalone ] + end + + if StringScanner::Version < "3.1.1" + def scan_quote + @source.match(/(['"])/, true)&.[](1) + end + else + def scan_quote + case @source.peek_byte + when 34 # '"'.ord + @source.scan_byte + '"' + when 39 # "'".ord + @source.scan_byte + "'" + else + nil + end + end + end + + def parse_attribute_value_with_equal(name) + unless @source.match?(Private::EQUAL_PATTERN, true) + message = "Missing attribute equal: <#{name}>" + raise REXML::ParseException.new(message, @source) + end + unless quote = scan_quote + message = "Missing attribute value start quote: <#{name}>" + raise REXML::ParseException.new(message, @source) + end + start_position = @source.position + value = @source.read_until(quote) + unless value.chomp!(quote) + @source.position = start_position + message = "Missing attribute value end quote: <#{name}>: <#{quote}>" + raise REXML::ParseException.new(message, @source) + end + value + end + + def parse_attributes(prefixes) + attributes = {} + expanded_names = {} + closed = false + while true + if @source.match?(">", true) + return attributes, closed + elsif @source.match?("/>", true) + closed = true + return attributes, closed + elsif match = @source.match(QNAME, true) + name = match[1] + prefix = match[2] + local_part = match[3] + value = parse_attribute_value_with_equal(name) + @source.skip_spaces + if prefix == "xmlns" + if local_part == "xml" + if value != Private::XML_PREFIXED_NAMESPACE + msg = "The 'xml' prefix must not be bound to any other namespace "+ + "(http://www.w3.org/TR/REC-xml-names/#ns-decl)" + raise REXML::ParseException.new( msg, @source, self ) + end + elsif local_part == "xmlns" + msg = "The 'xmlns' prefix must not be declared "+ + "(http://www.w3.org/TR/REC-xml-names/#ns-decl)" + raise REXML::ParseException.new( msg, @source, self) + end + add_namespace(local_part, value) + elsif prefix + prefixes << prefix unless prefix == "xml" + end + + if attributes[name] + msg = "Duplicate attribute #{name.inspect}" + raise REXML::ParseException.new(msg, @source, self) + end + + unless prefix == "xmlns" + uri = @namespaces[prefix] + expanded_name = [uri, local_part] + existing_prefix = expanded_names[expanded_name] + if existing_prefix + message = "Namespace conflict in adding attribute " + + "\"#{local_part}\": " + + "Prefix \"#{existing_prefix}\" = \"#{uri}\" and " + + "prefix \"#{prefix}\" = \"#{uri}\"" + raise REXML::ParseException.new(message, @source, self) + end + expanded_names[expanded_name] = prefix + end + + attributes[name] = value + else + message = "Invalid attribute name: <#{@source.buffer.split(%r{[/>\s]}).first}>" + raise REXML::ParseException.new(message, @source) + end + end + end + end + end +end + +=begin + case event[0] + when :start_element + when :text + when :end_element + when :processing_instruction + when :cdata + when :comment + when :xmldecl + when :start_doctype + when :end_doctype + when :externalentity + when :elementdecl + when :entity + when :attlistdecl + when :notationdecl + when :end_doctype + end +=end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/lightparser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/lightparser.rb new file mode 100644 index 000000000..bdc08276a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/lightparser.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: false +require_relative 'streamparser' +require_relative 'baseparser' +require_relative '../light/node' + +module REXML + module Parsers + class LightParser + def initialize stream + @stream = stream + @parser = REXML::Parsers::BaseParser.new( stream ) + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + def rewind + @stream.rewind + @parser.stream = @stream + end + + def parse + root = context = [ :document ] + while true + event = @parser.pull + case event[0] + when :end_document + break + when :start_element, :start_doctype + new_node = event + context << new_node + new_node[1,0] = [context] + context = new_node + when :end_element, :end_doctype + context = context[1] + else + new_node = event + context << new_node + new_node[1,0] = [context] + end + end + root + end + end + + # An element is an array. The array contains: + # 0 The parent element + # 1 The tag name + # 2 A hash of attributes + # 3..-1 The child elements + # An element is an array of size > 3 + # Text is a String + # PIs are [ :processing_instruction, target, data ] + # Comments are [ :comment, data ] + # DocTypes are DocType structs + # The root is an array with XMLDecls, Text, DocType, Array, Text + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/pullparser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/pullparser.rb new file mode 100644 index 000000000..e0b1e94d7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/pullparser.rb @@ -0,0 +1,213 @@ +# frozen_string_literal: false +require 'forwardable' + +require_relative '../parseexception' +require_relative 'baseparser' +require_relative '../xmltokens' + +module REXML + module Parsers + # = Using the Pull Parser + # <em>This API is experimental, and subject to change.</em> + # parser = PullParser.new( "<a>text<b att='val'/>txet</a>" ) + # while parser.has_next? + # res = parser.next + # puts res[1]['att'] if res.start_tag? and res[0] == 'b' + # end + # See the PullEvent class for information on the content of the results. + # The data is identical to the arguments passed for the various events to + # the StreamListener API. + # + # Notice that: + # parser = PullParser.new( "<a>BAD DOCUMENT" ) + # while parser.has_next? + # res = parser.next + # raise res[1] if res.error? + # end + # + # Nat Price gave me some good ideas for the API. + class PullParser + include XMLTokens + extend Forwardable + + def_delegators( :@parser, :has_next? ) + def_delegators( :@parser, :entity ) + def_delegators( :@parser, :empty? ) + def_delegators( :@parser, :source ) + + def initialize stream + @entities = {} + @listeners = nil + @parser = BaseParser.new( stream ) + @my_stack = [] + end + + def add_listener( listener ) + @listeners = [] unless @listeners + @listeners << listener + end + + def entity_expansion_count + @parser.entity_expansion_count + end + + def entity_expansion_limit=( limit ) + @parser.entity_expansion_limit = limit + end + + def entity_expansion_text_limit=( limit ) + @parser.entity_expansion_text_limit = limit + end + + def each + while has_next? + yield self.pull + end + end + + def peek depth=0 + if @my_stack.length <= depth + (depth - @my_stack.length + 1).times { + e = PullEvent.new(@parser.pull) + @my_stack.push(e) + } + end + @my_stack[depth] + end + + def pull + return @my_stack.shift if @my_stack.length > 0 + + event = @parser.pull + case event[0] + when :entitydecl + @entities[ event[1] ] = + event[2] unless event[2] =~ /PUBLIC|SYSTEM/ + when :text + unnormalized = @parser.unnormalize( event[1], @entities ) + event << unnormalized + end + PullEvent.new( event ) + end + + def unshift token + @my_stack.unshift token + end + + def reset + @parser.reset + end + end + + # A parsing event. The contents of the event are accessed as an +Array?, + # and the type is given either by the ...? methods, or by accessing the + # +type+ accessor. The contents of this object vary from event to event, + # but are identical to the arguments passed to +StreamListener+s for each + # event. + class PullEvent + # The type of this event. Will be one of :tag_start, :tag_end, :text, + # :processing_instruction, :comment, :doctype, :attlistdecl, :entitydecl, + # :notationdecl, :entity, :cdata, :xmldecl, or :error. + def initialize(arg) + @contents = arg + end + + def []( start, endd=nil) + if start.kind_of? Range + @contents.slice( start.begin+1 .. start.end ) + elsif start.kind_of? Numeric + if endd.nil? + @contents.slice( start+1 ) + else + @contents.slice( start+1, endd ) + end + else + raise "Illegal argument #{start.inspect} (#{start.class})" + end + end + + def event_type + @contents[0] + end + + # Content: [ String tag_name, Hash attributes ] + def start_element? + @contents[0] == :start_element + end + + # Content: [ String tag_name ] + def end_element? + @contents[0] == :end_element + end + + # Content: [ String raw_text, String unnormalized_text ] + def text? + @contents[0] == :text + end + + # Content: [ String text ] + def instruction? + @contents[0] == :processing_instruction + end + + # Content: [ String text ] + def comment? + @contents[0] == :comment + end + + # Content: [ String name, String pub_sys, String long_name, String uri ] + def doctype? + @contents[0] == :start_doctype + end + + # Content: [ String text ] + def attlistdecl? + @contents[0] == :attlistdecl + end + + # Content: [ String text ] + def elementdecl? + @contents[0] == :elementdecl + end + + # Due to the wonders of DTDs, an entity declaration can be just about + # anything. There's no way to normalize it; you'll have to interpret the + # content yourself. However, the following is true: + # + # * If the entity declaration is an internal entity: + # [ String name, String value ] + # Content: [ String text ] + def entitydecl? + @contents[0] == :entitydecl + end + + # Content: [ String text ] + def notationdecl? + @contents[0] == :notationdecl + end + + # Content: [ String text ] + def entity? + @contents[0] == :entity + end + + # Content: [ String text ] + def cdata? + @contents[0] == :cdata + end + + # Content: [ String version, String encoding, String standalone ] + def xmldecl? + @contents[0] == :xmldecl + end + + def error? + @contents[0] == :error + end + + def inspect + @contents[0].to_s + ": " + @contents[1..-1].inspect + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/sax2parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/sax2parser.rb new file mode 100644 index 000000000..a51477de2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/sax2parser.rb @@ -0,0 +1,270 @@ +# frozen_string_literal: false +require_relative 'baseparser' +require_relative '../parseexception' +require_relative '../namespace' +require_relative '../text' + +module REXML + module Parsers + # SAX2Parser + class SAX2Parser + def initialize source + @parser = BaseParser.new(source) + @listeners = [] + @procs = [] + @namespace_stack = [] + @has_listeners = false + @tag_stack = [] + @entities = {} + end + + def source + @parser.source + end + + def entity_expansion_count + @parser.entity_expansion_count + end + + def entity_expansion_limit=( limit ) + @parser.entity_expansion_limit = limit + end + + def entity_expansion_text_limit=( limit ) + @parser.entity_expansion_text_limit = limit + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + # Listen arguments: + # + # Symbol, Array, Block + # Listen to Symbol events on Array elements + # Symbol, Block + # Listen to Symbol events + # Array, Listener + # Listen to all events on Array elements + # Array, Block + # Listen to :start_element events on Array elements + # Listener + # Listen to All events + # + # Symbol can be one of: :start_element, :end_element, + # :start_prefix_mapping, :end_prefix_mapping, :characters, + # :processing_instruction, :doctype, :attlistdecl, :elementdecl, + # :entitydecl, :notationdecl, :cdata, :xmldecl, :comment + # + # There is an additional symbol that can be listened for: :progress. + # This will be called for every event generated, passing in the current + # stream position. + # + # Array contains regular expressions or strings which will be matched + # against fully qualified element names. + # + # Listener must implement the methods in SAX2Listener + # + # Block will be passed the same arguments as a SAX2Listener method would + # be, where the method name is the same as the matched Symbol. + # See the SAX2Listener for more information. + def listen( *args, &blok ) + if args[0].kind_of? Symbol + if args.size == 2 + args[1].each { |match| @procs << [args[0], match, blok] } + else + add( [args[0], nil, blok] ) + end + elsif args[0].kind_of? Array + if args.size == 2 + args[0].each { |match| add( [nil, match, args[1]] ) } + else + args[0].each { |match| add( [ :start_element, match, blok ] ) } + end + else + add([nil, nil, args[0]]) + end + end + + def deafen( listener=nil, &blok ) + if listener + @listeners.delete_if {|item| item[-1] == listener } + @has_listeners = false if @listeners.size == 0 + else + @procs.delete_if {|item| item[-1] == blok } + end + end + + def parse + @procs.each { |sym,match,block| block.call if sym == :start_document } + @listeners.each { |sym,match,block| + block.start_document if sym == :start_document or sym.nil? + } + context = [] + while true + event = @parser.pull + case event[0] + when :end_document + handle( :end_document ) + break + when :start_doctype + handle( :doctype, *event[1..-1]) + when :end_doctype + context = context[1] + when :start_element + @tag_stack.push(event[1]) + # find the observers for namespaces + procs = get_procs( :start_prefix_mapping, event[1] ) + listeners = get_listeners( :start_prefix_mapping, event[1] ) + if procs or listeners + # break out the namespace declarations + # The attributes live in event[2] + event[2].each {|n, v| event[2][n] = @parser.normalize(v)} + nsdecl = event[2].find_all { |n, value| n =~ /^xmlns(:|$)/ } + nsdecl.collect! { |n, value| [ n[6..-1], value ] } + @namespace_stack.push({}) + nsdecl.each do |n,v| + @namespace_stack[-1][n] = v + # notify observers of namespaces + procs.each { |ob| ob.call( n, v ) } if procs + listeners.each { |ob| ob.start_prefix_mapping(n, v) } if listeners + end + end + event[1] =~ Namespace::NAMESPLIT + prefix = $1 + local = $2 + uri = get_namespace(prefix) + # find the observers for start_element + procs = get_procs( :start_element, event[1] ) + listeners = get_listeners( :start_element, event[1] ) + # notify observers + procs.each { |ob| ob.call( uri, local, event[1], event[2] ) } if procs + listeners.each { |ob| + ob.start_element( uri, local, event[1], event[2] ) + } if listeners + when :end_element + @tag_stack.pop + event[1] =~ Namespace::NAMESPLIT + prefix = $1 + local = $2 + uri = get_namespace(prefix) + # find the observers for start_element + procs = get_procs( :end_element, event[1] ) + listeners = get_listeners( :end_element, event[1] ) + # notify observers + procs.each { |ob| ob.call( uri, local, event[1] ) } if procs + listeners.each { |ob| + ob.end_element( uri, local, event[1] ) + } if listeners + + namespace_mapping = @namespace_stack.pop + # find the observers for namespaces + procs = get_procs( :end_prefix_mapping, event[1] ) + listeners = get_listeners( :end_prefix_mapping, event[1] ) + if procs or listeners + namespace_mapping.each do |ns_prefix, ns_uri| + # notify observers of namespaces + procs.each { |ob| ob.call( ns_prefix ) } if procs + listeners.each { |ob| ob.end_prefix_mapping(ns_prefix) } if listeners + end + end + when :text + unnormalized = @parser.unnormalize( event[1], @entities ) + handle( :characters, unnormalized ) + when :entitydecl + handle_entitydecl( event ) + when :processing_instruction, :comment, :attlistdecl, + :elementdecl, :cdata, :notationdecl, :xmldecl + handle( *event ) + end + handle( :progress, @parser.position ) + end + end + + private + def handle( symbol, *arguments ) + tag = @tag_stack[-1] + procs = get_procs( symbol, tag ) + listeners = get_listeners( symbol, tag ) + # notify observers + procs.each { |ob| ob.call( *arguments ) } if procs + listeners.each { |l| + l.send( symbol.to_s, *arguments ) + } if listeners + end + + def handle_entitydecl( event ) + @entities[ event[1] ] = event[2] if event.size == 3 + parameter_reference_p = false + case event[2] + when "SYSTEM" + if event.size == 5 + if event.last == "%" + parameter_reference_p = true + else + event[4, 0] = "NDATA" + end + end + when "PUBLIC" + if event.size == 6 + if event.last == "%" + parameter_reference_p = true + else + event[5, 0] = "NDATA" + end + end + else + parameter_reference_p = (event.size == 4) + end + event[1, 0] = event.pop if parameter_reference_p + handle( event[0], event[1..-1] ) + end + + # The following methods are duplicates, but it is faster than using + # a helper + def get_procs( symbol, name ) + return nil if @procs.size == 0 + @procs.find_all do |sym, match, block| + ( + (sym.nil? or symbol == sym) and + ((name.nil? and match.nil?) or match.nil? or ( + (name == match) or + (match.kind_of? Regexp and name =~ match) + ) + ) + ) + end.collect{|x| x[-1]} + end + def get_listeners( symbol, name ) + return nil if @listeners.size == 0 + @listeners.find_all do |sym, match, block| + ( + (sym.nil? or symbol == sym) and + ((name.nil? and match.nil?) or match.nil? or ( + (name == match) or + (match.kind_of? Regexp and name =~ match) + ) + ) + ) + end.collect{|x| x[-1]} + end + + def add( pair ) + if pair[-1].respond_to? :call + @procs << pair unless @procs.include? pair + else + @listeners << pair unless @listeners.include? pair + @has_listeners = true + end + end + + def get_namespace( prefix ) + return nil if @namespace_stack.empty? + + uris = (@namespace_stack.find_all { |ns| not ns[prefix].nil? }) || + (@namespace_stack.find { |ns| not ns[nil].nil? }) + uris[-1][prefix] unless uris.nil? or 0 == uris.size + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/streamparser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/streamparser.rb new file mode 100644 index 000000000..6c64d9789 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/streamparser.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: false +require_relative "baseparser" + +module REXML + module Parsers + class StreamParser + def initialize source, listener + @listener = listener + @parser = BaseParser.new( source ) + @entities = {} + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + def entity_expansion_count + @parser.entity_expansion_count + end + + def entity_expansion_limit=( limit ) + @parser.entity_expansion_limit = limit + end + + def entity_expansion_text_limit=( limit ) + @parser.entity_expansion_text_limit = limit + end + + def parse + # entity string + while true + event = @parser.pull + case event[0] + when :end_document + return + when :start_element + attrs = event[2].each do |n, v| + event[2][n] = @parser.unnormalize( v ) + end + @listener.tag_start( event[1], attrs ) + when :end_element + @listener.tag_end( event[1] ) + when :text + unnormalized = @parser.unnormalize( event[1], @entities ) + @listener.text( unnormalized ) + when :processing_instruction + @listener.instruction( *event[1,2] ) + when :start_doctype + @listener.doctype( *event[1..-1] ) + when :end_doctype + # FIXME: remove this condition for milestone:3.2 + @listener.doctype_end if @listener.respond_to? :doctype_end + when :comment, :attlistdecl, :cdata, :xmldecl, :elementdecl + @listener.send( event[0].to_s, *event[1..-1] ) + when :entitydecl, :notationdecl + @entities[ event[1] ] = event[2] if event.size == 3 + @listener.send( event[0].to_s, event[1..-1] ) + when :externalentity + entity_reference = event[1] + content = entity_reference.gsub(/\A%|;\z/, "") + @listener.entity(content) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/treeparser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/treeparser.rb new file mode 100644 index 000000000..4565a406c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/treeparser.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: false +require_relative '../validation/validationexception' +require_relative '../undefinednamespaceexception' + +module REXML + module Parsers + class TreeParser + def initialize( source, build_context = Document.new ) + @build_context = build_context + @parser = Parsers::BaseParser.new( source ) + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + def parse + entities = nil + begin + while true + event = @parser.pull + #STDERR.puts "TREEPARSER GOT #{event.inspect}" + case event[0] + when :end_document + return + when :start_element + el = @build_context = @build_context.add_element( event[1] ) + event[2].each do |key, value| + el.attributes[key]=Attribute.new(key,value,self) + end + when :end_element + @build_context = @build_context.parent + when :text + if @build_context[-1].instance_of? Text + @build_context[-1] << event[1] + else + @build_context.add( + Text.new(event[1], @build_context.whitespace, nil, true) + ) unless ( + @build_context.ignore_whitespace_nodes and + event[1].strip.size==0 + ) + end + when :comment + c = Comment.new( event[1] ) + @build_context.add( c ) + when :cdata + c = CData.new( event[1] ) + @build_context.add( c ) + when :processing_instruction + @build_context.add( Instruction.new( event[1], event[2] ) ) + when :end_doctype + entities.each { |k,v| entities[k] = @build_context.entities[k].value } + @build_context = @build_context.parent + when :start_doctype + doctype = DocType.new( event[1..-1], @build_context ) + @build_context = doctype + entities = {} + when :attlistdecl + n = AttlistDecl.new( event[1..-1] ) + @build_context.add( n ) + when :externalentity + n = ExternalEntity.new( event[1] ) + @build_context.add( n ) + when :elementdecl + n = ElementDecl.new( event[1] ) + @build_context.add(n) + when :entitydecl + entities[ event[1] ] = event[2] unless event[2] =~ /PUBLIC|SYSTEM/ + @build_context.add(Entity.new(event)) + when :notationdecl + n = NotationDecl.new( *event[1..-1] ) + @build_context.add( n ) + when :xmldecl + x = XMLDecl.new( event[1], event[2], event[3] ) + @build_context.add( x ) + end + end + rescue REXML::Validation::ValidationException + raise + rescue REXML::ParseException + raise + rescue + raise ParseException.new( $!.message, @parser.source, @parser, $! ) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/ultralightparser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/ultralightparser.rb new file mode 100644 index 000000000..e0029f43d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/ultralightparser.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: false +require_relative 'streamparser' +require_relative 'baseparser' + +module REXML + module Parsers + class UltraLightParser + def initialize stream + @stream = stream + @parser = REXML::Parsers::BaseParser.new( stream ) + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + def rewind + @stream.rewind + @parser.stream = @stream + end + + def parse + root = context = [] + while true + event = @parser.pull + case event[0] + when :end_document + break + when :end_doctype + context = context[1] + when :start_element, :start_doctype + context << event + event[1,0] = [context] + context = event + when :end_element + context = context[1] + else + context << event + end + end + root + end + end + + # An element is an array. The array contains: + # 0 The parent element + # 1 The tag name + # 2 A hash of attributes + # 3..-1 The child elements + # An element is an array of size > 3 + # Text is a String + # PIs are [ :processing_instruction, target, data ] + # Comments are [ :comment, data ] + # DocTypes are DocType structs + # The root is an array with XMLDecls, Text, DocType, Array, Text + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/xpathparser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/xpathparser.rb new file mode 100644 index 000000000..a6d76fdc4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/parsers/xpathparser.rb @@ -0,0 +1,739 @@ +# frozen_string_literal: false + +require_relative '../namespace' +require_relative '../xmltokens' + +module REXML + module Parsers + # You don't want to use this class. Really. Use XPath, which is a wrapper + # for this class. Believe me. You don't want to poke around in here. + # There is strange, dark magic at work in this code. Beware. Go back! Go + # back while you still can! + class XPathParser + include XMLTokens + LITERAL = /^'([^']*)'|^"([^"]*)"/u + + def namespaces=( namespaces ) + Functions::namespace_context = namespaces + @namespaces = namespaces + end + + def parse path + path = path.dup + path.gsub!(/([\(\[])\s+/, '\1') # Strip ignorable spaces + path.gsub!( /\s+([\]\)])/, '\1') + parsed = [] + rest = OrExpr(path, parsed) + if rest + unless rest.strip.empty? + raise ParseException.new("Garbage component exists at the end: " + + "<#{rest}>: <#{path}>") + end + end + parsed + end + + def predicate path + parsed = [] + Predicate( "[#{path}]", parsed ) + parsed + end + + def abbreviate(path_or_parsed) + if path_or_parsed.kind_of?(String) + parsed = parse(path_or_parsed) + else + parsed = path_or_parsed + end + components = [] + component = nil + while parsed.size > 0 + op = parsed.shift + case op + when :node + component << "node()" + when :attribute + component = "@" + components << component + when :child + component = "" + components << component + when :descendant_or_self + next_op = parsed[0] + if next_op == :node + parsed.shift + component = "" + components << component + else + component = "descendant-or-self::" + components << component + end + when :self + next_op = parsed[0] + if next_op == :node + parsed.shift + components << "." + else + component = "self::" + components << component + end + when :parent + next_op = parsed[0] + if next_op == :node + parsed.shift + components << ".." + else + component = "parent::" + components << component + end + when :any + component << "*" + when :text + component << "text()" + when :following, :following_sibling, + :ancestor, :ancestor_or_self, :descendant, + :namespace, :preceding, :preceding_sibling + component = op.to_s.tr("_", "-") << "::" + components << component + when :qname + prefix = parsed.shift + name = parsed.shift + component << prefix+":" if prefix.size > 0 + component << name + when :predicate + component << '[' + component << predicate_to_path(parsed.shift) {|x| abbreviate(x)} + component << ']' + when :document + components << "" + when :function + component << parsed.shift + component << "( " + component << predicate_to_path(parsed.shift[0]) {|x| abbreviate(x)} + component << " )" + when :literal + component << quote_literal(parsed.shift) + else + component << "UNKNOWN(" + component << op.inspect + component << ")" + end + end + case components + when [""] + "/" + when ["", ""] + "//" + else + components.join("/") + end + end + + def expand(path_or_parsed) + if path_or_parsed.kind_of?(String) + parsed = parse(path_or_parsed) + else + parsed = path_or_parsed + end + path = "" + document = false + while parsed.size > 0 + op = parsed.shift + case op + when :node + path << "node()" + when :attribute, :child, :following, :following_sibling, + :ancestor, :ancestor_or_self, :descendant, :descendant_or_self, + :namespace, :preceding, :preceding_sibling, :self, :parent + path << "/" unless path.size == 0 + path << op.to_s.tr("_", "-") + path << "::" + when :any + path << "*" + when :qname + prefix = parsed.shift + name = parsed.shift + path << prefix+":" if prefix.size > 0 + path << name + when :predicate + path << '[' + path << predicate_to_path( parsed.shift ) { |x| expand(x) } + path << ']' + when :document + document = true + else + path << "UNKNOWN(" + path << op.inspect + path << ")" + end + end + path = "/"+path if document + path + end + + def predicate_to_path(parsed, &block) + path = "" + case parsed[0] + when :and, :or, :mult, :plus, :minus, :neq, :eq, :lt, :gt, :lteq, :gteq, :div, :mod, :union + op = parsed.shift + case op + when :eq + op = "=" + when :lt + op = "<" + when :gt + op = ">" + when :lteq + op = "<=" + when :gteq + op = ">=" + when :neq + op = "!=" + when :union + op = "|" + end + left = predicate_to_path( parsed.shift, &block ) + right = predicate_to_path( parsed.shift, &block ) + path << left + path << " " + path << op.to_s + path << " " + path << right + when :function + parsed.shift + name = parsed.shift + path << name + path << "(" + parsed.shift.each_with_index do |argument, i| + path << ", " if i > 0 + path << predicate_to_path(argument, &block) + end + path << ")" + when :literal + parsed.shift + path << quote_literal(parsed.shift) + else + path << yield( parsed ) + end + path.squeeze(" ") + end + # For backward compatibility + alias_method :preciate_to_string, :predicate_to_path + + private + def quote_literal( literal ) + case literal + when String + # XPath 1.0 does not support escape characters. + # Assumes literal does not contain both single and double quotes. + if literal.include?("'") + "\"#{literal}\"" + else + "'#{literal}'" + end + else + literal.inspect + end + end + + #LocationPath + # | RelativeLocationPath + # | '/' RelativeLocationPath? + # | '//' RelativeLocationPath + def LocationPath path, parsed + path = path.lstrip + if path[0] == ?/ + parsed << :document + if path[1] == ?/ + parsed << :descendant_or_self + parsed << :node + path = path[2..-1] + else + path = path[1..-1] + end + end + RelativeLocationPath( path, parsed ) if path.size > 0 + end + + #RelativeLocationPath + # | Step + # | (AXIS_NAME '::' | '@' | '') AxisSpecifier + # NodeTest + # Predicate + # | '.' | '..' AbbreviatedStep + # | RelativeLocationPath '/' Step + # | RelativeLocationPath '//' Step + AXIS = /^(ancestor|ancestor-or-self|attribute|child|descendant|descendant-or-self|following|following-sibling|namespace|parent|preceding|preceding-sibling|self)::/ + def RelativeLocationPath path, parsed + loop do + original_path = path + path = path.lstrip + + return original_path if path.empty? + + # (axis or @ or <child::>) nodetest predicate > + # OR > / Step + # (. or ..) > + if path[0] == ?. + if path[1] == ?. + parsed << :parent + parsed << :node + path = path[2..-1] + else + parsed << :self + parsed << :node + path = path[1..-1] + end + else + path_before_axis_specifier = path + parsed_not_abberviated = [] + if path[0] == ?@ + parsed_not_abberviated << :attribute + path = path[1..-1] + # Goto Nodetest + elsif path =~ AXIS + parsed_not_abberviated << $1.tr('-','_').intern + path = $' + # Goto Nodetest + else + parsed_not_abberviated << :child + end + + path_before_node_test = path + path = NodeTest(path, parsed_not_abberviated) + if path == path_before_node_test + return path_before_axis_specifier + end + path = Predicate(path, parsed_not_abberviated) + + parsed.concat(parsed_not_abberviated) + end + + original_path = path + path = path.lstrip + return original_path if path.empty? + + return original_path if path[0] != ?/ + + if path[1] == ?/ + parsed << :descendant_or_self + parsed << :node + path = path[2..-1] + else + path = path[1..-1] + end + end + end + + # Returns a 1-1 map of the nodeset + # The contents of the resulting array are either: + # true/false, if a positive match + # String, if a name match + #NodeTest + # | ('*' | NCNAME ':' '*' | QNAME) NameTest + # | '*' ':' NCNAME NameTest since XPath 2.0 + # | NODE_TYPE '(' ')' NodeType + # | PI '(' LITERAL ')' PI + # | '[' expr ']' Predicate + PREFIX_WILDCARD = /^\*:(#{NCNAME_STR})/u + LOCAL_NAME_WILDCARD = /^(#{NCNAME_STR}):\*/u + QNAME = Namespace::NAMESPLIT + NODE_TYPE = /^(comment|text|node)\(\s*\)/m + PI = /^processing-instruction\(/ + def NodeTest path, parsed + original_path = path + path = path.lstrip + case path + when PREFIX_WILDCARD + prefix = nil + name = $1 + path = $' + parsed << :qname + parsed << prefix + parsed << name + when /^\*/ + path = $' + parsed << :any + when NODE_TYPE + type = $1 + path = $' + parsed << type.tr('-', '_').intern + when PI + path = $' + literal = nil + if path =~ /^\s*\)/ + path = $' + else + path =~ LITERAL + literal = $1 + path = $' + raise ParseException.new("Missing ')' after processing instruction") if path[0] != ?) + path = path[1..-1] + end + parsed << :processing_instruction + parsed << (literal || '') + when LOCAL_NAME_WILDCARD + prefix = $1 + path = $' + parsed << :namespace + parsed << prefix + when QNAME + prefix = $1 + name = $2 + path = $' + prefix = "" unless prefix + parsed << :qname + parsed << prefix + parsed << name + else + path = original_path + end + path + end + + # Filters the supplied nodeset on the predicate(s) + def Predicate path, parsed + original_path = path + path = path.lstrip + return original_path unless path[0] == ?[ + predicates = [] + while path[0] == ?[ + path, expr = get_group(path) + predicates << expr[1..-2] if expr + end + predicates.each{ |pred| + preds = [] + parsed << :predicate + parsed << preds + OrExpr(pred, preds) + } + path + end + + # The following return arrays of true/false, a 1-1 mapping of the + # supplied nodeset, except for axe(), which returns a filtered + # nodeset + + #| OrExpr S 'or' S AndExpr + #| AndExpr + def OrExpr path, parsed + n = [] + rest = AndExpr( path, n ) + if rest != path + while rest =~ /^\s*( or )/ + n = [ :or, n, [] ] + rest = AndExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| AndExpr S 'and' S EqualityExpr + #| EqualityExpr + def AndExpr path, parsed + n = [] + rest = EqualityExpr( path, n ) + if rest != path + while rest =~ /^\s*( and )/ + n = [ :and, n, [] ] + rest = EqualityExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| EqualityExpr ('=' | '!=') RelationalExpr + #| RelationalExpr + def EqualityExpr path, parsed + n = [] + rest = RelationalExpr( path, n ) + if rest != path + while rest =~ /^\s*(!?=)\s*/ + if $1[0] == ?! + n = [ :neq, n, [] ] + else + n = [ :eq, n, [] ] + end + rest = RelationalExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| RelationalExpr ('<' | '>' | '<=' | '>=') AdditiveExpr + #| AdditiveExpr + def RelationalExpr path, parsed + n = [] + rest = AdditiveExpr( path, n ) + if rest != path + while rest =~ /^\s*([<>]=?)\s*/ + if $1[0] == ?< + sym = "lt" + else + sym = "gt" + end + sym << "eq" if $1[-1] == ?= + n = [ sym.intern, n, [] ] + rest = AdditiveExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| AdditiveExpr ('+' | '-') MultiplicativeExpr + #| MultiplicativeExpr + def AdditiveExpr path, parsed + n = [] + rest = MultiplicativeExpr( path, n ) + if rest != path + while rest =~ /^\s*(\+|-)\s*/ + if $1[0] == ?+ + n = [ :plus, n, [] ] + else + n = [ :minus, n, [] ] + end + rest = MultiplicativeExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| MultiplicativeExpr ('*' | S ('div' | 'mod') S) UnaryExpr + #| UnaryExpr + def MultiplicativeExpr path, parsed + n = [] + rest = UnaryExpr( path, n ) + if rest != path + while rest =~ /^\s*(\*| div | mod )\s*/ + if $1[0] == ?* + n = [ :mult, n, [] ] + elsif $1.include?( "div" ) + n = [ :div, n, [] ] + else + n = [ :mod, n, [] ] + end + rest = UnaryExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| '-' UnaryExpr + #| UnionExpr + def UnaryExpr path, parsed + path =~ /^(\-*)/ + path = $' + if $1 and (($1.size % 2) != 0) + mult = -1 + else + mult = 1 + end + parsed << :neg if mult < 0 + + n = [] + path = UnionExpr( path, n ) + parsed.concat( n ) + path + end + + #| UnionExpr '|' PathExpr + #| PathExpr + def UnionExpr path, parsed + n = [] + rest = PathExpr( path, n ) + if rest != path + while rest =~ /^\s*(\|)\s*/ + n = [ :union, n, [] ] + rest = PathExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace( n ) + elsif n.size > 0 + parsed << n + end + rest + end + + #| LocationPath + #| FilterExpr ('/' | '//') RelativeLocationPath + def PathExpr path, parsed + path = path.lstrip + n = [] + rest = FilterExpr( path, n ) + if rest != path + if rest and rest[0] == ?/ + rest = RelativeLocationPath(rest, n) + parsed.concat(n) + return rest + end + end + rest = LocationPath(rest, n) if rest =~ /\A[\/\.\@\[\w*]/ + parsed.concat(n) + rest + end + + #| FilterExpr Predicate + #| PrimaryExpr + def FilterExpr path, parsed + n = [] + path_before_primary_expr = path + path = PrimaryExpr(path, n) + return path_before_primary_expr if path == path_before_primary_expr + path = Predicate(path, n) + parsed.concat(n) + path + end + + #| VARIABLE_REFERENCE + #| '(' expr ')' + #| LITERAL + #| NUMBER + #| FunctionCall + VARIABLE_REFERENCE = /^\$(#{NAME_STR})/u + NUMBER = /^(\d*\.?\d+)/ + NT = /^comment|text|processing-instruction|node$/ + def PrimaryExpr path, parsed + case path + when VARIABLE_REFERENCE + varname = $1 + path = $' + parsed << :variable + parsed << varname + #arry << @variables[ varname ] + when /^(\w[-\w]*)(?:\()/ + fname = $1 + tmp = $' + return path if fname =~ NT + path = tmp + parsed << :function + parsed << fname + path = FunctionCall(path, parsed) + when NUMBER + varname = $1.nil? ? $2 : $1 + path = $' + parsed << :literal + parsed << (varname.include?('.') ? varname.to_f : varname.to_i) + when LITERAL + varname = $1.nil? ? $2 : $1 + path = $' + parsed << :literal + parsed << varname + when /^\(/ #/ + path, contents = get_group(path) + contents = contents[1..-2] + n = [] + OrExpr( contents, n ) + parsed.concat(n) + end + path + end + + #| FUNCTION_NAME '(' ( expr ( ',' expr )* )? ')' + def FunctionCall rest, parsed + path, arguments = parse_args(rest) + argset = [] + for argument in arguments + args = [] + OrExpr( argument, args ) + argset << args + end + parsed << argset + path + end + + # get_group( '[foo]bar' ) -> ['bar', '[foo]'] + def get_group string + ind = 0 + depth = 0 + st = string[0,1] + en = (st == "(" ? ")" : "]") + begin + case string[ind,1] + when st + depth += 1 + when en + depth -= 1 + end + ind += 1 + end while depth > 0 and ind < string.length + return nil unless depth==0 + [string[ind..-1], string[0..ind-1]] + end + + def parse_args( string ) + arguments = [] + ind = 0 + inquot = false + inapos = false + depth = 1 + begin + case string[ind] + when ?" + inquot = !inquot unless inapos + when ?' + inapos = !inapos unless inquot + else + unless inquot or inapos + case string[ind] + when ?( + depth += 1 + if depth == 1 + string = string[1..-1] + ind -= 1 + end + when ?) + depth -= 1 + if depth == 0 + s = string[0,ind].strip + arguments << s unless s == "" + string = string[ind+1..-1] + end + when ?, + if depth == 1 + s = string[0,ind].strip + arguments << s unless s == "" + string = string[ind+1..-1] + ind = -1 + end + end + end + end + ind += 1 + end while depth > 0 and ind < string.length + return nil unless depth==0 + [string,arguments] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/quickpath.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/quickpath.rb new file mode 100644 index 000000000..cded06f5f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/quickpath.rb @@ -0,0 +1,267 @@ +# frozen_string_literal: false +require_relative 'functions' +require_relative 'xmltokens' + +module REXML + class QuickPath + include Functions + include XMLTokens + + # A base Hash object to be used when initializing a + # default empty namespaces set. + EMPTY_HASH = {} + + def QuickPath::first element, path, namespaces=EMPTY_HASH + match(element, path, namespaces)[0] + end + + def QuickPath::each element, path, namespaces=EMPTY_HASH, &block + path = "*" unless path + match(element, path, namespaces).each( &block ) + end + + def QuickPath::match element, path, namespaces=EMPTY_HASH + raise "nil is not a valid xpath" unless path + results = nil + Functions::namespace_context = namespaces + case path + when /^\/([^\/]|$)/u + # match on root + path = path[1..-1] + return [element.root.parent] if path == '' + results = filter([element.root], path) + when /^[-\w]*::/u + results = filter([element], path) + when /^\*/u + results = filter(element.to_a, path) + when /^[\[!\w:]/u + # match on child + children = element.to_a + results = filter(children, path) + else + results = filter([element], path) + end + results + end + + # Given an array of nodes it filters the array based on the path. The + # result is that when this method returns, the array will contain elements + # which match the path + def QuickPath::filter elements, path + return elements if path.nil? or path == '' or elements.size == 0 + case path + when /^\/\//u # Descendant + axe( elements, "descendant-or-self", $' ) + when /^\/?\b(\w[-\w]*)\b::/u # Axe + axe( elements, $1, $' ) + when /^\/(?=\b([:!\w][-\.\w]*:)?[-!\*\.\w]*\b([^:(]|$)|\*)/u # Child + rest = $' + results = [] + elements.each do |element| + results |= filter( element.to_a, rest ) + end + results + when /^\/?(\w[-\w]*)\(/u # / Function + function( elements, $1, $' ) + when Namespace::NAMESPLIT # Element name + name = $2 + ns = $1 + rest = $' + elements.delete_if do |element| + !(element.kind_of? Element and + (element.expanded_name == name or + (element.name == name and + element.namespace == Functions.namespace_context[ns]))) + end + filter( elements, rest ) + when /^\/\[/u + matches = [] + elements.each do |element| + matches |= predicate( element.to_a, path[1..-1] ) if element.kind_of? Element + end + matches + when /^\[/u # Predicate + predicate( elements, path ) + when /^\/?\.\.\./u # Ancestor + axe( elements, "ancestor", $' ) + when /^\/?\.\./u # Parent + filter( elements.collect{|e|e.parent}, $' ) + when /^\/?\./u # Self + filter( elements, $' ) + when /^\*/u # Any + results = [] + elements.each do |element| + results |= filter( [element], $' ) if element.kind_of? Element + #if element.kind_of? Element + # children = element.to_a + # children.delete_if { |child| !child.kind_of?(Element) } + # results |= filter( children, $' ) + #end + end + results + else + [] + end + end + + def QuickPath::axe( elements, axe_name, rest ) + matches = [] + matches = filter( elements.dup, rest ) if axe_name =~ /-or-self$/u + case axe_name + when /^descendant/u + elements.each do |element| + matches |= filter( element.to_a, "descendant-or-self::#{rest}" ) if element.kind_of? Element + end + when /^ancestor/u + elements.each do |element| + while element.parent + matches << element.parent + element = element.parent + end + end + matches = filter( matches, rest ) + when "self" + matches = filter( elements, rest ) + when "child" + elements.each do |element| + matches |= filter( element.to_a, rest ) if element.kind_of? Element + end + when "attribute" + elements.each do |element| + matches << element.attributes[ rest ] if element.kind_of? Element + end + when "parent" + matches = filter(elements.collect{|element| element.parent}.uniq, rest) + when "following-sibling" + matches = filter(elements.collect{|element| element.next_sibling}.uniq, + rest) + when "previous-sibling" + matches = filter(elements.collect{|element| + element.previous_sibling}.uniq, rest ) + end + matches.uniq + end + + OPERAND_ = '((?=(?:(?!and|or).)*[^\s<>=])[^\s<>=]+)' + # A predicate filters a node-set with respect to an axis to produce a + # new node-set. For each node in the node-set to be filtered, the + # PredicateExpr is evaluated with that node as the context node, with + # the number of nodes in the node-set as the context size, and with the + # proximity position of the node in the node-set with respect to the + # axis as the context position; if PredicateExpr evaluates to true for + # that node, the node is included in the new node-set; otherwise, it is + # not included. + # + # A PredicateExpr is evaluated by evaluating the Expr and converting + # the result to a boolean. If the result is a number, the result will + # be converted to true if the number is equal to the context position + # and will be converted to false otherwise; if the result is not a + # number, then the result will be converted as if by a call to the + # boolean function. Thus a location path para[3] is equivalent to + # para[position()=3]. + def QuickPath::predicate( elements, path ) + ind = 1 + bcount = 1 + while bcount > 0 + bcount += 1 if path[ind] == ?[ + bcount -= 1 if path[ind] == ?] + ind += 1 + end + ind -= 1 + predicate = path[1..ind-1] + rest = path[ind+1..-1] + + # have to change 'a [=<>] b [=<>] c' into 'a [=<>] b and b [=<>] c' + # + predicate.gsub!( + /#{OPERAND_}\s*([<>=])\s*#{OPERAND_}\s*([<>=])\s*#{OPERAND_}/u, + '\1 \2 \3 and \3 \4 \5' ) + # Let's do some Ruby trickery to avoid some work: + predicate.gsub!( /&/u, "&&" ) + predicate.gsub!( /=/u, "==" ) + predicate.gsub!( /@(\w[-\w.]*)/u, 'attribute("\1")' ) + predicate.gsub!( /\bmod\b/u, "%" ) + predicate.gsub!( /\b(\w[-\w.]*\()/u ) { + fname = $1 + fname.gsub( /-/u, "_" ) + } + + Functions.pair = [ 0, elements.size ] + results = [] + elements.each do |element| + Functions.pair[0] += 1 + Functions.node = element + res = eval( predicate ) + case res + when true + results << element + when Integer + results << element if Functions.pair[0] == res + when String + results << element + end + end + filter( results, rest ) + end + + def QuickPath::attribute( name ) + Functions.node.attributes[name] if Functions.node.kind_of? Element + end + + def QuickPath::name() + Functions.node.name if Functions.node.kind_of? Element + end + + def QuickPath::method_missing( id, *args ) + begin + Functions.send( id.id2name, *args ) + rescue Exception + raise "METHOD: #{id.id2name}(#{args.join ', '})\n#{$!.message}" + end + end + + def QuickPath::function( elements, fname, rest ) + args = parse_args( elements, rest ) + Functions.pair = [0, elements.size] + results = [] + elements.each do |element| + Functions.pair[0] += 1 + Functions.node = element + res = Functions.send( fname, *args ) + case res + when true + results << element + when Integer + results << element if Functions.pair[0] == res + end + end + results + end + + def QuickPath::parse_args( element, string ) + # /.*?(?:\)|,)/ + arguments = [] + buffer = "" + while string and string != "" + c = string[0] + string.sub!(/^./u, "") + case c + when ?, + # if depth = 1, then we start a new argument + arguments << evaluate( buffer ) + #arguments << evaluate( string[0..count] ) + when ?( + # start a new method call + function( element, buffer, string ) + buffer = "" + when ?) + # close the method call and return arguments + return arguments + else + buffer << c + end + end + "" + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/rexml.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/rexml.rb new file mode 100644 index 000000000..226e19863 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/rexml.rb @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# frozen_string_literal: false +# +# \Module \REXML provides classes and methods for parsing, +# editing, and generating XML. +# +# == Implementation +# +# \REXML: +# - Is pure Ruby. +# - Provides tree, stream, SAX2, pull, and lightweight APIs. +# - Conforms to {XML version 1.0}[https://www.w3.org/TR/REC-xml/]. +# - Fully implements {XPath version 1.0}[http://www.w3c.org/tr/xpath]. +# - Is {non-validating}[https://www.w3.org/TR/xml/]. +# - Passes 100% of the non-validating {Oasis tests}[http://www.oasis-open.org/committees/xml-conformance/xml-test-suite.shtml]. +# +# == In a Hurry? +# +# If you're somewhat familiar with XML +# and have a particular task in mind, +# you may want to see {the tasks pages}[doc/rexml/tasks/tocs/master_toc_rdoc.html]. +# +# == API +# +# Among the most important classes for using \REXML are: +# - REXML::Document. +# - REXML::Element. +# +# There's also an {REXML tutorial}[doc/rexml/tutorial_rdoc.html]. +# +module REXML + COPYRIGHT = "Copyright © 2001-2008 Sean Russell <ser@germane-software.com>" + DATE = "2008/019" + VERSION = "3.4.4" + REVISION = "" + + Copyright = COPYRIGHT + Version = VERSION +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/sax2listener.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/sax2listener.rb new file mode 100644 index 000000000..5afdc8089 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/sax2listener.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: false +module REXML + # A template for stream parser listeners. + # Note that the declarations (attlistdecl, elementdecl, etc) are trivially + # processed; REXML doesn't yet handle doctype entity declarations, so you + # have to parse them out yourself. + # === Missing methods from SAX2 + # ignorable_whitespace + # === Methods extending SAX2 + # +WARNING+ + # These methods are certainly going to change, until DTDs are fully + # supported. Be aware of this. + # start_document + # end_document + # doctype + # elementdecl + # attlistdecl + # entitydecl + # notationdecl + # cdata + # xmldecl + # comment + module SAX2Listener + def start_document + end + def end_document + end + def start_prefix_mapping prefix, uri + end + def end_prefix_mapping prefix + end + def start_element uri, localname, qname, attributes + end + def end_element uri, localname, qname + end + def characters text + end + def processing_instruction target, data + end + # Handles a doctype declaration. Any attributes of the doctype which are + # not supplied will be nil. # EG, <!DOCTYPE me PUBLIC "foo" "bar"> + # @p name the name of the doctype; EG, "me" + # @p pub_sys "PUBLIC", "SYSTEM", or nil. EG, "PUBLIC" + # @p long_name the supplied long name, or nil. EG, "foo" + # @p uri the uri of the doctype, or nil. EG, "bar" + def doctype name, pub_sys, long_name, uri + end + # If a doctype includes an ATTLIST declaration, it will cause this + # method to be called. The content is the declaration itself, unparsed. + # EG, <!ATTLIST el attr CDATA #REQUIRED> will come to this method as "el + # attr CDATA #REQUIRED". This is the same for all of the .*decl + # methods. + def attlistdecl(element, pairs, contents) + end + # <!ELEMENT ...> + def elementdecl content + end + # <!ENTITY ...> + # The argument passed to this method is an array of the entity + # declaration. It can be in a number of formats, but in general it + # returns (example, result): + # <!ENTITY % YN '"Yes"'> + # ["%", "YN", "\"Yes\""] + # <!ENTITY % YN 'Yes'> + # ["%", "YN", "Yes"] + # <!ENTITY WhatHeSaid "He said %YN;"> + # ["WhatHeSaid", "He said %YN;"] + # <!ENTITY open-hatch SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml"> + # ["open-hatch", "SYSTEM", "http://www.textuality.com/boilerplate/OpenHatch.xml"] + # <!ENTITY open-hatch PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN" "http://www.textuality.com/boilerplate/OpenHatch.xml"> + # ["open-hatch", "PUBLIC", "-//Textuality//TEXT Standard open-hatch boilerplate//EN", "http://www.textuality.com/boilerplate/OpenHatch.xml"] + # <!ENTITY hatch-pic SYSTEM "../grafix/OpenHatch.gif" NDATA gif> + # ["hatch-pic", "SYSTEM", "../grafix/OpenHatch.gif", "NDATA", "gif"] + def entitydecl declaration + end + # <!NOTATION ...> + def notationdecl name, public_or_system, public_id, system_id + end + # Called when <![CDATA[ ... ]]> is encountered in a document. + # @p content "..." + def cdata content + end + # Called when an XML PI is encountered in the document. + # EG: <?xml version="1.0" encoding="utf"?> + # @p version the version attribute value. EG, "1.0" + # @p encoding the encoding attribute value, or nil. EG, "utf" + # @p standalone the standalone attribute value, or nil. EG, nil + # @p spaced the declaration is followed by a line break + def xmldecl version, encoding, standalone + end + # Called when a comment is encountered. + # @p comment The content of the comment + def comment comment + end + def progress position + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/security.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/security.rb new file mode 100644 index 000000000..e8e8c6b48 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/security.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: false +module REXML + module Security + @@entity_expansion_limit = 10_000 + + # Set the entity expansion limit. By default the limit is set to 10000. + def self.entity_expansion_limit=( val ) + @@entity_expansion_limit = val + end + + # Get the entity expansion limit. By default the limit is set to 10000. + def self.entity_expansion_limit + @@entity_expansion_limit + end + + @@entity_expansion_text_limit = 10_240 + + # Set the entity expansion limit. By default the limit is set to 10240. + def self.entity_expansion_text_limit=( val ) + @@entity_expansion_text_limit = val + end + + # Get the entity expansion limit. By default the limit is set to 10240. + def self.entity_expansion_text_limit + @@entity_expansion_text_limit + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/source.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/source.rb new file mode 100644 index 000000000..8b8ba0da7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/source.rb @@ -0,0 +1,388 @@ +# coding: US-ASCII +# frozen_string_literal: false + +require "stringio" +require "strscan" + +require_relative 'encoding' + +module REXML + if StringScanner::Version < "1.0.0" + module StringScannerCheckScanString + refine StringScanner do + def check(pattern) + pattern = /#{Regexp.escape(pattern)}/ if pattern.is_a?(String) + super(pattern) + end + + def scan(pattern) + pattern = /#{Regexp.escape(pattern)}/ if pattern.is_a?(String) + super(pattern) + end + + def match?(pattern) + pattern = /#{Regexp.escape(pattern)}/ if pattern.is_a?(String) + super(pattern) + end + + def skip(pattern) + pattern = /#{Regexp.escape(pattern)}/ if pattern.is_a?(String) + super(pattern) + end + end + end + using StringScannerCheckScanString + end + + # Generates Source-s. USE THIS CLASS. + class SourceFactory + # Generates a Source object + # @param arg Either a String, or an IO + # @return a Source, or nil if a bad argument was given + def SourceFactory::create_from(arg) + if arg.respond_to? :read and + arg.respond_to? :readline and + arg.respond_to? :nil? and + arg.respond_to? :eof? + IOSource.new(arg) + elsif arg.respond_to? :to_str + IOSource.new(StringIO.new(arg)) + elsif arg.kind_of? Source + arg + else + raise "#{arg.class} is not a valid input stream. It must walk \n"+ + "like either a String, an IO, or a Source." + end + end + end + + # A Source can be searched for patterns, and wraps buffers and other + # objects and provides consumption of text + class Source + include Encoding + # The line number of the last consumed text + attr_reader :line + attr_reader :encoding + + module Private + SPACES_PATTERN = /\s+/um + SCANNER_RESET_SIZE = 100000 + PRE_DEFINED_TERM_PATTERNS = {} + pre_defined_terms = ["'", '"', "<", "]]>", "?>"] + if StringScanner::Version < "3.1.1" + pre_defined_terms.each do |term| + PRE_DEFINED_TERM_PATTERNS[term] = /#{Regexp.escape(term)}/ + end + else + pre_defined_terms.each do |term| + PRE_DEFINED_TERM_PATTERNS[term] = term + end + end + end + private_constant :Private + + # Constructor + # @param arg must be a String, and should be a valid XML document + # @param encoding if non-null, sets the encoding of the source to this + # value, overriding all encoding detection + def initialize(arg, encoding=nil) + @orig = arg + @scanner = StringScanner.new(@orig) + if encoding + self.encoding = encoding + else + detect_encoding + end + @line = 0 + @encoded_terms = {} + end + + # The current buffer (what we're going to read next) + def buffer + @scanner.rest + end + + def drop_parsed_content + if @scanner.pos > Private::SCANNER_RESET_SIZE + @scanner.string = @scanner.rest + end + end + + def buffer_encoding=(encoding) + @scanner.string.force_encoding(encoding) + end + + # Inherited from Encoding + # Overridden to support optimized en/decoding + def encoding=(enc) + return unless super + encoding_updated + end + + def read(term = nil) + end + + def read_until(term) + pattern = Private::PRE_DEFINED_TERM_PATTERNS[term] || /#{Regexp.escape(term)}/ + data = @scanner.scan_until(pattern) + unless data + data = @scanner.rest + @scanner.pos = @scanner.string.bytesize + end + data + end + + def ensure_buffer + end + + def match(pattern, cons=false) + if cons + @scanner.scan(pattern).nil? ? nil : @scanner + else + @scanner.check(pattern).nil? ? nil : @scanner + end + end + + def match?(pattern, cons=false) + if cons + !@scanner.skip(pattern).nil? + else + !@scanner.match?(pattern).nil? + end + end + + def skip_spaces + @scanner.skip(Private::SPACES_PATTERN) ? true : false + end + + def position + @scanner.pos + end + + def position=(pos) + @scanner.pos = pos + end + + def peek_byte + @scanner.peek_byte + end + + def scan_byte + @scanner.scan_byte + end + + # @return true if the Source is exhausted + def empty? + @scanner.eos? + end + + # @return the current line in the source + def current_line + lines = @orig.split + res = lines.grep @scanner.rest[0..30] + res = res[-1] if res.kind_of? Array + lines.index( res ) if res + end + + private + + def detect_encoding + scanner_encoding = @scanner.rest.encoding + detected_encoding = "UTF-8" + begin + @scanner.string.force_encoding("ASCII-8BIT") + if @scanner.scan(/\xfe\xff/n) + detected_encoding = "UTF-16BE" + elsif @scanner.scan(/\xff\xfe/n) + detected_encoding = "UTF-16LE" + elsif @scanner.scan(/\xef\xbb\xbf/n) + detected_encoding = "UTF-8" + end + ensure + @scanner.string.force_encoding(scanner_encoding) + end + self.encoding = detected_encoding + end + + def encoding_updated + if @encoding != 'UTF-8' + @scanner.string = decode(@scanner.rest) + @to_utf = true + else + @to_utf = false + @scanner.string.force_encoding(::Encoding::UTF_8) + end + end + end + + # A Source that wraps an IO. See the Source class for method + # documentation + class IOSource < Source + #attr_reader :block_size + + # block_size has been deprecated + def initialize(arg, block_size=500, encoding=nil) + @er_source = @source = arg + @to_utf = false + @pending_buffer = nil + + if encoding + super("", encoding) + else + super(@source.read(3) || "") + end + + if !@to_utf and + @orig.respond_to?(:force_encoding) and + @source.respond_to?(:external_encoding) and + @source.external_encoding != ::Encoding::UTF_8 + @force_utf8 = true + else + @force_utf8 = false + end + end + + def read(term = nil, min_bytes = 1) + term = encode(term) if term + begin + str = readline(term) + @scanner << str + read_bytes = str.bytesize + begin + while read_bytes < min_bytes + str = readline(term) + @scanner << str + read_bytes += str.bytesize + end + rescue IOError + end + true + rescue Exception, NameError + @source = nil + false + end + end + + def read_until(term) + pattern = Private::PRE_DEFINED_TERM_PATTERNS[term] || /#{Regexp.escape(term)}/ + term = @encoded_terms[term] ||= encode(term) + until str = @scanner.scan_until(pattern) + break if @source.nil? + break if @source.eof? + @scanner << readline(term) + end + if str + read if @scanner.eos? and @source and !@source.eof? + str + else + rest = @scanner.rest + @scanner.pos = @scanner.string.bytesize + rest + end + end + + def ensure_buffer + read if @scanner.eos? && @source + end + + def match( pattern, cons=false ) + # To avoid performance issue, we need to increase bytes to read per scan + min_bytes = 1 + while true + if cons + md = @scanner.scan(pattern) + else + md = @scanner.check(pattern) + end + break if md + return nil if pattern.is_a?(String) + return nil if @source.nil? + return nil unless read(nil, min_bytes) + min_bytes *= 2 + end + + md.nil? ? nil : @scanner + end + + def match?( pattern, cons=false ) + # To avoid performance issue, we need to increase bytes to read per scan + min_bytes = 1 + while true + if cons + n_matched_bytes = @scanner.skip(pattern) + else + n_matched_bytes = @scanner.match?(pattern) + end + return true if n_matched_bytes + return false if pattern.is_a?(String) + return false if @source.nil? + return false unless read(nil, min_bytes) + min_bytes *= 2 + end + end + + def empty? + super and ( @source.nil? || @source.eof? ) + end + + # @return the current line in the source + def current_line + begin + pos = @er_source.pos # The byte position in the source + lineno = @er_source.lineno # The XML < position in the source + @er_source.rewind + line = 0 # The \r\n position in the source + begin + while @er_source.pos < pos + @er_source.readline + line += 1 + end + rescue + end + @er_source.seek(pos) + rescue IOError, SystemCallError + pos = -1 + line = -1 + end + [pos, lineno, line] + end + + private + def readline(term = nil) + if @pending_buffer + begin + str = @source.readline(term || @line_break) + rescue IOError + end + if str.nil? + str = @pending_buffer + else + str = @pending_buffer + str + end + @pending_buffer = nil + else + str = @source.readline(term || @line_break) + end + return nil if str.nil? + + if @to_utf + decode(str) + else + str.force_encoding(::Encoding::UTF_8) if @force_utf8 + str + end + end + + def encoding_updated + case @encoding + when "UTF-16BE", "UTF-16LE" + @source.binmode + @source.set_encoding(@encoding, @encoding) + end + @line_break = encode(">") + @pending_buffer, @scanner.string = @scanner.rest, "" + @pending_buffer.force_encoding(@encoding) + super + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/streamlistener.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/streamlistener.rb new file mode 100644 index 000000000..30c894517 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/streamlistener.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: false +module REXML + # A template for stream parser listeners. + # Note that the declarations (attlistdecl, elementdecl, etc) are trivially + # processed; REXML doesn't yet handle doctype entity declarations, so you + # have to parse them out yourself. + module StreamListener + # Called when a tag is encountered. + # @p name the tag name + # @p attrs an array of arrays of attribute/value pairs, suitable for + # use with assoc or rassoc. IE, <tag attr1="value1" attr2="value2"> + # will result in + # tag_start( "tag", # [["attr1","value1"],["attr2","value2"]]) + def tag_start name, attrs + end + # Called when the end tag is reached. In the case of <tag/>, tag_end + # will be called immediately after tag_start + # @p the name of the tag + def tag_end name + end + # Called when text is encountered in the document + # @p text the text content. + def text text + end + # Called when an instruction is encountered. EG: <?xsl sheet='foo'?> + # @p name the instruction name; in the example, "xsl" + # @p instruction the rest of the instruction. In the example, + # "sheet='foo'" + def instruction name, instruction + end + # Called when a comment is encountered. + # @p comment The content of the comment + def comment comment + end + # Handles a doctype declaration. Any attributes of the doctype which are + # not supplied will be nil. # EG, <!DOCTYPE me PUBLIC "foo" "bar"> + # @p name the name of the doctype; EG, "me" + # @p pub_sys "PUBLIC", "SYSTEM", or nil. EG, "PUBLIC" + # @p long_name the supplied long name, or nil. EG, "foo" + # @p uri the uri of the doctype, or nil. EG, "bar" + def doctype name, pub_sys, long_name, uri + end + # Called when the doctype is done + def doctype_end + end + # If a doctype includes an ATTLIST declaration, it will cause this + # method to be called. The content is the declaration itself, unparsed. + # EG, <!ATTLIST el attr CDATA #REQUIRED> will come to this method as "el + # attr CDATA #REQUIRED". This is the same for all of the .*decl + # methods. + def attlistdecl element_name, attributes, raw_content + end + # <!ELEMENT ...> + def elementdecl content + end + # <!ENTITY ...> + # The argument passed to this method is an array of the entity + # declaration. It can be in a number of formats, but in general it + # returns (example, result): + # <!ENTITY % YN '"Yes"'> + # ["YN", "\"Yes\"", "%"] + # <!ENTITY % YN 'Yes'> + # ["YN", "Yes", "%"] + # <!ENTITY WhatHeSaid "He said %YN;"> + # ["WhatHeSaid", "He said %YN;"] + # <!ENTITY open-hatch SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml"> + # ["open-hatch", "SYSTEM", "http://www.textuality.com/boilerplate/OpenHatch.xml"] + # <!ENTITY open-hatch PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN" "http://www.textuality.com/boilerplate/OpenHatch.xml"> + # ["open-hatch", "PUBLIC", "-//Textuality//TEXT Standard open-hatch boilerplate//EN", "http://www.textuality.com/boilerplate/OpenHatch.xml"] + # <!ENTITY hatch-pic SYSTEM "../grafix/OpenHatch.gif" NDATA gif> + # ["hatch-pic", "SYSTEM", "../grafix/OpenHatch.gif", "gif"] + def entitydecl content + end + # <!NOTATION ...> + def notationdecl content + end + # Called when %foo; is encountered in a doctype declaration. + # @p content "foo" + def entity content + end + # Called when <![CDATA[ ... ]]> is encountered in a document. + # @p content "..." + def cdata content + end + # Called when an XML PI is encountered in the document. + # EG: <?xml version="1.0" encoding="utf"?> + # @p version the version attribute value. EG, "1.0" + # @p encoding the encoding attribute value, or nil. EG, "utf" + # @p standalone the standalone attribute value, or nil. EG, nil + def xmldecl version, encoding, standalone + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/text.rb new file mode 100644 index 000000000..8d5281cdd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/text.rb @@ -0,0 +1,420 @@ +# frozen_string_literal: true +require_relative 'security' +require_relative 'entity' +require_relative 'doctype' +require_relative 'child' +require_relative 'doctype' +require_relative 'parseexception' + +module REXML + # Represents text nodes in an XML document + class Text < Child + include Comparable + # The order in which the substitutions occur + SPECIALS = [ /&(?!#?[\w-]+;)/u, /</u, />/u, /"/u, /'/u, /\r/u ] + SUBSTITUTES = ['&', '<', '>', '"', ''', ' '] + # Characters which are substituted in written strings + SLAICEPS = [ '<', '>', '"', "'", '&' ] + SETUTITSBUS = [ /</u, />/u, /"/u, /'/u, /&/u ] + + # If +raw+ is true, then REXML leaves the value alone + attr_accessor :raw + + NEEDS_A_SECOND_CHECK = /(<|&((#{Entity::NAME});|(#0*((?:\d+)|(?:x[a-fA-F0-9]+)));)?)/um + NUMERICENTITY = /�*((?:\d+)|(?:x[a-fA-F0-9]+));/ + VALID_CHAR = [ + 0x9, 0xA, 0xD, + (0x20..0xD7FF), + (0xE000..0xFFFD), + (0x10000..0x10FFFF) + ] + + VALID_XML_CHARS = Regexp.new('^['+ + VALID_CHAR.map { |item| + case item + when Integer + [item].pack('U').force_encoding('utf-8') + when Range + [item.first, '-'.ord, item.last].pack('UUU').force_encoding('utf-8') + end + }.join + + ']*$') + + # Constructor + # +arg+ if a String, the content is set to the String. If a Text, + # the object is shallowly cloned. + # + # +respect_whitespace+ (boolean, false) if true, whitespace is + # respected + # + # +parent+ (nil) if this is a Parent object, the parent + # will be set to this. + # + # +raw+ (nil) This argument can be given three values. + # If true, then the value of used to construct this object is expected to + # contain no unescaped XML markup, and REXML will not change the text. If + # this value is false, the string may contain any characters, and REXML will + # escape any and all defined entities whose values are contained in the + # text. If this value is nil (the default), then the raw value of the + # parent will be used as the raw value for this node. If there is no raw + # value for the parent, and no value is supplied, the default is false. + # Use this field if you have entities defined for some text, and you don't + # want REXML to escape that text in output. + # Text.new( "<&", false, nil, false ) #-> "<&" + # Text.new( "<&", false, nil, false ) #-> "&lt;&amp;" + # Text.new( "<&", false, nil, true ) #-> Parse exception + # Text.new( "<&", false, nil, true ) #-> "<&" + # # Assume that the entity "s" is defined to be "sean" + # # and that the entity "r" is defined to be "russell" + # Text.new( "sean russell" ) #-> "&s; &r;" + # Text.new( "sean russell", false, nil, true ) #-> "sean russell" + # + # +entity_filter+ (nil) This can be an array of entities to match in the + # supplied text. This argument is only useful if +raw+ is set to false. + # Text.new( "sean russell", false, nil, false, ["s"] ) #-> "&s; russell" + # Text.new( "sean russell", false, nil, true, ["s"] ) #-> "sean russell" + # In the last example, the +entity_filter+ argument is ignored. + # + # +illegal+ INTERNAL USE ONLY + def initialize(arg, respect_whitespace=false, parent=nil, raw=nil, + entity_filter=nil, illegal=NEEDS_A_SECOND_CHECK ) + + @raw = false + @parent = nil + @entity_filter = nil + + if parent + super( parent ) + @raw = parent.raw + end + + if arg.kind_of? String + @string = arg.dup + elsif arg.kind_of? Text + @string = arg.instance_variable_get(:@string).dup + @raw = arg.raw + @entity_filter = arg.instance_variable_get(:@entity_filter) + else + raise "Illegal argument of type #{arg.type} for Text constructor (#{arg})" + end + + @string.squeeze!(" \n\t") unless respect_whitespace + @string.gsub!(/\r\n?/, "\n") + @raw = raw unless raw.nil? + @entity_filter = entity_filter if entity_filter + clear_cache + + Text.check(@string, illegal) if @raw + end + + def parent= parent + super(parent) + Text.check(@string, NEEDS_A_SECOND_CHECK) if @raw and @parent + end + + # check for illegal characters + def Text.check string, pattern, doctype = nil + + # illegal anywhere + if !string.match?(VALID_XML_CHARS) + string.chars.each do |c| + case c.ord + when *VALID_CHAR + else + raise "Illegal character #{c.inspect} in raw string #{string.inspect}" + end + end + end + + pos = 0 + while (index = string.index(/<|&/, pos)) + if string[index] == "<" + raise "Illegal character \"#{string[index]}\" in raw string #{string.inspect}" + end + + unless (end_index = string.index(/[^\s];/, index + 1)) + raise "Illegal character \"#{string[index]}\" in raw string #{string.inspect}" + end + + value = string[(index + 1)..end_index] + if /\s/.match?(value) + raise "Illegal character \"#{string[index]}\" in raw string #{string.inspect}" + end + + if value[0] == "#" + character_reference = value[1..-1] + + unless (/\A(\d+|x[0-9a-fA-F]+)\z/.match?(character_reference)) + if character_reference[0] == "x" || character_reference[-1] == "x" + raise "Illegal character \"#{string[index]}\" in raw string #{string.inspect}" + else + raise "Illegal character #{string.inspect} in raw string #{string.inspect}" + end + end + + case (character_reference[0] == "x" ? character_reference[1..-1].to_i(16) : character_reference[0..-1].to_i) + when *VALID_CHAR + else + raise "Illegal character #{string.inspect} in raw string #{string.inspect}" + end + elsif !(/\A#{Entity::NAME}\z/um.match?(value)) + raise "Illegal character \"#{string[index]}\" in raw string #{string.inspect}" + end + + pos = end_index + 1 + end + + string + end + + def node_type + :text + end + + def empty? + @string.size==0 + end + + + def clone + Text.new(self, true) + end + + + # Appends text to this text node. The text is appended in the +raw+ mode + # of this text node. + # + # +returns+ the text itself to enable method chain like + # 'text << "XXX" << "YYY"'. + def <<( to_append ) + @string << to_append.gsub( /\r\n?/, "\n" ) + clear_cache + self + end + + + # +other+ a String or a Text + # +returns+ the result of (to_s <=> arg.to_s) + def <=>( other ) + to_s() <=> other.to_s + end + + def doctype + @parent&.document&.doctype + end + + REFERENCE = /#{Entity::REFERENCE}/ + # Returns the string value of this text node. This string is always + # escaped, meaning that it is a valid XML text node string, and all + # entities that can be escaped, have been inserted. This method respects + # the entity filter set in the constructor. + # + # # Assume that the entity "s" is defined to be "sean", and that the + # # entity "r" is defined to be "russell" + # t = Text.new( "< & sean russell", false, nil, false, ['s'] ) + # t.to_s #-> "< & &s; russell" + # t = Text.new( "< & &s; russell", false, nil, false ) + # t.to_s #-> "< & &s; russell" + # u = Text.new( "sean russell", false, nil, true ) + # u.to_s #-> "sean russell" + def to_s + return @string if @raw + @normalized ||= Text::normalize( @string, doctype, @entity_filter ) + end + + def inspect + @string.inspect + end + + # Returns the string value of this text. This is the text without + # entities, as it might be used programmatically, or printed to the + # console. This ignores the 'raw' attribute setting, and any + # entity_filter. + # + # # Assume that the entity "s" is defined to be "sean", and that the + # # entity "r" is defined to be "russell" + # t = Text.new( "< & sean russell", false, nil, false, ['s'] ) + # t.value #-> "< & sean russell" + # t = Text.new( "< & &s; russell", false, nil, false ) + # t.value #-> "< & sean russell" + # u = Text.new( "sean russell", false, nil, true ) + # u.value #-> "sean russell" + def value + @unnormalized ||= Text::unnormalize(@string, doctype, + entity_expansion_text_limit: document&.entity_expansion_text_limit) + end + + # Sets the contents of this text node. This expects the text to be + # unnormalized. It returns self. + # + # e = Element.new( "a" ) + # e.add_text( "foo" ) # <a>foo</a> + # e[0].value = "bar" # <a>bar</a> + # e[0].value = "<a>" # <a><a></a> + def value=( val ) + @string = val.gsub( /\r\n?/, "\n" ) + clear_cache + @raw = false + end + + def wrap(string, width, addnewline=false) + # Recursively wrap string at width. + return string if string.length <= width + place = string.rindex(' ', width) # Position in string with last ' ' before cutoff + if addnewline + "\n" + string[0,place] + "\n" + wrap(string[place+1..-1], width) + else + string[0,place] + "\n" + wrap(string[place+1..-1], width) + end + end + + def indent_text(string, level=1, style="\t", indentfirstline=true) + Kernel.warn("#{self.class.name}#indent_text is deprecated. See REXML::Formatters", uplevel: 1) + return string if level < 0 + + new_string = +'' + string.each_line { |line| + indent_string = style * level + new_line = (indent_string + line).sub(/[\s]+$/,'') + new_string << new_line + } + new_string.strip! unless indentfirstline + new_string + end + + # == DEPRECATED + # See REXML::Formatters + # + def write( writer, indent=-1, transitive=false, ie_hack=false ) + Kernel.warn("#{self.class.name}#write is deprecated. See REXML::Formatters", uplevel: 1) + formatter = if indent > -1 + REXML::Formatters::Pretty.new( indent ) + else + REXML::Formatters::Default.new + end + formatter.write( self, writer ) + end + + # FIXME + # This probably won't work properly + def xpath + @parent.xpath + "/text()" + end + + # Writes out text, substituting special characters beforehand. + # +out+ A String, IO, or any other object supporting <<( String ) + # +input+ the text to substitute and the write out + # + # z=utf8.unpack("U*") + # ascOut="" + # z.each{|r| + # if r < 0x100 + # ascOut.concat(r.chr) + # else + # ascOut.concat(sprintf("&#x%x;", r)) + # end + # } + # puts ascOut + def write_with_substitution out, input + copy = input.clone + # Doing it like this rather than in a loop improves the speed + copy.gsub!( SPECIALS[0], SUBSTITUTES[0] ) + copy.gsub!( SPECIALS[1], SUBSTITUTES[1] ) + copy.gsub!( SPECIALS[2], SUBSTITUTES[2] ) + copy.gsub!( SPECIALS[3], SUBSTITUTES[3] ) + copy.gsub!( SPECIALS[4], SUBSTITUTES[4] ) + copy.gsub!( SPECIALS[5], SUBSTITUTES[5] ) + out << copy + end + + private + def clear_cache + @normalized = nil + @unnormalized = nil + end + + # Reads text, substituting entities + def Text::read_with_substitution( input, illegal=nil ) + copy = input.clone + + if copy =~ illegal + raise ParseException.new( "malformed text: Illegal character #$& in \"#{copy}\"" ) + end if illegal + + copy.gsub!( /\r\n?/, "\n" ) + if copy.include? ?& + copy.gsub!( SETUTITSBUS[0], SLAICEPS[0] ) + copy.gsub!( SETUTITSBUS[1], SLAICEPS[1] ) + copy.gsub!( SETUTITSBUS[2], SLAICEPS[2] ) + copy.gsub!( SETUTITSBUS[3], SLAICEPS[3] ) + copy.gsub!( SETUTITSBUS[4], SLAICEPS[4] ) + copy.gsub!( /�*((?:\d+)|(?:x[a-f0-9]+));/ ) { + m=$1 + #m='0' if m=='' + m = "0#{m}" if m[0] == ?x + [Integer(m)].pack('U*') + } + end + copy + end + + EREFERENCE = /&(?!#{Entity::NAME};)/ + # Escapes all possible entities + def Text::normalize( input, doctype=nil, entity_filter=nil ) + copy = input.to_s + # Doing it like this rather than in a loop improves the speed + #copy = copy.gsub( EREFERENCE, '&' ) + copy = copy.gsub( "&", "&" ) if copy.include?("&") + if doctype + # Replace all ampersands that aren't part of an entity + doctype.entities.each_value do |entity| + copy = copy.gsub( entity.value, + "&#{entity.name};" ) if entity.value and + not( entity_filter and entity_filter.include?(entity.name) ) + end + else + # Replace all ampersands that aren't part of an entity + DocType::DEFAULT_ENTITIES.each_value do |entity| + if copy.include?(entity.value) + copy = copy.gsub(entity.value, "&#{entity.name};" ) + end + end + end + copy + end + + # Unescapes all possible entities + def Text::unnormalize( string, doctype=nil, filter=nil, illegal=nil, entity_expansion_text_limit: nil ) + entity_expansion_text_limit ||= Security.entity_expansion_text_limit + sum = 0 + string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) { + s = Text.expand($&, doctype, filter) + if sum + s.bytesize > entity_expansion_text_limit + raise "entity expansion has grown too large" + else + sum += s.bytesize + end + s + } + end + + def Text.expand(ref, doctype, filter) + if ref[1] == ?# + if ref[2] == ?x + [ref[3...-1].to_i(16)].pack('U*') + else + [ref[2...-1].to_i].pack('U*') + end + elsif ref == '&' + '&' + elsif filter and filter.include?( ref[1...-1] ) + ref + elsif doctype + doctype.entity( ref[1...-1] ) or ref + else + entity_value = DocType::DEFAULT_ENTITIES[ ref[1...-1] ] + entity_value ? entity_value.value : ref + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/undefinednamespaceexception.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/undefinednamespaceexception.rb new file mode 100644 index 000000000..492a09818 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/undefinednamespaceexception.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: false +require_relative 'parseexception' +module REXML + class UndefinedNamespaceException < ParseException + def initialize( prefix, source, parser ) + super( "Undefined prefix #{prefix} found" ) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/relaxng.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/relaxng.rb new file mode 100644 index 000000000..c6894dcb2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/relaxng.rb @@ -0,0 +1,540 @@ +# frozen_string_literal: false +require_relative "validation" +require_relative "../parsers/baseparser" + +module REXML + module Validation + # Implemented: + # * empty + # * element + # * attribute + # * text + # * optional + # * choice + # * oneOrMore + # * zeroOrMore + # * group + # * value + # * interleave + # * mixed + # * ref + # * grammar + # * start + # * define + # + # Not implemented: + # * data + # * param + # * include + # * externalRef + # * notAllowed + # * anyName + # * nsName + # * except + # * name + class RelaxNG + include Validator + + INFINITY = 1.0 / 0.0 + EMPTY = Event.new( nil ) + TEXT = [:start_element, "text"] + attr_accessor :current + attr_accessor :count + attr_reader :references + + # FIXME: Namespaces + def initialize source + parser = REXML::Parsers::BaseParser.new( source ) + + @count = 0 + @references = {} + @root = @current = Sequence.new(self) + @root.previous = true + states = [ @current ] + begin + event = parser.pull + case event[0] + when :start_element + case event[1] + when "empty" + when "element", "attribute", "text", "value" + states[-1] << event + when "optional" + states << Optional.new( self ) + states[-2] << states[-1] + when "choice" + states << Choice.new( self ) + states[-2] << states[-1] + when "oneOrMore" + states << OneOrMore.new( self ) + states[-2] << states[-1] + when "zeroOrMore" + states << ZeroOrMore.new( self ) + states[-2] << states[-1] + when "group" + states << Sequence.new( self ) + states[-2] << states[-1] + when "interleave" + states << Interleave.new( self ) + states[-2] << states[-1] + when "mixed" + states << Interleave.new( self ) + states[-2] << states[-1] + states[-1] << TEXT + when "define" + states << [ event[2]["name"] ] + when "ref" + states[-1] << Ref.new( event[2]["name"] ) + when "anyName" + states << AnyName.new( self ) + states[-2] << states[-1] + when "nsName" + when "except" + when "name" + when "data" + when "param" + when "include" + when "grammar" + when "start" + when "externalRef" + when "notAllowed" + end + when :end_element + case event[1] + when "element", "attribute" + states[-1] << event + when "zeroOrMore", "oneOrMore", "choice", "optional", + "interleave", "group", "mixed" + states.pop + when "define" + ref = states.pop + @references[ ref.shift ] = ref + #when "empty" + end + when :end_document + states[-1] << event + when :text + states[-1] << event + end + end while event[0] != :end_document + end + + def receive event + validate( event ) + end + end + + class State + def initialize( context ) + @previous = [] + @events = [] + @current = 0 + @count = context.count += 1 + @references = context.references + @value = false + end + + def reset + return if @current == 0 + @current = 0 + @events.each {|s| s.reset if s.kind_of? State } + end + + def previous=( previous ) + @previous << previous + end + + def next( event ) + #print "In next with #{event.inspect}. " + #p @previous + return @previous.pop.next( event ) if @events[@current].nil? + expand_ref_in( @events, @current ) if @events[@current].class == Ref + if ( @events[@current].kind_of? State ) + @current += 1 + @events[@current-1].previous = self + return @events[@current-1].next( event ) + end + if ( @events[@current].matches?(event) ) + @current += 1 + if @events[@current].nil? + @previous.pop + elsif @events[@current].kind_of? State + @current += 1 + @events[@current-1].previous = self + @events[@current-1] + else + self + end + else + nil + end + end + + def to_s + # Abbreviated: + self.class.name =~ /(?:::)(\w)\w+$/ + # Full: + #self.class.name =~ /(?:::)(\w+)$/ + "#$1.#@count" + end + + def inspect + "< #{to_s} #{@events.collect{|e| + pre = e == @events[@current] ? '#' : '' + pre + e.inspect unless self == e + }.join(', ')} >" + end + + def expected + [@events[@current]] + end + + def <<( event ) + add_event_to_arry( @events, event ) + end + + + protected + def expand_ref_in( arry, ind ) + new_events = [] + @references[ arry[ind].to_s ].each{ |evt| + add_event_to_arry(new_events,evt) + } + arry[ind,1] = new_events + end + + def add_event_to_arry( arry, evt ) + evt = generate_event( evt ) + if evt.kind_of? String + arry[-1].event_arg = evt if arry[-1].kind_of? Event and @value + @value = false + else + arry << evt + end + end + + def generate_event( event ) + return event if event.kind_of? State or event.class == Ref + evt = nil + arg = nil + case event[0] + when :start_element + case event[1] + when "element" + evt = :start_element + arg = event[2]["name"] + when "attribute" + evt = :start_attribute + arg = event[2]["name"] + when "text" + evt = :text + when "value" + evt = :text + @value = true + end + when :text + return event[1] + when :end_document + return Event.new( event[0] ) + else # then :end_element + case event[1] + when "element" + evt = :end_element + when "attribute" + evt = :end_attribute + end + end + Event.new( evt, arg ) + end + end + + + class Sequence < State + def matches?(event) + @events[@current].matches?( event ) + end + end + + + class Optional < State + def next( event ) + if @current == 0 + rv = super + return rv if rv + @prior = @previous.pop + @prior.next( event ) + else + super + end + end + + def matches?(event) + @events[@current].matches?(event) || + (@current == 0 and @previous[-1].matches?(event)) + end + + def expected + return [ @prior.expected, @events[0] ].flatten if @current == 0 + [@events[@current]] + end + end + + + class ZeroOrMore < Optional + def next( event ) + expand_ref_in( @events, @current ) if @events[@current].class == Ref + if ( @events[@current].matches?(event) ) + @current += 1 + if @events[@current].nil? + @current = 0 + self + elsif @events[@current].kind_of? State + @current += 1 + @events[@current-1].previous = self + @events[@current-1] + else + self + end + else + @prior = @previous.pop + return @prior.next( event ) if @current == 0 + nil + end + end + + def expected + return [ @prior.expected, @events[0] ].flatten if @current == 0 + [@events[@current]] + end + end + + + class OneOrMore < State + def initialize context + super + @ord = 0 + end + + def reset + super + @ord = 0 + end + + def next( event ) + expand_ref_in( @events, @current ) if @events[@current].class == Ref + if ( @events[@current].matches?(event) ) + @current += 1 + @ord += 1 + if @events[@current].nil? + @current = 0 + self + elsif @events[@current].kind_of? State + @current += 1 + @events[@current-1].previous = self + @events[@current-1] + else + self + end + else + return @previous.pop.next( event ) if @current == 0 and @ord > 0 + nil + end + end + + def matches?( event ) + @events[@current].matches?(event) || + (@current == 0 and @ord > 0 and @previous[-1].matches?(event)) + end + + def expected + if @current == 0 and @ord > 0 + [@previous[-1].expected, @events[0]].flatten + else + [@events[@current]] + end + end + end + + + class Choice < State + def initialize context + super + @choices = [] + end + + def reset + super + @events = [] + @choices.each { |c| c.each { |s| s.reset if s.kind_of? State } } + end + + def <<( event ) + add_event_to_arry( @choices, event ) + end + + def next( event ) + # Make the choice if we haven't + if @events.size == 0 + c = 0 ; max = @choices.size + while c < max + if @choices[c][0].class == Ref + expand_ref_in( @choices[c], 0 ) + @choices += @choices[c] + @choices.delete( @choices[c] ) + max -= 1 + else + c += 1 + end + end + @events = @choices.find { |evt| evt[0].matches? event } + # Remove the references + # Find the events + end + unless @events + @events = [] + return nil + end + super + end + + def matches?( event ) + return @events[@current].matches?( event ) if @events.size > 0 + !@choices.find{|evt| evt[0].matches?(event)}.nil? + end + + def expected + return [@events[@current]] if @events.size > 0 + @choices.collect do |x| + if x[0].kind_of? State + x[0].expected + else + x[0] + end + end.flatten + end + + def inspect + "< #{to_s} #{@choices.collect{|e| e.collect{|f|f.to_s}.join(', ')}.join(' or ')} >" + end + + protected + def add_event_to_arry( arry, evt ) + if evt.kind_of? State or evt.class == Ref + arry << [evt] + elsif evt[0] == :text + if arry[-1] and + arry[-1][-1].kind_of?( Event ) and + arry[-1][-1].event_type == :text and @value + + arry[-1][-1].event_arg = evt[1] + @value = false + end + else + arry << [] if evt[0] == :start_element + arry[-1] << generate_event( evt ) + end + end + end + + + class Interleave < Choice + def initialize context + super + @choice = 0 + end + + def reset + @choice = 0 + end + + def next_current( event ) + # Expand references + c = 0 ; max = @choices.size + while c < max + if @choices[c][0].class == Ref + expand_ref_in( @choices[c], 0 ) + @choices += @choices[c] + @choices.delete( @choices[c] ) + max -= 1 + else + c += 1 + end + end + @events = @choices[@choice..-1].find { |evt| evt[0].matches? event } + @current = 0 + if @events + # reorder the choices + old = @choices[@choice] + idx = @choices.index( @events ) + @choices[@choice] = @events + @choices[idx] = old + @choice += 1 + end + + @events = [] unless @events + end + + + def next( event ) + # Find the next series + next_current(event) unless @events[@current] + return nil unless @events[@current] + + expand_ref_in( @events, @current ) if @events[@current].class == Ref + if ( @events[@current].kind_of? State ) + @current += 1 + @events[@current-1].previous = self + return @events[@current-1].next( event ) + end + return @previous.pop.next( event ) if @events[@current].nil? + if ( @events[@current].matches?(event) ) + @current += 1 + if @events[@current].nil? + return self unless @choices[@choice].nil? + @previous.pop + elsif @events[@current].kind_of? State + @current += 1 + @events[@current-1].previous = self + @events[@current-1] + else + self + end + else + nil + end + end + + def matches?( event ) + return @events[@current].matches?( event ) if @events[@current] + !@choices[@choice..-1].find{|evt| evt[0].matches?(event)}.nil? + end + + def expected + return [@events[@current]] if @events[@current] + @choices[@choice..-1].collect do |x| + if x[0].kind_of? State + x[0].expected + else + x[0] + end + end.flatten + end + + def inspect + "< #{to_s} #{@choices.collect{|e| e.collect{|f|f.to_s}.join(', ')}.join(' and ')} >" + end + end + + class Ref + def initialize value + @value = value + end + def to_s + @value + end + def inspect + "{#{to_s}}" + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/validation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/validation.rb new file mode 100644 index 000000000..6475c6282 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/validation.rb @@ -0,0 +1,144 @@ +# frozen_string_literal: false +require_relative 'validationexception' + +module REXML + module Validation + module Validator + NILEVENT = [ nil ] + def reset + @current = @root + @root.reset + @root.previous = true + @attr_stack = [] + self + end + def dump + puts @root.inspect + end + def validate( event ) + @attr_stack = [] unless defined? @attr_stack + match = @current.next(event) + raise ValidationException.new( "Validation error. Expected: "+ + @current.expected.join( " or " )+" from #{@current.inspect} "+ + " but got #{Event.new( event[0], event[1] ).inspect}" ) unless match + @current = match + + # Check for attributes + case event[0] + when :start_element + @attr_stack << event[2] + begin + sattr = [:start_attribute, nil] + eattr = [:end_attribute] + text = [:text, nil] + k, = event[2].find { |key,value| + sattr[1] = key + m = @current.next( sattr ) + if m + # If the state has text children... + if m.matches?( eattr ) + @current = m + else + text[1] = value + m = m.next( text ) + text[1] = nil + return false unless m + @current = m if m + end + m = @current.next( eattr ) + if m + @current = m + true + else + false + end + else + false + end + } + event[2].delete(k) if k + end while k + when :end_element + attrs = @attr_stack.pop + raise ValidationException.new( "Validation error. Illegal "+ + " attributes: #{attrs.inspect}") if attrs.length > 0 + end + end + end + + class Event + def initialize(event_type, event_arg=nil ) + @event_type = event_type + @event_arg = event_arg + end + + attr_reader :event_type + attr_accessor :event_arg + + def done? + @done + end + + def single? + (@event_type != :start_element and @event_type != :start_attribute) + end + + def matches?( event ) + return false unless event[0] == @event_type + case event[0] + when nil + true + when :start_element + event[1] == @event_arg + when :end_element + true + when :start_attribute + event[1] == @event_arg + when :end_attribute + true + when :end_document + true + when :text + @event_arg.nil? || @event_arg == event[1] +=begin + when :processing_instruction + false + when :xmldecl + false + when :start_doctype + false + when :end_doctype + false + when :externalentity + false + when :elementdecl + false + when :entity + false + when :attlistdecl + false + when :notationdecl + false + when :end_doctype + false +=end + else + false + end + end + + def ==( other ) + return false unless other.kind_of? Event + @event_type == other.event_type and @event_arg == other.event_arg + end + + def to_s + inspect + end + + def inspect + "#{@event_type.inspect}( #@event_arg )" + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/validationexception.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/validationexception.rb new file mode 100644 index 000000000..78cd63fd0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/validation/validationexception.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: false +module REXML + module Validation + class ValidationException < RuntimeError + def initialize msg + super + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xmldecl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xmldecl.rb new file mode 100644 index 000000000..d19407cef --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xmldecl.rb @@ -0,0 +1,130 @@ +# frozen_string_literal: false + +require_relative 'encoding' +require_relative 'source' + +module REXML + # NEEDS DOCUMENTATION + class XMLDecl < Child + include Encoding + + DEFAULT_VERSION = "1.0" + DEFAULT_ENCODING = "UTF-8" + DEFAULT_STANDALONE = "no" + START = "<?xml" + STOP = "?>" + + attr_accessor :version, :standalone + attr_reader :writeencoding, :writethis + + def initialize(version=DEFAULT_VERSION, encoding=nil, standalone=nil) + @writethis = true + @writeencoding = !encoding.nil? + if version.kind_of? XMLDecl + super() + @version = version.version + self.encoding = version.encoding + @writeencoding = version.writeencoding + @standalone = version.standalone + @writethis = version.writethis + else + super() + @version = version + self.encoding = encoding + @standalone = standalone + end + @version = DEFAULT_VERSION if @version.nil? + end + + def clone + XMLDecl.new(self) + end + + # indent:: + # Ignored. There must be no whitespace before an XML declaration + # transitive:: + # Ignored + # ie_hack:: + # Ignored + def write(writer, indent=-1, transitive=false, ie_hack=false) + return nil unless @writethis or writer.kind_of? Output + writer << START + writer << " #{content encoding}" + writer << STOP + end + + def ==( other ) + other.kind_of?(XMLDecl) and + other.version == @version and + other.encoding == self.encoding and + other.standalone == @standalone + end + + def xmldecl version, encoding, standalone + @version = version + self.encoding = encoding + @standalone = standalone + end + + def node_type + :xmldecl + end + + alias :stand_alone? :standalone + alias :old_enc= :encoding= + + def encoding=( enc ) + if enc.nil? + self.old_enc = "UTF-8" + @writeencoding = false + else + self.old_enc = enc + @writeencoding = true + end + self.dowrite + end + + # Only use this if you do not want the XML declaration to be written; + # this object is ignored by the XML writer. Otherwise, instantiate your + # own XMLDecl and add it to the document. + # + # Note that XML 1.1 documents *must* include an XML declaration + def XMLDecl.default + rv = XMLDecl.new( "1.0" ) + rv.nowrite + rv + end + + def nowrite + @writethis = false + end + + def dowrite + @writethis = true + end + + def inspect + "#{START} ... #{STOP}" + end + + private + def content(enc) + context = nil + context = parent.context if parent + if context and context[:prologue_quote] == :quote + quote = "\"" + else + quote = "'" + end + + rv = "version=#{quote}#{@version}#{quote}" + if @writeencoding or enc !~ /\Autf-8\z/i + rv << " encoding=#{quote}#{enc}#{quote}" + end + if @standalone + rv << " standalone=#{quote}#{@standalone}#{quote}" + end + rv + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xmltokens.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xmltokens.rb new file mode 100644 index 000000000..392b47b1d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xmltokens.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: false +module REXML + # Defines a number of tokens used for parsing XML. Not for general + # consumption. + module XMLTokens + # From http://www.w3.org/TR/REC-xml/#sec-common-syn + # + # [4] NameStartChar ::= + # ":" | + # [A-Z] | + # "_" | + # [a-z] | + # [#xC0-#xD6] | + # [#xD8-#xF6] | + # [#xF8-#x2FF] | + # [#x370-#x37D] | + # [#x37F-#x1FFF] | + # [#x200C-#x200D] | + # [#x2070-#x218F] | + # [#x2C00-#x2FEF] | + # [#x3001-#xD7FF] | + # [#xF900-#xFDCF] | + # [#xFDF0-#xFFFD] | + # [#x10000-#xEFFFF] + name_start_chars = [ + ":", + "A-Z", + "_", + "a-z", + "\\u00C0-\\u00D6", + "\\u00D8-\\u00F6", + "\\u00F8-\\u02FF", + "\\u0370-\\u037D", + "\\u037F-\\u1FFF", + "\\u200C-\\u200D", + "\\u2070-\\u218F", + "\\u2C00-\\u2FEF", + "\\u3001-\\uD7FF", + "\\uF900-\\uFDCF", + "\\uFDF0-\\uFFFD", + "\\u{10000}-\\u{EFFFF}", + ] + # From http://www.w3.org/TR/REC-xml/#sec-common-syn + # + # [4a] NameChar ::= + # NameStartChar | + # "-" | + # "." | + # [0-9] | + # #xB7 | + # [#x0300-#x036F] | + # [#x203F-#x2040] + name_chars = name_start_chars + [ + "\\-", + "\\.", + "0-9", + "\\u00B7", + "\\u0300-\\u036F", + "\\u203F-\\u2040", + ] + NAME_START_CHAR = "[#{name_start_chars.join('')}]" + NAME_CHAR = "[#{name_chars.join('')}]" + NAMECHAR = NAME_CHAR # deprecated. Use NAME_CHAR instead. + + # From http://www.w3.org/TR/xml-names11/#NT-NCName + # + # [6] NCNameStartChar ::= NameStartChar - ':' + ncname_start_chars = name_start_chars - [":"] + # From http://www.w3.org/TR/xml-names11/#NT-NCName + # + # [5] NCNameChar ::= NameChar - ':' + ncname_chars = name_chars - [":"] + NCNAME_STR = "[#{ncname_start_chars.join('')}][#{ncname_chars.join('')}]*" + NAME_STR = "(?:#{NCNAME_STR}:)?#{NCNAME_STR}" + + NAME = "(#{NAME_START_CHAR}#{NAME_CHAR}*)" + NMTOKEN = "(?:#{NAME_CHAR})+" + NMTOKENS = "#{NMTOKEN}(\\s+#{NMTOKEN})*" + REFERENCE = "(?:&#{NAME};|&#\\d+;|&#x[0-9a-fA-F]+;)" + + #REFERENCE = "(?:#{ENTITYREF}|#{CHARREF})" + #ENTITYREF = "&#{NAME};" + #CHARREF = "&#\\d+;|&#x[0-9a-fA-F]+;" + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xpath.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xpath.rb new file mode 100644 index 000000000..eed0300c1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xpath.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: false +require_relative 'functions' +require_relative 'xpath_parser' + +module REXML + # Wrapper class. Use this class to access the XPath functions. + class XPath + include Functions + # A base Hash object, supposing to be used when initializing a + # default empty namespaces set, but is currently unused. + # TODO: either set the namespaces=EMPTY_HASH, or deprecate this. + EMPTY_HASH = {} + + # Finds and returns the first node that matches the supplied xpath. + # element:: + # The context element + # path:: + # The xpath to search for. If not supplied or nil, returns the first + # node matching '*'. + # namespaces:: + # If supplied, a Hash which defines a namespace mapping. + # variables:: + # If supplied, a Hash which maps $variables in the query + # to values. This can be used to avoid XPath injection attacks + # or to automatically handle escaping string values. + # + # XPath.first( node ) + # XPath.first( doc, "//b"} ) + # XPath.first( node, "a/x:b", { "x"=>"http://doofus" } ) + # XPath.first( node, '/book/publisher/text()=$publisher', {}, {"publisher"=>"O'Reilly"}) + def XPath::first(element, path=nil, namespaces=nil, variables={}, options={}) + raise "The namespaces argument, if supplied, must be a hash object." unless namespaces.nil? or namespaces.kind_of?(Hash) + raise "The variables argument, if supplied, must be a hash object." unless variables.kind_of?(Hash) + match(element, path, namespaces, variables, options).flatten[0] + end + + # Iterates over nodes that match the given path, calling the supplied + # block with the match. + # element:: + # The context element + # path:: + # The xpath to search for. If not supplied or nil, defaults to '*' + # namespaces:: + # If supplied, a Hash which defines a namespace mapping + # variables:: + # If supplied, a Hash which maps $variables in the query + # to values. This can be used to avoid XPath injection attacks + # or to automatically handle escaping string values. + # + # XPath.each( node ) { |el| ... } + # XPath.each( node, '/*[@attr='v']' ) { |el| ... } + # XPath.each( node, 'ancestor::x' ) { |el| ... } + # XPath.each( node, '/book/publisher/text()=$publisher', {}, {"publisher"=>"O'Reilly"}) \ + # {|el| ... } + def XPath::each(element, path=nil, namespaces=nil, variables={}, options={}, &block) + raise "The namespaces argument, if supplied, must be a hash object." unless namespaces.nil? or namespaces.kind_of?(Hash) + raise "The variables argument, if supplied, must be a hash object." unless variables.kind_of?(Hash) + match(element, path, namespaces, variables, options).each( &block ) + end + + # Returns an array of nodes matching a given XPath. + def XPath::match(element, path=nil, namespaces=nil, variables={}, options={}) + parser = XPathParser.new(**options) + parser.namespaces = namespaces + parser.variables = variables + path = "*" unless path + parser.parse(path,element) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xpath_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xpath_parser.rb new file mode 100644 index 000000000..64c8846aa --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/rexml-3.4.4/lib/rexml/xpath_parser.rb @@ -0,0 +1,980 @@ +# frozen_string_literal: false + +require "pp" + +require_relative 'namespace' +require_relative 'xmltokens' +require_relative 'attribute' +require_relative 'parsers/xpathparser' + +module REXML + module DClonable + refine Object do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object types + def dclone + clone + end + end + refine Symbol do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object types + def dclone ; self ; end + end + refine Integer do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object types + def dclone ; self ; end + end + refine Float do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object types + def dclone ; self ; end + end + refine Array do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object+ types + def dclone + klone = self.clone + klone.clear + self.each{|v| klone << v.dclone} + klone + end + end + end +end + +using REXML::DClonable + +module REXML + # You don't want to use this class. Really. Use XPath, which is a wrapper + # for this class. Believe me. You don't want to poke around in here. + # There is strange, dark magic at work in this code. Beware. Go back! Go + # back while you still can! + class XPathParser + include XMLTokens + LITERAL = /^'([^']*)'|^"([^"]*)"/u + + DEBUG = (ENV["REXML_XPATH_PARSER_DEBUG"] == "true") + + def initialize(strict: false) + @debug = DEBUG + @parser = REXML::Parsers::XPathParser.new + @namespaces = nil + @variables = {} + @nest = 0 + @strict = strict + end + + def namespaces=( namespaces={} ) + Functions::namespace_context = namespaces + @namespaces = namespaces + end + + def variables=( vars={} ) + Functions::variables = vars + @variables = vars + end + + def parse path, node + path_stack = @parser.parse( path ) + if node.is_a?(Array) + Kernel.warn("REXML::XPath.each, REXML::XPath.first, REXML::XPath.match dropped support for nodeset...", uplevel: 1) + return [] if node.empty? + node = node.first + end + + document = node.document + if document + document.__send__(:enable_cache) do + match( path_stack, node ) + end + else + match( path_stack, node ) + end + end + + def get_first path, node + path_stack = @parser.parse( path ) + first( path_stack, node ) + end + + def predicate path, node + path_stack = @parser.parse( path ) + match( path_stack, node ) + end + + def []=( variable_name, value ) + @variables[ variable_name ] = value + end + + + # Performs a depth-first (document order) XPath search, and returns the + # first match. This is the fastest, lightest way to return a single result. + # + # FIXME: This method is incomplete! + def first( path_stack, node ) + return nil if path.size == 0 + + case path[0] + when :document + # do nothing + first( path[1..-1], node ) + when :child + for c in node.children + r = first( path[1..-1], c ) + return r if r + end + when :qname + name = path[2] + if node.name == name + return node if path.size == 3 + first( path[3..-1], node ) + else + nil + end + when :descendant_or_self + r = first( path[1..-1], node ) + return r if r + for c in node.children + r = first( path, c ) + return r if r + end + when :node + first( path[1..-1], node ) + when :any + first( path[1..-1], node ) + else + nil + end + end + + + def match(path_stack, node) + nodeset = [XPathNode.new(node, position: 1)] + result = expr(path_stack, nodeset) + case result + when Array # nodeset + unnode(result).uniq + else + [result] + end + end + + private + def strict? + @strict + end + + # Returns a String namespace for a node, given a prefix + # The rules are: + # + # 1. Use the supplied namespace mapping first. + # 2. If no mapping was supplied, use the context node to look up the namespace + def get_namespace( node, prefix ) + if @namespaces + @namespaces[prefix] || '' + else + return node.namespace( prefix ) if node.node_type == :element + '' + end + end + + + # Expr takes a stack of path elements and a set of nodes (either a Parent + # or an Array and returns an Array of matching nodes + def expr( path_stack, nodeset, context=nil ) + enter(:expr, path_stack, nodeset) if @debug + return nodeset if path_stack.length == 0 || nodeset.length == 0 + while path_stack.length > 0 + trace(:while, path_stack, nodeset) if @debug + if nodeset.length == 0 + path_stack.clear + return [] + end + op = path_stack.shift + case op + when :document + first_raw_node = nodeset.first.raw_node + nodeset = [XPathNode.new(first_raw_node.root_node, position: 1)] + when :self + nodeset = step(path_stack) do + [nodeset] + end + when :child + nodeset = step(path_stack) do + child(nodeset) + end + when :literal + trace(:literal, path_stack, nodeset) if @debug + return path_stack.shift + when :attribute + nodeset = step(path_stack, any_type: :attribute) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + next unless raw_node.node_type == :element + attributes = raw_node.attributes + next if attributes.empty? + nodesets << attributes.each_attribute.collect.with_index do |attribute, i| + XPathNode.new(attribute, position: i + 1) + end + end + nodesets + end + when :namespace + pre_defined_namespaces = { + "xml" => "http://www.w3.org/XML/1998/namespace", + } + nodeset = step(path_stack, any_type: :namespace) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + case raw_node.node_type + when :element + if @namespaces + nodesets << pre_defined_namespaces.merge(@namespaces) + else + nodesets << pre_defined_namespaces.merge(raw_node.namespaces) + end + when :attribute + if @namespaces + nodesets << pre_defined_namespaces.merge(@namespaces) + else + nodesets << pre_defined_namespaces.merge(raw_node.element.namespaces) + end + end + end + nodesets + end + when :parent + nodeset = step(path_stack) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + if raw_node.node_type == :attribute + parent = raw_node.element + else + parent = raw_node.parent + end + nodesets << [XPathNode.new(parent, position: 1)] if parent + end + nodesets + end + when :ancestor + nodeset = step(path_stack) do + nodesets = [] + # new_nodes = {} + nodeset.each do |node| + raw_node = node.raw_node + new_nodeset = [] + while raw_node.parent + raw_node = raw_node.parent + # next if new_nodes.key?(node) + new_nodeset << XPathNode.new(raw_node, + position: new_nodeset.size + 1) + # new_nodes[node] = true + end + nodesets << new_nodeset unless new_nodeset.empty? + end + nodesets + end + when :ancestor_or_self + nodeset = step(path_stack) do + nodesets = [] + # new_nodes = {} + nodeset.each do |node| + raw_node = node.raw_node + next unless raw_node.node_type == :element + new_nodeset = [XPathNode.new(raw_node, position: 1)] + # new_nodes[node] = true + while raw_node.parent + raw_node = raw_node.parent + # next if new_nodes.key?(node) + new_nodeset << XPathNode.new(raw_node, + position: new_nodeset.size + 1) + # new_nodes[node] = true + end + nodesets << new_nodeset unless new_nodeset.empty? + end + nodesets + end + when :descendant_or_self + nodeset = step(path_stack) do + descendant(nodeset, true) + end + when :descendant + nodeset = step(path_stack) do + descendant(nodeset, false) + end + when :following_sibling + nodeset = step(path_stack) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + next unless raw_node.respond_to?(:parent) + next if raw_node.parent.nil? + all_siblings = raw_node.parent.children + current_index = all_siblings.index(raw_node) + following_siblings = all_siblings[(current_index + 1)..-1] + next if following_siblings.empty? + nodesets << following_siblings.collect.with_index do |sibling, i| + XPathNode.new(sibling, position: i + 1) + end + end + nodesets + end + when :preceding_sibling + nodeset = step(path_stack, order: :reverse) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + next unless raw_node.respond_to?(:parent) + next if raw_node.parent.nil? + all_siblings = raw_node.parent.children + current_index = all_siblings.index(raw_node) + preceding_siblings = all_siblings[0, current_index].reverse + next if preceding_siblings.empty? + nodesets << preceding_siblings.collect.with_index do |sibling, i| + XPathNode.new(sibling, position: i + 1) + end + end + nodesets + end + when :preceding + nodeset = step(path_stack, order: :reverse) do + unnode(nodeset) do |node| + preceding(node) + end + end + when :following + nodeset = step(path_stack) do + unnode(nodeset) do |node| + following(node) + end + end + when :variable + var_name = path_stack.shift + return [@variables[var_name]] + + when :eq, :neq, :lt, :lteq, :gt, :gteq + left = expr( path_stack.shift, nodeset.dup, context ) + right = expr( path_stack.shift, nodeset.dup, context ) + res = equality_relational_compare( left, op, right ) + trace(op, left, right, res) if @debug + return res + + when :or + left = expr(path_stack.shift, nodeset.dup, context) + return true if Functions.boolean(left) + right = expr(path_stack.shift, nodeset.dup, context) + return Functions.boolean(right) + + when :and + left = expr(path_stack.shift, nodeset.dup, context) + return false unless Functions.boolean(left) + right = expr(path_stack.shift, nodeset.dup, context) + return Functions.boolean(right) + + when :div, :mod, :mult, :plus, :minus + left = expr(path_stack.shift, nodeset, context) + right = expr(path_stack.shift, nodeset, context) + left = unnode(left) if left.is_a?(Array) + right = unnode(right) if right.is_a?(Array) + left = Functions::number(left) + right = Functions::number(right) + case op + when :div + return left / right + when :mod + return left % right + when :mult + return left * right + when :plus + return left + right + when :minus + return left - right + else + raise "[BUG] Unexpected operator: <#{op.inspect}>" + end + when :union + left = expr( path_stack.shift, nodeset, context ) + right = expr( path_stack.shift, nodeset, context ) + left = unnode(left) if left.is_a?(Array) + right = unnode(right) if right.is_a?(Array) + return (left | right) + when :neg + res = expr( path_stack, nodeset, context ) + res = unnode(res) if res.is_a?(Array) + return -Functions.number(res) + when :not + when :function + func_name = path_stack.shift.tr('-','_') + arguments = path_stack.shift + + if nodeset.size != 1 + message = "[BUG] Node set size must be 1 for function call: " + message += "<#{func_name}>: <#{nodeset.inspect}>: " + message += "<#{arguments.inspect}>" + raise message + end + + node = nodeset.first + if context + target_context = context + else + target_context = {:size => nodeset.size} + if node.is_a?(XPathNode) + target_context[:node] = node.raw_node + target_context[:index] = node.position + else + target_context[:node] = node + target_context[:index] = 1 + end + end + args = arguments.dclone.collect do |arg| + result = expr(arg, nodeset, target_context) + result = unnode(result) if result.is_a?(Array) + result + end + Functions.context = target_context + return Functions.send(func_name, *args) + + else + raise "[BUG] Unexpected path: <#{op.inspect}>: <#{path_stack.inspect}>" + end + end # while + return nodeset + ensure + leave(:expr, path_stack, nodeset) if @debug + end + + def step(path_stack, any_type: :element, order: :forward) + nodesets = yield + begin + enter(:step, path_stack, nodesets) if @debug + nodesets = node_test(path_stack, nodesets, any_type: any_type) + while path_stack[0] == :predicate + path_stack.shift # :predicate + predicate_expression = path_stack.shift.dclone + nodesets = evaluate_predicate(predicate_expression, nodesets) + end + if nodesets.size == 1 + ordered_nodeset = nodesets[0] + else + raw_nodes = [] + nodesets.each do |nodeset| + nodeset.each do |node| + if node.respond_to?(:raw_node) + raw_nodes << node.raw_node + else + raw_nodes << node + end + end + end + ordered_nodeset = sort(raw_nodes, order) + end + new_nodeset = [] + ordered_nodeset.each do |node| + # TODO: Remove duplicated + new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) + end + new_nodeset + ensure + leave(:step, path_stack, new_nodeset) if @debug + end + end + + def node_test(path_stack, nodesets, any_type: :element) + enter(:node_test, path_stack, nodesets) if @debug + operator = path_stack.shift + case operator + when :qname + prefix = path_stack.shift + name = path_stack.shift + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + case raw_node.node_type + when :element + if prefix.nil? + raw_node.name == name + elsif prefix.empty? + if strict? + raw_node.name == name and raw_node.namespace == "" + else + raw_node.name == name and raw_node.namespace == get_namespace(raw_node, prefix) + end + else + raw_node.name == name and raw_node.namespace == get_namespace(raw_node, prefix) + end + when :attribute + if prefix.nil? + raw_node.name == name + elsif prefix.empty? + raw_node.name == name and raw_node.namespace == "" + else + raw_node.name == name and raw_node.namespace == get_namespace(raw_node.element, prefix) + end + else + false + end + end + end + when :namespace + prefix = path_stack.shift + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + case raw_node.node_type + when :element + namespaces = @namespaces || raw_node.namespaces + raw_node.namespace == namespaces[prefix] + when :attribute + namespaces = @namespaces || raw_node.element.namespaces + raw_node.namespace == namespaces[prefix] + else + false + end + end + end + when :any + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + raw_node.node_type == any_type + end + end + when :comment + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + raw_node.node_type == :comment + end + end + when :text + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + raw_node.node_type == :text + end + end + when :processing_instruction + target = path_stack.shift + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + (raw_node.node_type == :processing_instruction) and + (target.empty? or (raw_node.target == target)) + end + end + when :node + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + true + end + end + else + message = "[BUG] Unexpected node test: " + + "<#{operator.inspect}>: <#{path_stack.inspect}>" + raise message + end + new_nodesets + ensure + leave(:node_test, path_stack, new_nodesets) if @debug + end + + def filter_nodeset(nodeset) + new_nodeset = [] + nodeset.each do |node| + next unless yield(node) + new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) + end + new_nodeset + end + + def evaluate_predicate(expression, nodesets) + enter(:predicate, expression, nodesets) if @debug + new_nodeset_count = 0 + new_nodesets = nodesets.collect do |nodeset| + new_nodeset = [] + subcontext = { :size => nodeset.size } + nodeset.each_with_index do |node, index| + if node.is_a?(XPathNode) + subcontext[:node] = node.raw_node + subcontext[:index] = node.position + else + subcontext[:node] = node + subcontext[:index] = index + 1 + end + result = expr(expression.dclone, [node], subcontext) + trace(:predicate_evaluate, expression, node, subcontext, result) if @debug + result = result[0] if result.kind_of? Array and result.length == 1 + if result.kind_of? Numeric + if result == node.position + new_nodeset_count += 1 + new_nodeset << XPathNode.new(node, position: new_nodeset_count) + end + elsif result.instance_of? Array + if result.size > 0 and result.inject(false) {|k,s| s or k} + if result.size > 0 + new_nodeset_count += 1 + new_nodeset << XPathNode.new(node, position: new_nodeset_count) + end + end + else + if result + new_nodeset_count += 1 + new_nodeset << XPathNode.new(node, position: new_nodeset_count) + end + end + end + new_nodeset + end + new_nodesets + ensure + leave(:predicate, new_nodesets) if @debug + end + + def trace(*args) + indent = " " * @nest + PP.pp(args, "").each_line do |line| + puts("#{indent}#{line}") + end + end + + def enter(tag, *args) + trace(:enter, tag, *args) + @nest += 1 + end + + def leave(tag, *args) + @nest -= 1 + trace(:leave, tag, *args) + end + + # Reorders an array of nodes so that they are in document order + # It tries to do this efficiently. + # + # FIXME: I need to get rid of this, but the issue is that most of the XPath + # interpreter functions as a filter, which means that we lose context going + # in and out of function calls. If I knew what the index of the nodes was, + # I wouldn't have to do this. Maybe add a document IDX for each node? + # Problems with mutable documents. Or, rewrite everything. + def sort(array_of_nodes, order) + new_arry = [] + array_of_nodes.each { |node| + node_idx = [] + np = node.node_type == :attribute ? node.element : node + while np.parent and np.parent.node_type == :element + node_idx << np.parent.index( np ) + np = np.parent + end + new_arry << [ node_idx.reverse, node ] + } + ordered = new_arry.sort_by do |index, node| + if order == :forward + index + else + index.map(&:-@) + end + end + ordered.collect do |_index, node| + node + end + end + + def descendant(nodeset, include_self) + nodesets = [] + nodeset.each do |node| + new_nodeset = [] + new_nodes = {} + descendant_recursive(node.raw_node, new_nodeset, new_nodes, include_self) + nodesets << new_nodeset unless new_nodeset.empty? + end + nodesets + end + + def descendant_recursive(raw_node, new_nodeset, new_nodes, include_self) + if include_self + return if new_nodes.key?(raw_node) + new_nodeset << XPathNode.new(raw_node, position: new_nodeset.size + 1) + new_nodes[raw_node] = true + end + + node_type = raw_node.node_type + if node_type == :element or node_type == :document + raw_node.children.each do |child| + descendant_recursive(child, new_nodeset, new_nodes, true) + end + end + end + + # Builds a nodeset of all of the preceding nodes of the supplied node, + # in reverse document order + # preceding:: includes every element in the document that precedes this node, + # except for ancestors + def preceding(node) + ancestors = [] + parent = node.parent + while parent + ancestors << parent + parent = parent.parent + end + + precedings = [] + preceding_node = preceding_node_of(node) + while preceding_node + if ancestors.include?(preceding_node) + ancestors.delete(preceding_node) + else + precedings << XPathNode.new(preceding_node, + position: precedings.size + 1) + end + preceding_node = preceding_node_of(preceding_node) + end + precedings + end + + def preceding_node_of( node ) + psn = node.previous_sibling_node + if psn.nil? + if node.parent.nil? or node.parent.class == Document + return nil + end + return node.parent + #psn = preceding_node_of( node.parent ) + end + while psn and psn.kind_of? Element and psn.children.size > 0 + psn = psn.children[-1] + end + psn + end + + def following(node) + followings = [] + following_node = next_sibling_node(node) + while following_node + followings << XPathNode.new(following_node, + position: followings.size + 1) + following_node = following_node_of(following_node) + end + followings + end + + def following_node_of( node ) + return node.children[0] if node.kind_of?(Element) and node.children.size > 0 + + next_sibling_node(node) + end + + def next_sibling_node(node) + psn = node.next_sibling_node + while psn.nil? + return nil if node.parent.nil? or node.parent.class == Document + node = node.parent + psn = node.next_sibling_node + end + psn + end + + def child(nodeset) + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + node_type = raw_node.node_type + # trace(:child, node_type, node) + case node_type + when :element + nodesets << raw_node.children.collect.with_index do |child_node, i| + XPathNode.new(child_node, position: i + 1) + end + when :document + new_nodeset = [] + raw_node.children.each do |child| + case child + when XMLDecl, Text + # Ignore + else + new_nodeset << XPathNode.new(child, position: new_nodeset.size + 1) + end + end + nodesets << new_nodeset unless new_nodeset.empty? + end + end + nodesets + end + + def norm b + case b + when true, false + b + when 'true', 'false' + Functions::boolean( b ) + when /^\d+(\.\d+)?$/, Numeric + Functions::number( b ) + else + Functions::string( b ) + end + end + + def equality_relational_compare(set1, op, set2) + set1 = unnode(set1) if set1.is_a?(Array) + set2 = unnode(set2) if set2.is_a?(Array) + + if set1.kind_of? Array and set2.kind_of? Array + # If both objects to be compared are node-sets, then the + # comparison will be true if and only if there is a node in the + # first node-set and a node in the second node-set such that the + # result of performing the comparison on the string-values of + # the two nodes is true. + set1.product(set2).any? do |node1, node2| + node_string1 = Functions.string(node1) + node_string2 = Functions.string(node2) + compare(node_string1, op, node_string2) + end + elsif set1.kind_of? Array or set2.kind_of? Array + # If one is nodeset and other is number, compare number to each item + # in nodeset s.t. number op number(string(item)) + # If one is nodeset and other is string, compare string to each item + # in nodeset s.t. string op string(item) + # If one is nodeset and other is boolean, compare boolean to each item + # in nodeset s.t. boolean op boolean(item) + if set1.kind_of? Array + a = set1 + b = set2 + else + a = set2 + b = set1 + end + + case b + when true, false + each_unnode(a).any? do |unnoded| + compare(Functions.boolean(unnoded), op, b) + end + when Numeric + each_unnode(a).any? do |unnoded| + compare(Functions.number(unnoded), op, b) + end + when /\A\d+(\.\d+)?\z/ + b = Functions.number(b) + each_unnode(a).any? do |unnoded| + compare(Functions.number(unnoded), op, b) + end + else + b = Functions::string(b) + each_unnode(a).any? do |unnoded| + compare(Functions::string(unnoded), op, b) + end + end + else + # If neither is nodeset, + # If op is = or != + # If either boolean, convert to boolean + # If either number, convert to number + # Else, convert to string + # Else + # Convert both to numbers and compare + compare(set1, op, set2) + end + end + + def value_type(value) + case value + when true, false + :boolean + when Numeric + :number + when String + :string + else + raise "[BUG] Unexpected value type: <#{value.inspect}>" + end + end + + def normalize_compare_values(a, operator, b) + a_type = value_type(a) + b_type = value_type(b) + case operator + when :eq, :neq + if a_type == :boolean or b_type == :boolean + a = Functions.boolean(a) unless a_type == :boolean + b = Functions.boolean(b) unless b_type == :boolean + elsif a_type == :number or b_type == :number + a = Functions.number(a) unless a_type == :number + b = Functions.number(b) unless b_type == :number + else + a = Functions.string(a) unless a_type == :string + b = Functions.string(b) unless b_type == :string + end + when :lt, :lteq, :gt, :gteq + a = Functions.number(a) unless a_type == :number + b = Functions.number(b) unless b_type == :number + else + message = "[BUG] Unexpected compare operator: " + + "<#{operator.inspect}>: <#{a.inspect}>: <#{b.inspect}>" + raise message + end + [a, b] + end + + def compare(a, operator, b) + a, b = normalize_compare_values(a, operator, b) + case operator + when :eq + a == b + when :neq + a != b + when :lt + a < b + when :lteq + a <= b + when :gt + a > b + when :gteq + a >= b + else + message = "[BUG] Unexpected compare operator: " + + "<#{operator.inspect}>: <#{a.inspect}>: <#{b.inspect}>" + raise message + end + end + + def each_unnode(nodeset) + return to_enum(__method__, nodeset) unless block_given? + nodeset.each do |node| + if node.is_a?(XPathNode) + unnoded = node.raw_node + else + unnoded = node + end + yield(unnoded) + end + end + + def unnode(nodeset) + each_unnode(nodeset).collect do |unnoded| + unnoded = yield(unnoded) if block_given? + unnoded + end + end + end + + # @private + class XPathNode + attr_reader :raw_node, :context + def initialize(node, context=nil) + if node.is_a?(XPathNode) + @raw_node = node.raw_node + else + @raw_node = node + end + @context = context || {} + end + + def position + @context[:position] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/History.rdoc b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/History.rdoc new file mode 100644 index 000000000..189a6f44b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/History.rdoc @@ -0,0 +1,463 @@ +=== 2.5.2 / 2025-03-25 + +* 1 bug fix: + + * Added support for 3 slot op_asgn (eg `a &= 1`) + +=== 2.5.1 / 2024-07-08 + +* 1 bug fix: + + * Fix errors created when string literals are frozen. (byroot + zenspider) + +=== 2.5.0 / 2022-10-04 + +* 5 minor enhancements: + + * Added support for (most?) pattern matching. + * Added support for **kwrest. + * Added support for forward args (...), defn and call. + * Added support for preexe (BEGIN { ... }). + * Support ruby 3.1 hash shorthand syntax. (presidentbeef) + +* 3 bug fixes: + + * Fix generation of case w/ no else. + * Fixed a bug block shadow vars (they're grouped) + * Fixed find_pat up (after fixing a find_pat bug in ruby_parser). + +=== 2.4.4 / 2019-09-24 + +* 1 bug fix: + + * Fixed deprecation warnings from patterns change in sexp_processor. + +=== 2.4.3 / 2019-06-03 + +* 4 bug fixes: + + * Added shadow block args. (jaynetics) + * Fixed generation for block args w/ trailing commas. + * Fixed nested masgn block args and arrays. (jaynetics) + * Fixes for stabby proc / lambda changes. + +=== 2.4.2 / 2019-03-12 + +* 2 bug fixes: + + * Rewrote process_masgn to fix problems with nesting masgn in block args. + * Use RubyParser directly instead of versioned parsers. + +=== 2.4.1 / 2018-02-15 + +* 2 minor enhancements: + + * Added bitwise ops to BINARY. (david942j) + * Added rewrite_call|if|until|while to normalize `not` in conditions. + +=== 2.4.0 / 2017-07-17 + +* 1 major enhancement: + + * Major overhaul. Process methods no longer mutate arguments. + +* 1 minor enhancement: + + * Now SEXP_STRICT=1 clean. + +* 2 bug fixes: + + * Fixed 2.4 Fixnum deprecation warning + * Fixed for new 24 parser. + +=== 2.3.2 / 2016-11-30 + +* 5 bug fixes: + + * FINALLY fixed a problem with escaping in dstrs. (nex3) + * Fix using match3 on LHS of call. (eqv) + * Fixed handling defn that starts w/ begin+rescue+other stuff. (eqv) + * Fixed return expressions with complex RHS. (eqv) + * Tweaked sexp_processor dependency to ~> 4.6 to sync them better + +=== 2.3.1 / 2016-10-09 + +* 1 minor enhancement: + + * Support more op_asgn nodes. (presidentbeef) + +* 1 bug fix: + + * Fix for non-binary 'binary' calls (eg arity > 1). (presidentbeef) + +=== 2.3.0 / 2016-02-18 + +* 3 minor enhancements: + + * Added support for safe navigation/lonely operator. (presidentbeef) + * Expanded tests for 2.3 support + * Support safe attrasgn. (presidentbeef). + +=== 2.2.0 / 2015-05-27 + +* 1 minor enhancement: + + * Normalized block arg goalposts (always there unless arg slot == 0). + +=== 2.1.4 / 2015-04-13 + +* 1 minor enhancement: + + * Wrap fewer hash values in parentheses. (jaredbeck) + +* 1 bug fix: + + * Fixed handling of kwsplat args. + +=== 2.1.3 / 2014-09-26 + +* 1 bug fix: + + * Fixed handling of kwargs. (joenas) + +=== 2.1.2 / 2014-08-28 + +* 1 bug fix: + + * Fixed readme to point out that deep_clone may be needed. (heathd) + +=== 2.1.1 / 2014-06-09 + +* 1 bug fix: + + * Moved Regexp::CODES out of guard on ::ENC_NONE. (presidentbeef) + +=== 2.1.0 / 2014-04-23 + +* 4 minor enhancements: + + * Don't indent defn body extra if it has a top-level rescue. + * Don't indent defn body until fully processed. + * Don't use simple rescue form if resbody is a return (statement keyword). (eyberg) + * Remove superfluous begin/end for top-level defn rescue. + +=== 2.0.8 / 2014-03-24 + +* 1 bug fix: + + * 2.0/2.1: Fixed support for **kwsplat. (troessner) + +=== 2.0.7 / 2013-12-13 + +* 4 minor enhancements: + + * Add != to list of binary operators. (camertron) *le sigh* + * Clean out cruft from process_masgn that I can't reproduce anymore. + * Extend process_args to deal with masgn (eg: a.b { |(c, d)| ... }). + * Extend process_masgn to deal with both sexps and var lists. + +* 1 bug fix: + + * Ensure proper parens on rescue subexpressions. (Bocete) + +=== 2.0.6 / 2013-06-20 + +* 2 bug fixes: + + * Fixed bug with complex rescue but short enough to trigger 1-liner. (Confusion) + * Fixed multiple expressions inside sclass + +=== 2.0.5 / 2013-04-25 + +* 2 bug fixes: + + * Fixed attrasgn w/ multiple keys: a[x, y] = z. (derula) + * Fixed error w/ attr_* detection when more than 1 ivar/iasgn exist in body. + +=== 2.0.4 / 2013-03-28 + +* 1 bug fix: + + * Fixed attr_* generators in cases where the body isn't idiomatic. (robertfeldt) + +=== 2.0.3 / 2013-02-07 + +* 2 minor enhancements: + + * 1.9: Added support for ! call to go back to (not ...). + * 2nd and 3rd order testing now uses RubyPraser.for_current_ruby for maximal carnage. + +* 1 bug fix: + + * On failure (eg ruby 2.0), fall back to compound RubyParser instance for 2nd & 3rd order testing + +=== 2.0.2 / 2013-01-16 + +* 1 minor enhancement: + + * Updated to ruby_parser 3.1 and up + +=== 2.0.1 / 2012-11-02 + +* 1 bug fix: + + * Fixed dependency on alpha ruby_parser. *sigh* + +=== 2.0.0 / 2012-11-02 + +* 1 minor enhancement: + + * Only do phase 1 testing if $SIMPLE=1. + +* 1 bug fix: + + * Fixed block args processing for RP 3.0 sexp changes + +=== 2.0.0.b1 / 2012-07-27 + +* 4 major enhancements: + + * Made it work without arglist in call. + * Made it work without scope/block in class/module/defn/defs. + * Removed block from resbody + * Removed block from when node + +* 4 minor enhancements: + + * Added debug task to help isolate an error + * Empty hash is now a proper {} + * Refactored and added finish method. + * Switched to new Ruby18Parser to avoid deprecation warnings + +* 4 bug fixes: + + * Fixed call with empty hash arg. (neilconway) + * OMG WTF... removed long decrepit ParseTree dependency + * Removed isolate/rake require to reduce minimum bootstrap to hoe + rake + rake install_plugins (*2) + * Skip 1.9 tests for now. + +=== 1.3.1 / 2011-09-22 + +* 1 minor enhancement: + + * Added parenthesize to add parens in certain contexts. + +* 10 bug fixes: + + * Add newline to 'do nothing' comment in a block... seems contrived. (andreacampi) + * Binary operations not work properly with some complex statements. (smorss) + * Fixed if statements with no body (smorss) + * Fixed logic for call with hash args in various locations (smorss) + * Fixed match3 on an assignment. (smorss) + * Fixed multiple nested rescue/ensure exprs (larsch) + * Fixed process_alias to parenthesize (smorss) + * Fixed process_and to parenthenize only when it makes sense. + * Fixed rescue with 2+ statements in resbody (smorss) + * Regexps with options other than /o were not showing flags. (smorss) + +=== 1.3.0 / 2011-09-01 + +* 1 minor enhancement: + + * output comments for class and method definitions. (pythonic) + +=== 1.2.5 / 2010-09-01 + +* 4 minor enhancements: + + * Added braces to hash args surrounded if in a binary method call. + * Added rewrite_resbody to double check structure and freak if necessary. + * Added stress task + * rewrite_rescue now detects rescue with multiple arguments. + +* 2 bug fixes: + + * Fixed dstr/dregex/d* roundtripping problem + * Fixed up call arg processing to be more correct and to work with the new sexp form + +=== 1.2.4 / 2009-08-14 + +* 2 bug fixes: + + * Fixed all doco to use ruby_praser + * Fixed bin/r2r_show to use ruby_parser. oops + +=== 1.2.3 / 2009-06-23 + +* 4 minor enhancements: + + * Overhauled 4-generation tests to use RubyParser. Much cleaner + * Removed last of ParseTree. Fully switched to RubyParser. + * Switched to minitest + * Updated Rakefile to new hoe capabilities + +=== 1.2.2 / 2009-01-20 + +* 3 minor enhancements: + + * Added -s to display sexp before printing r2r + * Added a bunch of backslash and masgn tests. + * Refactored tests. + +* 4 bug fixes: + + * Fixed iters to deal with empty bodies. + * Fixed process_call for a number of cases incl [], []=, and args processing. + * Fixed process_hash to always generate braces if in arglist. + * Switched process_alias to producing alias again, needed for globals. + +=== 1.2.1 / 2008-11-04 + +* 1 bug fix: + + * Don't freak out and die if passed a c function defn. stupid rails. + +=== 1.2.0 / 2008-10-22 + +* 2 minor enhancements: + + * Removed all PT dependent code to PT project (see parse_tree_extensions.rb). + * Revamped. Got working with new unified ruby output. Much much cleaner. + +=== 1.1.9 / 2008-06-09 + +* 5 minor enhancements: + + * Added more defensive programming in the tests to make it work with 1.9 and rubinius better. + * Converted r2r_show to more plain parse style, no more discover_new_classes. + * Made Proc#to_sexp and #to_ruby more resiliant. + * Started to work on fallback to ruby_parser code. Should prolly do flog first. + * Updated rakefile and readme format for hoe. Much cleaner! + +* 6 bug fixes: + + * Added 1.9 fixes. + * Added code to tests to isolate rubyinline builds. + * Fixed miniunit-deprecated assertions + * Fixes for const2/3, esp in class names + * Renamed ProcStoreTmp#name to #new_name. dur. + * Skip proc tests in 1.9 since they require ParseTree. + +=== 1.1.8 / 2007-08-21 + +* 6 minor enhancements: + + * Added super awesome .autotest file. YAY! + * Removed nil.method_missing... too many ppl bitching about it. + * Renamed RubyToRuby (the class name) to Ruby2Ruby. + * Restructured self-translation tests so they were friendlier when dying. + * Strings are now always one line long only. + * Fully in sync with ParseTree and ruby_parser. + +* 2 bug fixes: + + * Fixed a number of issues/bugs discovered via ruby_parser. + * Cleaned out some dead code and hacks we don't need anymore. + +=== 1.1.7 / 2007-08-21 + +* 2 major enhancements: + + * Switched to ParseTree's UnifiedRuby... much much cleaner now! + * Made test_ruby2ruby MUCH more rigorous with circular testing. + +* 5 minor enhancements: + + * Add r2r_show command like parse_tree_show. + * Add parens for :block nodes as appropriate. May be overzealous. + * Make SexpAny work with #==. + * Removed calls to processor_stack / caller in favor of self.context. + * Some style differences, eschew rescue. + +* 6 bug fixes: + + * Fix R2R bug with masgn/argscat. + * Fixed a bug with new resbody unification. + * Fixes for changes to pt_testcase. + * Fixes the rest of the tests under strict sexp checking. + * Fixed some circular bugs, mostly by hacking them out, wrt operator precidence. + * Fixed trinary operator. + +=== 1.1.6 / 2007-06-05 + +* 2 minor enhancements: + + * Extended tests for dstr/dsym/drgx to test against embedded slashes and quotes. + * Updated for dasgn_curr changes to PT. + +* 2 bug fixes: + + * Fixed a bug with begin/rescue/ensure. + * Fixed argscat and blockpass bug. blah(42, *args, &block) handled. + +=== 1.1.5 / 2007-02-13 + +* 3 minor enhancements: + + * Can now heckle ActiveRecord::Base in full. + * Cleaned up 1-liner generating code. + * Made clean/simple rescues 1-liners. + +* 7 bug fixes: + + * Finally got the rest of block_pass working. + * Fixed block_pass on procs in iters. UGH! + * Fixed attrasgn in masgn. + * Fixed splat in masgn. + * Fixed unary/prefix methods. + * Fixed attrasgn for []= where there were multiple args inside []. + * Fixed a couple resbody bugs. + +=== 1.1.4 / 2007-01-15 + +* 4 minor enhancements: + + * Added some extra rewriting code and tests for various bmethods. Ugh. + * Added support for splatted block args. + * Refactored class/module and dsym/dstr. + * Short if/unless statements are now post-conditional expressions. + +* 4 bug fixes: + + * Finally fixed eric's nebulous proc code-in-goalposts bug. + * Fixed dasgn_curr so block's dasgn vars decl goes away (bug 7420). + * Fixed dmethod. I think the tests were bogus before. + * Fixed improper end in method rescues (bug 7396). + +=== 1.1.3 / 2006-12-20 + +* 1 minor enhancement + + * Unit tests do self-translation and retesting for 3 generations! Solid. BAM! + +* 1 bug fixes + + * iasgn inside masgn was totally borked in ruby2ruby. + +=== 1.1.2 / 2006-12-19 + +* 2 minor enhancements + + * Improved []= and [] to be more idiomatic. + * Support for nested whens (from when case has no expression). + +* 3 bug fixes + + * Fixed case output when there is no case expression. + * NEARLY have RubyToRuby self-cloning and passing tests again. + * Minor cleanup + +=== 1.1.1 / 2006-11-13 + +* 3 bug fixes + + * Fixed procs + * Cleaned return when no return values. + * Rewrote process_if. No more elsif but no more bugs. :) + +=== 1.1.0 / 2006-10-11 + +* 2 major enhancements + + * Released separately from ZenHacks. + * Major overhaul/audit from the new ParseTree test infrastructure. Very complete now. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/Manifest.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/Manifest.txt new file mode 100644 index 000000000..19ccfd6c7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/Manifest.txt @@ -0,0 +1,8 @@ +.autotest +History.rdoc +Manifest.txt +README.rdoc +Rakefile +bin/r2r_show +lib/ruby2ruby.rb +test/test_ruby2ruby.rb diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/README.rdoc b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/README.rdoc new file mode 100644 index 000000000..5cd62c4ef --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/README.rdoc @@ -0,0 +1,87 @@ += ruby2ruby + +home :: https://github.com/seattlerb/ruby2ruby +rdoc :: http://docs.seattlerb.org/ruby2ruby + +== DESCRIPTION: + +ruby2ruby provides a means of generating pure ruby code easily from +RubyParser compatible Sexps. This makes making dynamic language +processors in ruby easier than ever! + +== FEATURES/PROBLEMS: + +* Clean, simple SexpProcessor generates ruby code from RubyParser compatible sexps. + +== SYNOPSIS: + + require 'rubygems' + require 'ruby2ruby' + require 'ruby_parser' + require 'pp' + + ruby = "def a\n puts 'A'\nend\n\ndef b\n a\nend" + parser = RubyParser.new + ruby2ruby = Ruby2Ruby.new + sexp = parser.process(ruby) + + pp sexp + + p ruby2ruby.process(sexp.deep_clone) # Note: #process destroys its input, so + # #deep_clone if you need to preserve it + + ## outputs: + + s(:block, + s(:defn, + :a, + s(:args), + s(:scope, s(:block, s(:call, nil, :puts, s(:arglist, s(:str, "A")))))), + s(:defn, :b, s(:args), s(:scope, s(:block, s(:call, nil, :a, s(:arglist)))))) + "def a\n puts(\"A\")\nend\ndef b\n a\nend\n" + +== REQUIREMENTS: + ++ sexp_processor ++ ruby_parser + +== INSTALL: + ++ sudo gem install ruby2ruby + +== How to Contribute: + +To get started all you need is a checkout, rake, and hoe. The easiest +way is: + + % git clone seattlerb/ruby2ruby # assumes you use the `hub` wrapper. + % gem i rake hoe + % rake install_plugins # installs hoe-seattlerb & isolate + % rake install_plugins # installs minitest (referenced from hoe-seattlerb) + +From here you should be good to go. We accept pull requests on github. + +== LICENSE: + +(The MIT License) + +Copyright (c) Ryan Davis, seattle.rb + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/lib/ruby2ruby.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/lib/ruby2ruby.rb new file mode 100755 index 000000000..c442e73dc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby2ruby-2.5.2/lib/ruby2ruby.rb @@ -0,0 +1,1448 @@ +#!/usr/bin/env ruby -w + +require "rubygems" +require "sexp_processor" + +# :stopdoc: +# REFACTOR: stolen from ruby_parser +class Regexp + unless defined? ENC_NONE then + ENC_NONE = /x/n.options + ENC_EUC = /x/e.options + ENC_SJIS = /x/s.options + ENC_UTF8 = /x/u.options + end + + unless defined? CODES then + CODES = { + EXTENDED => "x", + IGNORECASE => "i", + MULTILINE => "m", + ENC_NONE => "n", + ENC_EUC => "e", + ENC_SJIS => "s", + ENC_UTF8 => "u", + } + end +end +# :startdoc: + +## +# Generate ruby code from a sexp. + +class Ruby2Ruby < SexpProcessor + VERSION = "2.5.2" # :nodoc: + + # cutoff for one-liners + LINE_LENGTH = 78 + + # binary operation messages + BINARY = [:<=>, :==, :<, :>, :<=, :>=, :-, :+, :*, :/, :%, :<<, :>>, :**, :"!=", :^, :|, :&] + + ## + # Nodes that represent assignment and probably need () around them. + # + # TODO: this should be replaced with full precedence support :/ + + ASSIGN_NODES = [ + :dasgn, + :flip2, + :flip3, + :lasgn, + :masgn, + :match3, + :attrasgn, + :op_asgn1, + :op_asgn2, + :op_asgn_and, + :op_asgn_or, + :return, + :if, # HACK + :rescue, + ] + + ## + # Some sexp types are OK without parens when appearing as hash values. + # This list can include `:call`s because they're always printed with parens + # around their arguments. For example: + # + # { :foo => (bar("baz")) } # The outer parens are unnecessary + # { :foo => bar("baz") } # This is the normal code style + + HASH_VAL_NO_PAREN = [ + :call, + :false, + :lit, + :lvar, + :nil, + :str, + :true, + ] + + def initialize # :nodoc: + super + @indent = " " + self.require_empty = false + self.strict = true + self.expected = String + + @calls = [] + + # self.debug[:defn] = /zsuper/ + end + + ############################################################ + # Processors + + def process_alias exp # :nodoc: + _, lhs, rhs = exp + + parenthesize "alias #{process lhs} #{process rhs}" + end + + def process_and exp # :nodoc: + _, lhs, rhs = exp + + parenthesize "#{process lhs} and #{process rhs}" + end + + def process_arglist exp # custom made node # :nodoc: + _, *args = exp + + args.map { |arg| + code = process arg + arg.sexp_type == :rescue ? "(#{code})" : code + }.join ", " + end + + def process_args exp # :nodoc: + _, *args = exp + + shadow = [] + + args = args.map { |arg| + case arg + when Symbol then + arg + when Sexp then + case arg.sexp_type + when :lasgn then + process(arg) + when :masgn then + process(arg) + when :kwarg then + _, k, v = arg + "#{k}: #{process v}" + when :shadow then + shadow << arg.sexp_body + next + when :forward_args then + "..." + else + raise "unknown arg type #{arg.first.inspect}" + end + when nil then + "" + else + raise "unknown arg type #{arg.inspect}" + end + }.compact + + args = args.join(", ").strip + shadow = shadow.join(", ").strip + shadow = "; #{shadow}" unless shadow.empty? + + "(%s%s)" % [args, shadow] + end + + def process_array exp # :nodoc: + "[#{process_arglist exp}]" + end + + def process_attrasgn exp # :nodoc: + _, recv, name, *args = exp + + rhs = args.pop + args = s(:array, *args) + receiver = process recv + + case name + when :[]= then + args = process args + "#{receiver}#{args} = #{process rhs}" + else + raise "dunno what to do: #{args.inspect}" if args.size != 1 # s(:array) + name = name.to_s.chomp "=" + if rhs && rhs != s(:arglist) then + "#{receiver}.#{name} = #{process(rhs)}" + else + raise "dunno what to do: #{rhs.inspect}" + end + end + end + + def process_back_ref exp # :nodoc: + _, n = exp + + "$#{n}" + end + + # TODO: figure out how to do rescue and ensure ENTIRELY w/o begin + def process_begin exp # :nodoc: + _, *rest = exp + + code = rest.map { |sexp| + src = process sexp + src = indent src unless src =~ /(^|\n)(rescue|ensure)/ # ensure no level 0 rescues + src + } + code.unshift "begin" + code.push "end" + + code.join "\n" + end + + def process_block exp # :nodoc: + _, *body = exp + + result = body.map { |sexp| + process sexp + } + + result << "# do nothing\n" if result.empty? + result = parenthesize result.join "\n" + result += "\n" unless result.start_with? "(" + + result + end + + def process_block_pass exp # :nodoc: + raise "huh?: #{exp.inspect}" if exp.size > 2 + + _, sexp = exp + + "&#{process sexp}" + end + + def process_break exp # :nodoc: + _, arg = exp + + val = process arg + + if val then + "break #{val}" + else + "break" + end + end + + def process_call(exp, safe_call = false) # :nodoc: + _, recv, name, *args = exp + + receiver_node_type = recv && recv.sexp_type + receiver = process recv + receiver = "(#{receiver})" if ASSIGN_NODES.include? receiver_node_type + + # args = [] + + # this allows us to do both old and new sexp forms: + # exp.push(*exp.pop[1..-1]) if exp.size == 1 && exp.first.first == :arglist + + @calls.push name + + in_context :arglist do + max = args.size - 1 + args = args.map.with_index { |arg, i| + arg_type = arg.sexp_type + is_empty_hash = arg == s(:hash) + arg = process arg + + next if arg.empty? + + strip_hash = (arg_type == :hash and + not BINARY.include? name and + not is_empty_hash and + (i == max or args[i + 1].sexp_type == :splat)) + wrap_arg = Ruby2Ruby::ASSIGN_NODES.include? arg_type + + arg = arg[2..-3] if strip_hash + arg = "(#{arg})" if wrap_arg + + arg + }.compact + end + + case name + when *BINARY then + if safe_call + "#{receiver}&.#{name}(#{args.join(", ")})" + elsif args.length > 1 + "#{receiver}.#{name}(#{args.join(", ")})" + else + "(#{receiver} #{name} #{args.join(", ")})" + end + when :[] then + receiver ||= "self" + "#{receiver}[#{args.join(", ")}]" + when :[]= then + receiver ||= "self" + rhs = args.pop + "#{receiver}[#{args.join(", ")}] = #{rhs}" + when :"!" then + "(not #{receiver})" + when :"-@" then + "-#{receiver}" + when :"+@" then + "+#{receiver}" + else + args = nil if args.empty? + args = "(#{args.join(", ")})" if args + receiver = "#{receiver}." if receiver and not safe_call + receiver = "#{receiver}&." if receiver and safe_call + + "#{receiver}#{name}#{args}" + end + ensure + @calls.pop + end + + def process_safe_call exp # :nodoc: + process_call exp, :safe + end + + def process_case exp # :nodoc: + _, expr, *rest = exp + + result = [] + + expr = process expr + + result << if expr then + "case #{expr}" + else + "case" + end + + result.concat rest.map { |pt| + if pt and %i[when in].include? pt.sexp_type + "#{process pt}" + else + next unless pt + code = indent process pt + code = indent("# do nothing") if code =~ /^\s*$/ + "else\n#{code}" + end + } + + result << "end" + + result.compact.join "\n" + end + + def process_cdecl exp # :nodoc: + _, lhs, rhs = exp + lhs = process lhs if Sexp === lhs + if rhs then + rhs = process rhs + "#{lhs} = #{rhs}" + else + lhs.to_s + end + end + + def process_class exp # :nodoc: + "#{exp.comments}class #{util_module_or_class(exp, true)}" + end + + def process_colon2 exp # :nodoc: + _, lhs, rhs = exp + + "#{process lhs}::#{rhs}" + end + + def process_colon3 exp # :nodoc: + _, rhs = exp + + "::#{rhs}" + end + + def process_const exp # :nodoc: + _, name = exp + + name = process name if Sexp === name + + name.to_s + end + + def __var name + case context[1] + when /_pat$/ then + "^#{name}" + when :in then + "^#{name}" + else + name.to_s + end + end + + def process_cvar exp # :nodoc: + _, name = exp + + __var name + end + + def process_cvasgn exp # :nodoc: + _, lhs, rhs = exp + + "#{lhs} = #{process rhs}" + end + + def process_cvdecl exp # :nodoc: + _, lhs, rhs = exp + + "#{lhs} = #{process rhs}" + end + + def process_defined exp # :nodoc: + _, rhs = exp + "defined? #{process rhs}" + end + + def process_defn(exp) # :nodoc: + _, name, args, *body = exp + + comm = exp.comments + args = process args + args = "" if args == "()" + + body = s() if body == s(s(:nil)) # empty it out of a default nil expression + + # s(:defn, name, args, ivar|iasgn) + case exp + when s{ q(:defn, atom, t(:args), q(:ivar, atom)) } then # TODO: atom -> _ + _, ivar = body.first + ivar = ivar.to_s[1..-1] # remove leading @ + reader = name.to_s + return "attr_reader #{name.inspect}" if reader == ivar + when s{ q(:defn, atom, t(:args), q(:iasgn, atom, q(:lvar, atom))) } then + _, ivar, _val = body.first + ivar = ivar.to_s[1..-1] # remove leading @ + reader = name.to_s.chomp "=" + return "attr_writer :#{reader}" if reader == ivar + end + + body = body.map { |ssexp| + process ssexp + } + + simple = body.size <= 1 + + body << "# do nothing" if body.empty? + body = body.join("\n") + body = body.lines.to_a[1..-2].join("\n") if + simple && body =~ /^\Abegin/ && body =~ /^end\z/ + body = indent(body) unless simple && body =~ /(^|\n)rescue/ + + "#{comm}def #{name}#{args}\n#{body}\nend".gsub(/\n\s*\n+/, "\n") + end + + def process_defs exp # :nodoc: + _, lhs, name, args, *body = exp + var = [:self, :cvar, :dvar, :ivar, :gvar, :lvar].include? lhs.sexp_type + + lhs = process lhs + lhs = "(#{lhs})" unless var + + name = "#{lhs}.#{name}" + + process_defn s(:defn, name, args, *body) + end + + def process_dot2(exp) # :nodoc: + _, lhs, rhs = exp + + "(#{process lhs}..#{process rhs})" + end + + def process_dot3(exp) # :nodoc: + _, lhs, rhs = exp + + "(#{process lhs}...#{process rhs})" + end + + def process_dregx exp # :nodoc: + _, str, *rest = exp + + options = re_opt rest.pop if Integer === rest.last + + "/" + util_dthing(:dregx, s(:dregx, str, *rest)) << "/#{options}" + end + + def process_dregx_once(exp) # :nodoc: + process_dregx(exp) + "o" + end + + def process_dstr(exp) # :nodoc: + "\"#{util_dthing(:dstr, exp)}\"" + end + + def process_dsym(exp) # :nodoc: + ":\"#{util_dthing(:dsym, exp)}\"" + end + + def process_dxstr(exp) # :nodoc: + "`#{util_dthing(:dxstr, exp)}`" + end + + def process_ensure(exp) # :nodoc: + _, body, ens = exp + + body = process body + ens = nil if ens == s(:nil) + ens = process(ens) || "# do nothing" + ens = "begin\n#{ens}\nend\n" if ens =~ /(^|\n)rescue/ + + body = body.sub(/\n\s*end\z/, "") + body = indent(body) unless body =~ /(^|\n)rescue/ + + "#{body}\nensure\n#{indent ens}" + end + + def process_evstr exp # :nodoc: + _, x = exp + + x ? process(x) : "" + end + + def process_false exp # :nodoc: + "false" + end + + def process_flip2 exp # :nodoc: + _, lhs, rhs = exp + + "#{process lhs}..#{process rhs}" + end + + def process_flip3 exp # :nodoc: + _, lhs, rhs = exp + + "#{process lhs}...#{process rhs}" + end + + def process_for exp # :nodoc: + _, recv, iter, body = exp + + recv = process recv + iter = process iter + body = process(body) || "# do nothing" + + result = ["for #{iter} in #{recv} do"] + result << indent(body) + result << "end" + + result.join "\n" + end + + def process_forward_args exp + "..." + end + + def process_gasgn exp # :nodoc: + process_iasgn exp + end + + def process_gvar exp # :nodoc: + _, name = exp + + __var name + end + + def process_hash(exp) # :nodoc: + _, *pairs = exp + + result = pairs.each_slice(2).map { |k, v| + if k.sexp_type == :kwsplat then + "%s" % process(k) + elsif v.nil? + # Shorthand hash syntax + unless k.sexp_type == :lit and k.value.is_a? Symbol + raise "Expected symbol for hash key, but got #{k.inspect}" + end + + "#{k.value}:" + else + t = v.sexp_type + + lhs = process k + rhs = process v + rhs = "(#{rhs})" unless HASH_VAL_NO_PAREN.include? t + + "%s => %s" % [lhs, rhs] + end + } + + result.empty? ? "{}" : "{ #{result.join(", ")} }" + end + + def process_iasgn(exp) # :nodoc: + _, lhs, rhs = exp + + if rhs then + "#{lhs} = #{process rhs}" + else # part of an masgn + lhs.to_s + end + end + + def process_in exp # :nodoc: + _, lhs, *rhs = exp + + cond = process lhs + body = rhs.compact.map { |sexp| indent process sexp } + + body << indent("# do nothing") if body.empty? + body = body.join "\n" + + "in #{cond} then\n#{body.chomp}" + end + + def process_find_pat exp # :nodoc: + _, a, b, *c, d = exp + + a = process a # might be nil + b = process b if Sexp === b + c = c.map { |sexp| process sexp }.join(", ") + d = process d if Sexp === d + + "%s[%s, %s, %s]" % [a, b, c, d] + end + + def process_array_pat exp # :nodoc: + _, const, *rest = exp + + const = process const if const + + rest = rest.map { |sexp| + case sexp + when Sexp + process sexp + else + sexp + end + } + + "%s[%s]" % [const, rest.join(", ")] + end + + def process_kwrest exp # :nodoc: + _, name = exp + + name.to_s + end + + def process_hash_pat exp # :nodoc: + _, const, *rest = exp + + if const then + const = process const + kwrest = process rest.pop if rest.last && rest.last.sexp_type == :kwrest + + rest = rest.each_slice(2).map { |k, v| + k = process(k).delete_prefix ":" + v = process v + + "#{k}: #{v}".strip + } + + rest << kwrest if kwrest + + rest.empty? ? "%s[]" % const : "%s[%s]" % [const, rest.join(", ")] + else + kwrest = process rest.pop if rest.last && rest.last.sexp_type == :kwrest + + rest = rest.each_slice(2).map { |k, v| + k = process(k).delete_prefix ":" + v = process v + + "#{k}: #{v}".strip + } + + rest << kwrest if kwrest + + rest.empty? ? "{}" : "{ %s }" % [rest.join(", ")] + end + end + + def process_preexe exp # :nodoc: + "BEGIN" + end + + def process_if(exp) # :nodoc: + _, c, t, f = exp + + expand = Ruby2Ruby::ASSIGN_NODES.include? c.sexp_type + c = process c + t = process t + f = process f + + c = "(#{c.chomp})" if c =~ /\n/ + + if t then + unless expand then + if f then + r = "#{c} ? (#{t}) : (#{f})" + r = nil if r =~ /return/ # HACK - need contextual awareness or something + else + r = "#{t} if #{c}" + end + return r if r and (@indent + r).size < LINE_LENGTH and r !~ /\n/ + end + + r = [] + r << "if #{c} then\n#{indent(t)}\n" + r << "else\n#{indent(f)}\n" if f + r << "end" + + r.join + elsif f + unless expand then + r = "#{f} unless #{c}" + return r if (@indent + r).size < LINE_LENGTH and r !~ /\n/ + end + "unless #{c} then\n#{indent(f)}\nend" + else + # empty if statement, just do it in case of side effects from condition + "if #{c} then\n#{indent "# do nothing"}\nend" + end + end + + def process_lambda exp # :nodoc: + "->" + end + + MUST_BE_CURLY = %w[ BEGIN END ] + + def process_iter(exp) # :nodoc: + _, iter, args, body = exp + + is_lambda = iter.sexp_type == :lambda + + iter = process iter + body = process body if body + + args = case + when args == 0 then + "" + when is_lambda then + " (#{process(args)[1..-2]})" + else + " |#{process(args)[1..-2]}|" + end + + b, e = if MUST_BE_CURLY.include? iter then + %w[ { } ] + else + %w[ do end ] + end + + iter = iter.sub(/\(\)$/, "") + + # REFACTOR: ugh + result = [] + if is_lambda then + result << iter + result << args + result << " {" + else + result << "#{iter} {" + result << args + end + result << if body then + " #{body.strip} " + else + " " + end + result << "}" + result = result.join + return result if result !~ /\n/ and result.size < LINE_LENGTH + + result = [] + + if is_lambda then + result << iter + result << args + result << " #{b}" + else + result << "#{iter} #{b}" + result << args + end + + result << "\n" + if body then + result << indent(body.strip) + result << "\n" + end + result << e + result.join + end + + def process_ivar(exp) # :nodoc: + _, name = exp + + __var name + end + + def process_kwsplat(exp) + _, kw = exp + "**#{process kw}" + end + + def process_lasgn(exp) # :nodoc: + _, name, value = exp + + value = process value + + if value then + "%s %s %s" % case context[1] + when /_pat$/ then + [value, "=>", name] + else + [name, "=", value] + end + else + "%s" % [name] + end + end + + def process_lit exp # :nodoc: + _, obj = exp + case obj + when Range then + "(#{obj.inspect})" + else + obj.inspect + end + end + + def process_lvar(exp) # :nodoc: + _, name = exp + + __var name + end + + def process_masgn(exp) # :nodoc: + # s(:masgn, s(:array, s(:lasgn, :var), ...), s(:to_ary, <val>, ...)) + # s(:iter, <call>, s(:args, s(:masgn, :a, :b)), <body>) + parenthesize = true + + result = exp.sexp_body.map { |sexp| + case sexp + when Sexp then + if sexp.sexp_type == :array then + parenthesize = context.grep(:masgn).size > 1 + res = process sexp + + res[1..-2] + else + process sexp + end + when Symbol then + sexp + else + raise "unknown masgn: #{sexp.inspect}" + end + } + parenthesize ? "(#{result.join ", "})" : result.join(" = ") + end + + def process_match exp # :nodoc: + _, rhs = exp + + "#{process rhs}" + end + + def process_match2 exp # :nodoc: + # s(:match2, s(:lit, /x/), s(:str, "blah")) + _, lhs, rhs = exp + + lhs = process lhs + rhs = process rhs + + "#{lhs} =~ #{rhs}" + end + + def process_match3 exp # :nodoc: + _, rhs, lhs = exp # yes, backwards + + left_type = lhs.sexp_type + lhs = process lhs + rhs = process rhs + + if ASSIGN_NODES.include? left_type then + "(#{lhs}) =~ #{rhs}" + else + "#{lhs} =~ #{rhs}" + end + end + + def process_module(exp) # :nodoc: + "#{exp.comments}module #{util_module_or_class(exp)}" + end + + def process_next(exp) # :nodoc: + _, rhs = exp + + val = rhs && process(rhs) # maybe push down into if and test rhs? + if val then + "next #{val}" + else + "next" + end + end + + def process_nil(exp) # :nodoc: + "nil" + end + + def process_not(exp) # :nodoc: + _, sexp = exp + "(not #{process sexp})" + end + + def process_nth_ref(exp) # :nodoc: + _, n = exp + "$#{n}" + end + + def process_op_asgn exp # :nodoc: + case exp.length + when 4 + _, lhs, op, rhs = exp + + lhs = process lhs + rhs = process rhs + + "#{lhs} #{op}= #{rhs}" + when 5 + _, lhs, rhs, index, op = exp + + lhs = process lhs + rhs = process rhs + + "#{lhs}.#{index} #{op}= #{rhs}" + else + raise ArgumentError, "Don't know how to process this length: %p" % [exp] + end + end + + def process_op_asgn1(exp) # :nodoc: + # [[:lvar, :b], [:arglist, [:lit, 1]], :"||", [:lit, 10]] + _, lhs, index, msg, rhs = exp + + lhs = process lhs + index = process index + rhs = process rhs + + "#{lhs}[#{index}] #{msg}= #{rhs}" + end + + def process_op_asgn2 exp # :nodoc: + # [[:lvar, :c], :var=, :"||", [:lit, 20]] + _, lhs, index, msg, rhs = exp + + lhs = process lhs + index = index.to_s[0..-2] + rhs = process rhs + + "#{lhs}.#{index} #{msg}= #{rhs}" + end + + def process_op_asgn_and(exp) # :nodoc: + # a &&= 1 + # [[:lvar, :a], [:lasgn, :a, [:lit, 1]]] + _, _lhs, rhs = exp + process(rhs).sub(/\=/, "&&=") + end + + def process_op_asgn_or(exp) # :nodoc: + # a ||= 1 + # [[:lvar, :a], [:lasgn, :a, [:lit, 1]]] + _, _lhs, rhs = exp + process(rhs).sub(/\=/, "||=") + end + + def process_or(exp) # :nodoc: + _, lhs, rhs = exp + + lhs = process lhs + rhs = process rhs + + case context[1] + when :in then + "(#{lhs} | #{rhs})" + else + "(#{lhs} or #{rhs})" + end + end + + def process_postexe(exp) # :nodoc: + "END" + end + + def process_redo(exp) # :nodoc: + "redo" + end + + def process_resbody exp # :nodoc: + # s(:resbody, s(:array), s(:return, s(:str, "a"))) + _, args, *body = exp + + body = body.compact.map { |sexp| + process sexp + } + + body << "# do nothing" if body.empty? + + name = args.lasgn true + name ||= args.iasgn true + args = process(args)[1..-2] + args = " #{args}" unless args.empty? + args += " => #{name[1]}" if name + + "rescue#{args}\n#{indent body.join("\n")}" + end + + def process_rescue exp # :nodoc: + _, *rest = exp + + body = process rest.shift unless rest.first.sexp_type == :resbody + els = process rest.pop unless rest.last && rest.last.sexp_type == :resbody + + body ||= "# do nothing" + + # TODO: I don't like this using method_missing, but I need to ensure tests + simple = rest.size == 1 && rest.first.size <= 3 && + !rest.first.block && + !rest.first.return + + resbodies = rest.map { |resbody| + _, rb_args, rb_body, *rb_rest = resbody + simple &&= rb_args == s(:array) + simple &&= rb_rest.empty? && rb_body && rb_body.node_type != :block + process resbody + } + + if els then + "#{indent body}\n#{resbodies.join("\n")}\nelse\n#{indent els}" + elsif simple then + resbody = resbodies.first.sub(/\n\s*/, " ") + "#{body} #{resbody}" + else + "#{indent body}\n#{resbodies.join("\n")}" + end + end + + def process_retry(exp) # :nodoc: + "retry" + end + + def process_return exp # :nodoc: + _, rhs = exp + + unless rhs then + "return" + else + rhs_type = rhs.sexp_type + rhs = process rhs + rhs = "(#{rhs})" if ASSIGN_NODES.include? rhs_type + "return #{rhs}" + end + end + + def process_safe_attrasgn exp # :nodoc: + _, receiver, name, *rest = exp + + receiver = process receiver + rhs = rest.pop + args = rest.pop # should be nil + + raise "dunno what to do: #{args.inspect}" if args + + name = name.to_s.sub(/=$/, "") + + if rhs && rhs != s(:arglist) then + "#{receiver}&.#{name} = #{process rhs}" + else + raise "dunno what to do: #{rhs.inspect}" + end + end + + def process_safe_op_asgn exp # :nodoc: + # [[:lvar, :x], [:call, nil, :z, [:lit, 1]], :y, :"||"] + _, lhs, rhs, index, op = exp + + lhs = process lhs + rhs = process rhs + + "#{lhs}&.#{index} #{op}= #{rhs}" + end + + def process_safe_op_asgn2(exp) # :nodoc: + # [[:lvar, :c], :var=, :"||", [:lit, 20]] + + _, lhs, index, msg, rhs = exp + + lhs = process lhs + index = index.to_s[0..-2] + rhs = process rhs + + "#{lhs}&.#{index} #{msg}= #{rhs}" + end + + def process_sclass(exp) # :nodoc: + _, recv, *block = exp + + recv = process recv + block = indent process_block s(:block, *block) + + "class << #{recv}\n#{block}\nend" + end + + def process_self(exp) # :nodoc: + "self" + end + + def process_splat(exp) # :nodoc: + _, arg = exp + if arg.nil? then + "*" + else + "*#{process arg}" + end + end + + def process_str(exp) # :nodoc: + _, s = exp + s.dump + end + + def process_super(exp) # :nodoc: + _, *args = exp + + args = args.map { |arg| + process arg + } + + "super(#{args.join ", "})" + end + + def process_svalue(exp) # :nodoc: + _, *args = exp + + args.map { |arg| + process arg + }.join ", " + end + + def process_to_ary exp # :nodoc: + _, sexp = exp + + process sexp + end + + def process_true(exp) # :nodoc: + "true" + end + + def process_undef(exp) # :nodoc: + _, name = exp + + "undef #{process name}" + end + + def process_until(exp) # :nodoc: + cond_loop(exp, "until") + end + + def process_valias exp # :nodoc: + _, lhs, rhs = exp + + "alias #{lhs} #{rhs}" + end + + def process_when exp # :nodoc: + _, lhs, *rhs = exp + + cond = process(lhs)[1..-2] + + rhs = rhs.compact.map { |sexp| + indent process sexp + } + + rhs << indent("# do nothing") if rhs.empty? + rhs = rhs.join "\n" + + "when #{cond} then\n#{rhs.chomp}" + end + + def process_while(exp) # :nodoc: + cond_loop exp, "while" + end + + def process_xstr(exp) # :nodoc: + "`#{process_str(exp)[1..-2]}`" + end + + def process_yield(exp) # :nodoc: + _, *args = exp + + args = args.map { |arg| + process arg + } + + unless args.empty? then + "yield(#{args.join(", ")})" + else + "yield" + end + end + + def process_zsuper(exp) # :nodoc: + "super" + end + + ############################################################ + # Rewriters: + + def rewrite_attrasgn exp # :nodoc: + if context.first(2) == [:array, :masgn] then + _, recv, msg, *args = exp + + exp = s(:call, recv, msg.to_s.chomp("=").to_sym, *args) + end + + exp + end + + def rewrite_call exp # :nodoc: + _, recv, msg, *args = exp + + exp = s(:not, recv) if msg == :! && args.empty? + + exp + end + + def rewrite_ensure exp # :nodoc: + exp = s(:begin, exp) unless context.first == :begin + exp + end + + def rewrite_if exp # :nodoc: + _, c, t, f = exp + + if c.sexp_type == :not then + _, nc = c + exp = s(:if, nc, f, t) + end + + exp + end + + def rewrite_resbody exp # :nodoc: + _, args, *_rest = exp + raise "no exception list in #{exp.inspect}" unless exp.size > 2 && args + raise args.inspect if args.sexp_type != :array + # for now, do nothing, just check and freak if we see an errant structure + exp + end + + def rewrite_rescue exp # :nodoc: + complex = false + complex ||= exp.size > 3 + complex ||= exp.resbody.block + complex ||= exp.resbody.size > 3 + resbodies = exp.find_nodes(:resbody) + complex ||= resbodies.any? { |n| n[1] != s(:array) } + complex ||= resbodies.any? { |n| n.last.nil? } + complex ||= resbodies.any? { |(_, _, body)| body and body.node_type == :block } + + handled = context.first == :ensure + + exp = s(:begin, exp) if complex unless handled + + exp + end + + def rewrite_svalue(exp) # :nodoc: + case exp.last.sexp_type + when :array + s(:svalue, *exp[1].sexp_body) + when :splat + exp + else + raise "huh: #{exp.inspect}" + end + end + + def rewrite_until exp # :nodoc: + _, c, *body = exp + + if c.sexp_type == :not then + _, nc = c + exp = s(:while, nc, *body) + end + + exp + end + + def rewrite_while exp # :nodoc: + _, c, *body = exp + + if c.sexp_type == :not then + _, nc = c + exp = s(:until, nc, *body) + end + + exp + end + + ############################################################ + # Utility Methods: + + ## + # Generate a post-or-pre conditional loop. + + def cond_loop(exp, name) + _, cond, body, head_controlled = exp + + cond = process cond + body = process body + + body = indent(body).chomp if body + + code = [] + if head_controlled then + code << "#{name} #{cond} do" + code << body if body + code << "end" + else + code << "begin" + code << body if body + code << "end #{name} #{cond}" + end + + code.join("\n") + end + + ## + # Utility method to escape something interpolated. + + def dthing_escape type, lit + # TODO: this needs more testing + case type + when :dregx then + lit.gsub(/(\A|[^\\])\//, '\1\/') + when :dstr, :dsym then + lit.dump[1..-2] + when :dxstr then + lit.gsub(/`/, '\`') + else + raise "unsupported type #{type.inspect}" + end + end + + ## + # Indent all lines of +s+ to the current indent level. + + def indent s + s.to_s.split(/\n/).map{|line| @indent + line}.join("\n") + end + + ## + # Wrap appropriate expressions in matching parens. + + def parenthesize exp + case context[1] + when nil, :defn, :defs, :class, :sclass, :if, :iter, :resbody, :when, :while then + exp + else + "(#{exp})" + end + end + + ## + # Return the appropriate regexp flags for a given numeric code. + + def re_opt options + bits = (0..8).map { |n| options[n] * 2**n } + bits.delete 0 + bits.map { |n| Regexp::CODES[n] }.join + end + + ## + # Return a splatted symbol for +sym+. + + def splat(sym) + :"*#{sym}" + end + + ## + # Utility method to generate something interpolated. + + def util_dthing(type, exp) + _, str, *rest = exp + + # first item in sexp is a string literal + str = dthing_escape(type, str) + + rest = rest.map { |pt| + case pt.sexp_type + when :str then + dthing_escape(type, pt.last) + when :evstr then + '#{%s}' % [process(pt)] + else + raise "unknown type: #{pt.inspect}" + end + } + + [str, rest].join + end + + ## + # Utility method to generate ether a module or class. + + def util_module_or_class exp, is_class = false + result = [] + + _, name, *body = exp + superk = body.shift if is_class + + name = process name if Sexp === name + + result << name + + if superk then + superk = process superk + result << " < #{superk}" if superk + end + + result << "\n" + + body = body.map { |sexp| + process(sexp).chomp + } + + body = unless body.empty? then + indent(body.join("\n\n")) + "\n" + else + "" + end + + result << body + result << "end" + + result.join + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/History.rdoc b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/History.rdoc new file mode 100644 index 000000000..4ab0ba484 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/History.rdoc @@ -0,0 +1,1345 @@ +=== 3.20.3 / 2023-07-11 + +* 2 minor enhancements: + + * Added Parser#in_argdef and integrated into 3.x parsers. + * Improved tools/munge.rb to handler MRI 3.2 output + +* 2 bug fixes: + + * Fixed process_dots to properly deal with paren-less forward_args. (eric1234) + * Fixed tools/ripper.rb to properly print ripper sexp at the end + +=== 3.20.2 / 2023-06-06 + +* 1 bug fix: + + * 3.2: fixed parsing of f(*) and f(**). (agrobbin) + +=== 3.20.1 / 2023-05-16 + +* 1 minor enhancement: + + * Fixes Sexp#line_max in parser for many constructs: paren_args, arrays of various sorts, calls, classes, modules, etc. + +=== 3.20.0 / 2023-03-04 + +* 1 major enhancement: + + * Added tentative 3.2 support. + +* 1 minor enhancement: + + * Change minimum ruby version to 2.6. (want higher) + +* 1 bug fix: + + * Fix up compare tasks for ruby 3.2 differences. + +=== 3.19.2 / 2022-12-03 + +* 5 bug fixes: + + * Fixed bug parsing array patterns using %w, %i, etc. + * Fixed dedenting when heredoc has only empty line and interpolation. (mvz) + * Fixed dsym unescaping. (mvz) + * Fixed vars in pattern matching that should be lasgn, not lvar. + * find_pat mid-patterns are now splatted inline, not wrapped in an array_pat. + +=== 3.19.1 / 2022-04-05 + +* 2 bug fixes: + + * Added comments to endless defn and defs. (mvz) + * Fixed endless method bug handling attrset names. + +=== 3.19.0 / 2022-03-29 + +* 1 major enhancement: + + * Added tentative 3.1 support. + +* 7 minor enhancements: + + * 3.1: bare RHS assoc: { y: } => s(:hash, s(:lit, :y), nil) + * 3.1: calls w/ unnamed block args (bare &) + * 3.1: endless defn/defs w/ paren-less calls (aka commands) + * 3.1: pattern capture to nonlocal vars, eg: ^@a, ^$b, ^@@c + * 3.1: pattern: ^(expr) => expr + * Improved steps for adding new versions. + * Improved steps for running gauntlets. + +* 2 bug fixes: + + * Bumped 2.6+ cached versions for rake compare. + * Skip test_regexp_esc_C_slash on ruby 3.1.0 because of MRI bug. + +=== 3.18.1 / 2021-11-10 + +* 1 minor enhancement: + + * All parser tests are now explicitly testing line numbers at every level. + +* 3 bug fixes: + + * Fixed endless method with noargs. (mitsuru) + * Fixed line numbers on some yield forms. + * Handle and clearly report if unifdef is missing. + +=== 3.18.0 / 2021-10-27 + +Holy crap... 58 commits! 2.7 and 3.0 are feature complete. Strings +& heredocs have been rewritten. + +* 9 major enhancements: + + * !!! Rewrote lexer (and friends) for strings, heredocs, and %*[] constructs. + * Massive overhaul on line numbers. + * Freeze input! Finally!!! No more modifying the input string for heredocs. + * Overhauled RPStringScanner. Removed OLD compatibility methods! + * Removed Sexp methods: value, to_sym, add, add_all, node_type, values. + * value moved to sexp_processor. + * Removed String#grep monkey-patch. + * Removed String#lineno monkey-patch. + * Removed string_to_pos, charpos, etc hacks for ancient ruby versions. + * Removed unread_many... NO! NO EDITING THE INPUT STRING! + +* 31 minor enhancements: + + * 2.7/3.0: many more pattern edge cases + * 2.7: Added `mlhs = rhs rescue expr` + * 2.7: refactored destructured args (`|(k,v)|`) and unfactored(?!) case_body/args. + * 3.0: excessed_comma + * 3.0: finished most everything: endless methods, patterns, etc. + * 3.0: refactored / added new pattern changes + * Added RubyLexer#in_heredoc? (ie, is there old_ss ?) + * Added RubyLexer#old_ss and old_lineno and removed much of SSStack(ish). + * Added Symbol#end_with? when necessary + * Added TALLY and DEBUG options for ss.getch and ss.scan + * Added ignore_body_comments to make parser productions more clear. + * Added support for no_kwarg (eg `def f(**nil)`). + * Added support for no_kwarg in blocks (eg `f { |**nil| }`). + * Augmented generated parser files to have frozen_string_literal comments and fixed tests. + * Broke out 3.0 parser into its own to ease development. + * Bumped dependencies on sexp_processor and oedipus_lex. + * Clean generated 3.x files. + * Extracted all string scanner methods to their own module. + * Fixed some precedence decls. + * Implemented most of pattern matching for 2.7+. + * Improve lex_state= to report location in verbose debug mode. + * Made it easier to debug with a particular version of ruby via rake. + * Make sure ripper uses the same version of ruby we specified. + * Moved all string/heredoc/etc code to ruby_lexer_strings.rb + * Remove warning from newer bisons. + * Sprinkled in some frozen_string_literal, but mostly helped by oedipus bump. + * Switch to comparing against ruby binary since ripper is buggy. + * bugs task should try both bug*.rb and bad*.rb. + * endless methods + * f_any_kwrest refactoring. + * refactored defn/defs + +* 15 bug fixes: + + * Cleaned a bunch of old hacks. Initializing RubyLexer w/ Parser is cleaner now. + * Corrected some lex_state errors in process_token_keyword. + * Fixed ancient ruby2 change (use #lines) in ruby_parse_extract_error. + * Fixed bug where else without rescue only raises on 2.6+ + * Fixed caller for getch and scan when DEBUG=1 + * Fixed comments in the middle of message cascades. + * Fixed differences w/ symbol productions against ruby 2.7. + * Fixed dsym to use string_contents production. + * Fixed error in bdot2/3 in some edge cases. Fixed p_alt line. + * Fixed heredoc dedenting in the presence of empty lines. (mvz) + * Fixed some leading whitespace / comment processing + * Fixed up how class/module/defn/defs comments were collected. + * Overhauled ripper.rb to deal with buggy ripper w/ yydebug. + * Removed dsym from literal. + * Removed tUBANG lexeme but kept it distinct as a method name (eg: `def !@`). + +=== 3.17.0 / 2021-08-03 + +* 1 minor enhancement: + + * Added support for arg forwarding (eg `def f(...); m(...); end`) (presidentbeef) + +=== 3.16.0 / 2021-05-15 + +* 1 major enhancement: + + * Added tentative 3.0 support. + +* 3 minor enhancements: + + * Added lexing for "beginless range" (bdots). + * Added parsing for bdots. + * Updated rake compare task to download xz files, bumped versions, etc + +* 4 bug fixes: + + * Bump rake dependency to >= 10, < 15. (presidentbeef) + * Bump sexp_processor dependency to 4.15.1+. (pravi) + * Fixed minor state mismatch at the end of parsing to make diffing a little cleaner. + * Fixed normalizer to deal with new bison token syntax + +=== 3.15.1 / 2021-01-10 + +* 1 bug fix: + + * Bumped ruby version to include < 4 (trunk). + +=== 3.15.0 / 2020-08-31 + +* 1 major enhancement: + + * Added tentative 2.7 support. + +* 1 minor enhancement: + + * Improved ruby_parse_extract_error's handling of moving slow files out. + +* 22 bug fixes: + + * Bumped ruby version to include 3.0 (trunk). + * Fix an error related to empty ensure bodies. (presidentbeef) + * Fix handling of bad magic encoding comment. + * Fixed SystemStackError when parsing a huoooge hash, caused by a splat arg. + * Fixed a number of errors parsing do blocks in strange edge cases. + * Fixed a string backslash lexing bug when the string is an invalid encoding. (nijikon, gmcgibbon) + * Fixed bug assigning line number to some arg nodes. + * Fixed bug concatinating string literals with differing encodings. + * Fixed bug lexing heredoc w/ nasty mix of \r\n and \n. + * Fixed bug lexing multiple codepoints in \u{0000 1111 2222} forms. + * Fixed bug setting line numbers in empty xstrings in some contexts. + * Fixed edge case on call w/ begin + do block as an arg. + * Fixed handling of UTF BOM. + * Fixed handling of lexer state across string interpolation braces. + * Fixed infinite loop when lexing backslash+cr+newline (aka dos-files) + * Fixed lambda + do block edge case. + * Fixed lexing of some ?\M... and ?\C... edge cases. + * Fixed more do/brace block edge case failures. + * Fixed parsing bug where splat was used in the middle of a list. + * Fixed parsing of interpolation in heredoc-like strings. (presidentbeef) + * Fixed parsing some esoteric edge cases in op_asgn. + * Fixed unicode processing in ident chars so now they better mix. + +=== 3.14.2 / 2020-02-06 + +* 1 minor enhancement: + + * Cleaned up call_args and removed arg_blk_pass from ruby_parser_extras.rb! Yay! + +=== 3.14.1 / 2019-10-29 + +* 1 minor enhancement: + + * Declared that ruby_parser supports ruby 2.2 and up. + +* 3 bug fixes: + + * Fixed a problem with %W with a null-byte terminator. (wtf?) (spohlenz) + * Fixed line numbering for command (eg methods without parentheses) arguments. (mvz) + * Fixed lineno on new dxstrs. (presidentbeef) + +=== 3.14.0 / 2019-09-24 + +* 8 minor enhancements: + + * Added Sexp#line_min & new line number debugging feature. + * Allow bin/ruby_parse to use RP_TIMEOUT to tweak default timeout for large files & slow debugging modes. + * Did you know that custom inspect can't be > 65 chars? 65! Me neither. Fixed. + * For now, value_expr == remove_begin. + * Improved error messages for unterminated regexps. + * Moved all STR_* consts into State::Values and made them State instances. + * Overhauled RubyLexer::State + Values to allow for completely separate groups of States. + * RubyParserExtras#remove_begin removes nested begins and patches line numbers. + +* 22 bug fixes: + + * Changed EOF signaling to return [false, false] per doco. + * Changed RubyParserStuff#remove_begin to keep inner line number, if any. (mvz) + * Differentiated between lambda call and stabby proc. Added :lambda sexp. (whitequark) + * Extended State#== to check equal? first as an optimization. + * Fixed a bug in tab indent width. + * Fixed a line numbering bug for assignables. + * Fixed a line numbering bug for defns w/ nil bodies. + * Fixed another missing line number, driven out by ruby_to_ruby bootstrap. + * Fixed dedenting squiggle heredocs if interpolation is in the mix. (mvz) + * Fixed differentiation of `{ |a| ... }` vs `{ |a,| ... }`. Fixes #236 (whitequark). + * Fixed lex_state for symbols. + * Fixed lex_state for tSTRING_END and tREGEXP_END. + * Fixed line numbers for BEGIN block. (mvz) + * Fixed op_asgn1 w/ command_call having array instead of arglist. (mvz) + * Fixed parsing of () in a command-call (eg p). + * Fixed remaining missing line numbers by forcing extra checks during test and blowing up. They may still be wrong (esp after heredocs, ugh), but they're there! Special thank you to mvz for pushing on this and providing tests and PRs. + * Fixed some lex_state versioning issues with closing braces/bracket on ruby<25. + * Keep carriage return escapes in heredocs. (mvz) + * Massive overhaul of line number code. + * More line number fixes and extra tests from mvz. Thank you! + * Parsing BEGIN block when not at top level should raise an error. (mvz) + * Removed irb task from Rakefile as it has been pushed up to Hoe and doubles up here. + +=== 3.13.1 / 2019-03-25 + +* 1 major enhancement: + + * Overhauled RubyLexer#lex_state to allow for multi-state value. + +* 5 minor enhancements: + + * Added RubyParser#current so scripts can poke around inside. + * Cleaned up and modernized bin/ruby_parse_extract_error. + * Removed RubyLexer#in_lex_state? in favor of State#=~ and #==. + * Renamed RubyLexer#in_arg_state? to is_after_operator?. + * Replaced all use of :expr_<*> symbols w/ bitfields. + +* 15 bug fixes: + + * Added tests to show #233 already fixed. + * Fixed a lexer state bug dealing with complex edge case in hash key w/ interpolated symbol and an array value. Not a great fix. (presidentbeef) + * Fixed a number of lex_state check problems. + * Fixed alias and undef keyword data. + * Fixed bug normalizing to utf-8 on tail of dstr (post-interpolation). (mvz) + * Fixed handling of hex chars for bare unicode escape. (mvz) + * Fixed handling of invalid string octals more gracefully. Needs generalization. + * Fixed lexing of regexps w/ backslashed unicode. I hope. + * Fixed parse_percent for EXPR_FITEM edge cases. Fixed bug #125. + * Fixed parsing of op_asgn on constants (eg ::X ||= 1). + * Fixed precedence of rescue modifier on assignments. (mvz/whitequark) + * Fixed some EXPR_FNAME edge cases. + * Fixed using unicode in gvars. Fixed bug 202. (331299) + * Handle invalid string literals more gracefully. + * Minor fix lexing %s[] + +=== 3.13.0 / 2019-03-12 + +* 3 major enhancements: + + * Removed 1.8 and 1.9 support. Moved to ruby_parser-legacy gem. + * Added tentative 2.6 support. + * Updated ruby_parser.yy to ruby 2.4 architecture. + +* 22 minor enhancements: + + * Added debug3 and cmp3 rake tasks that use the above tools. + * Added tLONELY to compare/normalize.rb + * Added tools/munge.rb, tools/ripper.rb, and debugging.md + * 2.6: Added trailing .. and ... support. + * Extended StackState to log more state changes, making debugging easier. + * Extended StackState#store to take an initial value. + * Improved logging / debugging in StackState. + * Improved normalization and parser compare tasks. + * Improved tools/munge.rb output. + * In f_arglist, track in_kwarg if no parens. + * In process_newline_or_comment, handle NL if in_kwarg there vs normal. + * Refactored normalized values to WORDLIST. + * Refactored parser: push up to relop and rel_expr. + * Removed Keyword.keyword18. + * Removed RubyLexer version attr_accessors. + * Removed long dead deprecations internal to RubyParserStuff. + * Removed version arg to RubyLexer#initialize (default nil + no-op). + * Renamed Keyword.keyword19 to Keyword.keyword. + * Renamed process_bracing to process_brace_close + * Renamed process_curly_brace to process_brace_open + * Report first parse error message if all parser versions fail, not last. + * Updated parser to track against 2.6. + +* 11 bug fixes: + + * Fix some shift/reduce errors. + * Fixed BEGIN blocks having different arg value that END blocks. (mvz) + * Fixed all reported unused non-terminals/rules. + * Fixed bug 272. + * Fixed bug in interpolated symbol lists. (strviola) + * Fixed bug where block shadow arguments were not registered as lvars. (akimd) + * Fixed bug where kwsplat args weren't treated as lvars. (mvz) + * Fixed lex_state and other internals in many cases. + * Fixed shebang in compare/normalize.rb to use env. Avoids rubygems freaking. + * Fixed some more internal state bugs. + * Fixed tRCURLY -> tSTRING_DEND for interpolation brace closes. + +=== 3.12.0 / 2018-12-04 + +* 3 minor enhancements: + + * 2.5: Allow rescue/ensure/else in normal do blocks. (presidentbeef) + * Added stabby proc with do/end as block call argument. (presidentbeef) + * Holy cow levels of optimization from presidentbeef. I write slow bad code. + +* 1 bug fix: + + * Improve handling of single-quoted symbols and labels. (mvz) + +=== 3.11.0 / 2018-02-14 + +* 1 major enhancement: + + * Expand to support ruby 2.5 parsing. + +* 3 bug fixes: + + * Fixed %r lexing when delimiter is also used in (?X) group. + * Restore newline after label to detect required kwarg. (presidentbeef) + * Return `s(:self)` target for `self[]` calls. (presidentbeef) + +=== 3.10.1 / 2017-07-21 + +* 2 bug fixes: + + * Fixed identification of parser version whether Ruby##Parser or Parser::V##. + * Fixed squiggly heredoc lexing when using 24 parser. + +=== 3.10.0 / 2017-07-17 + +* 4 minor enhancements: + + * Added support for 'squiggly heredocs' (indented content). (jjoos) + * Bumped oedipus_lex to ~> 2.5. + * Bumped sexp_processor to ~> 4.9. + * Made STRICT_SEXP=1 safe: converted indexed sexps to semantic calls where needed. + +* 5 bug fixes: + + * Clear and restore cmdarg stack around defs args and body. (presidentbeef) + * Conditionalize use of sexp_body= to make it compatible w/ sexp_processor 4.9.0 + * Fix up line numbers in strings with newlines and `#`. (presidentbeef) + * Fixed line numbers of resbodies. + * Fixed some tracking of lexical state. Fixes bug #249. + +=== 3.9.0 / 2017-04-13 + +* 1 major enhancement: + + * Added tentative ruby 2.4 support. Probably missing things. + +* 13 minor enhancements: + + * Added RubyParser.latest. + * Added RubyParser::Parser.version to make version range comparisons easier + * Changed superclasses of all parsers to RubyParser::Parser + * Cleaned up a lot of the version specific code to be more generic/flexible. + * Documented how to add new versions in README. + * Moved RubyParser from ruby_parser_extras.rb into ruby_parser.rb to fix bootstrap issues. + * Renamed RubyParserStuff#get_match_node to new_match. Aliased and deprecated. + * Renamed RubyParserStuff#logop to logical_op. Aliased and deprecated. + * Renamed RubyParserStuff#node_assign to new_assign. Aliased and deprecated. + * Renamed all parsers to RubyParser::V##. + * Revamped grammar preprocessing to make adding new versions easier. + * RubyParser.for_current_ruby falls back to latest if current not available. + * Subclasses of RubyParser::Parser register themselves into RubyParser::VERSIONS. + +* 4 bug fixes: + + * Fixed `&.` after newline. (presidentbeef) + * Fixed bug setting line number for hash literals to line of opening brace. + * Fixed grammar preprocessing bug. + * Properly handle kDO with no-parens stabby lambda. (presidentbeef) + +=== 3.8.4 / 2017-01-13 + +* 3 bug fixes: + + * Fix parsing if in LHS label position. (presidentbeef) + * Fixed parsing of anonymous keyword splat arg (eg f(**)). + * Fixed ruby 2.4+ deprecation warnings about using Fixnum. + +=== 3.8.3 / 2016-10-09 + +* 1 minor enhancement: + + * Support Ruby 2.1 number literals. (soutaro) + +* 3 bug fixes: + + * Fixed line numbers for strs with backslash-newlines. (maxjacobson) + * Improved compatibility on tokenizing number. (soutaro) + * Refactored and fixed multiline array line numbers. (ptoomey3, with changes) + +=== 3.8.2 / 2016-05-05 + +* 2 bug fixes: + + * Fixed lex_state in interpolated strings. (whitequark) + * Fixed safe operator for newline/semicolon contexts. (presidentbeef) + +=== 3.8.1 / 2016-02-19 + +* 1 bug fix: + + * Fixed problems with tLONELY in mlhs_node. + +=== 3.8.0 / 2016-02-18 + +* 1 major enhancement: + + * Added support for Ruby 2.3.0 and the &. operator. (presidentbeef) + +* 2 minor enhancements: + + * Add support for safe attr assign. (presidentbeef) + * Added support for safe call. (presidentbeef) + +* 1 bug fix: + + * Fixed parsing of { 'a': :b }. (presidentbeef) + +=== 3.7.3 / 2016-01-21 + +* 2 bug fixes: + + * Fixed parsing kwargs in defs with no parens. (presidentbeef) + * defs should have a nil node if body is empty. + +=== 3.7.2 / 2015-10-26 + +* 1 bug fix: + + * I hate regexen. Fixed a lexing bug confusing strings vs labels. (phiggins) + +=== 3.7.1 / 2015-08-06 + +* 1 minor enhancement: + + * Improved understandability of lexing postfix symbols. + +* 2 bug fixes: + + * Fixed timeout caused by regexp backtracking bug w/ long strings in 2.2 parser. (presidentbeef) + * Rename DEBUG env toggle to RB_LINENO_DEBUG. (tenderlove) + +=== 3.7.0 / 2015-05-28 + +* 2 major enhancements: + + * Added preliminary support for ruby 2.2 syntax. + * Now writing all 2.x parsers from one source, generating racc files. + +* 1 minor enhancement: + + * Added RubyLexer#process_label and hooked it up to "x": and 'x': productions. + +* 4 bug fixes: + + * Fixed handling of block_args to be consistent across all parse versions. + * Fixed lexing of label assoc args w/ newlines in between k/v. (jeremyf) + * Fixed lexing of x?'':y for ruby22 (not a label). (presidentbeef) + * clear and restore cmdarg stack around def args and body. + +=== 3.6.6 / 2015-04-13 + +* 1 minor enhancement: + + * Added expr_labelarg state (eg: a:1) + +* 5 bug fixes: + + * Fix scan logging backtrace when DEBUG=1 + * Fixed kwsplat on 2.0 & 2.1. + * Fixed mandatory keyword block args. (cvortmann) + * Handle #$<x> in expanded strings/regexps where x is NOT a valid gvar name. + * Invalid gvar names raise a compile error. + +=== 3.6.5 / 2015-03-12 + +* 1 minor enhancement: + + * Add line numbers from block comments =begin/=end. (presidentbeef) + +=== 3.6.4 / 2015-01-16 + +* 1 bug fix: + + * Removed shebangs in tests because of bugs (aka 'features') in RPM packaging tools. + +=== 3.6.3 / 2014-09-26 + +* 1 bug fix: + + * Fixed bug caused by latest version of oedipus_lex not exporting lineno accessor. + +=== 3.6.2 / 2014-07-18 + +* 1 bug fix: + + * Handle return/next/break/yield w/ block call (WHY). + +=== 3.6.1 / 2014-05-12 + +* 1 bug fix: + + * Strings that don't match the encoding of the file are now returned as ASCII-8BIT. + +=== 3.6.0 / 2014-04-23 + +* 1 minor enhancement: + + * Added new_string and switched all parsers to it. + +* 1 bug fix: + + * Fixed line numbers of nodes following multi-line strings. (presidentbeef) + +=== 3.5.0 / 2014-03-24 + +* 1 major enhancement: + + * Added initial support for ruby 2.1 syntax. Doesn't have numeric extensions yet. + +* 2 minor enhancements: + + * Converted ruby_lexer.rex to use new grouping mechanism. ~15% improvement in speed. + * Various lexer cleanup. + +* 2 bug fixes: + + * 2.0/2.1: Fixed block kw args. + * Fixed env for kwargs and friends. + +=== 3.4.1 / 2014-02-14 + +21 files failed to parse out of ~834k files makes this 99.9975% or 4.21σ. + +* 1 minor enhancement: + + * Added StackState#store and #restore. + +* 1 bug fix: + + * 1.8/1.9/2.0: Fixed tSTRING_DBEG w/ f'd up amounts of nesting + braces + do/end. yeah. I'm as confused as you are. + +=== 3.4.0 / 2014-02-04 + +31 files failed to parse out of ~834k files makes this 99.9963% or 4.12σ. + +* 1 major enhancement: + + * Replaced hand-written/optimized f'd-up lexer with an oedipus_lex + generated lexer. This makes it roughly 40-50% faster. + +* 30 minor enhancements: + + * 2.0: Added support for a.b c() do d end.e do |f| g end + * 2.0: Added support for a.b c() do d end.e f do |g| h end + * Added -s flag to ruby_parse_extract_error to output timings. + * Added RubyLexer #command_state and #last_state to deal with oedipus_lex differences. + * Added String#lineno and #lineno= because I'm a bad bad person. + * Added a bunch of RubyLexer scanning methods: beginning_of_line?, check, scan, etc. + * Added a bunch of process_* methods extracted from old yylex. process_amper, etc. + * Added lib/.document to save my laptop's battery from pain and suffering + * Adjust lineno when we lex a bunch of blank lines. + * Attach lineno to tIDENTIFIER values (strings, ugh) + * Cleaned up and re-ordered node_assign to be faster (ordered by actual occurrance). + * Extend RubyParserStuff#gettable to set the lineno if it comes in with the id. + * Extended RubyParserStuff#new_case to take line number. + * Finally dropped RPStringScanner's BS #current_line. + * Finally dropped RPStringScanner's BS line number calculation (lineno). + * Implemented Sexp#add_all since we now have a test case for it. + * Removed :call case of node_assign. I don't think it is possible. + * Removed RubyLexer #extra_lines_added. No longer used. Complex heredoc lineno's possible screwed up. + * Removed RubyLexer#parse_number. Handled by oedipus_lex. + * Removed RubyLexer#yacc_value now that next_token returns pairs. + * Removed RubyLexer's @src. Now taken care of by oedipus_lex. + * Removed RubyParser#advance. RubyParser#next_token takes care of everything now. + * Removed RubyParserExtras#arg_add. (presidentbeef! YAY!) + * Removed lib/gauntlet_rubyparser.rb. I just don't use it anymore. Too slow. + * RubyLexer#is_label_possible? doesn't need an arg + * RubyLexer#process_token is now a normal oedipal lexer method. + * RubyParser#next_token now expects RubyLexer#next_token to return a pair (type, val). + * TRYING a new scheme to figure out encodings... but I'm about to throw in the towel. I hate this stuff so much. + * Turned off oedipus_lex's automatic line counting. (pushing to oedipus_lex soon). + * Updated to oedipus_lex 2.1+. + +* 7 bug fixes: + + * 1.8: Properly parse `a (:b, :c, :d => :e)`. (presidentbeef) + * Fixed lexing symbol!= vs symbol!. Please use your spacebar. Think of the children. + * Fixed line for dstr spanning multiple lines via backslash. (presidentbeef) + * Fixed line numbers for odd cases with trailing whitespace. (presidentbeef) + * Fixed line numbers on ambiguous calls w/ gvar/ivar args. (presidentbeef) + * Max out unicode hex values to 2-4 or 2-6 chars or pack will overflow and puke. + * Removed ESC_RE from RubyLexer. Must have slipped through. + +=== 3.3.0 / 2014-01-14 + +* Notes: + +39 files failed to parse out of ~834k files makes this 99.9953% or 4.07σ. + +* 15 minor enhancements: + + * 2.0: Parse kwarg as lvars. (chastell) + * Added RubyLexer#beginning_of_line?, check(re), end_of_stream? + * Added RubyLexer#process_token_keyword. + * Added RubyLexer#scan, #matched, #beginning_of_line? and others to decouple from internals. + * Added lexing of \u### and \u{###}." + * Added optimizations for simple quoted symbols. + * Aliased Lexer#src to ss (since that is what it is). + * Allow for 20 in parser class name. + * Modified parsers line number calculations for defn nodes. + * Removed Env#dynamic, #dynamic?, #use, #used? + * Removed RubyLexer#tern. Introduced and disused during 3.0 alpha. (whitequark) + * Removed unused RubyLexer#warnings. + * Renamed *_RE consts to just * (IDENT_CHAR, ESC, etc). + * new_defn now sets arg node line number directly. + * zero byte is allowed in symbols for 1.9 / 2.0. + +* 11 bug fixes: + + * 2.0: Fixed paren-less kwargs in defn. + * Don't bother with regexp encoding options on 1.9+ to avoid warnings. + * Fix constant re-build on ruby 2.0 + rake 10. + * Fix lexing of %i with extra whitespace. (flori) + * Fixed RubyParserStuff#new_body to deal with nonsensical code better (begin-empty+else). (snatchev) + * Fixed bug lexing h[k]=begin ... end. Use your space bars people! + * Fixed env scoping in new lambdas. + * Fixed handling of single array arg in attrasgn. + * Fixed test to call RubyLexer#reset between assertions. + * No longer assigning ivar/cvars to env. Only locals should be in env. + * Refactored initialize and reset to more properly re-initialize as needed. + +=== 3.2.2 / 2013-07-11 + +* 5 bug fixes: + + * 1.9/2.0: fixed assocs in return args. (presidentbeef) + * Fixed handling of parse error when class is nested in multiple defs. (whitequark) + * Fixed lexing of %w[] w/ funny whitespace separators. (whitequark) + * Fixed more call nodes that have trailing comma syntax. (presidentbeef) + * Fixed more call_args slippage. + +=== 3.2.1 / 2013-07-03 + +* 1 bug fix: + + * 1.9/2.0: Trailing assocs were being munged into arrays. (presidentbeef) + +=== 3.2.0 / 2013-07-02 + +* 1 major enhancement: + + * Added (rough draft) 2.0 support. Still missing some small / rare things. + +* 12 minor enhancements: + + * Added %i(symbol-names...) support. (%I too) + * Added 140 more tests, jumping test count from 1376 to 2143. Yay for test reuse! + * Added RubyLexer#brace_nest. + * Added compare20 rake task to diff the grammar architecture against MRI. + * Added lpar_beg and paren_nest to lexer to track state of parens in stabbies + * Added shadow nodes for scoped block args. + * Compound RubyParser now defaults to 2.0. + * Fixed rake to < 10, because 10's file dependency handling is so very broken. + * Made it possible to specify version in bin/ruby_parse_extract_error w/ -v 18|19|20 + * Refactored to RubyParserStuff::ENCODING_ORDER to allow custom tweaking of encoding guessing. (samlown) + * Switched `rake debug` to default to 2.0. + * Translated some fixes across 1.8 and 1.9 from 2.0. + +* 42 bug fixes: + + * 2.0: Fixed a number of block args scenarios w/ kwargs + * 2.0: Fixed args_tail mismatching against lexer. + * 2.0: Fixed assocs to return a hash node. + * 2.0: Fixed f_block_kw production. + * 2.0: Fixed f_block_kwarg production. + * 2.0: Fixed handling of stabby proc args in parens. + * 2.0: Fixed lexing of kwsplat nodes. + * 2.0: Implemented kwsplat nodes. + * Added tUBANG to lexer. + * Apparently ruby doesn't warn for escaped octal that goes above 7. wtf. + * Cleaned up a LOT of arg handling (block and defn, not calls) by using #args. + * ESC_RE is set to unicode. This seems problematic. *shrug* + * Either found a bug in MRI and/or fixed paren_nest count for []=? methods. + * Extended IDENT_CHAR_RE on 1.9+ to top out at \u{10ffff}... because we NEED a million unicode chars. + * Fixed % strings with interpolation. + * Fixed BEGIN {} to return a sexp. + * Fixed a[] += b. (stormbrew) + * Fixed arg_blk_pass to allow for sub-args nodes. + * Fixed assignable to allow for sexps to be passed to it. + * Fixed assoc args in 1.9. + * Fixed block_command and block_call (eg a.b c d) to #to_sym their args properly. + * Fixed bug in compound RubyParser so it rescues RubyParser::SyntaxError. + * Fixed env registration of cdecls. + * Fixed lex value for { when expr_endfn. + * Fixed lex_state for close paren/brace/bracket. + * Fixed lex_state transition for 1.9 if we lexed a defn name. Only 1.8 is odd. + * Fixed lexer problem with state mgmt of identifiers that also have registered var name. + * Fixed lexing of "1 *\n" to have the correct lex_state. + * Fixed lexing of heredocs vs chevron for some lex_states. + * Fixed op_asgn nodes to #to_sym their args properly. + * Fixed optional value block args. + * Fixed parsing of __ENCODING__ on ruby 1.8 (vcall). + * Fixed some oddity where 1.9 lexing was blowing up on "0o". Seems invalid now. + * Fixed strings with escaped octals > 128. Also... wtf. + * Fixed support for empty symbol (wtf?). + * Lexer is now declared UTF-8 internally. Hopefully this will fix the encoding mess. + * Made UTF_8 the default guess on encodings when it isn't explicit. + * Parsing of __ENCODING__ on ruby 1.9+ (in ruby 1.9+) is now colon2 sexp. (whitequark) + * Renamed RubyLexer#nest to string_nest + * RubyLexer#unescape ignores bad octal/hex and returns unicode strings. + * Switched a number of lexical constructs to use IDENT_CHAR_RE instead of \w. I wish there were something cleaner for regexps + unicode. + * Switched ruby_parse_extract_error to use binread. + +=== 3.1.3 / 2013-04-09 + +* 2 bug fixes: + + * Fixed begin w/ else but no rescue. (whitequark) + * Removed literal stripping from block_append. Not its job. + +=== 3.1.2 / 2013-03-18 + +* 1 minor enhancement: + + * OMG A SECURITY ISSUE FOR CODE NOBODY USES... EVER + +=== 3.1.1 / 2012-12-19 + +* 1 minor enhancement: + + * Added MOVE_TIMEOUT env var for ruby_parse_extract_error to move slow files to a sibling directory + +* 4 bug fixes: + + * 1.9: Fixed lexing of "0o". (whitequark) + * 1.9: Fixed parsing of unary plus on literals. (whitequark) + * Added timeout arg to RubyParser#process to pass through to the real parser + * Updated Synopsis to reflect new options for running RP. (louismullie) + +=== 3.1.0 / 2012-12-06 + +* 2 minor enhancements: + + * Added RubyParser.for_current_ruby to provide a parser that matches your runtime. (neilconway) + * Duck-typed IDENT_CHAR_RE instead of using RUBY_VERSION + +* 3 bug fixes: + + * Cleared out body comments in class/module/defn/defs + * Flipped lexer tests to US-ASCII to avoid encoding hell + * yyerror is now an alias for syntax_error + +=== 3.0.4 / 2012-11-26 + +* 1 bug fix: + + * RPStringScanner#lineno was still using byte offset, not char offset. (brynary) + +=== 3.0.3 / 2012-11-23 + +* 1 minor enhancement: + + * Improved error output on invalid char in expression. + +* 1 bug fix: + + * Fixed lexing of no-name ivars. (whitequark) + +=== 3.0.2 / 2012-11-21 + +52 down makes 99.9767% or 3.7σ. 130 files failed to parse out of 558k. + +* 4 minor enhancements: + + * Added RP_TIMEOUT env var to override default timeout of 10 seconds. + * Minor optimization to RubyLexer#parse_number + * Only output parseerror output to stderr if $DEBUG. + * ruby_parse_extract_error modified to include 'it' blocks in its search. + +* 7 bug fixes: + + * 1.9: Fixed args in dot-call forms (eg f.(...)). + * 1.9: Fixed lexing stabby lambda w/ do/end + * Deal better with DOS files. Ugh. + * Fix line number of production after heredoc. + * Fixed RubyParser#process to reuse parser instances across calls. + * Fixed line numbers for several productions. + * new_call sets line number to smallest line number of members. + +=== 3.0.1 / 2012-11-02 + +* 2 bug fixes -- both based on MRI bugs... Yay?: + + * 1.9.2 doesn't have String#byteslice... so I have to do the *HORRIBLE*. + * Lexing regexps w/ bad character encodings and no declared options will fall back to /.../n. + +=== 3.0.0 / 2012-11-02 + +I've hit 99.967% success rate against 558k files! 3.6σ!! 182 files +failed to parse and spot checking them shows that they're pretty much +lost causes. I'm sure I missed some stuff, but it is more important at +this point to release a version to get more people using it in more +diverse ways than I can come up with. + +* 3 minor enhancements: + + * Added RBStringScanner#charpos using #string_to_pos. + * Added RBStringScanner#string_to_pos using String#byteslice. + * Optimized regexp used for escape chars in strings. (presidentbeef) + +* 3 bug fixes: + + * Fixed current_line and unread_many depending on StringScanner#pos + * Fixed parsing of 'a[] = b' + * Fixed the worst abuse of heredocs EVER. Just because it is valid doesn't mean you should. + +=== 3.0.0.a10 / 2012-10-26 + +* 1 major enhancement: + + * iter nodes are now structurally the same as defs. Block args are COMPLETELY different. + +* 4 minor enhancements: + + * 1.8 and 1.9 now treat f { |(...)| } differently, per MRI. + * 1.9: Added __ENCODING__ support. (witlessbird) + * 1.9: Finished coverage for masgn variants in block args + * 1.9: covered all forms of block args: optional, splat, block, and destructuring + +=== 3.0.0.a9 / 2012-10-22 + +Holy crap! I've hit a 99.92% success rate against 558k files! 492 +failed parses to go. NOW is the time to start testing ruby_parser +against your code! + +* 16 minor enhancements: + + * 1.9 parser: Finished magic encoding and utf-8 bom support. + * 1.9: Added leading dot support eg "a\n.b". + * 1.9: Added partial handling for *arg and opt=val args in block args. + * 1.9: OMFG Encoding is the worst thing ever. Overhauled encoding support once again. It is much better at doing last ditch guessing of the encoding of the source file. + * 1.9: added String#grep for legacy support. + * Added Sexp#block_pass? + * Added ability to delete slow files when they timeout. + * Added block_dup_check and refactored grammar code to use it for block arg handling. + * Added in_lex_state?(*states) to clean up lexer code. + * Added tentative support for optional block args. THIS IS SUBJECT TO CHANGE!! + * Added toggleable debugging to StackState to make my life easier + * All untested uses have not moved but have been laced with poison. + * Finally got good tests for most forms of double-block arg errors. + * Moved all _known_ uses of SyntaxError to RubyParser::SyntaxError + * f_block_optarg now always returns a block node. + * ruby_parse_extract_error uses Find.find instead of globbing so dot files aren't missed. + +* 12 bug fixes: + + * 1.9: Completely ignore IndexError in unread_many because... you know... it sucks. + * 1.9: Fixed lex state after lexing ? in trinary. + * 1.9: Fixed lex state in some ternarys. + * 1.9: Fixed parsing of "1 ? b('') : 2\na d: 3"... ARE YOU NOT GLAD?!?! + * Fix Timeout differences between 1.8 and 1.9 :( + * Fixed emacs-style encodings to deal with no whitespace. + * Fixed error message for bad % codes. (whitequark) + * Fixed lexing of :a==>b vs :a===b vs :a==>b. P.S. Your space bar is broken. chump. + * Fixed lexing of rare numeric formats. + * Fixed magic comment encodings on DOS files ... :/ + * Fixed ruby_parse_extract_error to exit non-zero on errors. + * Removed Symbol#is_argument and switch usage to is_arg? + +=== 3.0.0.a8 / 2012-09-26 + +* 1 bug fix: + + * Remove method #d from global namespace. (alexch) + +=== 3.0.0.a7 / 2012-09-21 + +* 3 minor enhancements: + + * Reorganized ruby_parse_extract_error so it will start much faster with a bunch of glob directories + * RubyParserStuff#process takes optional time arg and raises Timeout::Error if it goes too long. You should rescue that, ya know... + * ruby_parse_extract_error now checks *.rake and Rakefile on dir scan. + +* 3 bug fixes: + + * 1.9: Fixed ternary state tracking so {a:f{f()},b:nil} won't trip up the lexer. + * Fixed optional values in block args (no20/no21) + * ruby_parse_extract_error skips non-files. Some asshats put .rb on their dirs. :( + +=== 3.0.0.a6 / 2012-08-20 + +* 2 minor enhancements: + + * 1.8: Added basic encoding support to 1.8 parser. Assumes -Ku. + * 1.9: Added encoding magic comment support to 1.9 parser. + +* 8 bug fixes: + + * 1.9: Fixed lexing of -1 w/in conditionals. yeah... I dunno. + * 1.9: Fixed parsing of a do | | end. + * 1.9: Fixed parsing of not(x). + * 1.9: Fixed parsing of op_asgn + rescue: 'a ||= b rescue nil' + * 1.9: added \r to the EOL backslash handler. dos files blow + * 1.9: hacked in a workaround for 1.9 specific regexps running in 1.8. + * Added #reset to RubyParser proxy class + * Fixed lexing of conditional w/ %() tokens + +=== 3.0.0.a5 / 2012-07-31 + +* 5 bug fixes: + + * 1.9: Fix construction of 'f(:x, y: nil,)' w/ trailing comma. + * 1.9: cleaned up lexing exit lex_state handling. Fixes bug parsing 'if f :x; end' + * 1.9: fixed building of right-leaning masgns: 'f { |a, (b, c)| }' + * 1.9: fixed lexing 'when *splat' + * 1.9: fixed lexing of regexps in whens + +=== 3.0.0.a4 / 2012-07-26 + +* 10 minor enhancements: + + * 'rake debug' defaults to 1.9 parser since that's all I'm doing these days + * 1.9: Fixed f { |(a, b, ...), ...| ... } handling. + * Added 'rake extract F=path' task to quickly extract errors from large files + * Added on_error handler to provide more readable error message. + * Aliased #process to #parse. + * Renamed #parse to #process (legacy name), added default path of '(string)' + * cleaned ruby_parse_extract_error output and fixed to 1.9 parser + * ruby_parse_extract_error expands shell globs from ARGV + * ruby_parse_extract_error should also capture RuntimeError + * yyerror(msg) now warns with the message instead of ignoring it. + +* 3 bug fixes: + + * 1.9: Fixed bug lexing/parsing [ in rhs. + * 1.9: Fixed f { |((a, b), c)| ... } handling + * 1.9: fixed newline handling during expr_value + +=== 3.0.0.a3 / 2012-07-03 + +* 1 major enhancement: + + * OMG! Implemented all the 1.9 arg crap and I went from 500 lines of + structural diff to 32! + +* 17 minor enhancements: + + * 1.9: !(...) is now a method call. ugh + * 1.9: Added __ENCODING__ keyword (returns Unsupported atm). + * 1.9: Added support for "a.()" thingy. whatever you call it. Have I ever mentioned that ruby has too much syntax? I mean really... + * 1.9: Moved kRETURN/kBREAK/kNEXT from command_call to command + * 1.9: Removed when_args and refactored into args production. + * 1.9: Support for not/! being a call to #!. why matz? why?!? + * 1.9: Support for trailing comma support in opt call args. + * 1.9: Switched keyword support to deal with 1.8 vs 1.9 differences. + * 1.9: refactored and created command_asgn + * 1.9: removed case/else from primary + * 1.9: reworked mlhs and family. Now horrible things like 'a, *, c = f' work + * 1.9: reworked top level rules from program to expr. Lots of lame refactorings in mri. + * Moved 'a[]' from primary down to method_call + * Removed 'args trailer' production from assoc_list (eg {1, 2}). + * Removed 1.9 support for : as a terminator in do/then + * RubyParser no longer subclasses the 18 parser, so I had to change some consts around. + * Undeprecated RubyParser - but now it is a compound parser that tries 1.9 first. + +* 3 bug fixes: + + * 1.9: fixed bang method name. + * Fixed case/when/splat handling on both 1.8 and 1.9. + * Removed lambda_body production from lambda + +=== 3.0.0.a2 / 2012-06-19 + +* 1 minor enhancement: + + * Updated to sexp_processor ~> 4.0 + +* 1 bug fix: + + * Fixed new_module to remove scope/block. Not enough tests on module variance. + +* 1 known issue: + + * No parsing of "a.()" thingy. (reported by julian7) (patches welcome!) + +=== 3.0.0.a1 / 2012-05-22 + +This is the first alpha release of the 3.0.0 series. It is probably +woefully incomplete, bug ridden, and hasn't showered in several days. +Please please please beat the crap out of it and send +bugs/patches/complaints/suggestions. + +* 5 major enhancements: + + * 1.9 parsing! Thanks to EVERYONE for submitting patches for this! + * Removed :arglist from everything but :op_asgn1 + * Removed :block from resbody + * Removed :block from when + * Removed :block nodes inside of scope nodes (defn/defs/class/sclass). + * Removed :scope nodes in defn/defs/class/sclass nodes. + * (probably more sexp cleanup to come before 3.0.0 final) + +* 25 minor enhancements: + + * 1.9: Fix \!a. (wanabe) + * 1.9: Method calling with postargs. (wanabe) + * 1.9: Method definition with postargs. (wanabe) + * 1.9: Support lambda args without parentheses. (wanabe) + * Added R arg to `rake debug` to debug ruby straight up + * Added RubyParser, subclassing Ruby18Parser but warning on instantiation. + * Added backref_assign_error (needs tests) + * Added bin/ruby_parse_extract_error to help with error submissions + * Added debug task to help quickly get into a bug + * Added more 18 vs 19 lexing tests for ?c. + * Added ruby_parser.rb that pulls everything together in proper order. + * Added tLABEL. (brynary) + * Branched ruby_parser.y to ruby18_parser.y + * Fix to pass test_lambda_args_block__19 test. (mrmargolis) + * Got rid of one instance of unread_many. (Confusion) + * Moved everything from RubyParser to RubyParserStuff and included module in both. + * Refactored 1.9 args handling + * Refactored and added new_resbody to ruby_parser_extras. + * Refactored and added new_when + * Refactored tests infrastructure and added both 1.8 and 1.9 test branches. + * Removed unused methods: unread, begin_of_line? was_begin_of_line. (YAY!) (Confusion) + * Renamed ruby_parser.y to ruby19_parser.y + * RubyLexer now takes a version specifier. + * Started doing comparative refactoring between MRI's 1.9 parser and RP's. Shouldn't differ functionally except where we missed stuff in RP. + * `rake debug` prints the output if it succeeds. + +* 21 bug fixes: + + * Added missing gvar arg error. (1.8) + * Attach parser files to isolate to ensure they can build + * Conditionalize handling of tLABEL to ruby19+. Fixes issue #33. + * DOH. I deactivated some tests and never reactivated them. (Confusion ftw) + * Duplicate the input so that heredoc processing doesn't morph original. (banister) + * Entirely reworked block arg handling. (1.8) + * Fix ?x char literal. (nobu) + * Fixed 4/5 of literal lambda tests (jamie) + * Fixed deps for parser + * Fixed lexing of ?c for ruby 1.8 and 1.9. + * Fixed more Ruby 1.9 args tests (brynary) + * Fixed reswords to match MRI (1.8, 1.9) + * Fixed symbols with no spaces in method calls (e.g. foo:bar) (YAY! brynary) + * Fixed ternary_nil_no_space and other ternary edge cases for 1.9. (lastobelus) + * Fixed test_call_not_equal__19. First bug bounty! (albus522) + * Made lambda w/o arg list zero out the arg slot. + * Renamed awords to qwords to match stupid MRI naming. (1.8, 1.9) :( + * Rolled out brynary's symbols-no-spaces (foo:bar) changes when parsing 1.8 code + * Split 1.8 from 1.9 open paren lexer. Gawd that's ugly code. + * Split block_var from for_var. (1.8, 1.9) + * Use binread (and emulate in ruby 1.8) to avoid encoding issues + +=== 2.3.1 / 2011-09-21 + +* 2 bug fixes: + + * Fixed line numbers at end of special var+whitespace (larsch) + * Holy crap I was smokin' something good... Fixed 1.9.3 warning + +=== 2.3.0 / 2011-09-06 + +* 2 minor enhancements: + + * Add -g flag to parser compile if DEBUG + * Lexer now embeds line number in yacc_value for keywords, helping fix up line numbers + +* 3 bug fixes: + + * Fix method line numbers when no args and no parens (quix) + * Fixed line numbers on return/break/next w/ result expr. (pjnz) + * Fixed some lexing state in order to parse: 'f (1), 2' as 'f(1, 2)'. (invernizzi) + +=== 2.2.0 / 2011-08-23 + +* 2 minor enhancements: + + * Moved Keyword, Environment, and StackState inside of RubyParser + * Added proper dsym and dsym->sym support. + +* 3 bug fixes: + + * Added extra (failing) tests for call/iter line number checking (quix) + * Fixed line numbers for certain call/iter edge cases + * Fixed parsing of: alias :"<<" :">>". + +=== 2.1.0 / 2011-08-15 + +* 2 minor enhancements: + + * Added new accessor canonicalize_conditions to toggle conditional canonicalization (on by default). (confused) + * Awesome cleanup: Replaced call to append_block by block_append. (Confusion) + +* 2 bug fixes: + + * Fixed handling last line of =begin/=end. (raybaxter) + * Fixed source line numbers after heredocs. (jbarreneche) + +=== 2.0.6 / 2011-02-18 + +* 1 minor enhancement: + + * Switched to hoe's racc plugin to clean up rakefile and builds + +* 1 bug fix: + + * Fixed empty =begin/end. + +=== 2.0.5 / 2010-09-01 + +* 1 minor enhancement: + + * Started merging like lexical cases to try to squeeze some optimization out + +=== 2.0.4 / 2009-08-18 + +* 1 minor enhancement: + + * Changed requires around to be more accurate. + +* 4 bug fixes: + + * Fixed .autotest for minitest + * Fixed emacs escape lexing bug: "\C-\\" (maglev/gemstone) + * Fixed octal lexing edgecases. (maglev/gemstone) + * Fixed regexp lexing edgecases. (maglev/gemstone) + +=== 2.0.3 / 2009-06-23 + +* 4 minor enhancements: + + * Removed dead code handling d/regex match node cruft. + * Switched to minitest + * Updated .autotest and rakefile wrt rcov for new hoe capabilities + * Updated hoe for new capabilities + +* 4 bug fixes: + + * Environment#all now deals with strange edge cases in RAD. + * Fixed packaging/compilation issue. + * Minor 1.9 fixes + * hoe -> flay -> rubyparser rakefile circularity fixed + +=== 2.0.2 / 2009-01-20 + +* 2 minor enhancements: + + * Added gauntlet_rubyparser plugin. YAY for easy massive bug-hunting. + * Promoted Sexp's file/line/comments to sexp_processor. + +* 4 bug fixes: + + * Fixed and improved the readme + * Fixed lexing heredoc newlines. + * Fixed line numbers on defns. + * Fixed rdoc generation bug pointed out by hugh sasse (who rocks) + +=== 2.0.1 / 2008-11-04 + +* 2 minor enhancements: + + * Updated for changes to splat node in many contexts. + * Made PT a developer dep + +=== 2.0.0 / 2008-10-22 + +* 1 major enhancement + + * Brought on the AWESOME! 4x faster! no known lexing/parsing bugs! + +* 71 minor enhancements + + * 1.9: Added Fixnum#ord. + * 1.9: Added missing Regexp constants and did it so it'd work on 1.9. + * Added #store_comment and #comments + * Added StringScanner #begin_of_line? + * Added a bunch of tests for regexp escape chars, #parse_string, #read_escape, ? numbers, ? whitespace. + * Added a hack for rubinius' r2l eval bug. + * Added a new token type tSTRING that bypasses tSTRING_BEG/END entirely. Only does non-interpolated strings and then falls back to the old way. MUCH cleaner tho. + * Added bin/ruby_parse + * Added compare rule to Rakefile. + * Added coverage files/dirs to clean rule. + * Added file and line numbers to all sexp nodes. Column/ranges to come. + * Added lex_state change for lvars at the end of yylex. + * Added lexed comments to defn/defs/class/module nodes. + * Added stats gathering for yylex. Reordered yylex for avg data + * Added tSYMBOL token type and parser rule to speed up symbol lexing. + * Added tally output for getch, unread, and unread_many. + * Added tests for ambigous uminus/uplus, backtick in cmdarg, square and curly brackets, numeric gvars, eos edge cases, string quoting %<> and %%%. + * All cases throughout yylex now return directly if they match, no passthroughs. + * All lexer cases now slurp entire token in one swoop. + * All zarrays are now just empty arrays. + * Changed s(:block_arg, :blah) to :"&blah" in args sexp. + * Cleaned up lexer error handling. Now just raises all over. + * Cleaned up read_escape and regx_options + * Cleaned up tokadd_string (for some definition of cleaned). + * Converted single quoted strings to new tSTRING token type. + * Coverage is currently 94.4% on lexer. + * Done what I can to clean up heredoc lexing... still sucks. + * Flattened resbodies in rescue node. Fixed .autotest file. + * Folded lex_keywords back in now that it screams. + * Found very last instanceof ILiteralNode in the code. haha! + * Got the tests subclassing PTTC and cleaned up a lot. YAY + * Handle yield(*ary) properly + * MASSIVELY cleaned out =begin/=end comment processor. + * Massive overhaul on Keyword class. All hail the mighty Hash! + * Massively cleaned up ident= edge cases and fixed a stupid bug from jruby. + * Merged @/@@ scanner together, going to try to do the same everywhere. + * Refactored fix_arg_lex_state, common across the lexer. + * Refactored new_fcall into new_call. + * Refactored some code to get better profile numbers. + * Refactored some more #fix_arg_lex_state. + * Refactored tail of yylex into its own method. + * Removed Module#kill + * Removed Token, replaced with Sexp. + * Removed all parse_number and parse_quote tests. + * Removed argspush, argscat. YAY! + * Removed as many token_buffer.split(//)'s as possible. 1 to go. + * Removed begins from compstmts + * Removed buffer arg for tokadd_string. + * Removed crufty (?) solo '@' token... wtf was that anyhow? + * Removed most jruby/stringio cruft from StringScanner. + * Removed one unread_many... 2 to go. They're harder. + * Removed store_comment, now done directly. + * Removed token_buffer. Now I just use token ivar. + * Removed use of s() from lexer. Changed the way line numbers are gathered. + * Renamed *qwords to *awords. + * Renamed StringScanner to RPStringScanner (a subclass) to fix namespace trashing. + * Renamed parse to process and aliased to parse. + * Renamed token_buffer to string_buffer since that arcane shit still needs it. + * Resolved the rest of the lexing issues I brought up w/ ruby-core. + * Revamped tokadd_escape. + * Rewrote Keyword and KWtable. + * Rewrote RubyLexer using StringScanner. + * Rewrote tokadd_escape. 79 lines down to 21. + * Split out lib/ruby_parser_extras.rb so lexer is standalone. + * Started to clean up the parser and make it as skinny as possible + * Stripped out as much code as possible. + * Stripped yylex of some dead code. + * Switched from StringIO to StringScanner. + * Updated rakefile for new hoe. + * Uses pure ruby racc if ENV['PURE_RUBY'], otherwise use c. + * Wrote a ton of lexer tests. Coverage is as close to 100% as possible. + * Wrote args to clean up the big nasty args processing grammar section. + * lex_strterm is now a plain array, removed RubyLexer#s(...). + * yield and super now flatten args. + +* 21 bug fixes: + + * I'm sure this list is missing a lot: + * Fixed 2 bugs both involving attrasgn (and ilk) esp when lhs is an array. + * Fixed a bug in the lexer for strings with single digit hex escapes. + * Fixed a bug parsing: a (args) { expr }... the space caused a different route to be followed and all hell broke loose. + * Fixed a bug with x\n=beginvar not putting begin back. + * Fixed attrasgn to have arglists, not arrays. + * Fixed bug in defn/defs with block fixing. + * Fixed class/module's name slot if colon2/3. + * Fixed dstr with empty interpolation body. + * Fixed for 1.9 string/char changes. + * Fixed lexer BS wrt determining token type of words. + * Fixed lexer BS wrt pass through values and lexing words. SO STUPID. + * Fixed lexing of floats. + * Fixed lexing of identifiers followed by equals. I hope. + * Fixed masgn with splat on lhs + * Fixed new_super to deal with block_pass correctly. + * Fixed parser's treatment of :colon2 and :colon3. + * Fixed regexp scanning of escaped numbers, ANY number is valid, not just octs. + * Fixed string scanning of escaped octs, allowing 1-3 chars. + * Fixed unescape for \n + * Fixed: omg this is stupid. '()' was returning bare nil + * Fixed: remove_begin now goes to the end, not sure why it didn't before. + +=== 1.0.0 / 2007-12-20 + +* 1 major enhancement + * Birthday! + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/Manifest.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/Manifest.txt new file mode 100644 index 000000000..99a15bcfb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/Manifest.txt @@ -0,0 +1,48 @@ +.autotest +History.rdoc +Manifest.txt +README.rdoc +Rakefile +bin/ruby_parse +bin/ruby_parse_extract_error +compare/normalize.rb +debugging.md +gauntlet.md +lib/.document +lib/rp_extensions.rb +lib/rp_stringscanner.rb +lib/ruby20_parser.rb +lib/ruby20_parser.y +lib/ruby21_parser.rb +lib/ruby21_parser.y +lib/ruby22_parser.rb +lib/ruby22_parser.y +lib/ruby23_parser.rb +lib/ruby23_parser.y +lib/ruby24_parser.rb +lib/ruby24_parser.y +lib/ruby25_parser.rb +lib/ruby25_parser.y +lib/ruby26_parser.rb +lib/ruby26_parser.y +lib/ruby27_parser.rb +lib/ruby27_parser.y +lib/ruby30_parser.rb +lib/ruby30_parser.y +lib/ruby31_parser.rb +lib/ruby31_parser.y +lib/ruby32_parser.rb +lib/ruby32_parser.y +lib/ruby3_parser.yy +lib/ruby_lexer.rb +lib/ruby_lexer.rex +lib/ruby_lexer.rex.rb +lib/ruby_lexer_strings.rb +lib/ruby_parser.rb +lib/ruby_parser.yy +lib/ruby_parser_extras.rb +test/test_ruby_lexer.rb +test/test_ruby_parser.rb +test/test_ruby_parser_extras.rb +tools/munge.rb +tools/ripper.rb diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/README.rdoc b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/README.rdoc new file mode 100644 index 000000000..649e4e4c2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/README.rdoc @@ -0,0 +1,113 @@ += ruby_parser + +home :: https://github.com/seattlerb/ruby_parser +bugs :: https://github.com/seattlerb/ruby_parser/issues +rdoc :: http://docs.seattlerb.org/ruby_parser + +== DESCRIPTION: + +ruby_parser (RP) is a ruby parser written in pure ruby (utilizing +racc--which does by default use a C extension). It outputs +s-expressions which can be manipulated and converted back to ruby via +the ruby2ruby gem. + +As an example: + + def conditional1 arg1 + return 1 if arg1 == 0 + return 0 + end + +becomes: + + s(:defn, :conditional1, s(:args, :arg1), + s(:if, + s(:call, s(:lvar, :arg1), :==, s(:lit, 0)), + s(:return, s(:lit, 1)), + nil), + s(:return, s(:lit, 0))) + +Tested against 801,039 files from the latest of all rubygems (as of 2013-05): + +* 1.8 parser is at 99.9739% accuracy, 3.651 sigma +* 1.9 parser is at 99.9940% accuracy, 4.013 sigma +* 2.0 parser is at 99.9939% accuracy, 4.008 sigma +* 2.6 parser is at 99.9972% accuracy, 4.191 sigma +* 3.0 parser has a 100% parse rate. + * Tested against 2,672,412 unique ruby files across 167k gems. + * As do all the others now, basically. + +== FEATURES/PROBLEMS: + +* Pure ruby, no compiles. +* Includes preceding comment data for defn/defs/class/module nodes! +* Incredibly simple interface. +* Output is 100% equivalent to ParseTree. + * Can utilize PT's SexpProcessor and UnifiedRuby for language processing. +* Known Issue: Speed is now pretty good, but can always improve: + * RP parses a corpus of 3702 files in 125s (avg 108 Kb/s) + * MRI+PT parsed the same in 67.38s (avg 200.89 Kb/s) +* Known Issue: Code is much better, but still has a long way to go. +* Known Issue: Totally awesome. +* Known Issue: line number values can be slightly off. Parsing LR sucks. + +== SYNOPSIS: + + RubyParser.new.parse "1+1" + # => s(:call, s(:lit, 1), :+, s(:lit, 1)) + +You can also use Ruby19Parser, Ruby18Parser, or RubyParser.for_current_ruby: + + RubyParser.for_current_ruby.parse "1+1" + # => s(:call, s(:lit, 1), :+, s(:lit, 1)) + +== DEVELOPER NOTES: + +To add a new version: + +* New parser should be generated from lib/ruby[3]_parser.yy. +* Extend lib/ruby[3]_parser.yy with new class name. +* Add new version number to V2/V3 in Rakefile for rule creation. +* Add new `ruby_parse "x.y.z"` line to Rakefile for rake compare (line ~300). +* Require generated parser in lib/ruby_parser.rb. +* Add new V## = ::Ruby##Parser; end to ruby_parser.rb (bottom of file). +* Add empty TestRubyParserShared##Plus module and TestRubyParserV## to test/test_ruby_parser.rb. +* Extend Manifest.txt with generated file names. +* Add new version number to sexp_processor's pt_testcase.rb in all_versions + +Until all of these are done, you won't have a clean test run. + +== REQUIREMENTS: + +* ruby. woot. +* sexp_processor for Sexp and SexpProcessor classes, and testing. +* racc full package for parser development (compiling .y to .rb). + +== INSTALL: + +* sudo gem install ruby_parser + +== LICENSE: + +(The MIT License) + +Copyright (c) Ryan Davis, seattle.rb + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/compare/normalize.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/compare/normalize.rb new file mode 100755 index 000000000..a358e0643 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/compare/normalize.rb @@ -0,0 +1,219 @@ +#!/usr/bin/env ruby -w + +good = false + +rules = Hash.new { |h,k| h[k] = [] } +rule = nil +order = [] + +def munge s + renames = [ + # unquote... wtf? + /`(.+?)'/, proc { $1 }, + /"'(.+?)'"/, proc { "\"#{$1}\"" }, + + "'='", "tEQL", + "'!'", "tBANG", + "'%'", "tPERCENT", + "'&'", "tAMPER2", + "'('", "tLPAREN2", + "')'", "tRPAREN", + "'*'", "tSTAR2", + "'+'", "tPLUS", + "','", "tCOMMA", + "'-'", "tMINUS", + "'.'", "tDOT", + "'/'", "tDIVIDE", + "';'", "tSEMI", + "':'", "tCOLON", + "'<'", "tLT", + "'>'", "tGT", + "'?'", "tEH", + "'['", "tLBRACK", + "'\\n'", "tNL", + "']'", "tRBRACK", + "'^'", "tCARET", + "'`'", "tBACK_REF2", + "'{'", "tLCURLY", + "'|'", "tPIPE", + "'}'", "tRCURLY", + "'~'", "tTILDE", + '"["', "tLBRACK", + + # 2.0 changes? + '"<=>"', "tCMP", + '"=="', "tEQ", + '"==="', "tEQQ", + '"!~"', "tNMATCH", + '"=~"', "tMATCH", + '">="', "tGEQ", + '"<="', "tLEQ", + '"!="', "tNEQ", + '"<<"', "tLSHFT", + '">>"', "tRSHFT", + '"*"', "tSTAR", + + '".."', "tDOT2", + + '"&"', "tAMPER", + '"&&"', "tANDOP", + '"&."', "tLONELY", + '"||"', "tOROP", + + '"..."', "tDOT3", + '"**"', "tPOW", + '"unary+"', "tUPLUS", + '"unary-"', "tUMINUS", + '"[]"', "tAREF", + '"[]="', "tASET", + '"::"', "tCOLON2", + '"{ arg"', "tLBRACE_ARG", + '"( arg"', "tLPAREN_ARG", + '"("', "tLPAREN", + 'rparen', "tRPAREN", + '"{"', "tLBRACE", + '"=>"', "tASSOC", + '"->"', "tLAMBDA", + '":: at EXPR_BEG"', "tCOLON3", + '"**arg"', "tDSTAR", + '","', "tCOMMA", + + # other + + 'tLBRACK2', "tLBRACK", # HACK + + "' '", "tSPACE", # needs to be later to avoid bad hits + + "ε", "none", # bison 3+ + "%empty", "none", # newer bison + "/* empty */", "none", + /^\s*$/, "none", + + "keyword_BEGIN", "klBEGIN", + "keyword_END", "klEND", + /keyword_(\w+)/, proc { "k#{$1.upcase}" }, + /\bk_([a-z_]+)/, proc { "k#{$1.upcase}" }, + /modifier_(\w+)/, proc { "k#{$1.upcase}_MOD" }, + "kVARIABLE", "keyword_variable", # ugh + + # 2.6 collapses klBEGIN to kBEGIN + "klBEGIN", "kBEGIN", + "klEND", "kEND", + + /keyword_(\w+)/, proc { "k#{$1.upcase}" }, + /\bk_([^_][a-z_]+)/, proc { "k#{$1.upcase}" }, + /modifier_(\w+)/, proc { "k#{$1.upcase}_MOD" }, + + "kVARIABLE", "keyword_variable", # ugh: this is a rule name + + # 2.7 changes: + + '"global variable"', "tGVAR", + '"operator-assignment"', "tOP_ASGN", + '"back reference"', "tBACK_REF", + '"numbered reference"', "tNTH_REF", + '"local variable or method"', "tIDENTIFIER", + '"constant"', "tCONSTANT", + + '"(.."', "tBDOT2", + '"(..."', "tBDOT3", + '"char literal"', "tCHAR", + '"literal content"', "tSTRING_CONTENT", + '"string literal"', "tSTRING_BEG", + '"symbol literal"', "tSYMBEG", + '"backtick literal"', "tXSTRING_BEG", + '"regexp literal"', "tREGEXP_BEG", + '"word list"', "tWORDS_BEG", + '"verbatim word list"', "tQWORDS_BEG", + '"symbol list"', "tSYMBOLS_BEG", + '"verbatim symbol list"', "tQSYMBOLS_BEG", + + '"float literal"', "tFLOAT", + '"imaginary literal"', "tIMAGINARY", + '"integer literal"', "tINTEGER", + '"rational literal"', "tRATIONAL", + + '"instance variable"', "tIVAR", + '"class variable"', "tCVAR", + '"terminator"', "tSTRING_END", # TODO: switch this? + '"method"', "tFID", + '"}"', "tSTRING_DEND", + + '"do for block"', "kDO_BLOCK", + '"do for condition"', "kDO_COND", + '"do for lambda"', "kDO_LAMBDA", + "tLABEL", "kLABEL", + + # UGH + "k_LINE__", "k__LINE__", + "k_FILE__", "k__FILE__", + "k_ENCODING__", "k__ENCODING__", + + '"defined?"', "kDEFINED", + + '"do (for condition)"', "kDO_COND", + '"do (for lambda)"', "kDO_LAMBDA", + '"do (for block)"', "kDO_BLOCK", + + /\"(\w+) \(?modifier\)?\"/, proc { |x| "k#{$1.upcase}_MOD" }, + /\"(\w+)\"/, proc { |x| "k#{$1.upcase}" }, + + /\$?@(\d+)(\s+|$)/, "", # newer bison + + # TODO: remove for 3.0 work: + "lex_ctxt ", "" # 3.0 production that's mostly noise right now + ] + + renames.each_slice(2) do |(a, b)| + if Proc === b then + s.gsub!(a, &b) + else + s.gsub!(a, b) + end + end + + s.strip +end + +ARGF.each_line do |line| + next unless good or line =~ /^-* ?Grammar|\$accept : / + + case line.strip + when /^$/ then + when /^(\d+) (\$?[@\w]+): (.*)/ then # yacc + rule = $2 + order << rule unless rules.has_key? rule + rules[rule] << munge($3) + when /^(\d+) \s+\| (.*)/ then # yacc + rules[rule] << munge($2) + when /^(\d+) (@\d+): (.*)/ then # yacc + rule = $2 + order << rule unless rules.has_key? rule + rules[rule] << munge($3) + when /^rule (\d+) (@?\w+):(.*)/ then # racc + rule = $2 + order << rule unless rules.has_key? rule + rules[rule] << munge($3) + when /\$accept/ then # byacc? + good = true + when /Grammar/ then # both + good = true + when /^-+ Symbols/ then # racc + break + when /^Terminals/ then # yacc + break + when /^\cL/ then # byacc + break + else + warn "unparsed: #{$.}: #{line.strip.inspect}" + end +end + +require 'yaml' + +order.each do |k| + next if k =~ /@/ + puts + puts "#{k}:" + puts rules[k].map { |r| " #{r}" }.join "\n" +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/debugging.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/debugging.md new file mode 100644 index 000000000..a8a3bdd3e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/debugging.md @@ -0,0 +1,190 @@ +# Quick Notes to Help with Debugging + +## Reducing + +One of the most important steps is reducing the code sample to a +minimal reproduction. For example, one thing I'm debugging right now +was reported as: + +```ruby +a, b, c, d, e, f, g, h, i, j = 1, *[p1, p2, p3], *[p1, p2, p3], *[p4, p5, p6] +``` + +This original sample has 10 items on the left-hand-side (LHS) and 1 + +3 groups of 3 (calls) on the RHS + 3 arrays + 3 splats. That's a lot. + +It's already been reported (perhaps incorrectly) that this has to do +with multiple splats on the RHS, so let's focus on that. At a minimum +the code can be reduced to 2 splats on the RHS and some +experimentation shows that it needs a non-splat item to fail: + +``` +_, _, _ = 1, *[2], *[3] +``` + +and some intuition further removed the arrays: + +``` +_, _, _ = 1, *2, *3 +``` + +the difference is huge and will make a ton of difference when +debugging. + +## Getting something to compare + +``` +% rake debug3 F=file.rb +``` + +TODO + +## Comparing against ruby / ripper: + +``` +% rake cmp3 F=file.rb +``` + +This compiles the parser & lexer and then parses file.rb using both +ruby, ripper, and ruby_parser in debug modes. The output is munged to +be as uniform as possible and diffable. I'm using emacs' +`ediff-files3` to compare these files (via `rake cmp3`) all at once, +but regular `diff -u tmp/{ruby,rp}` will suffice for most tasks. + +From there? Good luck. I'm currently trying to backtrack from rule +reductions to state change differences. I'd like to figure out a way +to go from this sort of diff to a reasonable test that checks state +changes but I don't have that set up at this point. + +## Adding New Grammar Productions + +Ruby adds stuff to the parser ALL THE TIME. It's actually hard to keep +up with, but I've added some tools and shown what a typical workflow +looks like. Let's say you want to add ruby 2.7's "beginless range" (eg +`..42`). + +Whenever there's a language feature missing, I start with comparing +the parse trees between MRI and RP: + +### Structural Comparing + +There's a bunch of rake tasks `compare27`, `compare26`, etc that try +to normalize and diff MRI's parse.y parse tree (just the structure of +the tree in yacc) to ruby\_parser's parse tree (racc). It's the first +thing I do when I'm adding a new version. Stub out all the version +differences, and then start to diff the structure and move +ruby\_parser towards the new changes. + +Some differences are just gonna be there... but here's an example of a +real diff between MRI 2.7 and ruby_parser as of today: + +```diff + arg tDOT3 arg + arg tDOT2 + arg tDOT3 +- tBDOT2 arg +- tBDOT3 arg + arg tPLUS arg + arg tMINUS arg + arg tSTAR2 arg +``` + +This is a new language feature that ruby_parser doesn't handle yet. +It's in MRI (the left hand side of the diff) but not ruby\_parser (the +right hand side) so it is a `-` or missing line. + +Some other diffs will have both `+` and `-` lines. That usually +happens when MRI has been refactoring the grammar. Sometimes I choose +to adapt those refactorings and sometimes it starts to get too +difficult to maintain multiple versions of ruby parsing in a single +file. + +But! This structural comparing is always a place you should look when +ruby_parser is failing to parse something. Maybe it just hasn't been +implemented yet and the easiest place to look is the diff. + +### Starting Test First + +The next thing I do is to add a parser test to cover that feature. I +usually start with the parser and work backwards towards the lexer as +needed, as I find it structures things properly and keeps things goal +oriented. + +So, make a new parser test, usually in the versioned section of the +parser tests. + +``` + def test_beginless2 + rb = "..10\n; ..a\n; c" + pt = s(:block, + s(:dot2, nil, s(:lit, 0).line(1)).line(1), + s(:dot2, nil, s(:call, nil, :a).line(2)).line(2), + s(:call, nil, :c).line(3)).line(1) + + assert_parse_line rb, pt, 1 + + flunk "not done yet" + end +``` + +(In this case copied and modified the tests for open ranges from 2.6) +and run it to get my first error: + +``` +% rake N=/beginless/ + +... + +E + +Finished in 0.021814s, 45.8421 runs/s, 0.0000 assertions/s. + + 1) Error: +TestRubyParserV27#test_whatevs: +Racc::ParseError: (string):1 :: parse error on value ".." (tDOT2) + GEMS/2.7.0/gems/racc-1.5.0/lib/racc/parser.rb:538:in `on_error' + WORK/ruby_parser/dev/lib/ruby_parser_extras.rb:1304:in `on_error' + (eval):3:in `_racc_do_parse_c' + (eval):3:in `do_parse' + WORK/ruby_parser/dev/lib/ruby_parser_extras.rb:1329:in `block in process' + RUBY/lib/ruby/2.7.0/timeout.rb:95:in `block in timeout' + RUBY/lib/ruby/2.7.0/timeout.rb:33:in `block in catch' + RUBY/lib/ruby/2.7.0/timeout.rb:33:in `catch' + RUBY/lib/ruby/2.7.0/timeout.rb:33:in `catch' + RUBY/lib/ruby/2.7.0/timeout.rb:110:in `timeout' + WORK/ruby_parser/dev/lib/ruby_parser_extras.rb:1317:in `process' + WORK/ruby_parser/dev/test/test_ruby_parser.rb:4198:in `assert_parse' + WORK/ruby_parser/dev/test/test_ruby_parser.rb:4221:in `assert_parse_line' + WORK/ruby_parser/dev/test/test_ruby_parser.rb:4451:in `test_whatevs' +``` + +For starters, we know the missing production is for `tBDOT2 arg`. It +is currently blowing up because it is getting `tDOT2` and simply +doesn't know what to do with it, so it raises the error. As the diff +suggests, that's the wrong token to begin with, so it is probably time +to also create a lexer test: + +``` +def test_yylex_bdot2 + assert_lex3("..42", + s(:dot2, nil, s(:lit, 42)), + + :tBDOT2, "..", EXPR_BEG, + :tINTEGER, "42", EXPR_NUM) + + flunk "not done yet" +end +``` + +This one is mostly speculative at this point. It says "if we're lexing +this string, we should get this sexp if we fully parse it, and the +lexical stream should look like this"... That last bit is mostly made +up at this point. Sometimes I don't know exactly what expression state +things should be in until I start really digging in. + +At this point, I have 2 failing tests that are directing me in the +right direction. It's now a matter of digging through +`compare/parse26.y` to see how the lexer differs and implementing +it... + +But this is a good start to the doco for now. I'll add more later. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/gauntlet.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/gauntlet.md new file mode 100644 index 000000000..509adf026 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/gauntlet.md @@ -0,0 +1,107 @@ +# Running the Gauntlet + +## Maintaining a Gem Mirror + +I use rubygems-mirror to keep an archive of all the latest rubygems on +an external disk. Here is the config: + +``` +--- +- from: https://rubygems.org + to: /Volumes/StuffA/gauntlet/mirror + parallelism: 10 + retries: 3 + delete: true + skiperror: true + hashdir: true +``` + +And I update using rake: + +``` +% cd GIT/rubygems/rubygems-mirror +% git down +% rake mirror:latest +% /Volumes/StuffA/gauntlet/bin/cleanup.rb -y -v +``` + +This rather quickly updates my mirror to the latest versions of +everything and then deletes all old versions. I then run a cleanup +script that fixes the file dates to their publication date and deletes +any gems that have invalid specs. This can argue with the mirror a +bit, but it is pretty minimal (currently ~20 bad gems). + +## Curating an Archive of Ruby Files + +Next, I process the gem mirror into a much more digestable structure +using `unpack_gems.rb`. + +``` +% cd RP/gauntlet +% time caffeinate /Volumes/StuffA/gauntlet/bin/unpack_gems.rb -v [-a] ; say done +... waaaait ... +% DIR=gauntlet.$(today).(all|new).noindex +% mv hashed.noindex $DIR +% tar vc -T <(fd -tf . $DIR | sort) | zstd -5 -T0 --long > archives/$DIR.tar.zst ; say done +% ./bin/sync.sh +``` + +This script filters all the newer (< 1 year old) gems (unless `-a` is +used), unpacks them, finds all the files that look like they're valid +ruby, ensures they're valid ruby (using the current version of ruby to +compile them), and then moves them into a SHA dir structure that looks +something like this: + +``` +hashed.noindex/a/b/c/<full_file_sha>.rb +``` + +This removes all duplicates and puts everything in a fairly even, +wide, flat directory layout. + +This process takes a very long time, even with a lot of +parallelization. There are currently about 160k gems in the mirror. +Unpacking, validating, SHA'ing everything is disk and CPU intensive. +The `.noindex` extension stops spotlight from indexing the continous +churn of files being unpacked and moved and saves time. + +Finally, I rename and archive it all up (currently using zstd to +compress). + +### Stats + +``` +9696 % find gauntlet.$(today).noindex -type f | lc + 561270 +3.5G gauntlet.2021-08-06.noindex +239M gauntlet.2021-08-06.noindex.tar.zst +``` + +So I wind up with a little over half a million unique ruby files to +parse. It's about 3.5g but compresses very nicely down to 240m + +## Running the Gauntlet + +Assuming you're starting from scratch, unpack the archive once: + +``` +% zstdcat gauntlet.$(today).noindex.tar.zst | tar x +``` + +Then, either run a single process (easier to read): + +``` +% ./gauntlet/bin/gauntlet.rb gauntlet/*.noindex/? +``` + +Or max out your machine using xargs (note the `-P 16` and choose accordingly): + +``` +% ls -d gauntlet/*.noindex/?/? | time xargs -n 1 -P 16 ./gauntlet/bin/gauntlet.rb +``` + +In another terminal I usually monitor the progress like so: + +``` +% while true ; do clear; fd . -t d -t e gauntlet/*.noindex -X rmdir -p 2> /dev/null ; for D in gauntlet/*.noindex/? ; do echo -n "$D: "; fd .rb $D | wc -l ; done ; echo ; sleep 30 ; done +``` diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/rp_extensions.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/rp_extensions.rb new file mode 100644 index 000000000..1fb3c79f6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/rp_extensions.rb @@ -0,0 +1,53 @@ +# :stopdoc: +# WHY do I have to do this?!? +class Regexp + ONCE = 0 unless defined? ONCE # FIX: remove this - it makes no sense + + unless defined? ENC_NONE then + ENC_NONE = /x/n.options + ENC_EUC = /x/e.options + ENC_SJIS = /x/s.options + ENC_UTF8 = /x/u.options + end +end +# :startdoc: + +class Array + def prepend *vals + self[0,0] = vals + end +end unless [].respond_to?(:prepend) + +# :stopdoc: +class Symbol + def end_with? o + self.to_s.end_with? o + end +end unless :woot.respond_to?(:end_with?) +# :startdoc: + +############################################################ +# HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK + +class String + def clean_caller + self.sub(File.dirname(__FILE__), "./lib").sub(/:in.*/, "") + end if $DEBUG +end + +require "sexp" + +class Sexp + attr_writer :paren # TODO: retire + + def paren + @paren ||= false + end + + def block_pass? + any? { |s| Sexp === s && s.sexp_type == :block_pass } + end +end + +# END HACK +############################################################ diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/rp_stringscanner.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/rp_stringscanner.rb new file mode 100644 index 000000000..5b0edb458 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/rp_stringscanner.rb @@ -0,0 +1,33 @@ +require "strscan" + +class RPStringScanner < StringScanner + if ENV["DEBUG"] || ENV["TALLY"] then + def getch + c = super + where = caller.drop_while { |s| s =~ /(getch|nextc).$/ }.first + where = where.split(/:/).first(2).join(":") + if ENV["TALLY"] then + d getch:where + else + d getch:[c, where] + end + c + end + + def scan re + s = super + where = caller.drop_while { |x| x =~ /scan.$/ }.first + where = where.split(/:/).first(2).join(":") + if ENV["TALLY"] then + d scan:[where] + else + d scan:[s, where] if s + end + s + end + + def d o + STDERR.puts o.inspect + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby20_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby20_parser.rb new file mode 100644 index 000000000..419a9c716 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby20_parser.rb @@ -0,0 +1,10956 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby20Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -518, 8, 85, 86, 87, 12, 78, -518, -518, -518, + 79, 80, -518, -518, -518, 83, -518, 81, 82, 84, + 33, 34, 76, 77, -518, 570, -518, -518, -518, 88, + 31, 30, 115, 114, 116, 117, -518, -518, 22, -518, + -518, -518, -518, -518, 11, 49, 10, 13, 119, 118, + 120, 109, 60, 111, 110, 112, 830, 113, 121, 122, + -109, 107, 108, -110, 45, 46, 44, -518, -518, -518, + -518, -518, -518, -518, -518, -518, -518, -518, -518, -518, + -518, 570, -103, -518, -518, -518, 43, -518, -518, 36, + 829, -518, 62, 63, -518, -518, 64, -518, 38, -518, + 3, -518, 48, -518, -518, -518, -518, -518, -518, -518, + 23, -518, 281, -518, 123, 105, 95, 97, 98, 99, + 101, -117, -116, 649, 96, 106, -518, -518, -518, -518, + 570, -518, 89, -518, -521, 93, 100, 102, -518, 127, + -518, -521, -521, -521, 126, 570, -521, -521, -521, -103, + -521, 741, 570, -112, 221, 222, 221, 222, -521, -112, + -521, -521, -521, 221, 222, -100, -114, 281, -101, -111, + -521, -521, -113, -521, -521, -521, -521, -521, 334, 335, + 221, 222, -95, -532, -103, -105, 648, -103, -114, -113, + 881, -115, -111, -81, 230, 127, 543, 544, -103, 283, + 126, -521, -521, -521, -521, -521, -521, -521, -521, -521, + -521, -521, -521, -521, -521, 281, 652, -521, -521, -521, + 584, -521, -521, 218, 585, -521, -108, -107, -521, -521, + 231, -521, 278, -521, 281, -521, -109, -521, -521, -521, + -521, -521, -521, -521, 127, -521, 231, -521, 219, 126, + -611, 127, -105, 231, 283, -611, 126, -612, -103, 127, + -521, -521, -521, -521, 126, -521, 127, -521, -300, 942, + 231, 126, -521, -112, -521, -300, -300, -300, -112, 651, + -114, -300, -300, -111, -300, -114, -113, -105, -111, 830, + -105, -113, 95, -105, -104, 880, -106, -102, 220, 278, + 96, -105, 283, -533, -300, -300, 227, -300, -300, -300, + -300, -300, 227, 276, 846, 228, 860, 478, 577, 226, + 847, 283, 633, 829, -518, 228, 633, 548, 224, 821, + 223, -518, 271, -608, 332, -300, -300, -300, -300, -300, + -300, -300, -300, -300, -300, -300, -300, -300, -300, 221, + 222, -300, -300, -300, -609, 675, -110, -108, -532, -300, + 221, 222, -300, 822, 669, -615, 633, -300, -117, -300, + -117, -300, -300, -300, -300, -300, -300, -300, -117, -300, + -116, -300, -112, 635, 634, 633, -518, 635, 634, 631, + -615, -434, 793, -518, -300, -300, -615, -106, -608, -300, + -100, 670, -518, -615, -615, -615, -300, -521, -115, -615, + -615, -109, -615, 619, -521, -521, -114, -112, -615, -609, + -608, -615, -521, -521, 621, -615, 333, 635, 634, 636, + -611, 633, -615, -615, -615, -615, -615, -615, -615, -615, + 231, -609, 397, -615, -434, 913, 635, 634, 641, 633, + -615, -434, -615, 808, -114, -611, 425, 629, 628, -615, + -434, 427, 426, -615, -615, -615, -615, -615, -615, -615, + -615, -615, -615, -615, -615, -615, -615, -615, -434, -615, + -615, -615, -528, 676, 400, 730, 633, -615, 729, -528, + -615, 622, 635, 634, 646, -615, 403, -615, -111, -615, + -615, -615, -615, -615, -615, -615, -111, -615, -615, -615, + 635, 634, 615, -340, 612, 611, 610, 619, 613, 795, + -340, 633, -615, -615, 638, -104, -533, -615, 621, -340, + -615, 856, 860, -527, -615, 548, -113, -615, -615, -615, + -527, 925, -615, -615, -615, 406, -615, 635, 634, 653, + 617, 601, 621, 629, 628, -615, -615, -615, -615, 626, + 625, 629, 628, 856, 860, 423, -615, -615, -101, -615, + -615, -615, -615, -615, -529, 730, 428, -107, 732, -110, + -526, -529, 635, 634, -523, 629, 628, -526, -116, 477, + 785, -523, 612, 611, 610, 622, 613, -615, -615, -615, + -615, -615, -615, -615, -615, -615, -615, -615, -615, -615, + -615, 479, 669, -615, -615, -615, -524, 823, -615, 622, + 480, -615, 230, -524, -615, -615, 509, -615, 780, -615, + 518, -615, 670, -615, -615, -615, -615, -615, -615, -615, + -525, -615, -615, -615, 808, 521, 615, -525, 612, 611, + 610, 619, 613, 227, -103, 523, -615, -615, -615, -615, + 475, -615, 621, -615, -300, -112, -80, 231, -615, 476, + -113, -300, -300, -300, -105, 533, -300, -300, -300, 534, + -300, 541, -530, 288, 617, -114, -102, 231, 251, -530, + -300, -300, -300, 626, 625, 629, 628, -111, -530, 278, + -300, -300, 597, -300, -300, -300, -300, -300, 785, 598, + 612, 611, 610, 730, 613, 785, 732, 612, 611, 610, + 248, 613, 545, 127, 250, 249, 246, 247, 126, 622, + 549, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, -300, -300, -300, 550, 780, -300, -300, -300, + -531, 824, -300, 780, 251, -300, 231, -531, -300, -300, + 577, -300, 784, -300, 251, -300, -531, -300, -300, -300, + -300, -300, -300, -300, 127, -300, 416, -300, 615, 126, + 612, 611, 610, 619, 613, 582, 583, 591, 268, 269, + -300, -300, -300, -300, 621, -300, 248, -300, -300, 640, + 250, 249, -300, 127, -115, -300, -300, -300, 126, 644, + 647, -300, -300, 227, -300, 785, 617, 612, 611, 610, + 540, 613, 251, 267, 266, 626, 625, 629, 628, 538, + 730, 127, 650, 732, -300, -300, 126, -300, -300, -300, + -300, -300, 127, 657, -291, -275, 785, 126, 612, 611, + 610, -291, 613, 780, 248, 659, 660, 231, 250, 249, + -291, 622, 784, 667, 668, -300, -300, -300, -300, -300, + -300, -300, -300, -300, -300, -300, -300, -300, -300, 227, + 251, -300, -300, -300, 780, 675, 552, 231, 278, -300, + 1040, 127, -300, 784, 680, 476, 126, -300, 251, -300, + 251, -300, -300, -300, -300, -300, -300, -300, 251, -300, + 251, -300, 248, 687, 227, 227, 250, 249, 246, 247, + 231, 581, 587, 231, -300, -300, -615, -300, 423, -300, + 579, 589, 231, -615, -615, -615, -300, -95, -115, -615, + -615, 615, -615, 612, 611, 610, 619, 613, 227, 706, + 785, -615, 612, 611, 610, 663, 613, 621, 231, 555, + 717, 723, -615, -615, 661, -615, -615, -615, -615, -615, + 785, -301, 612, 611, 610, 726, 613, 231, -301, 617, + 902, 903, 231, 734, 904, 121, 122, -301, 626, 625, + 629, 628, 523, -615, -615, -615, -615, -615, -615, -615, + -615, -615, -615, -615, -615, -615, -615, -301, 780, -615, + -615, -615, 227, 676, -301, 737, 726, -615, 726, 1024, + -615, 577, 726, -301, 622, -615, 762, -615, 589, -615, + -615, -615, -615, -615, -615, -615, 768, -615, -615, -615, + 771, 772, 615, -530, 612, 611, 610, 619, 613, -300, + -530, 774, -615, -615, 776, -615, -300, -615, 621, -530, + -433, -612, 778, -300, -615, -300, -113, -433, -433, -433, + -300, 788, -433, -433, -433, -612, -433, 251, 789, -300, + 617, 790, 796, 797, -276, -433, -433, -433, -531, 626, + 625, 629, 628, 261, 262, -531, -433, -433, 809, -433, + -433, -433, -433, -433, -531, 509, 509, 231, 826, 248, + 227, 254, 271, 250, 249, 246, 247, 1030, 835, 252, + 837, 253, 521, 523, 717, 622, 1028, -433, -433, -433, + -433, -433, -433, -433, -433, -433, -433, -433, -433, -433, + -433, 231, -291, -433, -433, -433, 227, 278, -433, -291, + 278, -433, 278, 1024, -433, -433, 717, -433, -291, -433, + 251, -433, 589, -433, -433, -433, -433, -433, -433, -433, + 251, -433, -433, -433, -301, 860, 1005, 726, 612, 611, + 610, -301, 613, 231, 231, 726, -433, -433, -309, -433, + -301, -433, 231, 897, 898, -309, -309, -309, -433, 231, + -309, -309, -309, 615, -309, 612, 611, 610, 619, 613, + -300, 907, -277, 231, -309, -309, 912, -300, 929, 621, + 717, -275, -612, 934, -309, -309, -300, -309, -309, -309, + -309, -309, 1005, 726, 612, 611, 610, 726, 613, 726, + 726, 617, 130, 131, 132, 133, 134, 726, 231, 954, + 626, 625, 629, 628, 231, -309, -309, -309, -309, -309, + -309, -309, -309, -309, -309, -309, -309, -309, -309, 771, + 957, -309, -309, -309, 959, 961, -309, 963, 288, -309, + 963, 231, -309, -309, 970, -309, 622, -309, -278, -309, + 971, -309, -309, -309, -309, -309, -309, -309, 771, -309, + 974, -309, 130, 131, 132, 133, 134, 130, 131, 132, + 133, 134, 977, 979, -309, -309, -292, -309, 981, -309, + 231, 983, 762, -292, -292, -292, -309, 1001, -292, -292, + -292, 785, -292, 612, 611, 610, 619, 613, 1002, 1011, + 1012, 1022, -292, -292, -292, 1025, 846, 621, 1031, 726, + 1041, 963, -292, -292, 963, -292, -292, -292, -292, -292, + 130, 131, 132, 133, 134, 963, 771, 1048, 1050, 617, + 1052, 1054, 1054, 723, 726, 1012, -612, -611, 231, 963, + 629, 628, 1075, -292, -292, -292, -292, -292, -292, -292, + -292, -292, -292, -292, -292, -292, -292, 1054, 1054, -292, + -292, -292, 1054, 1054, -292, nil, nil, -292, nil, nil, + -292, -292, nil, -292, 622, -292, nil, -292, nil, -292, + -292, -292, -292, -292, -292, -292, nil, -292, nil, -292, + 924, nil, 612, 611, 610, 925, 613, nil, nil, nil, + nil, nil, -292, -292, -292, -292, 621, -292, -636, -292, + nil, nil, nil, nil, -292, -636, -636, -636, nil, nil, + -636, -636, -636, nil, -636, 251, nil, nil, 617, nil, + nil, nil, nil, -636, -636, -636, nil, 626, 625, 629, + 628, 261, 262, nil, -636, -636, nil, -636, -636, -636, + -636, -636, nil, nil, nil, nil, nil, 248, nil, 254, + nil, 250, 249, 246, 247, 231, nil, 252, nil, 253, + nil, nil, nil, 622, nil, -636, -636, -636, -636, -636, + -636, -636, -636, -636, -636, -636, -636, -636, -636, nil, + nil, -636, -636, -636, nil, nil, -636, nil, 278, -636, + nil, nil, -636, -636, nil, -636, nil, -636, nil, -636, + nil, -636, -636, -636, -636, -636, -636, -636, nil, -636, + -636, -636, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, -636, -636, -616, -636, nil, -636, + nil, nil, nil, -616, -616, -616, -636, nil, -616, -616, + -616, 615, -616, 612, 611, 610, 619, 613, nil, nil, + nil, -616, -616, -616, -616, nil, nil, 621, nil, nil, + nil, nil, -616, -616, nil, -616, -616, -616, -616, -616, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 617, + nil, nil, nil, nil, nil, nil, nil, nil, 626, 625, + 629, 628, nil, -616, -616, -616, -616, -616, -616, -616, + -616, -616, -616, -616, -616, -616, -616, nil, nil, -616, + -616, -616, nil, nil, -616, nil, nil, -616, nil, nil, + -616, -616, nil, -616, 622, -616, nil, -616, nil, -616, + -616, -616, -616, -616, -616, -616, nil, -616, -616, -616, + 785, nil, 612, 611, 610, 619, 613, nil, nil, nil, + nil, nil, -616, -616, -616, -616, 621, -616, -617, -616, + nil, nil, nil, nil, -616, -617, -617, -617, nil, nil, + -617, -617, -617, nil, -617, 251, nil, nil, 617, nil, + nil, nil, nil, -617, -617, -617, -617, nil, nil, 629, + 628, 261, 262, nil, -617, -617, nil, -617, -617, -617, + -617, -617, nil, nil, nil, nil, nil, 248, nil, 254, + nil, 250, 249, 246, 247, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, -617, -617, -617, -617, -617, + -617, -617, -617, -617, -617, -617, -617, -617, -617, nil, + nil, -617, -617, -617, nil, nil, -617, nil, nil, -617, + nil, nil, -617, -617, nil, -617, nil, -617, nil, -617, + nil, -617, -617, -617, -617, -617, -617, -617, nil, -617, + -617, -617, 785, nil, 612, 611, 610, 619, 613, nil, + nil, nil, nil, nil, -617, -617, -617, -617, 621, -617, + -636, -617, nil, nil, nil, nil, -617, -636, -636, -636, + nil, nil, -636, -636, -636, nil, -636, nil, nil, nil, + 617, nil, nil, nil, nil, -636, -636, nil, nil, nil, + nil, 629, 628, nil, nil, nil, -636, -636, nil, -636, + -636, -636, -636, -636, 785, nil, 612, 611, 610, 619, + 613, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 621, nil, nil, nil, nil, 622, nil, 251, 255, 256, + 257, 258, 268, 269, 263, 264, 259, 260, -636, -637, + -637, nil, 617, 261, 262, -636, nil, nil, nil, nil, + 278, -636, nil, 629, 628, nil, nil, nil, nil, 248, + nil, 254, nil, 250, 249, 246, 247, 267, 266, 252, + nil, 253, -636, -636, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, -636, 622, nil, nil, + nil, -636, 306, 85, 86, 87, 12, 78, -636, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 115, 114, 116, 117, nil, nil, 22, + nil, nil, nil, nil, 664, 11, 49, 308, 13, 119, + 118, 120, 109, 60, 111, 110, 112, nil, 113, 121, + 122, nil, 107, 108, nil, 45, 46, 44, 251, 255, + 256, 257, 258, 268, 269, 263, 264, 259, 260, nil, + 244, 245, nil, nil, 261, 262, nil, 43, nil, nil, + 310, nil, nil, 62, 63, nil, nil, 64, nil, 38, + 248, nil, 254, 48, 250, 249, 246, 247, 267, 266, + 252, 23, 253, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, 265, nil, + -250, nil, nil, 89, nil, nil, 93, 100, 102, 306, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 22, nil, nil, nil, + nil, 664, 11, 49, 308, 13, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, 251, 255, 256, 257, 258, + 268, 269, 263, 264, 259, 260, nil, 244, 245, nil, + nil, 261, 262, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 248, nil, 254, + 48, 250, 249, 246, 247, 267, 266, 252, 23, 253, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 265, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 306, 85, 86, 87, + 12, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 115, 114, 116, + 117, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 49, 308, 13, 119, 118, 120, 109, 60, 111, 110, + 112, nil, 113, 121, 122, nil, 107, 108, nil, 45, + 46, 44, 251, 255, 256, 257, 258, 268, 269, 263, + 264, 259, 260, nil, 244, 245, nil, nil, 261, 262, + nil, 43, nil, nil, 36, nil, nil, 62, 63, nil, + nil, 64, nil, 38, 248, nil, 254, 48, 250, 249, + 246, 247, 267, 266, 252, 23, 253, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, 265, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, 306, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 308, 13, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, 251, + 255, 256, 257, 258, 268, 269, 263, 264, 259, 260, + nil, 244, 245, nil, nil, 261, 262, nil, 43, nil, + nil, 310, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 248, nil, 254, 48, 250, 249, 246, 247, 267, + 266, 252, 23, 253, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, 265, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 306, 85, 86, 87, 12, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 115, 114, 116, 117, nil, nil, 22, nil, nil, + nil, nil, nil, 11, 49, 308, 13, 119, 118, 120, + 109, 60, 111, 110, 112, nil, 113, 121, 122, nil, + 107, 108, nil, 45, 46, 44, 251, 255, 256, 257, + 258, 268, 269, 263, 264, 259, 260, nil, 244, 245, + nil, nil, 261, 262, nil, 43, nil, nil, 310, nil, + nil, 62, 63, nil, nil, 64, nil, 38, 248, nil, + 254, 48, 250, 249, 246, 247, 267, 266, 252, 23, + 253, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, 231, 265, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, 306, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 308, 13, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, 251, 255, 256, 257, 258, 268, 269, + 263, 264, 259, 260, nil, 244, 245, nil, nil, 261, + 262, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 248, nil, 254, 48, 250, + 249, 246, 247, 267, 266, 252, 23, 253, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, 265, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 306, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 115, 114, 116, 117, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 308, + 13, 119, 118, 120, 109, 60, 111, 110, 112, nil, + 113, 121, 122, nil, 107, 108, nil, 45, 46, 44, + 251, 255, 256, 257, 258, 268, 269, 263, 264, 259, + 260, nil, 244, 245, nil, nil, 261, 262, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 248, nil, 254, 48, 250, 249, 246, 247, + 267, 266, 252, 23, 253, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + 265, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, 306, 85, 86, 87, 12, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 49, 308, 13, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, 251, 255, 256, + 257, 258, 268, 269, 263, 264, 259, 260, nil, 244, + 245, nil, nil, 261, 262, nil, 43, nil, nil, 36, + nil, nil, 62, 63, nil, nil, 64, nil, 38, 248, + nil, 254, 48, 250, 249, 246, 247, 267, 266, 252, + 23, 253, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, 265, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 306, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 115, + 114, 116, 117, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, 308, 13, 119, 118, 120, 109, 60, + 111, 110, 112, nil, 113, 121, 122, nil, 107, 108, + nil, 45, 46, 44, 251, 255, 256, 257, 258, 268, + 269, 263, 264, 259, 260, nil, -637, -637, nil, nil, + 261, 262, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, 248, nil, 254, 48, + 250, 249, 246, 247, 267, 266, 252, 23, 253, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, 306, 85, 86, 87, 12, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 49, + 308, 13, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, 251, -637, -637, -637, -637, 268, 269, nil, nil, + -637, -637, nil, nil, nil, nil, nil, 261, 262, nil, + 43, nil, nil, 36, nil, nil, 62, 63, nil, nil, + 64, nil, 38, 248, nil, 254, 48, 250, 249, 246, + 247, 267, 266, 252, 23, 253, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 306, 85, 86, 87, 12, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 115, 114, 116, 117, nil, nil, 22, + nil, nil, nil, nil, nil, 11, 49, 308, 13, 119, + 118, 120, 109, 60, 111, 110, 112, nil, 113, 121, + 122, nil, 107, 108, nil, 45, 46, 44, 251, -637, + -637, -637, -637, 268, 269, nil, nil, -637, -637, nil, + nil, nil, nil, nil, 261, 262, nil, 43, nil, nil, + 36, nil, nil, 62, 63, nil, nil, 64, nil, 38, + 248, nil, 254, 48, 250, 249, 246, 247, 267, 266, + 252, 23, 253, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, 8, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 10, 13, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, 251, -637, -637, -637, -637, + 268, 269, nil, nil, -637, -637, nil, nil, nil, nil, + nil, 261, 262, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 248, nil, 254, + 48, 250, 249, 246, 247, 267, 266, 252, 23, 253, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 306, 85, 86, 87, + 12, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 115, 114, 116, + 117, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 49, 308, 13, 119, 118, 120, 109, 60, 111, 110, + 112, nil, 113, 121, 122, nil, 107, 108, nil, 45, + 46, 44, 251, -637, -637, -637, -637, 268, 269, nil, + nil, -637, -637, nil, nil, nil, nil, nil, 261, 262, + nil, 43, nil, nil, 36, nil, nil, 62, 63, nil, + nil, 64, nil, 38, 248, nil, 254, 48, 250, 249, + 246, 247, 267, 266, 252, 23, 253, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, 306, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 308, 13, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, 251, + -637, -637, -637, -637, 268, 269, nil, nil, -637, -637, + nil, nil, nil, nil, nil, 261, 262, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 248, nil, 254, 48, 250, 249, 246, 247, 267, + 266, 252, 23, 253, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 306, 85, 86, 87, 12, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 115, 114, 116, 117, nil, nil, 22, nil, nil, + nil, nil, nil, 11, 49, 308, 13, 119, 118, 120, + 109, 60, 111, 110, 112, nil, 113, 121, 122, nil, + 107, 108, nil, 45, 46, 44, 251, -637, -637, -637, + -637, 268, 269, nil, nil, -637, -637, nil, nil, nil, + nil, nil, 261, 262, nil, 43, nil, nil, 36, nil, + nil, 62, 63, nil, nil, 64, nil, 38, 248, nil, + 254, 48, 250, 249, 246, 247, 267, 266, 252, 23, + 253, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, 306, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 308, 13, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, 251, 255, 256, 257, 258, 268, 269, + nil, nil, 259, 260, nil, nil, nil, nil, nil, 261, + 262, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 248, nil, 254, 48, 250, + 249, 246, 247, 267, 266, 252, 23, 253, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 306, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 115, 114, 116, 117, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 308, + 13, 119, 118, 120, 109, 60, 111, 110, 112, nil, + 113, 121, 122, nil, 107, 108, nil, 45, 46, 44, + 251, 255, 256, 257, 258, 268, 269, 263, nil, 259, + 260, nil, nil, nil, nil, nil, 261, 262, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 248, nil, 254, 48, 250, 249, 246, 247, + 267, 266, 252, 23, 253, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, 306, 85, 86, 87, 12, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 49, 308, 13, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, 251, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 261, 262, nil, 43, nil, nil, 36, + nil, 251, 62, 63, nil, nil, 64, nil, 38, 248, + nil, 254, 48, 250, 249, 246, 247, 261, 262, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, 248, 96, 106, nil, 250, 249, 246, + 247, nil, 89, nil, nil, 93, 100, 102, 306, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 115, + 114, 116, 117, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, 308, 13, 119, 118, 120, 109, 60, + 111, 110, 112, nil, 113, 121, 122, nil, 107, 108, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, 306, 85, 86, 87, 12, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 49, + 308, 13, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, 36, nil, nil, 62, 63, nil, nil, + 64, nil, 38, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 306, 85, 86, 87, 12, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 115, 114, 116, 117, nil, nil, 22, + nil, nil, nil, nil, nil, 11, 49, 308, 13, 119, + 118, 120, 109, 60, 111, 110, 112, nil, 113, 121, + 122, nil, 107, 108, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, + 36, nil, nil, 62, 63, nil, nil, 64, nil, 38, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, 306, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 308, 13, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 306, 85, 86, 87, + 12, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 115, 114, 116, + 117, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 49, 308, 13, 119, 118, 120, 109, 60, 111, 110, + 112, nil, 113, 121, 122, nil, 107, 108, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 43, nil, nil, 36, nil, nil, 62, 63, nil, + nil, 64, nil, 38, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, 306, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 308, 13, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 306, 85, 86, 87, 12, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 115, 114, 116, 117, nil, nil, 22, nil, nil, + nil, nil, nil, 11, 49, 308, 13, 119, 118, 120, + 109, 60, 111, 110, 112, nil, 113, 121, 122, nil, + 107, 108, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 43, nil, nil, 36, nil, + nil, 62, 63, nil, nil, 64, nil, 38, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, 306, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 308, 13, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 306, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 115, 114, 116, 117, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 308, + 13, 119, 118, 120, 109, 60, 111, 110, 112, nil, + 113, 121, 122, nil, 107, 108, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, 306, 85, 86, 87, 12, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 49, 308, 13, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 43, nil, nil, 36, + nil, nil, 62, 63, nil, nil, 64, nil, 38, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 10, 13, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, 785, 64, 612, + 611, 610, 925, 613, 48, nil, nil, nil, nil, nil, + nil, nil, 241, 621, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, 617, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, 629, 628, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + 622, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, 299, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, 297, nil, 295, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 300, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + 299, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, 297, nil, 295, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 300, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, 299, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, 297, nil, + 295, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 300, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 323, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + nil, nil, 329, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 319, nil, nil, 315, nil, nil, 62, 63, + nil, nil, 64, nil, 314, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 323, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, nil, nil, 329, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 319, nil, + nil, 242, nil, nil, 62, 63, nil, 785, 64, 612, + 611, 610, 619, 613, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 621, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, 331, nil, nil, 89, 617, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, 629, 628, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + 622, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, 785, 64, 612, 611, 610, 925, 613, + 48, nil, nil, nil, nil, nil, nil, nil, 241, 621, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, 617, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, 629, 628, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, 622, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, 785, + 64, 612, 611, 610, 925, 613, 48, nil, nil, nil, + nil, nil, nil, nil, 241, 621, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, 617, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, 629, 628, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, 622, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, 785, 64, 612, 611, 610, + 925, 613, 48, nil, nil, nil, nil, nil, nil, nil, + 241, 621, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, 617, nil, 93, 100, 102, 85, 86, + 87, 12, 78, nil, 629, 628, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, 622, nil, + 11, 49, nil, 13, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, 785, 64, 612, + 611, 610, 925, 613, 48, nil, nil, nil, nil, nil, + nil, nil, 23, 621, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, 617, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, 629, 628, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 22, nil, nil, nil, + 622, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + 127, nil, nil, nil, nil, 126, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 323, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, nil, nil, 329, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 360, nil, nil, 36, + nil, nil, 62, 63, nil, nil, 64, nil, 38, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 323, nil, nil, 119, 118, 120, 365, 60, 111, + 110, 366, nil, 113, 121, 122, nil, 107, 108, nil, + nil, nil, 329, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 372, + nil, nil, 367, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 323, nil, nil, + 119, 118, 120, 365, 60, 111, 110, 366, nil, 113, + 121, 122, nil, 107, 108, nil, nil, nil, 329, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 367, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 10, 13, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, 416, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, nil, 13, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, 433, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, 433, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + 299, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, 297, nil, 295, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 300, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, 231, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, 299, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + 297, nil, 295, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 300, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, 299, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, 297, nil, 295, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 300, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + 299, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, 297, nil, 295, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + 231, nil, nil, nil, nil, nil, 89, nil, 300, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, 12, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 49, + nil, 13, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, 36, nil, nil, 62, 63, nil, nil, + 64, nil, 38, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 323, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, nil, nil, 329, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 319, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, 536, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 323, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + nil, nil, 329, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 319, nil, nil, 315, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, 555, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + 299, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, 297, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 300, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, 299, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 300, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + 299, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, 297, nil, 295, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 300, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, 299, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, 700, nil, 295, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 300, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + 299, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, 295, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 300, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 308, 13, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, 416, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 323, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, nil, nil, 329, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 319, nil, + nil, 315, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, 299, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, 297, nil, 295, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 300, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 323, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, nil, nil, + 329, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 319, nil, nil, 315, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + 299, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, 297, nil, 295, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 300, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, 299, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, 297, nil, + 295, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 300, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, 801, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, 299, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, 297, nil, + 295, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 300, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, 299, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + 700, nil, 295, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 300, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, 299, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, 295, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 300, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 323, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, nil, nil, + 329, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 319, nil, nil, 315, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 323, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, nil, nil, 329, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 319, nil, nil, 315, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, 433, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, 299, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + 700, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 300, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, 299, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 300, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, 865, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 115, 114, 116, 117, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 115, 114, 116, 117, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, 299, 113, 121, 122, nil, 107, 108, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 236, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, 295, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 241, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + 300, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 325, 326, + 76, 77, nil, nil, nil, nil, nil, 88, 322, 328, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 323, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, nil, 113, 121, 122, nil, 107, + 108, nil, nil, nil, 329, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 985, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 325, 326, 76, 77, nil, nil, + nil, nil, nil, 88, 322, 328, 115, 114, 116, 117, + nil, nil, 243, nil, nil, nil, nil, nil, nil, 323, + nil, nil, 119, 118, 120, 109, 60, 111, 110, 112, + nil, 113, 121, 122, nil, 107, 108, nil, nil, nil, + 329, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 992, nil, nil, 242, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 325, 326, 76, 77, nil, nil, nil, nil, nil, 88, + 322, 328, 115, 114, 116, 117, nil, nil, 243, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 119, 118, + 120, 109, 60, 111, 110, 112, nil, 113, 121, 122, + nil, 107, 108, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 242, + nil, nil, 62, 63, nil, nil, 64, nil, 997, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 325, 326, 76, 77, + nil, nil, nil, nil, nil, 88, 322, 328, 115, 114, + 116, 117, nil, nil, 243, nil, nil, nil, nil, nil, + nil, 323, nil, nil, 119, 118, 120, 109, 60, 111, + 110, 112, nil, 113, 121, 122, nil, 107, 108, nil, + nil, nil, 329, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 985, nil, nil, 242, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 325, 326, 76, 77, nil, nil, nil, nil, + nil, 88, 322, 328, 115, 114, 116, 117, nil, nil, + 243, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 119, 118, 120, 109, 60, 111, 110, 112, nil, 113, + 121, 122, nil, 107, 108, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 236, nil, + nil, 242, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 241, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 115, 114, 116, 117, nil, nil, 243, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 119, 118, 120, 109, + 60, 111, 110, 112, 299, 113, 121, 122, nil, 107, + 108, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, 242, nil, nil, + 62, 63, nil, nil, 64, nil, 297, nil, 295, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 300, 93, 100, 102, 185, 196, 186, 209, + 182, 202, 192, 191, 212, 213, 207, 190, 189, 184, + 210, 214, 215, 194, 183, 197, 201, 203, 195, 188, + nil, nil, nil, 204, 211, 206, 205, 198, 208, 193, + 181, 200, 199, nil, nil, nil, nil, nil, 180, 187, + 178, 179, 175, 176, 177, 138, 140, 137, nil, 139, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 171, + nil, 166, 148, 149, 150, 157, 154, 156, nil, nil, + 151, 152, nil, nil, nil, 172, 173, 158, 159, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 163, 162, nil, 147, 169, 165, 164, 160, + 161, 155, 153, 145, 168, 146, nil, nil, 174, 105, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 106, + nil, nil, nil, nil, nil, nil, nil, nil, 167, 185, + 196, 186, 209, 182, 202, 192, 191, 212, 213, 207, + 190, 189, 184, 210, 214, 215, 194, 183, 197, 201, + 203, 195, 188, nil, nil, nil, 204, 211, 206, 205, + 198, 208, 193, 181, 200, 199, nil, nil, nil, nil, + nil, 180, 187, 178, 179, 175, 176, 177, 138, 140, + nil, nil, 139, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 171, nil, 166, 148, 149, 150, 157, 154, + 156, nil, nil, 151, 152, nil, nil, nil, 172, 173, + 158, 159, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 163, 162, nil, 147, 169, + 165, 164, 160, 161, 155, 153, 145, 168, 146, nil, + nil, 174, 105, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 106, nil, nil, nil, nil, nil, nil, nil, + nil, 167, 185, 196, 186, 209, 182, 202, 192, 191, + 212, 213, 207, 190, 189, 184, 210, 214, 215, 194, + 183, 197, 201, 203, 195, 188, nil, nil, nil, 204, + 211, 206, 383, 382, 384, 381, 181, 200, 199, nil, + nil, nil, nil, nil, 180, 187, 178, 179, 378, 379, + 380, 376, 140, 111, 110, 377, nil, 113, nil, nil, + nil, nil, nil, nil, 170, 171, nil, 166, 148, 149, + 150, 157, 154, 156, nil, nil, 151, 152, nil, nil, + nil, 172, 173, 158, 159, nil, nil, nil, nil, nil, + 388, nil, nil, nil, nil, nil, nil, nil, 163, 162, + nil, 147, 169, 165, 164, 160, 161, 155, 153, 145, + 168, 146, nil, nil, 174, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 167, 185, 196, 186, 209, 182, + 202, 192, 191, 212, 213, 207, 190, 189, 184, 210, + 214, 215, 194, 183, 197, 201, 203, 195, 188, nil, + nil, nil, 204, 211, 206, 205, 198, 208, 193, 181, + 200, 199, nil, nil, nil, nil, nil, 180, 187, 178, + 179, 175, 176, 177, 138, 140, 413, 412, 139, nil, + 414, nil, nil, nil, nil, nil, nil, 170, 171, nil, + 166, 148, 149, 150, 157, 154, 156, nil, nil, 151, + 152, nil, nil, nil, 172, 173, 158, 159, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 163, 162, nil, 147, 169, 165, 164, 160, 161, + 155, 153, 145, 168, 146, nil, nil, 174, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 167, 185, 196, + 186, 209, 182, 202, 192, 191, 212, 213, 207, 190, + 189, 184, 210, 214, 215, 194, 183, 197, 201, 203, + 195, 188, nil, nil, nil, 204, 211, 206, 205, 198, + 208, 193, 181, 200, 199, nil, nil, nil, nil, nil, + 180, 187, 178, 179, 175, 176, 177, 138, 140, nil, + nil, 139, nil, nil, nil, nil, nil, nil, nil, nil, + 170, 171, nil, 166, 148, 149, 150, 157, 154, 156, + nil, nil, 151, 152, nil, nil, nil, 172, 173, 158, + 159, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 163, 162, nil, 147, 169, 165, + 164, 160, 161, 155, 153, 145, 168, 146, nil, nil, + 174, 105, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 106, nil, nil, nil, nil, nil, nil, nil, nil, + 167, 185, 196, 186, 209, 182, 202, 192, 191, 212, + 213, 207, 190, 189, 184, 210, 214, 215, 194, 183, + 197, 201, 203, 195, 188, nil, nil, nil, 204, 211, + 206, 205, 198, 208, 193, 181, 200, 199, nil, nil, + nil, nil, nil, 180, 187, 178, 179, 175, 176, 177, + 138, 140, nil, nil, 139, nil, nil, nil, nil, nil, + nil, nil, nil, 170, 171, nil, 166, 148, 149, 150, + 157, 154, 156, nil, nil, 151, 152, nil, nil, nil, + 172, 173, 158, 159, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 163, 162, nil, + 147, 169, 165, 164, 160, 161, 155, 153, 145, 168, + 146, nil, nil, 174, 105, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 106, nil, nil, nil, nil, nil, + nil, nil, nil, 167, 185, 196, 186, 209, 182, 202, + 192, 191, 212, 213, 207, 190, 189, 184, 210, 214, + 215, 194, 183, 197, 201, 203, 195, 188, nil, nil, + nil, 204, 211, 206, 205, 198, 208, 193, 181, 200, + 199, nil, nil, nil, nil, nil, 180, 187, 178, 179, + 175, 176, 177, 138, 140, nil, nil, 139, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 171, nil, 166, + 148, 149, 150, 157, 154, 156, nil, nil, 151, 152, + nil, nil, nil, 172, 173, 158, 159, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 163, 162, nil, 147, 169, 165, 164, 160, 161, 155, + 153, 145, 168, 146, nil, nil, 174, nil, nil, nil, + nil, 455, 459, nil, nil, 456, nil, nil, nil, nil, + nil, nil, nil, nil, 170, 171, 167, 166, 148, 149, + 150, 157, 154, 156, nil, nil, 151, 152, nil, nil, + nil, 172, 173, 158, 159, nil, nil, nil, nil, nil, + 278, nil, nil, nil, nil, nil, nil, nil, 163, 162, + nil, 147, 169, 165, 164, 160, 161, 155, 153, 145, + 168, 146, nil, nil, 174, nil, nil, nil, nil, 462, + 466, nil, nil, 461, nil, nil, nil, nil, nil, nil, + nil, nil, 170, 171, 167, 166, 148, 149, 150, 157, + 154, 156, nil, nil, 151, 152, nil, nil, nil, 172, + 173, 158, 159, nil, nil, nil, nil, nil, 278, nil, + nil, nil, nil, nil, nil, nil, 163, 162, nil, 147, + 169, 165, 164, 160, 161, 155, 153, 145, 168, 146, + nil, nil, 174, nil, nil, nil, nil, 507, 459, nil, + nil, 508, nil, nil, nil, nil, nil, nil, nil, nil, + 170, 171, 167, 166, 148, 149, 150, 157, 154, 156, + nil, nil, 151, 152, nil, nil, nil, 172, 173, 158, + 159, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 163, 162, nil, 147, 169, 165, + 164, 160, 161, 155, 153, 145, 168, 146, nil, nil, + 174, nil, nil, nil, nil, 681, 459, nil, nil, 682, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 171, + 167, 166, 148, 149, 150, 157, 154, 156, nil, nil, + 151, 152, nil, nil, nil, 172, 173, 158, 159, nil, + nil, nil, nil, nil, 278, nil, nil, nil, nil, nil, + nil, nil, 163, 162, nil, 147, 169, 165, 164, 160, + 161, 155, 153, 145, 168, 146, nil, nil, 174, nil, + nil, nil, nil, 683, 466, nil, nil, 684, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 171, 167, 166, + 148, 149, 150, 157, 154, 156, nil, nil, 151, 152, + nil, nil, nil, 172, 173, 158, 159, nil, nil, nil, + nil, nil, 278, nil, nil, nil, nil, nil, nil, nil, + 163, 162, nil, 147, 169, 165, 164, 160, 161, 155, + 153, 145, 168, 146, nil, nil, 174, nil, nil, nil, + nil, 710, 459, nil, nil, 711, nil, nil, nil, nil, + nil, nil, nil, nil, 170, 171, 167, 166, 148, 149, + 150, 157, 154, 156, nil, nil, 151, 152, nil, nil, + nil, 172, 173, 158, 159, nil, nil, nil, nil, nil, + 278, nil, nil, nil, nil, nil, nil, nil, 163, 162, + nil, 147, 169, 165, 164, 160, 161, 155, 153, 145, + 168, 146, nil, nil, 174, nil, nil, nil, nil, 713, + 466, nil, nil, 714, nil, nil, nil, nil, nil, nil, + nil, nil, 170, 171, 167, 166, 148, 149, 150, 157, + 154, 156, nil, nil, 151, 152, nil, nil, nil, 172, + 173, 158, 159, nil, nil, nil, nil, nil, 278, nil, + nil, nil, nil, nil, nil, nil, 163, 162, nil, 147, + 169, 165, 164, 160, 161, 155, 153, 145, 168, 146, + nil, nil, 174, nil, nil, nil, nil, 681, 459, nil, + nil, 682, nil, nil, nil, nil, nil, nil, nil, nil, + 170, 171, 167, 166, 148, 149, 150, 157, 154, 156, + nil, nil, 151, 152, nil, nil, nil, 172, 173, 158, + 159, nil, nil, nil, nil, nil, 278, nil, nil, nil, + nil, nil, nil, nil, 163, 162, nil, 147, 169, 165, + 164, 160, 161, 155, 153, 145, 168, 146, nil, nil, + 174, nil, nil, nil, nil, 683, 466, nil, nil, 684, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 171, + 167, 166, 148, 149, 150, 157, 154, 156, nil, nil, + 151, 152, nil, nil, nil, 172, 173, 158, 159, nil, + nil, nil, nil, nil, 278, nil, nil, nil, nil, nil, + nil, nil, 163, 162, nil, 147, 169, 165, 164, 160, + 161, 155, 153, 145, 168, 146, nil, nil, 174, nil, + nil, nil, nil, 748, 459, nil, nil, 749, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 171, 167, 166, + 148, 149, 150, 157, 154, 156, nil, nil, 151, 152, + nil, nil, nil, 172, 173, 158, 159, nil, nil, nil, + nil, nil, 278, nil, nil, nil, nil, nil, nil, nil, + 163, 162, nil, 147, 169, 165, 164, 160, 161, 155, + 153, 145, 168, 146, nil, nil, 174, nil, nil, nil, + nil, 750, 466, nil, nil, 751, nil, nil, nil, nil, + nil, nil, nil, nil, 170, 171, 167, 166, 148, 149, + 150, 157, 154, 156, nil, nil, 151, 152, nil, nil, + nil, 172, 173, 158, 159, nil, nil, nil, nil, nil, + 278, nil, nil, nil, nil, nil, nil, nil, 163, 162, + nil, 147, 169, 165, 164, 160, 161, 155, 153, 145, + 168, 146, nil, nil, 174, nil, nil, nil, nil, 753, + 466, nil, nil, 754, nil, nil, nil, nil, nil, nil, + nil, nil, 170, 171, 167, 166, 148, 149, 150, 157, + 154, 156, nil, nil, 151, 152, nil, nil, nil, 172, + 173, 158, 159, nil, nil, nil, nil, nil, 278, nil, + nil, nil, nil, nil, nil, nil, 163, 162, nil, 147, + 169, 165, 164, 160, 161, 155, 153, 145, 168, 146, + nil, nil, 174, nil, nil, nil, nil, 507, 459, nil, + nil, 508, nil, nil, nil, nil, nil, nil, nil, nil, + 170, 171, 167, 166, 148, 149, 150, 157, 154, 156, + nil, nil, 151, 152, nil, nil, nil, 172, 173, 158, + 159, nil, nil, nil, nil, nil, 278, nil, nil, nil, + nil, nil, nil, nil, 163, 162, nil, 147, 169, 165, + 164, 160, 161, 155, 153, 145, 168, 146, nil, nil, + 174, nil, nil, nil, nil, 803, 459, nil, nil, 804, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 171, + 167, 166, 148, 149, 150, 157, 154, 156, nil, nil, + 151, 152, nil, nil, nil, 172, 173, 158, 159, nil, + nil, nil, nil, nil, 278, nil, nil, nil, nil, nil, + nil, nil, 163, 162, nil, 147, 169, 165, 164, 160, + 161, 155, 153, 145, 168, 146, nil, nil, 174, nil, + nil, nil, nil, 806, 466, nil, nil, 805, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 171, 167, 166, + 148, 149, 150, 157, 154, 156, nil, nil, 151, 152, + nil, nil, nil, 172, 173, 158, 159, nil, nil, nil, + nil, nil, 278, nil, nil, nil, nil, nil, nil, nil, + 163, 162, nil, 147, 169, 165, 164, 160, 161, 155, + 153, 145, 168, 146, nil, 924, 174, 612, 611, 610, + 925, 613, 924, nil, 612, 611, 610, 925, 613, nil, + nil, 621, nil, nil, nil, nil, 167, nil, 621, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 617, nil, nil, nil, nil, nil, nil, + 617, nil, 626, 625, 629, 628, nil, nil, nil, 626, + 625, 629, 628, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1058, 466, nil, nil, 1057, nil, nil, nil, 622, nil, + nil, nil, nil, 170, 171, 622, 166, 148, 149, 150, + 157, 154, 156, nil, nil, 151, 152, nil, nil, nil, + 172, 173, 158, 159, nil, nil, nil, nil, nil, 278, + nil, nil, nil, nil, nil, nil, nil, 163, 162, nil, + 147, 169, 165, 164, 160, 161, 155, 153, 145, 168, + 146, nil, nil, 174, nil, nil, nil, nil, 1061, 459, + nil, nil, 1062, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 171, 167, 166, 148, 149, 150, 157, 154, + 156, nil, nil, 151, 152, nil, nil, nil, 172, 173, + 158, 159, nil, nil, nil, nil, nil, 278, nil, nil, + nil, nil, nil, nil, nil, 163, 162, nil, 147, 169, + 165, 164, 160, 161, 155, 153, 145, 168, 146, nil, + nil, 174, nil, nil, nil, nil, 1063, 466, nil, nil, + 1064, nil, nil, nil, nil, nil, nil, nil, nil, 170, + 171, 167, 166, 148, 149, 150, 157, 154, 156, nil, + nil, 151, 152, nil, nil, nil, 172, 173, 158, 159, + nil, nil, nil, nil, nil, 278, nil, nil, nil, nil, + nil, nil, nil, 163, 162, nil, 147, 169, 165, 164, + 160, 161, 155, 153, 145, 168, 146, nil, 924, 174, + 612, 611, 610, 925, 613, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 621, nil, nil, nil, nil, 167, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 617, nil, nil, nil, + nil, nil, nil, nil, nil, 626, 625, 629, 628, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 622 ] + +racc_action_check = [ + 109, 2, 2, 2, 2, 2, 2, 109, 109, 109, + 2, 2, 109, 109, 109, 2, 109, 2, 2, 2, + 2, 2, 2, 2, 109, 349, 109, 109, 109, 2, + 2, 2, 2, 2, 2, 2, 109, 109, 2, 109, + 109, 109, 109, 109, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 688, 2, 2, 2, + 357, 2, 2, 358, 2, 2, 2, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 350, 710, 109, 109, 109, 2, 109, 109, 2, + 688, 109, 2, 2, 109, 109, 2, 109, 2, 109, + 1, 109, 2, 109, 109, 109, 109, 109, 109, 109, + 2, 109, 65, 109, 3, 2, 2, 2, 2, 2, + 2, 361, 582, 404, 2, 2, 109, 109, 109, 109, + 933, 109, 2, 109, 112, 2, 2, 2, 109, 349, + 109, 112, 112, 112, 349, 938, 112, 112, 112, 710, + 112, 572, 866, 748, 17, 17, 471, 471, 112, 1061, + 112, 112, 112, 721, 721, 357, 1062, 29, 358, 1073, + 112, 112, 1063, 112, 112, 112, 112, 112, 44, 44, + 765, 765, 705, 234, 710, 711, 404, 710, 749, 750, + 766, 751, 867, 705, 22, 350, 329, 329, 710, 65, + 350, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 690, 407, 112, 112, 112, + 367, 112, 112, 13, 367, 112, 361, 582, 112, 112, + 22, 112, 29, 112, 324, 112, 234, 112, 112, 112, + 112, 112, 112, 112, 933, 112, 471, 112, 15, 933, + 1063, 572, 711, 721, 29, 750, 572, 751, 748, 938, + 112, 112, 112, 112, 938, 112, 866, 112, 461, 866, + 765, 866, 112, 1061, 112, 461, 461, 461, 1061, 407, + 1062, 461, 461, 1073, 461, 1062, 1063, 711, 1073, 836, + 711, 1063, 92, 749, 750, 766, 751, 867, 16, 324, + 92, 711, 690, 235, 461, 461, 27, 461, 461, 461, + 461, 461, 19, 27, 722, 20, 998, 237, 998, 19, + 722, 324, 642, 836, 376, 439, 391, 477, 19, 681, + 18, 376, 25, 365, 40, 461, 461, 461, 461, 461, + 461, 461, 461, 461, 461, 461, 461, 461, 461, 348, + 348, 461, 461, 461, 366, 461, 235, 20, 41, 461, + 593, 593, 461, 682, 803, 713, 393, 461, 20, 461, + 237, 461, 461, 461, 461, 461, 461, 461, 439, 461, + 477, 461, 681, 642, 642, 398, 365, 391, 391, 391, + 753, 841, 642, 365, 461, 461, 462, 461, 365, 461, + 41, 804, 365, 462, 462, 462, 461, 366, 461, 462, + 462, 41, 462, 768, 366, 377, 682, 803, 713, 366, + 365, 462, 377, 366, 768, 713, 43, 393, 393, 393, + 713, 401, 462, 462, 713, 462, 462, 462, 462, 462, + 49, 366, 99, 753, 841, 825, 398, 398, 398, 645, + 753, 841, 713, 909, 804, 753, 137, 768, 768, 753, + 841, 137, 137, 462, 462, 462, 462, 462, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 753, 841, 462, + 462, 462, 378, 462, 100, 561, 409, 462, 561, 378, + 462, 768, 401, 401, 401, 462, 101, 462, 825, 462, + 462, 462, 462, 462, 462, 462, 909, 462, 462, 462, + 645, 645, 389, 50, 389, 389, 389, 389, 389, 645, + 50, 395, 462, 462, 395, 462, 42, 462, 389, 50, + 683, 736, 736, 379, 462, 333, 462, 683, 683, 683, + 379, 971, 683, 683, 683, 102, 683, 409, 409, 409, + 389, 389, 971, 771, 771, 683, 683, 683, 683, 389, + 389, 389, 389, 1032, 1032, 135, 683, 683, 42, 683, + 683, 683, 683, 683, 380, 562, 216, 333, 562, 42, + 381, 380, 395, 395, 382, 971, 971, 381, 333, 236, + 898, 382, 898, 898, 898, 389, 898, 683, 683, 683, + 683, 683, 683, 683, 683, 683, 683, 683, 683, 683, + 683, 238, 455, 683, 683, 683, 383, 683, 683, 971, + 239, 683, 243, 383, 683, 683, 277, 683, 898, 683, + 292, 683, 456, 683, 683, 683, 683, 683, 683, 683, + 384, 683, 683, 683, 665, 293, 601, 384, 601, 601, + 601, 601, 601, 233, 455, 296, 683, 683, 683, 683, + 233, 683, 601, 683, 684, 455, 309, 311, 683, 233, + 683, 684, 684, 684, 456, 312, 684, 684, 684, 313, + 684, 319, 316, 322, 601, 456, 665, 323, 498, 316, + 684, 684, 684, 601, 601, 601, 601, 665, 316, 328, + 684, 684, 386, 684, 684, 684, 684, 684, 1011, 386, + 1011, 1011, 1011, 566, 1011, 617, 566, 617, 617, 617, + 498, 617, 330, 5, 498, 498, 498, 498, 5, 601, + 334, 684, 684, 684, 684, 684, 684, 684, 684, 684, + 684, 684, 684, 684, 684, 335, 1011, 684, 684, 684, + 317, 684, 684, 617, 338, 684, 344, 317, 684, 684, + 355, 684, 617, 684, 483, 684, 317, 684, 684, 684, + 684, 684, 684, 684, 303, 684, 356, 684, 762, 303, + 762, 762, 762, 762, 762, 360, 362, 371, 47, 47, + 684, 684, 684, 684, 762, 684, 483, 684, 805, 397, + 483, 483, 684, 354, 684, 805, 805, 805, 354, 400, + 403, 805, 805, 318, 805, 780, 762, 780, 780, 780, + 318, 780, 484, 47, 47, 762, 762, 762, 762, 318, + 854, 759, 406, 854, 805, 805, 759, 805, 805, 805, + 805, 805, 871, 429, 320, 431, 897, 871, 897, 897, + 897, 320, 897, 780, 484, 434, 436, 450, 484, 484, + 320, 762, 780, 453, 454, 805, 805, 805, 805, 805, + 805, 805, 805, 805, 805, 805, 805, 805, 805, 336, + 499, 805, 805, 805, 897, 805, 336, 1003, 463, 805, + 1003, 876, 805, 897, 473, 336, 876, 805, 485, 805, + 486, 805, 805, 805, 805, 805, 805, 805, 487, 805, + 488, 805, 499, 504, 359, 369, 499, 499, 499, 499, + 511, 359, 369, 515, 805, 805, 806, 805, 530, 805, + 359, 369, 531, 806, 806, 806, 805, 532, 805, 806, + 806, 763, 806, 763, 763, 763, 763, 763, 438, 535, + 784, 806, 784, 784, 784, 438, 784, 763, 537, 542, + 546, 556, 806, 806, 438, 806, 806, 806, 806, 806, + 1012, 541, 1012, 1012, 1012, 557, 1012, 558, 541, 763, + 791, 791, 563, 564, 791, 791, 791, 541, 763, 763, + 763, 763, 567, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 585, 1012, 806, + 806, 806, 984, 806, 585, 569, 573, 806, 574, 984, + 806, 575, 576, 585, 763, 806, 595, 806, 984, 806, + 806, 806, 806, 806, 806, 806, 603, 806, 806, 806, + 604, 606, 772, 989, 772, 772, 772, 772, 772, 714, + 989, 607, 806, 806, 608, 806, 714, 806, 772, 989, + 30, 714, 615, 754, 806, 714, 806, 30, 30, 30, + 754, 623, 30, 30, 30, 754, 30, 503, 627, 754, + 772, 630, 649, 652, 658, 30, 30, 30, 990, 772, + 772, 772, 772, 503, 503, 990, 30, 30, 666, 30, + 30, 30, 30, 30, 990, 671, 677, 685, 686, 503, + 991, 503, 689, 503, 503, 503, 503, 991, 693, 503, + 695, 503, 697, 699, 707, 772, 991, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 709, 993, 30, 30, 30, 1023, 712, 30, 993, + 30, 30, 715, 1023, 30, 30, 716, 30, 993, 30, + 719, 30, 1023, 30, 30, 30, 30, 30, 30, 30, + 720, 30, 30, 30, 1031, 738, 954, 744, 954, 954, + 954, 1031, 954, 747, 756, 760, 30, 30, 31, 30, + 1031, 30, 767, 782, 783, 31, 31, 31, 30, 786, + 31, 31, 31, 774, 31, 774, 774, 774, 774, 774, + 1064, 798, 800, 802, 31, 31, 810, 1064, 834, 774, + 840, 850, 1064, 851, 31, 31, 1064, 31, 31, 31, + 31, 31, 1040, 855, 1040, 1040, 1040, 861, 1040, 868, + 870, 774, 9, 9, 9, 9, 9, 874, 875, 882, + 774, 774, 774, 774, 883, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 884, + 888, 31, 31, 31, 889, 891, 31, 892, 31, 31, + 894, 896, 31, 31, 906, 31, 774, 31, 908, 31, + 915, 31, 31, 31, 31, 31, 31, 31, 916, 31, + 918, 31, 307, 307, 307, 307, 307, 343, 343, 343, + 343, 343, 919, 920, 31, 31, 60, 31, 922, 31, + 923, 924, 951, 60, 60, 60, 31, 952, 60, 60, + 60, 776, 60, 776, 776, 776, 776, 776, 953, 968, + 969, 982, 60, 60, 60, 985, 987, 776, 992, 999, + 1007, 1008, 60, 60, 1009, 60, 60, 60, 60, 60, + 529, 529, 529, 529, 529, 1010, 1013, 1016, 1017, 776, + 1018, 1019, 1021, 1027, 1038, 1046, 1057, 1058, 1060, 1068, + 776, 776, 1069, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 1070, 1071, 60, + 60, 60, 1072, 1080, 60, nil, nil, 60, nil, nil, + 60, 60, nil, 60, 776, 60, nil, 60, nil, 60, + 60, 60, 60, 60, 60, 60, nil, 60, nil, 60, + 829, nil, 829, 829, 829, 829, 829, nil, nil, nil, + nil, nil, 60, 60, 60, 60, 829, 60, 457, 60, + nil, nil, nil, nil, 60, 457, 457, 457, nil, nil, + 457, 457, 457, nil, 457, 553, nil, nil, 829, nil, + nil, nil, nil, 457, 457, 457, nil, 829, 829, 829, + 829, 553, 553, nil, 457, 457, nil, 457, 457, 457, + 457, 457, nil, nil, nil, nil, nil, 553, nil, 553, + nil, 553, 553, 553, 553, 829, nil, 553, nil, 553, + nil, nil, nil, 829, nil, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 457, 457, nil, + nil, 457, 457, 457, nil, nil, 457, nil, 457, 457, + nil, nil, 457, 457, nil, 457, nil, 457, nil, 457, + nil, 457, 457, 457, 457, 457, 457, 457, nil, 457, + 457, 457, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 457, 457, 466, 457, nil, 457, + nil, nil, nil, 466, 466, 466, 457, nil, 466, 466, + 466, 957, 466, 957, 957, 957, 957, 957, nil, nil, + nil, 466, 466, 466, 466, nil, nil, 957, nil, nil, + nil, nil, 466, 466, nil, 466, 466, 466, 466, 466, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 957, + nil, nil, nil, nil, nil, nil, nil, nil, 957, 957, + 957, 957, nil, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 466, 466, 466, 466, 466, nil, nil, 466, + 466, 466, nil, nil, 466, nil, nil, 466, nil, nil, + 466, 466, nil, 466, 957, 466, nil, 466, nil, 466, + 466, 466, 466, 466, 466, 466, nil, 466, 466, 466, + 959, nil, 959, 959, 959, 959, 959, nil, nil, nil, + nil, nil, 466, 466, 466, 466, 959, 466, 467, 466, + nil, nil, nil, nil, 466, 467, 467, 467, nil, nil, + 467, 467, 467, nil, 467, 489, nil, nil, 959, nil, + nil, nil, nil, 467, 467, 467, 467, nil, nil, 959, + 959, 489, 489, nil, 467, 467, nil, 467, 467, 467, + 467, 467, nil, nil, nil, nil, nil, 489, nil, 489, + nil, 489, 489, 489, 489, nil, nil, nil, nil, nil, + nil, nil, nil, 959, nil, 467, 467, 467, 467, 467, + 467, 467, 467, 467, 467, 467, 467, 467, 467, nil, + nil, 467, 467, 467, nil, nil, 467, nil, nil, 467, + nil, nil, 467, 467, nil, 467, nil, 467, nil, 467, + nil, 467, 467, 467, 467, 467, 467, 467, nil, 467, + 467, 467, 961, nil, 961, 961, 961, 961, 961, nil, + nil, nil, nil, nil, 467, 467, 467, 467, 961, 467, + 506, 467, nil, nil, nil, nil, 467, 506, 506, 506, + nil, nil, 506, 506, 506, nil, 506, nil, nil, nil, + 961, nil, nil, nil, nil, 506, 506, nil, nil, nil, + nil, 961, 961, nil, nil, nil, 506, 506, nil, 506, + 506, 506, 506, 506, 963, nil, 963, 963, 963, 963, + 963, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 963, nil, nil, nil, nil, 961, nil, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 481, 506, 481, + 481, nil, 963, 481, 481, 506, nil, nil, nil, nil, + 506, 506, nil, 963, 963, nil, nil, nil, nil, 481, + nil, 481, nil, 481, 481, 481, 481, 481, 481, 481, + nil, 481, 506, 506, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 506, 963, nil, nil, + nil, 506, 36, 36, 36, 36, 36, 36, 506, nil, + nil, 36, 36, nil, nil, nil, 36, nil, 36, 36, + 36, 36, 36, 36, 36, nil, nil, nil, nil, nil, + 36, 36, 36, 36, 36, 36, 36, nil, nil, 36, + nil, nil, nil, nil, 443, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, nil, 36, 36, + 36, nil, 36, 36, nil, 36, 36, 36, 443, 443, + 443, 443, 443, 443, 443, 443, 443, 443, 443, nil, + 443, 443, nil, nil, 443, 443, nil, 36, nil, nil, + 36, nil, nil, 36, 36, nil, nil, 36, nil, 36, + 443, nil, 443, 36, 443, 443, 443, 443, 443, 443, + 443, 36, 443, nil, nil, nil, 36, 36, 36, 36, + 36, 36, nil, nil, nil, 36, 36, nil, 443, nil, + 443, nil, nil, 36, nil, nil, 36, 36, 36, 218, + 218, 218, 218, 218, 218, nil, nil, nil, 218, 218, + nil, nil, nil, 218, nil, 218, 218, 218, 218, 218, + 218, 218, nil, nil, nil, nil, nil, 218, 218, 218, + 218, 218, 218, 218, nil, nil, 218, nil, nil, nil, + nil, 449, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 218, 218, 218, nil, 218, 218, 218, nil, 218, + 218, nil, 218, 218, 218, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, nil, 449, 449, nil, + nil, 449, 449, nil, 218, nil, nil, 218, nil, nil, + 218, 218, nil, nil, 218, nil, 218, 449, nil, 449, + 218, 449, 449, 449, 449, 449, 449, 449, 218, 449, + nil, nil, nil, 218, 218, 218, 218, 218, 218, nil, + nil, nil, 218, 218, nil, 449, nil, nil, nil, nil, + 218, nil, nil, 218, 218, 218, 242, 242, 242, 242, + 242, 242, nil, nil, nil, 242, 242, nil, nil, nil, + 242, nil, 242, 242, 242, 242, 242, 242, 242, nil, + nil, nil, nil, nil, 242, 242, 242, 242, 242, 242, + 242, nil, nil, 242, nil, nil, nil, nil, nil, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, nil, 242, 242, 242, nil, 242, 242, nil, 242, + 242, 242, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, nil, 24, 24, nil, nil, 24, 24, + nil, 242, nil, nil, 242, nil, nil, 242, 242, nil, + nil, 242, nil, 242, 24, nil, 24, 242, 24, 24, + 24, 24, 24, 24, 24, 242, 24, nil, nil, nil, + 242, 242, 242, 242, 242, 242, nil, nil, nil, 242, + 242, nil, 24, nil, nil, nil, nil, 242, nil, nil, + 242, 242, 242, 310, 310, 310, 310, 310, 310, nil, + nil, nil, 310, 310, nil, nil, nil, 310, nil, 310, + 310, 310, 310, 310, 310, 310, nil, nil, nil, nil, + nil, 310, 310, 310, 310, 310, 310, 310, nil, nil, + 310, nil, nil, nil, nil, nil, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, nil, 310, + 310, 310, nil, 310, 310, nil, 310, 310, 310, 290, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + nil, 290, 290, nil, nil, 290, 290, nil, 310, nil, + nil, 310, nil, nil, 310, 310, nil, nil, 310, nil, + 310, 290, nil, 290, 310, 290, 290, 290, 290, 290, + 290, 290, 310, 290, nil, nil, nil, 310, 310, 310, + 310, 310, 310, nil, nil, nil, 310, 310, nil, 290, + nil, nil, nil, nil, 310, nil, nil, 310, 310, 310, + 315, 315, 315, 315, 315, 315, nil, nil, nil, 315, + 315, nil, nil, nil, 315, nil, 315, 315, 315, 315, + 315, 315, 315, nil, nil, nil, nil, nil, 315, 315, + 315, 315, 315, 315, 315, nil, nil, 315, nil, nil, + nil, nil, nil, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 315, 315, nil, 315, 315, 315, nil, + 315, 315, nil, 315, 315, 315, 502, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, nil, 502, 502, + nil, nil, 502, 502, nil, 315, nil, nil, 315, nil, + nil, 315, 315, nil, nil, 315, nil, 315, 502, nil, + 502, 315, 502, 502, 502, 502, 502, 502, 502, 315, + 502, nil, nil, nil, 315, 315, 315, 315, 315, 315, + nil, nil, nil, 315, 315, 502, 502, nil, nil, nil, + nil, 315, nil, nil, 315, 315, 315, 342, 342, 342, + 342, 342, 342, nil, nil, nil, 342, 342, nil, nil, + nil, 342, nil, 342, 342, 342, 342, 342, 342, 342, + nil, nil, nil, nil, nil, 342, 342, 342, 342, 342, + 342, 342, nil, nil, 342, nil, nil, nil, nil, nil, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, nil, 342, 342, 342, nil, 342, 342, nil, + 342, 342, 342, 554, 554, 554, 554, 554, 554, 554, + 554, 554, 554, 554, nil, 554, 554, nil, nil, 554, + 554, nil, 342, nil, nil, 342, nil, nil, 342, 342, + nil, nil, 342, nil, 342, 554, nil, 554, 342, 554, + 554, 554, 554, 554, 554, 554, 342, 554, nil, nil, + nil, 342, 342, 342, 342, 342, 342, nil, nil, nil, + 342, 342, nil, 554, nil, nil, nil, nil, 342, nil, + nil, 342, 342, 342, 352, 352, 352, 352, 352, 352, + nil, nil, nil, 352, 352, nil, nil, nil, 352, nil, + 352, 352, 352, 352, 352, 352, 352, nil, nil, nil, + nil, nil, 352, 352, 352, 352, 352, 352, 352, nil, + nil, 352, nil, nil, nil, nil, nil, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, 352, nil, + 352, 352, 352, nil, 352, 352, nil, 352, 352, 352, + 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, + 807, nil, 807, 807, nil, nil, 807, 807, nil, 352, + nil, nil, 352, nil, nil, 352, 352, nil, nil, 352, + nil, 352, 807, nil, 807, 352, 807, 807, 807, 807, + 807, 807, 807, 352, 807, nil, nil, nil, 352, 352, + 352, 352, 352, 352, nil, nil, nil, 352, 352, nil, + 807, nil, nil, nil, nil, 352, nil, nil, 352, 352, + 352, 353, 353, 353, 353, 353, 353, nil, nil, nil, + 353, 353, nil, nil, nil, 353, nil, 353, 353, 353, + 353, 353, 353, 353, nil, nil, nil, nil, nil, 353, + 353, 353, 353, 353, 353, 353, nil, nil, 353, nil, + nil, nil, nil, nil, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 353, 353, nil, 353, 353, 353, + nil, 353, 353, nil, 353, 353, 353, 914, 914, 914, + 914, 914, 914, 914, 914, 914, 914, 914, nil, 914, + 914, nil, nil, 914, 914, nil, 353, nil, nil, 353, + nil, nil, 353, 353, nil, nil, 353, nil, 353, 914, + nil, 914, 353, 914, 914, 914, 914, 914, 914, 914, + 353, 914, nil, nil, nil, 353, 353, 353, 353, 353, + 353, nil, nil, nil, 353, 353, nil, 914, nil, nil, + nil, nil, 353, nil, nil, 353, 353, 353, 568, 568, + 568, 568, 568, 568, nil, nil, nil, 568, 568, nil, + nil, nil, 568, nil, 568, 568, 568, 568, 568, 568, + 568, nil, nil, nil, nil, nil, 568, 568, 568, 568, + 568, 568, 568, nil, nil, 568, nil, nil, nil, nil, + nil, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, nil, 568, 568, 568, nil, 568, 568, + nil, 568, 568, 568, 482, 482, 482, 482, 482, 482, + 482, 482, 482, 482, 482, nil, 482, 482, nil, nil, + 482, 482, nil, 568, nil, nil, 568, nil, nil, 568, + 568, nil, nil, 568, nil, 568, 482, nil, 482, 568, + 482, 482, 482, 482, 482, 482, 482, 568, 482, nil, + nil, nil, 568, 568, 568, 568, 568, 568, nil, nil, + nil, 568, 568, nil, nil, nil, nil, nil, nil, 568, + nil, nil, 568, 568, 568, 571, 571, 571, 571, 571, + 571, nil, nil, nil, 571, 571, nil, nil, nil, 571, + nil, 571, 571, 571, 571, 571, 571, 571, nil, nil, + nil, nil, nil, 571, 571, 571, 571, 571, 571, 571, + nil, nil, 571, nil, nil, nil, nil, nil, 571, 571, + 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, + nil, 571, 571, 571, nil, 571, 571, nil, 571, 571, + 571, 492, 492, 492, 492, 492, 492, 492, nil, nil, + 492, 492, nil, nil, nil, nil, nil, 492, 492, nil, + 571, nil, nil, 571, nil, nil, 571, 571, nil, nil, + 571, nil, 571, 492, nil, 492, 571, 492, 492, 492, + 492, 492, 492, 492, 571, 492, nil, nil, nil, 571, + 571, 571, 571, 571, 571, nil, nil, nil, 571, 571, + nil, nil, nil, nil, nil, nil, 571, nil, nil, 571, + 571, 571, 594, 594, 594, 594, 594, 594, nil, nil, + nil, 594, 594, nil, nil, nil, 594, nil, 594, 594, + 594, 594, 594, 594, 594, nil, nil, nil, nil, nil, + 594, 594, 594, 594, 594, 594, 594, nil, nil, 594, + nil, nil, nil, nil, nil, 594, 594, 594, 594, 594, + 594, 594, 594, 594, 594, 594, 594, nil, 594, 594, + 594, nil, 594, 594, nil, 594, 594, 594, 493, 493, + 493, 493, 493, 493, 493, nil, nil, 493, 493, nil, + nil, nil, nil, nil, 493, 493, nil, 594, nil, nil, + 594, nil, nil, 594, 594, nil, nil, 594, nil, 594, + 493, nil, 493, 594, 493, 493, 493, 493, 493, 493, + 493, 594, 493, nil, nil, nil, 594, 594, 594, 594, + 594, 594, nil, nil, nil, 594, 594, nil, nil, nil, + nil, nil, nil, 594, nil, nil, 594, 594, 594, 654, + 654, 654, 654, 654, 654, nil, nil, nil, 654, 654, + nil, nil, nil, 654, nil, 654, 654, 654, 654, 654, + 654, 654, nil, nil, nil, nil, nil, 654, 654, 654, + 654, 654, 654, 654, nil, nil, 654, nil, nil, nil, + nil, nil, 654, 654, 654, 654, 654, 654, 654, 654, + 654, 654, 654, 654, nil, 654, 654, 654, nil, 654, + 654, nil, 654, 654, 654, 494, 494, 494, 494, 494, + 494, 494, nil, nil, 494, 494, nil, nil, nil, nil, + nil, 494, 494, nil, 654, nil, nil, 654, nil, nil, + 654, 654, nil, nil, 654, nil, 654, 494, nil, 494, + 654, 494, 494, 494, 494, 494, 494, 494, 654, 494, + nil, nil, nil, 654, 654, 654, 654, 654, 654, nil, + nil, nil, 654, 654, nil, nil, nil, nil, nil, nil, + 654, nil, nil, 654, 654, 654, 752, 752, 752, 752, + 752, 752, nil, nil, nil, 752, 752, nil, nil, nil, + 752, nil, 752, 752, 752, 752, 752, 752, 752, nil, + nil, nil, nil, nil, 752, 752, 752, 752, 752, 752, + 752, nil, nil, 752, nil, nil, nil, nil, nil, 752, + 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, + 752, nil, 752, 752, 752, nil, 752, 752, nil, 752, + 752, 752, 495, 495, 495, 495, 495, 495, 495, nil, + nil, 495, 495, nil, nil, nil, nil, nil, 495, 495, + nil, 752, nil, nil, 752, nil, nil, 752, 752, nil, + nil, 752, nil, 752, 495, nil, 495, 752, 495, 495, + 495, 495, 495, 495, 495, 752, 495, nil, nil, nil, + 752, 752, 752, 752, 752, 752, nil, nil, nil, 752, + 752, nil, nil, nil, nil, nil, nil, 752, nil, nil, + 752, 752, 752, 757, 757, 757, 757, 757, 757, nil, + nil, nil, 757, 757, nil, nil, nil, 757, nil, 757, + 757, 757, 757, 757, 757, 757, nil, nil, nil, nil, + nil, 757, 757, 757, 757, 757, 757, 757, nil, nil, + 757, nil, nil, nil, nil, nil, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 757, nil, 757, + 757, 757, nil, 757, 757, nil, 757, 757, 757, 496, + 496, 496, 496, 496, 496, 496, nil, nil, 496, 496, + nil, nil, nil, nil, nil, 496, 496, nil, 757, nil, + nil, 757, nil, nil, 757, 757, nil, nil, 757, nil, + 757, 496, nil, 496, 757, 496, 496, 496, 496, 496, + 496, 496, 757, 496, nil, nil, nil, 757, 757, 757, + 757, 757, 757, nil, nil, nil, 757, 757, nil, nil, + nil, nil, nil, nil, 757, nil, nil, 757, 757, 757, + 761, 761, 761, 761, 761, 761, nil, nil, nil, 761, + 761, nil, nil, nil, 761, nil, 761, 761, 761, 761, + 761, 761, 761, nil, nil, nil, nil, nil, 761, 761, + 761, 761, 761, 761, 761, nil, nil, 761, nil, nil, + nil, nil, nil, 761, 761, 761, 761, 761, 761, 761, + 761, 761, 761, 761, 761, nil, 761, 761, 761, nil, + 761, 761, nil, 761, 761, 761, 497, 497, 497, 497, + 497, 497, 497, nil, nil, 497, 497, nil, nil, nil, + nil, nil, 497, 497, nil, 761, nil, nil, 761, nil, + nil, 761, 761, nil, nil, 761, nil, 761, 497, nil, + 497, 761, 497, 497, 497, 497, 497, 497, 497, 761, + 497, nil, nil, nil, 761, 761, 761, 761, 761, 761, + nil, nil, nil, 761, 761, nil, nil, nil, nil, nil, + nil, 761, nil, nil, 761, 761, 761, 792, 792, 792, + 792, 792, 792, nil, nil, nil, 792, 792, nil, nil, + nil, 792, nil, 792, 792, 792, 792, 792, 792, 792, + nil, nil, nil, nil, nil, 792, 792, 792, 792, 792, + 792, 792, nil, nil, 792, nil, nil, nil, nil, nil, + 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, + 792, 792, nil, 792, 792, 792, nil, 792, 792, nil, + 792, 792, 792, 500, 500, 500, 500, 500, 500, 500, + nil, nil, 500, 500, nil, nil, nil, nil, nil, 500, + 500, nil, 792, nil, nil, 792, nil, nil, 792, 792, + nil, nil, 792, nil, 792, 500, nil, 500, 792, 500, + 500, 500, 500, 500, 500, 500, 792, 500, nil, nil, + nil, 792, 792, 792, 792, 792, 792, nil, nil, nil, + 792, 792, nil, nil, nil, nil, nil, nil, 792, nil, + nil, 792, 792, 792, 831, 831, 831, 831, 831, 831, + nil, nil, nil, 831, 831, nil, nil, nil, 831, nil, + 831, 831, 831, 831, 831, 831, 831, nil, nil, nil, + nil, nil, 831, 831, 831, 831, 831, 831, 831, nil, + nil, 831, nil, nil, nil, nil, nil, 831, 831, 831, + 831, 831, 831, 831, 831, 831, 831, 831, 831, nil, + 831, 831, 831, nil, 831, 831, nil, 831, 831, 831, + 501, 501, 501, 501, 501, 501, 501, 501, nil, 501, + 501, nil, nil, nil, nil, nil, 501, 501, nil, 831, + nil, nil, 831, nil, nil, 831, 831, nil, nil, 831, + nil, 831, 501, nil, 501, 831, 501, 501, 501, 501, + 501, 501, 501, 831, 501, nil, nil, nil, 831, 831, + 831, 831, 831, 831, nil, nil, nil, 831, 831, nil, + nil, nil, nil, nil, nil, 831, nil, nil, 831, 831, + 831, 848, 848, 848, 848, 848, 848, nil, nil, nil, + 848, 848, nil, nil, nil, 848, nil, 848, 848, 848, + 848, 848, 848, 848, nil, nil, nil, nil, nil, 848, + 848, 848, 848, 848, 848, 848, nil, nil, 848, nil, + nil, nil, nil, nil, 848, 848, 848, 848, 848, 848, + 848, 848, 848, 848, 848, 848, nil, 848, 848, 848, + nil, 848, 848, nil, 848, 848, 848, 490, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 490, 490, nil, 848, nil, nil, 848, + nil, 491, 848, 848, nil, nil, 848, nil, 848, 490, + nil, 490, 848, 490, 490, 490, 490, 491, 491, nil, + 848, nil, nil, nil, nil, 848, 848, 848, 848, 848, + 848, nil, nil, 491, 848, 848, nil, 491, 491, 491, + 491, nil, 848, nil, nil, 848, 848, 848, 860, 860, + 860, 860, 860, 860, nil, nil, nil, 860, 860, nil, + nil, nil, 860, nil, 860, 860, 860, 860, 860, 860, + 860, nil, nil, nil, nil, nil, 860, 860, 860, 860, + 860, 860, 860, nil, nil, 860, nil, nil, nil, nil, + nil, 860, 860, 860, 860, 860, 860, 860, 860, 860, + 860, 860, 860, nil, 860, 860, 860, nil, 860, 860, + nil, 860, 860, 860, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 860, nil, nil, 860, nil, nil, 860, + 860, nil, nil, 860, nil, 860, nil, nil, nil, 860, + nil, nil, nil, nil, nil, nil, nil, 860, nil, nil, + nil, nil, 860, 860, 860, 860, 860, 860, nil, nil, + nil, 860, 860, nil, nil, nil, nil, nil, nil, 860, + nil, nil, 860, 860, 860, 880, 880, 880, 880, 880, + 880, nil, nil, nil, 880, 880, nil, nil, nil, 880, + nil, 880, 880, 880, 880, 880, 880, 880, nil, nil, + nil, nil, nil, 880, 880, 880, 880, 880, 880, 880, + nil, nil, 880, nil, nil, nil, nil, nil, 880, 880, + 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, + nil, 880, 880, 880, nil, 880, 880, nil, 880, 880, + 880, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 880, nil, nil, 880, nil, nil, 880, 880, nil, nil, + 880, nil, 880, nil, nil, nil, 880, nil, nil, nil, + nil, nil, nil, nil, 880, nil, nil, nil, nil, 880, + 880, 880, 880, 880, 880, nil, nil, nil, 880, 880, + nil, nil, nil, nil, nil, nil, 880, nil, nil, 880, + 880, 880, 881, 881, 881, 881, 881, 881, nil, nil, + nil, 881, 881, nil, nil, nil, 881, nil, 881, 881, + 881, 881, 881, 881, 881, nil, nil, nil, nil, nil, + 881, 881, 881, 881, 881, 881, 881, nil, nil, 881, + nil, nil, nil, nil, nil, 881, 881, 881, 881, 881, + 881, 881, 881, 881, 881, 881, 881, nil, 881, 881, + 881, nil, 881, 881, nil, 881, 881, 881, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 881, nil, nil, + 881, nil, nil, 881, 881, nil, nil, 881, nil, 881, + nil, nil, nil, 881, nil, nil, nil, nil, nil, nil, + nil, 881, nil, nil, nil, nil, 881, 881, 881, 881, + 881, 881, nil, nil, nil, 881, 881, nil, nil, nil, + nil, nil, nil, 881, nil, nil, 881, 881, 881, 930, + 930, 930, 930, 930, 930, nil, nil, nil, 930, 930, + nil, nil, nil, 930, nil, 930, 930, 930, 930, 930, + 930, 930, nil, nil, nil, nil, nil, 930, 930, 930, + 930, 930, 930, 930, nil, nil, 930, nil, nil, nil, + nil, nil, 930, 930, 930, 930, 930, 930, 930, 930, + 930, 930, 930, 930, nil, 930, 930, 930, nil, 930, + 930, nil, 930, 930, 930, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 930, nil, nil, 930, nil, nil, + 930, 930, nil, nil, 930, nil, 930, nil, nil, nil, + 930, nil, nil, nil, nil, nil, nil, nil, 930, nil, + nil, nil, nil, 930, 930, 930, 930, 930, 930, nil, + nil, nil, 930, 930, nil, nil, nil, nil, nil, nil, + 930, nil, nil, 930, 930, 930, 931, 931, 931, 931, + 931, 931, nil, nil, nil, 931, 931, nil, nil, nil, + 931, nil, 931, 931, 931, 931, 931, 931, 931, nil, + nil, nil, nil, nil, 931, 931, 931, 931, 931, 931, + 931, nil, nil, 931, nil, nil, nil, nil, nil, 931, + 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, + 931, nil, 931, 931, 931, nil, 931, 931, nil, 931, + 931, 931, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 931, nil, nil, 931, nil, nil, 931, 931, nil, + nil, 931, nil, 931, nil, nil, nil, 931, nil, nil, + nil, nil, nil, nil, nil, 931, nil, nil, nil, nil, + 931, 931, 931, 931, 931, 931, nil, nil, nil, 931, + 931, nil, nil, nil, nil, nil, nil, 931, nil, nil, + 931, 931, 931, 943, 943, 943, 943, 943, 943, nil, + nil, nil, 943, 943, nil, nil, nil, 943, nil, 943, + 943, 943, 943, 943, 943, 943, nil, nil, nil, nil, + nil, 943, 943, 943, 943, 943, 943, 943, nil, nil, + 943, nil, nil, nil, nil, nil, 943, 943, 943, 943, + 943, 943, 943, 943, 943, 943, 943, 943, nil, 943, + 943, 943, nil, 943, 943, nil, 943, 943, 943, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 943, nil, + nil, 943, nil, nil, 943, 943, nil, nil, 943, nil, + 943, nil, nil, nil, 943, nil, nil, nil, nil, nil, + nil, nil, 943, nil, nil, nil, nil, 943, 943, 943, + 943, 943, 943, nil, nil, nil, 943, 943, nil, nil, + nil, nil, nil, nil, 943, nil, nil, 943, 943, 943, + 947, 947, 947, 947, 947, 947, nil, nil, nil, 947, + 947, nil, nil, nil, 947, nil, 947, 947, 947, 947, + 947, 947, 947, nil, nil, nil, nil, nil, 947, 947, + 947, 947, 947, 947, 947, nil, nil, 947, nil, nil, + nil, nil, nil, 947, 947, 947, 947, 947, 947, 947, + 947, 947, 947, 947, 947, nil, 947, 947, 947, nil, + 947, 947, nil, 947, 947, 947, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 947, nil, nil, 947, nil, + nil, 947, 947, nil, nil, 947, nil, 947, nil, nil, + nil, 947, nil, nil, nil, nil, nil, nil, nil, 947, + nil, nil, nil, nil, 947, 947, 947, 947, 947, 947, + nil, nil, nil, 947, 947, nil, nil, nil, nil, nil, + nil, 947, nil, nil, 947, 947, 947, 988, 988, 988, + 988, 988, 988, nil, nil, nil, 988, 988, nil, nil, + nil, 988, nil, 988, 988, 988, 988, 988, 988, 988, + nil, nil, nil, nil, nil, 988, 988, 988, 988, 988, + 988, 988, nil, nil, 988, nil, nil, nil, nil, nil, + 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, + 988, 988, nil, 988, 988, 988, nil, 988, 988, nil, + 988, 988, 988, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 988, nil, nil, 988, nil, nil, 988, 988, + nil, nil, 988, nil, 988, nil, nil, nil, 988, nil, + nil, nil, nil, nil, nil, nil, 988, nil, nil, nil, + nil, 988, 988, 988, 988, 988, 988, nil, nil, nil, + 988, 988, nil, nil, nil, nil, nil, nil, 988, nil, + nil, 988, 988, 988, 995, 995, 995, 995, 995, 995, + nil, nil, nil, 995, 995, nil, nil, nil, 995, nil, + 995, 995, 995, 995, 995, 995, 995, nil, nil, nil, + nil, nil, 995, 995, 995, 995, 995, 995, 995, nil, + nil, 995, nil, nil, nil, nil, nil, 995, 995, 995, + 995, 995, 995, 995, 995, 995, 995, 995, 995, nil, + 995, 995, 995, nil, 995, 995, nil, 995, 995, 995, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 995, + nil, nil, 995, nil, nil, 995, 995, nil, nil, 995, + nil, 995, nil, nil, nil, 995, nil, nil, nil, nil, + nil, nil, nil, 995, nil, nil, nil, nil, 995, 995, + 995, 995, 995, 995, nil, nil, nil, 995, 995, nil, + nil, nil, nil, nil, nil, 995, nil, nil, 995, 995, + 995, 1000, 1000, 1000, 1000, 1000, 1000, nil, nil, nil, + 1000, 1000, nil, nil, nil, 1000, nil, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, nil, nil, nil, nil, nil, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, nil, nil, 1000, nil, + nil, nil, nil, nil, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, nil, 1000, 1000, 1000, + nil, 1000, 1000, nil, 1000, 1000, 1000, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1000, nil, nil, 1000, + nil, nil, 1000, 1000, nil, nil, 1000, nil, 1000, nil, + nil, nil, 1000, nil, nil, nil, nil, nil, nil, nil, + 1000, nil, nil, nil, nil, 1000, 1000, 1000, 1000, 1000, + 1000, nil, nil, nil, 1000, 1000, nil, nil, nil, nil, + nil, nil, 1000, nil, nil, 1000, 1000, 1000, 8, 8, + 8, 8, 8, nil, nil, nil, 8, 8, nil, nil, + nil, 8, nil, 8, 8, 8, 8, 8, 8, 8, + nil, nil, nil, nil, nil, 8, 8, 8, 8, 8, + 8, 8, nil, nil, 8, nil, nil, nil, nil, nil, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, nil, 8, 8, 8, nil, 8, 8, nil, + 8, 8, 8, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 8, nil, nil, 8, nil, nil, 8, 8, + nil, nil, 8, nil, 8, nil, nil, nil, 8, nil, + nil, nil, nil, nil, nil, nil, 8, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, nil, nil, nil, + 8, 8, nil, nil, nil, nil, nil, nil, 8, nil, + nil, 8, 8, 8, 23, 23, 23, nil, 23, nil, + nil, nil, 23, 23, nil, nil, nil, 23, nil, 23, + 23, 23, 23, 23, 23, 23, nil, nil, nil, nil, + nil, 23, 23, 23, 23, 23, 23, 23, nil, nil, + 23, nil, nil, nil, nil, nil, nil, 23, nil, nil, + 23, 23, 23, 23, 23, 23, 23, 23, nil, 23, + 23, 23, nil, 23, 23, nil, 23, 23, 23, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, 23, nil, nil, 23, 23, nil, 979, 23, 979, + 979, 979, 979, 979, 23, nil, nil, nil, nil, nil, + nil, nil, 23, 979, nil, nil, nil, 23, 23, 23, + 23, 23, 23, nil, nil, nil, 23, 23, nil, nil, + nil, nil, nil, nil, 23, 979, nil, 23, 23, 23, + 32, 32, 32, nil, 32, nil, 979, 979, 32, 32, + nil, nil, nil, 32, nil, 32, 32, 32, 32, 32, + 32, 32, nil, nil, nil, nil, nil, 32, 32, 32, + 32, 32, 32, 32, nil, nil, 32, nil, nil, nil, + 979, nil, nil, 32, nil, nil, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, nil, 32, + 32, nil, 32, 32, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 32, nil, nil, 32, nil, nil, + 32, 32, nil, nil, 32, nil, 32, nil, 32, nil, + 32, nil, nil, nil, nil, nil, nil, nil, 32, nil, + nil, nil, nil, 32, 32, 32, 32, 32, 32, nil, + nil, nil, 32, 32, nil, nil, nil, nil, nil, nil, + 32, nil, 32, 32, 32, 32, 33, 33, 33, nil, + 33, nil, nil, nil, 33, 33, nil, nil, nil, 33, + nil, 33, 33, 33, 33, 33, 33, 33, nil, nil, + nil, nil, nil, 33, 33, 33, 33, 33, 33, 33, + nil, nil, 33, nil, nil, nil, nil, nil, nil, 33, + nil, nil, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, nil, 33, 33, nil, 33, 33, + 33, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 33, nil, nil, 33, nil, nil, 33, 33, nil, nil, + 33, nil, 33, nil, 33, nil, 33, nil, nil, nil, + nil, nil, nil, nil, 33, nil, nil, nil, nil, 33, + 33, 33, 33, 33, 33, nil, nil, nil, 33, 33, + nil, nil, nil, nil, nil, nil, 33, nil, 33, 33, + 33, 33, 34, 34, 34, nil, 34, nil, nil, nil, + 34, 34, nil, nil, nil, 34, nil, 34, 34, 34, + 34, 34, 34, 34, nil, nil, nil, nil, nil, 34, + 34, 34, 34, 34, 34, 34, nil, nil, 34, nil, + nil, nil, nil, nil, nil, 34, nil, nil, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + nil, 34, 34, nil, 34, 34, 34, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 34, nil, nil, 34, + nil, nil, 34, 34, nil, nil, 34, nil, 34, nil, + 34, nil, 34, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, nil, nil, 34, 34, 34, 34, 34, + 34, nil, nil, nil, 34, 34, nil, nil, nil, nil, + nil, nil, 34, nil, 34, 34, 34, 34, 37, 37, + 37, nil, 37, nil, nil, nil, 37, 37, nil, nil, + nil, 37, nil, 37, 37, 37, 37, 37, 37, 37, + nil, nil, nil, nil, nil, 37, 37, 37, 37, 37, + 37, 37, nil, nil, 37, nil, nil, nil, nil, nil, + nil, 37, nil, nil, 37, 37, 37, 37, 37, 37, + 37, 37, nil, 37, 37, 37, nil, 37, 37, nil, + nil, nil, 37, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 37, nil, nil, 37, nil, nil, 37, 37, + nil, nil, 37, nil, 37, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 37, 37, 37, 37, 37, 37, nil, nil, nil, + 37, 37, nil, nil, nil, nil, nil, nil, 37, nil, + nil, 37, 37, 37, 38, 38, 38, nil, 38, nil, + nil, nil, 38, 38, nil, nil, nil, 38, nil, 38, + 38, 38, 38, 38, 38, 38, nil, nil, nil, nil, + nil, 38, 38, 38, 38, 38, 38, 38, nil, nil, + 38, nil, nil, nil, nil, nil, nil, 38, nil, nil, + 38, 38, 38, 38, 38, 38, 38, 38, nil, 38, + 38, 38, nil, 38, 38, nil, nil, nil, 38, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 38, nil, + nil, 38, nil, nil, 38, 38, nil, 1041, 38, 1041, + 1041, 1041, 1041, 1041, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1041, nil, nil, nil, 38, 38, 38, + 38, 38, 38, nil, nil, nil, 38, 38, nil, nil, + nil, 38, nil, nil, 38, 1041, nil, 38, 38, 38, + 45, 45, 45, nil, 45, nil, 1041, 1041, 45, 45, + nil, nil, nil, 45, nil, 45, 45, 45, 45, 45, + 45, 45, nil, nil, nil, nil, nil, 45, 45, 45, + 45, 45, 45, 45, nil, nil, 45, nil, nil, nil, + 1041, nil, nil, 45, nil, nil, 45, 45, 45, 45, + 45, 45, 45, 45, nil, 45, 45, 45, nil, 45, + 45, nil, 45, 45, 45, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 45, nil, nil, 45, nil, nil, + 45, 45, nil, 1050, 45, 1050, 1050, 1050, 1050, 1050, + 45, nil, nil, nil, nil, nil, nil, nil, 45, 1050, + nil, nil, nil, 45, 45, 45, 45, 45, 45, nil, + nil, nil, 45, 45, nil, nil, nil, nil, nil, nil, + 45, 1050, nil, 45, 45, 45, 46, 46, 46, nil, + 46, nil, 1050, 1050, 46, 46, nil, nil, nil, 46, + nil, 46, 46, 46, 46, 46, 46, 46, nil, nil, + nil, nil, nil, 46, 46, 46, 46, 46, 46, 46, + nil, nil, 46, nil, nil, nil, 1050, nil, nil, 46, + nil, nil, 46, 46, 46, 46, 46, 46, 46, 46, + nil, 46, 46, 46, nil, 46, 46, nil, 46, 46, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 46, nil, nil, 46, nil, nil, 46, 46, nil, 1052, + 46, 1052, 1052, 1052, 1052, 1052, 46, nil, nil, nil, + nil, nil, nil, nil, 46, 1052, nil, nil, nil, 46, + 46, 46, 46, 46, 46, nil, nil, nil, 46, 46, + nil, nil, nil, nil, nil, nil, 46, 1052, nil, 46, + 46, 46, 48, 48, 48, nil, 48, nil, 1052, 1052, + 48, 48, nil, nil, nil, 48, nil, 48, 48, 48, + 48, 48, 48, 48, nil, nil, nil, nil, nil, 48, + 48, 48, 48, 48, 48, 48, nil, nil, 48, nil, + nil, nil, 1052, nil, nil, 48, nil, nil, 48, 48, + 48, 48, 48, 48, 48, 48, nil, 48, 48, 48, + nil, 48, 48, nil, 48, 48, 48, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 48, nil, nil, 48, + nil, nil, 48, 48, nil, 1054, 48, 1054, 1054, 1054, + 1054, 1054, 48, nil, nil, nil, nil, nil, nil, nil, + 48, 1054, nil, nil, nil, 48, 48, 48, 48, 48, + 48, nil, nil, nil, 48, 48, nil, nil, nil, nil, + nil, nil, 48, 1054, nil, 48, 48, 48, 62, 62, + 62, 62, 62, nil, 1054, 1054, 62, 62, nil, nil, + nil, 62, nil, 62, 62, 62, 62, 62, 62, 62, + nil, nil, nil, nil, nil, 62, 62, 62, 62, 62, + 62, 62, nil, nil, 62, nil, nil, nil, 1054, nil, + 62, 62, nil, 62, 62, 62, 62, 62, 62, 62, + 62, 62, nil, 62, 62, 62, nil, 62, 62, nil, + 62, 62, 62, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 62, nil, nil, 62, nil, nil, 62, 62, + nil, nil, 62, nil, 62, nil, nil, nil, 62, nil, + nil, nil, nil, nil, nil, nil, 62, nil, nil, nil, + nil, 62, 62, 62, 62, 62, 62, nil, nil, nil, + 62, 62, nil, nil, nil, nil, nil, nil, 62, nil, + nil, 62, 62, 62, 67, 67, 67, nil, 67, nil, + nil, nil, 67, 67, nil, nil, nil, 67, nil, 67, + 67, 67, 67, 67, 67, 67, nil, nil, nil, nil, + nil, 67, 67, 67, 67, 67, 67, 67, nil, nil, + 67, nil, nil, nil, nil, nil, nil, 67, nil, nil, + 67, 67, 67, 67, 67, 67, 67, 67, nil, 67, + 67, 67, nil, 67, 67, nil, 67, 67, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, 67, nil, nil, 67, 67, nil, 1075, 67, 1075, + 1075, 1075, 1075, 1075, 67, nil, nil, nil, nil, nil, + nil, nil, 67, 1075, nil, nil, nil, 67, 67, 67, + 67, 67, 67, nil, nil, nil, 67, 67, nil, nil, + nil, nil, nil, nil, 67, 1075, nil, 67, 67, 67, + 68, 68, 68, nil, 68, nil, 1075, 1075, 68, 68, + nil, nil, nil, 68, nil, 68, 68, 68, 68, 68, + 68, 68, nil, nil, nil, nil, nil, 68, 68, 68, + 68, 68, 68, 68, nil, nil, 68, nil, nil, nil, + 1075, nil, nil, 68, nil, nil, 68, 68, 68, 68, + 68, 68, 68, 68, nil, 68, 68, 68, nil, 68, + 68, nil, 68, 68, 68, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 68, nil, nil, 68, nil, nil, + 68, 68, nil, nil, 68, nil, nil, nil, nil, nil, + 68, nil, nil, nil, nil, nil, nil, nil, 68, nil, + nil, nil, nil, 68, 68, 68, 68, 68, 68, nil, + nil, nil, 68, 68, nil, nil, nil, nil, nil, nil, + 68, nil, nil, 68, 68, 68, 71, 71, 71, nil, + 71, nil, nil, nil, 71, 71, nil, nil, nil, 71, + nil, 71, 71, 71, 71, 71, 71, 71, nil, nil, + nil, nil, nil, 71, 71, 71, 71, 71, 71, 71, + nil, nil, 71, nil, nil, nil, nil, nil, nil, 71, + nil, nil, 71, 71, 71, 71, 71, 71, 71, 71, + nil, 71, 71, 71, nil, 71, 71, nil, 71, 71, + 71, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 71, nil, nil, 71, nil, nil, 71, 71, nil, nil, + 71, nil, nil, nil, nil, nil, 71, nil, nil, nil, + nil, nil, nil, nil, 71, nil, nil, nil, nil, 71, + 71, 71, 71, 71, 71, nil, nil, nil, 71, 71, + 71, nil, nil, nil, nil, 71, 71, nil, nil, 71, + 71, 71, 72, 72, 72, nil, 72, nil, nil, nil, + 72, 72, nil, nil, nil, 72, nil, 72, 72, 72, + 72, 72, 72, 72, nil, nil, nil, nil, nil, 72, + 72, 72, 72, 72, 72, 72, nil, nil, 72, nil, + nil, nil, nil, nil, nil, 72, nil, nil, 72, 72, + 72, 72, 72, 72, 72, 72, nil, 72, 72, 72, + nil, 72, 72, nil, nil, nil, 72, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 72, nil, nil, 72, + nil, nil, 72, 72, nil, nil, 72, nil, 72, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 72, 72, 72, 72, 72, + 72, nil, nil, nil, 72, 72, nil, nil, nil, nil, + nil, nil, 72, nil, nil, 72, 72, 72, 73, 73, + 73, nil, 73, nil, nil, nil, 73, 73, nil, nil, + nil, 73, nil, 73, 73, 73, 73, 73, 73, 73, + nil, nil, nil, nil, nil, 73, 73, 73, 73, 73, + 73, 73, nil, nil, 73, nil, nil, nil, nil, nil, + nil, 73, nil, nil, 73, 73, 73, 73, 73, 73, + 73, 73, nil, 73, 73, 73, nil, 73, 73, nil, + nil, nil, 73, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 73, + nil, nil, 73, nil, nil, 73, nil, nil, 73, 73, + nil, nil, 73, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 73, 73, 73, 73, 73, 73, nil, nil, nil, + 73, 73, nil, nil, nil, nil, nil, nil, 73, nil, + nil, 73, 73, 73, 74, 74, 74, nil, 74, nil, + nil, nil, 74, 74, nil, nil, nil, 74, nil, 74, + 74, 74, 74, 74, 74, 74, nil, nil, nil, nil, + nil, 74, 74, 74, 74, 74, 74, 74, nil, nil, + 74, nil, nil, nil, nil, nil, nil, 74, nil, nil, + 74, 74, 74, 74, 74, 74, 74, 74, nil, 74, + 74, 74, nil, 74, 74, nil, nil, nil, 74, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 74, nil, + nil, 74, nil, nil, 74, 74, nil, nil, 74, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 74, 74, 74, + 74, 74, 74, nil, nil, nil, 74, 74, nil, nil, + nil, nil, nil, nil, 74, nil, nil, 74, 74, 74, + 125, 125, 125, 125, 125, nil, nil, nil, 125, 125, + nil, nil, nil, 125, nil, 125, 125, 125, 125, 125, + 125, 125, nil, nil, nil, nil, nil, 125, 125, 125, + 125, 125, 125, 125, nil, nil, 125, nil, nil, nil, + nil, nil, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, nil, 125, 125, 125, nil, 125, + 125, nil, 125, 125, 125, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 125, nil, nil, 125, nil, nil, + 125, 125, nil, nil, 125, nil, 125, nil, nil, nil, + 125, nil, nil, nil, nil, nil, nil, nil, 125, nil, + nil, nil, nil, 125, 125, 125, 125, 125, 125, nil, + nil, nil, 125, 125, nil, nil, nil, nil, nil, 125, + 125, nil, nil, 125, 125, 125, 130, 130, 130, nil, + 130, nil, nil, nil, 130, 130, nil, nil, nil, 130, + nil, 130, 130, 130, 130, 130, 130, 130, nil, nil, + nil, nil, nil, 130, 130, 130, 130, 130, 130, 130, + nil, nil, 130, nil, nil, nil, nil, nil, nil, 130, + nil, nil, 130, 130, 130, 130, 130, 130, 130, 130, + nil, 130, 130, 130, nil, 130, 130, nil, 130, 130, + 130, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 130, nil, nil, 130, nil, nil, 130, 130, nil, nil, + 130, nil, nil, nil, nil, nil, 130, nil, nil, nil, + nil, nil, nil, nil, 130, nil, nil, nil, nil, 130, + 130, 130, 130, 130, 130, nil, nil, nil, 130, 130, + nil, nil, nil, nil, nil, nil, 130, nil, nil, 130, + 130, 130, 131, 131, 131, nil, 131, nil, nil, nil, + 131, 131, nil, nil, nil, 131, nil, 131, 131, 131, + 131, 131, 131, 131, nil, nil, nil, nil, nil, 131, + 131, 131, 131, 131, 131, 131, nil, nil, 131, nil, + nil, nil, nil, nil, nil, 131, nil, nil, 131, 131, + 131, 131, 131, 131, 131, 131, nil, 131, 131, 131, + nil, 131, 131, nil, 131, 131, 131, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 131, nil, nil, 131, + nil, nil, 131, 131, nil, nil, 131, nil, nil, nil, + nil, nil, 131, nil, nil, nil, nil, nil, nil, nil, + 131, nil, nil, nil, nil, 131, 131, 131, 131, 131, + 131, nil, nil, nil, 131, 131, nil, nil, nil, nil, + nil, nil, 131, nil, nil, 131, 131, 131, 132, 132, + 132, nil, 132, nil, nil, nil, 132, 132, nil, nil, + nil, 132, nil, 132, 132, 132, 132, 132, 132, 132, + nil, nil, nil, nil, nil, 132, 132, 132, 132, 132, + 132, 132, nil, nil, 132, nil, nil, nil, nil, nil, + nil, 132, nil, nil, 132, 132, 132, 132, 132, 132, + 132, 132, nil, 132, 132, 132, nil, 132, 132, nil, + 132, 132, 132, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 132, nil, nil, 132, nil, nil, 132, 132, + nil, nil, 132, nil, nil, nil, nil, nil, 132, nil, + nil, nil, nil, nil, nil, nil, 132, nil, nil, nil, + nil, 132, 132, 132, 132, 132, 132, nil, nil, nil, + 132, 132, nil, nil, nil, nil, nil, nil, 132, nil, + nil, 132, 132, 132, 133, 133, 133, nil, 133, nil, + nil, nil, 133, 133, nil, nil, nil, 133, nil, 133, + 133, 133, 133, 133, 133, 133, nil, nil, nil, nil, + nil, 133, 133, 133, 133, 133, 133, 133, nil, nil, + 133, nil, nil, nil, nil, nil, nil, 133, nil, nil, + 133, 133, 133, 133, 133, 133, 133, 133, nil, 133, + 133, 133, nil, 133, 133, nil, 133, 133, 133, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 133, nil, + nil, 133, nil, nil, 133, 133, nil, nil, 133, nil, + nil, nil, nil, nil, 133, nil, nil, nil, nil, nil, + nil, nil, 133, nil, nil, nil, nil, 133, 133, 133, + 133, 133, 133, nil, nil, nil, 133, 133, nil, nil, + nil, nil, nil, nil, 133, nil, nil, 133, 133, 133, + 134, 134, 134, 134, 134, nil, nil, nil, 134, 134, + nil, nil, nil, 134, nil, 134, 134, 134, 134, 134, + 134, 134, nil, nil, nil, nil, nil, 134, 134, 134, + 134, 134, 134, 134, nil, nil, 134, nil, nil, nil, + nil, nil, 134, 134, nil, 134, 134, 134, 134, 134, + 134, 134, 134, 134, nil, 134, 134, 134, nil, 134, + 134, nil, 134, 134, 134, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 134, nil, nil, 134, nil, nil, + 134, 134, nil, nil, 134, nil, 134, nil, nil, nil, + 134, nil, nil, nil, nil, nil, nil, nil, 134, nil, + nil, nil, nil, 134, 134, 134, 134, 134, 134, nil, + nil, nil, 134, 134, nil, nil, nil, nil, nil, nil, + 134, nil, nil, 134, 134, 134, 219, 219, 219, nil, + 219, nil, nil, nil, 219, 219, nil, nil, nil, 219, + nil, 219, 219, 219, 219, 219, 219, 219, nil, nil, + nil, nil, nil, 219, 219, 219, 219, 219, 219, 219, + nil, nil, 219, nil, nil, nil, nil, nil, nil, 219, + nil, nil, 219, 219, 219, 219, 219, 219, 219, 219, + nil, 219, 219, 219, nil, 219, 219, nil, 219, 219, + 219, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 219, nil, nil, 219, nil, nil, 219, 219, nil, nil, + 219, nil, 219, nil, nil, nil, 219, nil, nil, nil, + nil, nil, nil, nil, 219, nil, nil, nil, nil, 219, + 219, 219, 219, 219, 219, nil, nil, nil, 219, 219, + nil, nil, nil, nil, nil, nil, 219, nil, nil, 219, + 219, 219, 220, 220, 220, nil, 220, nil, nil, nil, + 220, 220, nil, nil, nil, 220, nil, 220, 220, 220, + 220, 220, 220, 220, nil, nil, nil, nil, nil, 220, + 220, 220, 220, 220, 220, 220, nil, nil, 220, nil, + nil, nil, nil, nil, nil, 220, nil, nil, 220, 220, + 220, 220, 220, 220, 220, 220, nil, 220, 220, 220, + nil, 220, 220, nil, 220, 220, 220, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 220, nil, nil, 220, + nil, nil, 220, 220, nil, nil, 220, nil, 220, nil, + nil, nil, 220, nil, nil, nil, nil, nil, nil, nil, + 220, nil, nil, nil, nil, 220, 220, 220, 220, 220, + 220, nil, nil, nil, 220, 220, nil, nil, nil, nil, + nil, nil, 220, nil, nil, 220, 220, 220, 221, 221, + 221, nil, 221, nil, nil, nil, 221, 221, nil, nil, + nil, 221, nil, 221, 221, 221, 221, 221, 221, 221, + nil, nil, nil, nil, nil, 221, 221, 221, 221, 221, + 221, 221, nil, nil, 221, nil, nil, nil, nil, nil, + nil, 221, nil, nil, 221, 221, 221, 221, 221, 221, + 221, 221, nil, 221, 221, 221, nil, 221, 221, nil, + 221, 221, 221, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 221, nil, nil, 221, nil, nil, 221, 221, + nil, nil, 221, nil, nil, nil, nil, nil, 221, nil, + nil, nil, nil, nil, nil, nil, 221, nil, nil, nil, + nil, 221, 221, 221, 221, 221, 221, nil, nil, nil, + 221, 221, nil, nil, nil, nil, nil, nil, 221, nil, + nil, 221, 221, 221, 222, 222, 222, nil, 222, nil, + nil, nil, 222, 222, nil, nil, nil, 222, nil, 222, + 222, 222, 222, 222, 222, 222, nil, nil, nil, nil, + nil, 222, 222, 222, 222, 222, 222, 222, nil, nil, + 222, nil, nil, nil, nil, nil, nil, 222, nil, nil, + 222, 222, 222, 222, 222, 222, 222, 222, nil, 222, + 222, 222, nil, 222, 222, nil, 222, 222, 222, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 222, nil, + nil, 222, nil, nil, 222, 222, nil, nil, 222, nil, + nil, nil, nil, nil, 222, nil, nil, nil, nil, nil, + nil, nil, 222, nil, nil, nil, nil, 222, 222, 222, + 222, 222, 222, nil, nil, nil, 222, 222, nil, nil, + nil, nil, nil, nil, 222, nil, nil, 222, 222, 222, + 223, 223, 223, nil, 223, nil, nil, nil, 223, 223, + nil, nil, nil, 223, nil, 223, 223, 223, 223, 223, + 223, 223, nil, nil, nil, nil, nil, 223, 223, 223, + 223, 223, 223, 223, nil, nil, 223, nil, nil, nil, + nil, nil, nil, 223, nil, nil, 223, 223, 223, 223, + 223, 223, 223, 223, nil, 223, 223, 223, nil, 223, + 223, nil, 223, 223, 223, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 223, nil, nil, 223, nil, nil, + 223, 223, nil, nil, 223, nil, nil, nil, nil, nil, + 223, nil, nil, nil, nil, nil, nil, nil, 223, nil, + nil, nil, nil, 223, 223, 223, 223, 223, 223, nil, + nil, nil, 223, 223, nil, nil, nil, nil, nil, nil, + 223, nil, nil, 223, 223, 223, 224, 224, 224, nil, + 224, nil, nil, nil, 224, 224, nil, nil, nil, 224, + nil, 224, 224, 224, 224, 224, 224, 224, nil, nil, + nil, nil, nil, 224, 224, 224, 224, 224, 224, 224, + nil, nil, 224, nil, nil, nil, nil, nil, nil, 224, + nil, nil, 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, nil, 224, 224, nil, 224, 224, + 224, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 224, nil, nil, 224, nil, nil, 224, 224, nil, nil, + 224, nil, 224, nil, 224, nil, 224, nil, nil, nil, + nil, nil, nil, nil, 224, nil, nil, nil, nil, 224, + 224, 224, 224, 224, 224, nil, nil, nil, 224, 224, + nil, nil, nil, nil, nil, nil, 224, nil, 224, 224, + 224, 224, 228, 228, 228, nil, 228, nil, nil, nil, + 228, 228, nil, nil, nil, 228, nil, 228, 228, 228, + 228, 228, 228, 228, nil, nil, nil, nil, nil, 228, + 228, 228, 228, 228, 228, 228, nil, nil, 228, nil, + nil, nil, nil, nil, nil, 228, nil, nil, 228, 228, + 228, 228, 228, 228, 228, 228, nil, 228, 228, 228, + nil, 228, 228, nil, 228, 228, 228, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 228, nil, nil, 228, + nil, nil, 228, 228, nil, nil, 228, nil, nil, nil, + nil, nil, 228, nil, nil, nil, nil, nil, nil, nil, + 228, nil, nil, nil, nil, 228, 228, 228, 228, 228, + 228, nil, nil, nil, 228, 228, nil, nil, nil, nil, + nil, nil, 228, nil, nil, 228, 228, 228, 229, 229, + 229, nil, 229, nil, nil, nil, 229, 229, nil, nil, + nil, 229, nil, 229, 229, 229, 229, 229, 229, 229, + nil, nil, nil, nil, nil, 229, 229, 229, 229, 229, + 229, 229, nil, nil, 229, nil, nil, nil, nil, nil, + nil, 229, nil, nil, 229, 229, 229, 229, 229, 229, + 229, 229, nil, 229, 229, 229, nil, 229, 229, nil, + 229, 229, 229, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 229, nil, nil, 229, nil, nil, 229, 229, + nil, nil, 229, nil, nil, nil, nil, nil, 229, nil, + nil, nil, nil, nil, nil, nil, 229, nil, nil, nil, + nil, 229, 229, 229, 229, 229, 229, nil, nil, nil, + 229, 229, nil, nil, nil, nil, nil, nil, 229, nil, + nil, 229, 229, 229, 230, 230, 230, nil, 230, nil, + nil, nil, 230, 230, nil, nil, nil, 230, nil, 230, + 230, 230, 230, 230, 230, 230, nil, nil, nil, nil, + nil, 230, 230, 230, 230, 230, 230, 230, nil, nil, + 230, nil, nil, nil, nil, nil, nil, 230, nil, nil, + 230, 230, 230, 230, 230, 230, 230, 230, nil, 230, + 230, 230, nil, 230, 230, nil, 230, 230, 230, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 230, nil, + nil, 230, nil, nil, 230, 230, nil, nil, 230, nil, + nil, nil, nil, nil, 230, nil, nil, nil, nil, nil, + nil, nil, 230, nil, nil, nil, nil, 230, 230, 230, + 230, 230, 230, nil, nil, nil, 230, 230, 230, nil, + nil, nil, nil, nil, 230, nil, nil, 230, 230, 230, + 241, 241, 241, nil, 241, nil, nil, nil, 241, 241, + nil, nil, nil, 241, nil, 241, 241, 241, 241, 241, + 241, 241, nil, nil, nil, nil, nil, 241, 241, 241, + 241, 241, 241, 241, nil, nil, 241, nil, nil, nil, + nil, nil, nil, 241, nil, nil, 241, 241, 241, 241, + 241, 241, 241, 241, nil, 241, 241, 241, nil, 241, + 241, nil, 241, 241, 241, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, 241, nil, nil, + 241, 241, nil, nil, 241, nil, nil, nil, nil, nil, + 241, nil, nil, nil, nil, nil, nil, nil, 241, nil, + nil, nil, nil, 241, 241, 241, 241, 241, 241, nil, + nil, nil, 241, 241, nil, nil, nil, nil, nil, nil, + 241, nil, nil, 241, 241, 241, 244, 244, 244, nil, + 244, nil, nil, nil, 244, 244, nil, nil, nil, 244, + nil, 244, 244, 244, 244, 244, 244, 244, nil, nil, + nil, nil, nil, 244, 244, 244, 244, 244, 244, 244, + nil, nil, 244, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 244, 244, 244, 244, 244, 244, 244, 244, + nil, 244, 244, 244, nil, 244, 244, nil, 244, 244, + 244, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 244, nil, nil, 244, 244, nil, nil, + 244, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 244, + 244, 244, 244, 244, 244, nil, nil, nil, 244, 244, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 244, + 244, 244, 245, 245, 245, nil, 245, nil, nil, nil, + 245, 245, nil, nil, nil, 245, nil, 245, 245, 245, + 245, 245, 245, 245, nil, nil, nil, nil, nil, 245, + 245, 245, 245, 245, 245, 245, nil, nil, 245, nil, + nil, nil, nil, nil, nil, 245, nil, nil, 245, 245, + 245, 245, 245, 245, 245, 245, nil, 245, 245, 245, + nil, 245, 245, nil, 245, 245, 245, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, 245, + nil, nil, 245, 245, nil, nil, 245, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 245, 245, 245, 245, 245, + 245, nil, nil, nil, 245, 245, nil, nil, nil, nil, + nil, nil, 245, nil, nil, 245, 245, 245, 246, 246, + 246, nil, 246, nil, nil, nil, 246, 246, nil, nil, + nil, 246, nil, 246, 246, 246, 246, 246, 246, 246, + nil, nil, nil, nil, nil, 246, 246, 246, 246, 246, + 246, 246, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 246, nil, nil, 246, 246, 246, 246, 246, 246, + 246, 246, nil, 246, 246, 246, nil, 246, 246, nil, + 246, 246, 246, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 246, nil, nil, 246, nil, nil, 246, 246, + nil, nil, 246, nil, nil, nil, nil, nil, 246, nil, + nil, nil, nil, nil, nil, nil, 246, nil, nil, nil, + nil, 246, 246, 246, 246, 246, 246, nil, nil, nil, + 246, 246, nil, nil, nil, nil, nil, nil, 246, nil, + nil, 246, 246, 246, 247, 247, 247, nil, 247, nil, + nil, nil, 247, 247, nil, nil, nil, 247, nil, 247, + 247, 247, 247, 247, 247, 247, nil, nil, nil, nil, + nil, 247, 247, 247, 247, 247, 247, 247, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 247, nil, nil, + 247, 247, 247, 247, 247, 247, 247, 247, nil, 247, + 247, 247, nil, 247, 247, nil, 247, 247, 247, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, 247, nil, nil, 247, 247, nil, nil, 247, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 247, 247, 247, + 247, 247, 247, nil, nil, nil, 247, 247, nil, nil, + nil, nil, nil, nil, 247, nil, nil, 247, 247, 247, + 248, 248, 248, nil, 248, nil, nil, nil, 248, 248, + nil, nil, nil, 248, nil, 248, 248, 248, 248, 248, + 248, 248, nil, nil, nil, nil, nil, 248, 248, 248, + 248, 248, 248, 248, nil, nil, 248, nil, nil, nil, + nil, nil, nil, 248, nil, nil, 248, 248, 248, 248, + 248, 248, 248, 248, nil, 248, 248, 248, nil, 248, + 248, nil, 248, 248, 248, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 248, nil, nil, 248, nil, nil, + 248, 248, nil, nil, 248, nil, nil, nil, nil, nil, + 248, nil, nil, nil, nil, nil, nil, nil, 248, nil, + nil, nil, nil, 248, 248, 248, 248, 248, 248, nil, + nil, nil, 248, 248, nil, nil, nil, nil, nil, nil, + 248, nil, nil, 248, 248, 248, 249, 249, 249, nil, + 249, nil, nil, nil, 249, 249, nil, nil, nil, 249, + nil, 249, 249, 249, 249, 249, 249, 249, nil, nil, + nil, nil, nil, 249, 249, 249, 249, 249, 249, 249, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 249, + nil, nil, 249, 249, 249, 249, 249, 249, 249, 249, + nil, 249, 249, 249, nil, 249, 249, nil, 249, 249, + 249, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, 249, nil, nil, 249, 249, nil, nil, + 249, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 249, + 249, 249, 249, 249, 249, nil, nil, nil, 249, 249, + nil, nil, nil, nil, nil, nil, 249, nil, nil, 249, + 249, 249, 250, 250, 250, nil, 250, nil, nil, nil, + 250, 250, nil, nil, nil, 250, nil, 250, 250, 250, + 250, 250, 250, 250, nil, nil, nil, nil, nil, 250, + 250, 250, 250, 250, 250, 250, nil, nil, 250, nil, + nil, nil, nil, nil, nil, 250, nil, nil, 250, 250, + 250, 250, 250, 250, 250, 250, nil, 250, 250, 250, + nil, 250, 250, nil, 250, 250, 250, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 250, nil, nil, 250, + nil, nil, 250, 250, nil, nil, 250, nil, nil, nil, + nil, nil, 250, nil, nil, nil, nil, nil, nil, nil, + 250, nil, nil, nil, nil, 250, 250, 250, 250, 250, + 250, nil, nil, nil, 250, 250, nil, nil, nil, nil, + nil, nil, 250, nil, nil, 250, 250, 250, 251, 251, + 251, nil, 251, nil, nil, nil, 251, 251, nil, nil, + nil, 251, nil, 251, 251, 251, 251, 251, 251, 251, + nil, nil, nil, nil, nil, 251, 251, 251, 251, 251, + 251, 251, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 251, nil, nil, 251, 251, 251, 251, 251, 251, + 251, 251, nil, 251, 251, 251, nil, 251, 251, nil, + 251, 251, 251, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 251, nil, nil, 251, nil, nil, 251, 251, + nil, nil, 251, nil, nil, nil, nil, nil, 251, nil, + nil, nil, nil, nil, nil, nil, 251, nil, nil, nil, + nil, 251, 251, 251, 251, 251, 251, nil, nil, nil, + 251, 251, nil, nil, nil, nil, nil, nil, 251, nil, + nil, 251, 251, 251, 252, 252, 252, nil, 252, nil, + nil, nil, 252, 252, nil, nil, nil, 252, nil, 252, + 252, 252, 252, 252, 252, 252, nil, nil, nil, nil, + nil, 252, 252, 252, 252, 252, 252, 252, nil, nil, + 252, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 252, 252, 252, 252, 252, 252, 252, 252, nil, 252, + 252, 252, nil, 252, 252, nil, 252, 252, 252, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 252, nil, nil, 252, 252, nil, nil, 252, nil, + nil, nil, nil, nil, 252, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, nil, nil, 252, 252, 252, + 252, 252, 252, nil, nil, nil, 252, 252, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 252, 252, 252, + 253, 253, 253, nil, 253, nil, nil, nil, 253, 253, + nil, nil, nil, 253, nil, 253, 253, 253, 253, 253, + 253, 253, nil, nil, nil, nil, nil, 253, 253, 253, + 253, 253, 253, 253, nil, nil, 253, nil, nil, nil, + nil, nil, nil, 253, nil, nil, 253, 253, 253, 253, + 253, 253, 253, 253, nil, 253, 253, 253, nil, 253, + 253, nil, 253, 253, 253, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 253, nil, nil, 253, nil, nil, + 253, 253, nil, nil, 253, nil, nil, nil, nil, nil, + 253, nil, nil, nil, nil, nil, nil, nil, 253, nil, + nil, nil, nil, 253, 253, 253, 253, 253, 253, nil, + nil, nil, 253, 253, nil, nil, nil, nil, nil, nil, + 253, nil, nil, 253, 253, 253, 254, 254, 254, nil, + 254, nil, nil, nil, 254, 254, nil, nil, nil, 254, + nil, 254, 254, 254, 254, 254, 254, 254, nil, nil, + nil, nil, nil, 254, 254, 254, 254, 254, 254, 254, + nil, nil, 254, nil, nil, nil, nil, nil, nil, 254, + nil, nil, 254, 254, 254, 254, 254, 254, 254, 254, + nil, 254, 254, 254, nil, 254, 254, nil, 254, 254, + 254, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 254, nil, nil, 254, nil, nil, 254, 254, nil, nil, + 254, nil, nil, nil, nil, nil, 254, nil, nil, nil, + nil, nil, nil, nil, 254, nil, nil, nil, nil, 254, + 254, 254, 254, 254, 254, nil, nil, nil, 254, 254, + nil, nil, nil, nil, nil, nil, 254, nil, nil, 254, + 254, 254, 255, 255, 255, nil, 255, nil, nil, nil, + 255, 255, nil, nil, nil, 255, nil, 255, 255, 255, + 255, 255, 255, 255, nil, nil, nil, nil, nil, 255, + 255, 255, 255, 255, 255, 255, nil, nil, 255, nil, + nil, nil, nil, nil, nil, 255, nil, nil, 255, 255, + 255, 255, 255, 255, 255, 255, nil, 255, 255, 255, + nil, 255, 255, nil, 255, 255, 255, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 255, nil, nil, 255, + nil, nil, 255, 255, nil, nil, 255, nil, nil, nil, + nil, nil, 255, nil, nil, nil, nil, nil, nil, nil, + 255, nil, nil, nil, nil, 255, 255, 255, 255, 255, + 255, nil, nil, nil, 255, 255, nil, nil, nil, nil, + nil, nil, 255, nil, nil, 255, 255, 255, 256, 256, + 256, nil, 256, nil, nil, nil, 256, 256, nil, nil, + nil, 256, nil, 256, 256, 256, 256, 256, 256, 256, + nil, nil, nil, nil, nil, 256, 256, 256, 256, 256, + 256, 256, nil, nil, 256, nil, nil, nil, nil, nil, + nil, 256, nil, nil, 256, 256, 256, 256, 256, 256, + 256, 256, nil, 256, 256, 256, nil, 256, 256, nil, + 256, 256, 256, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 256, nil, nil, 256, nil, nil, 256, 256, + nil, nil, 256, nil, nil, nil, nil, nil, 256, nil, + nil, nil, nil, nil, nil, nil, 256, nil, nil, nil, + nil, 256, 256, 256, 256, 256, 256, nil, nil, nil, + 256, 256, nil, nil, nil, nil, nil, nil, 256, nil, + nil, 256, 256, 256, 257, 257, 257, nil, 257, nil, + nil, nil, 257, 257, nil, nil, nil, 257, nil, 257, + 257, 257, 257, 257, 257, 257, nil, nil, nil, nil, + nil, 257, 257, 257, 257, 257, 257, 257, nil, nil, + 257, nil, nil, nil, nil, nil, nil, 257, nil, nil, + 257, 257, 257, 257, 257, 257, 257, 257, nil, 257, + 257, 257, nil, 257, 257, nil, 257, 257, 257, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, 257, nil, nil, 257, 257, nil, nil, 257, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 257, 257, 257, + 257, 257, 257, nil, nil, nil, 257, 257, nil, nil, + nil, nil, nil, nil, 257, nil, nil, 257, 257, 257, + 258, 258, 258, nil, 258, nil, nil, nil, 258, 258, + nil, nil, nil, 258, nil, 258, 258, 258, 258, 258, + 258, 258, nil, nil, nil, nil, nil, 258, 258, 258, + 258, 258, 258, 258, nil, nil, 258, nil, nil, nil, + nil, nil, nil, 258, nil, nil, 258, 258, 258, 258, + 258, 258, 258, 258, nil, 258, 258, 258, nil, 258, + 258, nil, 258, 258, 258, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 258, nil, nil, 258, nil, nil, + 258, 258, nil, nil, 258, nil, nil, nil, nil, nil, + 258, nil, nil, nil, nil, nil, nil, nil, 258, nil, + nil, nil, nil, 258, 258, 258, 258, 258, 258, nil, + nil, nil, 258, 258, nil, nil, nil, nil, nil, nil, + 258, nil, nil, 258, 258, 258, 259, 259, 259, nil, + 259, nil, nil, nil, 259, 259, nil, nil, nil, 259, + nil, 259, 259, 259, 259, 259, 259, 259, nil, nil, + nil, nil, nil, 259, 259, 259, 259, 259, 259, 259, + nil, nil, 259, nil, nil, nil, nil, nil, nil, 259, + nil, nil, 259, 259, 259, 259, 259, 259, 259, 259, + nil, 259, 259, 259, nil, 259, 259, nil, 259, 259, + 259, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 259, nil, nil, 259, nil, nil, 259, 259, nil, nil, + 259, nil, nil, nil, nil, nil, 259, nil, nil, nil, + nil, nil, nil, nil, 259, nil, nil, nil, nil, 259, + 259, 259, 259, 259, 259, nil, nil, nil, 259, 259, + nil, nil, nil, nil, nil, nil, 259, nil, nil, 259, + 259, 259, 260, 260, 260, nil, 260, nil, nil, nil, + 260, 260, nil, nil, nil, 260, nil, 260, 260, 260, + 260, 260, 260, 260, nil, nil, nil, nil, nil, 260, + 260, 260, 260, 260, 260, 260, nil, nil, 260, nil, + nil, nil, nil, nil, nil, 260, nil, nil, 260, 260, + 260, 260, 260, 260, 260, 260, nil, 260, 260, 260, + nil, 260, 260, nil, 260, 260, 260, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 260, nil, nil, 260, + nil, nil, 260, 260, nil, nil, 260, nil, nil, nil, + nil, nil, 260, nil, nil, nil, nil, nil, nil, nil, + 260, nil, nil, nil, nil, 260, 260, 260, 260, 260, + 260, nil, nil, nil, 260, 260, nil, nil, nil, nil, + nil, nil, 260, nil, nil, 260, 260, 260, 261, 261, + 261, nil, 261, nil, nil, nil, 261, 261, nil, nil, + nil, 261, nil, 261, 261, 261, 261, 261, 261, 261, + nil, nil, nil, nil, nil, 261, 261, 261, 261, 261, + 261, 261, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 261, nil, nil, 261, 261, 261, 261, 261, 261, + 261, 261, nil, 261, 261, 261, nil, 261, 261, nil, + 261, 261, 261, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 261, nil, nil, 261, nil, nil, 261, 261, + nil, nil, 261, nil, nil, nil, nil, nil, 261, nil, + nil, nil, nil, nil, nil, nil, 261, nil, nil, nil, + nil, 261, 261, 261, 261, 261, 261, nil, nil, nil, + 261, 261, nil, nil, nil, nil, nil, nil, 261, nil, + nil, 261, 261, 261, 262, 262, 262, nil, 262, nil, + nil, nil, 262, 262, nil, nil, nil, 262, nil, 262, + 262, 262, 262, 262, 262, 262, nil, nil, nil, nil, + nil, 262, 262, 262, 262, 262, 262, 262, nil, nil, + 262, nil, nil, nil, nil, nil, nil, 262, nil, nil, + 262, 262, 262, 262, 262, 262, 262, 262, nil, 262, + 262, 262, nil, 262, 262, nil, 262, 262, 262, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 262, nil, + nil, 262, nil, nil, 262, 262, nil, nil, 262, nil, + nil, nil, nil, nil, 262, nil, nil, nil, nil, nil, + nil, nil, 262, nil, nil, nil, nil, 262, 262, 262, + 262, 262, 262, nil, nil, nil, 262, 262, nil, nil, + nil, nil, nil, nil, 262, nil, nil, 262, 262, 262, + 263, 263, 263, nil, 263, nil, nil, nil, 263, 263, + nil, nil, nil, 263, nil, 263, 263, 263, 263, 263, + 263, 263, nil, nil, nil, nil, nil, 263, 263, 263, + 263, 263, 263, 263, nil, nil, 263, nil, nil, nil, + nil, nil, nil, 263, nil, nil, 263, 263, 263, 263, + 263, 263, 263, 263, nil, 263, 263, 263, nil, 263, + 263, nil, 263, 263, 263, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 263, nil, nil, 263, nil, nil, + 263, 263, nil, nil, 263, nil, nil, nil, nil, nil, + 263, nil, nil, nil, nil, nil, nil, nil, 263, nil, + nil, nil, nil, 263, 263, 263, 263, 263, 263, nil, + nil, nil, 263, 263, nil, nil, nil, nil, nil, nil, + 263, nil, nil, 263, 263, 263, 264, 264, 264, nil, + 264, nil, nil, nil, 264, 264, nil, nil, nil, 264, + nil, 264, 264, 264, 264, 264, 264, 264, nil, nil, + nil, nil, nil, 264, 264, 264, 264, 264, 264, 264, + nil, nil, 264, nil, nil, nil, nil, nil, nil, 264, + nil, nil, 264, 264, 264, 264, 264, 264, 264, 264, + nil, 264, 264, 264, nil, 264, 264, nil, 264, 264, + 264, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 264, nil, nil, 264, nil, nil, 264, 264, nil, nil, + 264, nil, nil, nil, nil, nil, 264, nil, nil, nil, + nil, nil, nil, nil, 264, nil, nil, nil, nil, 264, + 264, 264, 264, 264, 264, nil, nil, nil, 264, 264, + nil, nil, nil, nil, nil, nil, 264, nil, nil, 264, + 264, 264, 265, 265, 265, nil, 265, nil, nil, nil, + 265, 265, nil, nil, nil, 265, nil, 265, 265, 265, + 265, 265, 265, 265, nil, nil, nil, nil, nil, 265, + 265, 265, 265, 265, 265, 265, nil, nil, 265, nil, + nil, nil, nil, nil, nil, 265, nil, nil, 265, 265, + 265, 265, 265, 265, 265, 265, nil, 265, 265, 265, + nil, 265, 265, nil, 265, 265, 265, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 265, nil, nil, 265, + nil, nil, 265, 265, nil, nil, 265, nil, nil, nil, + nil, nil, 265, nil, nil, nil, nil, nil, nil, nil, + 265, nil, nil, nil, nil, 265, 265, 265, 265, 265, + 265, nil, nil, nil, 265, 265, nil, nil, nil, nil, + nil, nil, 265, nil, nil, 265, 265, 265, 270, 270, + 270, nil, 270, nil, nil, nil, 270, 270, nil, nil, + nil, 270, nil, 270, 270, 270, 270, 270, 270, 270, + nil, nil, nil, nil, nil, 270, 270, 270, 270, 270, + 270, 270, nil, nil, 270, nil, nil, nil, nil, nil, + nil, 270, nil, nil, 270, 270, 270, 270, 270, 270, + 270, 270, nil, 270, 270, 270, nil, 270, 270, nil, + 270, 270, 270, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 270, nil, nil, 270, nil, nil, 270, 270, + nil, nil, 270, nil, nil, nil, nil, nil, 270, nil, + nil, nil, nil, nil, nil, nil, 270, nil, nil, nil, + nil, 270, 270, 270, 270, 270, 270, nil, nil, nil, + 270, 270, nil, nil, nil, nil, nil, nil, 270, nil, + nil, 270, 270, 270, 278, 278, 278, nil, 278, nil, + nil, nil, 278, 278, nil, nil, nil, 278, nil, 278, + 278, 278, 278, 278, 278, 278, nil, nil, nil, nil, + nil, 278, 278, 278, 278, 278, 278, 278, nil, nil, + 278, nil, nil, nil, nil, nil, nil, 278, nil, nil, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, nil, 278, 278, nil, 278, 278, 278, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 278, nil, + nil, 278, nil, nil, 278, 278, nil, nil, 278, nil, + 278, nil, 278, nil, 278, nil, nil, nil, nil, nil, + nil, nil, 278, nil, nil, nil, nil, 278, 278, 278, + 278, 278, 278, nil, nil, nil, 278, 278, nil, nil, + nil, nil, nil, nil, 278, nil, 278, 278, 278, 278, + 279, 279, 279, nil, 279, nil, nil, nil, 279, 279, + nil, nil, nil, 279, nil, 279, 279, 279, 279, 279, + 279, 279, nil, nil, nil, nil, nil, 279, 279, 279, + 279, 279, 279, 279, nil, nil, 279, nil, nil, nil, + nil, nil, nil, 279, nil, nil, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 279, nil, 279, + 279, nil, 279, 279, 279, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 279, nil, nil, 279, nil, nil, + 279, 279, nil, nil, 279, nil, 279, nil, 279, nil, + 279, nil, nil, nil, nil, nil, nil, nil, 279, nil, + nil, nil, nil, 279, 279, 279, 279, 279, 279, nil, + nil, nil, 279, 279, nil, nil, nil, nil, nil, nil, + 279, nil, 279, 279, 279, 279, 288, 288, 288, nil, + 288, nil, nil, nil, 288, 288, nil, nil, nil, 288, + nil, 288, 288, 288, 288, 288, 288, 288, nil, nil, + nil, nil, nil, 288, 288, 288, 288, 288, 288, 288, + nil, nil, 288, nil, nil, nil, nil, nil, nil, 288, + nil, nil, 288, 288, 288, 288, 288, 288, 288, 288, + 288, 288, 288, 288, nil, 288, 288, nil, 288, 288, + 288, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 288, nil, nil, 288, nil, nil, 288, 288, nil, nil, + 288, nil, 288, nil, 288, nil, 288, nil, nil, nil, + nil, nil, nil, nil, 288, nil, nil, nil, nil, 288, + 288, 288, 288, 288, 288, nil, nil, nil, 288, 288, + 288, nil, nil, nil, nil, nil, 288, nil, 288, 288, + 288, 288, 295, 295, 295, nil, 295, nil, nil, nil, + 295, 295, nil, nil, nil, 295, nil, 295, 295, 295, + 295, 295, 295, 295, nil, nil, nil, nil, nil, 295, + 295, 295, 295, 295, 295, 295, nil, nil, 295, nil, + nil, nil, nil, nil, nil, 295, nil, nil, 295, 295, + 295, 295, 295, 295, 295, 295, nil, 295, 295, 295, + nil, 295, 295, nil, 295, 295, 295, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 295, nil, nil, 295, + nil, nil, 295, 295, nil, nil, 295, nil, nil, nil, + nil, nil, 295, nil, nil, nil, nil, nil, nil, nil, + 295, nil, nil, nil, nil, 295, 295, 295, 295, 295, + 295, nil, nil, nil, 295, 295, nil, nil, nil, nil, + nil, nil, 295, nil, nil, 295, 295, 295, 297, 297, + 297, nil, 297, nil, nil, nil, 297, 297, nil, nil, + nil, 297, nil, 297, 297, 297, 297, 297, 297, 297, + nil, nil, nil, nil, nil, 297, 297, 297, 297, 297, + 297, 297, nil, nil, 297, nil, nil, nil, nil, nil, + nil, 297, nil, nil, 297, 297, 297, 297, 297, 297, + 297, 297, nil, 297, 297, 297, nil, 297, 297, nil, + 297, 297, 297, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 297, nil, nil, 297, nil, nil, 297, 297, + nil, nil, 297, nil, nil, nil, nil, nil, 297, nil, + nil, nil, nil, nil, nil, nil, 297, nil, nil, nil, + nil, 297, 297, 297, 297, 297, 297, nil, nil, nil, + 297, 297, nil, nil, nil, nil, nil, nil, 297, nil, + nil, 297, 297, 297, 299, 299, 299, nil, 299, nil, + nil, nil, 299, 299, nil, nil, nil, 299, nil, 299, + 299, 299, 299, 299, 299, 299, nil, nil, nil, nil, + nil, 299, 299, 299, 299, 299, 299, 299, nil, nil, + 299, nil, nil, nil, nil, nil, nil, 299, nil, nil, + 299, 299, 299, 299, 299, 299, 299, 299, nil, 299, + 299, 299, nil, 299, 299, nil, 299, 299, 299, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 299, nil, + nil, 299, nil, nil, 299, 299, nil, nil, 299, nil, + nil, nil, nil, nil, 299, nil, nil, nil, nil, nil, + nil, nil, 299, nil, nil, nil, nil, 299, 299, 299, + 299, 299, 299, nil, nil, nil, 299, 299, nil, nil, + nil, nil, nil, nil, 299, nil, nil, 299, 299, 299, + 300, 300, 300, nil, 300, nil, nil, nil, 300, 300, + nil, nil, nil, 300, nil, 300, 300, 300, 300, 300, + 300, 300, nil, nil, nil, nil, nil, 300, 300, 300, + 300, 300, 300, 300, nil, nil, 300, nil, nil, nil, + nil, nil, nil, 300, nil, nil, 300, 300, 300, 300, + 300, 300, 300, 300, nil, 300, 300, 300, nil, 300, + 300, nil, 300, 300, 300, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 300, nil, nil, 300, nil, nil, + 300, 300, nil, nil, 300, nil, nil, nil, nil, nil, + 300, nil, nil, nil, nil, nil, nil, nil, 300, nil, + nil, nil, nil, 300, 300, 300, 300, 300, 300, nil, + nil, nil, 300, 300, nil, nil, nil, nil, nil, nil, + 300, nil, nil, 300, 300, 300, 306, 306, 306, 306, + 306, nil, nil, nil, 306, 306, nil, nil, nil, 306, + nil, 306, 306, 306, 306, 306, 306, 306, nil, nil, + nil, nil, nil, 306, 306, 306, 306, 306, 306, 306, + nil, nil, 306, nil, nil, nil, nil, nil, 306, 306, + nil, 306, 306, 306, 306, 306, 306, 306, 306, 306, + nil, 306, 306, 306, nil, 306, 306, nil, 306, 306, + 306, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 306, nil, nil, 306, nil, nil, 306, 306, nil, nil, + 306, nil, 306, nil, nil, nil, 306, nil, nil, nil, + nil, nil, nil, nil, 306, nil, nil, nil, nil, 306, + 306, 306, 306, 306, 306, nil, nil, nil, 306, 306, + nil, nil, nil, nil, nil, nil, 306, nil, nil, 306, + 306, 306, 314, 314, 314, nil, 314, nil, nil, nil, + 314, 314, nil, nil, nil, 314, nil, 314, 314, 314, + 314, 314, 314, 314, nil, nil, nil, nil, nil, 314, + 314, 314, 314, 314, 314, 314, nil, nil, 314, nil, + nil, nil, nil, nil, nil, 314, nil, nil, 314, 314, + 314, 314, 314, 314, 314, 314, nil, 314, 314, 314, + nil, 314, 314, nil, nil, nil, 314, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 314, nil, nil, 314, + nil, nil, 314, 314, nil, nil, 314, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 314, 314, 314, 314, 314, + 314, nil, nil, nil, 314, 314, nil, nil, nil, 314, + nil, nil, 314, nil, nil, 314, 314, 314, 331, 331, + 331, nil, 331, nil, nil, nil, 331, 331, nil, nil, + nil, 331, nil, 331, 331, 331, 331, 331, 331, 331, + nil, nil, nil, nil, nil, 331, 331, 331, 331, 331, + 331, 331, nil, nil, 331, nil, nil, nil, nil, nil, + nil, 331, nil, nil, 331, 331, 331, 331, 331, 331, + 331, 331, nil, 331, 331, 331, nil, 331, 331, nil, + nil, nil, 331, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 331, nil, nil, 331, nil, nil, 331, 331, + nil, nil, 331, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 331, 331, 331, 331, 331, 331, nil, nil, nil, + 331, 331, nil, nil, nil, nil, nil, nil, 331, nil, + nil, 331, 331, 331, 339, 339, 339, nil, 339, nil, + nil, nil, 339, 339, nil, nil, nil, 339, nil, 339, + 339, 339, 339, 339, 339, 339, nil, nil, nil, nil, + nil, 339, 339, 339, 339, 339, 339, 339, nil, nil, + 339, nil, nil, nil, nil, nil, nil, 339, nil, nil, + 339, 339, 339, 339, 339, 339, 339, 339, nil, 339, + 339, 339, nil, 339, 339, nil, 339, 339, 339, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 339, nil, + nil, 339, nil, nil, 339, 339, nil, nil, 339, nil, + nil, nil, nil, nil, 339, nil, nil, nil, nil, nil, + nil, nil, 339, nil, nil, nil, nil, 339, 339, 339, + 339, 339, 339, nil, nil, nil, 339, 339, nil, nil, + nil, nil, nil, nil, 339, nil, nil, 339, 339, 339, + 341, 341, 341, nil, 341, nil, nil, nil, 341, 341, + nil, nil, nil, 341, nil, 341, 341, 341, 341, 341, + 341, 341, nil, nil, nil, nil, nil, 341, 341, 341, + 341, 341, 341, 341, nil, nil, 341, nil, nil, nil, + nil, nil, nil, 341, nil, nil, 341, 341, 341, 341, + 341, 341, 341, 341, nil, 341, 341, 341, nil, 341, + 341, nil, 341, 341, 341, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 341, nil, nil, 341, 341, nil, + 341, 341, nil, nil, 341, nil, nil, nil, nil, nil, + 341, nil, nil, nil, nil, nil, nil, nil, 341, nil, + nil, nil, nil, 341, 341, 341, 341, 341, 341, nil, + nil, nil, 341, 341, nil, nil, nil, nil, nil, nil, + 341, nil, nil, 341, 341, 341, 345, 345, 345, nil, + 345, nil, nil, nil, 345, 345, nil, nil, nil, 345, + nil, 345, 345, 345, 345, 345, 345, 345, nil, nil, + nil, nil, nil, 345, 345, 345, 345, 345, 345, 345, + nil, nil, 345, nil, nil, nil, nil, nil, nil, 345, + nil, nil, 345, 345, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 345, nil, 345, 345, nil, 345, 345, + 345, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 345, nil, nil, 345, nil, nil, 345, 345, nil, nil, + 345, nil, 345, nil, nil, nil, 345, nil, nil, nil, + nil, nil, nil, nil, 345, nil, nil, nil, nil, 345, + 345, 345, 345, 345, 345, nil, nil, nil, 345, 345, + nil, nil, nil, nil, nil, nil, 345, nil, 345, 345, + 345, 345, 346, 346, 346, nil, 346, nil, nil, nil, + 346, 346, nil, nil, nil, 346, nil, 346, 346, 346, + 346, 346, 346, 346, nil, nil, nil, nil, nil, 346, + 346, 346, 346, 346, 346, 346, nil, nil, 346, nil, + nil, nil, nil, nil, nil, 346, nil, nil, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, + nil, 346, 346, nil, 346, 346, 346, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 346, nil, nil, 346, + nil, nil, 346, 346, nil, nil, 346, nil, nil, nil, + nil, nil, 346, nil, nil, nil, nil, nil, nil, nil, + 346, nil, nil, nil, nil, 346, 346, 346, 346, 346, + 346, nil, nil, nil, 346, 346, nil, nil, nil, nil, + nil, nil, 346, nil, 346, 346, 346, 346, 351, 351, + 351, nil, 351, nil, nil, nil, 351, 351, nil, nil, + nil, 351, nil, 351, 351, 351, 351, 351, 351, 351, + nil, nil, nil, nil, nil, 351, 351, 351, 351, 351, + 351, 351, nil, nil, 351, nil, nil, nil, nil, nil, + nil, 351, nil, nil, 351, 351, 351, 351, 351, 351, + 351, 351, nil, 351, 351, 351, nil, 351, 351, nil, + 351, 351, 351, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 351, nil, nil, 351, nil, nil, 351, 351, + nil, nil, 351, nil, nil, nil, nil, nil, 351, nil, + nil, nil, nil, nil, nil, nil, 351, nil, nil, nil, + nil, 351, 351, 351, 351, 351, 351, nil, nil, nil, + 351, 351, nil, nil, nil, nil, nil, nil, 351, nil, + nil, 351, 351, 351, 372, 372, 372, nil, 372, nil, + nil, nil, 372, 372, nil, nil, nil, 372, nil, 372, + 372, 372, 372, 372, 372, 372, nil, nil, nil, nil, + nil, 372, 372, 372, 372, 372, 372, 372, nil, nil, + 372, nil, nil, nil, nil, nil, nil, 372, nil, nil, + 372, 372, 372, 372, 372, 372, 372, 372, nil, 372, + 372, 372, nil, 372, 372, nil, 372, 372, 372, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 372, nil, + nil, 372, nil, nil, 372, 372, nil, nil, 372, nil, + nil, nil, nil, nil, 372, nil, nil, nil, nil, nil, + nil, nil, 372, nil, nil, nil, nil, 372, 372, 372, + 372, 372, 372, nil, nil, nil, 372, 372, nil, nil, + nil, nil, nil, nil, 372, nil, nil, 372, 372, 372, + 433, 433, 433, nil, 433, nil, nil, nil, 433, 433, + nil, nil, nil, 433, nil, 433, 433, 433, 433, 433, + 433, 433, nil, nil, nil, nil, nil, 433, 433, 433, + 433, 433, 433, 433, nil, nil, 433, nil, nil, nil, + nil, nil, nil, 433, nil, nil, 433, 433, 433, 433, + 433, 433, 433, 433, nil, 433, 433, 433, nil, 433, + 433, nil, 433, 433, 433, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 433, nil, nil, 433, nil, nil, + 433, 433, nil, nil, 433, nil, nil, nil, nil, nil, + 433, nil, nil, nil, nil, nil, nil, nil, 433, nil, + nil, nil, nil, 433, 433, 433, 433, 433, 433, nil, + nil, nil, 433, 433, nil, nil, nil, nil, nil, nil, + 433, nil, nil, 433, 433, 433, 476, 476, 476, nil, + 476, nil, nil, nil, 476, 476, nil, nil, nil, 476, + nil, 476, 476, 476, 476, 476, 476, 476, nil, nil, + nil, nil, nil, 476, 476, 476, 476, 476, 476, 476, + nil, nil, 476, nil, nil, nil, nil, nil, nil, 476, + nil, nil, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, nil, 476, 476, nil, 476, 476, + 476, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 476, nil, nil, 476, nil, nil, 476, 476, nil, nil, + 476, nil, 476, nil, 476, nil, 476, nil, nil, nil, + nil, nil, nil, nil, 476, nil, nil, nil, nil, 476, + 476, 476, 476, 476, 476, nil, nil, nil, 476, 476, + nil, nil, nil, nil, nil, nil, 476, nil, 476, 476, + 476, 476, 478, 478, 478, nil, 478, nil, nil, nil, + 478, 478, nil, nil, nil, 478, nil, 478, 478, 478, + 478, 478, 478, 478, nil, nil, nil, nil, nil, 478, + 478, 478, 478, 478, 478, 478, nil, nil, 478, nil, + nil, nil, nil, nil, nil, 478, nil, nil, 478, 478, + 478, 478, 478, 478, 478, 478, nil, 478, 478, 478, + nil, 478, 478, nil, 478, 478, 478, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 478, nil, nil, 478, + nil, nil, 478, 478, nil, nil, 478, nil, nil, nil, + nil, nil, 478, nil, nil, nil, nil, nil, nil, nil, + 478, nil, nil, nil, nil, 478, 478, 478, 478, 478, + 478, nil, nil, nil, 478, 478, nil, nil, nil, nil, + nil, nil, 478, nil, nil, 478, 478, 478, 479, 479, + 479, nil, 479, nil, nil, nil, 479, 479, nil, nil, + nil, 479, nil, 479, 479, 479, 479, 479, 479, 479, + nil, nil, nil, nil, nil, 479, 479, 479, 479, 479, + 479, 479, nil, nil, 479, nil, nil, nil, nil, nil, + nil, 479, nil, nil, 479, 479, 479, 479, 479, 479, + 479, 479, nil, 479, 479, 479, nil, 479, 479, nil, + 479, 479, 479, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 479, nil, nil, 479, nil, nil, 479, 479, + nil, nil, 479, nil, nil, nil, nil, nil, 479, nil, + nil, nil, nil, nil, nil, nil, 479, nil, nil, nil, + nil, 479, 479, 479, 479, 479, 479, nil, nil, nil, + 479, 479, nil, nil, nil, nil, nil, nil, 479, nil, + nil, 479, 479, 479, 480, 480, 480, nil, 480, nil, + nil, nil, 480, 480, nil, nil, nil, 480, nil, 480, + 480, 480, 480, 480, 480, 480, nil, nil, nil, nil, + nil, 480, 480, 480, 480, 480, 480, 480, nil, nil, + 480, nil, nil, nil, nil, nil, nil, 480, nil, nil, + 480, 480, 480, 480, 480, 480, 480, 480, nil, 480, + 480, 480, nil, 480, 480, nil, 480, 480, 480, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 480, nil, + nil, 480, nil, nil, 480, 480, nil, nil, 480, nil, + nil, nil, nil, nil, 480, nil, nil, nil, nil, nil, + nil, nil, 480, nil, nil, nil, nil, 480, 480, 480, + 480, 480, 480, nil, nil, nil, 480, 480, nil, nil, + nil, nil, nil, nil, 480, nil, nil, 480, 480, 480, + 518, 518, 518, nil, 518, nil, nil, nil, 518, 518, + nil, nil, nil, 518, nil, 518, 518, 518, 518, 518, + 518, 518, nil, nil, nil, nil, nil, 518, 518, 518, + 518, 518, 518, 518, nil, nil, 518, nil, nil, nil, + nil, nil, nil, 518, nil, nil, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, nil, 518, + 518, nil, 518, 518, 518, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 518, nil, nil, 518, nil, nil, + 518, 518, nil, nil, 518, nil, 518, nil, 518, nil, + 518, nil, nil, nil, nil, nil, nil, nil, 518, nil, + nil, nil, nil, 518, 518, 518, 518, 518, 518, nil, + nil, nil, 518, 518, nil, nil, nil, nil, nil, nil, + 518, nil, 518, 518, 518, 518, 521, 521, 521, nil, + 521, nil, nil, nil, 521, 521, nil, nil, nil, 521, + nil, 521, 521, 521, 521, 521, 521, 521, nil, nil, + nil, nil, nil, 521, 521, 521, 521, 521, 521, 521, + nil, nil, 521, nil, nil, nil, nil, nil, nil, 521, + nil, nil, 521, 521, 521, 521, 521, 521, 521, 521, + 521, 521, 521, 521, nil, 521, 521, nil, 521, 521, + 521, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 521, nil, nil, 521, nil, nil, 521, 521, nil, nil, + 521, nil, nil, nil, 521, nil, 521, nil, nil, nil, + nil, nil, nil, nil, 521, nil, nil, nil, nil, 521, + 521, 521, 521, 521, 521, nil, nil, nil, 521, 521, + nil, nil, nil, nil, nil, nil, 521, nil, 521, 521, + 521, 521, 523, 523, 523, nil, 523, nil, nil, nil, + 523, 523, nil, nil, nil, 523, nil, 523, 523, 523, + 523, 523, 523, 523, nil, nil, nil, nil, nil, 523, + 523, 523, 523, 523, 523, 523, nil, nil, 523, nil, + nil, nil, nil, nil, nil, 523, nil, nil, 523, 523, + 523, 523, 523, 523, 523, 523, nil, 523, 523, 523, + nil, 523, 523, nil, 523, 523, 523, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 523, nil, nil, 523, + nil, nil, 523, 523, nil, nil, 523, nil, nil, nil, + nil, nil, 523, nil, nil, nil, nil, nil, nil, nil, + 523, nil, nil, nil, nil, 523, 523, 523, 523, 523, + 523, nil, nil, nil, 523, 523, nil, nil, nil, nil, + nil, nil, 523, nil, nil, 523, 523, 523, 528, 528, + 528, 528, 528, nil, nil, nil, 528, 528, nil, nil, + nil, 528, nil, 528, 528, 528, 528, 528, 528, 528, + nil, nil, nil, nil, nil, 528, 528, 528, 528, 528, + 528, 528, nil, nil, 528, nil, nil, nil, nil, nil, + 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, + 528, 528, nil, 528, 528, 528, nil, 528, 528, nil, + 528, 528, 528, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 528, nil, nil, 528, nil, nil, 528, 528, + nil, nil, 528, nil, 528, nil, nil, nil, 528, nil, + nil, nil, nil, nil, nil, nil, 528, nil, nil, nil, + nil, 528, 528, 528, 528, 528, 528, nil, nil, nil, + 528, 528, nil, nil, nil, nil, nil, 528, 528, nil, + nil, 528, 528, 528, 536, 536, 536, nil, 536, nil, + nil, nil, 536, 536, nil, nil, nil, 536, nil, 536, + 536, 536, 536, 536, 536, 536, nil, nil, nil, nil, + nil, 536, 536, 536, 536, 536, 536, 536, nil, nil, + 536, nil, nil, nil, nil, nil, nil, 536, nil, nil, + 536, 536, 536, 536, 536, 536, 536, 536, nil, 536, + 536, 536, nil, 536, 536, nil, nil, nil, 536, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 536, nil, + nil, 536, nil, nil, 536, 536, nil, nil, 536, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 536, 536, 536, + 536, 536, 536, nil, nil, nil, 536, 536, nil, nil, + nil, nil, nil, nil, 536, nil, nil, 536, 536, 536, + 538, 538, 538, nil, 538, nil, nil, nil, 538, 538, + nil, nil, nil, 538, nil, 538, 538, 538, 538, 538, + 538, 538, nil, nil, nil, nil, nil, 538, 538, 538, + 538, 538, 538, 538, nil, nil, 538, nil, nil, nil, + nil, nil, nil, 538, nil, nil, 538, 538, 538, 538, + 538, 538, 538, 538, 538, 538, 538, 538, nil, 538, + 538, nil, 538, 538, 538, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 538, nil, nil, 538, nil, nil, + 538, 538, nil, nil, 538, nil, 538, nil, 538, nil, + 538, nil, nil, nil, nil, nil, nil, nil, 538, nil, + nil, nil, nil, 538, 538, 538, 538, 538, 538, nil, + nil, nil, 538, 538, nil, nil, nil, nil, nil, nil, + 538, nil, 538, 538, 538, 538, 545, 545, 545, nil, + 545, nil, nil, nil, 545, 545, nil, nil, nil, 545, + nil, 545, 545, 545, 545, 545, 545, 545, nil, nil, + nil, nil, nil, 545, 545, 545, 545, 545, 545, 545, + nil, nil, 545, nil, nil, nil, nil, nil, nil, 545, + nil, nil, 545, 545, 545, 545, 545, 545, 545, 545, + nil, 545, 545, 545, nil, 545, 545, nil, nil, nil, + 545, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 545, nil, nil, 545, nil, nil, 545, 545, nil, nil, + 545, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 545, + 545, 545, 545, 545, 545, nil, nil, nil, 545, 545, + nil, nil, nil, nil, nil, nil, 545, nil, nil, 545, + 545, 545, 548, 548, 548, nil, 548, nil, nil, nil, + 548, 548, nil, nil, nil, 548, nil, 548, 548, 548, + 548, 548, 548, 548, nil, nil, nil, nil, nil, 548, + 548, 548, 548, 548, 548, 548, nil, nil, 548, nil, + nil, nil, nil, nil, nil, 548, nil, nil, 548, 548, + 548, 548, 548, 548, 548, 548, nil, 548, 548, 548, + nil, 548, 548, nil, 548, 548, 548, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 548, nil, nil, 548, + nil, nil, 548, 548, nil, nil, 548, nil, nil, nil, + nil, nil, 548, nil, nil, nil, nil, nil, nil, nil, + 548, nil, nil, nil, nil, 548, 548, 548, 548, 548, + 548, nil, nil, nil, 548, 548, nil, nil, nil, nil, + nil, nil, 548, nil, nil, 548, 548, 548, 549, 549, + 549, nil, 549, nil, nil, nil, 549, 549, nil, nil, + nil, 549, nil, 549, 549, 549, 549, 549, 549, 549, + nil, nil, nil, nil, nil, 549, 549, 549, 549, 549, + 549, 549, nil, nil, 549, nil, nil, nil, nil, nil, + nil, 549, nil, nil, 549, 549, 549, 549, 549, 549, + 549, 549, nil, 549, 549, 549, nil, 549, 549, nil, + 549, 549, 549, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 549, nil, nil, 549, nil, nil, 549, 549, + nil, nil, 549, nil, nil, nil, nil, nil, 549, nil, + nil, nil, nil, nil, nil, nil, 549, nil, nil, nil, + nil, 549, 549, 549, 549, 549, 549, nil, nil, nil, + 549, 549, nil, nil, nil, nil, nil, nil, 549, nil, + nil, 549, 549, 549, 550, 550, 550, nil, 550, nil, + nil, nil, 550, 550, nil, nil, nil, 550, nil, 550, + 550, 550, 550, 550, 550, 550, nil, nil, nil, nil, + nil, 550, 550, 550, 550, 550, 550, 550, nil, nil, + 550, nil, nil, nil, nil, nil, nil, 550, nil, nil, + 550, 550, 550, 550, 550, 550, 550, 550, nil, 550, + 550, 550, nil, 550, 550, nil, 550, 550, 550, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 550, nil, + nil, 550, nil, nil, 550, 550, nil, nil, 550, nil, + nil, nil, nil, nil, 550, nil, nil, nil, nil, nil, + nil, nil, 550, nil, nil, nil, nil, 550, 550, 550, + 550, 550, 550, nil, nil, nil, 550, 550, nil, nil, + nil, nil, nil, nil, 550, nil, nil, 550, 550, 550, + 555, 555, 555, nil, 555, nil, nil, nil, 555, 555, + nil, nil, nil, 555, nil, 555, 555, 555, 555, 555, + 555, 555, nil, nil, nil, nil, nil, 555, 555, 555, + 555, 555, 555, 555, nil, nil, 555, nil, nil, nil, + nil, nil, nil, 555, nil, nil, 555, 555, 555, 555, + 555, 555, 555, 555, nil, 555, 555, 555, nil, 555, + 555, nil, 555, 555, 555, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 555, nil, nil, 555, nil, nil, + 555, 555, nil, nil, 555, nil, nil, nil, nil, nil, + 555, nil, nil, nil, nil, nil, nil, nil, 555, nil, + nil, nil, nil, 555, 555, 555, 555, 555, 555, nil, + nil, nil, 555, 555, nil, nil, nil, nil, nil, nil, + 555, nil, nil, 555, 555, 555, 579, 579, 579, nil, + 579, nil, nil, nil, 579, 579, nil, nil, nil, 579, + nil, 579, 579, 579, 579, 579, 579, 579, nil, nil, + nil, nil, nil, 579, 579, 579, 579, 579, 579, 579, + nil, nil, 579, nil, nil, nil, nil, nil, nil, 579, + nil, nil, 579, 579, 579, 579, 579, 579, 579, 579, + 579, 579, 579, 579, nil, 579, 579, nil, 579, 579, + 579, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 579, nil, nil, 579, nil, nil, 579, 579, nil, nil, + 579, nil, 579, nil, 579, nil, 579, nil, nil, nil, + nil, nil, nil, nil, 579, nil, nil, nil, nil, 579, + 579, 579, 579, 579, 579, nil, nil, nil, 579, 579, + nil, nil, nil, nil, nil, nil, 579, nil, 579, 579, + 579, 579, 589, 589, 589, nil, 589, nil, nil, nil, + 589, 589, nil, nil, nil, 589, nil, 589, 589, 589, + 589, 589, 589, 589, nil, nil, nil, nil, nil, 589, + 589, 589, 589, 589, 589, 589, nil, nil, 589, nil, + nil, nil, nil, nil, nil, 589, nil, nil, 589, 589, + 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, + nil, 589, 589, nil, 589, 589, 589, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 589, nil, nil, 589, + nil, nil, 589, 589, nil, nil, 589, nil, 589, nil, + 589, nil, 589, nil, nil, nil, nil, nil, nil, nil, + 589, nil, nil, nil, nil, 589, 589, 589, 589, 589, + 589, nil, nil, nil, 589, 589, nil, nil, nil, nil, + nil, nil, 589, nil, 589, 589, 589, 589, 599, 599, + 599, nil, 599, nil, nil, nil, 599, 599, nil, nil, + nil, 599, nil, 599, 599, 599, 599, 599, 599, 599, + nil, nil, nil, nil, nil, 599, 599, 599, 599, 599, + 599, 599, nil, nil, 599, nil, nil, nil, nil, nil, + nil, 599, nil, nil, 599, 599, 599, 599, 599, 599, + 599, 599, nil, 599, 599, 599, nil, 599, 599, nil, + 599, 599, 599, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 599, nil, nil, 599, nil, nil, 599, 599, + nil, nil, 599, nil, nil, nil, nil, nil, 599, nil, + nil, nil, nil, nil, nil, nil, 599, nil, nil, nil, + nil, 599, 599, 599, 599, 599, 599, nil, nil, nil, + 599, 599, nil, nil, nil, nil, nil, nil, 599, nil, + nil, 599, 599, 599, 619, 619, 619, nil, 619, nil, + nil, nil, 619, 619, nil, nil, nil, 619, nil, 619, + 619, 619, 619, 619, 619, 619, nil, nil, nil, nil, + nil, 619, 619, 619, 619, 619, 619, 619, nil, nil, + 619, nil, nil, nil, nil, nil, nil, 619, nil, nil, + 619, 619, 619, 619, 619, 619, 619, 619, nil, 619, + 619, 619, nil, 619, 619, nil, 619, 619, 619, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 619, nil, + nil, 619, nil, nil, 619, 619, nil, nil, 619, nil, + nil, nil, nil, nil, 619, nil, nil, nil, nil, nil, + nil, nil, 619, nil, nil, nil, nil, 619, 619, 619, + 619, 619, 619, nil, nil, nil, 619, 619, nil, nil, + nil, nil, nil, nil, 619, nil, nil, 619, 619, 619, + 659, 659, 659, nil, 659, nil, nil, nil, 659, 659, + nil, nil, nil, 659, nil, 659, 659, 659, 659, 659, + 659, 659, nil, nil, nil, nil, nil, 659, 659, 659, + 659, 659, 659, 659, nil, nil, 659, nil, nil, nil, + nil, nil, nil, 659, nil, nil, 659, 659, 659, 659, + 659, 659, 659, 659, nil, 659, 659, 659, nil, 659, + 659, nil, 659, 659, 659, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 659, nil, nil, 659, nil, nil, + 659, 659, nil, nil, 659, nil, 659, nil, nil, nil, + 659, nil, nil, nil, nil, nil, nil, nil, 659, nil, + nil, nil, nil, 659, 659, 659, 659, 659, 659, nil, + nil, nil, 659, 659, nil, nil, nil, nil, nil, nil, + 659, nil, nil, 659, 659, 659, 660, 660, 660, nil, + 660, nil, nil, nil, 660, 660, nil, nil, nil, 660, + nil, 660, 660, 660, 660, 660, 660, 660, nil, nil, + nil, nil, nil, 660, 660, 660, 660, 660, 660, 660, + nil, nil, 660, nil, nil, nil, nil, nil, nil, 660, + nil, nil, 660, 660, 660, 660, 660, 660, 660, 660, + nil, 660, 660, 660, nil, 660, 660, nil, 660, 660, + 660, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 660, nil, nil, 660, nil, nil, 660, 660, nil, nil, + 660, nil, nil, nil, nil, nil, 660, nil, nil, nil, + nil, nil, nil, nil, 660, nil, nil, nil, nil, 660, + 660, 660, 660, 660, 660, nil, nil, nil, 660, 660, + nil, nil, nil, nil, nil, nil, 660, nil, nil, 660, + 660, 660, 661, 661, 661, nil, 661, nil, nil, nil, + 661, 661, nil, nil, nil, 661, nil, 661, 661, 661, + 661, 661, 661, 661, nil, nil, nil, nil, nil, 661, + 661, 661, 661, 661, 661, 661, nil, nil, 661, nil, + nil, nil, nil, nil, nil, 661, nil, nil, 661, 661, + 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, + nil, 661, 661, nil, 661, 661, 661, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 661, nil, nil, 661, + nil, nil, 661, 661, nil, nil, 661, nil, 661, nil, + 661, nil, 661, nil, nil, nil, nil, nil, nil, nil, + 661, nil, nil, nil, nil, 661, 661, 661, 661, 661, + 661, nil, nil, nil, 661, 661, nil, nil, nil, nil, + nil, nil, 661, nil, 661, 661, 661, 661, 664, 664, + 664, nil, 664, nil, nil, nil, 664, 664, nil, nil, + nil, 664, nil, 664, 664, 664, 664, 664, 664, 664, + nil, nil, nil, nil, nil, 664, 664, 664, 664, 664, + 664, 664, nil, nil, 664, nil, nil, nil, nil, nil, + nil, 664, nil, nil, 664, 664, 664, 664, 664, 664, + 664, 664, nil, 664, 664, 664, nil, 664, 664, nil, + 664, 664, 664, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 664, nil, nil, 664, nil, nil, 664, 664, + nil, nil, 664, nil, nil, nil, nil, nil, 664, nil, + nil, nil, nil, nil, nil, nil, 664, nil, nil, nil, + nil, 664, 664, 664, 664, 664, 664, nil, nil, nil, + 664, 664, nil, nil, nil, nil, nil, nil, 664, nil, + nil, 664, 664, 664, 667, 667, 667, nil, 667, nil, + nil, nil, 667, 667, nil, nil, nil, 667, nil, 667, + 667, 667, 667, 667, 667, 667, nil, nil, nil, nil, + nil, 667, 667, 667, 667, 667, 667, 667, nil, nil, + 667, nil, nil, nil, nil, nil, nil, 667, nil, nil, + 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, + 667, 667, nil, 667, 667, nil, 667, 667, 667, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 667, nil, + nil, 667, nil, nil, 667, 667, nil, nil, 667, nil, + 667, nil, 667, nil, 667, nil, nil, nil, nil, nil, + nil, nil, 667, nil, nil, nil, nil, 667, 667, 667, + 667, 667, 667, nil, nil, nil, 667, 667, nil, nil, + nil, nil, nil, nil, 667, nil, 667, 667, 667, 667, + 668, 668, 668, nil, 668, nil, nil, nil, 668, 668, + nil, nil, nil, 668, nil, 668, 668, 668, 668, 668, + 668, 668, nil, nil, nil, nil, nil, 668, 668, 668, + 668, 668, 668, 668, nil, nil, 668, nil, nil, nil, + nil, nil, nil, 668, nil, nil, 668, 668, 668, 668, + 668, 668, 668, 668, 668, 668, 668, 668, nil, 668, + 668, nil, 668, 668, 668, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 668, nil, nil, 668, nil, nil, + 668, 668, nil, nil, 668, nil, nil, nil, 668, nil, + 668, nil, nil, nil, nil, nil, nil, nil, 668, nil, + nil, nil, nil, 668, 668, 668, 668, 668, 668, nil, + nil, nil, 668, 668, nil, nil, nil, nil, nil, nil, + 668, nil, 668, 668, 668, 668, 669, 669, 669, nil, + 669, nil, nil, nil, 669, 669, nil, nil, nil, 669, + nil, 669, 669, 669, 669, 669, 669, 669, nil, nil, + nil, nil, nil, 669, 669, 669, 669, 669, 669, 669, + nil, nil, 669, nil, nil, nil, nil, nil, nil, 669, + nil, nil, 669, 669, 669, 669, 669, 669, 669, 669, + nil, 669, 669, 669, nil, 669, 669, nil, 669, 669, + 669, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 669, nil, nil, 669, nil, nil, 669, 669, nil, nil, + 669, nil, nil, nil, nil, nil, 669, nil, nil, nil, + nil, nil, nil, nil, 669, nil, nil, nil, nil, 669, + 669, 669, 669, 669, 669, nil, nil, nil, 669, 669, + nil, nil, nil, nil, nil, nil, 669, nil, nil, 669, + 669, 669, 670, 670, 670, nil, 670, nil, nil, nil, + 670, 670, nil, nil, nil, 670, nil, 670, 670, 670, + 670, 670, 670, 670, nil, nil, nil, nil, nil, 670, + 670, 670, 670, 670, 670, 670, nil, nil, 670, nil, + nil, nil, nil, nil, nil, 670, nil, nil, 670, 670, + 670, 670, 670, 670, 670, 670, nil, 670, 670, 670, + nil, 670, 670, nil, 670, 670, 670, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 670, nil, nil, 670, + nil, nil, 670, 670, nil, nil, 670, nil, nil, nil, + nil, nil, 670, nil, nil, nil, nil, nil, nil, nil, + 670, nil, nil, nil, nil, 670, 670, 670, 670, 670, + 670, nil, nil, nil, 670, 670, nil, nil, nil, nil, + nil, nil, 670, nil, nil, 670, 670, 670, 675, 675, + 675, nil, 675, nil, nil, nil, 675, 675, nil, nil, + nil, 675, nil, 675, 675, 675, 675, 675, 675, 675, + nil, nil, nil, nil, nil, 675, 675, 675, 675, 675, + 675, 675, nil, nil, 675, nil, nil, nil, nil, nil, + nil, 675, nil, nil, 675, 675, 675, 675, 675, 675, + 675, 675, nil, 675, 675, 675, nil, 675, 675, nil, + 675, 675, 675, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 675, nil, nil, 675, nil, nil, 675, 675, + nil, nil, 675, nil, nil, nil, nil, nil, 675, nil, + nil, nil, nil, nil, nil, nil, 675, nil, nil, nil, + nil, 675, 675, 675, 675, 675, 675, nil, nil, nil, + 675, 675, nil, nil, nil, nil, nil, nil, 675, nil, + nil, 675, 675, 675, 676, 676, 676, nil, 676, nil, + nil, nil, 676, 676, nil, nil, nil, 676, nil, 676, + 676, 676, 676, 676, 676, 676, nil, nil, nil, nil, + nil, 676, 676, 676, 676, 676, 676, 676, nil, nil, + 676, nil, nil, nil, nil, nil, nil, 676, nil, nil, + 676, 676, 676, 676, 676, 676, 676, 676, nil, 676, + 676, 676, nil, 676, 676, nil, 676, 676, 676, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 676, nil, + nil, 676, nil, nil, 676, 676, nil, nil, 676, nil, + nil, nil, nil, nil, 676, nil, nil, nil, nil, nil, + nil, nil, 676, nil, nil, nil, nil, 676, 676, 676, + 676, 676, 676, nil, nil, nil, 676, 676, nil, nil, + nil, nil, nil, nil, 676, nil, nil, 676, 676, 676, + 700, 700, 700, nil, 700, nil, nil, nil, 700, 700, + nil, nil, nil, 700, nil, 700, 700, 700, 700, 700, + 700, 700, nil, nil, nil, nil, nil, 700, 700, 700, + 700, 700, 700, 700, nil, nil, 700, nil, nil, nil, + nil, nil, nil, 700, nil, nil, 700, 700, 700, 700, + 700, 700, 700, 700, nil, 700, 700, 700, nil, 700, + 700, nil, 700, 700, 700, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 700, nil, nil, 700, nil, nil, + 700, 700, nil, nil, 700, nil, nil, nil, nil, nil, + 700, nil, nil, nil, nil, nil, nil, nil, 700, nil, + nil, nil, nil, 700, 700, 700, 700, 700, 700, nil, + nil, nil, 700, 700, nil, nil, nil, nil, nil, nil, + 700, nil, nil, 700, 700, 700, 706, 706, 706, nil, + 706, nil, nil, nil, 706, 706, nil, nil, nil, 706, + nil, 706, 706, 706, 706, 706, 706, 706, nil, nil, + nil, nil, nil, 706, 706, 706, 706, 706, 706, 706, + nil, nil, 706, nil, nil, nil, nil, nil, nil, 706, + nil, nil, 706, 706, 706, 706, 706, 706, 706, 706, + nil, 706, 706, 706, nil, 706, 706, nil, nil, nil, + 706, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 706, nil, nil, 706, nil, nil, 706, 706, nil, nil, + 706, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 706, + 706, 706, 706, 706, 706, nil, nil, nil, 706, 706, + nil, nil, nil, nil, nil, nil, 706, nil, nil, 706, + 706, 706, 717, 717, 717, nil, 717, nil, nil, nil, + 717, 717, nil, nil, nil, 717, nil, 717, 717, 717, + 717, 717, 717, 717, nil, nil, nil, nil, nil, 717, + 717, 717, 717, 717, 717, 717, nil, nil, 717, nil, + nil, nil, nil, nil, nil, 717, nil, nil, 717, 717, + 717, 717, 717, 717, 717, 717, nil, 717, 717, 717, + nil, 717, 717, nil, nil, nil, 717, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 717, nil, nil, 717, + nil, nil, 717, 717, nil, nil, 717, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 717, 717, 717, 717, 717, + 717, nil, nil, nil, 717, 717, nil, nil, nil, nil, + nil, nil, 717, nil, nil, 717, 717, 717, 724, 724, + 724, nil, 724, nil, nil, nil, 724, 724, nil, nil, + nil, 724, nil, 724, 724, 724, 724, 724, 724, 724, + nil, nil, nil, nil, nil, 724, 724, 724, 724, 724, + 724, 724, nil, nil, 724, nil, nil, nil, nil, nil, + nil, 724, nil, nil, 724, 724, 724, 724, 724, 724, + 724, 724, nil, 724, 724, 724, nil, 724, 724, nil, + 724, 724, 724, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 724, nil, nil, 724, nil, nil, 724, 724, + nil, nil, 724, nil, 724, nil, nil, nil, 724, nil, + nil, nil, nil, nil, nil, nil, 724, nil, nil, nil, + nil, 724, 724, 724, 724, 724, 724, nil, nil, nil, + 724, 724, nil, nil, nil, nil, nil, nil, 724, nil, + nil, 724, 724, 724, 729, 729, 729, nil, 729, nil, + nil, nil, 729, 729, nil, nil, nil, 729, nil, 729, + 729, 729, 729, 729, 729, 729, nil, nil, nil, nil, + nil, 729, 729, 729, 729, 729, 729, 729, nil, nil, + 729, nil, nil, nil, nil, nil, nil, 729, nil, nil, + 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, + 729, 729, nil, 729, 729, nil, 729, 729, 729, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 729, nil, + nil, 729, nil, nil, 729, 729, nil, nil, 729, nil, + 729, nil, nil, nil, 729, nil, nil, nil, nil, nil, + nil, nil, 729, nil, nil, nil, nil, 729, 729, 729, + 729, 729, 729, nil, nil, nil, 729, 729, nil, nil, + nil, nil, nil, nil, 729, nil, 729, 729, 729, 729, + 732, 732, 732, nil, 732, nil, nil, nil, 732, 732, + nil, nil, nil, 732, nil, 732, 732, 732, 732, 732, + 732, 732, nil, nil, nil, nil, nil, 732, 732, 732, + 732, 732, 732, 732, nil, nil, 732, nil, nil, nil, + nil, nil, nil, 732, nil, nil, 732, 732, 732, 732, + 732, 732, 732, 732, 732, 732, 732, 732, nil, 732, + 732, nil, 732, 732, 732, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 732, nil, nil, 732, nil, nil, + 732, 732, nil, nil, 732, nil, nil, nil, nil, nil, + 732, nil, nil, nil, nil, nil, nil, nil, 732, nil, + nil, nil, nil, 732, 732, 732, 732, 732, 732, nil, + nil, nil, 732, 732, nil, nil, nil, nil, nil, nil, + 732, nil, 732, 732, 732, 732, 746, 746, 746, nil, + 746, nil, nil, nil, 746, 746, nil, nil, nil, 746, + nil, 746, 746, 746, 746, 746, 746, 746, nil, nil, + nil, nil, nil, 746, 746, 746, 746, 746, 746, 746, + nil, nil, 746, nil, nil, nil, nil, nil, nil, 746, + nil, nil, 746, 746, 746, 746, 746, 746, 746, 746, + nil, 746, 746, 746, nil, 746, 746, nil, 746, 746, + 746, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 746, nil, nil, 746, nil, nil, 746, 746, nil, nil, + 746, nil, 746, nil, nil, nil, 746, nil, nil, nil, + nil, nil, nil, nil, 746, nil, nil, nil, nil, 746, + 746, 746, 746, 746, 746, nil, nil, nil, 746, 746, + nil, nil, nil, nil, nil, nil, 746, nil, nil, 746, + 746, 746, 758, 758, 758, nil, 758, nil, nil, nil, + 758, 758, nil, nil, nil, 758, nil, 758, 758, 758, + 758, 758, 758, 758, nil, nil, nil, nil, nil, 758, + 758, 758, 758, 758, 758, 758, nil, nil, 758, nil, + nil, nil, nil, nil, nil, 758, nil, nil, 758, 758, + 758, 758, 758, 758, 758, 758, nil, 758, 758, 758, + nil, 758, 758, nil, 758, 758, 758, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 758, nil, nil, 758, + nil, nil, 758, 758, nil, nil, 758, nil, nil, nil, + nil, nil, 758, nil, nil, nil, nil, nil, nil, nil, + 758, nil, nil, nil, nil, 758, 758, 758, 758, 758, + 758, nil, nil, nil, 758, 758, nil, nil, nil, nil, + nil, nil, 758, nil, nil, 758, 758, 758, 778, 778, + 778, nil, 778, nil, nil, nil, 778, 778, nil, nil, + nil, 778, nil, 778, 778, 778, 778, 778, 778, 778, + nil, nil, nil, nil, nil, 778, 778, 778, 778, 778, + 778, 778, nil, nil, 778, nil, nil, nil, nil, nil, + nil, 778, nil, nil, 778, 778, 778, 778, 778, 778, + 778, 778, nil, 778, 778, 778, nil, 778, 778, nil, + 778, 778, 778, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 778, nil, nil, 778, nil, nil, 778, 778, + nil, nil, 778, nil, nil, nil, nil, nil, 778, nil, + nil, nil, nil, nil, nil, nil, 778, nil, nil, nil, + nil, 778, 778, 778, 778, 778, 778, nil, nil, nil, + 778, 778, nil, nil, nil, nil, nil, nil, 778, nil, + nil, 778, 778, 778, 801, 801, 801, nil, 801, nil, + nil, nil, 801, 801, nil, nil, nil, 801, nil, 801, + 801, 801, 801, 801, 801, 801, nil, nil, nil, nil, + nil, 801, 801, 801, 801, 801, 801, 801, nil, nil, + 801, nil, nil, nil, nil, nil, nil, 801, nil, nil, + 801, 801, 801, 801, 801, 801, 801, 801, nil, 801, + 801, 801, nil, 801, 801, nil, 801, 801, 801, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 801, nil, + nil, 801, nil, nil, 801, 801, nil, nil, 801, nil, + nil, nil, nil, nil, 801, nil, nil, nil, nil, nil, + nil, nil, 801, nil, nil, nil, nil, 801, 801, 801, + 801, 801, 801, nil, nil, nil, 801, 801, nil, nil, + nil, nil, nil, nil, 801, nil, nil, 801, 801, 801, + 808, 808, 808, nil, 808, nil, nil, nil, 808, 808, + nil, nil, nil, 808, nil, 808, 808, 808, 808, 808, + 808, 808, nil, nil, nil, nil, nil, 808, 808, 808, + 808, 808, 808, 808, nil, nil, 808, nil, nil, nil, + nil, nil, nil, 808, nil, nil, 808, 808, 808, 808, + 808, 808, 808, 808, nil, 808, 808, 808, nil, 808, + 808, nil, 808, 808, 808, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 808, nil, nil, 808, nil, nil, + 808, 808, nil, nil, 808, nil, nil, nil, nil, nil, + 808, nil, nil, nil, nil, nil, nil, nil, 808, nil, + nil, nil, nil, 808, 808, 808, 808, 808, 808, nil, + nil, nil, 808, 808, nil, nil, nil, nil, nil, nil, + 808, nil, nil, 808, 808, 808, 821, 821, 821, nil, + 821, nil, nil, nil, 821, 821, nil, nil, nil, 821, + nil, 821, 821, 821, 821, 821, 821, 821, nil, nil, + nil, nil, nil, 821, 821, 821, 821, 821, 821, 821, + nil, nil, 821, nil, nil, nil, nil, nil, nil, 821, + nil, nil, 821, 821, 821, 821, 821, 821, 821, 821, + nil, 821, 821, 821, nil, 821, 821, nil, 821, 821, + 821, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 821, nil, nil, 821, nil, nil, 821, 821, nil, nil, + 821, nil, nil, nil, nil, nil, 821, nil, nil, nil, + nil, nil, nil, nil, 821, nil, nil, nil, nil, 821, + 821, 821, 821, 821, 821, nil, nil, nil, 821, 821, + nil, nil, nil, nil, nil, nil, 821, nil, nil, 821, + 821, 821, 822, 822, 822, nil, 822, nil, nil, nil, + 822, 822, nil, nil, nil, 822, nil, 822, 822, 822, + 822, 822, 822, 822, nil, nil, nil, nil, nil, 822, + 822, 822, 822, 822, 822, 822, nil, nil, 822, nil, + nil, nil, nil, nil, nil, 822, nil, nil, 822, 822, + 822, 822, 822, 822, 822, 822, nil, 822, 822, 822, + nil, 822, 822, nil, 822, 822, 822, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 822, nil, nil, 822, + nil, nil, 822, 822, nil, nil, 822, nil, nil, nil, + nil, nil, 822, nil, nil, nil, nil, nil, nil, nil, + 822, nil, nil, nil, nil, 822, 822, 822, 822, 822, + 822, nil, nil, nil, 822, 822, nil, nil, nil, nil, + nil, nil, 822, nil, nil, 822, 822, 822, 823, 823, + 823, nil, 823, nil, nil, nil, 823, 823, nil, nil, + nil, 823, nil, 823, 823, 823, 823, 823, 823, 823, + nil, nil, nil, nil, nil, 823, 823, 823, 823, 823, + 823, 823, nil, nil, 823, nil, nil, nil, nil, nil, + nil, 823, nil, nil, 823, 823, 823, 823, 823, 823, + 823, 823, nil, 823, 823, 823, nil, 823, 823, nil, + 823, 823, 823, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 823, nil, nil, 823, nil, nil, 823, 823, + nil, nil, 823, nil, nil, nil, nil, nil, 823, nil, + nil, nil, nil, nil, nil, nil, 823, nil, nil, nil, + nil, 823, 823, 823, 823, 823, 823, nil, nil, nil, + 823, 823, nil, nil, nil, nil, nil, nil, 823, nil, + nil, 823, 823, 823, 824, 824, 824, nil, 824, nil, + nil, nil, 824, 824, nil, nil, nil, 824, nil, 824, + 824, 824, 824, 824, 824, 824, nil, nil, nil, nil, + nil, 824, 824, 824, 824, 824, 824, 824, nil, nil, + 824, nil, nil, nil, nil, nil, nil, 824, nil, nil, + 824, 824, 824, 824, 824, 824, 824, 824, nil, 824, + 824, 824, nil, 824, 824, nil, 824, 824, 824, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 824, nil, + nil, 824, nil, nil, 824, 824, nil, nil, 824, nil, + nil, nil, nil, nil, 824, nil, nil, nil, nil, nil, + nil, nil, 824, nil, nil, nil, nil, 824, 824, 824, + 824, 824, 824, nil, nil, nil, 824, 824, nil, nil, + nil, nil, nil, nil, 824, nil, nil, 824, 824, 824, + 826, 826, 826, nil, 826, nil, nil, nil, 826, 826, + nil, nil, nil, 826, nil, 826, 826, 826, 826, 826, + 826, 826, nil, nil, nil, nil, nil, 826, 826, 826, + 826, 826, 826, 826, nil, nil, 826, nil, nil, nil, + nil, nil, nil, 826, nil, nil, 826, 826, 826, 826, + 826, 826, 826, 826, nil, 826, 826, 826, nil, 826, + 826, nil, 826, 826, 826, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 826, nil, nil, 826, nil, nil, + 826, 826, nil, nil, 826, nil, nil, nil, nil, nil, + 826, nil, nil, nil, nil, nil, nil, nil, 826, nil, + nil, nil, nil, 826, 826, 826, 826, 826, 826, nil, + nil, nil, 826, 826, nil, nil, nil, nil, nil, nil, + 826, nil, nil, 826, 826, 826, 858, 858, 858, nil, + 858, nil, nil, nil, 858, 858, nil, nil, nil, 858, + nil, 858, 858, 858, 858, 858, 858, 858, nil, nil, + nil, nil, nil, 858, 858, 858, 858, 858, 858, 858, + nil, nil, 858, nil, nil, nil, nil, nil, nil, 858, + nil, nil, 858, 858, 858, 858, 858, 858, 858, 858, + nil, 858, 858, 858, nil, 858, 858, nil, 858, 858, + 858, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 858, nil, nil, 858, nil, nil, 858, 858, nil, nil, + 858, nil, nil, nil, nil, nil, 858, nil, nil, nil, + nil, nil, nil, nil, 858, nil, nil, nil, nil, 858, + 858, 858, 858, 858, 858, nil, nil, nil, 858, 858, + nil, nil, nil, nil, nil, nil, 858, nil, nil, 858, + 858, 858, 865, 865, 865, nil, 865, nil, nil, nil, + 865, 865, nil, nil, nil, 865, nil, 865, 865, 865, + 865, 865, 865, 865, nil, nil, nil, nil, nil, 865, + 865, 865, 865, 865, 865, 865, nil, nil, 865, nil, + nil, nil, nil, nil, nil, 865, nil, nil, 865, 865, + 865, 865, 865, 865, 865, 865, nil, 865, 865, 865, + nil, 865, 865, nil, 865, 865, 865, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 865, nil, nil, 865, + nil, nil, 865, 865, nil, nil, 865, nil, nil, nil, + nil, nil, 865, nil, nil, nil, nil, nil, nil, nil, + 865, nil, nil, nil, nil, 865, 865, 865, 865, 865, + 865, nil, nil, nil, 865, 865, nil, nil, nil, nil, + nil, nil, 865, nil, nil, 865, 865, 865, 912, 912, + 912, nil, 912, nil, nil, nil, 912, 912, nil, nil, + nil, 912, nil, 912, 912, 912, 912, 912, 912, 912, + nil, nil, nil, nil, nil, 912, 912, 912, 912, 912, + 912, 912, nil, nil, 912, nil, nil, nil, nil, nil, + nil, 912, nil, nil, 912, 912, 912, 912, 912, 912, + 912, 912, 912, 912, 912, 912, nil, 912, 912, nil, + 912, 912, 912, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 912, nil, nil, 912, nil, nil, 912, 912, + nil, nil, 912, nil, nil, nil, 912, nil, 912, nil, + nil, nil, nil, nil, nil, nil, 912, nil, nil, nil, + nil, 912, 912, 912, 912, 912, 912, nil, nil, nil, + 912, 912, nil, nil, nil, nil, nil, nil, 912, nil, + 912, 912, 912, 912, 913, 913, 913, nil, 913, nil, + nil, nil, 913, 913, nil, nil, nil, 913, nil, 913, + 913, 913, 913, 913, 913, 913, nil, nil, nil, nil, + nil, 913, 913, 913, 913, 913, 913, 913, nil, nil, + 913, nil, nil, nil, nil, nil, nil, 913, nil, nil, + 913, 913, 913, 913, 913, 913, 913, 913, nil, 913, + 913, 913, nil, 913, 913, nil, 913, 913, 913, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 913, nil, + nil, 913, nil, nil, 913, 913, nil, nil, 913, nil, + nil, nil, nil, nil, 913, nil, nil, nil, nil, nil, + nil, nil, 913, nil, nil, nil, nil, 913, 913, 913, + 913, 913, 913, nil, nil, nil, 913, 913, nil, nil, + nil, nil, nil, nil, 913, nil, nil, 913, 913, 913, + 925, 925, 925, nil, 925, nil, nil, nil, 925, 925, + nil, nil, nil, 925, nil, 925, 925, 925, 925, 925, + 925, 925, nil, nil, nil, nil, nil, 925, 925, 925, + 925, 925, 925, 925, nil, nil, 925, nil, nil, nil, + nil, nil, nil, 925, nil, nil, 925, 925, 925, 925, + 925, 925, 925, 925, nil, 925, 925, 925, nil, 925, + 925, nil, nil, nil, 925, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 925, nil, nil, 925, nil, nil, + 925, 925, nil, nil, 925, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 925, 925, 925, 925, 925, 925, nil, + nil, nil, 925, 925, nil, nil, nil, nil, nil, nil, + 925, nil, nil, 925, 925, 925, 934, 934, 934, nil, + 934, nil, nil, nil, 934, 934, nil, nil, nil, 934, + nil, 934, 934, 934, 934, 934, 934, 934, nil, nil, + nil, nil, nil, 934, 934, 934, 934, 934, 934, 934, + nil, nil, 934, nil, nil, nil, nil, nil, nil, 934, + nil, nil, 934, 934, 934, 934, 934, 934, 934, 934, + nil, 934, 934, 934, nil, 934, 934, nil, nil, nil, + 934, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 934, nil, nil, 934, nil, nil, 934, 934, nil, nil, + 934, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 934, + 934, 934, 934, 934, 934, nil, nil, nil, 934, 934, + nil, nil, nil, nil, nil, nil, 934, nil, nil, 934, + 934, 934, 942, 942, 942, nil, 942, nil, nil, nil, + 942, 942, nil, nil, nil, 942, nil, 942, 942, 942, + 942, 942, 942, 942, nil, nil, nil, nil, nil, 942, + 942, 942, 942, 942, 942, 942, nil, nil, 942, nil, + nil, nil, nil, nil, nil, 942, nil, nil, 942, 942, + 942, 942, 942, 942, 942, 942, nil, 942, 942, 942, + nil, 942, 942, nil, 942, 942, 942, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 942, nil, nil, 942, + nil, nil, 942, 942, nil, nil, 942, nil, 942, nil, + nil, nil, 942, nil, nil, nil, nil, nil, nil, nil, + 942, nil, nil, nil, nil, 942, 942, 942, 942, 942, + 942, nil, nil, nil, 942, 942, nil, nil, nil, nil, + nil, nil, 942, nil, nil, 942, 942, 942, 983, 983, + 983, nil, 983, nil, nil, nil, 983, 983, nil, nil, + nil, 983, nil, 983, 983, 983, 983, 983, 983, 983, + nil, nil, nil, nil, nil, 983, 983, 983, 983, 983, + 983, 983, nil, nil, 983, nil, nil, nil, nil, nil, + nil, 983, nil, nil, 983, 983, 983, 983, 983, 983, + 983, 983, nil, 983, 983, 983, nil, 983, 983, nil, + nil, nil, 983, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 983, nil, nil, 983, nil, nil, 983, 983, + nil, nil, 983, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 983, 983, 983, 983, 983, 983, nil, nil, nil, + 983, 983, nil, nil, nil, nil, nil, nil, 983, nil, + nil, 983, 983, 983, 997, 997, 997, nil, 997, nil, + nil, nil, 997, 997, nil, nil, nil, 997, nil, 997, + 997, 997, 997, 997, 997, 997, nil, nil, nil, nil, + nil, 997, 997, 997, 997, 997, 997, 997, nil, nil, + 997, nil, nil, nil, nil, nil, nil, 997, nil, nil, + 997, 997, 997, 997, 997, 997, 997, 997, nil, 997, + 997, 997, nil, 997, 997, nil, 997, 997, 997, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 997, nil, + nil, 997, nil, nil, 997, 997, nil, nil, 997, nil, + nil, nil, nil, nil, 997, nil, nil, nil, nil, nil, + nil, nil, 997, nil, nil, nil, nil, 997, 997, 997, + 997, 997, 997, nil, nil, nil, 997, 997, nil, nil, + nil, nil, nil, nil, 997, nil, nil, 997, 997, 997, + 1028, 1028, 1028, nil, 1028, nil, nil, nil, 1028, 1028, + nil, nil, nil, 1028, nil, 1028, 1028, 1028, 1028, 1028, + 1028, 1028, nil, nil, nil, nil, nil, 1028, 1028, 1028, + 1028, 1028, 1028, 1028, nil, nil, 1028, nil, nil, nil, + nil, nil, nil, 1028, nil, nil, 1028, 1028, 1028, 1028, + 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, nil, 1028, + 1028, nil, 1028, 1028, 1028, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1028, nil, nil, 1028, nil, nil, + 1028, 1028, nil, nil, 1028, nil, 1028, nil, 1028, nil, + 1028, nil, nil, nil, nil, nil, nil, nil, 1028, nil, + nil, nil, nil, 1028, 1028, 1028, 1028, 1028, 1028, nil, + nil, nil, 1028, 1028, nil, nil, nil, nil, nil, nil, + 1028, nil, 1028, 1028, 1028, 1028, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + nil, nil, nil, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, nil, nil, nil, nil, nil, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, nil, 11, + nil, nil, nil, nil, nil, nil, nil, nil, 11, 11, + nil, 11, 11, 11, 11, 11, 11, 11, nil, nil, + 11, 11, nil, nil, nil, 11, 11, 11, 11, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 11, 11, nil, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, nil, nil, 11, 11, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 11, + nil, nil, nil, nil, nil, nil, nil, nil, 11, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, nil, nil, nil, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, nil, nil, nil, nil, + nil, 12, 12, 12, 12, 12, 12, 12, 12, 12, + nil, nil, 12, nil, nil, nil, nil, nil, nil, nil, + nil, 12, 12, nil, 12, 12, 12, 12, 12, 12, + 12, nil, nil, 12, 12, nil, nil, nil, 12, 12, + 12, 12, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 12, 12, nil, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, nil, + nil, 12, 12, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 12, nil, nil, nil, nil, nil, nil, nil, + nil, 12, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, nil, nil, nil, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, nil, + nil, nil, nil, nil, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, nil, 75, nil, nil, + nil, nil, nil, nil, 75, 75, nil, 75, 75, 75, + 75, 75, 75, 75, nil, nil, 75, 75, nil, nil, + nil, 75, 75, 75, 75, nil, nil, nil, nil, nil, + 75, nil, nil, nil, nil, nil, nil, nil, 75, 75, + nil, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, nil, nil, 75, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 75, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, nil, + nil, nil, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, nil, nil, nil, nil, nil, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, nil, + 105, nil, nil, nil, nil, nil, nil, 105, 105, nil, + 105, 105, 105, 105, 105, 105, 105, nil, nil, 105, + 105, nil, nil, nil, 105, 105, 105, 105, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 105, nil, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, nil, nil, 105, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 424, 424, + 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, + 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, + 424, 424, nil, nil, nil, 424, 424, 424, 424, 424, + 424, 424, 424, 424, 424, nil, nil, nil, nil, nil, + 424, 424, 424, 424, 424, 424, 424, 424, 424, nil, + nil, 424, nil, nil, nil, nil, nil, nil, nil, nil, + 424, 424, nil, 424, 424, 424, 424, 424, 424, 424, + nil, nil, 424, 424, nil, nil, nil, 424, 424, 424, + 424, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 424, 424, nil, 424, 424, 424, + 424, 424, 424, 424, 424, 424, 424, 424, nil, nil, + 424, 424, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 424, nil, nil, nil, nil, nil, nil, nil, nil, + 424, 656, 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, nil, nil, nil, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, nil, nil, + nil, nil, nil, 656, 656, 656, 656, 656, 656, 656, + 656, 656, nil, nil, 656, nil, nil, nil, nil, nil, + nil, nil, nil, 656, 656, nil, 656, 656, 656, 656, + 656, 656, 656, nil, nil, 656, 656, nil, nil, nil, + 656, 656, 656, 656, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 656, 656, nil, + 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, + 656, nil, nil, 656, 656, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 656, nil, nil, nil, nil, nil, + nil, nil, nil, 656, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, nil, nil, + nil, 764, 764, 764, 764, 764, 764, 764, 764, 764, + 764, nil, nil, nil, nil, nil, 764, 764, 764, 764, + 764, 764, 764, 764, 764, nil, nil, 764, nil, nil, + nil, nil, nil, nil, nil, nil, 764, 764, nil, 764, + 764, 764, 764, 764, 764, 764, nil, nil, 764, 764, + nil, nil, nil, 764, 764, 764, 764, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 764, 764, nil, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, nil, nil, 764, nil, nil, nil, + nil, 225, 225, nil, nil, 225, nil, nil, nil, nil, + nil, nil, nil, nil, 225, 225, 764, 225, 225, 225, + 225, 225, 225, 225, nil, nil, 225, 225, nil, nil, + nil, 225, 225, 225, 225, nil, nil, nil, nil, nil, + 225, nil, nil, nil, nil, nil, nil, nil, 225, 225, + nil, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, nil, nil, 225, nil, nil, nil, nil, 226, + 226, nil, nil, 226, nil, nil, nil, nil, nil, nil, + nil, nil, 226, 226, 225, 226, 226, 226, 226, 226, + 226, 226, nil, nil, 226, 226, nil, nil, nil, 226, + 226, 226, 226, nil, nil, nil, nil, nil, 226, nil, + nil, nil, nil, nil, nil, nil, 226, 226, nil, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + nil, nil, 226, nil, nil, nil, nil, 274, 274, nil, + nil, 274, nil, nil, nil, nil, nil, nil, nil, nil, + 274, 274, 226, 274, 274, 274, 274, 274, 274, 274, + nil, nil, 274, 274, nil, nil, nil, 274, 274, 274, + 274, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 274, 274, nil, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, nil, nil, + 274, nil, nil, nil, nil, 474, 474, nil, nil, 474, + nil, nil, nil, nil, nil, nil, nil, nil, 474, 474, + 274, 474, 474, 474, 474, 474, 474, 474, nil, nil, + 474, 474, nil, nil, nil, 474, 474, 474, 474, nil, + nil, nil, nil, nil, 474, nil, nil, nil, nil, nil, + nil, nil, 474, 474, nil, 474, 474, 474, 474, 474, + 474, 474, 474, 474, 474, 474, nil, nil, 474, nil, + nil, nil, nil, 475, 475, nil, nil, 475, nil, nil, + nil, nil, nil, nil, nil, nil, 475, 475, 474, 475, + 475, 475, 475, 475, 475, 475, nil, nil, 475, 475, + nil, nil, nil, 475, 475, 475, 475, nil, nil, nil, + nil, nil, 475, nil, nil, nil, nil, nil, nil, nil, + 475, 475, nil, 475, 475, 475, 475, 475, 475, 475, + 475, 475, 475, 475, nil, nil, 475, nil, nil, nil, + nil, 539, 539, nil, nil, 539, nil, nil, nil, nil, + nil, nil, nil, nil, 539, 539, 475, 539, 539, 539, + 539, 539, 539, 539, nil, nil, 539, 539, nil, nil, + nil, 539, 539, 539, 539, nil, nil, nil, nil, nil, + 539, nil, nil, nil, nil, nil, nil, nil, 539, 539, + nil, 539, 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, nil, nil, 539, nil, nil, nil, nil, 540, + 540, nil, nil, 540, nil, nil, nil, nil, nil, nil, + nil, nil, 540, 540, 539, 540, 540, 540, 540, 540, + 540, 540, nil, nil, 540, 540, nil, nil, nil, 540, + 540, 540, 540, nil, nil, nil, nil, nil, 540, nil, + nil, nil, nil, nil, nil, nil, 540, 540, nil, 540, + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + nil, nil, 540, nil, nil, nil, nil, 551, 551, nil, + nil, 551, nil, nil, nil, nil, nil, nil, nil, nil, + 551, 551, 540, 551, 551, 551, 551, 551, 551, 551, + nil, nil, 551, 551, nil, nil, nil, 551, 551, 551, + 551, nil, nil, nil, nil, nil, 551, nil, nil, nil, + nil, nil, nil, nil, 551, 551, nil, 551, 551, 551, + 551, 551, 551, 551, 551, 551, 551, 551, nil, nil, + 551, nil, nil, nil, nil, 552, 552, nil, nil, 552, + nil, nil, nil, nil, nil, nil, nil, nil, 552, 552, + 551, 552, 552, 552, 552, 552, 552, 552, nil, nil, + 552, 552, nil, nil, nil, 552, 552, 552, 552, nil, + nil, nil, nil, nil, 552, nil, nil, nil, nil, nil, + nil, nil, 552, 552, nil, 552, 552, 552, 552, 552, + 552, 552, 552, 552, 552, 552, nil, nil, 552, nil, + nil, nil, nil, 580, 580, nil, nil, 580, nil, nil, + nil, nil, nil, nil, nil, nil, 580, 580, 552, 580, + 580, 580, 580, 580, 580, 580, nil, nil, 580, 580, + nil, nil, nil, 580, 580, 580, 580, nil, nil, nil, + nil, nil, 580, nil, nil, nil, nil, nil, nil, nil, + 580, 580, nil, 580, 580, 580, 580, 580, 580, 580, + 580, 580, 580, 580, nil, nil, 580, nil, nil, nil, + nil, 581, 581, nil, nil, 581, nil, nil, nil, nil, + nil, nil, nil, nil, 581, 581, 580, 581, 581, 581, + 581, 581, 581, 581, nil, nil, 581, 581, nil, nil, + nil, 581, 581, 581, 581, nil, nil, nil, nil, nil, + 581, nil, nil, nil, nil, nil, nil, nil, 581, 581, + nil, 581, 581, 581, 581, 581, 581, 581, 581, 581, + 581, 581, nil, nil, 581, nil, nil, nil, nil, 587, + 587, nil, nil, 587, nil, nil, nil, nil, nil, nil, + nil, nil, 587, 587, 581, 587, 587, 587, 587, 587, + 587, 587, nil, nil, 587, 587, nil, nil, nil, 587, + 587, 587, 587, nil, nil, nil, nil, nil, 587, nil, + nil, nil, nil, nil, nil, nil, 587, 587, nil, 587, + 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, + nil, nil, 587, nil, nil, nil, nil, 588, 588, nil, + nil, 588, nil, nil, nil, nil, nil, nil, nil, nil, + 588, 588, 587, 588, 588, 588, 588, 588, 588, 588, + nil, nil, 588, 588, nil, nil, nil, 588, 588, 588, + 588, nil, nil, nil, nil, nil, 588, nil, nil, nil, + nil, nil, nil, nil, 588, 588, nil, 588, 588, 588, + 588, 588, 588, 588, 588, 588, 588, 588, nil, nil, + 588, nil, nil, nil, nil, 662, 662, nil, nil, 662, + nil, nil, nil, nil, nil, nil, nil, nil, 662, 662, + 588, 662, 662, 662, 662, 662, 662, 662, nil, nil, + 662, 662, nil, nil, nil, 662, 662, 662, 662, nil, + nil, nil, nil, nil, 662, nil, nil, nil, nil, nil, + nil, nil, 662, 662, nil, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, nil, nil, 662, nil, + nil, nil, nil, 663, 663, nil, nil, 663, nil, nil, + nil, nil, nil, nil, nil, nil, 663, 663, 662, 663, + 663, 663, 663, 663, 663, 663, nil, nil, 663, 663, + nil, nil, nil, 663, 663, 663, 663, nil, nil, nil, + nil, nil, 663, nil, nil, nil, nil, nil, nil, nil, + 663, 663, nil, 663, 663, 663, 663, 663, 663, 663, + 663, 663, 663, 663, nil, 974, 663, 974, 974, 974, + 974, 974, 977, nil, 977, 977, 977, 977, 977, nil, + nil, 974, nil, nil, nil, nil, 663, nil, 977, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 974, nil, nil, nil, nil, nil, nil, + 977, nil, 974, 974, 974, 974, nil, nil, nil, 977, + 977, 977, 977, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1024, 1024, nil, nil, 1024, nil, nil, nil, 974, nil, + nil, nil, nil, 1024, 1024, 977, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, nil, nil, 1024, 1024, nil, nil, nil, + 1024, 1024, 1024, 1024, nil, nil, nil, nil, nil, 1024, + nil, nil, nil, nil, nil, nil, nil, 1024, 1024, nil, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, nil, nil, 1024, nil, nil, nil, nil, 1029, 1029, + nil, nil, 1029, nil, nil, nil, nil, nil, nil, nil, + nil, 1029, 1029, 1024, 1029, 1029, 1029, 1029, 1029, 1029, + 1029, nil, nil, 1029, 1029, nil, nil, nil, 1029, 1029, + 1029, 1029, nil, nil, nil, nil, nil, 1029, nil, nil, + nil, nil, nil, nil, nil, 1029, 1029, nil, 1029, 1029, + 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, nil, + nil, 1029, nil, nil, nil, nil, 1030, 1030, nil, nil, + 1030, nil, nil, nil, nil, nil, nil, nil, nil, 1030, + 1030, 1029, 1030, 1030, 1030, 1030, 1030, 1030, 1030, nil, + nil, 1030, 1030, nil, nil, nil, 1030, 1030, 1030, 1030, + nil, nil, nil, nil, nil, 1030, nil, nil, nil, nil, + nil, nil, nil, 1030, 1030, nil, 1030, 1030, 1030, 1030, + 1030, 1030, 1030, 1030, 1030, 1030, 1030, nil, 1048, 1030, + 1048, 1048, 1048, 1048, 1048, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1048, nil, nil, nil, nil, 1030, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1048, nil, nil, nil, + nil, nil, nil, nil, nil, 1048, 1048, 1048, 1048, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1048 ] + +racc_action_pointer = [ + nil, 100, 0, 114, nil, 597, nil, nil, 5806, 1203, + nil, 23214, 23347, 111, nil, 108, 158, 118, 243, 234, + 228, nil, 104, 5942, 2245, 305, nil, 228, nil, 142, + 1060, 1188, 6078, 6214, 6350, nil, 1971, 6486, 6622, nil, + 205, 271, 439, 371, 117, 6758, 6894, 716, 7030, 314, + 435, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1316, nil, 7166, nil, nil, 87, nil, 7302, 7438, nil, + nil, 7574, 7710, 7846, 7982, 23480, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 176, nil, nil, nil, nil, nil, nil, 312, + 354, 366, 415, nil, nil, 23613, nil, nil, nil, 0, + nil, nil, 134, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 8118, nil, nil, nil, nil, + 8254, 8390, 8526, 8662, 8798, 453, nil, 403, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 447, nil, 2108, 8934, + 9070, 9206, 9342, 9478, 9614, 24080, 24148, nil, 9750, 9886, + 10022, nil, nil, 575, 96, 216, 534, 230, 471, 533, + nil, 10158, 2245, 532, 10294, 10430, 10566, 10702, 10838, 10974, + 11110, 11246, 11382, 11518, 11654, 11790, 11926, 12062, 12198, 12334, + 12470, 12606, 12742, 12878, 13014, 13150, nil, nil, nil, nil, + 13286, nil, nil, nil, 24216, nil, nil, 529, 13422, 13558, + nil, nil, nil, nil, nil, nil, nil, nil, 13694, nil, + 2382, nil, 501, 516, nil, 13830, 567, 13966, nil, 14102, + 14238, nil, nil, 648, nil, nil, 14374, 1263, nil, 526, + 2382, 541, 584, 550, 14510, 2519, 604, 672, 735, 626, + 766, nil, 593, 561, 209, nil, nil, nil, 609, 135, + 593, 14646, nil, 448, 663, 678, 801, nil, 687, 14782, + nil, 14918, 2656, 1268, 630, 15054, 15190, nil, 313, 13, + 69, 15326, 2793, 2930, 677, 744, 645, 36, 39, 836, + 730, 97, 762, nil, nil, 308, 329, 169, nil, 837, + nil, 680, 15462, nil, nil, nil, 246, 337, 404, 455, + 496, 502, 506, 538, 562, nil, 624, nil, nil, 461, + nil, 266, nil, 306, nil, 461, nil, 676, 325, nil, + 686, 371, nil, 687, 63, nil, 709, 156, nil, 426, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 23746, nil, nil, nil, nil, 730, + nil, 716, nil, 15598, 726, nil, 716, nil, 870, 238, + nil, nil, nil, 1971, nil, nil, nil, nil, nil, 2108, + 731, nil, nil, 734, 735, 525, 545, 1448, nil, nil, + nil, 268, 396, 798, nil, nil, 1576, 1708, nil, nil, + nil, 120, nil, 803, 24284, 24352, 15734, 240, 15870, 16006, + 16142, 1840, 3067, 697, 755, 831, 833, 841, 843, 1658, + 4300, 4324, 3204, 3341, 3478, 3615, 3752, 3889, 621, 813, + 4026, 4163, 2519, 1010, 904, nil, 1840, nil, nil, nil, + nil, 794, nil, nil, nil, 797, nil, nil, 16278, nil, + nil, 16414, nil, 16550, nil, nil, nil, nil, 16686, 1321, + 816, 806, 808, nil, nil, 820, 16822, 832, 16958, 24420, + 24488, 893, 869, nil, nil, 17094, 831, nil, 17230, 17366, + 17502, 24556, 24624, 1398, 2656, 17638, 954, 966, 851, nil, + nil, 359, 449, 856, 870, nil, 587, 904, 3067, 1003, + nil, 3204, 125, 1007, 1009, 1005, 1013, nil, nil, 17774, + 24692, 24760, 98, nil, nil, 929, nil, 24828, 24896, 17910, + nil, nil, nil, 324, 3341, 936, nil, nil, nil, 18046, + nil, 595, nil, 907, 911, nil, 912, 922, 925, nil, + nil, nil, nil, nil, nil, 922, nil, 664, nil, 18182, + nil, nil, nil, 1020, nil, nil, nil, 1027, nil, nil, + 1030, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 262, nil, nil, 389, nil, nil, nil, 952, + nil, nil, 953, nil, 3478, nil, 23879, nil, 955, 18318, + 18454, 18590, 24964, 25032, 18726, 557, 1003, 18862, 18998, 19134, + 19270, 1008, nil, nil, nil, 19406, 19542, 1009, nil, nil, + nil, 242, 276, 530, 664, 981, 980, nil, -19, 1085, + 190, nil, nil, 1005, nil, 1111, nil, 993, nil, 1035, + 19678, nil, nil, nil, nil, 53, 19814, 995, nil, 1015, + 58, 161, 1057, 340, 971, 1062, 1027, 19950, nil, 1093, + 1103, 127, 306, nil, 20086, nil, nil, nil, nil, 20222, + nil, nil, 20358, nil, nil, nil, 518, nil, 1161, nil, + nil, nil, nil, nil, 1168, nil, 20494, 1057, 129, 164, + 165, 167, 3615, 365, 985, nil, 1058, 3752, 20630, 705, + 1176, 3889, 727, 890, 24012, 144, 162, 1066, 357, nil, + nil, 453, 991, nil, 1152, nil, 1280, nil, 20766, nil, + 764, nil, 1064, 1065, 899, nil, 1073, nil, nil, nil, + nil, 927, 4026, nil, nil, nil, nil, nil, 1098, nil, + 1083, 20902, 1087, 277, 314, 798, 926, 2793, 21038, nil, + 1087, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 21174, 21310, 21446, 21582, 358, 21718, nil, nil, 1379, + nil, 4163, nil, nil, 1105, nil, 214, nil, nil, nil, + 1091, 366, nil, nil, nil, nil, nil, nil, 4300, nil, + 1092, 1135, nil, nil, 704, 1224, nil, nil, 21854, nil, + 4437, 1228, nil, nil, nil, 21990, 140, 168, 1230, nil, + 1231, 716, nil, nil, 1238, 1122, 765, nil, nil, nil, + 4574, 4711, 1118, 1128, 1140, nil, nil, nil, 1141, 1145, + nil, 1146, 1148, nil, 1151, nil, 1155, 795, 539, nil, + nil, nil, nil, nil, nil, nil, 1146, nil, 1159, 366, + nil, nil, 22126, 22262, 2930, 1161, 1169, nil, 1171, 1183, + 1184, nil, 1209, 1194, 1181, 22398, nil, nil, nil, nil, + 4848, 4985, nil, 118, 22534, nil, nil, nil, 133, nil, + nil, nil, 22670, 5122, nil, nil, nil, 5259, nil, nil, + nil, 1232, 1214, 1329, 1125, nil, nil, 1540, nil, 1639, + nil, 1771, nil, 1833, nil, nil, nil, nil, 1210, 1211, + nil, 485, nil, nil, 25094, nil, nil, 25101, nil, 5986, + nil, nil, 1232, 22806, 934, 1290, nil, 1338, 5396, 965, + 1010, 1032, 1293, 1064, nil, 5533, nil, 22942, 302, 1340, + 5670, nil, nil, 761, nil, nil, nil, 1221, 1222, 1225, + 1236, 657, 919, 1237, nil, nil, 1238, 1239, 1241, 1242, + nil, 1243, nil, 1068, 25169, nil, nil, 1366, 23078, 25237, + 25305, 1096, 550, nil, nil, nil, nil, nil, 1365, nil, + 1181, 6666, nil, nil, nil, nil, 1246, nil, 25367, nil, + 6802, nil, 6938, nil, 7074, nil, nil, 1286, 1287, nil, + 1252, 147, 154, 160, 1132, nil, nil, nil, 1250, 1253, + 1268, 1269, 1273, 157, nil, 7346, nil, nil, nil, nil, + 1274, nil ] + +racc_action_default = [ + -1, -637, -636, -637, -2, -623, -4, -5, -637, -8, + -9, -637, -637, -637, -36, -637, -637, -41, -637, -637, + -291, -52, -625, -637, -57, -62, -63, -64, -68, -270, + -270, -270, -306, -336, -337, -80, -636, -84, -92, -94, + -637, -530, -531, -637, -637, -637, -637, -229, -637, -625, + -243, -282, -283, -284, -285, -286, -287, -288, -289, -290, + -610, -293, -295, -302, -304, -314, -316, -637, -637, -59, + -59, -623, -637, -637, -637, -637, -338, -339, -341, -342, + -343, -344, -345, -346, -347, -348, -349, -350, -359, -414, + -462, -463, -464, -465, -466, -636, -469, -636, -636, -636, + -636, -636, -636, -505, -506, -636, -508, -514, -515, -608, + -519, -520, -609, -522, -523, -524, -525, -526, -527, -528, + -529, -534, -535, 1082, -3, -624, -632, -633, -634, -7, + -637, -637, -637, -637, -637, -637, -24, -637, -123, -124, + -125, -126, -127, -128, -129, -133, -134, -135, -136, -137, + -138, -139, -140, -141, -142, -143, -144, -145, -146, -147, + -148, -149, -150, -151, -152, -153, -154, -155, -156, -157, + -158, -159, -160, -161, -162, -163, -164, -165, -166, -167, + -168, -169, -170, -171, -172, -173, -174, -175, -176, -177, + -178, -179, -180, -181, -182, -183, -184, -185, -186, -187, + -188, -189, -190, -191, -192, -193, -194, -195, -196, -197, + -198, -199, -200, -201, -202, -203, -29, -130, -636, -637, + -637, -637, -637, -637, -636, -637, -637, -620, -637, -637, + -625, -626, -56, -637, -530, -531, -637, -291, -637, -637, + -235, -637, -636, -637, -637, -637, -637, -637, -637, -637, + -637, -637, -637, -637, -637, -637, -637, -637, -637, -637, + -637, -637, -637, -637, -637, -637, -244, -245, -246, -247, + -637, -352, -442, -422, -637, -621, -622, -69, -636, -637, + -313, -351, -426, -435, -437, -75, -432, -76, -625, -77, + -250, -265, -636, -636, -269, -637, -275, -637, -603, -637, + -637, -78, -79, -623, -17, -18, -637, -21, -22, -82, + -636, -625, -637, -85, -88, -636, -100, -101, -637, -637, + -108, -306, -309, -625, -637, -336, -337, -340, -433, -637, + -90, -637, -96, -301, -516, -517, -637, -223, -224, -637, + -236, -637, -636, -297, -625, -636, -636, -315, -58, -637, + -637, -637, -636, -636, -623, -637, -624, -530, -531, -637, + -637, -291, -637, -369, -370, -118, -119, -637, -121, -637, + -291, -636, -637, -530, -531, -329, -123, -124, -163, -164, + -165, -181, -186, -193, -196, -331, -637, -598, -599, -562, + -467, -637, -490, -637, -492, -637, -494, -637, -637, -474, + -637, -637, -480, -637, -637, -486, -637, -637, -488, -637, + -507, -509, -510, -511, -512, -6, -635, -30, -31, -32, + -33, -34, -10, -11, -637, -26, -27, -28, -131, -637, + -37, -39, -40, -637, -637, -38, -637, -42, -637, -291, + -50, -51, -204, -255, -275, -53, -54, -43, -205, -255, + -625, -260, -261, -636, -636, -611, -612, -270, -430, -613, + -614, -612, -611, -270, -429, -431, -613, -614, -49, -212, + -55, -625, -312, -637, -637, -637, -636, -301, -637, -637, + -637, -213, -214, -215, -216, -217, -218, -219, -220, -225, + -226, -227, -228, -230, -231, -232, -233, -234, -237, -238, + -239, -240, -625, -248, -637, -443, -270, -611, -612, -66, + -70, -625, -271, -439, -442, -625, -308, -266, -637, -274, + -267, -637, -272, -637, -276, -606, -607, -16, -624, -20, + -637, -625, -81, -299, -97, -86, -637, -625, -636, -637, + -637, -107, -637, -516, -517, -637, -93, -98, -637, -637, + -637, -637, -637, -249, -241, -637, -454, -637, -625, -296, + -251, -629, -629, -625, -637, -601, -629, -637, -636, -360, + -361, -636, -637, -637, -637, -637, -637, -355, -449, -636, + -637, -637, -301, -59, -118, -119, -120, -637, -637, -636, + -324, -536, -538, -326, -636, -540, -333, -618, -619, -637, + -415, -562, -418, -597, -597, -545, -547, -547, -547, -561, + -563, -564, -565, -566, -567, -568, -569, -637, -571, -637, + -577, -579, -580, -582, -587, -589, -590, -592, -593, -594, + -637, -468, -491, -496, -497, -499, -470, -493, -471, -495, + -472, -473, -637, -476, -478, -637, -479, -482, -483, -637, + -484, -485, -637, -513, -636, -25, -637, -35, -281, -637, + -637, -636, -637, -637, -637, -434, -637, -262, -264, -637, + -637, -71, -258, -259, -427, -637, -637, -73, -428, -311, + -627, -611, -612, -611, -612, -625, -637, -421, -636, -65, + -423, -439, -257, -637, -440, -637, -307, -636, -273, -277, + -637, -604, -605, -19, -23, -83, -637, -89, -95, -625, + -611, -612, -636, -104, -106, -637, -91, -637, -211, -221, + -222, -625, -636, -353, -636, -294, -358, -298, -252, -631, + -630, -254, -631, -303, -305, -602, -636, -362, -636, -60, + -363, -364, -319, -320, -637, -322, -637, -625, -611, -612, + -615, -300, -636, -118, -119, -122, -625, -636, -637, -637, + -637, -636, -562, -562, -637, -625, -637, -625, -637, -543, + -544, -637, -637, -554, -637, -557, -637, -559, -637, -371, + -637, -373, -375, -378, -381, -568, -625, -573, -581, -591, + -595, -637, -636, -475, -477, -481, -487, -489, -637, -132, + -279, -637, -625, -611, -612, -612, -611, -256, -637, -628, + -636, -45, -207, -46, -208, -72, -47, -210, -48, -209, + -74, -637, -637, -637, -637, -434, -637, -403, -404, -625, + -406, -636, -425, -424, -637, -436, -636, -438, -268, -278, + -87, -102, -99, -310, -13, -15, -354, -356, -636, -461, + -455, -636, -456, -457, -629, -637, -357, -365, -637, -367, + -636, -637, -61, -321, -445, -637, -637, -434, -637, -434, + -637, -637, -327, -330, -637, -625, -637, -334, -600, -416, + -636, -636, -408, -625, -597, -578, -596, -546, -547, -547, + -572, -547, -547, -588, -547, -583, -625, -637, -637, -380, + -570, -498, -501, -502, -503, -504, -637, -12, -280, -434, + -44, -206, -263, -637, -242, -597, -597, -385, -636, -636, + -636, -402, -637, -625, -568, -637, -575, -585, -444, -67, + -636, -636, -460, -637, -637, -459, -253, -317, -637, -368, + -318, -446, -637, -636, -323, -325, -537, -636, -332, -539, + -541, -540, -637, -637, -637, -417, -542, -637, -550, -637, + -552, -637, -555, -637, -558, -560, -372, -374, -376, -379, + -500, -637, -383, -384, -393, -387, -395, -637, -398, -637, + -400, -405, -637, -637, -574, -637, -441, -636, -636, -109, + -110, -637, -637, -117, -458, -636, -447, -637, -636, -637, + -636, -419, -420, -625, -410, -412, -413, -547, -547, -547, + -547, -637, -637, -597, -576, -386, -636, -636, -636, -636, + -586, -636, -407, -584, -637, -301, -14, -454, -636, -637, + -637, -116, -636, -448, -450, -451, -452, -328, -637, -409, + -637, -637, -548, -551, -553, -556, -377, -382, -637, -390, + -637, -392, -637, -396, -637, -399, -401, -300, -615, -453, + -625, -611, -612, -615, -115, -366, -335, -411, -547, -636, + -636, -636, -636, -434, -549, -637, -388, -391, -394, -397, + -636, -389 ] + +racc_goto_table = [ + 6, 225, 450, 229, 385, 273, 4, 128, 576, 275, + 448, 347, 422, 282, 286, 469, 141, 141, 349, 350, + 352, 353, 354, 701, 291, 291, 291, 232, 457, 463, + 341, 520, 327, 327, 411, 722, 568, 571, 292, 292, + 292, 447, 9, 510, 313, 557, 468, 761, 9, 125, + 348, 348, 698, 855, 348, 698, 511, 136, 217, 144, + 144, 432, 435, 293, 293, 293, 309, 327, 327, 327, + 546, 845, 330, 128, 277, 285, 287, 506, 665, 861, + 141, 417, 418, 419, 420, 728, 731, 769, 770, 124, + 735, 504, 786, 392, 693, 394, 396, 399, 402, 405, + 408, 779, 343, 392, 890, 602, 311, 883, 609, 893, + 141, 586, 831, 348, 348, 348, 348, 919, 129, 1020, + 969, 967, 1004, 1, 1006, 472, 391, 642, 371, 375, + 645, 2, 289, 301, 302, 135, 409, 654, 844, 931, + 637, 703, 639, 530, 216, 643, 364, 424, 643, 739, + 862, 274, 691, 656, 339, 355, 563, 690, 387, 564, + 362, 590, 386, 441, 596, 9, 441, 342, 344, 922, + 701, 441, 558, 345, 421, 346, 757, 759, 947, 594, + 595, 764, 951, 516, 968, 921, 923, 1003, 600, 879, + 1020, 733, 520, 389, 766, 513, 514, 836, 866, 688, + 1034, 698, 698, 746, 445, 446, 532, 851, 1067, 458, + 1006, 933, 470, 471, 390, 474, 291, 393, 395, 398, + 401, 404, 451, 430, 440, 434, 434, 440, 744, 407, + 901, 467, 440, 1046, 701, 415, 967, 791, 792, 559, + 410, 758, 888, 885, 1014, 599, nil, nil, nil, nil, + nil, nil, nil, nil, 685, 896, nil, nil, nil, nil, + 930, nil, 1016, 982, 779, 469, nil, 448, 899, nil, + 291, 291, 834, nil, nil, 707, 451, 457, 463, nil, + 291, nil, nil, nil, 716, 292, nil, nil, nil, nil, + 519, 519, 893, 19, 292, 890, nil, 760, nil, 19, + 539, nil, 572, nil, 542, 128, 890, nil, 282, 327, + 293, nil, 286, 825, 233, nil, 709, 767, 551, 293, + 609, nil, nil, 233, 233, 233, 327, 19, 318, 318, + nil, 755, nil, 695, 348, 718, 1026, 841, 547, 1035, + 309, 580, 712, 560, 565, 309, 529, 528, 535, 1065, + nil, 561, nil, 19, 712, 593, 128, 747, 233, 233, + nil, nil, 233, 359, 369, 369, 679, 756, 956, 592, + nil, 889, nil, 891, nil, 867, 562, 566, 936, 512, + 531, 779, 779, 712, 869, 537, 890, 527, 515, 794, + nil, 712, 794, nil, nil, nil, nil, nil, nil, 972, + 973, nil, nil, 1000, nil, nil, 692, 704, nil, nil, + 696, nil, nil, nil, 701, nil, 19, nil, nil, nil, + 662, 233, 233, 233, 233, 19, 705, nil, 920, 141, + 909, 666, 708, nil, nil, 838, nil, 815, 575, 802, + nil, 673, nil, 820, nil, 840, 698, 678, nil, nil, + nil, 519, 519, 727, nil, 672, 812, 814, 458, 312, + 870, nil, 817, 819, 874, 457, 463, nil, 291, nil, + 655, nil, 144, nil, 451, nil, nil, nil, 875, 876, + 467, 609, 609, 686, 725, nil, nil, 811, 813, nil, + 673, nil, nil, 816, 818, 779, 779, 1047, nil, nil, + 742, 743, 671, 745, 672, nil, 1059, nil, 677, 19, + 233, 438, 233, 233, 438, 233, nil, nil, nil, 438, + 233, 233, nil, 458, nil, nil, nil, nil, nil, nil, + 291, 327, nil, 19, 752, 458, 451, nil, 721, nil, + 327, nil, nil, 547, 666, 467, nil, nil, 838, 697, + nil, 689, 547, 943, nil, nil, 1007, 467, nil, nil, + nil, nil, nil, nil, 458, nil, 852, nil, 884, 233, + 233, 291, 458, 1017, 740, nil, 1018, 451, nil, 233, + nil, 291, 765, nil, 953, nil, 467, 451, nil, nil, + nil, nil, 467, nil, nil, 911, nil, 19, nil, nil, + nil, 19, nil, 441, nil, 318, 19, nil, 812, 814, + 819, 817, 441, 441, 886, nil, 843, 886, 441, 441, + 988, nil, 318, nil, nil, 995, 910, nil, nil, 916, + nil, nil, nil, 19, nil, nil, 833, nil, nil, nil, + nil, 429, 233, 19, 19, nil, 458, 1069, nil, nil, + 999, 1036, 6, 291, nil, nil, nil, nil, 798, 451, + 878, 141, nil, 233, 440, 312, 666, nil, 467, 832, + nil, 863, nil, 440, 440, 917, nil, nil, nil, 440, + 440, 900, nil, nil, nil, nil, 827, 873, 1073, nil, + 666, nil, nil, 877, 9, 519, 673, nil, 810, 678, + 911, 327, 799, 1038, 144, nil, nil, nil, nil, 871, + 672, nil, 327, 547, nil, nil, 773, 775, 777, nil, + 849, nil, 853, nil, 842, nil, nil, nil, 666, nil, + 434, nil, nil, 312, 859, nil, 859, 666, 312, nil, + nil, 348, nil, nil, nil, nil, nil, nil, 882, nil, + nil, 441, nil, nil, nil, nil, nil, nil, nil, nil, + 854, 872, nil, nil, nil, nil, nil, 233, nil, 141, + 949, 1013, nil, nil, 916, 573, 574, 916, 955, 916, + nil, nil, 937, 666, nil, nil, nil, 892, 940, 894, + nil, 966, nil, nil, nil, 944, nil, 945, nil, nil, + nil, 948, nil, nil, nil, nil, 1060, nil, 519, 938, + 882, nil, 440, nil, nil, nil, nil, 886, nil, 19, + 917, nil, nil, 917, nil, 917, nil, 318, nil, 233, + nil, nil, 712, nil, 827, nil, 318, nil, nil, nil, + nil, 348, 918, nil, nil, nil, 233, nil, 916, 935, + 916, nil, 916, nil, 916, nil, nil, nil, nil, 19, + nil, nil, 19, nil, nil, nil, nil, nil, nil, nil, + 233, nil, nil, 946, nil, 916, nil, nil, 950, nil, + 233, nil, nil, nil, nil, 19, nil, nil, nil, nil, + 233, nil, nil, nil, 917, nil, 917, nil, 917, nil, + 917, nil, nil, nil, 882, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 975, 975, 975, 16, + 327, 917, nil, nil, nil, 16, 1037, nil, nil, 327, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 19, nil, nil, nil, nil, + nil, 438, 233, 16, nil, nil, nil, nil, nil, nil, + 438, 438, nil, nil, nil, 1066, 438, 438, nil, nil, + 1008, nil, 1009, 1029, 1010, nil, nil, nil, 327, 16, + nil, nil, nil, nil, 1039, 849, nil, nil, nil, 363, + 1019, 736, 1021, nil, 738, nil, 859, 318, 958, 960, + nil, 962, 964, nil, 965, nil, nil, nil, 318, nil, + nil, nil, nil, 458, 975, 975, 975, 975, nil, 975, + 291, nil, nil, nil, nil, 29, 451, nil, nil, 467, + 859, 29, nil, nil, nil, 467, nil, nil, nil, nil, + nil, 666, 16, 19, nil, nil, 29, nil, 19, 233, + nil, 16, 19, nil, 1068, 29, 29, 29, nil, 29, + nil, 1070, nil, 1071, nil, 1072, nil, 975, 975, 975, + 975, nil, nil, nil, nil, nil, nil, nil, 975, nil, + nil, nil, nil, 19, nil, 29, nil, nil, 1080, nil, + 29, 29, nil, nil, 29, nil, nil, nil, nil, 438, + nil, nil, nil, nil, 976, 978, 980, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1042, 1043, 1044, + 1045, nil, 19, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, nil, 436, nil, 19, + 436, nil, nil, nil, nil, 436, nil, nil, 29, 233, + nil, 19, nil, 29, 29, 29, 29, 29, nil, 16, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 19, 19, nil, nil, 868, nil, nil, 1074, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1049, 1051, 1053, 1055, nil, 1056, nil, nil, + nil, nil, nil, nil, nil, 906, 984, nil, nil, nil, + nil, 19, 19, 16, nil, 991, nil, 16, nil, nil, + nil, nil, 16, nil, 19, nil, nil, nil, 19, nil, + nil, 29, 29, 29, 29, 29, 29, 29, nil, nil, + nil, 29, 29, 29, 928, 1076, 1077, 1078, 1079, 16, + nil, nil, nil, nil, nil, 29, 1081, nil, nil, 16, + 16, 932, nil, nil, 1023, nil, 32, nil, nil, 19, + nil, nil, 32, 939, nil, nil, 19, nil, nil, nil, + nil, 19, nil, nil, nil, nil, nil, 32, nil, nil, + nil, 29, 29, 952, nil, nil, 32, 32, 32, nil, + 32, 29, nil, nil, nil, nil, nil, nil, nil, 233, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 29, + nil, nil, nil, 29, nil, nil, 32, nil, 29, nil, + nil, 32, 32, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, 986, 987, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 29, 998, nil, nil, nil, + nil, nil, nil, nil, 29, 29, 29, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 29, nil, nil, nil, 32, + nil, nil, nil, nil, 32, 32, 32, 32, 32, nil, + nil, 1027, nil, nil, nil, nil, nil, nil, 1032, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, nil, nil, 16, nil, + nil, nil, 32, 32, 32, 32, 32, 32, 32, 29, + nil, nil, 32, 32, 32, nil, nil, nil, nil, nil, + nil, 16, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 431, 444, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 29, 32, 32, nil, nil, nil, nil, nil, nil, + nil, 29, 32, nil, nil, nil, nil, nil, nil, nil, + nil, 16, nil, nil, nil, nil, nil, 436, 29, nil, + 32, nil, nil, nil, 32, nil, 436, 436, nil, 32, + nil, 29, 436, 436, 29, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, nil, nil, 522, + nil, 524, 29, 525, 526, nil, 32, 29, nil, nil, + nil, nil, 29, nil, nil, 32, 32, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 567, nil, nil, nil, nil, nil, nil, nil, nil, 16, + nil, nil, nil, nil, 16, nil, nil, 29, 16, nil, + nil, nil, nil, 29, 29, nil, nil, nil, nil, nil, + nil, nil, 29, 29, nil, nil, nil, nil, 29, 29, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 16, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 436, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 658, 16, nil, + 32, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 29, nil, 16, nil, nil, + 29, 29, nil, nil, 29, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 16, 16, nil, + nil, nil, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 32, + nil, 29, 699, nil, nil, 567, nil, 702, nil, nil, + nil, nil, 32, nil, nil, 32, nil, 16, 16, nil, + nil, 994, nil, 32, 29, nil, nil, nil, nil, nil, + 16, nil, nil, 32, 16, nil, nil, nil, 32, nil, + nil, 29, nil, 32, nil, nil, nil, nil, nil, nil, + nil, 29, nil, 29, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 29, 29, 16, nil, nil, nil, nil, + nil, nil, 16, nil, nil, nil, nil, 16, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 32, nil, + nil, nil, nil, 787, 32, 32, nil, nil, nil, nil, + nil, nil, nil, 32, 32, nil, nil, nil, nil, 32, + 32, nil, nil, 29, 29, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 29, nil, nil, nil, + 29, nil, nil, 800, nil, nil, nil, nil, nil, nil, + nil, 699, 567, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 29, nil, nil, 839, nil, nil, nil, 29, nil, + nil, nil, nil, 29, nil, nil, 32, nil, nil, nil, + nil, 32, 32, nil, nil, 32, nil, nil, 850, nil, + nil, nil, nil, 699, nil, nil, 567, nil, nil, nil, + nil, 29, nil, nil, 240, nil, nil, nil, nil, nil, + 864, nil, nil, 290, 290, 290, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 337, 338, nil, 340, + nil, nil, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 895, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 908, nil, 18, nil, nil, + nil, nil, 32, 18, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, 32, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 20, 18, nil, 941, + nil, nil, 20, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 32, 32, nil, nil, nil, nil, + 20, 320, 320, nil, nil, nil, nil, 32, nil, nil, + nil, 32, nil, nil, nil, nil, 567, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 20, nil, nil, nil, + 18, nil, nil, nil, nil, nil, 361, 370, 370, 18, + 290, 443, nil, nil, 449, 290, 996, nil, nil, 449, + nil, nil, 32, nil, nil, nil, nil, nil, nil, 32, + nil, nil, 240, nil, 32, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, nil, nil, 20, + nil, 503, 32, nil, nil, nil, nil, nil, 20, 290, + 290, 1033, nil, nil, nil, nil, nil, nil, nil, 290, + nil, nil, nil, nil, nil, nil, 290, nil, 290, nil, + 290, 290, nil, 18, nil, 18, nil, nil, 18, nil, + nil, nil, nil, 18, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 553, nil, 554, nil, nil, nil, 290, 290, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 20, nil, 439, nil, nil, 439, nil, nil, + nil, nil, 439, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 20, nil, nil, nil, + nil, 18, nil, nil, nil, 18, nil, nil, nil, nil, + 18, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, + nil, nil, nil, nil, 290, nil, nil, 18, 18, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 20, nil, nil, nil, 20, nil, nil, nil, 320, 20, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, 41, nil, nil, nil, 320, nil, 290, nil, 449, + 449, 449, nil, nil, nil, nil, 20, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 20, 20, nil, 41, + 316, 316, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 290, + nil, nil, 290, nil, 290, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 357, 373, 373, 373, 290, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 449, + 719, 720, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 42, nil, nil, nil, nil, nil, 42, nil, nil, + 290, nil, nil, nil, nil, nil, nil, nil, 41, nil, + 290, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, 42, 317, 317, nil, nil, + nil, nil, nil, 18, nil, nil, nil, nil, nil, nil, + 290, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 42, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 358, 374, 374, 374, nil, nil, nil, nil, nil, + nil, nil, nil, 18, nil, nil, 18, nil, nil, nil, + 290, 449, 290, nil, nil, 807, nil, nil, 290, 290, + 449, 449, 20, nil, nil, nil, 449, 449, nil, 18, + 320, 41, nil, nil, nil, nil, nil, nil, nil, 320, + nil, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, 290, nil, 42, nil, 41, nil, nil, nil, nil, + nil, nil, 20, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 290, nil, nil, nil, nil, + 290, nil, nil, 290, nil, nil, nil, nil, 20, 18, + nil, nil, nil, nil, nil, 18, nil, 290, nil, nil, + nil, nil, nil, nil, 18, 18, nil, nil, nil, nil, + 18, 18, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, 41, nil, nil, nil, 316, 41, 290, + nil, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, 316, nil, nil, nil, 20, nil, + nil, nil, 290, nil, 439, 41, nil, nil, nil, 449, + nil, 42, nil, 439, 439, 41, 41, nil, nil, 439, + 439, nil, 449, 449, 449, 449, nil, 914, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, + nil, nil, 18, nil, nil, nil, 18, nil, nil, nil, + 320, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 320, nil, nil, nil, nil, 290, nil, nil, nil, + nil, nil, nil, nil, nil, 42, nil, 18, nil, 42, + nil, nil, nil, 317, 42, nil, nil, nil, nil, nil, + nil, nil, nil, 18, nil, nil, 20, nil, nil, nil, + 317, 20, nil, nil, nil, 20, nil, nil, nil, nil, + nil, 42, nil, 290, 449, nil, 18, nil, nil, nil, + nil, 42, 42, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 18, nil, 905, 20, nil, nil, nil, + nil, nil, nil, 290, nil, 18, nil, nil, nil, nil, + nil, nil, 439, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, 18, nil, nil, nil, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, 20, nil, nil, nil, nil, nil, 290, 316, + nil, nil, nil, nil, 20, nil, nil, nil, 316, nil, + nil, nil, nil, nil, nil, 18, 18, nil, nil, nil, + nil, nil, nil, nil, 20, 20, nil, nil, 18, 290, + nil, 41, 18, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 370, + nil, nil, nil, 18, 20, 20, nil, nil, 993, nil, + 18, nil, nil, nil, nil, 18, nil, 20, nil, nil, + nil, 20, nil, nil, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, nil, 317, nil, nil, nil, nil, + nil, nil, nil, nil, 317, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 370, nil, nil, + nil, nil, 20, nil, nil, nil, nil, 42, nil, 20, + 42, nil, nil, nil, 20, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 42, nil, nil, nil, nil, nil, 316, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 316, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + 41, nil, nil, 42, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 317, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 317, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 42, nil, 41, nil, nil, 42, nil, nil, nil, + 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 41, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 42, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 373, nil, + nil, nil, nil, 41, 41, nil, nil, 989, nil, nil, + 42, nil, nil, nil, nil, nil, 41, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 373, nil, nil, 42, + 42, 41, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 374, nil, nil, nil, nil, 42, + 42, nil, nil, 990, nil, nil, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 374, nil, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, 42, nil, nil, nil, nil, 42 ] + +racc_goto_check = [ + 6, 38, 36, 40, 70, 166, 2, 116, 111, 38, + 75, 100, 10, 83, 83, 75, 71, 71, 24, 24, + 42, 42, 24, 213, 46, 46, 46, 27, 50, 50, + 40, 85, 77, 77, 70, 15, 104, 104, 80, 80, + 80, 33, 9, 52, 63, 12, 33, 119, 9, 8, + 31, 31, 86, 105, 31, 86, 36, 22, 22, 73, + 73, 29, 29, 82, 82, 82, 59, 77, 77, 77, + 65, 17, 64, 116, 51, 51, 51, 50, 37, 107, + 71, 24, 24, 24, 24, 81, 81, 148, 148, 5, + 81, 167, 142, 6, 53, 6, 6, 6, 6, 6, + 6, 141, 9, 6, 204, 165, 60, 157, 199, 208, + 71, 68, 155, 31, 31, 31, 31, 153, 7, 209, + 143, 140, 159, 1, 160, 61, 183, 187, 69, 69, + 187, 3, 58, 58, 58, 11, 183, 13, 16, 18, + 188, 20, 188, 21, 23, 188, 26, 32, 188, 43, + 45, 49, 55, 74, 78, 5, 79, 84, 96, 99, + 113, 115, 120, 25, 121, 9, 25, 122, 123, 157, + 213, 25, 124, 125, 9, 126, 127, 128, 129, 130, + 131, 132, 133, 61, 144, 145, 151, 158, 161, 162, + 209, 37, 85, 163, 164, 169, 170, 172, 173, 175, + 176, 86, 86, 177, 31, 31, 61, 178, 159, 83, + 160, 179, 31, 31, 182, 38, 46, 184, 185, 186, + 189, 190, 6, 27, 27, 80, 80, 27, 111, 191, + 192, 71, 27, 143, 213, 7, 140, 193, 194, 61, + 197, 198, 203, 205, 206, 212, nil, nil, nil, nil, + nil, nil, nil, nil, 36, 142, nil, nil, nil, nil, + 155, nil, 153, 157, 141, 75, nil, 75, 141, nil, + 46, 46, 53, nil, nil, 65, 6, 50, 50, nil, + 46, nil, nil, nil, 65, 80, nil, nil, nil, nil, + 6, 6, 208, 35, 80, 204, nil, 12, nil, 35, + 38, nil, 24, nil, 40, 116, 204, nil, 83, 77, + 82, nil, 83, 37, 35, nil, 36, 165, 38, 82, + 199, nil, nil, 35, 35, 35, 77, 35, 35, 35, + nil, 68, nil, 167, 31, 75, 17, 37, 63, 107, + 59, 38, 50, 6, 6, 59, 9, 8, 64, 105, + nil, 80, nil, 35, 50, 31, 116, 36, 35, 35, + nil, nil, 35, 35, 35, 35, 61, 36, 148, 6, + nil, 154, nil, 154, nil, 37, 82, 82, 81, 58, + 60, 141, 141, 50, 37, 60, 204, 5, 58, 188, + nil, 50, 188, nil, nil, nil, nil, nil, nil, 148, + 148, nil, nil, 119, nil, nil, 61, 10, nil, nil, + 61, nil, nil, nil, 213, nil, 35, nil, nil, nil, + 38, 35, 35, 35, 35, 35, 61, nil, 154, 71, + 37, 40, 61, nil, nil, 85, nil, 52, 5, 36, + nil, 83, nil, 52, nil, 65, 86, 83, nil, nil, + nil, 6, 6, 61, nil, 6, 75, 75, 83, 14, + 12, nil, 75, 75, 12, 50, 50, nil, 46, nil, + 22, nil, 73, nil, 6, nil, nil, nil, 165, 165, + 71, 199, 199, 40, 98, nil, nil, 33, 33, nil, + 83, nil, nil, 33, 33, 141, 141, 148, nil, nil, + 98, 98, 51, 98, 6, nil, 15, nil, 51, 35, + 35, 35, 35, 35, 35, 35, nil, nil, nil, 35, + 35, 35, nil, 83, nil, nil, nil, nil, nil, nil, + 46, 77, nil, 35, 42, 83, 6, nil, 31, nil, + 77, nil, nil, 63, 40, 71, nil, nil, 85, 82, + nil, 51, 63, 104, nil, nil, 154, 71, nil, nil, + nil, nil, nil, nil, 83, nil, 29, nil, 147, 35, + 35, 46, 83, 154, 116, nil, 154, 6, nil, 35, + nil, 46, 31, nil, 12, nil, 71, 6, nil, nil, + nil, nil, 71, nil, nil, 75, nil, 35, nil, nil, + nil, 35, nil, 25, nil, 35, 35, nil, 75, 75, + 75, 75, 25, 25, 149, nil, 61, 149, 25, 25, + 104, nil, 35, nil, nil, 104, 33, nil, nil, 147, + nil, nil, nil, 35, nil, nil, 100, nil, nil, nil, + nil, 14, 35, 35, 35, nil, 83, 154, nil, nil, + 12, 111, 6, 46, nil, nil, nil, nil, 2, 6, + 61, 71, nil, 35, 27, 14, 40, nil, 71, 166, + nil, 98, nil, 27, 27, 149, nil, nil, nil, 27, + 27, 61, nil, nil, nil, nil, 6, 98, 37, nil, + 40, nil, nil, 70, 9, 6, 83, nil, 82, 83, + 75, 77, 22, 12, 73, nil, nil, nil, nil, 24, + 6, nil, 77, 63, nil, nil, 202, 202, 202, nil, + 6, nil, 6, nil, 63, nil, nil, nil, 40, nil, + 80, nil, nil, 14, 6, nil, 6, 40, 14, nil, + nil, 31, nil, nil, nil, nil, nil, nil, 40, nil, + nil, 25, nil, nil, nil, nil, nil, nil, nil, nil, + 82, 116, nil, nil, nil, nil, nil, 35, nil, 71, + 61, 147, nil, nil, 147, 14, 14, 147, 61, 147, + nil, nil, 98, 40, nil, nil, nil, 152, 98, 152, + nil, 61, nil, nil, nil, 98, nil, 98, nil, nil, + nil, 98, nil, nil, nil, nil, 36, nil, 6, 24, + 40, nil, 27, nil, nil, nil, nil, 149, nil, 35, + 149, nil, nil, 149, nil, 149, nil, 35, nil, 35, + nil, nil, 50, nil, 6, nil, 35, nil, nil, nil, + nil, 31, 152, nil, nil, nil, 35, nil, 147, 6, + 147, nil, 147, nil, 147, nil, nil, nil, nil, 35, + nil, nil, 35, nil, nil, nil, nil, nil, nil, nil, + 35, nil, nil, 116, nil, 147, nil, nil, 116, nil, + 35, nil, nil, nil, nil, 35, nil, nil, nil, nil, + 35, nil, nil, nil, 149, nil, 149, nil, 149, nil, + 149, nil, nil, nil, 40, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 6, 6, 6, 28, + 77, 149, nil, nil, nil, 28, 98, nil, nil, 77, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 35, nil, nil, nil, nil, + nil, 35, 35, 28, nil, nil, nil, nil, nil, nil, + 35, 35, nil, nil, nil, 98, 35, 35, nil, nil, + 152, nil, 152, 38, 152, nil, nil, nil, 77, 28, + nil, nil, nil, nil, 40, 6, nil, nil, nil, 28, + 152, 14, 152, nil, 14, nil, 6, 35, 202, 202, + nil, 202, 202, nil, 202, nil, nil, nil, 35, nil, + nil, nil, nil, 83, 6, 6, 6, 6, nil, 6, + 46, nil, nil, nil, nil, 54, 6, nil, nil, 71, + 6, 54, nil, nil, nil, 71, nil, nil, nil, nil, + nil, 40, 28, 35, nil, nil, 54, nil, 35, 35, + nil, 28, 35, nil, 152, 54, 54, 54, nil, 54, + nil, 152, nil, 152, nil, 152, nil, 6, 6, 6, + 6, nil, nil, nil, nil, nil, nil, nil, 6, nil, + nil, nil, nil, 35, nil, 54, nil, nil, 152, nil, + 54, 54, nil, nil, 54, nil, nil, nil, nil, 35, + nil, nil, nil, nil, 150, 150, 150, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 202, 202, 202, + 202, nil, 35, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, 28, nil, 35, + 28, nil, nil, nil, nil, 28, nil, nil, 54, 35, + nil, 35, nil, 54, 54, 54, 54, 54, nil, 28, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 35, 35, nil, nil, 14, nil, nil, 202, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 150, 150, 150, 150, nil, 150, nil, nil, + nil, nil, nil, nil, nil, 14, 35, nil, nil, nil, + nil, 35, 35, 28, nil, 35, nil, 28, nil, nil, + nil, nil, 28, nil, 35, nil, nil, nil, 35, nil, + nil, 54, 54, 54, 54, 54, 54, 54, nil, nil, + nil, 54, 54, 54, 14, 150, 150, 150, 150, 28, + nil, nil, nil, nil, nil, 54, 150, nil, nil, 28, + 28, 14, nil, nil, 35, nil, 57, nil, nil, 35, + nil, nil, 57, 14, nil, nil, 35, nil, nil, nil, + nil, 35, nil, nil, nil, nil, nil, 57, nil, nil, + nil, 54, 54, 14, nil, nil, 57, 57, 57, nil, + 57, 54, nil, nil, nil, nil, nil, nil, nil, 35, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 54, + nil, nil, nil, 54, nil, nil, 57, nil, 54, nil, + nil, 57, 57, nil, nil, 57, nil, nil, nil, nil, + nil, nil, nil, 14, 14, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 54, 14, nil, nil, nil, + nil, nil, nil, nil, 54, 54, 54, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 54, nil, nil, nil, 57, + nil, nil, nil, nil, 57, 57, 57, 57, 57, nil, + nil, 14, nil, nil, nil, nil, nil, nil, 14, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, nil, 28, nil, + nil, nil, 57, 57, 57, 57, 57, 57, 57, 54, + nil, nil, 57, 57, 57, nil, nil, nil, nil, nil, + nil, 28, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 30, 30, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 54, 57, 57, nil, nil, nil, nil, nil, nil, + nil, 54, 57, nil, nil, nil, nil, nil, nil, nil, + nil, 28, nil, nil, nil, nil, nil, 28, 54, nil, + 57, nil, nil, nil, 57, nil, 28, 28, nil, 57, + nil, 54, 28, 28, 54, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, nil, nil, nil, nil, 30, + nil, 30, 54, 30, 30, nil, 57, 54, nil, nil, + nil, nil, 54, nil, nil, 57, 57, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 30, nil, nil, nil, nil, nil, nil, nil, nil, 28, + nil, nil, nil, nil, 28, nil, nil, 54, 28, nil, + nil, nil, nil, 54, 54, nil, nil, nil, nil, nil, + nil, nil, 54, 54, nil, nil, nil, nil, 54, 54, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 28, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 30, 28, nil, + 57, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 54, nil, 28, nil, nil, + 54, 54, nil, nil, 54, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 28, 28, nil, + nil, nil, 57, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, nil, nil, 54, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 57, + nil, 54, 30, nil, nil, 30, nil, 30, nil, nil, + nil, nil, 57, nil, nil, 57, nil, 28, 28, nil, + nil, 28, nil, 57, 54, nil, nil, nil, nil, nil, + 28, nil, nil, 57, 28, nil, nil, nil, 57, nil, + nil, 54, nil, 57, nil, nil, nil, nil, nil, nil, + nil, 54, nil, 54, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 54, 54, 28, nil, nil, nil, nil, + nil, nil, 28, nil, nil, nil, nil, 28, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 57, nil, + nil, nil, nil, 30, 57, 57, nil, nil, nil, nil, + nil, nil, nil, 57, 57, nil, nil, nil, nil, 57, + 57, nil, nil, 54, 54, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 54, nil, nil, nil, + 54, nil, nil, 30, nil, nil, nil, nil, nil, nil, + nil, 30, 30, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 30, nil, nil, nil, 54, nil, + nil, nil, nil, 54, nil, nil, 57, nil, nil, nil, + nil, 57, 57, nil, nil, 57, nil, nil, 30, nil, + nil, nil, nil, 30, nil, nil, 30, nil, nil, nil, + nil, 54, nil, nil, 41, nil, nil, nil, nil, nil, + 30, nil, nil, 41, 41, 41, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, 41, nil, 41, + nil, nil, 57, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 30, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 30, nil, 34, nil, nil, + nil, nil, 57, 34, nil, nil, nil, nil, nil, nil, + nil, nil, 57, nil, 57, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, 57, 57, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 39, 34, nil, 30, + nil, nil, 39, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 57, 57, nil, nil, nil, nil, + 39, 39, 39, nil, nil, nil, nil, 57, nil, nil, + nil, 57, nil, nil, nil, nil, 30, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 39, nil, nil, nil, + 34, nil, nil, nil, nil, nil, 39, 39, 39, 34, + 41, 41, nil, nil, 41, 41, 30, nil, nil, 41, + nil, nil, 57, nil, nil, nil, nil, nil, nil, 57, + nil, nil, 41, nil, 57, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, nil, nil, 39, + nil, 41, 57, nil, nil, nil, nil, nil, 39, 41, + 41, 30, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, 41, nil, 41, nil, + 41, 41, nil, 34, nil, 34, nil, nil, 34, nil, + nil, nil, nil, 34, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, 41, nil, nil, nil, 41, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, nil, 39, nil, nil, 39, nil, nil, + nil, nil, 39, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 39, nil, nil, nil, + nil, 34, nil, nil, nil, 34, nil, nil, nil, nil, + 34, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + nil, nil, nil, nil, 41, nil, nil, 34, 34, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 39, nil, nil, nil, 39, nil, nil, nil, 39, 39, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, 66, nil, nil, nil, 39, nil, 41, nil, 41, + 41, 41, nil, nil, nil, nil, 39, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 39, 39, nil, 66, + 66, 66, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, 41, nil, 41, 66, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, 66, 66, 66, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + 41, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, nil, 67, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, 66, nil, + 41, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, nil, nil, nil, 67, 67, 67, nil, nil, + nil, nil, nil, 34, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, 67, 67, 67, nil, nil, nil, nil, nil, + nil, nil, nil, 34, nil, nil, 34, nil, nil, nil, + 41, 41, 41, nil, nil, 41, nil, nil, 41, 41, + 41, 41, 39, nil, nil, nil, 41, 41, nil, 34, + 39, 66, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, 41, nil, 67, nil, 66, nil, nil, nil, nil, + nil, nil, 39, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + 41, nil, nil, 41, nil, nil, nil, nil, 39, 34, + nil, nil, nil, nil, nil, 34, nil, 41, nil, nil, + nil, nil, nil, nil, 34, 34, nil, nil, nil, nil, + 34, 34, nil, nil, nil, nil, nil, nil, nil, 66, + nil, nil, nil, 66, nil, nil, nil, 66, 66, 41, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, 39, nil, + nil, nil, 41, nil, 39, 66, nil, nil, nil, 41, + nil, 67, nil, 39, 39, 66, 66, nil, nil, 39, + 39, nil, 41, 41, 41, 41, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + nil, nil, 34, nil, nil, nil, 34, nil, nil, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 39, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, 67, nil, 34, nil, 67, + nil, nil, nil, 67, 67, nil, nil, nil, nil, nil, + nil, nil, nil, 34, nil, nil, 39, nil, nil, nil, + 67, 39, nil, nil, nil, 39, nil, nil, nil, nil, + nil, 67, nil, 41, 41, nil, 34, nil, nil, nil, + nil, 67, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 34, nil, 39, 39, nil, nil, nil, + nil, nil, nil, 41, nil, 34, nil, nil, nil, nil, + nil, nil, 39, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, 34, nil, nil, nil, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, 39, nil, nil, nil, nil, nil, 41, 66, + nil, nil, nil, nil, 39, nil, nil, nil, 66, nil, + nil, nil, nil, nil, nil, 34, 34, nil, nil, nil, + nil, nil, nil, nil, 39, 39, nil, nil, 34, 41, + nil, 66, 34, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, 34, 39, 39, nil, nil, 39, nil, + 34, nil, nil, nil, nil, 34, nil, 39, nil, nil, + nil, 39, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, nil, 67, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 39, nil, nil, + nil, nil, 39, nil, nil, nil, nil, 67, nil, 39, + 67, nil, nil, nil, 39, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, 66, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 66, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + 66, nil, nil, 67, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 67, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, nil, 66, nil, nil, 67, nil, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 66, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 66, nil, + nil, nil, nil, 66, 66, nil, nil, 66, nil, nil, + 67, nil, nil, nil, nil, nil, 66, nil, nil, nil, + 66, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 66, nil, nil, 67, + 67, 66, nil, nil, nil, nil, nil, nil, 66, nil, + nil, nil, nil, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, 67, + 67, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, 67 ] + +racc_goto_pointer = [ + nil, 123, 4, 131, nil, 84, -2, 110, 44, 40, + -123, 125, -297, -286, 423, -521, -584, -651, -705, nil, + -387, -165, 46, 132, -49, -57, 74, 4, 917, -158, + 1314, -17, 11, -182, 2115, 291, -222, -372, -18, 2174, + -19, 2031, -49, -423, nil, -589, -8, nil, nil, 124, + -197, 45, -234, -419, 1023, -357, nil, 1274, 100, 30, + 70, -105, nil, 7, 34, -261, 2493, 2599, -256, 55, + -71, 5, nil, 48, -275, -213, nil, -5, 107, -189, + 6, -476, 31, -16, -349, -262, -466, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 83, nil, -73, -187, + -54, nil, nil, nil, -313, -683, nil, -659, nil, nil, + nil, -347, nil, 88, nil, -210, 2, nil, nil, -548, + 87, -222, 106, 106, -171, 110, 111, -414, -416, -694, + -196, -205, -415, -695, nil, nil, nil, nil, nil, nil, + -776, -516, -525, -778, -713, -644, nil, -200, -516, -154, + 186, -643, 13, -712, -401, -576, nil, -660, -767, -832, + -830, -201, -577, 104, -406, -284, -20, -181, nil, -88, + -88, nil, -497, -548, nil, -306, -798, -375, -517, -640, + nil, nil, 122, 31, 120, 120, 120, -271, -253, 120, + 120, 127, -561, -397, -397, nil, nil, 135, -350, -281, + nil, nil, 110, -530, -668, -525, -727, nil, -665, -858, + nil, nil, -143, -498 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 304, 7, 356, 307, + nil, nil, nil, nil, 556, nil, nil, nil, nil, 303, + 305, nil, nil, nil, nil, 14, 15, 21, 238, nil, + 296, 17, nil, 437, 239, 336, nil, nil, 588, 237, + 473, 24, nil, nil, 351, nil, 25, 26, 27, nil, + 715, nil, nil, nil, 324, nil, 28, 321, 452, 35, + nil, nil, 37, 40, 39, nil, 234, 235, 368, nil, + 143, 460, 142, 91, nil, 442, 47, 50, 270, nil, + 453, nil, 454, 465, 674, 517, 294, 279, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 61, nil, nil, + 280, 65, 66, 67, nil, nil, 68, 857, 69, 70, + 71, nil, 72, nil, 73, nil, 569, 74, 75, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 284, 272, 724, 848, 578, 858, + 781, 616, nil, 782, 783, 1015, 915, 604, nil, 605, + nil, nil, 606, nil, 608, nil, 828, nil, nil, nil, + 614, nil, nil, nil, nil, nil, nil, nil, 464, nil, + nil, 694, nil, nil, 505, nil, nil, nil, nil, nil, + 90, 92, 94, nil, nil, nil, nil, nil, 632, nil, + nil, nil, nil, nil, nil, 103, 104, nil, nil, 887, + 763, 603, nil, 607, 618, 620, 926, 623, 624, 927, + 627, 630, nil, 298 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 146, :_reduce_1, + 2, 144, :_reduce_2, + 2, 145, :_reduce_3, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 3, 147, :_reduce_6, + 2, 147, :_reduce_none, + 1, 150, :_reduce_none, + 0, 154, :_reduce_9, + 3, 150, :_reduce_10, + 0, 156, :_reduce_11, + 4, 153, :_reduce_12, + 0, 161, :_reduce_13, + 6, 155, :_reduce_14, + 3, 155, :_reduce_15, + 2, 157, :_reduce_16, + 1, 162, :_reduce_none, + 1, 162, :_reduce_none, + 3, 162, :_reduce_19, + 2, 162, :_reduce_20, + 1, 163, :_reduce_none, + 0, 164, :_reduce_22, + 3, 163, :_reduce_23, + 0, 175, :_reduce_24, + 4, 152, :_reduce_25, + 3, 152, :_reduce_26, + 3, 152, :_reduce_27, + 3, 152, :_reduce_28, + 2, 152, :_reduce_29, + 3, 152, :_reduce_30, + 3, 152, :_reduce_31, + 3, 152, :_reduce_32, + 3, 152, :_reduce_33, + 3, 152, :_reduce_34, + 4, 152, :_reduce_35, + 1, 152, :_reduce_none, + 3, 152, :_reduce_37, + 3, 152, :_reduce_38, + 3, 152, :_reduce_39, + 3, 152, :_reduce_40, + 1, 152, :_reduce_none, + 3, 168, :_reduce_42, + 3, 168, :_reduce_43, + 6, 168, :_reduce_44, + 5, 168, :_reduce_45, + 5, 168, :_reduce_46, + 5, 168, :_reduce_47, + 5, 168, :_reduce_48, + 3, 168, :_reduce_49, + 1, 176, :_reduce_50, + 1, 176, :_reduce_none, + 1, 174, :_reduce_none, + 3, 174, :_reduce_53, + 3, 174, :_reduce_54, + 3, 174, :_reduce_55, + 2, 174, :_reduce_56, + 1, 174, :_reduce_none, + 1, 167, :_reduce_58, + 0, 187, :_reduce_59, + 0, 188, :_reduce_60, + 4, 185, :_reduce_61, + 1, 170, :_reduce_none, + 1, 170, :_reduce_none, + 1, 190, :_reduce_none, + 4, 190, :_reduce_65, + 0, 198, :_reduce_66, + 4, 195, :_reduce_67, + 1, 197, :_reduce_68, + 2, 189, :_reduce_69, + 3, 189, :_reduce_70, + 4, 189, :_reduce_71, + 5, 189, :_reduce_72, + 4, 189, :_reduce_73, + 5, 189, :_reduce_74, + 2, 189, :_reduce_75, + 2, 189, :_reduce_76, + 2, 189, :_reduce_77, + 2, 189, :_reduce_78, + 2, 189, :_reduce_79, + 1, 169, :_reduce_none, + 3, 169, :_reduce_81, + 1, 203, :_reduce_none, + 3, 203, :_reduce_83, + 1, 202, :_reduce_84, + 2, 202, :_reduce_85, + 3, 202, :_reduce_86, + 5, 202, :_reduce_87, + 2, 202, :_reduce_88, + 4, 202, :_reduce_89, + 2, 202, :_reduce_90, + 4, 202, :_reduce_91, + 1, 202, :_reduce_92, + 3, 202, :_reduce_93, + 1, 206, :_reduce_none, + 3, 206, :_reduce_95, + 2, 205, :_reduce_96, + 3, 205, :_reduce_97, + 1, 208, :_reduce_98, + 3, 208, :_reduce_99, + 1, 207, :_reduce_100, + 1, 207, :_reduce_101, + 4, 207, :_reduce_102, + 3, 207, :_reduce_103, + 3, 207, :_reduce_104, + 3, 207, :_reduce_105, + 3, 207, :_reduce_106, + 2, 207, :_reduce_107, + 1, 207, :_reduce_108, + 1, 171, :_reduce_109, + 1, 171, :_reduce_110, + 4, 171, :_reduce_111, + 3, 171, :_reduce_112, + 3, 171, :_reduce_113, + 3, 171, :_reduce_114, + 3, 171, :_reduce_115, + 2, 171, :_reduce_116, + 1, 171, :_reduce_117, + 1, 211, :_reduce_118, + 1, 211, :_reduce_none, + 2, 212, :_reduce_120, + 1, 212, :_reduce_121, + 3, 212, :_reduce_122, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_126, + 1, 213, :_reduce_none, + 1, 165, :_reduce_128, + 1, 165, :_reduce_none, + 1, 166, :_reduce_130, + 0, 217, :_reduce_131, + 4, 166, :_reduce_132, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 3, 184, :_reduce_204, + 3, 184, :_reduce_205, + 6, 184, :_reduce_206, + 5, 184, :_reduce_207, + 5, 184, :_reduce_208, + 5, 184, :_reduce_209, + 5, 184, :_reduce_210, + 4, 184, :_reduce_211, + 3, 184, :_reduce_212, + 3, 184, :_reduce_213, + 3, 184, :_reduce_214, + 3, 184, :_reduce_215, + 3, 184, :_reduce_216, + 3, 184, :_reduce_217, + 3, 184, :_reduce_218, + 3, 184, :_reduce_219, + 3, 184, :_reduce_220, + 4, 184, :_reduce_221, + 4, 184, :_reduce_222, + 2, 184, :_reduce_223, + 2, 184, :_reduce_224, + 3, 184, :_reduce_225, + 3, 184, :_reduce_226, + 3, 184, :_reduce_227, + 3, 184, :_reduce_228, + 1, 184, :_reduce_none, + 3, 184, :_reduce_230, + 3, 184, :_reduce_231, + 3, 184, :_reduce_232, + 3, 184, :_reduce_233, + 3, 184, :_reduce_234, + 2, 184, :_reduce_235, + 2, 184, :_reduce_236, + 3, 184, :_reduce_237, + 3, 184, :_reduce_238, + 3, 184, :_reduce_239, + 3, 184, :_reduce_240, + 3, 184, :_reduce_241, + 6, 184, :_reduce_242, + 1, 184, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 3, 219, :_reduce_248, + 3, 219, :_reduce_249, + 1, 173, :_reduce_250, + 1, 222, :_reduce_none, + 2, 222, :_reduce_252, + 4, 222, :_reduce_253, + 2, 222, :_reduce_254, + 1, 218, :_reduce_none, + 3, 218, :_reduce_256, + 3, 226, :_reduce_257, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 179, :_reduce_none, + 1, 179, :_reduce_none, + 2, 179, :_reduce_262, + 4, 179, :_reduce_263, + 2, 179, :_reduce_264, + 1, 201, :_reduce_265, + 2, 201, :_reduce_266, + 2, 201, :_reduce_267, + 4, 201, :_reduce_268, + 1, 201, :_reduce_269, + 0, 230, :_reduce_270, + 2, 194, :_reduce_271, + 2, 229, :_reduce_272, + 2, 228, :_reduce_273, + 1, 228, :_reduce_none, + 1, 223, :_reduce_275, + 2, 223, :_reduce_276, + 3, 223, :_reduce_277, + 4, 223, :_reduce_278, + 3, 172, :_reduce_279, + 4, 172, :_reduce_280, + 2, 172, :_reduce_281, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_292, + 0, 265, :_reduce_293, + 4, 220, :_reduce_294, + 0, 266, :_reduce_295, + 3, 220, :_reduce_296, + 0, 267, :_reduce_297, + 4, 220, :_reduce_298, + 3, 220, :_reduce_299, + 3, 220, :_reduce_300, + 2, 220, :_reduce_301, + 0, 268, :_reduce_302, + 4, 220, :_reduce_303, + 0, 269, :_reduce_304, + 4, 220, :_reduce_305, + 1, 220, :_reduce_306, + 4, 220, :_reduce_307, + 3, 220, :_reduce_308, + 1, 220, :_reduce_309, + 5, 220, :_reduce_310, + 4, 220, :_reduce_311, + 3, 220, :_reduce_312, + 2, 220, :_reduce_313, + 1, 220, :_reduce_none, + 2, 220, :_reduce_315, + 1, 220, :_reduce_316, + 6, 220, :_reduce_317, + 6, 220, :_reduce_318, + 4, 220, :_reduce_319, + 4, 220, :_reduce_320, + 5, 220, :_reduce_321, + 4, 220, :_reduce_322, + 6, 220, :_reduce_323, + 0, 270, :_reduce_324, + 6, 220, :_reduce_325, + 0, 271, :_reduce_326, + 0, 272, :_reduce_327, + 8, 220, :_reduce_328, + 0, 273, :_reduce_329, + 5, 220, :_reduce_330, + 0, 274, :_reduce_331, + 6, 220, :_reduce_332, + 0, 275, :_reduce_333, + 0, 276, :_reduce_334, + 9, 220, :_reduce_335, + 1, 220, :_reduce_336, + 1, 220, :_reduce_337, + 1, 220, :_reduce_338, + 1, 220, :_reduce_339, + 1, 178, :_reduce_340, + 1, 240, :_reduce_none, + 1, 246, :_reduce_none, + 1, 249, :_reduce_none, + 1, 251, :_reduce_none, + 1, 252, :_reduce_none, + 1, 253, :_reduce_none, + 1, 255, :_reduce_none, + 1, 257, :_reduce_348, + 1, 260, :_reduce_349, + 1, 261, :_reduce_350, + 1, 277, :_reduce_none, + 1, 278, :_reduce_none, + 1, 279, :_reduce_none, + 1, 280, :_reduce_none, + 1, 281, :_reduce_none, + 1, 159, :_reduce_none, + 1, 282, :_reduce_none, + 1, 241, :_reduce_none, + 1, 200, :_reduce_none, + 1, 247, :_reduce_none, + 1, 247, :_reduce_none, + 2, 247, :_reduce_none, + 1, 186, :_reduce_none, + 1, 186, :_reduce_none, + 1, 248, :_reduce_none, + 5, 248, :_reduce_366, + 1, 250, :_reduce_none, + 2, 250, :_reduce_368, + 1, 256, :_reduce_none, + 1, 256, :_reduce_370, + 1, 283, :_reduce_none, + 3, 283, :_reduce_372, + 1, 286, :_reduce_373, + 3, 286, :_reduce_374, + 1, 285, :_reduce_375, + 3, 285, :_reduce_376, + 5, 285, :_reduce_377, + 1, 285, :_reduce_378, + 3, 285, :_reduce_379, + 2, 287, :_reduce_380, + 1, 287, :_reduce_381, + 4, 288, :_reduce_382, + 2, 288, :_reduce_383, + 2, 288, :_reduce_384, + 1, 288, :_reduce_385, + 2, 293, :_reduce_386, + 1, 293, :_reduce_none, + 6, 294, :_reduce_388, + 8, 294, :_reduce_389, + 4, 294, :_reduce_390, + 6, 294, :_reduce_391, + 4, 294, :_reduce_392, + 2, 294, :_reduce_393, + 6, 294, :_reduce_394, + 2, 294, :_reduce_395, + 4, 294, :_reduce_396, + 6, 294, :_reduce_397, + 2, 294, :_reduce_398, + 4, 294, :_reduce_399, + 2, 294, :_reduce_400, + 4, 294, :_reduce_401, + 1, 294, :_reduce_402, + 1, 298, :_reduce_403, + 1, 298, :_reduce_404, + 3, 299, :_reduce_405, + 1, 299, :_reduce_406, + 4, 299, :_reduce_407, + 1, 300, :_reduce_none, + 4, 300, :_reduce_409, + 1, 301, :_reduce_410, + 3, 301, :_reduce_411, + 1, 302, :_reduce_412, + 1, 302, :_reduce_none, + 0, 306, :_reduce_414, + 0, 307, :_reduce_415, + 5, 245, :_reduce_416, + 4, 304, :_reduce_417, + 1, 304, :_reduce_418, + 3, 305, :_reduce_419, + 3, 305, :_reduce_420, + 3, 309, :_reduce_421, + 2, 191, :_reduce_422, + 4, 191, :_reduce_423, + 5, 191, :_reduce_424, + 5, 191, :_reduce_425, + 2, 244, :_reduce_426, + 4, 244, :_reduce_427, + 4, 244, :_reduce_428, + 3, 244, :_reduce_429, + 3, 244, :_reduce_430, + 3, 244, :_reduce_431, + 2, 244, :_reduce_432, + 1, 244, :_reduce_433, + 4, 244, :_reduce_434, + 0, 312, :_reduce_435, + 4, 243, :_reduce_436, + 0, 313, :_reduce_437, + 4, 243, :_reduce_438, + 0, 314, :_reduce_439, + 0, 315, :_reduce_440, + 4, 196, :_reduce_441, + 0, 317, :_reduce_442, + 0, 318, :_reduce_443, + 4, 310, :_reduce_444, + 1, 316, :_reduce_445, + 2, 316, :_reduce_446, + 3, 316, :_reduce_447, + 4, 316, :_reduce_448, + 0, 320, :_reduce_449, + 6, 254, :_reduce_450, + 1, 319, :_reduce_none, + 1, 319, :_reduce_none, + 6, 158, :_reduce_453, + 0, 158, :_reduce_454, + 1, 321, :_reduce_455, + 1, 321, :_reduce_none, + 1, 321, :_reduce_none, + 2, 322, :_reduce_458, + 1, 322, :_reduce_none, + 2, 160, :_reduce_460, + 1, 160, :_reduce_none, + 1, 231, :_reduce_462, + 1, 231, :_reduce_none, + 1, 232, :_reduce_464, + 1, 324, :_reduce_465, + 1, 324, :_reduce_none, + 2, 324, :_reduce_467, + 3, 325, :_reduce_468, + 1, 325, :_reduce_469, + 3, 233, :_reduce_470, + 3, 234, :_reduce_471, + 3, 235, :_reduce_472, + 3, 235, :_reduce_473, + 1, 329, :_reduce_474, + 3, 329, :_reduce_475, + 1, 330, :_reduce_none, + 2, 330, :_reduce_477, + 3, 237, :_reduce_478, + 3, 237, :_reduce_479, + 1, 332, :_reduce_480, + 3, 332, :_reduce_481, + 3, 236, :_reduce_482, + 3, 236, :_reduce_483, + 3, 238, :_reduce_484, + 3, 238, :_reduce_485, + 1, 333, :_reduce_486, + 3, 333, :_reduce_487, + 1, 334, :_reduce_488, + 3, 334, :_reduce_489, + 1, 326, :_reduce_490, + 2, 326, :_reduce_491, + 1, 327, :_reduce_492, + 2, 327, :_reduce_493, + 1, 328, :_reduce_494, + 2, 328, :_reduce_495, + 1, 331, :_reduce_496, + 0, 336, :_reduce_497, + 3, 331, :_reduce_498, + 0, 337, :_reduce_499, + 4, 331, :_reduce_500, + 1, 335, :_reduce_501, + 1, 335, :_reduce_502, + 1, 335, :_reduce_503, + 1, 335, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 2, 338, :_reduce_507, + 1, 338, :_reduce_508, + 1, 340, :_reduce_none, + 1, 340, :_reduce_none, + 1, 340, :_reduce_none, + 1, 340, :_reduce_none, + 3, 339, :_reduce_513, + 1, 323, :_reduce_none, + 1, 323, :_reduce_none, + 2, 323, :_reduce_516, + 2, 323, :_reduce_517, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 210, :_reduce_523, + 1, 210, :_reduce_524, + 1, 210, :_reduce_525, + 1, 210, :_reduce_526, + 1, 210, :_reduce_527, + 1, 210, :_reduce_528, + 1, 210, :_reduce_529, + 1, 239, :_reduce_530, + 1, 239, :_reduce_531, + 1, 177, :_reduce_532, + 1, 177, :_reduce_533, + 1, 182, :_reduce_534, + 1, 182, :_reduce_535, + 0, 341, :_reduce_536, + 4, 258, :_reduce_537, + 1, 258, :_reduce_538, + 3, 262, :_reduce_539, + 0, 343, :_reduce_540, + 3, 262, :_reduce_541, + 4, 342, :_reduce_542, + 2, 342, :_reduce_543, + 2, 342, :_reduce_544, + 1, 342, :_reduce_none, + 2, 345, :_reduce_546, + 0, 345, :_reduce_547, + 6, 308, :_reduce_548, + 8, 308, :_reduce_549, + 4, 308, :_reduce_550, + 6, 308, :_reduce_551, + 4, 308, :_reduce_552, + 6, 308, :_reduce_553, + 2, 308, :_reduce_554, + 4, 308, :_reduce_555, + 6, 308, :_reduce_556, + 2, 308, :_reduce_557, + 4, 308, :_reduce_558, + 2, 308, :_reduce_559, + 4, 308, :_reduce_560, + 1, 308, :_reduce_561, + 0, 308, :_reduce_562, + 1, 303, :_reduce_563, + 1, 303, :_reduce_564, + 1, 303, :_reduce_565, + 1, 303, :_reduce_566, + 1, 284, :_reduce_none, + 1, 284, :_reduce_568, + 1, 347, :_reduce_none, + 3, 347, :_reduce_570, + 1, 295, :_reduce_571, + 3, 295, :_reduce_572, + 2, 348, :_reduce_573, + 2, 349, :_reduce_574, + 1, 289, :_reduce_none, + 3, 289, :_reduce_576, + 1, 344, :_reduce_none, + 3, 344, :_reduce_578, + 1, 350, :_reduce_none, + 1, 350, :_reduce_none, + 2, 290, :_reduce_581, + 1, 290, :_reduce_582, + 3, 351, :_reduce_583, + 3, 352, :_reduce_584, + 1, 296, :_reduce_585, + 3, 296, :_reduce_586, + 1, 346, :_reduce_587, + 3, 346, :_reduce_588, + 1, 353, :_reduce_none, + 1, 353, :_reduce_none, + 2, 297, :_reduce_591, + 1, 297, :_reduce_592, + 1, 354, :_reduce_none, + 1, 354, :_reduce_none, + 2, 292, :_reduce_595, + 2, 291, :_reduce_596, + 0, 291, :_reduce_597, + 1, 263, :_reduce_none, + 0, 355, :_reduce_599, + 4, 263, :_reduce_600, + 1, 242, :_reduce_601, + 2, 242, :_reduce_none, + 1, 225, :_reduce_none, + 3, 225, :_reduce_604, + 3, 356, :_reduce_605, + 2, 356, :_reduce_606, + 2, 356, :_reduce_607, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 193, :_reduce_none, + 1, 193, :_reduce_none, + 1, 193, :_reduce_none, + 1, 193, :_reduce_none, + 1, 311, :_reduce_none, + 1, 311, :_reduce_none, + 1, 311, :_reduce_none, + 1, 264, :_reduce_none, + 1, 264, :_reduce_none, + 1, 181, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 0, 148, :_reduce_none, + 1, 148, :_reduce_none, + 0, 183, :_reduce_none, + 1, 183, :_reduce_none, + 2, 204, :_reduce_627, + 2, 180, :_reduce_628, + 0, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 259, :_reduce_632, + 1, 259, :_reduce_none, + 1, 151, :_reduce_none, + 2, 151, :_reduce_635, + 0, 149, :_reduce_636 ] + +racc_reduce_n = 637 + +racc_shift_n = 1082 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tLOWEST => 139, + :tEQL => 140, + :tBDOT2 => 141, + :tBDOT3 => 142 } + +racc_nt_base = 143 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tLOWEST", + "tEQL", + "tBDOT2", + "tBDOT3", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "@3", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@4", + "stmts", + "stmt_or_begin", + "@5", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "arg_value", + "expr", + "@6", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@7", + "@8", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@9", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@10", + "arg_rhs", + "rel_expr", + "primary", + "relop", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@11", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "dot_or_colon", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "@23", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@24", + "@25", + "f_args", + "do_block", + "do_body", + "operation3", + "@26", + "@27", + "@28", + "@29", + "case_args", + "@30", + "@31", + "cases", + "@32", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "@34", + "ssym", + "dsym", + "sym", + "@35", + "args_tail", + "@36", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_item", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@37", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_12(val, _values, result) + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_13(val, _values, result) + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + + result +end + +def _reduce_14(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_15(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_16(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 17 omitted + +# reduce 18 omitted + +def _reduce_19(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_20(val, _values, result) + result = val[1] + debug 12 + + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_23(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_24(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_25(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_27(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_28(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_29(val, _values, result) + result = val[1] + + result +end + +def _reduce_30(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_31(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_33(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_34(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_35(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_38(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_40(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 41 omitted + +def _reduce_42(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_44(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_49(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_50(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_54(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_55(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_56(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +# reduce 57 omitted + +def _reduce_58(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_59(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_60(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_61(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 62 omitted + +# reduce 63 omitted + +# reduce 64 omitted + +def _reduce_65(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_66(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_67(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_68(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_69(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_70(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_71(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_72(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_73(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_74(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_75(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_76(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_77(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_78(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_79(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 80 omitted + +def _reduce_81(val, _values, result) + result = val[1] + + result +end + +# reduce 82 omitted + +def _reduce_83(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_84(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_85(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_86(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_87(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_88(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_89(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_90(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_91(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_92(val, _values, result) + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_93(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 94 omitted + +def _reduce_95(val, _values, result) + result = val[1] + + result +end + +def _reduce_96(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_97(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_98(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_99(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_100(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_101(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_102(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_103(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_104(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_105(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_106(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_107(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_108(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_109(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_110(val, _values, result) + var, = val + + result = self.assignable var + + debug 16 + + result +end + +def _reduce_111(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_112(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_113(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_114(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_115(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_116(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_117(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_118(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 119 omitted + +def _reduce_120(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_121(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_122(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +def _reduce_126(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 127 omitted + +def _reduce_128(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 129 omitted + +def _reduce_130(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_131(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_132(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +def _reduce_204(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_205(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_206(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_207(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_208(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_209(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_210(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_211(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_212(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_213(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_214(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_215(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_221(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + result +end + +def _reduce_222(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + ## TODO: why is this 2.0 only? + debug 19 + + result +end + +def _reduce_223(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_224(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_225(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 229 omitted + +def _reduce_230(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_233(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_234(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_235(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_236(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_237(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_238(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_239(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_240(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_241(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_242(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +# reduce 243 omitted + +# reduce 244 omitted + +# reduce 245 omitted + +# reduce 246 omitted + +# reduce 247 omitted + +def _reduce_248(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_249(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_250(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 251 omitted + +def _reduce_252(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_253(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_254(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 255 omitted + +def _reduce_256(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_257(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +# reduce 258 omitted + +# reduce 259 omitted + +# reduce 260 omitted + +# reduce 261 omitted + +def _reduce_262(val, _values, result) + result = args val + + result +end + +def _reduce_263(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_264(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_265(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_266(val, _values, result) + result = call_args val + + result +end + +def _reduce_267(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_268(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_269(val, _values, result) + result = call_args val + + result +end + +def _reduce_270(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_271(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_272(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_273(val, _values, result) + result = val[1] + + result +end + +# reduce 274 omitted + +def _reduce_275(val, _values, result) + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + + result +end + +def _reduce_276(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_277(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_278(val, _values, result) + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_279(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_280(val, _values, result) + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_281(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 282 omitted + +# reduce 283 omitted + +# reduce 284 omitted + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +# reduce 290 omitted + +# reduce 291 omitted + +def _reduce_292(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_293(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_294(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_295(val, _values, result) + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + + result +end + +def _reduce_296(val, _values, result) + _, line, _ = val + result = s(:begin).line line + + result +end + +def _reduce_297(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_298(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_299(val, _values, result) + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + + result +end + +def _reduce_300(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_301(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_302(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_303(val, _values, result) + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_304(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_305(val, _values, result) + result = new_hash val + + result +end + +def _reduce_306(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_307(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_308(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_309(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_310(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_311(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_312(val, _values, result) + debug 20 + + result +end + +def _reduce_313(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 314 omitted + +def _reduce_315(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_316(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_317(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_318(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_319(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_320(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_321(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_322(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_323(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_324(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_325(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_326(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_327(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_328(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_329(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_330(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_331(val, _values, result) + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result +end + +def _reduce_332(val, _values, result) + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_333(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_334(val, _values, result) + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + + result +end + +def _reduce_335(val, _values, result) + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_336(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_337(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_338(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_339(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_340(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 341 omitted + +# reduce 342 omitted + +# reduce 343 omitted + +# reduce 344 omitted + +# reduce 345 omitted + +# reduce 346 omitted + +# reduce 347 omitted + +def _reduce_348(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_349(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_350(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +# reduce 351 omitted + +# reduce 352 omitted + +# reduce 353 omitted + +# reduce 354 omitted + +# reduce 355 omitted + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +# reduce 360 omitted + +# reduce 361 omitted + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +def _reduce_366(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 367 omitted + +def _reduce_368(val, _values, result) + result = val[1] + + result +end + +# reduce 369 omitted + +def _reduce_370(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = val[1] + + result +end + +def _reduce_373(val, _values, result) + sym, = val + + result = s(:array, sym).line lexer.lineno + + result +end + +def _reduce_374(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_375(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_376(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_377(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_378(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_379(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_380(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_381(val, _values, result) + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + + result +end + +def _reduce_382(val, _values, result) + result = call_args val + + result +end + +def _reduce_383(val, _values, result) + result = call_args val + + result +end + +def _reduce_384(val, _values, result) + result = call_args val + + result +end + +def _reduce_385(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_386(val, _values, result) + result = args val + + result +end + +# reduce 387 omitted + +def _reduce_388(val, _values, result) + result = args val + + result +end + +def _reduce_389(val, _values, result) + result = args val + + result +end + +def _reduce_390(val, _values, result) + result = args val + + result +end + +def _reduce_391(val, _values, result) + result = args val + + result +end + +def _reduce_392(val, _values, result) + result = args val + + result +end + +def _reduce_393(val, _values, result) + result = args(val) << nil + + result +end + +def _reduce_394(val, _values, result) + result = args val + + result +end + +def _reduce_395(val, _values, result) + result = args val + + result +end + +def _reduce_396(val, _values, result) + result = args val + + result +end + +def _reduce_397(val, _values, result) + result = args val + + result +end + +def _reduce_398(val, _values, result) + result = args val + + result +end + +def _reduce_399(val, _values, result) + result = args val + + result +end + +def _reduce_400(val, _values, result) + result = args val + + result +end + +def _reduce_401(val, _values, result) + result = args val + + result +end + +def _reduce_402(val, _values, result) + result = args val + + result +end + +def _reduce_403(val, _values, result) + result = 0 + result +end + +def _reduce_404(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_405(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +def _reduce_406(val, _values, result) + result = s(:args).line lexer.lineno + + result +end + +def _reduce_407(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +# reduce 408 omitted + +def _reduce_409(val, _values, result) + result = args val + + result +end + +def _reduce_410(val, _values, result) + result = args val + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +def _reduce_412(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 413 omitted + +def _reduce_414(val, _values, result) + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_415(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_416(val, _values, result) + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_417(val, _values, result) + result = args val + + result +end + +def _reduce_418(val, _values, result) + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_419(val, _values, result) + result = val[1] + + result +end + +def _reduce_420(val, _values, result) + result = val[1] + + result +end + +def _reduce_421(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_422(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_423(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_424(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_425(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_426(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_427(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_428(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_429(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_430(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_431(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_432(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_433(val, _values, result) + result = s(:zsuper).line lexer.lineno + + result +end + +def _reduce_434(val, _values, result) + result = new_aref val + + result +end + +def _reduce_435(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_436(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_437(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_438(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_439(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_440(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_441(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_442(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_443(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_444(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_445(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_446(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_447(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_448(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_449(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_450(val, _values, result) + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + + result +end + +# reduce 451 omitted + +# reduce 452 omitted + +def _reduce_453(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_454(val, _values, result) + result = nil + + result +end + +def _reduce_455(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 456 omitted + +# reduce 457 omitted + +def _reduce_458(val, _values, result) + result = val[1] + + result +end + +# reduce 459 omitted + +def _reduce_460(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 461 omitted + +def _reduce_462(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 463 omitted + +def _reduce_464(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_465(val, _values, result) + debug 37 + + result +end + +# reduce 466 omitted + +def _reduce_467(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_468(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_469(val, _values, result) + result = new_string val + + result +end + +def _reduce_470(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_471(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_472(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_473(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_474(val, _values, result) + result = new_word_list + + result +end + +def _reduce_475(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 476 omitted + +def _reduce_477(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_478(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_479(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_480(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_481(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_482(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_483(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_484(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_485(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_486(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_487(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_488(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_489(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_490(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_491(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_492(val, _values, result) + result = nil + + result +end + +def _reduce_493(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_494(val, _values, result) + result = nil + + result +end + +def _reduce_495(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_496(val, _values, result) + result = new_string val + + result +end + +def _reduce_497(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_498(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_499(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_500(val, _values, result) + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_501(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_502(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_503(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 504 omitted + +# reduce 505 omitted + +# reduce 506 omitted + +def _reduce_507(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_508(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 509 omitted + +# reduce 510 omitted + +# reduce 511 omitted + +# reduce 512 omitted + +def _reduce_513(val, _values, result) + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + + result +end + +# reduce 514 omitted + +# reduce 515 omitted + +def _reduce_516(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +def _reduce_517(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 518 omitted + +# reduce 519 omitted + +# reduce 520 omitted + +# reduce 521 omitted + +# reduce 522 omitted + +def _reduce_523(val, _values, result) + result = s(:nil).line lexer.lineno + result +end + +def _reduce_524(val, _values, result) + result = s(:self).line lexer.lineno + result +end + +def _reduce_525(val, _values, result) + result = s(:true).line lexer.lineno + result +end + +def _reduce_526(val, _values, result) + result = s(:false).line lexer.lineno + result +end + +def _reduce_527(val, _values, result) + result = s(:str, self.file).line lexer.lineno + result +end + +def _reduce_528(val, _values, result) + result = s(:lit, lexer.lineno).line lexer.lineno + result +end + +def _reduce_529(val, _values, result) + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_530(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + + result +end + +def _reduce_531(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_532(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_533(val, _values, result) + result = self.assignable val[0] + debug 40 + + result +end + +def _reduce_534(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_535(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_536(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_537(val, _values, result) + result = val[2] + + result +end + +def _reduce_538(val, _values, result) + result = nil + + result +end + +def _reduce_539(val, _values, result) + result = end_args val + + result +end + +def _reduce_540(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_541(val, _values, result) + result = end_args val + + result +end + +def _reduce_542(val, _values, result) + result = args val + + result +end + +def _reduce_543(val, _values, result) + result = args val + + result +end + +def _reduce_544(val, _values, result) + result = args val + + result +end + +# reduce 545 omitted + +def _reduce_546(val, _values, result) + result = val[1] + + result +end + +def _reduce_547(val, _values, result) + result = nil + + result +end + +def _reduce_548(val, _values, result) + result = args val + + result +end + +def _reduce_549(val, _values, result) + result = args val + + result +end + +def _reduce_550(val, _values, result) + result = args val + + result +end + +def _reduce_551(val, _values, result) + result = args val + + result +end + +def _reduce_552(val, _values, result) + result = args val + + result +end + +def _reduce_553(val, _values, result) + result = args val + + result +end + +def _reduce_554(val, _values, result) + result = args val + + result +end + +def _reduce_555(val, _values, result) + result = args val + + result +end + +def _reduce_556(val, _values, result) + result = args val + + result +end + +def _reduce_557(val, _values, result) + result = args val + + result +end + +def _reduce_558(val, _values, result) + result = args val + + result +end + +def _reduce_559(val, _values, result) + result = args val + + result +end + +def _reduce_560(val, _values, result) + result = args val + + result +end + +def _reduce_561(val, _values, result) + result = args val + + result +end + +def _reduce_562(val, _values, result) + result = args val + # result.line lexer.lineno + + result +end + +def _reduce_563(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_564(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_565(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_566(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 567 omitted + +def _reduce_568(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_571(val, _values, result) + result = new_arg val + + result +end + +def _reduce_572(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +def _reduce_573(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_574(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +# reduce 575 omitted + +def _reduce_576(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 577 omitted + +def _reduce_578(val, _values, result) + result = args val + + result +end + +# reduce 579 omitted + +# reduce 580 omitted + +def _reduce_581(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_582(val, _values, result) + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + + result +end + +def _reduce_583(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + + result +end + +def _reduce_584(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + + result +end + +def _reduce_585(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_586(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_587(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_588(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 589 omitted + +# reduce 590 omitted + +def _reduce_591(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_592(val, _values, result) + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + + result +end + +# reduce 593 omitted + +# reduce 594 omitted + +def _reduce_595(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_596(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_597(val, _values, result) + result = nil + + result +end + +# reduce 598 omitted + +def _reduce_599(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_600(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_601(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 602 omitted + +# reduce 603 omitted + +def _reduce_604(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_605(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_606(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_607(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 608 omitted + +# reduce 609 omitted + +# reduce 610 omitted + +# reduce 611 omitted + +# reduce 612 omitted + +# reduce 613 omitted + +# reduce 614 omitted + +# reduce 615 omitted + +# reduce 616 omitted + +# reduce 617 omitted + +# reduce 618 omitted + +# reduce 619 omitted + +# reduce 620 omitted + +# reduce 621 omitted + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +# reduce 626 omitted + +def _reduce_627(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_628(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 629 omitted + +# reduce 630 omitted + +# reduce 631 omitted + +def _reduce_632(val, _values, result) + yyerrok + result +end + +# reduce 633 omitted + +# reduce 634 omitted + +def _reduce_635(val, _values, result) + yyerrok + result +end + +def _reduce_636(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby20Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby20_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby20_parser.y new file mode 100644 index 000000000..b72bf34a1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby20_parser.y @@ -0,0 +1,2707 @@ +# -*- racc -*- + +class Ruby20Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL arg_value + { + result = new_masgn val[0], val[2], :wrap + } + | mlhs tEQL mrhs + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM tINTEGER tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + } + | tUMINUS_NUM tFLOAT tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + ## TODO: why is this 2.0 only? + debug 19 + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + compstmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + + numeric: tINTEGER + | tFLOAT + | tUMINUS_NUM tINTEGER =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + | tUMINUS_NUM tFLOAT =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_item: f_norm_arg + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_kw: tLABEL arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + + f_block_kw: tLABEL primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + + f_opt: tIDENTIFIER tEQL arg_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + + f_block_opt: tIDENTIFIER tEQL primary_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby21_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby21_parser.rb new file mode 100644 index 000000000..e5f2b9e60 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby21_parser.rb @@ -0,0 +1,10981 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby21Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -520, 571, 571, 284, 571, 571, -534, -520, -520, -520, + 233, 571, -520, -520, -520, 3, -520, 254, 651, 654, + 224, 225, 224, 225, -520, -94, -520, -520, -520, -108, + -109, -116, -115, -111, 126, -113, -520, -520, -80, -520, + -520, -520, -520, -520, 230, 221, 234, -110, -111, 251, + 742, 279, -113, 253, 252, 249, 250, 222, 881, -110, + 616, -108, 613, 612, 611, -112, 614, -520, -520, -520, + -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, + -520, 650, 653, -520, -520, -520, 223, -520, -520, 284, + 286, -520, 224, 225, -520, -520, 226, -520, 781, -520, + 284, -520, 284, -520, -520, -520, -520, -520, -520, -520, + 234, -520, 234, -520, 274, 130, 130, -112, 130, 130, + 129, 129, 943, 129, 129, 130, -520, -520, -520, -520, + 129, -520, -523, -520, -99, -100, -107, -106, -520, -523, + -523, -523, -520, -616, -523, -523, -523, -111, -523, -113, + 130, -102, -111, -102, -113, 129, -523, -104, -523, -523, + -523, -110, -114, 880, -101, 281, -110, 281, -523, -523, + -535, -523, -523, -523, -523, -523, 286, -104, 230, -112, + 830, -520, 234, -616, -112, 229, 846, 286, -520, 286, + 830, -523, 847, 635, 227, 335, 640, -613, -523, -523, + -523, -523, -523, -523, -523, -523, -523, -523, -523, -523, + -523, -523, -523, 95, 829, -523, -523, -523, -102, -523, + -523, 96, -103, -523, 829, -109, -523, -523, -617, -523, + -434, -523, 635, -523, 231, -523, -523, -523, -523, -523, + -523, -523, 481, -523, -104, -523, 108, 109, 108, 109, + -520, 635, 336, -102, 637, 636, -102, -520, -523, -523, + -523, -523, -613, -523, -300, -523, -520, -105, -534, -102, + -523, -300, -300, -300, -523, 620, -107, -300, -300, -104, + -300, -530, -104, -434, -613, 860, 623, 578, -530, -116, + -434, -529, -614, 637, 636, -104, 234, -116, -529, -434, + -300, -300, 793, -300, -300, -300, -300, -300, -531, 231, + -99, -528, 637, 636, 399, -531, 402, -434, -528, 631, + 630, 795, 635, -108, 110, 111, 110, 111, 405, -620, + 408, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, -300, -300, -300, -523, -535, -300, -300, -300, + 425, 677, -523, 624, -620, -300, 550, -614, -300, 430, + 821, -523, 822, -300, -116, -300, 635, -300, -300, -300, + -300, -300, -300, -300, 585, -300, 550, -300, 586, -614, + -525, 620, -620, 637, 636, 633, 635, -525, -100, -620, + -300, -300, 623, -105, -616, -300, -620, 671, -620, 635, + 671, -109, -300, -620, -620, -620, -114, -620, 254, -620, + -620, -115, -620, -526, -620, -111, -620, -113, -106, -616, + -526, -620, 480, -620, 482, 631, 630, 637, 636, 638, + 635, -115, -620, -620, 672, -620, -620, -620, -620, -620, + 251, -620, -102, 672, 253, 252, -527, 637, 636, 643, + 598, 914, -111, -527, 483, -111, 808, 599, 233, 624, + 637, 636, 648, -620, -620, -620, -620, -620, -620, -620, + -620, -620, -620, -620, -620, -620, -620, 808, 512, -620, + -620, -620, 521, 678, 524, -104, 526, -620, -79, -113, + -620, 637, 636, 655, 234, -620, 536, -620, -113, -620, + -620, -620, -620, -620, -620, -620, -110, -620, -620, -620, + 616, -110, 613, 612, 611, 620, 614, -340, 731, -101, + 537, 730, -620, -620, -340, -103, 623, -620, -620, 224, + 225, 544, -110, -340, -620, -620, -620, -620, -112, 291, + -620, -620, -620, 731, -620, 427, 733, 234, 618, 602, + 429, 428, 254, -620, -620, -620, -620, 628, 627, 631, + 630, 130, 224, 225, -620, -620, 129, -620, -620, -620, + -620, -620, 616, 281, 613, 612, 611, 731, 614, 616, + 733, 613, 612, 611, 251, 614, 547, 130, 253, 252, + 249, 250, 129, 624, 551, -620, -620, -620, -620, -620, + -620, -620, -620, -620, -620, -620, -620, -620, -620, 254, + 781, -620, -620, -620, 230, 823, -620, 781, 234, -620, + 578, 478, -620, -620, 418, -620, 785, -620, 583, -620, + 479, -620, -620, -620, -620, -620, -620, -620, 130, -620, + -620, -620, 616, 129, 613, 612, 611, 620, 614, 271, + 272, 224, 225, 584, -620, -620, -620, -620, 623, -620, + -300, -620, 731, 856, 860, 733, -620, -300, -300, -300, + -112, 592, -300, -300, -300, 616, -300, 613, 612, 611, + 618, 614, 631, 630, 270, 269, -300, -300, -300, 628, + 627, 631, 630, 856, 860, 642, -300, -300, -532, -300, + -300, -300, -300, -300, 616, -532, 613, 612, 611, 234, + 614, 130, 1041, 781, -532, 616, 129, 613, 612, 611, + 646, 614, 785, 649, 652, 624, 659, -300, -300, -300, + -300, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, 130, 781, -300, -300, -300, 129, 824, -300, -273, + 661, -300, 662, 781, -300, -300, 234, -300, 669, -300, + 670, -300, 785, -300, -300, -300, -300, -300, -300, -300, + 130, -300, 281, -300, 616, 129, 613, 612, 611, 620, + 614, 254, 682, 254, 254, 254, -300, -300, -300, -300, + 623, -300, -300, -300, 254, 689, 234, 234, -300, -300, + -300, -300, -114, -533, 230, -300, -300, 425, -300, 254, + -533, 543, 618, 251, 234, -94, 708, 253, 252, -533, + 541, 628, 627, 631, 630, 264, 265, 234, -300, -300, + 556, -300, -300, -300, -300, -300, 133, 134, 135, 136, + 137, 251, -291, 257, 719, 253, 252, 249, 250, -291, + 724, 255, 727, 256, 234, 234, 735, 624, -291, -300, + -300, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, -300, 230, 230, -300, -300, -300, 230, 677, + 553, 582, 526, -300, 738, 588, -300, 727, 727, 479, + 580, -300, 578, -300, 590, -300, -300, -300, -300, -300, + -300, -300, 727, -300, 616, -300, 613, 612, 611, 620, + 614, 616, 763, 613, 612, 611, 769, 614, -300, -300, + 623, -300, 772, -300, -620, 773, 775, 777, 230, -301, + -300, -620, -620, -620, -114, 665, -301, -620, -620, 254, + -620, -301, 618, 230, 663, -301, 779, 788, -301, -620, + 1025, 628, 627, 631, 630, 264, 265, -301, 789, 590, + -620, -620, 790, -620, -620, -620, -620, -620, 796, 797, + -274, 251, -300, 257, 809, 253, 252, 249, 250, -300, + 512, 255, 512, 256, -617, 234, 826, 624, -300, 274, + 835, -620, -620, -620, -620, -620, -620, -620, -620, -620, + -620, -620, -620, -620, -620, -300, 837, -620, -620, -620, + 524, 678, -300, 526, 719, -620, 234, -617, -620, 281, + 281, -300, 254, -620, 719, -620, 254, -620, -620, -620, + -620, -620, -620, -620, 860, -620, -620, -620, 264, 265, + 1006, -532, 613, 612, 611, 727, 614, 234, -532, 234, + -620, -620, 727, -620, 251, -620, 257, -532, 253, 252, + 249, 250, -620, 234, 898, 899, -112, 8, 85, 86, + 87, 12, 78, 234, 908, -533, 79, 80, -275, 234, + 913, 83, -533, 81, 82, 84, 33, 34, 76, 77, + 930, -533, 719, -273, 935, 88, 31, 30, 118, 117, + 119, 120, 903, 904, 22, 727, 905, 124, 125, 666, + 11, 49, 10, 13, 122, 121, 123, 112, 60, 114, + 113, 115, 727, 116, 124, 125, 727, 108, 109, 727, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, 230, 247, 248, -291, 727, 264, + 265, 1031, 43, 234, -291, 36, 955, 234, 62, 63, + 1029, 772, 64, -291, 38, 251, 958, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, 960, 962, + 230, 105, 95, 97, 98, 99, 101, 1025, 964, 964, + 96, 106, 234, 268, 971, -248, 590, -301, 89, -276, + 972, 93, 100, 102, -301, 110, 111, 309, 85, 86, + 87, 12, 78, -301, 772, 975, 79, 80, 978, 980, + 982, 83, 234, 81, 82, 84, 33, 34, 76, 77, + 133, 134, 135, 136, 137, 88, 31, 30, 118, 117, + 119, 120, 984, 763, 22, 1002, 1003, 1012, 1013, 666, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, 1023, 116, 124, 125, 1026, 108, 109, 846, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, -300, 247, 248, 1032, 727, 264, + 265, -300, 43, 1042, 964, 313, -617, 964, 62, 63, + -300, 964, 64, 772, 38, 251, 1049, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, 1051, 1053, + 1055, 105, 95, 97, 98, 99, 101, 1055, 724, 727, + 96, 106, 1013, 268, -617, -616, 234, 964, 89, 1076, + 1055, 93, 100, 102, 1055, 110, 111, 309, 85, 86, + 87, 12, 78, 1055, 1055, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + 133, 134, 135, 136, 137, 88, 31, 30, 118, 117, + 119, 120, nil, 1006, 22, 613, 612, 611, nil, 614, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, nil, 247, 248, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, 268, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + 133, 134, 135, 136, 137, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, nil, 247, 248, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, 268, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, nil, 247, 248, nil, nil, 264, + 265, nil, 43, nil, nil, 313, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, 234, 268, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, nil, 247, 248, nil, nil, 264, + 265, nil, 43, nil, nil, 313, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, 268, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, nil, 247, 248, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, 268, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, nil, 247, 248, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, 268, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, nil, -642, -642, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, 267, 262, 263, nil, -642, -642, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, -642, -642, -642, -642, 271, 272, + nil, nil, -642, -642, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, -642, -642, -642, -642, 271, 272, + nil, nil, -642, -642, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 8, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 10, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, -642, -642, -642, -642, 271, 272, + nil, nil, -642, -642, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, -642, -642, -642, -642, 271, 272, + nil, nil, -642, -642, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, -642, -642, -642, -642, 271, 272, + nil, nil, -642, -642, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, -642, -642, -642, -642, 271, 272, + nil, nil, -642, -642, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + nil, nil, 262, 263, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, 258, 259, 260, 261, 271, 272, + 266, nil, 262, 263, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 270, 269, 255, 23, 256, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, 254, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 264, + 265, nil, 43, nil, nil, 36, nil, 254, 62, 63, + nil, nil, 64, nil, 38, 251, nil, 257, 48, 253, + 252, 249, 250, 264, 265, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, 251, + 96, 106, nil, 253, 252, 249, 250, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 309, 85, 86, + 87, 12, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 49, 311, 13, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + 12, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 49, 10, 13, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 43, nil, nil, 36, nil, nil, 62, 63, nil, + nil, 64, nil, 38, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, 616, + 64, 613, 612, 611, 620, 614, 48, nil, nil, nil, + nil, nil, nil, nil, 244, 623, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, 618, -433, 93, + 100, 102, nil, 110, 111, -433, -433, -433, 631, 630, + -433, -433, -433, 616, -433, 613, 612, 611, 620, 614, + nil, nil, nil, -433, -433, -433, nil, nil, nil, 623, + nil, nil, nil, nil, -433, -433, nil, -433, -433, -433, + -433, -433, 624, nil, nil, nil, nil, nil, nil, nil, + nil, 618, nil, nil, nil, nil, nil, nil, nil, nil, + 628, 627, 631, 630, nil, -433, -433, -433, -433, -433, + -433, -433, -433, -433, -433, -433, -433, -433, -433, nil, + nil, -433, -433, -433, nil, nil, -433, nil, 281, -433, + nil, nil, -433, -433, nil, -433, 624, -433, nil, -433, + nil, -433, -433, -433, -433, -433, -433, -433, nil, -433, + -433, -433, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, -433, -433, -309, -433, nil, -433, + nil, nil, nil, -309, -309, -309, -433, nil, -309, -309, + -309, 616, -309, 613, 612, 611, 620, 614, nil, nil, + nil, nil, -309, -309, nil, nil, nil, 623, nil, nil, + nil, nil, -309, -309, nil, -309, -309, -309, -309, -309, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 618, + nil, nil, nil, nil, nil, nil, nil, nil, 628, 627, + 631, 630, nil, -309, -309, -309, -309, -309, -309, -309, + -309, -309, -309, -309, -309, -309, -309, nil, nil, -309, + -309, -309, nil, nil, -309, nil, 291, -309, nil, nil, + -309, -309, nil, -309, 624, -309, nil, -309, nil, -309, + -309, -309, -309, -309, -309, -309, nil, -309, nil, -309, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -309, -309, nil, -309, nil, -309, 85, 86, + 87, nil, 78, nil, -309, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, 302, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, 300, nil, 298, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + 303, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 302, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, 300, nil, 298, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 303, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 302, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, 300, nil, 298, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 303, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 328, 329, 76, 77, nil, nil, nil, + nil, nil, 88, 325, 331, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 326, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 332, + nil, nil, nil, nil, nil, 616, nil, 613, 612, 611, + 620, 614, nil, nil, nil, nil, nil, nil, nil, 322, + nil, 623, 318, nil, nil, 62, 63, nil, nil, 64, + nil, 317, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 618, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 631, 630, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 624, 81, + 82, 84, 328, 329, 76, 77, nil, nil, nil, nil, + nil, 88, 325, 331, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 326, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 332, nil, + nil, nil, nil, nil, 616, nil, 613, 612, 611, 620, + 614, nil, nil, nil, nil, nil, nil, nil, 322, nil, + 623, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 618, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 631, 630, nil, 96, 106, nil, nil, + nil, 334, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 624, 81, 82, + 84, 328, 329, 76, 77, nil, nil, nil, nil, nil, + 88, 325, 331, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 328, 329, 76, 77, nil, nil, nil, nil, nil, 88, + 325, 331, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 328, + 329, 76, 77, nil, nil, nil, nil, nil, 88, 325, + 331, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, 616, 64, 613, 612, 611, 620, + 614, 48, nil, nil, nil, nil, nil, nil, nil, 244, + 623, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, 618, -292, 93, 100, 102, nil, 110, 111, + -292, -292, -292, 631, 630, -292, -292, -292, 616, -292, + 613, 612, 611, 620, 614, nil, nil, nil, nil, -292, + -292, -292, nil, nil, 623, nil, nil, nil, nil, -292, + -292, nil, -292, -292, -292, -292, -292, 624, nil, nil, + nil, nil, nil, nil, nil, nil, 618, nil, nil, nil, + nil, nil, nil, nil, nil, 628, 627, 631, 630, nil, + -292, -292, -292, -292, -292, -292, -292, -292, -292, -292, + -292, -292, -292, -292, nil, nil, -292, -292, -292, nil, + nil, -292, nil, 234, -292, nil, nil, -292, -292, nil, + -292, 624, -292, nil, -292, nil, -292, -292, -292, -292, + -292, -292, -292, nil, -292, nil, -292, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, -292, + -292, -292, -292, nil, -292, nil, -292, nil, nil, nil, + -641, -292, 85, 86, 87, 12, 78, -641, -641, -641, + 79, 80, -641, -641, -641, 83, -641, 81, 82, 84, + 33, 34, 76, 77, nil, -641, -641, -641, nil, 88, + 31, 30, 118, 117, 119, 120, -641, -641, 22, -641, + -641, -641, -641, -641, 11, 49, nil, 13, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, -641, -641, -641, + -641, -641, -641, -641, -641, -641, -641, -641, -641, -641, + -641, nil, nil, -641, -641, -641, 43, nil, -641, 36, + 281, -641, 62, 63, -641, -641, 64, -641, 38, -641, + nil, -641, 48, -641, -641, -641, -641, -641, -641, -641, + 23, -641, -641, -641, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, -641, -641, nil, -641, + nil, -641, 89, nil, nil, 93, 100, 102, -641, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, 130, nil, nil, nil, nil, 129, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 326, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 332, nil, nil, nil, nil, nil, 616, nil, + 613, 612, 611, 620, 614, nil, nil, nil, nil, nil, + nil, nil, 362, nil, 623, 36, nil, nil, 62, 63, + nil, nil, 64, nil, 38, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 618, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, 631, 630, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, 624, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 326, nil, nil, 122, 121, 123, 367, 60, 114, 113, + 368, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 332, nil, nil, nil, nil, nil, 616, nil, 613, + 612, 611, 620, 614, nil, nil, nil, nil, 374, nil, + nil, 369, nil, 623, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 618, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, 631, 630, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + 624, 81, 82, 84, 328, 329, 76, 77, nil, nil, + nil, nil, nil, 88, 325, 331, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 326, + nil, nil, 122, 121, 123, 367, 60, 114, 113, 368, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 332, nil, nil, nil, nil, nil, 616, nil, 613, 612, + 611, 620, 614, nil, nil, nil, nil, nil, nil, nil, + 369, nil, 623, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 618, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, 631, 630, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, 624, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 10, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, 418, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, nil, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, 435, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, 435, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 302, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + 300, nil, 298, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 303, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, 234, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 328, 329, 76, + 77, nil, nil, nil, nil, nil, 88, 325, 331, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 328, 329, 76, 77, nil, nil, + nil, nil, nil, 88, 325, 331, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 328, 329, 76, 77, nil, nil, nil, + nil, nil, 88, 325, 331, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 328, 329, 76, 77, nil, nil, nil, nil, + nil, 88, 325, 331, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 328, 329, 76, 77, nil, nil, nil, nil, nil, + 88, 325, 331, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 328, 329, 76, 77, nil, nil, nil, nil, nil, 88, + 325, 331, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 328, + 329, 76, 77, nil, nil, nil, nil, nil, 88, 325, + 331, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 328, 329, 76, + 77, nil, nil, nil, nil, nil, 88, 325, 331, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 328, 329, 76, 77, nil, nil, + nil, nil, nil, 88, 325, 331, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 328, 329, 76, 77, nil, nil, nil, + nil, nil, 88, 325, 331, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 328, 329, 76, 77, nil, nil, nil, nil, + nil, 88, 325, 331, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 328, 329, 76, 77, nil, nil, nil, nil, nil, + 88, 325, 331, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 328, 329, 76, 77, nil, nil, nil, nil, nil, 88, + 325, 331, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 328, + 329, 76, 77, nil, nil, nil, nil, nil, 88, 325, + 331, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 328, 329, 76, + 77, nil, nil, nil, nil, nil, 88, 325, 331, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 302, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, 300, nil, 298, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 303, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 302, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, 300, nil, 298, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 303, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 302, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + 300, nil, 298, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, 234, nil, + nil, nil, nil, nil, 89, nil, 303, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 328, 329, 76, 77, nil, nil, nil, nil, nil, + 88, 325, 331, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 328, 329, 76, 77, nil, nil, nil, nil, nil, 88, + 325, 331, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 328, + 329, 76, 77, nil, nil, nil, nil, nil, 88, 325, + 331, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, nil, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 326, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 332, nil, nil, nil, nil, nil, 616, nil, + 613, 612, 611, 620, 614, nil, nil, nil, nil, nil, + nil, nil, 322, nil, 623, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 618, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, 631, 630, nil, + 96, 106, nil, nil, nil, 539, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, 624, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 326, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 332, nil, nil, nil, nil, nil, 616, nil, 613, + 612, 611, 620, 614, nil, nil, nil, nil, nil, nil, + nil, 322, nil, 623, 318, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 618, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, 631, 630, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + 624, 81, 82, 84, 328, 329, 76, 77, nil, nil, + nil, nil, nil, 88, 325, 331, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 328, 329, 76, 77, nil, nil, nil, + nil, nil, 88, 325, 331, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, 556, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 328, 329, 76, 77, nil, nil, nil, nil, + nil, 88, 325, 331, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 302, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + 300, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 303, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 328, 329, 76, 77, nil, nil, nil, nil, nil, + 88, 325, 331, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 302, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 303, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, 616, 64, 613, 612, 611, 620, 614, + 48, nil, nil, nil, nil, nil, nil, nil, 244, 623, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, 618, -621, 93, 100, 102, nil, 110, 111, -621, + -621, -621, 631, 630, -621, -621, -621, 616, -621, 613, + 612, 611, 620, 614, nil, nil, nil, -621, -621, -621, + -621, nil, nil, 623, nil, nil, nil, nil, -621, -621, + nil, -621, -621, -621, -621, -621, 624, nil, nil, nil, + nil, nil, nil, nil, nil, 618, nil, nil, nil, nil, + nil, nil, nil, nil, 628, 627, 631, 630, nil, -621, + -621, -621, -621, -621, -621, -621, -621, -621, -621, -621, + -621, -621, -621, nil, nil, -621, -621, -621, nil, nil, + -621, nil, nil, -621, nil, nil, -621, -621, nil, -621, + 624, -621, nil, -621, nil, -621, -621, -621, -621, -621, + -621, -621, nil, -621, -621, -621, 616, nil, 613, 612, + 611, 620, 614, nil, nil, nil, nil, nil, -621, -621, + -621, -621, 623, -621, -622, -621, nil, nil, nil, nil, + -621, -622, -622, -622, nil, nil, -622, -622, -622, nil, + -622, nil, nil, nil, 618, nil, nil, nil, nil, -622, + -622, -622, -622, 628, 627, 631, 630, nil, nil, nil, + -622, -622, nil, -622, -622, -622, -622, -622, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 624, + nil, -622, -622, -622, -622, -622, -622, -622, -622, -622, + -622, -622, -622, -622, -622, nil, nil, -622, -622, -622, + nil, nil, -622, nil, nil, -622, nil, nil, -622, -622, + nil, -622, nil, -622, nil, -622, nil, -622, -622, -622, + -622, -622, -622, -622, nil, -622, -622, -622, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + -622, -622, -622, -622, nil, -622, nil, -622, nil, 85, + 86, 87, -622, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, 302, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, 300, nil, 298, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, 303, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 328, 329, 76, 77, nil, nil, + nil, nil, nil, 88, 325, 331, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, -641, 93, + 100, 102, nil, 110, 111, -641, -641, -641, nil, nil, + -641, -641, -641, nil, -641, nil, nil, nil, nil, nil, + nil, nil, nil, -641, -641, nil, nil, nil, nil, nil, + nil, nil, nil, nil, -641, -641, nil, -641, -641, -641, + -641, -641, nil, nil, nil, nil, nil, nil, nil, 510, + 462, nil, nil, 511, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, nil, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, -641, nil, nil, 175, + 176, 161, 162, -641, nil, nil, nil, nil, 281, -641, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + -641, -641, 177, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, -641, nil, 85, 86, 87, -641, + 78, nil, 170, nil, 79, 80, -641, nil, nil, 83, + nil, 81, 82, 84, 328, 329, 76, 77, nil, nil, + nil, nil, nil, 88, 325, 331, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 302, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, 702, nil, 298, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 303, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 328, 329, 76, 77, nil, nil, nil, + nil, nil, 88, 325, 331, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 302, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, 298, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 303, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 328, 329, 76, 77, nil, nil, nil, nil, + nil, 88, 325, 331, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, 12, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, 11, 49, 311, 13, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, + 36, nil, nil, 62, 63, nil, nil, 64, nil, 38, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, 418, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 328, 329, 76, 77, nil, nil, nil, nil, nil, 88, + 325, 331, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 326, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, nil, nil, 332, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 322, nil, nil, 318, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 302, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, 300, nil, 298, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 303, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 326, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, nil, nil, 332, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 322, nil, nil, 318, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 328, 329, 76, + 77, nil, nil, nil, nil, nil, 88, 325, 331, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 302, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, 300, nil, 298, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 303, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 302, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, 300, nil, 298, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 303, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 328, 329, 76, 77, nil, nil, nil, nil, nil, + 88, 325, 331, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 328, 329, 76, 77, nil, nil, nil, nil, nil, 88, + 325, 331, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, 801, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 302, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, 300, nil, 298, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 303, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 328, 329, 76, + 77, nil, nil, nil, nil, nil, 88, 325, 331, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, 302, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, 702, nil, 298, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + 303, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 302, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, 298, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 303, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 328, 329, 76, 77, nil, nil, nil, nil, nil, 88, + 325, 331, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 328, + 329, 76, 77, nil, nil, nil, nil, nil, 88, 325, + 331, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 326, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, nil, nil, 332, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 322, nil, nil, 318, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 326, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, nil, nil, 332, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 322, nil, nil, 318, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 328, 329, 76, + 77, nil, nil, nil, nil, nil, 88, 325, 331, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, 435, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, 302, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, 702, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + 303, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 302, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 303, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 328, 329, 76, 77, nil, nil, + nil, nil, nil, 88, 325, 331, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, 865, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 328, 329, 76, 77, nil, nil, nil, nil, + nil, 88, 325, 331, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 328, 329, 76, 77, nil, nil, nil, nil, nil, + 88, 325, 331, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 328, + 329, 76, 77, nil, nil, nil, nil, nil, 88, 325, + 331, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 328, 329, 76, + 77, nil, nil, nil, nil, nil, 88, 325, 331, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 328, 329, 76, 77, nil, + nil, nil, nil, nil, 88, 325, 331, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 328, 329, 76, 77, nil, nil, nil, + nil, nil, 88, 325, 331, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 328, 329, 76, 77, nil, nil, nil, nil, + nil, 88, 325, 331, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 302, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, 298, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 303, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 328, 329, 76, 77, nil, nil, nil, nil, nil, + 88, 325, 331, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 328, 329, 76, 77, nil, nil, nil, nil, nil, 88, + 325, 331, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 326, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, nil, nil, 332, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 986, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 328, + 329, 76, 77, nil, nil, nil, nil, nil, 88, 325, + 331, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 326, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, nil, nil, 332, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 993, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 328, 329, + 76, 77, nil, nil, nil, nil, nil, 88, 325, 331, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, 998, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 328, 329, 76, + 77, nil, nil, nil, nil, nil, 88, 325, 331, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 326, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, nil, nil, 332, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 986, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 328, 329, 76, 77, + nil, nil, nil, nil, nil, 88, 325, 331, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 302, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, 300, nil, 298, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 303, + 93, 100, 102, nil, 110, 111, 188, 199, 189, 212, + 185, 205, 195, 194, 215, 216, 210, 193, 192, 187, + 213, 217, 218, 197, 186, 200, 204, 206, 198, 191, + nil, nil, nil, 207, 214, 209, 208, 201, 211, 196, + 184, 203, 202, nil, nil, nil, nil, nil, 183, 190, + 181, 182, 178, 179, 180, 141, 143, 140, nil, 142, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + nil, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, 105, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 106, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 188, + 199, 189, 212, 185, 205, 195, 194, 215, 216, 210, + 193, 192, 187, 213, 217, 218, 197, 186, 200, 204, + 206, 198, 191, nil, nil, nil, 207, 214, 209, 208, + 201, 211, 196, 184, 203, 202, nil, nil, nil, nil, + nil, 183, 190, 181, 182, 178, 179, 180, 141, 143, + nil, nil, 142, nil, nil, nil, nil, nil, nil, nil, + nil, 173, 174, nil, 169, 151, 152, 153, 160, 157, + 159, nil, nil, 154, 155, nil, nil, nil, 175, 176, + 161, 162, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 166, 165, nil, 150, 172, + 168, 167, 163, 164, 158, 156, 148, 171, 149, nil, + nil, 177, 105, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 106, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 188, 199, 189, 212, 185, 205, 195, 194, + 215, 216, 210, 193, 192, 187, 213, 217, 218, 197, + 186, 200, 204, 206, 198, 191, nil, nil, nil, 207, + 214, 209, 385, 384, 386, 383, 184, 203, 202, nil, + nil, nil, nil, nil, 183, 190, 181, 182, 380, 381, + 382, 378, 143, 114, 113, 379, nil, 116, nil, nil, + nil, nil, nil, nil, 173, 174, nil, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 390, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 170, 188, 199, 189, 212, 185, + 205, 195, 194, 215, 216, 210, 193, 192, 187, 213, + 217, 218, 197, 186, 200, 204, 206, 198, 191, nil, + nil, nil, 207, 214, 209, 208, 201, 211, 196, 184, + 203, 202, nil, nil, nil, nil, nil, 183, 190, 181, + 182, 178, 179, 180, 141, 143, 415, 414, 142, nil, + 416, nil, nil, nil, nil, nil, nil, 173, 174, nil, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 170, 188, 199, + 189, 212, 185, 205, 195, 194, 215, 216, 210, 193, + 192, 187, 213, 217, 218, 197, 186, 200, 204, 206, + 198, 191, nil, nil, nil, 207, 214, 209, 208, 201, + 211, 196, 184, 203, 202, nil, nil, nil, nil, nil, + 183, 190, 181, 182, 178, 179, 180, 141, 143, nil, + nil, 142, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, nil, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, 105, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 106, nil, nil, nil, nil, nil, nil, nil, nil, + 170, 188, 199, 189, 212, 185, 205, 195, 194, 215, + 216, 210, 193, 192, 187, 213, 217, 218, 197, 186, + 200, 204, 206, 198, 191, nil, nil, nil, 207, 214, + 209, 208, 201, 211, 196, 184, 203, 202, nil, nil, + nil, nil, nil, 183, 190, 181, 182, 178, 179, 180, + 141, 143, nil, nil, 142, nil, nil, nil, nil, nil, + nil, nil, nil, 173, 174, nil, 169, 151, 152, 153, + 160, 157, 159, nil, nil, 154, 155, nil, nil, nil, + 175, 176, 161, 162, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 166, 165, nil, + 150, 172, 168, 167, 163, 164, 158, 156, 148, 171, + 149, nil, nil, 177, 105, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 106, nil, nil, nil, nil, nil, + nil, nil, nil, 170, 188, 199, 189, 212, 185, 205, + 195, 194, 215, 216, 210, 193, 192, 187, 213, 217, + 218, 197, 186, 200, 204, 206, 198, 191, nil, nil, + nil, 207, 214, 209, 208, 201, 211, 196, 184, 203, + 202, nil, nil, nil, nil, nil, 183, 190, 181, 182, + 178, 179, 180, 141, 143, nil, nil, 142, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, nil, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 458, 462, nil, nil, 459, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 281, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 465, + 469, nil, nil, 464, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 281, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 683, 462, nil, + nil, 684, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 685, 469, nil, nil, 686, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 712, 462, nil, nil, 713, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 281, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 715, 469, nil, nil, 716, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 281, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 683, + 462, nil, nil, 684, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 281, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 685, 469, nil, + nil, 686, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 749, 462, nil, nil, 750, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 751, 469, nil, nil, 752, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 281, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 754, 469, nil, nil, 755, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 281, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 510, + 462, nil, nil, 511, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 281, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 803, 462, nil, + nil, 804, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 806, 469, nil, nil, 805, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, 616, 177, 613, + 612, 611, 620, 614, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 623, nil, nil, nil, nil, 170, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 618, 1059, 469, nil, nil, + 1058, nil, nil, nil, 628, 627, 631, 630, nil, 173, + 174, nil, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, 281, nil, nil, nil, nil, + 624, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + nil, nil, nil, nil, 1062, 462, nil, nil, 1063, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, 170, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, 281, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, nil, nil, + nil, nil, 1064, 469, nil, nil, 1065, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, 170, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, 281, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, 616, 177, 613, 612, 611, 620, + 614, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 623, nil, nil, nil, nil, 170, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 618, nil, nil, nil, nil, nil, nil, nil, + nil, 628, 627, 631, 630, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 624 ] + +racc_action_check = [ + 112, 351, 352, 65, 934, 866, 237, 112, 112, 112, + 22, 939, 112, 112, 112, 1, 112, 501, 406, 409, + 474, 474, 722, 722, 112, 707, 112, 112, 112, 359, + 360, 363, 583, 1062, 3, 1063, 112, 112, 707, 112, + 112, 112, 112, 112, 27, 13, 22, 1074, 749, 501, + 573, 27, 750, 501, 501, 501, 501, 15, 767, 867, + 899, 237, 899, 899, 899, 1064, 899, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 406, 409, 112, 112, 112, 16, 112, 112, 692, + 65, 112, 766, 766, 112, 112, 18, 112, 899, 112, + 29, 112, 327, 112, 112, 112, 112, 112, 112, 112, + 474, 112, 722, 112, 25, 351, 352, 751, 934, 866, + 351, 352, 866, 934, 866, 939, 112, 112, 112, 112, + 939, 112, 115, 112, 359, 360, 363, 583, 112, 115, + 115, 115, 112, 1064, 115, 115, 115, 1062, 115, 1063, + 573, 712, 1062, 749, 1063, 573, 115, 750, 115, 115, + 115, 1074, 752, 767, 867, 29, 1074, 327, 115, 115, + 238, 115, 115, 115, 115, 115, 692, 713, 19, 1064, + 690, 378, 766, 751, 1064, 19, 723, 29, 378, 327, + 836, 379, 723, 397, 19, 40, 397, 367, 379, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 92, 690, 115, 115, 115, 712, 115, + 115, 92, 751, 115, 836, 238, 115, 115, 752, 115, + 841, 115, 644, 115, 20, 115, 115, 115, 115, 115, + 115, 115, 240, 115, 713, 115, 44, 44, 332, 332, + 367, 647, 43, 712, 397, 397, 712, 367, 115, 115, + 115, 115, 367, 115, 464, 115, 367, 752, 41, 712, + 115, 464, 464, 464, 115, 769, 20, 464, 464, 713, + 464, 380, 713, 841, 367, 999, 769, 999, 380, 20, + 841, 381, 368, 644, 644, 713, 49, 240, 381, 841, + 464, 464, 644, 464, 464, 464, 464, 464, 382, 442, + 41, 383, 647, 647, 99, 382, 100, 841, 383, 769, + 769, 647, 393, 41, 44, 44, 332, 332, 101, 715, + 102, 464, 464, 464, 464, 464, 464, 464, 464, 464, + 464, 464, 464, 464, 464, 368, 42, 464, 464, 464, + 138, 464, 368, 769, 754, 464, 480, 368, 464, 219, + 683, 368, 684, 464, 442, 464, 395, 464, 464, 464, + 464, 464, 464, 464, 369, 464, 336, 464, 369, 368, + 384, 972, 715, 393, 393, 393, 400, 384, 42, 715, + 464, 464, 972, 464, 715, 464, 465, 803, 715, 403, + 458, 42, 464, 465, 465, 465, 464, 754, 486, 465, + 465, 480, 465, 385, 754, 683, 715, 684, 336, 754, + 385, 465, 239, 754, 241, 972, 972, 395, 395, 395, + 411, 336, 465, 465, 804, 465, 465, 465, 465, 465, + 486, 754, 458, 459, 486, 486, 386, 400, 400, 400, + 388, 825, 803, 386, 242, 458, 910, 388, 246, 972, + 403, 403, 403, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 465, 465, 465, 465, 465, 667, 280, 465, + 465, 465, 295, 465, 296, 459, 299, 465, 312, 804, + 465, 411, 411, 411, 314, 465, 315, 465, 459, 465, + 465, 465, 465, 465, 465, 465, 825, 465, 465, 465, + 391, 910, 391, 391, 391, 391, 391, 50, 562, 667, + 316, 562, 465, 465, 50, 465, 391, 465, 685, 17, + 17, 322, 667, 50, 465, 685, 685, 685, 465, 325, + 685, 685, 685, 563, 685, 140, 563, 326, 391, 391, + 140, 140, 502, 685, 685, 685, 685, 391, 391, 391, + 391, 5, 350, 350, 685, 685, 5, 685, 685, 685, + 685, 685, 1012, 331, 1012, 1012, 1012, 567, 1012, 618, + 567, 618, 618, 618, 502, 618, 333, 306, 502, 502, + 502, 502, 306, 391, 337, 685, 685, 685, 685, 685, + 685, 685, 685, 685, 685, 685, 685, 685, 685, 340, + 1012, 685, 685, 685, 236, 685, 685, 618, 346, 685, + 357, 236, 685, 685, 358, 685, 618, 685, 362, 685, + 236, 685, 685, 685, 685, 685, 685, 685, 356, 685, + 685, 685, 602, 356, 602, 602, 602, 602, 602, 47, + 47, 594, 594, 364, 685, 685, 685, 685, 602, 685, + 686, 685, 854, 737, 737, 854, 685, 686, 686, 686, + 685, 373, 686, 686, 686, 781, 686, 781, 781, 781, + 602, 781, 772, 772, 47, 47, 686, 686, 686, 602, + 602, 602, 602, 1033, 1033, 399, 686, 686, 319, 686, + 686, 686, 686, 686, 1013, 319, 1013, 1013, 1013, 1004, + 1013, 760, 1004, 781, 319, 898, 760, 898, 898, 898, + 402, 898, 781, 405, 408, 602, 431, 686, 686, 686, + 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, + 686, 871, 1013, 686, 686, 686, 871, 686, 686, 434, + 436, 686, 439, 898, 686, 686, 453, 686, 456, 686, + 457, 686, 898, 686, 686, 686, 686, 686, 686, 686, + 876, 686, 466, 686, 763, 876, 763, 763, 763, 763, + 763, 487, 476, 488, 489, 490, 686, 686, 686, 686, + 763, 686, 805, 686, 491, 507, 514, 518, 686, 805, + 805, 805, 686, 320, 321, 805, 805, 533, 805, 506, + 320, 321, 763, 487, 534, 535, 538, 487, 487, 320, + 321, 763, 763, 763, 763, 506, 506, 540, 805, 805, + 545, 805, 805, 805, 805, 805, 9, 9, 9, 9, + 9, 506, 323, 506, 548, 506, 506, 506, 506, 323, + 557, 506, 558, 506, 559, 564, 565, 763, 323, 805, + 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, + 805, 805, 805, 338, 361, 805, 805, 805, 371, 805, + 338, 361, 568, 805, 570, 371, 805, 574, 575, 338, + 361, 805, 576, 805, 371, 805, 805, 805, 805, 805, + 805, 805, 577, 805, 764, 805, 764, 764, 764, 764, + 764, 785, 596, 785, 785, 785, 604, 785, 805, 805, + 764, 805, 605, 805, 806, 607, 608, 609, 441, 544, + 805, 806, 806, 806, 805, 441, 544, 806, 806, 554, + 806, 586, 764, 985, 441, 544, 617, 625, 586, 806, + 985, 764, 764, 764, 764, 554, 554, 586, 629, 985, + 806, 806, 632, 806, 806, 806, 806, 806, 651, 654, + 660, 554, 716, 554, 668, 554, 554, 554, 554, 716, + 673, 554, 679, 554, 716, 687, 688, 764, 716, 691, + 695, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 755, 697, 806, 806, 806, + 699, 806, 755, 701, 709, 806, 711, 755, 806, 714, + 717, 755, 492, 806, 718, 806, 721, 806, 806, 806, + 806, 806, 806, 806, 739, 806, 806, 806, 492, 492, + 955, 990, 955, 955, 955, 745, 955, 748, 990, 757, + 806, 806, 761, 806, 492, 806, 492, 990, 492, 492, + 492, 492, 806, 768, 783, 784, 806, 2, 2, 2, + 2, 2, 2, 786, 798, 991, 2, 2, 800, 802, + 810, 2, 991, 2, 2, 2, 2, 2, 2, 2, + 834, 991, 840, 850, 851, 2, 2, 2, 2, 2, + 2, 2, 791, 791, 2, 855, 791, 791, 791, 446, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 861, 2, 2, 2, 868, 2, 2, 870, + 2, 2, 2, 446, 446, 446, 446, 446, 446, 446, + 446, 446, 446, 446, 992, 446, 446, 994, 874, 446, + 446, 992, 2, 875, 994, 2, 882, 883, 2, 2, + 992, 884, 2, 994, 2, 446, 888, 446, 2, 446, + 446, 446, 446, 446, 446, 446, 2, 446, 889, 891, + 1024, 2, 2, 2, 2, 2, 2, 1024, 892, 894, + 2, 2, 897, 446, 907, 446, 1024, 1032, 2, 909, + 916, 2, 2, 2, 1032, 2, 2, 36, 36, 36, + 36, 36, 36, 1032, 917, 919, 36, 36, 920, 921, + 923, 36, 924, 36, 36, 36, 36, 36, 36, 36, + 310, 310, 310, 310, 310, 36, 36, 36, 36, 36, + 36, 36, 925, 952, 36, 953, 954, 969, 970, 452, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 983, 36, 36, 36, 986, 36, 36, 988, + 36, 36, 36, 452, 452, 452, 452, 452, 452, 452, + 452, 452, 452, 452, 1065, 452, 452, 993, 1000, 452, + 452, 1065, 36, 1008, 1009, 36, 1065, 1010, 36, 36, + 1065, 1011, 36, 1014, 36, 452, 1017, 452, 36, 452, + 452, 452, 452, 452, 452, 452, 36, 452, 1018, 1019, + 1020, 36, 36, 36, 36, 36, 36, 1022, 1028, 1039, + 36, 36, 1047, 452, 1058, 1059, 1061, 1069, 36, 1070, + 1071, 36, 36, 36, 1072, 36, 36, 221, 221, 221, + 221, 221, 221, 1073, 1081, nil, 221, 221, nil, nil, + nil, 221, nil, 221, 221, 221, 221, 221, 221, 221, + 345, 345, 345, 345, 345, 221, 221, 221, 221, 221, + 221, 221, nil, 1041, 221, 1041, 1041, 1041, nil, 1041, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, nil, 221, 221, 221, nil, 221, 221, nil, + 221, 221, 221, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, nil, 24, 24, nil, nil, 24, + 24, nil, 221, nil, nil, 221, nil, nil, 221, 221, + nil, nil, 221, nil, 221, 24, nil, 24, 221, 24, + 24, 24, 24, 24, 24, 24, 221, 24, nil, nil, + nil, 221, 221, 221, 221, 221, 221, nil, nil, nil, + 221, 221, nil, 24, nil, nil, nil, nil, 221, nil, + nil, 221, 221, 221, nil, 221, 221, 245, 245, 245, + 245, 245, 245, nil, nil, nil, 245, 245, nil, nil, + nil, 245, nil, 245, 245, 245, 245, 245, 245, 245, + 532, 532, 532, 532, 532, 245, 245, 245, 245, 245, + 245, 245, nil, nil, 245, nil, nil, nil, nil, nil, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, nil, 245, 245, 245, nil, 245, 245, nil, + 245, 245, 245, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, nil, 293, 293, nil, nil, 293, + 293, nil, 245, nil, nil, 245, nil, nil, 245, 245, + nil, nil, 245, nil, 245, 293, nil, 293, 245, 293, + 293, 293, 293, 293, 293, 293, 245, 293, nil, nil, + nil, 245, 245, 245, 245, 245, 245, nil, nil, nil, + 245, 245, nil, 293, nil, nil, nil, nil, 245, nil, + nil, 245, 245, 245, nil, 245, 245, 313, 313, 313, + 313, 313, 313, nil, nil, nil, 313, 313, nil, nil, + nil, 313, nil, 313, 313, 313, 313, 313, 313, 313, + nil, nil, nil, nil, nil, 313, 313, 313, 313, 313, + 313, 313, nil, nil, 313, nil, nil, nil, nil, nil, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, nil, 313, 313, 313, nil, 313, 313, nil, + 313, 313, 313, 505, 505, 505, 505, 505, 505, 505, + 505, 505, 505, 505, nil, 505, 505, nil, nil, 505, + 505, nil, 313, nil, nil, 313, nil, nil, 313, 313, + nil, nil, 313, nil, 313, 505, nil, 505, 313, 505, + 505, 505, 505, 505, 505, 505, 313, 505, nil, nil, + nil, 313, 313, 313, 313, 313, 313, nil, nil, nil, + 313, 313, 505, 505, nil, nil, nil, nil, 313, nil, + nil, 313, 313, 313, nil, 313, 313, 318, 318, 318, + 318, 318, 318, nil, nil, nil, 318, 318, nil, nil, + nil, 318, nil, 318, 318, 318, 318, 318, 318, 318, + nil, nil, nil, nil, nil, 318, 318, 318, 318, 318, + 318, 318, nil, nil, 318, nil, nil, nil, nil, nil, + 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, + 318, 318, nil, 318, 318, 318, nil, 318, 318, nil, + 318, 318, 318, 555, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, nil, 555, 555, nil, nil, 555, + 555, nil, 318, nil, nil, 318, nil, nil, 318, 318, + nil, nil, 318, nil, 318, 555, nil, 555, 318, 555, + 555, 555, 555, 555, 555, 555, 318, 555, nil, nil, + nil, 318, 318, 318, 318, 318, 318, nil, nil, nil, + 318, 318, nil, 555, nil, nil, nil, nil, 318, nil, + nil, 318, 318, 318, nil, 318, 318, 344, 344, 344, + 344, 344, 344, nil, nil, nil, 344, 344, nil, nil, + nil, 344, nil, 344, 344, 344, 344, 344, 344, 344, + nil, nil, nil, nil, nil, 344, 344, 344, 344, 344, + 344, 344, nil, nil, 344, nil, nil, nil, nil, nil, + 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, + 344, 344, nil, 344, 344, 344, nil, 344, 344, nil, + 344, 344, 344, 807, 807, 807, 807, 807, 807, 807, + 807, 807, 807, 807, nil, 807, 807, nil, nil, 807, + 807, nil, 344, nil, nil, 344, nil, nil, 344, 344, + nil, nil, 344, nil, 344, 807, nil, 807, 344, 807, + 807, 807, 807, 807, 807, 807, 344, 807, nil, nil, + nil, 344, 344, 344, 344, 344, 344, nil, nil, nil, + 344, 344, nil, 807, nil, nil, nil, nil, 344, nil, + nil, 344, 344, 344, nil, 344, 344, 354, 354, 354, + 354, 354, 354, nil, nil, nil, 354, 354, nil, nil, + nil, 354, nil, 354, 354, 354, 354, 354, 354, 354, + nil, nil, nil, nil, nil, 354, 354, 354, 354, 354, + 354, 354, nil, nil, 354, nil, nil, nil, nil, nil, + 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, + 354, 354, nil, 354, 354, 354, nil, 354, 354, nil, + 354, 354, 354, 915, 915, 915, 915, 915, 915, 915, + 915, 915, 915, 915, nil, 915, 915, nil, nil, 915, + 915, nil, 354, nil, nil, 354, nil, nil, 354, 354, + nil, nil, 354, nil, 354, 915, nil, 915, 354, 915, + 915, 915, 915, 915, 915, 915, 354, 915, nil, nil, + nil, 354, 354, 354, 354, 354, 354, nil, nil, nil, + 354, 354, nil, 915, nil, nil, nil, nil, 354, nil, + nil, 354, 354, 354, nil, 354, 354, 355, 355, 355, + 355, 355, 355, nil, nil, nil, 355, 355, nil, nil, + nil, 355, nil, 355, 355, 355, 355, 355, 355, 355, + nil, nil, nil, nil, nil, 355, 355, 355, 355, 355, + 355, 355, nil, nil, 355, nil, nil, nil, nil, nil, + 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, nil, 355, 355, 355, nil, 355, 355, nil, + 355, 355, 355, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, nil, 484, 484, nil, nil, 484, + 484, nil, 355, nil, nil, 355, nil, nil, 355, 355, + nil, nil, 355, nil, 355, 484, nil, 484, 355, 484, + 484, 484, 484, 484, 484, 484, 355, 484, nil, nil, + nil, 355, 355, 355, 355, 355, 355, nil, nil, nil, + 355, 355, nil, nil, nil, nil, nil, nil, 355, nil, + nil, 355, 355, 355, nil, 355, 355, 569, 569, 569, + 569, 569, 569, nil, nil, nil, 569, 569, nil, nil, + nil, 569, nil, 569, 569, 569, 569, 569, 569, 569, + nil, nil, nil, nil, nil, 569, 569, 569, 569, 569, + 569, 569, nil, nil, 569, nil, nil, nil, nil, nil, + 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, + 569, 569, nil, 569, 569, 569, nil, 569, 569, nil, + 569, 569, 569, 485, 485, 485, 485, 485, 485, 485, + 485, 485, 485, 485, nil, 485, 485, nil, nil, 485, + 485, nil, 569, nil, nil, 569, nil, nil, 569, 569, + nil, nil, 569, nil, 569, 485, nil, 485, 569, 485, + 485, 485, 485, 485, 485, 485, 569, 485, nil, nil, + nil, 569, 569, 569, 569, 569, 569, nil, nil, nil, + 569, 569, nil, nil, nil, nil, nil, nil, 569, nil, + nil, 569, 569, 569, nil, 569, 569, 572, 572, 572, + 572, 572, 572, nil, nil, nil, 572, 572, nil, nil, + nil, 572, nil, 572, 572, 572, 572, 572, 572, 572, + nil, nil, nil, nil, nil, 572, 572, 572, 572, 572, + 572, 572, nil, nil, 572, nil, nil, nil, nil, nil, + 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, nil, 572, 572, 572, nil, 572, 572, nil, + 572, 572, 572, 495, 495, 495, 495, 495, 495, 495, + nil, nil, 495, 495, nil, nil, nil, nil, nil, 495, + 495, nil, 572, nil, nil, 572, nil, nil, 572, 572, + nil, nil, 572, nil, 572, 495, nil, 495, 572, 495, + 495, 495, 495, 495, 495, 495, 572, 495, nil, nil, + nil, 572, 572, 572, 572, 572, 572, nil, nil, nil, + 572, 572, nil, nil, nil, nil, nil, nil, 572, nil, + nil, 572, 572, 572, nil, 572, 572, 595, 595, 595, + 595, 595, 595, nil, nil, nil, 595, 595, nil, nil, + nil, 595, nil, 595, 595, 595, 595, 595, 595, 595, + nil, nil, nil, nil, nil, 595, 595, 595, 595, 595, + 595, 595, nil, nil, 595, nil, nil, nil, nil, nil, + 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, + 595, 595, nil, 595, 595, 595, nil, 595, 595, nil, + 595, 595, 595, 496, 496, 496, 496, 496, 496, 496, + nil, nil, 496, 496, nil, nil, nil, nil, nil, 496, + 496, nil, 595, nil, nil, 595, nil, nil, 595, 595, + nil, nil, 595, nil, 595, 496, nil, 496, 595, 496, + 496, 496, 496, 496, 496, 496, 595, 496, nil, nil, + nil, 595, 595, 595, 595, 595, 595, nil, nil, nil, + 595, 595, nil, nil, nil, nil, nil, nil, 595, nil, + nil, 595, 595, 595, nil, 595, 595, 656, 656, 656, + 656, 656, 656, nil, nil, nil, 656, 656, nil, nil, + nil, 656, nil, 656, 656, 656, 656, 656, 656, 656, + nil, nil, nil, nil, nil, 656, 656, 656, 656, 656, + 656, 656, nil, nil, 656, nil, nil, nil, nil, nil, + 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, nil, 656, 656, 656, nil, 656, 656, nil, + 656, 656, 656, 497, 497, 497, 497, 497, 497, 497, + nil, nil, 497, 497, nil, nil, nil, nil, nil, 497, + 497, nil, 656, nil, nil, 656, nil, nil, 656, 656, + nil, nil, 656, nil, 656, 497, nil, 497, 656, 497, + 497, 497, 497, 497, 497, 497, 656, 497, nil, nil, + nil, 656, 656, 656, 656, 656, 656, nil, nil, nil, + 656, 656, nil, nil, nil, nil, nil, nil, 656, nil, + nil, 656, 656, 656, nil, 656, 656, 753, 753, 753, + 753, 753, 753, nil, nil, nil, 753, 753, nil, nil, + nil, 753, nil, 753, 753, 753, 753, 753, 753, 753, + nil, nil, nil, nil, nil, 753, 753, 753, 753, 753, + 753, 753, nil, nil, 753, nil, nil, nil, nil, nil, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, + 753, 753, nil, 753, 753, 753, nil, 753, 753, nil, + 753, 753, 753, 498, 498, 498, 498, 498, 498, 498, + nil, nil, 498, 498, nil, nil, nil, nil, nil, 498, + 498, nil, 753, nil, nil, 753, nil, nil, 753, 753, + nil, nil, 753, nil, 753, 498, nil, 498, 753, 498, + 498, 498, 498, 498, 498, 498, 753, 498, nil, nil, + nil, 753, 753, 753, 753, 753, 753, nil, nil, nil, + 753, 753, nil, nil, nil, nil, nil, nil, 753, nil, + nil, 753, 753, 753, nil, 753, 753, 758, 758, 758, + 758, 758, 758, nil, nil, nil, 758, 758, nil, nil, + nil, 758, nil, 758, 758, 758, 758, 758, 758, 758, + nil, nil, nil, nil, nil, 758, 758, 758, 758, 758, + 758, 758, nil, nil, 758, nil, nil, nil, nil, nil, + 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, + 758, 758, nil, 758, 758, 758, nil, 758, 758, nil, + 758, 758, 758, 499, 499, 499, 499, 499, 499, 499, + nil, nil, 499, 499, nil, nil, nil, nil, nil, 499, + 499, nil, 758, nil, nil, 758, nil, nil, 758, 758, + nil, nil, 758, nil, 758, 499, nil, 499, 758, 499, + 499, 499, 499, 499, 499, 499, 758, 499, nil, nil, + nil, 758, 758, 758, 758, 758, 758, nil, nil, nil, + 758, 758, nil, nil, nil, nil, nil, nil, 758, nil, + nil, 758, 758, 758, nil, 758, 758, 762, 762, 762, + 762, 762, 762, nil, nil, nil, 762, 762, nil, nil, + nil, 762, nil, 762, 762, 762, 762, 762, 762, 762, + nil, nil, nil, nil, nil, 762, 762, 762, 762, 762, + 762, 762, nil, nil, 762, nil, nil, nil, nil, nil, + 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, + 762, 762, nil, 762, 762, 762, nil, 762, 762, nil, + 762, 762, 762, 500, 500, 500, 500, 500, 500, 500, + nil, nil, 500, 500, nil, nil, nil, nil, nil, 500, + 500, nil, 762, nil, nil, 762, nil, nil, 762, 762, + nil, nil, 762, nil, 762, 500, nil, 500, 762, 500, + 500, 500, 500, 500, 500, 500, 762, 500, nil, nil, + nil, 762, 762, 762, 762, 762, 762, nil, nil, nil, + 762, 762, nil, nil, nil, nil, nil, nil, 762, nil, + nil, 762, 762, 762, nil, 762, 762, 792, 792, 792, + 792, 792, 792, nil, nil, nil, 792, 792, nil, nil, + nil, 792, nil, 792, 792, 792, 792, 792, 792, 792, + nil, nil, nil, nil, nil, 792, 792, 792, 792, 792, + 792, 792, nil, nil, 792, nil, nil, nil, nil, nil, + 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, + 792, 792, nil, 792, 792, 792, nil, 792, 792, nil, + 792, 792, 792, 503, 503, 503, 503, 503, 503, 503, + nil, nil, 503, 503, nil, nil, nil, nil, nil, 503, + 503, nil, 792, nil, nil, 792, nil, nil, 792, 792, + nil, nil, 792, nil, 792, 503, nil, 503, 792, 503, + 503, 503, 503, 503, 503, 503, 792, 503, nil, nil, + nil, 792, 792, 792, 792, 792, 792, nil, nil, nil, + 792, 792, nil, nil, nil, nil, nil, nil, 792, nil, + nil, 792, 792, 792, nil, 792, 792, 831, 831, 831, + 831, 831, 831, nil, nil, nil, 831, 831, nil, nil, + nil, 831, nil, 831, 831, 831, 831, 831, 831, 831, + nil, nil, nil, nil, nil, 831, 831, 831, 831, 831, + 831, 831, nil, nil, 831, nil, nil, nil, nil, nil, + 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, + 831, 831, nil, 831, 831, 831, nil, 831, 831, nil, + 831, 831, 831, 504, 504, 504, 504, 504, 504, 504, + 504, nil, 504, 504, nil, nil, nil, nil, nil, 504, + 504, nil, 831, nil, nil, 831, nil, nil, 831, 831, + nil, nil, 831, nil, 831, 504, nil, 504, 831, 504, + 504, 504, 504, 504, 504, 504, 831, 504, nil, nil, + nil, 831, 831, 831, 831, 831, 831, nil, nil, nil, + 831, 831, nil, nil, nil, nil, nil, nil, 831, nil, + nil, 831, 831, 831, nil, 831, 831, 848, 848, 848, + 848, 848, 848, nil, nil, nil, 848, 848, nil, nil, + nil, 848, nil, 848, 848, 848, 848, 848, 848, 848, + nil, nil, nil, nil, nil, 848, 848, 848, 848, 848, + 848, 848, nil, nil, 848, nil, nil, nil, nil, nil, + 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, + 848, 848, nil, 848, 848, 848, nil, 848, 848, nil, + 848, 848, 848, 493, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 493, + 493, nil, 848, nil, nil, 848, nil, 494, 848, 848, + nil, nil, 848, nil, 848, 493, nil, 493, 848, 493, + 493, 493, 493, 494, 494, nil, 848, nil, nil, nil, + nil, 848, 848, 848, 848, 848, 848, nil, nil, 494, + 848, 848, nil, 494, 494, 494, 494, nil, 848, nil, + nil, 848, 848, 848, nil, 848, 848, 860, 860, 860, + 860, 860, 860, nil, nil, nil, 860, 860, nil, nil, + nil, 860, nil, 860, 860, 860, 860, 860, 860, 860, + nil, nil, nil, nil, nil, 860, 860, 860, 860, 860, + 860, 860, nil, nil, 860, nil, nil, nil, nil, nil, + 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, + 860, 860, nil, 860, 860, 860, nil, 860, 860, nil, + 860, 860, 860, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 860, nil, nil, 860, nil, nil, 860, 860, + nil, nil, 860, nil, 860, nil, nil, nil, 860, nil, + nil, nil, nil, nil, nil, nil, 860, nil, nil, nil, + nil, 860, 860, 860, 860, 860, 860, nil, nil, nil, + 860, 860, nil, nil, nil, nil, nil, nil, 860, nil, + nil, 860, 860, 860, nil, 860, 860, 880, 880, 880, + 880, 880, 880, nil, nil, nil, 880, 880, nil, nil, + nil, 880, nil, 880, 880, 880, 880, 880, 880, 880, + nil, nil, nil, nil, nil, 880, 880, 880, 880, 880, + 880, 880, nil, nil, 880, nil, nil, nil, nil, nil, + 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, + 880, 880, nil, 880, 880, 880, nil, 880, 880, nil, + 880, 880, 880, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 880, nil, nil, 880, nil, nil, 880, 880, + nil, nil, 880, nil, 880, nil, nil, nil, 880, nil, + nil, nil, nil, nil, nil, nil, 880, nil, nil, nil, + nil, 880, 880, 880, 880, 880, 880, nil, nil, nil, + 880, 880, nil, nil, nil, nil, nil, nil, 880, nil, + nil, 880, 880, 880, nil, 880, 880, 881, 881, 881, + 881, 881, 881, nil, nil, nil, 881, 881, nil, nil, + nil, 881, nil, 881, 881, 881, 881, 881, 881, 881, + nil, nil, nil, nil, nil, 881, 881, 881, 881, 881, + 881, 881, nil, nil, 881, nil, nil, nil, nil, nil, + 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, + 881, 881, nil, 881, 881, 881, nil, 881, 881, nil, + 881, 881, 881, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 881, nil, nil, 881, nil, nil, 881, 881, + nil, nil, 881, nil, 881, nil, nil, nil, 881, nil, + nil, nil, nil, nil, nil, nil, 881, nil, nil, nil, + nil, 881, 881, 881, 881, 881, 881, nil, nil, nil, + 881, 881, nil, nil, nil, nil, nil, nil, 881, nil, + nil, 881, 881, 881, nil, 881, 881, 931, 931, 931, + 931, 931, 931, nil, nil, nil, 931, 931, nil, nil, + nil, 931, nil, 931, 931, 931, 931, 931, 931, 931, + nil, nil, nil, nil, nil, 931, 931, 931, 931, 931, + 931, 931, nil, nil, 931, nil, nil, nil, nil, nil, + 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, + 931, 931, nil, 931, 931, 931, nil, 931, 931, nil, + 931, 931, 931, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 931, nil, nil, 931, nil, nil, 931, 931, + nil, nil, 931, nil, 931, nil, nil, nil, 931, nil, + nil, nil, nil, nil, nil, nil, 931, nil, nil, nil, + nil, 931, 931, 931, 931, 931, 931, nil, nil, nil, + 931, 931, nil, nil, nil, nil, nil, nil, 931, nil, + nil, 931, 931, 931, nil, 931, 931, 932, 932, 932, + 932, 932, 932, nil, nil, nil, 932, 932, nil, nil, + nil, 932, nil, 932, 932, 932, 932, 932, 932, 932, + nil, nil, nil, nil, nil, 932, 932, 932, 932, 932, + 932, 932, nil, nil, 932, nil, nil, nil, nil, nil, + 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, + 932, 932, nil, 932, 932, 932, nil, 932, 932, nil, + 932, 932, 932, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 932, nil, nil, 932, nil, nil, 932, 932, + nil, nil, 932, nil, 932, nil, nil, nil, 932, nil, + nil, nil, nil, nil, nil, nil, 932, nil, nil, nil, + nil, 932, 932, 932, 932, 932, 932, nil, nil, nil, + 932, 932, nil, nil, nil, nil, nil, nil, 932, nil, + nil, 932, 932, 932, nil, 932, 932, 944, 944, 944, + 944, 944, 944, nil, nil, nil, 944, 944, nil, nil, + nil, 944, nil, 944, 944, 944, 944, 944, 944, 944, + nil, nil, nil, nil, nil, 944, 944, 944, 944, 944, + 944, 944, nil, nil, 944, nil, nil, nil, nil, nil, + 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, + 944, 944, nil, 944, 944, 944, nil, 944, 944, nil, + 944, 944, 944, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 944, nil, nil, 944, nil, nil, 944, 944, + nil, nil, 944, nil, 944, nil, nil, nil, 944, nil, + nil, nil, nil, nil, nil, nil, 944, nil, nil, nil, + nil, 944, 944, 944, 944, 944, 944, nil, nil, nil, + 944, 944, nil, nil, nil, nil, nil, nil, 944, nil, + nil, 944, 944, 944, nil, 944, 944, 948, 948, 948, + 948, 948, 948, nil, nil, nil, 948, 948, nil, nil, + nil, 948, nil, 948, 948, 948, 948, 948, 948, 948, + nil, nil, nil, nil, nil, 948, 948, 948, 948, 948, + 948, 948, nil, nil, 948, nil, nil, nil, nil, nil, + 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, nil, 948, 948, 948, nil, 948, 948, nil, + 948, 948, 948, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 948, nil, nil, 948, nil, nil, 948, 948, + nil, nil, 948, nil, 948, nil, nil, nil, 948, nil, + nil, nil, nil, nil, nil, nil, 948, nil, nil, nil, + nil, 948, 948, 948, 948, 948, 948, nil, nil, nil, + 948, 948, nil, nil, nil, nil, nil, nil, 948, nil, + nil, 948, 948, 948, nil, 948, 948, 989, 989, 989, + 989, 989, 989, nil, nil, nil, 989, 989, nil, nil, + nil, 989, nil, 989, 989, 989, 989, 989, 989, 989, + nil, nil, nil, nil, nil, 989, 989, 989, 989, 989, + 989, 989, nil, nil, 989, nil, nil, nil, nil, nil, + 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, + 989, 989, nil, 989, 989, 989, nil, 989, 989, nil, + 989, 989, 989, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 989, nil, nil, 989, nil, nil, 989, 989, + nil, nil, 989, nil, 989, nil, nil, nil, 989, nil, + nil, nil, nil, nil, nil, nil, 989, nil, nil, nil, + nil, 989, 989, 989, 989, 989, 989, nil, nil, nil, + 989, 989, nil, nil, nil, nil, nil, nil, 989, nil, + nil, 989, 989, 989, nil, 989, 989, 996, 996, 996, + 996, 996, 996, nil, nil, nil, 996, 996, nil, nil, + nil, 996, nil, 996, 996, 996, 996, 996, 996, 996, + nil, nil, nil, nil, nil, 996, 996, 996, 996, 996, + 996, 996, nil, nil, 996, nil, nil, nil, nil, nil, + 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, + 996, 996, nil, 996, 996, 996, nil, 996, 996, nil, + 996, 996, 996, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 996, nil, nil, 996, nil, nil, 996, 996, + nil, nil, 996, nil, 996, nil, nil, nil, 996, nil, + nil, nil, nil, nil, nil, nil, 996, nil, nil, nil, + nil, 996, 996, 996, 996, 996, 996, nil, nil, nil, + 996, 996, nil, nil, nil, nil, nil, nil, 996, nil, + nil, 996, 996, 996, nil, 996, 996, 1001, 1001, 1001, + 1001, 1001, 1001, nil, nil, nil, 1001, 1001, nil, nil, + nil, 1001, nil, 1001, 1001, 1001, 1001, 1001, 1001, 1001, + nil, nil, nil, nil, nil, 1001, 1001, 1001, 1001, 1001, + 1001, 1001, nil, nil, 1001, nil, nil, nil, nil, nil, + 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, + 1001, 1001, nil, 1001, 1001, 1001, nil, 1001, 1001, nil, + 1001, 1001, 1001, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1001, nil, nil, 1001, nil, nil, 1001, 1001, + nil, nil, 1001, nil, 1001, nil, nil, nil, 1001, nil, + nil, nil, nil, nil, nil, nil, 1001, nil, nil, nil, + nil, 1001, 1001, 1001, 1001, 1001, 1001, nil, nil, nil, + 1001, 1001, nil, nil, nil, nil, nil, nil, 1001, nil, + nil, 1001, 1001, 1001, nil, 1001, 1001, 8, 8, 8, + 8, 8, nil, nil, nil, 8, 8, nil, nil, nil, + 8, nil, 8, 8, 8, 8, 8, 8, 8, nil, + nil, nil, nil, nil, 8, 8, 8, 8, 8, 8, + 8, nil, nil, 8, nil, nil, nil, nil, nil, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, nil, 8, 8, 8, nil, 8, 8, nil, 8, + 8, 8, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 8, nil, nil, 8, nil, nil, 8, 8, nil, + nil, 8, nil, 8, nil, nil, nil, 8, nil, nil, + nil, nil, nil, nil, nil, 8, nil, nil, nil, nil, + 8, 8, 8, 8, 8, 8, nil, nil, nil, 8, + 8, nil, nil, nil, nil, nil, nil, 8, nil, nil, + 8, 8, 8, nil, 8, 8, 23, 23, 23, nil, + 23, nil, nil, nil, 23, 23, nil, nil, nil, 23, + nil, 23, 23, 23, 23, 23, 23, 23, nil, nil, + nil, nil, nil, 23, 23, 23, 23, 23, 23, 23, + nil, nil, 23, nil, nil, nil, nil, nil, nil, 23, + nil, nil, 23, 23, 23, 23, 23, 23, 23, 23, + nil, 23, 23, 23, nil, 23, 23, nil, 23, 23, + 23, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, 23, nil, nil, 23, 23, nil, 777, + 23, 777, 777, 777, 777, 777, 23, nil, nil, nil, + nil, nil, nil, nil, 23, 777, nil, nil, nil, 23, + 23, 23, 23, 23, 23, nil, nil, nil, 23, 23, + nil, nil, nil, nil, nil, nil, 23, 777, 30, 23, + 23, 23, nil, 23, 23, 30, 30, 30, 777, 777, + 30, 30, 30, 773, 30, 773, 773, 773, 773, 773, + nil, nil, nil, 30, 30, 30, nil, nil, nil, 773, + nil, nil, nil, nil, 30, 30, nil, 30, 30, 30, + 30, 30, 777, nil, nil, nil, nil, nil, nil, nil, + nil, 773, nil, nil, nil, nil, nil, nil, nil, nil, + 773, 773, 773, 773, nil, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, nil, + nil, 30, 30, 30, nil, nil, 30, nil, 30, 30, + nil, nil, 30, 30, nil, 30, 773, 30, nil, 30, + nil, 30, 30, 30, 30, 30, 30, 30, nil, 30, + 30, 30, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 30, 30, 31, 30, nil, 30, + nil, nil, nil, 31, 31, 31, 30, nil, 31, 31, + 31, 775, 31, 775, 775, 775, 775, 775, nil, nil, + nil, nil, 31, 31, nil, nil, nil, 775, nil, nil, + nil, nil, 31, 31, nil, 31, 31, 31, 31, 31, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 775, + nil, nil, nil, nil, nil, nil, nil, nil, 775, 775, + 775, 775, nil, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, nil, nil, 31, + 31, 31, nil, nil, 31, nil, 31, 31, nil, nil, + 31, 31, nil, 31, 775, 31, nil, 31, nil, 31, + 31, 31, 31, 31, 31, 31, nil, 31, nil, 31, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 31, 31, nil, 31, nil, 31, 32, 32, + 32, nil, 32, nil, 31, nil, 32, 32, nil, nil, + nil, 32, nil, 32, 32, 32, 32, 32, 32, 32, + nil, nil, nil, nil, nil, 32, 32, 32, 32, 32, + 32, 32, nil, nil, 32, nil, nil, nil, nil, nil, + nil, 32, nil, nil, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, nil, 32, 32, nil, + 32, 32, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, 32, nil, nil, 32, 32, + nil, nil, 32, nil, 32, nil, 32, nil, 32, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, 32, 32, 32, 32, 32, 32, nil, nil, nil, + 32, 32, nil, nil, nil, nil, nil, nil, 32, nil, + 32, 32, 32, 32, nil, 32, 32, 33, 33, 33, + nil, 33, nil, nil, nil, 33, 33, nil, nil, nil, + 33, nil, 33, 33, 33, 33, 33, 33, 33, nil, + nil, nil, nil, nil, 33, 33, 33, 33, 33, 33, + 33, nil, nil, 33, nil, nil, nil, nil, nil, nil, + 33, nil, nil, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, nil, 33, 33, nil, 33, + 33, 33, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 33, nil, nil, 33, nil, nil, 33, 33, nil, + nil, 33, nil, 33, nil, 33, nil, 33, nil, nil, + nil, nil, nil, nil, nil, 33, nil, nil, nil, nil, + 33, 33, 33, 33, 33, 33, nil, nil, nil, 33, + 33, nil, nil, nil, nil, nil, nil, 33, nil, 33, + 33, 33, 33, nil, 33, 33, 34, 34, 34, nil, + 34, nil, nil, nil, 34, 34, nil, nil, nil, 34, + nil, 34, 34, 34, 34, 34, 34, 34, nil, nil, + nil, nil, nil, 34, 34, 34, 34, 34, 34, 34, + nil, nil, 34, nil, nil, nil, nil, nil, nil, 34, + nil, nil, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, nil, 34, 34, nil, 34, 34, + 34, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, 34, nil, nil, 34, 34, nil, nil, + 34, nil, 34, nil, 34, nil, 34, nil, nil, nil, + nil, nil, nil, nil, 34, nil, nil, nil, nil, 34, + 34, 34, 34, 34, 34, nil, nil, nil, 34, 34, + nil, nil, nil, nil, nil, nil, 34, nil, 34, 34, + 34, 34, nil, 34, 34, 37, 37, 37, nil, 37, + nil, nil, nil, 37, 37, nil, nil, nil, 37, nil, + 37, 37, 37, 37, 37, 37, 37, nil, nil, nil, + nil, nil, 37, 37, 37, 37, 37, 37, 37, nil, + nil, 37, nil, nil, nil, nil, nil, nil, 37, nil, + nil, 37, 37, 37, 37, 37, 37, 37, 37, nil, + 37, 37, 37, nil, 37, 37, nil, nil, nil, 37, + nil, nil, nil, nil, nil, 960, nil, 960, 960, 960, + 960, 960, nil, nil, nil, nil, nil, nil, nil, 37, + nil, 960, 37, nil, nil, 37, 37, nil, nil, 37, + nil, 37, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 960, nil, nil, nil, nil, 37, 37, + 37, 37, 37, 37, 960, 960, nil, 37, 37, nil, + nil, nil, nil, nil, nil, 37, nil, nil, 37, 37, + 37, nil, 37, 37, 38, 38, 38, nil, 38, nil, + nil, nil, 38, 38, nil, nil, nil, 38, 960, 38, + 38, 38, 38, 38, 38, 38, nil, nil, nil, nil, + nil, 38, 38, 38, 38, 38, 38, 38, nil, nil, + 38, nil, nil, nil, nil, nil, nil, 38, nil, nil, + 38, 38, 38, 38, 38, 38, 38, 38, nil, 38, + 38, 38, nil, 38, 38, nil, nil, nil, 38, nil, + nil, nil, nil, nil, 962, nil, 962, 962, 962, 962, + 962, nil, nil, nil, nil, nil, nil, nil, 38, nil, + 962, 38, nil, nil, 38, 38, nil, nil, 38, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 962, nil, nil, nil, nil, 38, 38, 38, + 38, 38, 38, 962, 962, nil, 38, 38, nil, nil, + nil, 38, nil, nil, 38, nil, nil, 38, 38, 38, + nil, 38, 38, 45, 45, 45, nil, 45, nil, nil, + nil, 45, 45, nil, nil, nil, 45, 962, 45, 45, + 45, 45, 45, 45, 45, nil, nil, nil, nil, nil, + 45, 45, 45, 45, 45, 45, 45, nil, nil, 45, + nil, nil, nil, nil, nil, nil, 45, nil, nil, 45, + 45, 45, 45, 45, 45, 45, 45, nil, 45, 45, + 45, nil, 45, 45, nil, 45, 45, 45, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 45, nil, nil, + 45, nil, nil, 45, 45, nil, nil, 45, nil, nil, + nil, nil, nil, 45, nil, nil, nil, nil, nil, nil, + nil, 45, nil, nil, nil, nil, 45, 45, 45, 45, + 45, 45, nil, nil, nil, 45, 45, nil, nil, nil, + nil, nil, nil, 45, nil, nil, 45, 45, 45, nil, + 45, 45, 46, 46, 46, nil, 46, nil, nil, nil, + 46, 46, nil, nil, nil, 46, nil, 46, 46, 46, + 46, 46, 46, 46, nil, nil, nil, nil, nil, 46, + 46, 46, 46, 46, 46, 46, nil, nil, 46, nil, + nil, nil, nil, nil, nil, 46, nil, nil, 46, 46, + 46, 46, 46, 46, 46, 46, nil, 46, 46, 46, + nil, 46, 46, nil, 46, 46, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 46, nil, nil, 46, + nil, nil, 46, 46, nil, nil, 46, nil, nil, nil, + nil, nil, 46, nil, nil, nil, nil, nil, nil, nil, + 46, nil, nil, nil, nil, 46, 46, 46, 46, 46, + 46, nil, nil, nil, 46, 46, nil, nil, nil, nil, + nil, nil, 46, nil, nil, 46, 46, 46, nil, 46, + 46, 48, 48, 48, nil, 48, nil, nil, nil, 48, + 48, nil, nil, nil, 48, nil, 48, 48, 48, 48, + 48, 48, 48, nil, nil, nil, nil, nil, 48, 48, + 48, 48, 48, 48, 48, nil, nil, 48, nil, nil, + nil, nil, nil, nil, 48, nil, nil, 48, 48, 48, + 48, 48, 48, 48, 48, nil, 48, 48, 48, nil, + 48, 48, nil, 48, 48, 48, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 48, nil, nil, 48, nil, + nil, 48, 48, nil, 964, 48, 964, 964, 964, 964, + 964, 48, nil, nil, nil, nil, nil, nil, nil, 48, + 964, nil, nil, nil, 48, 48, 48, 48, 48, 48, + nil, nil, nil, 48, 48, nil, nil, nil, nil, nil, + nil, 48, 964, 60, 48, 48, 48, nil, 48, 48, + 60, 60, 60, 964, 964, 60, 60, 60, 829, 60, + 829, 829, 829, 829, 829, nil, nil, nil, nil, 60, + 60, 60, nil, nil, 829, nil, nil, nil, nil, 60, + 60, nil, 60, 60, 60, 60, 60, 964, nil, nil, + nil, nil, nil, nil, nil, nil, 829, nil, nil, nil, + nil, nil, nil, nil, nil, 829, 829, 829, 829, nil, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, nil, nil, 60, 60, 60, nil, + nil, 60, nil, 829, 60, nil, nil, 60, 60, nil, + 60, 829, 60, nil, 60, nil, 60, 60, 60, 60, + 60, 60, 60, nil, 60, nil, 60, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 60, + 60, 60, 60, nil, 60, nil, 60, nil, nil, nil, + 460, 60, 62, 62, 62, 62, 62, 460, 460, 460, + 62, 62, 460, 460, 460, 62, 460, 62, 62, 62, + 62, 62, 62, 62, nil, 460, 460, 460, nil, 62, + 62, 62, 62, 62, 62, 62, 460, 460, 62, 460, + 460, 460, 460, 460, 62, 62, nil, 62, 62, 62, + 62, 62, 62, 62, 62, 62, nil, 62, 62, 62, + nil, 62, 62, nil, 62, 62, 62, 460, 460, 460, + 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, + 460, nil, nil, 460, 460, 460, 62, nil, 460, 62, + 460, 460, 62, 62, 460, 460, 62, 460, 62, 460, + nil, 460, 62, 460, 460, 460, 460, 460, 460, 460, + 62, 460, 460, 460, nil, 62, 62, 62, 62, 62, + 62, nil, nil, nil, 62, 62, 460, 460, nil, 460, + nil, 460, 62, nil, nil, 62, 62, 62, 460, 62, + 62, 67, 67, 67, nil, 67, nil, nil, nil, 67, + 67, nil, nil, nil, 67, nil, 67, 67, 67, 67, + 67, 67, 67, nil, nil, nil, nil, nil, 67, 67, + 67, 67, 67, 67, 67, nil, nil, 67, nil, nil, + nil, nil, nil, nil, 67, nil, nil, 67, 67, 67, + 67, 67, 67, 67, 67, nil, 67, 67, 67, nil, + 67, 67, nil, 67, 67, 67, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 67, nil, nil, 67, nil, + nil, 67, 67, nil, nil, 67, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, nil, 67, 67, 67, 67, 67, 67, + nil, nil, nil, 67, 67, nil, nil, nil, nil, nil, + nil, 67, nil, nil, 67, 67, 67, nil, 67, 67, + 68, 68, 68, nil, 68, nil, nil, nil, 68, 68, + nil, nil, nil, 68, nil, 68, 68, 68, 68, 68, + 68, 68, nil, nil, nil, nil, nil, 68, 68, 68, + 68, 68, 68, 68, nil, nil, 68, nil, nil, nil, + nil, nil, nil, 68, nil, nil, 68, 68, 68, 68, + 68, 68, 68, 68, nil, 68, 68, 68, nil, 68, + 68, nil, 68, 68, 68, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 68, nil, nil, 68, nil, nil, + 68, 68, nil, nil, 68, nil, nil, nil, nil, nil, + 68, nil, nil, nil, nil, nil, nil, nil, 68, nil, + nil, nil, nil, 68, 68, 68, 68, 68, 68, nil, + nil, nil, 68, 68, nil, nil, nil, nil, nil, nil, + 68, nil, nil, 68, 68, 68, nil, 68, 68, 71, + 71, 71, nil, 71, nil, nil, nil, 71, 71, nil, + nil, nil, 71, nil, 71, 71, 71, 71, 71, 71, + 71, nil, nil, nil, nil, nil, 71, 71, 71, 71, + 71, 71, 71, nil, nil, 71, nil, nil, nil, nil, + nil, nil, 71, nil, nil, 71, 71, 71, 71, 71, + 71, 71, 71, nil, 71, 71, 71, nil, 71, 71, + nil, 71, 71, 71, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 71, nil, nil, 71, nil, nil, 71, + 71, nil, nil, 71, nil, nil, nil, nil, nil, 71, + nil, nil, nil, nil, nil, nil, nil, 71, nil, nil, + nil, nil, 71, 71, 71, 71, 71, 71, nil, nil, + nil, 71, 71, 71, nil, nil, nil, nil, 71, 71, + nil, nil, 71, 71, 71, nil, 71, 71, 72, 72, + 72, nil, 72, nil, nil, nil, 72, 72, nil, nil, + nil, 72, nil, 72, 72, 72, 72, 72, 72, 72, + nil, nil, nil, nil, nil, 72, 72, 72, 72, 72, + 72, 72, nil, nil, 72, nil, nil, nil, nil, nil, + nil, 72, nil, nil, 72, 72, 72, 72, 72, 72, + 72, 72, nil, 72, 72, 72, nil, 72, 72, nil, + nil, nil, 72, nil, nil, nil, nil, nil, 980, nil, + 980, 980, 980, 980, 980, nil, nil, nil, nil, nil, + nil, nil, 72, nil, 980, 72, nil, nil, 72, 72, + nil, nil, 72, nil, 72, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 980, nil, nil, nil, + nil, 72, 72, 72, 72, 72, 72, 980, 980, nil, + 72, 72, nil, nil, nil, nil, nil, nil, 72, nil, + nil, 72, 72, 72, nil, 72, 72, 73, 73, 73, + nil, 73, nil, nil, nil, 73, 73, nil, nil, nil, + 73, 980, 73, 73, 73, 73, 73, 73, 73, nil, + nil, nil, nil, nil, 73, 73, 73, 73, 73, 73, + 73, nil, nil, 73, nil, nil, nil, nil, nil, nil, + 73, nil, nil, 73, 73, 73, 73, 73, 73, 73, + 73, nil, 73, 73, 73, nil, 73, 73, nil, nil, + nil, 73, nil, nil, nil, nil, nil, 1042, nil, 1042, + 1042, 1042, 1042, 1042, nil, nil, nil, nil, 73, nil, + nil, 73, nil, 1042, 73, nil, nil, 73, 73, nil, + nil, 73, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1042, nil, nil, nil, nil, + 73, 73, 73, 73, 73, 73, 1042, 1042, nil, 73, + 73, nil, nil, nil, nil, nil, nil, 73, nil, nil, + 73, 73, 73, nil, 73, 73, 74, 74, 74, nil, + 74, nil, nil, nil, 74, 74, nil, nil, nil, 74, + 1042, 74, 74, 74, 74, 74, 74, 74, nil, nil, + nil, nil, nil, 74, 74, 74, 74, 74, 74, 74, + nil, nil, 74, nil, nil, nil, nil, nil, nil, 74, + nil, nil, 74, 74, 74, 74, 74, 74, 74, 74, + nil, 74, 74, 74, nil, 74, 74, nil, nil, nil, + 74, nil, nil, nil, nil, nil, 1051, nil, 1051, 1051, + 1051, 1051, 1051, nil, nil, nil, nil, nil, nil, nil, + 74, nil, 1051, 74, nil, nil, 74, 74, nil, nil, + 74, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1051, nil, nil, nil, nil, 74, + 74, 74, 74, 74, 74, 1051, 1051, nil, 74, 74, + nil, nil, nil, nil, nil, nil, 74, nil, nil, 74, + 74, 74, nil, 74, 74, 128, 128, 128, 128, 128, + nil, nil, nil, 128, 128, nil, nil, nil, 128, 1051, + 128, 128, 128, 128, 128, 128, 128, nil, nil, nil, + nil, nil, 128, 128, 128, 128, 128, 128, 128, nil, + nil, 128, nil, nil, nil, nil, nil, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, nil, + 128, 128, 128, nil, 128, 128, nil, 128, 128, 128, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 128, + nil, nil, 128, nil, nil, 128, 128, nil, nil, 128, + nil, 128, nil, nil, nil, 128, nil, nil, nil, nil, + nil, nil, nil, 128, nil, nil, nil, nil, 128, 128, + 128, 128, 128, 128, nil, nil, nil, 128, 128, nil, + nil, nil, nil, nil, 128, 128, nil, nil, 128, 128, + 128, nil, 128, 128, 133, 133, 133, nil, 133, nil, + nil, nil, 133, 133, nil, nil, nil, 133, nil, 133, + 133, 133, 133, 133, 133, 133, nil, nil, nil, nil, + nil, 133, 133, 133, 133, 133, 133, 133, nil, nil, + 133, nil, nil, nil, nil, nil, nil, 133, nil, nil, + 133, 133, 133, 133, 133, 133, 133, 133, nil, 133, + 133, 133, nil, 133, 133, nil, 133, 133, 133, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 133, nil, + nil, 133, nil, nil, 133, 133, nil, nil, 133, nil, + nil, nil, nil, nil, 133, nil, nil, nil, nil, nil, + nil, nil, 133, nil, nil, nil, nil, 133, 133, 133, + 133, 133, 133, nil, nil, nil, 133, 133, nil, nil, + nil, nil, nil, nil, 133, nil, nil, 133, 133, 133, + nil, 133, 133, 134, 134, 134, nil, 134, nil, nil, + nil, 134, 134, nil, nil, nil, 134, nil, 134, 134, + 134, 134, 134, 134, 134, nil, nil, nil, nil, nil, + 134, 134, 134, 134, 134, 134, 134, nil, nil, 134, + nil, nil, nil, nil, nil, nil, 134, nil, nil, 134, + 134, 134, 134, 134, 134, 134, 134, nil, 134, 134, + 134, nil, 134, 134, nil, 134, 134, 134, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 134, nil, nil, + 134, nil, nil, 134, 134, nil, nil, 134, nil, nil, + nil, nil, nil, 134, nil, nil, nil, nil, nil, nil, + nil, 134, nil, nil, nil, nil, 134, 134, 134, 134, + 134, 134, nil, nil, nil, 134, 134, nil, nil, nil, + nil, nil, nil, 134, nil, nil, 134, 134, 134, nil, + 134, 134, 135, 135, 135, nil, 135, nil, nil, nil, + 135, 135, nil, nil, nil, 135, nil, 135, 135, 135, + 135, 135, 135, 135, nil, nil, nil, nil, nil, 135, + 135, 135, 135, 135, 135, 135, nil, nil, 135, nil, + nil, nil, nil, nil, nil, 135, nil, nil, 135, 135, + 135, 135, 135, 135, 135, 135, nil, 135, 135, 135, + nil, 135, 135, nil, 135, 135, 135, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 135, nil, nil, 135, + nil, nil, 135, 135, nil, nil, 135, nil, nil, nil, + nil, nil, 135, nil, nil, nil, nil, nil, nil, nil, + 135, nil, nil, nil, nil, 135, 135, 135, 135, 135, + 135, nil, nil, nil, 135, 135, nil, nil, nil, nil, + nil, nil, 135, nil, nil, 135, 135, 135, nil, 135, + 135, 136, 136, 136, nil, 136, nil, nil, nil, 136, + 136, nil, nil, nil, 136, nil, 136, 136, 136, 136, + 136, 136, 136, nil, nil, nil, nil, nil, 136, 136, + 136, 136, 136, 136, 136, nil, nil, 136, nil, nil, + nil, nil, nil, nil, 136, nil, nil, 136, 136, 136, + 136, 136, 136, 136, 136, nil, 136, 136, 136, nil, + 136, 136, nil, 136, 136, 136, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 136, nil, nil, 136, nil, + nil, 136, 136, nil, nil, 136, nil, nil, nil, nil, + nil, 136, nil, nil, nil, nil, nil, nil, nil, 136, + nil, nil, nil, nil, 136, 136, 136, 136, 136, 136, + nil, nil, nil, 136, 136, nil, nil, nil, nil, nil, + nil, 136, nil, nil, 136, 136, 136, nil, 136, 136, + 137, 137, 137, 137, 137, nil, nil, nil, 137, 137, + nil, nil, nil, 137, nil, 137, 137, 137, 137, 137, + 137, 137, nil, nil, nil, nil, nil, 137, 137, 137, + 137, 137, 137, 137, nil, nil, 137, nil, nil, nil, + nil, nil, 137, 137, nil, 137, 137, 137, 137, 137, + 137, 137, 137, 137, nil, 137, 137, 137, nil, 137, + 137, nil, 137, 137, 137, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 137, nil, nil, 137, nil, nil, + 137, 137, nil, nil, 137, nil, 137, nil, nil, nil, + 137, nil, nil, nil, nil, nil, nil, nil, 137, nil, + nil, nil, nil, 137, 137, 137, 137, 137, 137, nil, + nil, nil, 137, 137, nil, nil, nil, nil, nil, nil, + 137, nil, nil, 137, 137, 137, nil, 137, 137, 222, + 222, 222, nil, 222, nil, nil, nil, 222, 222, nil, + nil, nil, 222, nil, 222, 222, 222, 222, 222, 222, + 222, nil, nil, nil, nil, nil, 222, 222, 222, 222, + 222, 222, 222, nil, nil, 222, nil, nil, nil, nil, + nil, nil, 222, nil, nil, 222, 222, 222, 222, 222, + 222, 222, 222, nil, 222, 222, 222, nil, 222, 222, + nil, 222, 222, 222, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 222, nil, nil, 222, nil, nil, 222, + 222, nil, nil, 222, nil, 222, nil, nil, nil, 222, + nil, nil, nil, nil, nil, nil, nil, 222, nil, nil, + nil, nil, 222, 222, 222, 222, 222, 222, nil, nil, + nil, 222, 222, nil, nil, nil, nil, nil, nil, 222, + nil, nil, 222, 222, 222, nil, 222, 222, 223, 223, + 223, nil, 223, nil, nil, nil, 223, 223, nil, nil, + nil, 223, nil, 223, 223, 223, 223, 223, 223, 223, + nil, nil, nil, nil, nil, 223, 223, 223, 223, 223, + 223, 223, nil, nil, 223, nil, nil, nil, nil, nil, + nil, 223, nil, nil, 223, 223, 223, 223, 223, 223, + 223, 223, nil, 223, 223, 223, nil, 223, 223, nil, + 223, 223, 223, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 223, nil, nil, 223, nil, nil, 223, 223, + nil, nil, 223, nil, 223, nil, nil, nil, 223, nil, + nil, nil, nil, nil, nil, nil, 223, nil, nil, nil, + nil, 223, 223, 223, 223, 223, 223, nil, nil, nil, + 223, 223, nil, nil, nil, nil, nil, nil, 223, nil, + nil, 223, 223, 223, nil, 223, 223, 224, 224, 224, + nil, 224, nil, nil, nil, 224, 224, nil, nil, nil, + 224, nil, 224, 224, 224, 224, 224, 224, 224, nil, + nil, nil, nil, nil, 224, 224, 224, 224, 224, 224, + 224, nil, nil, 224, nil, nil, nil, nil, nil, nil, + 224, nil, nil, 224, 224, 224, 224, 224, 224, 224, + 224, nil, 224, 224, 224, nil, 224, 224, nil, 224, + 224, 224, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 224, nil, nil, 224, nil, nil, 224, 224, nil, + nil, 224, nil, nil, nil, nil, nil, 224, nil, nil, + nil, nil, nil, nil, nil, 224, nil, nil, nil, nil, + 224, 224, 224, 224, 224, 224, nil, nil, nil, 224, + 224, nil, nil, nil, nil, nil, nil, 224, nil, nil, + 224, 224, 224, nil, 224, 224, 225, 225, 225, nil, + 225, nil, nil, nil, 225, 225, nil, nil, nil, 225, + nil, 225, 225, 225, 225, 225, 225, 225, nil, nil, + nil, nil, nil, 225, 225, 225, 225, 225, 225, 225, + nil, nil, 225, nil, nil, nil, nil, nil, nil, 225, + nil, nil, 225, 225, 225, 225, 225, 225, 225, 225, + nil, 225, 225, 225, nil, 225, 225, nil, 225, 225, + 225, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 225, nil, nil, 225, nil, nil, 225, 225, nil, nil, + 225, nil, nil, nil, nil, nil, 225, nil, nil, nil, + nil, nil, nil, nil, 225, nil, nil, nil, nil, 225, + 225, 225, 225, 225, 225, nil, nil, nil, 225, 225, + nil, nil, nil, nil, nil, nil, 225, nil, nil, 225, + 225, 225, nil, 225, 225, 226, 226, 226, nil, 226, + nil, nil, nil, 226, 226, nil, nil, nil, 226, nil, + 226, 226, 226, 226, 226, 226, 226, nil, nil, nil, + nil, nil, 226, 226, 226, 226, 226, 226, 226, nil, + nil, 226, nil, nil, nil, nil, nil, nil, 226, nil, + nil, 226, 226, 226, 226, 226, 226, 226, 226, nil, + 226, 226, 226, nil, 226, 226, nil, 226, 226, 226, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 226, + nil, nil, 226, nil, nil, 226, 226, nil, nil, 226, + nil, nil, nil, nil, nil, 226, nil, nil, nil, nil, + nil, nil, nil, 226, nil, nil, nil, nil, 226, 226, + 226, 226, 226, 226, nil, nil, nil, 226, 226, nil, + nil, nil, nil, nil, nil, 226, nil, nil, 226, 226, + 226, nil, 226, 226, 227, 227, 227, nil, 227, nil, + nil, nil, 227, 227, nil, nil, nil, 227, nil, 227, + 227, 227, 227, 227, 227, 227, nil, nil, nil, nil, + nil, 227, 227, 227, 227, 227, 227, 227, nil, nil, + 227, nil, nil, nil, nil, nil, nil, 227, nil, nil, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, nil, 227, 227, nil, 227, 227, 227, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 227, nil, + nil, 227, nil, nil, 227, 227, nil, nil, 227, nil, + 227, nil, 227, nil, 227, nil, nil, nil, nil, nil, + nil, nil, 227, nil, nil, nil, nil, 227, 227, 227, + 227, 227, 227, nil, nil, nil, 227, 227, nil, nil, + nil, nil, nil, nil, 227, nil, 227, 227, 227, 227, + nil, 227, 227, 231, 231, 231, nil, 231, nil, nil, + nil, 231, 231, nil, nil, nil, 231, nil, 231, 231, + 231, 231, 231, 231, 231, nil, nil, nil, nil, nil, + 231, 231, 231, 231, 231, 231, 231, nil, nil, 231, + nil, nil, nil, nil, nil, nil, 231, nil, nil, 231, + 231, 231, 231, 231, 231, 231, 231, nil, 231, 231, + 231, nil, 231, 231, nil, 231, 231, 231, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 231, nil, nil, + 231, nil, nil, 231, 231, nil, nil, 231, nil, nil, + nil, nil, nil, 231, nil, nil, nil, nil, nil, nil, + nil, 231, nil, nil, nil, nil, 231, 231, 231, 231, + 231, 231, nil, nil, nil, 231, 231, nil, nil, nil, + nil, nil, nil, 231, nil, nil, 231, 231, 231, nil, + 231, 231, 232, 232, 232, nil, 232, nil, nil, nil, + 232, 232, nil, nil, nil, 232, nil, 232, 232, 232, + 232, 232, 232, 232, nil, nil, nil, nil, nil, 232, + 232, 232, 232, 232, 232, 232, nil, nil, 232, nil, + nil, nil, nil, nil, nil, 232, nil, nil, 232, 232, + 232, 232, 232, 232, 232, 232, nil, 232, 232, 232, + nil, 232, 232, nil, 232, 232, 232, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 232, nil, nil, 232, + nil, nil, 232, 232, nil, nil, 232, nil, nil, nil, + nil, nil, 232, nil, nil, nil, nil, nil, nil, nil, + 232, nil, nil, nil, nil, 232, 232, 232, 232, 232, + 232, nil, nil, nil, 232, 232, nil, nil, nil, nil, + nil, nil, 232, nil, nil, 232, 232, 232, nil, 232, + 232, 233, 233, 233, nil, 233, nil, nil, nil, 233, + 233, nil, nil, nil, 233, nil, 233, 233, 233, 233, + 233, 233, 233, nil, nil, nil, nil, nil, 233, 233, + 233, 233, 233, 233, 233, nil, nil, 233, nil, nil, + nil, nil, nil, nil, 233, nil, nil, 233, 233, 233, + 233, 233, 233, 233, 233, nil, 233, 233, 233, nil, + 233, 233, nil, 233, 233, 233, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 233, nil, nil, 233, nil, + nil, 233, 233, nil, nil, 233, nil, nil, nil, nil, + nil, 233, nil, nil, nil, nil, nil, nil, nil, 233, + nil, nil, nil, nil, 233, 233, 233, 233, 233, 233, + nil, nil, nil, 233, 233, 233, nil, nil, nil, nil, + nil, 233, nil, nil, 233, 233, 233, nil, 233, 233, + 244, 244, 244, nil, 244, nil, nil, nil, 244, 244, + nil, nil, nil, 244, nil, 244, 244, 244, 244, 244, + 244, 244, nil, nil, nil, nil, nil, 244, 244, 244, + 244, 244, 244, 244, nil, nil, 244, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 244, 244, 244, 244, + 244, 244, 244, 244, nil, 244, 244, 244, nil, 244, + 244, nil, 244, 244, 244, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 244, nil, nil, + 244, 244, nil, nil, 244, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 244, 244, 244, 244, 244, 244, nil, + nil, nil, 244, 244, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 244, 244, 244, nil, 244, 244, 247, + 247, 247, nil, 247, nil, nil, nil, 247, 247, nil, + nil, nil, 247, nil, 247, 247, 247, 247, 247, 247, + 247, nil, nil, nil, nil, nil, 247, 247, 247, 247, + 247, 247, 247, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 247, nil, nil, 247, 247, 247, 247, 247, + 247, 247, 247, nil, 247, 247, 247, nil, 247, 247, + nil, 247, 247, 247, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, 247, nil, nil, 247, + 247, nil, nil, 247, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 247, 247, 247, 247, 247, 247, nil, nil, + nil, 247, 247, nil, nil, nil, nil, nil, nil, 247, + nil, nil, 247, 247, 247, nil, 247, 247, 248, 248, + 248, nil, 248, nil, nil, nil, 248, 248, nil, nil, + nil, 248, nil, 248, 248, 248, 248, 248, 248, 248, + nil, nil, nil, nil, nil, 248, 248, 248, 248, 248, + 248, 248, nil, nil, 248, nil, nil, nil, nil, nil, + nil, 248, nil, nil, 248, 248, 248, 248, 248, 248, + 248, 248, nil, 248, 248, 248, nil, 248, 248, nil, + 248, 248, 248, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 248, nil, nil, 248, nil, nil, 248, 248, + nil, nil, 248, nil, nil, nil, nil, nil, 248, nil, + nil, nil, nil, nil, nil, nil, 248, nil, nil, nil, + nil, 248, 248, 248, 248, 248, 248, nil, nil, nil, + 248, 248, nil, nil, nil, nil, nil, nil, 248, nil, + nil, 248, 248, 248, nil, 248, 248, 249, 249, 249, + nil, 249, nil, nil, nil, 249, 249, nil, nil, nil, + 249, nil, 249, 249, 249, 249, 249, 249, 249, nil, + nil, nil, nil, nil, 249, 249, 249, 249, 249, 249, + 249, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 249, nil, nil, 249, 249, 249, 249, 249, 249, 249, + 249, nil, 249, 249, 249, nil, 249, 249, nil, 249, + 249, 249, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, 249, nil, nil, 249, 249, nil, + nil, 249, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 249, 249, 249, 249, 249, 249, nil, nil, nil, 249, + 249, nil, nil, nil, nil, nil, nil, 249, nil, nil, + 249, 249, 249, nil, 249, 249, 250, 250, 250, nil, + 250, nil, nil, nil, 250, 250, nil, nil, nil, 250, + nil, 250, 250, 250, 250, 250, 250, 250, nil, nil, + nil, nil, nil, 250, 250, 250, 250, 250, 250, 250, + nil, nil, 250, nil, nil, nil, nil, nil, nil, 250, + nil, nil, 250, 250, 250, 250, 250, 250, 250, 250, + nil, 250, 250, 250, nil, 250, 250, nil, 250, 250, + 250, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 250, nil, nil, 250, nil, nil, 250, 250, nil, nil, + 250, nil, nil, nil, nil, nil, 250, nil, nil, nil, + nil, nil, nil, nil, 250, nil, nil, nil, nil, 250, + 250, 250, 250, 250, 250, nil, nil, nil, 250, 250, + nil, nil, nil, nil, nil, nil, 250, nil, nil, 250, + 250, 250, nil, 250, 250, 251, 251, 251, nil, 251, + nil, nil, nil, 251, 251, nil, nil, nil, 251, nil, + 251, 251, 251, 251, 251, 251, 251, nil, nil, nil, + nil, nil, 251, 251, 251, 251, 251, 251, 251, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 251, nil, + nil, 251, 251, 251, 251, 251, 251, 251, 251, nil, + 251, 251, 251, nil, 251, 251, nil, 251, 251, 251, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 251, + nil, nil, 251, nil, nil, 251, 251, nil, nil, 251, + nil, nil, nil, nil, nil, 251, nil, nil, nil, nil, + nil, nil, nil, 251, nil, nil, nil, nil, 251, 251, + 251, 251, 251, 251, nil, nil, nil, 251, 251, nil, + nil, nil, nil, nil, nil, 251, nil, nil, 251, 251, + 251, nil, 251, 251, 252, 252, 252, nil, 252, nil, + nil, nil, 252, 252, nil, nil, nil, 252, nil, 252, + 252, 252, 252, 252, 252, 252, nil, nil, nil, nil, + nil, 252, 252, 252, 252, 252, 252, 252, nil, nil, + 252, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 252, 252, 252, 252, 252, 252, 252, 252, nil, 252, + 252, 252, nil, 252, 252, nil, 252, 252, 252, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 252, nil, nil, 252, 252, nil, nil, 252, nil, + nil, nil, nil, nil, 252, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, nil, nil, 252, 252, 252, + 252, 252, 252, nil, nil, nil, 252, 252, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 252, 252, 252, + nil, 252, 252, 253, 253, 253, nil, 253, nil, nil, + nil, 253, 253, nil, nil, nil, 253, nil, 253, 253, + 253, 253, 253, 253, 253, nil, nil, nil, nil, nil, + 253, 253, 253, 253, 253, 253, 253, nil, nil, 253, + nil, nil, nil, nil, nil, nil, 253, nil, nil, 253, + 253, 253, 253, 253, 253, 253, 253, nil, 253, 253, + 253, nil, 253, 253, nil, 253, 253, 253, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 253, nil, nil, + 253, nil, nil, 253, 253, nil, nil, 253, nil, nil, + nil, nil, nil, 253, nil, nil, nil, nil, nil, nil, + nil, 253, nil, nil, nil, nil, 253, 253, 253, 253, + 253, 253, nil, nil, nil, 253, 253, nil, nil, nil, + nil, nil, nil, 253, nil, nil, 253, 253, 253, nil, + 253, 253, 254, 254, 254, nil, 254, nil, nil, nil, + 254, 254, nil, nil, nil, 254, nil, 254, 254, 254, + 254, 254, 254, 254, nil, nil, nil, nil, nil, 254, + 254, 254, 254, 254, 254, 254, nil, nil, 254, nil, + nil, nil, nil, nil, nil, 254, nil, nil, 254, 254, + 254, 254, 254, 254, 254, 254, nil, 254, 254, 254, + nil, 254, 254, nil, 254, 254, 254, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 254, nil, nil, 254, + nil, nil, 254, 254, nil, nil, 254, nil, nil, nil, + nil, nil, 254, nil, nil, nil, nil, nil, nil, nil, + 254, nil, nil, nil, nil, 254, 254, 254, 254, 254, + 254, nil, nil, nil, 254, 254, nil, nil, nil, nil, + nil, nil, 254, nil, nil, 254, 254, 254, nil, 254, + 254, 255, 255, 255, nil, 255, nil, nil, nil, 255, + 255, nil, nil, nil, 255, nil, 255, 255, 255, 255, + 255, 255, 255, nil, nil, nil, nil, nil, 255, 255, + 255, 255, 255, 255, 255, nil, nil, 255, nil, nil, + nil, nil, nil, nil, 255, nil, nil, 255, 255, 255, + 255, 255, 255, 255, 255, nil, 255, 255, 255, nil, + 255, 255, nil, 255, 255, 255, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 255, nil, nil, 255, nil, + nil, 255, 255, nil, nil, 255, nil, nil, nil, nil, + nil, 255, nil, nil, nil, nil, nil, nil, nil, 255, + nil, nil, nil, nil, 255, 255, 255, 255, 255, 255, + nil, nil, nil, 255, 255, nil, nil, nil, nil, nil, + nil, 255, nil, nil, 255, 255, 255, nil, 255, 255, + 256, 256, 256, nil, 256, nil, nil, nil, 256, 256, + nil, nil, nil, 256, nil, 256, 256, 256, 256, 256, + 256, 256, nil, nil, nil, nil, nil, 256, 256, 256, + 256, 256, 256, 256, nil, nil, 256, nil, nil, nil, + nil, nil, nil, 256, nil, nil, 256, 256, 256, 256, + 256, 256, 256, 256, nil, 256, 256, 256, nil, 256, + 256, nil, 256, 256, 256, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 256, nil, nil, 256, nil, nil, + 256, 256, nil, nil, 256, nil, nil, nil, nil, nil, + 256, nil, nil, nil, nil, nil, nil, nil, 256, nil, + nil, nil, nil, 256, 256, 256, 256, 256, 256, nil, + nil, nil, 256, 256, nil, nil, nil, nil, nil, nil, + 256, nil, nil, 256, 256, 256, nil, 256, 256, 257, + 257, 257, nil, 257, nil, nil, nil, 257, 257, nil, + nil, nil, 257, nil, 257, 257, 257, 257, 257, 257, + 257, nil, nil, nil, nil, nil, 257, 257, 257, 257, + 257, 257, 257, nil, nil, 257, nil, nil, nil, nil, + nil, nil, 257, nil, nil, 257, 257, 257, 257, 257, + 257, 257, 257, nil, 257, 257, 257, nil, 257, 257, + nil, 257, 257, 257, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, 257, nil, nil, 257, + 257, nil, nil, 257, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 257, 257, 257, 257, 257, 257, nil, nil, + nil, 257, 257, nil, nil, nil, nil, nil, nil, 257, + nil, nil, 257, 257, 257, nil, 257, 257, 258, 258, + 258, nil, 258, nil, nil, nil, 258, 258, nil, nil, + nil, 258, nil, 258, 258, 258, 258, 258, 258, 258, + nil, nil, nil, nil, nil, 258, 258, 258, 258, 258, + 258, 258, nil, nil, 258, nil, nil, nil, nil, nil, + nil, 258, nil, nil, 258, 258, 258, 258, 258, 258, + 258, 258, nil, 258, 258, 258, nil, 258, 258, nil, + 258, 258, 258, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 258, nil, nil, 258, nil, nil, 258, 258, + nil, nil, 258, nil, nil, nil, nil, nil, 258, nil, + nil, nil, nil, nil, nil, nil, 258, nil, nil, nil, + nil, 258, 258, 258, 258, 258, 258, nil, nil, nil, + 258, 258, nil, nil, nil, nil, nil, nil, 258, nil, + nil, 258, 258, 258, nil, 258, 258, 259, 259, 259, + nil, 259, nil, nil, nil, 259, 259, nil, nil, nil, + 259, nil, 259, 259, 259, 259, 259, 259, 259, nil, + nil, nil, nil, nil, 259, 259, 259, 259, 259, 259, + 259, nil, nil, 259, nil, nil, nil, nil, nil, nil, + 259, nil, nil, 259, 259, 259, 259, 259, 259, 259, + 259, nil, 259, 259, 259, nil, 259, 259, nil, 259, + 259, 259, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 259, nil, nil, 259, nil, nil, 259, 259, nil, + nil, 259, nil, nil, nil, nil, nil, 259, nil, nil, + nil, nil, nil, nil, nil, 259, nil, nil, nil, nil, + 259, 259, 259, 259, 259, 259, nil, nil, nil, 259, + 259, nil, nil, nil, nil, nil, nil, 259, nil, nil, + 259, 259, 259, nil, 259, 259, 260, 260, 260, nil, + 260, nil, nil, nil, 260, 260, nil, nil, nil, 260, + nil, 260, 260, 260, 260, 260, 260, 260, nil, nil, + nil, nil, nil, 260, 260, 260, 260, 260, 260, 260, + nil, nil, 260, nil, nil, nil, nil, nil, nil, 260, + nil, nil, 260, 260, 260, 260, 260, 260, 260, 260, + nil, 260, 260, 260, nil, 260, 260, nil, 260, 260, + 260, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 260, nil, nil, 260, nil, nil, 260, 260, nil, nil, + 260, nil, nil, nil, nil, nil, 260, nil, nil, nil, + nil, nil, nil, nil, 260, nil, nil, nil, nil, 260, + 260, 260, 260, 260, 260, nil, nil, nil, 260, 260, + nil, nil, nil, nil, nil, nil, 260, nil, nil, 260, + 260, 260, nil, 260, 260, 261, 261, 261, nil, 261, + nil, nil, nil, 261, 261, nil, nil, nil, 261, nil, + 261, 261, 261, 261, 261, 261, 261, nil, nil, nil, + nil, nil, 261, 261, 261, 261, 261, 261, 261, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 261, nil, + nil, 261, 261, 261, 261, 261, 261, 261, 261, nil, + 261, 261, 261, nil, 261, 261, nil, 261, 261, 261, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 261, + nil, nil, 261, nil, nil, 261, 261, nil, nil, 261, + nil, nil, nil, nil, nil, 261, nil, nil, nil, nil, + nil, nil, nil, 261, nil, nil, nil, nil, 261, 261, + 261, 261, 261, 261, nil, nil, nil, 261, 261, nil, + nil, nil, nil, nil, nil, 261, nil, nil, 261, 261, + 261, nil, 261, 261, 262, 262, 262, nil, 262, nil, + nil, nil, 262, 262, nil, nil, nil, 262, nil, 262, + 262, 262, 262, 262, 262, 262, nil, nil, nil, nil, + nil, 262, 262, 262, 262, 262, 262, 262, nil, nil, + 262, nil, nil, nil, nil, nil, nil, 262, nil, nil, + 262, 262, 262, 262, 262, 262, 262, 262, nil, 262, + 262, 262, nil, 262, 262, nil, 262, 262, 262, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 262, nil, + nil, 262, nil, nil, 262, 262, nil, nil, 262, nil, + nil, nil, nil, nil, 262, nil, nil, nil, nil, nil, + nil, nil, 262, nil, nil, nil, nil, 262, 262, 262, + 262, 262, 262, nil, nil, nil, 262, 262, nil, nil, + nil, nil, nil, nil, 262, nil, nil, 262, 262, 262, + nil, 262, 262, 263, 263, 263, nil, 263, nil, nil, + nil, 263, 263, nil, nil, nil, 263, nil, 263, 263, + 263, 263, 263, 263, 263, nil, nil, nil, nil, nil, + 263, 263, 263, 263, 263, 263, 263, nil, nil, 263, + nil, nil, nil, nil, nil, nil, 263, nil, nil, 263, + 263, 263, 263, 263, 263, 263, 263, nil, 263, 263, + 263, nil, 263, 263, nil, 263, 263, 263, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 263, nil, nil, + 263, nil, nil, 263, 263, nil, nil, 263, nil, nil, + nil, nil, nil, 263, nil, nil, nil, nil, nil, nil, + nil, 263, nil, nil, nil, nil, 263, 263, 263, 263, + 263, 263, nil, nil, nil, 263, 263, nil, nil, nil, + nil, nil, nil, 263, nil, nil, 263, 263, 263, nil, + 263, 263, 264, 264, 264, nil, 264, nil, nil, nil, + 264, 264, nil, nil, nil, 264, nil, 264, 264, 264, + 264, 264, 264, 264, nil, nil, nil, nil, nil, 264, + 264, 264, 264, 264, 264, 264, nil, nil, 264, nil, + nil, nil, nil, nil, nil, 264, nil, nil, 264, 264, + 264, 264, 264, 264, 264, 264, nil, 264, 264, 264, + nil, 264, 264, nil, 264, 264, 264, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 264, nil, nil, 264, + nil, nil, 264, 264, nil, nil, 264, nil, nil, nil, + nil, nil, 264, nil, nil, nil, nil, nil, nil, nil, + 264, nil, nil, nil, nil, 264, 264, 264, 264, 264, + 264, nil, nil, nil, 264, 264, nil, nil, nil, nil, + nil, nil, 264, nil, nil, 264, 264, 264, nil, 264, + 264, 265, 265, 265, nil, 265, nil, nil, nil, 265, + 265, nil, nil, nil, 265, nil, 265, 265, 265, 265, + 265, 265, 265, nil, nil, nil, nil, nil, 265, 265, + 265, 265, 265, 265, 265, nil, nil, 265, nil, nil, + nil, nil, nil, nil, 265, nil, nil, 265, 265, 265, + 265, 265, 265, 265, 265, nil, 265, 265, 265, nil, + 265, 265, nil, 265, 265, 265, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 265, nil, nil, 265, nil, + nil, 265, 265, nil, nil, 265, nil, nil, nil, nil, + nil, 265, nil, nil, nil, nil, nil, nil, nil, 265, + nil, nil, nil, nil, 265, 265, 265, 265, 265, 265, + nil, nil, nil, 265, 265, nil, nil, nil, nil, nil, + nil, 265, nil, nil, 265, 265, 265, nil, 265, 265, + 266, 266, 266, nil, 266, nil, nil, nil, 266, 266, + nil, nil, nil, 266, nil, 266, 266, 266, 266, 266, + 266, 266, nil, nil, nil, nil, nil, 266, 266, 266, + 266, 266, 266, 266, nil, nil, 266, nil, nil, nil, + nil, nil, nil, 266, nil, nil, 266, 266, 266, 266, + 266, 266, 266, 266, nil, 266, 266, 266, nil, 266, + 266, nil, 266, 266, 266, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 266, nil, nil, 266, nil, nil, + 266, 266, nil, nil, 266, nil, nil, nil, nil, nil, + 266, nil, nil, nil, nil, nil, nil, nil, 266, nil, + nil, nil, nil, 266, 266, 266, 266, 266, 266, nil, + nil, nil, 266, 266, nil, nil, nil, nil, nil, nil, + 266, nil, nil, 266, 266, 266, nil, 266, 266, 267, + 267, 267, nil, 267, nil, nil, nil, 267, 267, nil, + nil, nil, 267, nil, 267, 267, 267, 267, 267, 267, + 267, nil, nil, nil, nil, nil, 267, 267, 267, 267, + 267, 267, 267, nil, nil, 267, nil, nil, nil, nil, + nil, nil, 267, nil, nil, 267, 267, 267, 267, 267, + 267, 267, 267, nil, 267, 267, 267, nil, 267, 267, + nil, 267, 267, 267, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 267, nil, nil, 267, nil, nil, 267, + 267, nil, nil, 267, nil, nil, nil, nil, nil, 267, + nil, nil, nil, nil, nil, nil, nil, 267, nil, nil, + nil, nil, 267, 267, 267, 267, 267, 267, nil, nil, + nil, 267, 267, nil, nil, nil, nil, nil, nil, 267, + nil, nil, 267, 267, 267, nil, 267, 267, 268, 268, + 268, nil, 268, nil, nil, nil, 268, 268, nil, nil, + nil, 268, nil, 268, 268, 268, 268, 268, 268, 268, + nil, nil, nil, nil, nil, 268, 268, 268, 268, 268, + 268, 268, nil, nil, 268, nil, nil, nil, nil, nil, + nil, 268, nil, nil, 268, 268, 268, 268, 268, 268, + 268, 268, nil, 268, 268, 268, nil, 268, 268, nil, + 268, 268, 268, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 268, nil, nil, 268, nil, nil, 268, 268, + nil, nil, 268, nil, nil, nil, nil, nil, 268, nil, + nil, nil, nil, nil, nil, nil, 268, nil, nil, nil, + nil, 268, 268, 268, 268, 268, 268, nil, nil, nil, + 268, 268, nil, nil, nil, nil, nil, nil, 268, nil, + nil, 268, 268, 268, nil, 268, 268, 273, 273, 273, + nil, 273, nil, nil, nil, 273, 273, nil, nil, nil, + 273, nil, 273, 273, 273, 273, 273, 273, 273, nil, + nil, nil, nil, nil, 273, 273, 273, 273, 273, 273, + 273, nil, nil, 273, nil, nil, nil, nil, nil, nil, + 273, nil, nil, 273, 273, 273, 273, 273, 273, 273, + 273, nil, 273, 273, 273, nil, 273, 273, nil, 273, + 273, 273, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 273, nil, nil, 273, nil, nil, 273, 273, nil, + nil, 273, nil, nil, nil, nil, nil, 273, nil, nil, + nil, nil, nil, nil, nil, 273, nil, nil, nil, nil, + 273, 273, 273, 273, 273, 273, nil, nil, nil, 273, + 273, nil, nil, nil, nil, nil, nil, 273, nil, nil, + 273, 273, 273, nil, 273, 273, 281, 281, 281, nil, + 281, nil, nil, nil, 281, 281, nil, nil, nil, 281, + nil, 281, 281, 281, 281, 281, 281, 281, nil, nil, + nil, nil, nil, 281, 281, 281, 281, 281, 281, 281, + nil, nil, 281, nil, nil, nil, nil, nil, nil, 281, + nil, nil, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, nil, 281, 281, nil, 281, 281, + 281, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 281, nil, nil, 281, nil, nil, 281, 281, nil, nil, + 281, nil, 281, nil, 281, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, 281, + 281, 281, 281, 281, 281, nil, nil, nil, 281, 281, + nil, nil, nil, nil, nil, nil, 281, nil, 281, 281, + 281, 281, nil, 281, 281, 282, 282, 282, nil, 282, + nil, nil, nil, 282, 282, nil, nil, nil, 282, nil, + 282, 282, 282, 282, 282, 282, 282, nil, nil, nil, + nil, nil, 282, 282, 282, 282, 282, 282, 282, nil, + nil, 282, nil, nil, nil, nil, nil, nil, 282, nil, + nil, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, nil, 282, 282, nil, 282, 282, 282, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 282, + nil, nil, 282, nil, nil, 282, 282, nil, nil, 282, + nil, 282, nil, 282, nil, 282, nil, nil, nil, nil, + nil, nil, nil, 282, nil, nil, nil, nil, 282, 282, + 282, 282, 282, 282, nil, nil, nil, 282, 282, nil, + nil, nil, nil, nil, nil, 282, nil, 282, 282, 282, + 282, nil, 282, 282, 291, 291, 291, nil, 291, nil, + nil, nil, 291, 291, nil, nil, nil, 291, nil, 291, + 291, 291, 291, 291, 291, 291, nil, nil, nil, nil, + nil, 291, 291, 291, 291, 291, 291, 291, nil, nil, + 291, nil, nil, nil, nil, nil, nil, 291, nil, nil, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, nil, 291, 291, nil, 291, 291, 291, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 291, nil, + nil, 291, nil, nil, 291, 291, nil, nil, 291, nil, + 291, nil, 291, nil, 291, nil, nil, nil, nil, nil, + nil, nil, 291, nil, nil, nil, nil, 291, 291, 291, + 291, 291, 291, nil, nil, nil, 291, 291, 291, nil, + nil, nil, nil, nil, 291, nil, 291, 291, 291, 291, + nil, 291, 291, 298, 298, 298, nil, 298, nil, nil, + nil, 298, 298, nil, nil, nil, 298, nil, 298, 298, + 298, 298, 298, 298, 298, nil, nil, nil, nil, nil, + 298, 298, 298, 298, 298, 298, 298, nil, nil, 298, + nil, nil, nil, nil, nil, nil, 298, nil, nil, 298, + 298, 298, 298, 298, 298, 298, 298, nil, 298, 298, + 298, nil, 298, 298, nil, 298, 298, 298, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 298, nil, nil, + 298, nil, nil, 298, 298, nil, nil, 298, nil, nil, + nil, nil, nil, 298, nil, nil, nil, nil, nil, nil, + nil, 298, nil, nil, nil, nil, 298, 298, 298, 298, + 298, 298, nil, nil, nil, 298, 298, nil, nil, nil, + nil, nil, nil, 298, nil, nil, 298, 298, 298, nil, + 298, 298, 300, 300, 300, nil, 300, nil, nil, nil, + 300, 300, nil, nil, nil, 300, nil, 300, 300, 300, + 300, 300, 300, 300, nil, nil, nil, nil, nil, 300, + 300, 300, 300, 300, 300, 300, nil, nil, 300, nil, + nil, nil, nil, nil, nil, 300, nil, nil, 300, 300, + 300, 300, 300, 300, 300, 300, nil, 300, 300, 300, + nil, 300, 300, nil, 300, 300, 300, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 300, nil, nil, 300, + nil, nil, 300, 300, nil, nil, 300, nil, nil, nil, + nil, nil, 300, nil, nil, nil, nil, nil, nil, nil, + 300, nil, nil, nil, nil, 300, 300, 300, 300, 300, + 300, nil, nil, nil, 300, 300, nil, nil, nil, nil, + nil, nil, 300, nil, nil, 300, 300, 300, nil, 300, + 300, 302, 302, 302, nil, 302, nil, nil, nil, 302, + 302, nil, nil, nil, 302, nil, 302, 302, 302, 302, + 302, 302, 302, nil, nil, nil, nil, nil, 302, 302, + 302, 302, 302, 302, 302, nil, nil, 302, nil, nil, + nil, nil, nil, nil, 302, nil, nil, 302, 302, 302, + 302, 302, 302, 302, 302, nil, 302, 302, 302, nil, + 302, 302, nil, 302, 302, 302, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 302, nil, nil, 302, nil, + nil, 302, 302, nil, nil, 302, nil, nil, nil, nil, + nil, 302, nil, nil, nil, nil, nil, nil, nil, 302, + nil, nil, nil, nil, 302, 302, 302, 302, 302, 302, + nil, nil, nil, 302, 302, nil, nil, nil, nil, nil, + nil, 302, nil, nil, 302, 302, 302, nil, 302, 302, + 303, 303, 303, nil, 303, nil, nil, nil, 303, 303, + nil, nil, nil, 303, nil, 303, 303, 303, 303, 303, + 303, 303, nil, nil, nil, nil, nil, 303, 303, 303, + 303, 303, 303, 303, nil, nil, 303, nil, nil, nil, + nil, nil, nil, 303, nil, nil, 303, 303, 303, 303, + 303, 303, 303, 303, nil, 303, 303, 303, nil, 303, + 303, nil, 303, 303, 303, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 303, nil, nil, 303, nil, nil, + 303, 303, nil, nil, 303, nil, nil, nil, nil, nil, + 303, nil, nil, nil, nil, nil, nil, nil, 303, nil, + nil, nil, nil, 303, 303, 303, 303, 303, 303, nil, + nil, nil, 303, 303, nil, nil, nil, nil, nil, nil, + 303, nil, nil, 303, 303, 303, nil, 303, 303, 309, + 309, 309, 309, 309, nil, nil, nil, 309, 309, nil, + nil, nil, 309, nil, 309, 309, 309, 309, 309, 309, + 309, nil, nil, nil, nil, nil, 309, 309, 309, 309, + 309, 309, 309, nil, nil, 309, nil, nil, nil, nil, + nil, 309, 309, nil, 309, 309, 309, 309, 309, 309, + 309, 309, 309, nil, 309, 309, 309, nil, 309, 309, + nil, 309, 309, 309, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 309, nil, nil, 309, nil, nil, 309, + 309, nil, nil, 309, nil, 309, nil, nil, nil, 309, + nil, nil, nil, nil, nil, nil, nil, 309, nil, nil, + nil, nil, 309, 309, 309, 309, 309, 309, nil, nil, + nil, 309, 309, nil, nil, nil, nil, nil, nil, 309, + nil, nil, 309, 309, 309, nil, 309, 309, 317, 317, + 317, nil, 317, nil, nil, nil, 317, 317, nil, nil, + nil, 317, nil, 317, 317, 317, 317, 317, 317, 317, + nil, nil, nil, nil, nil, 317, 317, 317, 317, 317, + 317, 317, nil, nil, 317, nil, nil, nil, nil, nil, + nil, 317, nil, nil, 317, 317, 317, 317, 317, 317, + 317, 317, nil, 317, 317, 317, nil, 317, 317, nil, + nil, nil, 317, nil, nil, nil, nil, nil, 1053, nil, + 1053, 1053, 1053, 1053, 1053, nil, nil, nil, nil, nil, + nil, nil, 317, nil, 1053, 317, nil, nil, 317, 317, + nil, nil, 317, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1053, nil, nil, nil, + nil, 317, 317, 317, 317, 317, 317, 1053, 1053, nil, + 317, 317, nil, nil, nil, 317, nil, nil, 317, nil, + nil, 317, 317, 317, nil, 317, 317, 334, 334, 334, + nil, 334, nil, nil, nil, 334, 334, nil, nil, nil, + 334, 1053, 334, 334, 334, 334, 334, 334, 334, nil, + nil, nil, nil, nil, 334, 334, 334, 334, 334, 334, + 334, nil, nil, 334, nil, nil, nil, nil, nil, nil, + 334, nil, nil, 334, 334, 334, 334, 334, 334, 334, + 334, nil, 334, 334, 334, nil, 334, 334, nil, nil, + nil, 334, nil, nil, nil, nil, nil, 1055, nil, 1055, + 1055, 1055, 1055, 1055, nil, nil, nil, nil, nil, nil, + nil, 334, nil, 1055, 334, nil, nil, 334, 334, nil, + nil, 334, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1055, nil, nil, nil, nil, + 334, 334, 334, 334, 334, 334, 1055, 1055, nil, 334, + 334, nil, nil, nil, nil, nil, nil, 334, nil, nil, + 334, 334, 334, nil, 334, 334, 341, 341, 341, nil, + 341, nil, nil, nil, 341, 341, nil, nil, nil, 341, + 1055, 341, 341, 341, 341, 341, 341, 341, nil, nil, + nil, nil, nil, 341, 341, 341, 341, 341, 341, 341, + nil, nil, 341, nil, nil, nil, nil, nil, nil, 341, + nil, nil, 341, 341, 341, 341, 341, 341, 341, 341, + nil, 341, 341, 341, nil, 341, 341, nil, 341, 341, + 341, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 341, nil, nil, 341, nil, nil, 341, 341, nil, nil, + 341, nil, nil, nil, nil, nil, 341, nil, nil, nil, + nil, nil, nil, nil, 341, nil, nil, nil, nil, 341, + 341, 341, 341, 341, 341, nil, nil, nil, 341, 341, + nil, nil, nil, nil, nil, nil, 341, nil, nil, 341, + 341, 341, nil, 341, 341, 343, 343, 343, nil, 343, + nil, nil, nil, 343, 343, nil, nil, nil, 343, nil, + 343, 343, 343, 343, 343, 343, 343, nil, nil, nil, + nil, nil, 343, 343, 343, 343, 343, 343, 343, nil, + nil, 343, nil, nil, nil, nil, nil, nil, 343, nil, + nil, 343, 343, 343, 343, 343, 343, 343, 343, nil, + 343, 343, 343, nil, 343, 343, nil, 343, 343, 343, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 343, + nil, nil, 343, 343, nil, 343, 343, nil, nil, 343, + nil, nil, nil, nil, nil, 343, nil, nil, nil, nil, + nil, nil, nil, 343, nil, nil, nil, nil, 343, 343, + 343, 343, 343, 343, nil, nil, nil, 343, 343, nil, + nil, nil, nil, nil, nil, 343, nil, nil, 343, 343, + 343, nil, 343, 343, 347, 347, 347, nil, 347, nil, + nil, nil, 347, 347, nil, nil, nil, 347, nil, 347, + 347, 347, 347, 347, 347, 347, nil, nil, nil, nil, + nil, 347, 347, 347, 347, 347, 347, 347, nil, nil, + 347, nil, nil, nil, nil, nil, nil, 347, nil, nil, + 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, + 347, 347, nil, 347, 347, nil, 347, 347, 347, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 347, nil, + nil, 347, nil, nil, 347, 347, nil, nil, 347, nil, + 347, nil, nil, nil, 347, nil, nil, nil, nil, nil, + nil, nil, 347, nil, nil, nil, nil, 347, 347, 347, + 347, 347, 347, nil, nil, nil, 347, 347, nil, nil, + nil, nil, nil, nil, 347, nil, 347, 347, 347, 347, + nil, 347, 347, 348, 348, 348, nil, 348, nil, nil, + nil, 348, 348, nil, nil, nil, 348, nil, 348, 348, + 348, 348, 348, 348, 348, nil, nil, nil, nil, nil, + 348, 348, 348, 348, 348, 348, 348, nil, nil, 348, + nil, nil, nil, nil, nil, nil, 348, nil, nil, 348, + 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, + 348, nil, 348, 348, nil, 348, 348, 348, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 348, nil, nil, + 348, nil, nil, 348, 348, nil, nil, 348, nil, nil, + nil, nil, nil, 348, nil, nil, nil, nil, nil, nil, + nil, 348, nil, nil, nil, nil, 348, 348, 348, 348, + 348, 348, nil, nil, nil, 348, 348, nil, nil, nil, + nil, nil, nil, 348, nil, 348, 348, 348, 348, nil, + 348, 348, 353, 353, 353, nil, 353, nil, nil, nil, + 353, 353, nil, nil, nil, 353, nil, 353, 353, 353, + 353, 353, 353, 353, nil, nil, nil, nil, nil, 353, + 353, 353, 353, 353, 353, 353, nil, nil, 353, nil, + nil, nil, nil, nil, nil, 353, nil, nil, 353, 353, + 353, 353, 353, 353, 353, 353, nil, 353, 353, 353, + nil, 353, 353, nil, 353, 353, 353, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 353, nil, nil, 353, + nil, nil, 353, 353, nil, nil, 353, nil, nil, nil, + nil, nil, 353, nil, nil, nil, nil, nil, nil, nil, + 353, nil, nil, nil, nil, 353, 353, 353, 353, 353, + 353, nil, nil, nil, 353, 353, nil, nil, nil, nil, + nil, nil, 353, nil, nil, 353, 353, 353, nil, 353, + 353, 374, 374, 374, nil, 374, nil, nil, nil, 374, + 374, nil, nil, nil, 374, nil, 374, 374, 374, 374, + 374, 374, 374, nil, nil, nil, nil, nil, 374, 374, + 374, 374, 374, 374, 374, nil, nil, 374, nil, nil, + nil, nil, nil, nil, 374, nil, nil, 374, 374, 374, + 374, 374, 374, 374, 374, nil, 374, 374, 374, nil, + 374, 374, nil, 374, 374, 374, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 374, nil, nil, 374, nil, + nil, 374, 374, nil, nil, 374, nil, nil, nil, nil, + nil, 374, nil, nil, nil, nil, nil, nil, nil, 374, + nil, nil, nil, nil, 374, 374, 374, 374, 374, 374, + nil, nil, nil, 374, 374, nil, nil, nil, nil, nil, + nil, 374, nil, nil, 374, 374, 374, nil, 374, 374, + 435, 435, 435, nil, 435, nil, nil, nil, 435, 435, + nil, nil, nil, 435, nil, 435, 435, 435, 435, 435, + 435, 435, nil, nil, nil, nil, nil, 435, 435, 435, + 435, 435, 435, 435, nil, nil, 435, nil, nil, nil, + nil, nil, nil, 435, nil, nil, 435, 435, 435, 435, + 435, 435, 435, 435, nil, 435, 435, 435, nil, 435, + 435, nil, 435, 435, 435, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 435, nil, nil, 435, nil, nil, + 435, 435, nil, 1076, 435, 1076, 1076, 1076, 1076, 1076, + 435, nil, nil, nil, nil, nil, nil, nil, 435, 1076, + nil, nil, nil, 435, 435, 435, 435, 435, 435, nil, + nil, nil, 435, 435, nil, nil, nil, nil, nil, nil, + 435, 1076, 469, 435, 435, 435, nil, 435, 435, 469, + 469, 469, 1076, 1076, 469, 469, 469, 958, 469, 958, + 958, 958, 958, 958, nil, nil, nil, 469, 469, 469, + 469, nil, nil, 958, nil, nil, nil, nil, 469, 469, + nil, 469, 469, 469, 469, 469, 1076, nil, nil, nil, + nil, nil, nil, nil, nil, 958, nil, nil, nil, nil, + nil, nil, nil, nil, 958, 958, 958, 958, nil, 469, + 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, + 469, 469, 469, nil, nil, 469, 469, 469, nil, nil, + 469, nil, nil, 469, nil, nil, 469, 469, nil, 469, + 958, 469, nil, 469, nil, 469, 469, 469, 469, 469, + 469, 469, nil, 469, 469, 469, 975, nil, 975, 975, + 975, 975, 975, nil, nil, nil, nil, nil, 469, 469, + 469, 469, 975, 469, 470, 469, nil, nil, nil, nil, + 469, 470, 470, 470, nil, nil, 470, 470, 470, nil, + 470, nil, nil, nil, 975, nil, nil, nil, nil, 470, + 470, 470, 470, 975, 975, 975, 975, nil, nil, nil, + 470, 470, nil, 470, 470, 470, 470, 470, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 975, + nil, 470, 470, 470, 470, 470, 470, 470, 470, 470, + 470, 470, 470, 470, 470, nil, nil, 470, 470, 470, + nil, nil, 470, nil, nil, 470, nil, nil, 470, 470, + nil, 470, nil, 470, nil, 470, nil, 470, 470, 470, + 470, 470, 470, 470, nil, 470, 470, 470, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 470, 470, 470, 470, nil, 470, nil, 470, nil, 479, + 479, 479, 470, 479, nil, nil, nil, 479, 479, nil, + nil, nil, 479, nil, 479, 479, 479, 479, 479, 479, + 479, nil, nil, nil, nil, nil, 479, 479, 479, 479, + 479, 479, 479, nil, nil, 479, nil, nil, nil, nil, + nil, nil, 479, nil, nil, 479, 479, 479, 479, 479, + 479, 479, 479, 479, 479, 479, 479, nil, 479, 479, + nil, 479, 479, 479, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 479, nil, nil, 479, nil, nil, 479, + 479, nil, nil, 479, nil, 479, nil, 479, nil, 479, + nil, nil, nil, nil, nil, nil, nil, 479, nil, nil, + nil, nil, 479, 479, 479, 479, 479, 479, nil, nil, + nil, 479, 479, nil, nil, nil, nil, nil, nil, 479, + nil, 479, 479, 479, 479, nil, 479, 479, 481, 481, + 481, nil, 481, nil, nil, nil, 481, 481, nil, nil, + nil, 481, nil, 481, 481, 481, 481, 481, 481, 481, + nil, nil, nil, nil, nil, 481, 481, 481, 481, 481, + 481, 481, nil, nil, 481, nil, nil, nil, nil, nil, + nil, 481, nil, nil, 481, 481, 481, 481, 481, 481, + 481, 481, nil, 481, 481, 481, nil, 481, 481, nil, + 481, 481, 481, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 481, nil, nil, 481, nil, nil, 481, 481, + nil, nil, 481, nil, nil, nil, nil, nil, 481, nil, + nil, nil, nil, nil, nil, nil, 481, nil, nil, nil, + nil, 481, 481, 481, 481, 481, 481, nil, nil, nil, + 481, 481, nil, nil, nil, nil, nil, nil, 481, nil, + nil, 481, 481, 481, nil, 481, 481, 482, 482, 482, + nil, 482, nil, nil, nil, 482, 482, nil, nil, nil, + 482, nil, 482, 482, 482, 482, 482, 482, 482, nil, + nil, nil, nil, nil, 482, 482, 482, 482, 482, 482, + 482, nil, nil, 482, nil, nil, nil, nil, nil, nil, + 482, nil, nil, 482, 482, 482, 482, 482, 482, 482, + 482, nil, 482, 482, 482, nil, 482, 482, nil, 482, + 482, 482, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 482, nil, nil, 482, nil, nil, 482, 482, nil, + nil, 482, nil, nil, nil, nil, nil, 482, nil, nil, + nil, nil, nil, nil, nil, 482, nil, nil, nil, nil, + 482, 482, 482, 482, 482, 482, nil, nil, nil, 482, + 482, nil, nil, nil, nil, nil, nil, 482, nil, nil, + 482, 482, 482, nil, 482, 482, 483, 483, 483, nil, + 483, nil, nil, nil, 483, 483, nil, nil, nil, 483, + nil, 483, 483, 483, 483, 483, 483, 483, nil, nil, + nil, nil, nil, 483, 483, 483, 483, 483, 483, 483, + nil, nil, 483, nil, nil, nil, nil, nil, nil, 483, + nil, nil, 483, 483, 483, 483, 483, 483, 483, 483, + nil, 483, 483, 483, nil, 483, 483, nil, 483, 483, + 483, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 483, nil, nil, 483, nil, nil, 483, 483, nil, nil, + 483, nil, nil, nil, nil, nil, 483, nil, nil, nil, + nil, nil, nil, nil, 483, nil, nil, nil, nil, 483, + 483, 483, 483, 483, 483, nil, nil, nil, 483, 483, + nil, nil, nil, nil, nil, nil, 483, nil, 509, 483, + 483, 483, nil, 483, 483, 509, 509, 509, nil, nil, + 509, 509, 509, nil, 509, nil, nil, nil, nil, nil, + nil, nil, nil, 509, 509, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 509, 509, nil, 509, 509, 509, + 509, 509, nil, nil, nil, nil, nil, nil, nil, 277, + 277, nil, nil, 277, nil, nil, nil, nil, nil, nil, + nil, nil, 277, 277, nil, 277, 277, 277, 277, 277, + 277, 277, nil, nil, 277, 277, 509, nil, nil, 277, + 277, 277, 277, 509, nil, nil, nil, nil, 509, 509, + nil, nil, nil, nil, nil, nil, 277, 277, nil, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 509, 509, 277, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 509, nil, 521, 521, 521, 509, + 521, nil, 277, nil, 521, 521, 509, nil, nil, 521, + nil, 521, 521, 521, 521, 521, 521, 521, nil, nil, + nil, nil, nil, 521, 521, 521, 521, 521, 521, 521, + nil, nil, 521, nil, nil, nil, nil, nil, nil, 521, + nil, nil, 521, 521, 521, 521, 521, 521, 521, 521, + 521, 521, 521, 521, nil, 521, 521, nil, 521, 521, + 521, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 521, nil, nil, 521, nil, nil, 521, 521, nil, nil, + 521, nil, 521, nil, 521, nil, 521, nil, nil, nil, + nil, nil, nil, nil, 521, nil, nil, nil, nil, 521, + 521, 521, 521, 521, 521, nil, nil, nil, 521, 521, + nil, nil, nil, nil, nil, nil, 521, nil, 521, 521, + 521, 521, nil, 521, 521, 524, 524, 524, nil, 524, + nil, nil, nil, 524, 524, nil, nil, nil, 524, nil, + 524, 524, 524, 524, 524, 524, 524, nil, nil, nil, + nil, nil, 524, 524, 524, 524, 524, 524, 524, nil, + nil, 524, nil, nil, nil, nil, nil, nil, 524, nil, + nil, 524, 524, 524, 524, 524, 524, 524, 524, 524, + 524, 524, 524, nil, 524, 524, nil, 524, 524, 524, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 524, + nil, nil, 524, nil, nil, 524, 524, nil, nil, 524, + nil, nil, nil, 524, nil, 524, nil, nil, nil, nil, + nil, nil, nil, 524, nil, nil, nil, nil, 524, 524, + 524, 524, 524, 524, nil, nil, nil, 524, 524, nil, + nil, nil, nil, nil, nil, 524, nil, 524, 524, 524, + 524, nil, 524, 524, 526, 526, 526, nil, 526, nil, + nil, nil, 526, 526, nil, nil, nil, 526, nil, 526, + 526, 526, 526, 526, 526, 526, nil, nil, nil, nil, + nil, 526, 526, 526, 526, 526, 526, 526, nil, nil, + 526, nil, nil, nil, nil, nil, nil, 526, nil, nil, + 526, 526, 526, 526, 526, 526, 526, 526, nil, 526, + 526, 526, nil, 526, 526, nil, 526, 526, 526, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 526, nil, + nil, 526, nil, nil, 526, 526, nil, nil, 526, nil, + nil, nil, nil, nil, 526, nil, nil, nil, nil, nil, + nil, nil, 526, nil, nil, nil, nil, 526, 526, 526, + 526, 526, 526, nil, nil, nil, 526, 526, nil, nil, + nil, nil, nil, nil, 526, nil, nil, 526, 526, 526, + nil, 526, 526, 531, 531, 531, 531, 531, nil, nil, + nil, 531, 531, nil, nil, nil, 531, nil, 531, 531, + 531, 531, 531, 531, 531, nil, nil, nil, nil, nil, + 531, 531, 531, 531, 531, 531, 531, nil, nil, 531, + nil, nil, nil, nil, nil, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, nil, 531, 531, + 531, nil, 531, 531, nil, 531, 531, 531, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 531, nil, nil, + 531, nil, nil, 531, 531, nil, nil, 531, nil, 531, + nil, nil, nil, 531, nil, nil, nil, nil, nil, nil, + nil, 531, nil, nil, nil, nil, 531, 531, 531, 531, + 531, 531, nil, nil, nil, 531, 531, nil, nil, nil, + nil, nil, 531, 531, nil, nil, 531, 531, 531, nil, + 531, 531, 539, 539, 539, nil, 539, nil, nil, nil, + 539, 539, nil, nil, nil, 539, nil, 539, 539, 539, + 539, 539, 539, 539, nil, nil, nil, nil, nil, 539, + 539, 539, 539, 539, 539, 539, nil, nil, 539, nil, + nil, nil, nil, nil, nil, 539, nil, nil, 539, 539, + 539, 539, 539, 539, 539, 539, nil, 539, 539, 539, + nil, 539, 539, nil, nil, nil, 539, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 539, nil, nil, 539, + nil, nil, 539, 539, nil, nil, 539, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 539, 539, 539, 539, 539, + 539, nil, nil, nil, 539, 539, nil, nil, nil, nil, + nil, nil, 539, nil, nil, 539, 539, 539, nil, 539, + 539, 541, 541, 541, nil, 541, nil, nil, nil, 541, + 541, nil, nil, nil, 541, nil, 541, 541, 541, 541, + 541, 541, 541, nil, nil, nil, nil, nil, 541, 541, + 541, 541, 541, 541, 541, nil, nil, 541, nil, nil, + nil, nil, nil, nil, 541, nil, nil, 541, 541, 541, + 541, 541, 541, 541, 541, 541, 541, 541, 541, nil, + 541, 541, nil, 541, 541, 541, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 541, nil, nil, 541, nil, + nil, 541, 541, nil, nil, 541, nil, 541, nil, 541, + nil, 541, nil, nil, nil, nil, nil, nil, nil, 541, + nil, nil, nil, nil, 541, 541, 541, 541, 541, 541, + nil, nil, nil, 541, 541, nil, nil, nil, nil, nil, + nil, 541, nil, 541, 541, 541, 541, nil, 541, 541, + 547, 547, 547, nil, 547, nil, nil, nil, 547, 547, + nil, nil, nil, 547, nil, 547, 547, 547, 547, 547, + 547, 547, nil, nil, nil, nil, nil, 547, 547, 547, + 547, 547, 547, 547, nil, nil, 547, nil, nil, nil, + nil, nil, nil, 547, nil, nil, 547, 547, 547, 547, + 547, 547, 547, 547, nil, 547, 547, 547, nil, 547, + 547, nil, nil, nil, 547, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 547, nil, nil, 547, nil, nil, + 547, 547, nil, nil, 547, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 547, 547, 547, 547, 547, 547, nil, + nil, nil, 547, 547, nil, nil, nil, nil, nil, nil, + 547, nil, nil, 547, 547, 547, nil, 547, 547, 550, + 550, 550, nil, 550, nil, nil, nil, 550, 550, nil, + nil, nil, 550, nil, 550, 550, 550, 550, 550, 550, + 550, nil, nil, nil, nil, nil, 550, 550, 550, 550, + 550, 550, 550, nil, nil, 550, nil, nil, nil, nil, + nil, nil, 550, nil, nil, 550, 550, 550, 550, 550, + 550, 550, 550, nil, 550, 550, 550, nil, 550, 550, + nil, 550, 550, 550, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 550, nil, nil, 550, nil, nil, 550, + 550, nil, nil, 550, nil, nil, nil, nil, nil, 550, + nil, nil, nil, nil, nil, nil, nil, 550, nil, nil, + nil, nil, 550, 550, 550, 550, 550, 550, nil, nil, + nil, 550, 550, nil, nil, nil, nil, nil, nil, 550, + nil, nil, 550, 550, 550, nil, 550, 550, 551, 551, + 551, nil, 551, nil, nil, nil, 551, 551, nil, nil, + nil, 551, nil, 551, 551, 551, 551, 551, 551, 551, + nil, nil, nil, nil, nil, 551, 551, 551, 551, 551, + 551, 551, nil, nil, 551, nil, nil, nil, nil, nil, + nil, 551, nil, nil, 551, 551, 551, 551, 551, 551, + 551, 551, nil, 551, 551, 551, nil, 551, 551, nil, + 551, 551, 551, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 551, nil, nil, 551, nil, nil, 551, 551, + nil, nil, 551, nil, nil, nil, nil, nil, 551, nil, + nil, nil, nil, nil, nil, nil, 551, nil, nil, nil, + nil, 551, 551, 551, 551, 551, 551, nil, nil, nil, + 551, 551, nil, nil, nil, nil, nil, nil, 551, nil, + nil, 551, 551, 551, nil, 551, 551, 556, 556, 556, + nil, 556, nil, nil, nil, 556, 556, nil, nil, nil, + 556, nil, 556, 556, 556, 556, 556, 556, 556, nil, + nil, nil, nil, nil, 556, 556, 556, 556, 556, 556, + 556, nil, nil, 556, nil, nil, nil, nil, nil, nil, + 556, nil, nil, 556, 556, 556, 556, 556, 556, 556, + 556, nil, 556, 556, 556, nil, 556, 556, nil, 556, + 556, 556, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 556, nil, nil, 556, nil, nil, 556, 556, nil, + nil, 556, nil, nil, nil, nil, nil, 556, nil, nil, + nil, nil, nil, nil, nil, 556, nil, nil, nil, nil, + 556, 556, 556, 556, 556, 556, nil, nil, nil, 556, + 556, nil, nil, nil, nil, nil, nil, 556, nil, nil, + 556, 556, 556, nil, 556, 556, 580, 580, 580, nil, + 580, nil, nil, nil, 580, 580, nil, nil, nil, 580, + nil, 580, 580, 580, 580, 580, 580, 580, nil, nil, + nil, nil, nil, 580, 580, 580, 580, 580, 580, 580, + nil, nil, 580, nil, nil, nil, nil, nil, nil, 580, + nil, nil, 580, 580, 580, 580, 580, 580, 580, 580, + 580, 580, 580, 580, nil, 580, 580, nil, 580, 580, + 580, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 580, nil, nil, 580, nil, nil, 580, 580, nil, nil, + 580, nil, 580, nil, 580, nil, 580, nil, nil, nil, + nil, nil, nil, nil, 580, nil, nil, nil, nil, 580, + 580, 580, 580, 580, 580, nil, nil, nil, 580, 580, + nil, nil, nil, nil, nil, nil, 580, nil, 580, 580, + 580, 580, nil, 580, 580, 590, 590, 590, nil, 590, + nil, nil, nil, 590, 590, nil, nil, nil, 590, nil, + 590, 590, 590, 590, 590, 590, 590, nil, nil, nil, + nil, nil, 590, 590, 590, 590, 590, 590, 590, nil, + nil, 590, nil, nil, nil, nil, nil, nil, 590, nil, + nil, 590, 590, 590, 590, 590, 590, 590, 590, 590, + 590, 590, 590, nil, 590, 590, nil, 590, 590, 590, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 590, + nil, nil, 590, nil, nil, 590, 590, nil, nil, 590, + nil, 590, nil, 590, nil, 590, nil, nil, nil, nil, + nil, nil, nil, 590, nil, nil, nil, nil, 590, 590, + 590, 590, 590, 590, nil, nil, nil, 590, 590, nil, + nil, nil, nil, nil, nil, 590, nil, 590, 590, 590, + 590, nil, 590, 590, 600, 600, 600, nil, 600, nil, + nil, nil, 600, 600, nil, nil, nil, 600, nil, 600, + 600, 600, 600, 600, 600, 600, nil, nil, nil, nil, + nil, 600, 600, 600, 600, 600, 600, 600, nil, nil, + 600, nil, nil, nil, nil, nil, nil, 600, nil, nil, + 600, 600, 600, 600, 600, 600, 600, 600, nil, 600, + 600, 600, nil, 600, 600, nil, 600, 600, 600, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 600, nil, + nil, 600, nil, nil, 600, 600, nil, nil, 600, nil, + nil, nil, nil, nil, 600, nil, nil, nil, nil, nil, + nil, nil, 600, nil, nil, nil, nil, 600, 600, 600, + 600, 600, 600, nil, nil, nil, 600, 600, nil, nil, + nil, nil, nil, nil, 600, nil, nil, 600, 600, 600, + nil, 600, 600, 621, 621, 621, nil, 621, nil, nil, + nil, 621, 621, nil, nil, nil, 621, nil, 621, 621, + 621, 621, 621, 621, 621, nil, nil, nil, nil, nil, + 621, 621, 621, 621, 621, 621, 621, nil, nil, 621, + nil, nil, nil, nil, nil, nil, 621, nil, nil, 621, + 621, 621, 621, 621, 621, 621, 621, nil, 621, 621, + 621, nil, 621, 621, nil, 621, 621, 621, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 621, nil, nil, + 621, nil, nil, 621, 621, nil, nil, 621, nil, nil, + nil, nil, nil, 621, nil, nil, nil, nil, nil, nil, + nil, 621, nil, nil, nil, nil, 621, 621, 621, 621, + 621, 621, nil, nil, nil, 621, 621, nil, nil, nil, + nil, nil, nil, 621, nil, nil, 621, 621, 621, nil, + 621, 621, 661, 661, 661, nil, 661, nil, nil, nil, + 661, 661, nil, nil, nil, 661, nil, 661, 661, 661, + 661, 661, 661, 661, nil, nil, nil, nil, nil, 661, + 661, 661, 661, 661, 661, 661, nil, nil, 661, nil, + nil, nil, nil, nil, nil, 661, nil, nil, 661, 661, + 661, 661, 661, 661, 661, 661, nil, 661, 661, 661, + nil, 661, 661, nil, 661, 661, 661, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 661, nil, nil, 661, + nil, nil, 661, 661, nil, nil, 661, nil, 661, nil, + nil, nil, 661, nil, nil, nil, nil, nil, nil, nil, + 661, nil, nil, nil, nil, 661, 661, 661, 661, 661, + 661, nil, nil, nil, 661, 661, nil, nil, nil, nil, + nil, nil, 661, nil, nil, 661, 661, 661, nil, 661, + 661, 662, 662, 662, nil, 662, nil, nil, nil, 662, + 662, nil, nil, nil, 662, nil, 662, 662, 662, 662, + 662, 662, 662, nil, nil, nil, nil, nil, 662, 662, + 662, 662, 662, 662, 662, nil, nil, 662, nil, nil, + nil, nil, nil, nil, 662, nil, nil, 662, 662, 662, + 662, 662, 662, 662, 662, nil, 662, 662, 662, nil, + 662, 662, nil, 662, 662, 662, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 662, nil, nil, 662, nil, + nil, 662, 662, nil, nil, 662, nil, nil, nil, nil, + nil, 662, nil, nil, nil, nil, nil, nil, nil, 662, + nil, nil, nil, nil, 662, 662, 662, 662, 662, 662, + nil, nil, nil, 662, 662, nil, nil, nil, nil, nil, + nil, 662, nil, nil, 662, 662, 662, nil, 662, 662, + 663, 663, 663, nil, 663, nil, nil, nil, 663, 663, + nil, nil, nil, 663, nil, 663, 663, 663, 663, 663, + 663, 663, nil, nil, nil, nil, nil, 663, 663, 663, + 663, 663, 663, 663, nil, nil, 663, nil, nil, nil, + nil, nil, nil, 663, nil, nil, 663, 663, 663, 663, + 663, 663, 663, 663, 663, 663, 663, 663, nil, 663, + 663, nil, 663, 663, 663, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 663, nil, nil, 663, nil, nil, + 663, 663, nil, nil, 663, nil, 663, nil, 663, nil, + 663, nil, nil, nil, nil, nil, nil, nil, 663, nil, + nil, nil, nil, 663, 663, 663, 663, 663, 663, nil, + nil, nil, 663, 663, nil, nil, nil, nil, nil, nil, + 663, nil, 663, 663, 663, 663, nil, 663, 663, 666, + 666, 666, nil, 666, nil, nil, nil, 666, 666, nil, + nil, nil, 666, nil, 666, 666, 666, 666, 666, 666, + 666, nil, nil, nil, nil, nil, 666, 666, 666, 666, + 666, 666, 666, nil, nil, 666, nil, nil, nil, nil, + nil, nil, 666, nil, nil, 666, 666, 666, 666, 666, + 666, 666, 666, nil, 666, 666, 666, nil, 666, 666, + nil, 666, 666, 666, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 666, nil, nil, 666, nil, nil, 666, + 666, nil, nil, 666, nil, nil, nil, nil, nil, 666, + nil, nil, nil, nil, nil, nil, nil, 666, nil, nil, + nil, nil, 666, 666, 666, 666, 666, 666, nil, nil, + nil, 666, 666, nil, nil, nil, nil, nil, nil, 666, + nil, nil, 666, 666, 666, nil, 666, 666, 669, 669, + 669, nil, 669, nil, nil, nil, 669, 669, nil, nil, + nil, 669, nil, 669, 669, 669, 669, 669, 669, 669, + nil, nil, nil, nil, nil, 669, 669, 669, 669, 669, + 669, 669, nil, nil, 669, nil, nil, nil, nil, nil, + nil, 669, nil, nil, 669, 669, 669, 669, 669, 669, + 669, 669, 669, 669, 669, 669, nil, 669, 669, nil, + 669, 669, 669, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 669, nil, nil, 669, nil, nil, 669, 669, + nil, nil, 669, nil, 669, nil, 669, nil, 669, nil, + nil, nil, nil, nil, nil, nil, 669, nil, nil, nil, + nil, 669, 669, 669, 669, 669, 669, nil, nil, nil, + 669, 669, nil, nil, nil, nil, nil, nil, 669, nil, + 669, 669, 669, 669, nil, 669, 669, 670, 670, 670, + nil, 670, nil, nil, nil, 670, 670, nil, nil, nil, + 670, nil, 670, 670, 670, 670, 670, 670, 670, nil, + nil, nil, nil, nil, 670, 670, 670, 670, 670, 670, + 670, nil, nil, 670, nil, nil, nil, nil, nil, nil, + 670, nil, nil, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, 670, nil, 670, 670, nil, 670, + 670, 670, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 670, nil, nil, 670, nil, nil, 670, 670, nil, + nil, 670, nil, nil, nil, 670, nil, 670, nil, nil, + nil, nil, nil, nil, nil, 670, nil, nil, nil, nil, + 670, 670, 670, 670, 670, 670, nil, nil, nil, 670, + 670, nil, nil, nil, nil, nil, nil, 670, nil, 670, + 670, 670, 670, nil, 670, 670, 671, 671, 671, nil, + 671, nil, nil, nil, 671, 671, nil, nil, nil, 671, + nil, 671, 671, 671, 671, 671, 671, 671, nil, nil, + nil, nil, nil, 671, 671, 671, 671, 671, 671, 671, + nil, nil, 671, nil, nil, nil, nil, nil, nil, 671, + nil, nil, 671, 671, 671, 671, 671, 671, 671, 671, + nil, 671, 671, 671, nil, 671, 671, nil, 671, 671, + 671, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 671, nil, nil, 671, nil, nil, 671, 671, nil, nil, + 671, nil, nil, nil, nil, nil, 671, nil, nil, nil, + nil, nil, nil, nil, 671, nil, nil, nil, nil, 671, + 671, 671, 671, 671, 671, nil, nil, nil, 671, 671, + nil, nil, nil, nil, nil, nil, 671, nil, nil, 671, + 671, 671, nil, 671, 671, 672, 672, 672, nil, 672, + nil, nil, nil, 672, 672, nil, nil, nil, 672, nil, + 672, 672, 672, 672, 672, 672, 672, nil, nil, nil, + nil, nil, 672, 672, 672, 672, 672, 672, 672, nil, + nil, 672, nil, nil, nil, nil, nil, nil, 672, nil, + nil, 672, 672, 672, 672, 672, 672, 672, 672, nil, + 672, 672, 672, nil, 672, 672, nil, 672, 672, 672, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 672, + nil, nil, 672, nil, nil, 672, 672, nil, nil, 672, + nil, nil, nil, nil, nil, 672, nil, nil, nil, nil, + nil, nil, nil, 672, nil, nil, nil, nil, 672, 672, + 672, 672, 672, 672, nil, nil, nil, 672, 672, nil, + nil, nil, nil, nil, nil, 672, nil, nil, 672, 672, + 672, nil, 672, 672, 677, 677, 677, nil, 677, nil, + nil, nil, 677, 677, nil, nil, nil, 677, nil, 677, + 677, 677, 677, 677, 677, 677, nil, nil, nil, nil, + nil, 677, 677, 677, 677, 677, 677, 677, nil, nil, + 677, nil, nil, nil, nil, nil, nil, 677, nil, nil, + 677, 677, 677, 677, 677, 677, 677, 677, nil, 677, + 677, 677, nil, 677, 677, nil, 677, 677, 677, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 677, nil, + nil, 677, nil, nil, 677, 677, nil, nil, 677, nil, + nil, nil, nil, nil, 677, nil, nil, nil, nil, nil, + nil, nil, 677, nil, nil, nil, nil, 677, 677, 677, + 677, 677, 677, nil, nil, nil, 677, 677, nil, nil, + nil, nil, nil, nil, 677, nil, nil, 677, 677, 677, + nil, 677, 677, 678, 678, 678, nil, 678, nil, nil, + nil, 678, 678, nil, nil, nil, 678, nil, 678, 678, + 678, 678, 678, 678, 678, nil, nil, nil, nil, nil, + 678, 678, 678, 678, 678, 678, 678, nil, nil, 678, + nil, nil, nil, nil, nil, nil, 678, nil, nil, 678, + 678, 678, 678, 678, 678, 678, 678, nil, 678, 678, + 678, nil, 678, 678, nil, 678, 678, 678, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 678, nil, nil, + 678, nil, nil, 678, 678, nil, nil, 678, nil, nil, + nil, nil, nil, 678, nil, nil, nil, nil, nil, nil, + nil, 678, nil, nil, nil, nil, 678, 678, 678, 678, + 678, 678, nil, nil, nil, 678, 678, nil, nil, nil, + nil, nil, nil, 678, nil, nil, 678, 678, 678, nil, + 678, 678, 702, 702, 702, nil, 702, nil, nil, nil, + 702, 702, nil, nil, nil, 702, nil, 702, 702, 702, + 702, 702, 702, 702, nil, nil, nil, nil, nil, 702, + 702, 702, 702, 702, 702, 702, nil, nil, 702, nil, + nil, nil, nil, nil, nil, 702, nil, nil, 702, 702, + 702, 702, 702, 702, 702, 702, nil, 702, 702, 702, + nil, 702, 702, nil, 702, 702, 702, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 702, nil, nil, 702, + nil, nil, 702, 702, nil, nil, 702, nil, nil, nil, + nil, nil, 702, nil, nil, nil, nil, nil, nil, nil, + 702, nil, nil, nil, nil, 702, 702, 702, 702, 702, + 702, nil, nil, nil, 702, 702, nil, nil, nil, nil, + nil, nil, 702, nil, nil, 702, 702, 702, nil, 702, + 702, 708, 708, 708, nil, 708, nil, nil, nil, 708, + 708, nil, nil, nil, 708, nil, 708, 708, 708, 708, + 708, 708, 708, nil, nil, nil, nil, nil, 708, 708, + 708, 708, 708, 708, 708, nil, nil, 708, nil, nil, + nil, nil, nil, nil, 708, nil, nil, 708, 708, 708, + 708, 708, 708, 708, 708, nil, 708, 708, 708, nil, + 708, 708, nil, nil, nil, 708, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 708, nil, nil, 708, nil, + nil, 708, 708, nil, nil, 708, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 708, 708, 708, 708, 708, 708, + nil, nil, nil, 708, 708, nil, nil, nil, nil, nil, + nil, 708, nil, nil, 708, 708, 708, nil, 708, 708, + 719, 719, 719, nil, 719, nil, nil, nil, 719, 719, + nil, nil, nil, 719, nil, 719, 719, 719, 719, 719, + 719, 719, nil, nil, nil, nil, nil, 719, 719, 719, + 719, 719, 719, 719, nil, nil, 719, nil, nil, nil, + nil, nil, nil, 719, nil, nil, 719, 719, 719, 719, + 719, 719, 719, 719, nil, 719, 719, 719, nil, 719, + 719, nil, nil, nil, 719, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 719, nil, nil, 719, nil, nil, + 719, 719, nil, nil, 719, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 719, 719, 719, 719, 719, 719, nil, + nil, nil, 719, 719, nil, nil, nil, nil, nil, nil, + 719, nil, nil, 719, 719, 719, nil, 719, 719, 725, + 725, 725, nil, 725, nil, nil, nil, 725, 725, nil, + nil, nil, 725, nil, 725, 725, 725, 725, 725, 725, + 725, nil, nil, nil, nil, nil, 725, 725, 725, 725, + 725, 725, 725, nil, nil, 725, nil, nil, nil, nil, + nil, nil, 725, nil, nil, 725, 725, 725, 725, 725, + 725, 725, 725, nil, 725, 725, 725, nil, 725, 725, + nil, 725, 725, 725, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 725, nil, nil, 725, nil, nil, 725, + 725, nil, nil, 725, nil, 725, nil, nil, nil, 725, + nil, nil, nil, nil, nil, nil, nil, 725, nil, nil, + nil, nil, 725, 725, 725, 725, 725, 725, nil, nil, + nil, 725, 725, nil, nil, nil, nil, nil, nil, 725, + nil, nil, 725, 725, 725, nil, 725, 725, 730, 730, + 730, nil, 730, nil, nil, nil, 730, 730, nil, nil, + nil, 730, nil, 730, 730, 730, 730, 730, 730, 730, + nil, nil, nil, nil, nil, 730, 730, 730, 730, 730, + 730, 730, nil, nil, 730, nil, nil, nil, nil, nil, + nil, 730, nil, nil, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, nil, 730, 730, nil, + 730, 730, 730, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 730, nil, nil, 730, nil, nil, 730, 730, + nil, nil, 730, nil, 730, nil, nil, nil, 730, nil, + nil, nil, nil, nil, nil, nil, 730, nil, nil, nil, + nil, 730, 730, 730, 730, 730, 730, nil, nil, nil, + 730, 730, nil, nil, nil, nil, nil, nil, 730, nil, + 730, 730, 730, 730, nil, 730, 730, 733, 733, 733, + nil, 733, nil, nil, nil, 733, 733, nil, nil, nil, + 733, nil, 733, 733, 733, 733, 733, 733, 733, nil, + nil, nil, nil, nil, 733, 733, 733, 733, 733, 733, + 733, nil, nil, 733, nil, nil, nil, nil, nil, nil, + 733, nil, nil, 733, 733, 733, 733, 733, 733, 733, + 733, 733, 733, 733, 733, nil, 733, 733, nil, 733, + 733, 733, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 733, nil, nil, 733, nil, nil, 733, 733, nil, + nil, 733, nil, nil, nil, nil, nil, 733, nil, nil, + nil, nil, nil, nil, nil, 733, nil, nil, nil, nil, + 733, 733, 733, 733, 733, 733, nil, nil, nil, 733, + 733, nil, nil, nil, nil, nil, nil, 733, nil, 733, + 733, 733, 733, nil, 733, 733, 747, 747, 747, nil, + 747, nil, nil, nil, 747, 747, nil, nil, nil, 747, + nil, 747, 747, 747, 747, 747, 747, 747, nil, nil, + nil, nil, nil, 747, 747, 747, 747, 747, 747, 747, + nil, nil, 747, nil, nil, nil, nil, nil, nil, 747, + nil, nil, 747, 747, 747, 747, 747, 747, 747, 747, + nil, 747, 747, 747, nil, 747, 747, nil, 747, 747, + 747, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 747, nil, nil, 747, nil, nil, 747, 747, nil, nil, + 747, nil, 747, nil, nil, nil, 747, nil, nil, nil, + nil, nil, nil, nil, 747, nil, nil, nil, nil, 747, + 747, 747, 747, 747, 747, nil, nil, nil, 747, 747, + nil, nil, nil, nil, nil, nil, 747, nil, nil, 747, + 747, 747, nil, 747, 747, 759, 759, 759, nil, 759, + nil, nil, nil, 759, 759, nil, nil, nil, 759, nil, + 759, 759, 759, 759, 759, 759, 759, nil, nil, nil, + nil, nil, 759, 759, 759, 759, 759, 759, 759, nil, + nil, 759, nil, nil, nil, nil, nil, nil, 759, nil, + nil, 759, 759, 759, 759, 759, 759, 759, 759, nil, + 759, 759, 759, nil, 759, 759, nil, 759, 759, 759, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 759, + nil, nil, 759, nil, nil, 759, 759, nil, nil, 759, + nil, nil, nil, nil, nil, 759, nil, nil, nil, nil, + nil, nil, nil, 759, nil, nil, nil, nil, 759, 759, + 759, 759, 759, 759, nil, nil, nil, 759, 759, nil, + nil, nil, nil, nil, nil, 759, nil, nil, 759, 759, + 759, nil, 759, 759, 779, 779, 779, nil, 779, nil, + nil, nil, 779, 779, nil, nil, nil, 779, nil, 779, + 779, 779, 779, 779, 779, 779, nil, nil, nil, nil, + nil, 779, 779, 779, 779, 779, 779, 779, nil, nil, + 779, nil, nil, nil, nil, nil, nil, 779, nil, nil, + 779, 779, 779, 779, 779, 779, 779, 779, nil, 779, + 779, 779, nil, 779, 779, nil, 779, 779, 779, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 779, nil, + nil, 779, nil, nil, 779, 779, nil, nil, 779, nil, + nil, nil, nil, nil, 779, nil, nil, nil, nil, nil, + nil, nil, 779, nil, nil, nil, nil, 779, 779, 779, + 779, 779, 779, nil, nil, nil, 779, 779, nil, nil, + nil, nil, nil, nil, 779, nil, nil, 779, 779, 779, + nil, 779, 779, 801, 801, 801, nil, 801, nil, nil, + nil, 801, 801, nil, nil, nil, 801, nil, 801, 801, + 801, 801, 801, 801, 801, nil, nil, nil, nil, nil, + 801, 801, 801, 801, 801, 801, 801, nil, nil, 801, + nil, nil, nil, nil, nil, nil, 801, nil, nil, 801, + 801, 801, 801, 801, 801, 801, 801, nil, 801, 801, + 801, nil, 801, 801, nil, 801, 801, 801, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 801, nil, nil, + 801, nil, nil, 801, 801, nil, nil, 801, nil, nil, + nil, nil, nil, 801, nil, nil, nil, nil, nil, nil, + nil, 801, nil, nil, nil, nil, 801, 801, 801, 801, + 801, 801, nil, nil, nil, 801, 801, nil, nil, nil, + nil, nil, nil, 801, nil, nil, 801, 801, 801, nil, + 801, 801, 808, 808, 808, nil, 808, nil, nil, nil, + 808, 808, nil, nil, nil, 808, nil, 808, 808, 808, + 808, 808, 808, 808, nil, nil, nil, nil, nil, 808, + 808, 808, 808, 808, 808, 808, nil, nil, 808, nil, + nil, nil, nil, nil, nil, 808, nil, nil, 808, 808, + 808, 808, 808, 808, 808, 808, nil, 808, 808, 808, + nil, 808, 808, nil, 808, 808, 808, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 808, nil, nil, 808, + nil, nil, 808, 808, nil, nil, 808, nil, nil, nil, + nil, nil, 808, nil, nil, nil, nil, nil, nil, nil, + 808, nil, nil, nil, nil, 808, 808, 808, 808, 808, + 808, nil, nil, nil, 808, 808, nil, nil, nil, nil, + nil, nil, 808, nil, nil, 808, 808, 808, nil, 808, + 808, 821, 821, 821, nil, 821, nil, nil, nil, 821, + 821, nil, nil, nil, 821, nil, 821, 821, 821, 821, + 821, 821, 821, nil, nil, nil, nil, nil, 821, 821, + 821, 821, 821, 821, 821, nil, nil, 821, nil, nil, + nil, nil, nil, nil, 821, nil, nil, 821, 821, 821, + 821, 821, 821, 821, 821, nil, 821, 821, 821, nil, + 821, 821, nil, 821, 821, 821, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 821, nil, nil, 821, nil, + nil, 821, 821, nil, nil, 821, nil, nil, nil, nil, + nil, 821, nil, nil, nil, nil, nil, nil, nil, 821, + nil, nil, nil, nil, 821, 821, 821, 821, 821, 821, + nil, nil, nil, 821, 821, nil, nil, nil, nil, nil, + nil, 821, nil, nil, 821, 821, 821, nil, 821, 821, + 822, 822, 822, nil, 822, nil, nil, nil, 822, 822, + nil, nil, nil, 822, nil, 822, 822, 822, 822, 822, + 822, 822, nil, nil, nil, nil, nil, 822, 822, 822, + 822, 822, 822, 822, nil, nil, 822, nil, nil, nil, + nil, nil, nil, 822, nil, nil, 822, 822, 822, 822, + 822, 822, 822, 822, nil, 822, 822, 822, nil, 822, + 822, nil, 822, 822, 822, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 822, nil, nil, 822, nil, nil, + 822, 822, nil, nil, 822, nil, nil, nil, nil, nil, + 822, nil, nil, nil, nil, nil, nil, nil, 822, nil, + nil, nil, nil, 822, 822, 822, 822, 822, 822, nil, + nil, nil, 822, 822, nil, nil, nil, nil, nil, nil, + 822, nil, nil, 822, 822, 822, nil, 822, 822, 823, + 823, 823, nil, 823, nil, nil, nil, 823, 823, nil, + nil, nil, 823, nil, 823, 823, 823, 823, 823, 823, + 823, nil, nil, nil, nil, nil, 823, 823, 823, 823, + 823, 823, 823, nil, nil, 823, nil, nil, nil, nil, + nil, nil, 823, nil, nil, 823, 823, 823, 823, 823, + 823, 823, 823, nil, 823, 823, 823, nil, 823, 823, + nil, 823, 823, 823, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 823, nil, nil, 823, nil, nil, 823, + 823, nil, nil, 823, nil, nil, nil, nil, nil, 823, + nil, nil, nil, nil, nil, nil, nil, 823, nil, nil, + nil, nil, 823, 823, 823, 823, 823, 823, nil, nil, + nil, 823, 823, nil, nil, nil, nil, nil, nil, 823, + nil, nil, 823, 823, 823, nil, 823, 823, 824, 824, + 824, nil, 824, nil, nil, nil, 824, 824, nil, nil, + nil, 824, nil, 824, 824, 824, 824, 824, 824, 824, + nil, nil, nil, nil, nil, 824, 824, 824, 824, 824, + 824, 824, nil, nil, 824, nil, nil, nil, nil, nil, + nil, 824, nil, nil, 824, 824, 824, 824, 824, 824, + 824, 824, nil, 824, 824, 824, nil, 824, 824, nil, + 824, 824, 824, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 824, nil, nil, 824, nil, nil, 824, 824, + nil, nil, 824, nil, nil, nil, nil, nil, 824, nil, + nil, nil, nil, nil, nil, nil, 824, nil, nil, nil, + nil, 824, 824, 824, 824, 824, 824, nil, nil, nil, + 824, 824, nil, nil, nil, nil, nil, nil, 824, nil, + nil, 824, 824, 824, nil, 824, 824, 826, 826, 826, + nil, 826, nil, nil, nil, 826, 826, nil, nil, nil, + 826, nil, 826, 826, 826, 826, 826, 826, 826, nil, + nil, nil, nil, nil, 826, 826, 826, 826, 826, 826, + 826, nil, nil, 826, nil, nil, nil, nil, nil, nil, + 826, nil, nil, 826, 826, 826, 826, 826, 826, 826, + 826, nil, 826, 826, 826, nil, 826, 826, nil, 826, + 826, 826, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 826, nil, nil, 826, nil, nil, 826, 826, nil, + nil, 826, nil, nil, nil, nil, nil, 826, nil, nil, + nil, nil, nil, nil, nil, 826, nil, nil, nil, nil, + 826, 826, 826, 826, 826, 826, nil, nil, nil, 826, + 826, nil, nil, nil, nil, nil, nil, 826, nil, nil, + 826, 826, 826, nil, 826, 826, 858, 858, 858, nil, + 858, nil, nil, nil, 858, 858, nil, nil, nil, 858, + nil, 858, 858, 858, 858, 858, 858, 858, nil, nil, + nil, nil, nil, 858, 858, 858, 858, 858, 858, 858, + nil, nil, 858, nil, nil, nil, nil, nil, nil, 858, + nil, nil, 858, 858, 858, 858, 858, 858, 858, 858, + nil, 858, 858, 858, nil, 858, 858, nil, 858, 858, + 858, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 858, nil, nil, 858, nil, nil, 858, 858, nil, nil, + 858, nil, nil, nil, nil, nil, 858, nil, nil, nil, + nil, nil, nil, nil, 858, nil, nil, nil, nil, 858, + 858, 858, 858, 858, 858, nil, nil, nil, 858, 858, + nil, nil, nil, nil, nil, nil, 858, nil, nil, 858, + 858, 858, nil, 858, 858, 865, 865, 865, nil, 865, + nil, nil, nil, 865, 865, nil, nil, nil, 865, nil, + 865, 865, 865, 865, 865, 865, 865, nil, nil, nil, + nil, nil, 865, 865, 865, 865, 865, 865, 865, nil, + nil, 865, nil, nil, nil, nil, nil, nil, 865, nil, + nil, 865, 865, 865, 865, 865, 865, 865, 865, nil, + 865, 865, 865, nil, 865, 865, nil, 865, 865, 865, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 865, + nil, nil, 865, nil, nil, 865, 865, nil, nil, 865, + nil, nil, nil, nil, nil, 865, nil, nil, nil, nil, + nil, nil, nil, 865, nil, nil, nil, nil, 865, 865, + 865, 865, 865, 865, nil, nil, nil, 865, 865, nil, + nil, nil, nil, nil, nil, 865, nil, nil, 865, 865, + 865, nil, 865, 865, 913, 913, 913, nil, 913, nil, + nil, nil, 913, 913, nil, nil, nil, 913, nil, 913, + 913, 913, 913, 913, 913, 913, nil, nil, nil, nil, + nil, 913, 913, 913, 913, 913, 913, 913, nil, nil, + 913, nil, nil, nil, nil, nil, nil, 913, nil, nil, + 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, + 913, 913, nil, 913, 913, nil, 913, 913, 913, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 913, nil, + nil, 913, nil, nil, 913, 913, nil, nil, 913, nil, + nil, nil, 913, nil, 913, nil, nil, nil, nil, nil, + nil, nil, 913, nil, nil, nil, nil, 913, 913, 913, + 913, 913, 913, nil, nil, nil, 913, 913, nil, nil, + nil, nil, nil, nil, 913, nil, 913, 913, 913, 913, + nil, 913, 913, 914, 914, 914, nil, 914, nil, nil, + nil, 914, 914, nil, nil, nil, 914, nil, 914, 914, + 914, 914, 914, 914, 914, nil, nil, nil, nil, nil, + 914, 914, 914, 914, 914, 914, 914, nil, nil, 914, + nil, nil, nil, nil, nil, nil, 914, nil, nil, 914, + 914, 914, 914, 914, 914, 914, 914, nil, 914, 914, + 914, nil, 914, 914, nil, 914, 914, 914, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 914, nil, nil, + 914, nil, nil, 914, 914, nil, nil, 914, nil, nil, + nil, nil, nil, 914, nil, nil, nil, nil, nil, nil, + nil, 914, nil, nil, nil, nil, 914, 914, 914, 914, + 914, 914, nil, nil, nil, 914, 914, nil, nil, nil, + nil, nil, nil, 914, nil, nil, 914, 914, 914, nil, + 914, 914, 926, 926, 926, nil, 926, nil, nil, nil, + 926, 926, nil, nil, nil, 926, nil, 926, 926, 926, + 926, 926, 926, 926, nil, nil, nil, nil, nil, 926, + 926, 926, 926, 926, 926, 926, nil, nil, 926, nil, + nil, nil, nil, nil, nil, 926, nil, nil, 926, 926, + 926, 926, 926, 926, 926, 926, nil, 926, 926, 926, + nil, 926, 926, nil, nil, nil, 926, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 926, nil, nil, 926, + nil, nil, 926, 926, nil, nil, 926, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 926, 926, 926, 926, 926, + 926, nil, nil, nil, 926, 926, nil, nil, nil, nil, + nil, nil, 926, nil, nil, 926, 926, 926, nil, 926, + 926, 935, 935, 935, nil, 935, nil, nil, nil, 935, + 935, nil, nil, nil, 935, nil, 935, 935, 935, 935, + 935, 935, 935, nil, nil, nil, nil, nil, 935, 935, + 935, 935, 935, 935, 935, nil, nil, 935, nil, nil, + nil, nil, nil, nil, 935, nil, nil, 935, 935, 935, + 935, 935, 935, 935, 935, nil, 935, 935, 935, nil, + 935, 935, nil, nil, nil, 935, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 935, nil, nil, 935, nil, + nil, 935, 935, nil, nil, 935, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 935, 935, 935, 935, 935, 935, + nil, nil, nil, 935, 935, nil, nil, nil, nil, nil, + nil, 935, nil, nil, 935, 935, 935, nil, 935, 935, + 943, 943, 943, nil, 943, nil, nil, nil, 943, 943, + nil, nil, nil, 943, nil, 943, 943, 943, 943, 943, + 943, 943, nil, nil, nil, nil, nil, 943, 943, 943, + 943, 943, 943, 943, nil, nil, 943, nil, nil, nil, + nil, nil, nil, 943, nil, nil, 943, 943, 943, 943, + 943, 943, 943, 943, nil, 943, 943, 943, nil, 943, + 943, nil, 943, 943, 943, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 943, nil, nil, 943, nil, nil, + 943, 943, nil, nil, 943, nil, 943, nil, nil, nil, + 943, nil, nil, nil, nil, nil, nil, nil, 943, nil, + nil, nil, nil, 943, 943, 943, 943, 943, 943, nil, + nil, nil, 943, 943, nil, nil, nil, nil, nil, nil, + 943, nil, nil, 943, 943, 943, nil, 943, 943, 984, + 984, 984, nil, 984, nil, nil, nil, 984, 984, nil, + nil, nil, 984, nil, 984, 984, 984, 984, 984, 984, + 984, nil, nil, nil, nil, nil, 984, 984, 984, 984, + 984, 984, 984, nil, nil, 984, nil, nil, nil, nil, + nil, nil, 984, nil, nil, 984, 984, 984, 984, 984, + 984, 984, 984, nil, 984, 984, 984, nil, 984, 984, + nil, nil, nil, 984, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 984, nil, nil, 984, nil, nil, 984, + 984, nil, nil, 984, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 984, 984, 984, 984, 984, 984, nil, nil, + nil, 984, 984, nil, nil, nil, nil, nil, nil, 984, + nil, nil, 984, 984, 984, nil, 984, 984, 998, 998, + 998, nil, 998, nil, nil, nil, 998, 998, nil, nil, + nil, 998, nil, 998, 998, 998, 998, 998, 998, 998, + nil, nil, nil, nil, nil, 998, 998, 998, 998, 998, + 998, 998, nil, nil, 998, nil, nil, nil, nil, nil, + nil, 998, nil, nil, 998, 998, 998, 998, 998, 998, + 998, 998, nil, 998, 998, 998, nil, 998, 998, nil, + 998, 998, 998, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 998, nil, nil, 998, nil, nil, 998, 998, + nil, nil, 998, nil, nil, nil, nil, nil, 998, nil, + nil, nil, nil, nil, nil, nil, 998, nil, nil, nil, + nil, 998, 998, 998, 998, 998, 998, nil, nil, nil, + 998, 998, nil, nil, nil, nil, nil, nil, 998, nil, + nil, 998, 998, 998, nil, 998, 998, 1029, 1029, 1029, + nil, 1029, nil, nil, nil, 1029, 1029, nil, nil, nil, + 1029, nil, 1029, 1029, 1029, 1029, 1029, 1029, 1029, nil, + nil, nil, nil, nil, 1029, 1029, 1029, 1029, 1029, 1029, + 1029, nil, nil, 1029, nil, nil, nil, nil, nil, nil, + 1029, nil, nil, 1029, 1029, 1029, 1029, 1029, 1029, 1029, + 1029, 1029, 1029, 1029, 1029, nil, 1029, 1029, nil, 1029, + 1029, 1029, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1029, nil, nil, 1029, nil, nil, 1029, 1029, nil, + nil, 1029, nil, 1029, nil, 1029, nil, 1029, nil, nil, + nil, nil, nil, nil, nil, 1029, nil, nil, nil, nil, + 1029, 1029, 1029, 1029, 1029, 1029, nil, nil, nil, 1029, + 1029, nil, nil, nil, nil, nil, nil, 1029, nil, 1029, + 1029, 1029, 1029, nil, 1029, 1029, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + nil, nil, nil, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, nil, nil, nil, nil, nil, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, nil, 11, + nil, nil, nil, nil, nil, nil, nil, nil, 11, 11, + nil, 11, 11, 11, 11, 11, 11, 11, nil, nil, + 11, 11, nil, nil, nil, 11, 11, 11, 11, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 11, 11, nil, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, nil, nil, 11, 11, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 11, + nil, nil, nil, nil, nil, nil, nil, nil, 11, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, nil, nil, nil, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, nil, nil, nil, nil, + nil, 12, 12, 12, 12, 12, 12, 12, 12, 12, + nil, nil, 12, nil, nil, nil, nil, nil, nil, nil, + nil, 12, 12, nil, 12, 12, 12, 12, 12, 12, + 12, nil, nil, 12, 12, nil, nil, nil, 12, 12, + 12, 12, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 12, 12, nil, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, nil, + nil, 12, 12, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 12, nil, nil, nil, nil, nil, nil, nil, + nil, 12, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, nil, nil, nil, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, nil, + nil, nil, nil, nil, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, nil, 75, nil, nil, + nil, nil, nil, nil, 75, 75, nil, 75, 75, 75, + 75, 75, 75, 75, nil, nil, 75, 75, nil, nil, + nil, 75, 75, 75, 75, nil, nil, nil, nil, nil, + 75, nil, nil, nil, nil, nil, nil, nil, 75, 75, + nil, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, nil, nil, 75, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 75, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, nil, + nil, nil, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, nil, nil, nil, nil, nil, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, nil, + 105, nil, nil, nil, nil, nil, nil, 105, 105, nil, + 105, 105, 105, 105, 105, 105, 105, nil, nil, 105, + 105, nil, nil, nil, 105, 105, 105, 105, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 105, nil, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, nil, nil, 105, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 426, nil, nil, nil, 426, 426, 426, 426, 426, + 426, 426, 426, 426, 426, nil, nil, nil, nil, nil, + 426, 426, 426, 426, 426, 426, 426, 426, 426, nil, + nil, 426, nil, nil, nil, nil, nil, nil, nil, nil, + 426, 426, nil, 426, 426, 426, 426, 426, 426, 426, + nil, nil, 426, 426, nil, nil, nil, 426, 426, 426, + 426, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 426, 426, nil, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, nil, nil, + 426, 426, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 426, nil, nil, nil, nil, nil, nil, nil, nil, + 426, 658, 658, 658, 658, 658, 658, 658, 658, 658, + 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, + 658, 658, 658, 658, 658, nil, nil, nil, 658, 658, + 658, 658, 658, 658, 658, 658, 658, 658, nil, nil, + nil, nil, nil, 658, 658, 658, 658, 658, 658, 658, + 658, 658, nil, nil, 658, nil, nil, nil, nil, nil, + nil, nil, nil, 658, 658, nil, 658, 658, 658, 658, + 658, 658, 658, nil, nil, 658, 658, nil, nil, nil, + 658, 658, 658, 658, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 658, 658, nil, + 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, + 658, nil, nil, 658, 658, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 658, nil, nil, nil, nil, nil, + nil, nil, nil, 658, 765, 765, 765, 765, 765, 765, + 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 765, 765, 765, 765, 765, 765, nil, nil, + nil, 765, 765, 765, 765, 765, 765, 765, 765, 765, + 765, nil, nil, nil, nil, nil, 765, 765, 765, 765, + 765, 765, 765, 765, 765, nil, nil, 765, nil, nil, + nil, nil, nil, nil, nil, nil, 765, 765, nil, 765, + 765, 765, 765, 765, 765, 765, nil, nil, 765, 765, + nil, nil, nil, 765, 765, 765, 765, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 765, 765, nil, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 765, 765, nil, nil, 765, nil, nil, nil, + nil, 228, 228, nil, nil, 228, nil, nil, nil, nil, + nil, nil, nil, nil, 228, 228, 765, 228, 228, 228, + 228, 228, 228, 228, nil, nil, 228, 228, nil, nil, + nil, 228, 228, 228, 228, nil, nil, nil, nil, nil, + 228, nil, nil, nil, nil, nil, nil, nil, 228, 228, + nil, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, nil, nil, 228, nil, nil, nil, nil, 229, + 229, nil, nil, 229, nil, nil, nil, nil, nil, nil, + nil, nil, 229, 229, 228, 229, 229, 229, 229, 229, + 229, 229, nil, nil, 229, 229, nil, nil, nil, 229, + 229, 229, 229, nil, nil, nil, nil, nil, 229, nil, + nil, nil, nil, nil, nil, nil, 229, 229, nil, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + nil, nil, 229, nil, nil, nil, nil, 477, 477, nil, + nil, 477, nil, nil, nil, nil, nil, nil, nil, nil, + 477, 477, 229, 477, 477, 477, 477, 477, 477, 477, + nil, nil, 477, 477, nil, nil, nil, 477, 477, 477, + 477, nil, nil, nil, nil, nil, 477, nil, nil, nil, + nil, nil, nil, nil, 477, 477, nil, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, nil, nil, + 477, nil, nil, nil, nil, 478, 478, nil, nil, 478, + nil, nil, nil, nil, nil, nil, nil, nil, 478, 478, + 477, 478, 478, 478, 478, 478, 478, 478, nil, nil, + 478, 478, nil, nil, nil, 478, 478, 478, 478, nil, + nil, nil, nil, nil, 478, nil, nil, nil, nil, nil, + nil, nil, 478, 478, nil, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, nil, nil, 478, nil, + nil, nil, nil, 542, 542, nil, nil, 542, nil, nil, + nil, nil, nil, nil, nil, nil, 542, 542, 478, 542, + 542, 542, 542, 542, 542, 542, nil, nil, 542, 542, + nil, nil, nil, 542, 542, 542, 542, nil, nil, nil, + nil, nil, 542, nil, nil, nil, nil, nil, nil, nil, + 542, 542, nil, 542, 542, 542, 542, 542, 542, 542, + 542, 542, 542, 542, nil, nil, 542, nil, nil, nil, + nil, 543, 543, nil, nil, 543, nil, nil, nil, nil, + nil, nil, nil, nil, 543, 543, 542, 543, 543, 543, + 543, 543, 543, 543, nil, nil, 543, 543, nil, nil, + nil, 543, 543, 543, 543, nil, nil, nil, nil, nil, + 543, nil, nil, nil, nil, nil, nil, nil, 543, 543, + nil, 543, 543, 543, 543, 543, 543, 543, 543, 543, + 543, 543, nil, nil, 543, nil, nil, nil, nil, 552, + 552, nil, nil, 552, nil, nil, nil, nil, nil, nil, + nil, nil, 552, 552, 543, 552, 552, 552, 552, 552, + 552, 552, nil, nil, 552, 552, nil, nil, nil, 552, + 552, 552, 552, nil, nil, nil, nil, nil, 552, nil, + nil, nil, nil, nil, nil, nil, 552, 552, nil, 552, + 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, + nil, nil, 552, nil, nil, nil, nil, 553, 553, nil, + nil, 553, nil, nil, nil, nil, nil, nil, nil, nil, + 553, 553, 552, 553, 553, 553, 553, 553, 553, 553, + nil, nil, 553, 553, nil, nil, nil, 553, 553, 553, + 553, nil, nil, nil, nil, nil, 553, nil, nil, nil, + nil, nil, nil, nil, 553, 553, nil, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, nil, nil, + 553, nil, nil, nil, nil, 581, 581, nil, nil, 581, + nil, nil, nil, nil, nil, nil, nil, nil, 581, 581, + 553, 581, 581, 581, 581, 581, 581, 581, nil, nil, + 581, 581, nil, nil, nil, 581, 581, 581, 581, nil, + nil, nil, nil, nil, 581, nil, nil, nil, nil, nil, + nil, nil, 581, 581, nil, 581, 581, 581, 581, 581, + 581, 581, 581, 581, 581, 581, nil, nil, 581, nil, + nil, nil, nil, 582, 582, nil, nil, 582, nil, nil, + nil, nil, nil, nil, nil, nil, 582, 582, 581, 582, + 582, 582, 582, 582, 582, 582, nil, nil, 582, 582, + nil, nil, nil, 582, 582, 582, 582, nil, nil, nil, + nil, nil, 582, nil, nil, nil, nil, nil, nil, nil, + 582, 582, nil, 582, 582, 582, 582, 582, 582, 582, + 582, 582, 582, 582, nil, nil, 582, nil, nil, nil, + nil, 588, 588, nil, nil, 588, nil, nil, nil, nil, + nil, nil, nil, nil, 588, 588, 582, 588, 588, 588, + 588, 588, 588, 588, nil, nil, 588, 588, nil, nil, + nil, 588, 588, 588, 588, nil, nil, nil, nil, nil, + 588, nil, nil, nil, nil, nil, nil, nil, 588, 588, + nil, 588, 588, 588, 588, 588, 588, 588, 588, 588, + 588, 588, nil, nil, 588, nil, nil, nil, nil, 589, + 589, nil, nil, 589, nil, nil, nil, nil, nil, nil, + nil, nil, 589, 589, 588, 589, 589, 589, 589, 589, + 589, 589, nil, nil, 589, 589, nil, nil, nil, 589, + 589, 589, 589, nil, nil, nil, nil, nil, 589, nil, + nil, nil, nil, nil, nil, nil, 589, 589, nil, 589, + 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, + nil, nil, 589, nil, nil, nil, nil, 664, 664, nil, + nil, 664, nil, nil, nil, nil, nil, nil, nil, nil, + 664, 664, 589, 664, 664, 664, 664, 664, 664, 664, + nil, nil, 664, 664, nil, nil, nil, 664, 664, 664, + 664, nil, nil, nil, nil, nil, 664, nil, nil, nil, + nil, nil, nil, nil, 664, 664, nil, 664, 664, 664, + 664, 664, 664, 664, 664, 664, 664, 664, nil, nil, + 664, nil, nil, nil, nil, 665, 665, nil, nil, 665, + nil, nil, nil, nil, nil, nil, nil, nil, 665, 665, + 664, 665, 665, 665, 665, 665, 665, 665, nil, nil, + 665, 665, nil, nil, nil, 665, 665, 665, 665, nil, + nil, nil, nil, nil, 665, nil, nil, nil, nil, nil, + nil, nil, 665, 665, nil, 665, 665, 665, 665, 665, + 665, 665, 665, 665, 665, 665, nil, 978, 665, 978, + 978, 978, 978, 978, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 978, nil, nil, nil, nil, 665, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 978, 1025, 1025, nil, nil, + 1025, nil, nil, nil, 978, 978, 978, 978, nil, 1025, + 1025, nil, 1025, 1025, 1025, 1025, 1025, 1025, 1025, nil, + nil, 1025, 1025, nil, nil, nil, 1025, 1025, 1025, 1025, + nil, nil, nil, nil, nil, 1025, nil, nil, nil, nil, + 978, nil, nil, 1025, 1025, nil, 1025, 1025, 1025, 1025, + 1025, 1025, 1025, 1025, 1025, 1025, 1025, nil, nil, 1025, + nil, nil, nil, nil, 1030, 1030, nil, nil, 1030, nil, + nil, nil, nil, nil, nil, nil, nil, 1030, 1030, 1025, + 1030, 1030, 1030, 1030, 1030, 1030, 1030, nil, nil, 1030, + 1030, nil, nil, nil, 1030, 1030, 1030, 1030, nil, nil, + nil, nil, nil, 1030, nil, nil, nil, nil, nil, nil, + nil, 1030, 1030, nil, 1030, 1030, 1030, 1030, 1030, 1030, + 1030, 1030, 1030, 1030, 1030, nil, nil, 1030, nil, nil, + nil, nil, 1031, 1031, nil, nil, 1031, nil, nil, nil, + nil, nil, nil, nil, nil, 1031, 1031, 1030, 1031, 1031, + 1031, 1031, 1031, 1031, 1031, nil, nil, 1031, 1031, nil, + nil, nil, 1031, 1031, 1031, 1031, nil, nil, nil, nil, + nil, 1031, nil, nil, nil, nil, nil, nil, nil, 1031, + 1031, nil, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, + 1031, 1031, 1031, nil, 1049, 1031, 1049, 1049, 1049, 1049, + 1049, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1049, nil, nil, nil, nil, 1031, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1049, nil, nil, nil, nil, nil, nil, nil, + nil, 1049, 1049, 1049, 1049, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1049 ] + +racc_action_pointer = [ + nil, 15, 1066, 34, nil, 435, nil, nil, 5125, 797, + nil, 23544, 23677, -67, nil, -85, -56, 493, 9, 100, + 147, nil, -80, 5264, 1346, 87, nil, -34, nil, 75, + 5398, 5526, 5656, 5795, 5934, nil, 1206, 6073, 6212, nil, + 66, 181, 259, 197, 185, 6351, 6490, 577, 6629, 170, + 439, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 6763, nil, 6900, nil, nil, -22, nil, 7039, 7178, nil, + nil, 7317, 7456, 7595, 7734, 23810, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 97, nil, nil, nil, nil, nil, nil, 184, + 186, 198, 200, nil, nil, 23943, nil, nil, nil, nil, + nil, nil, 0, nil, nil, 132, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 7873, nil, + nil, nil, nil, 8012, 8151, 8290, 8429, 8568, 238, nil, + 492, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 230, + nil, 1346, 8707, 8846, 8985, 9124, 9263, 9402, 24410, 24478, + nil, 9541, 9680, 9819, nil, nil, 536, -81, 83, 367, + 155, 282, 367, nil, 9958, 1486, 368, 10097, 10236, 10375, + 10514, 10653, 10792, 10931, 11070, 11209, 11348, 11487, 11626, 11765, + 11904, 12043, 12182, 12321, 12460, 12599, 12738, 12877, 13016, nil, + nil, nil, nil, 13155, nil, nil, nil, 16468, nil, nil, + 381, 13294, 13433, nil, nil, nil, nil, nil, nil, nil, + nil, 13572, nil, 1486, nil, 353, 355, nil, 13711, 398, + 13850, nil, 13989, 14128, nil, nil, 461, nil, nil, 14267, + 1191, nil, 346, 1626, 368, 405, 391, 14406, 1766, 620, + 725, 726, 476, 764, nil, 449, 421, 77, nil, nil, + nil, 483, 187, 457, 14545, nil, 289, 527, 795, nil, + 542, 14684, nil, 14823, 1906, 1331, 492, 14962, 15101, nil, + 526, -11, -10, 15240, 2046, 2186, 512, 604, 493, 5, + 6, 796, 573, 7, 629, nil, nil, 172, 267, 323, + nil, 800, nil, 564, 15379, nil, nil, nil, 103, 113, + 203, 213, 230, 233, 302, 335, 368, nil, 372, nil, + nil, 459, nil, 262, nil, 306, nil, 133, nil, 572, + 326, nil, 597, 339, nil, 600, -42, nil, 601, -41, + nil, 370, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 24076, nil, nil, nil, + nil, 613, nil, nil, 620, 15518, 621, nil, nil, 610, + nil, 850, 222, nil, nil, nil, 1066, nil, nil, nil, + nil, nil, 1206, 630, nil, nil, 629, 631, 313, 356, + 6900, nil, nil, nil, 264, 396, 682, nil, nil, 15652, + 15784, nil, nil, nil, -16, nil, 691, 24546, 24614, 15917, + 269, 16056, 16195, 16334, 2186, 2326, 341, 714, 716, 717, + 718, 727, 955, 3586, 3610, 2466, 2606, 2746, 2886, 3026, + 3166, -50, 485, 3306, 3446, 1626, 742, 786, nil, 16468, + nil, nil, nil, nil, 670, nil, nil, nil, 671, nil, + nil, 16594, nil, nil, 16733, nil, 16872, nil, nil, nil, + nil, 17011, 1471, 695, 688, 686, nil, nil, 687, 17150, + 701, 17289, 24682, 24750, 851, 740, nil, 17428, 715, nil, + 17567, 17706, 24818, 24886, 872, 1766, 17845, 843, 843, 728, + nil, nil, 392, 417, 729, 743, nil, 451, 794, 2326, + 872, nil, 2466, 24, 878, 879, 876, 893, nil, nil, + 17984, 24954, 25022, 8, nil, nil, 863, nil, 25090, 25158, + 18123, nil, nil, nil, 615, 2606, 822, nil, nil, nil, + 18262, nil, 591, nil, 787, 793, nil, 796, 797, 798, + nil, nil, nil, nil, nil, nil, nil, 804, 528, nil, + nil, 18401, nil, nil, nil, 896, nil, nil, nil, 907, + nil, nil, 911, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 172, nil, nil, 191, nil, nil, + nil, 838, nil, nil, 839, nil, 2746, nil, 24209, nil, + 841, 18540, 18679, 18818, 25226, 25294, 18957, 390, 879, 19096, + 19235, 19374, 19513, 883, nil, nil, nil, 19652, 19791, 885, + nil, nil, nil, 273, 275, 528, 660, 859, 858, nil, + 105, 962, 64, nil, nil, 877, nil, 997, nil, 881, + nil, 925, 19930, nil, nil, nil, nil, -104, 20069, 885, + nil, 890, 127, 153, 929, 304, 894, 930, 895, 20208, + nil, 959, -14, 178, nil, 20347, nil, nil, nil, nil, + 20486, nil, nil, 20625, nil, nil, nil, 650, nil, 1020, + nil, nil, nil, nil, nil, 1036, nil, 20764, 921, 24, + 28, 93, 138, 2886, 329, 927, nil, 923, 3026, 20903, + 585, 1043, 3166, 723, 853, 24342, 56, 30, 937, 219, + nil, nil, 582, 5362, nil, 5490, nil, 5308, nil, 21042, + nil, 624, nil, 935, 936, 860, 947, nil, nil, nil, + nil, 1049, 3306, nil, nil, nil, nil, nil, 961, nil, + 949, 21181, 953, 310, 347, 792, 924, 1906, 21320, nil, + 951, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 21459, 21598, 21737, 21876, 364, 22015, nil, nil, 6727, + nil, 3446, nil, nil, 977, nil, 115, nil, nil, nil, + 963, 205, nil, nil, nil, nil, nil, nil, 3586, nil, + 964, 1006, nil, nil, 536, 1096, nil, nil, 22154, nil, + 3726, 1113, nil, nil, nil, 22293, -7, 35, 1117, nil, + 1120, 615, nil, nil, 1139, 1027, 644, nil, nil, nil, + 3866, 4006, 1025, 1031, 1032, nil, nil, nil, 1037, 1049, + nil, 1050, 1059, nil, 1060, nil, nil, 1066, 664, 9, + nil, nil, nil, nil, nil, nil, nil, 1056, nil, 1070, + 369, nil, nil, 22432, 22571, 2046, 1071, 1085, nil, 1086, + 1089, 1090, nil, 1111, 1096, 1100, 22710, nil, nil, nil, + nil, 4146, 4286, nil, -8, 22849, nil, nil, nil, -1, + nil, nil, nil, 22988, 4426, nil, nil, nil, 4566, nil, + nil, nil, 1153, 1132, 1237, 989, nil, nil, 15616, nil, + 6094, nil, 6233, nil, 6673, nil, nil, nil, nil, 1118, + 1119, nil, 325, nil, nil, 15715, nil, nil, 25356, nil, + 7477, nil, nil, 1153, 23127, 865, 1211, nil, 1261, 4706, + 963, 997, 1066, 1232, 1069, nil, 4846, nil, 23266, 271, + 1279, 4986, nil, nil, 583, nil, nil, nil, 1164, 1165, + 1168, 1172, 521, 653, 1174, nil, nil, 1177, 1189, 1190, + 1191, nil, 1198, nil, 1102, 25395, nil, nil, 1321, 23405, + 25463, 25531, 1119, 680, nil, nil, nil, nil, nil, 1320, + nil, 1332, 7616, nil, nil, nil, nil, 1203, nil, 25593, + nil, 7755, nil, 14427, nil, 14566, nil, nil, 1244, 1245, + nil, 1210, 21, 23, 53, 1206, nil, nil, nil, 1208, + 1210, 1211, 1215, 1224, 35, nil, 15562, nil, nil, nil, + nil, 1225, nil ] + +racc_action_default = [ + -1, -642, -641, -642, -2, -628, -4, -5, -642, -8, + -9, -642, -642, -642, -36, -642, -642, -40, -642, -642, + -291, -51, -630, -642, -56, -61, -62, -63, -67, -268, + -268, -268, -306, -336, -337, -79, -641, -83, -91, -93, + -642, -532, -533, -642, -642, -642, -642, -227, -642, -630, + -241, -282, -283, -284, -285, -286, -287, -288, -289, -290, + -615, -293, -295, -302, -304, -314, -316, -642, -642, -58, + -58, -628, -642, -642, -642, -642, -338, -339, -341, -342, + -343, -344, -345, -346, -347, -348, -349, -350, -359, -414, + -462, -463, -464, -465, -466, -641, -469, -641, -641, -641, + -641, -641, -641, -505, -506, -641, -508, -514, -516, -517, + -518, -519, -613, -521, -522, -614, -524, -525, -526, -527, + -528, -529, -530, -531, -536, -537, 1083, -3, -629, -637, + -638, -639, -7, -642, -642, -642, -642, -642, -642, -24, + -642, -122, -123, -124, -125, -126, -127, -128, -132, -133, + -134, -135, -136, -137, -138, -139, -140, -141, -142, -143, + -144, -145, -146, -147, -148, -149, -150, -151, -152, -153, + -154, -155, -156, -157, -158, -159, -160, -161, -162, -163, + -164, -165, -166, -167, -168, -169, -170, -171, -172, -173, + -174, -175, -176, -177, -178, -179, -180, -181, -182, -183, + -184, -185, -186, -187, -188, -189, -190, -191, -192, -193, + -194, -195, -196, -197, -198, -199, -200, -201, -202, -29, + -129, -641, -642, -642, -642, -642, -642, -641, -642, -642, + -625, -642, -642, -630, -631, -55, -642, -532, -533, -642, + -291, -642, -642, -233, -642, -641, -642, -642, -642, -642, + -642, -642, -642, -642, -642, -642, -642, -642, -642, -642, + -642, -642, -642, -642, -642, -642, -642, -642, -642, -242, + -243, -244, -245, -642, -352, -442, -422, -642, -626, -627, + -68, -641, -642, -313, -351, -426, -435, -437, -74, -432, + -75, -630, -76, -248, -263, -641, -641, -267, -642, -273, + -642, -608, -642, -642, -77, -78, -628, -17, -18, -642, + -21, -22, -81, -641, -630, -642, -84, -87, -641, -99, + -100, -642, -642, -107, -306, -309, -630, -642, -336, -337, + -340, -433, -642, -89, -642, -95, -301, -515, -642, -221, + -222, -642, -234, -642, -641, -297, -630, -641, -641, -315, + -57, -642, -642, -642, -641, -641, -628, -642, -629, -532, + -533, -642, -642, -291, -642, -369, -370, -117, -118, -642, + -120, -642, -291, -641, -642, -532, -533, -329, -122, -123, + -162, -163, -164, -180, -185, -192, -195, -331, -642, -603, + -604, -564, -467, -642, -490, -642, -492, -642, -494, -642, + -642, -474, -642, -642, -480, -642, -642, -486, -642, -642, + -488, -642, -507, -509, -510, -511, -512, -6, -640, -30, + -31, -32, -33, -34, -10, -11, -642, -26, -27, -28, + -130, -642, -37, -39, -278, -642, -642, -277, -38, -642, + -41, -642, -291, -49, -50, -203, -253, -273, -52, -53, + -42, -204, -253, -630, -258, -259, -641, -641, -616, -617, + -268, -430, -618, -619, -617, -616, -268, -429, -431, -618, + -619, -48, -211, -54, -630, -312, -642, -642, -642, -641, + -301, -642, -642, -642, -212, -213, -214, -215, -216, -217, + -218, -219, -223, -224, -225, -226, -228, -229, -230, -231, + -232, -235, -236, -237, -238, -630, -246, -642, -443, -268, + -616, -617, -65, -69, -630, -269, -439, -442, -630, -308, + -264, -642, -272, -265, -642, -270, -642, -274, -611, -612, + -16, -629, -20, -642, -630, -80, -299, -96, -85, -642, + -630, -641, -642, -642, -106, -642, -515, -642, -92, -97, + -642, -642, -642, -642, -247, -239, -642, -454, -642, -630, + -296, -249, -634, -634, -630, -642, -606, -634, -642, -641, + -360, -361, -641, -642, -642, -642, -642, -642, -355, -449, + -641, -642, -642, -301, -58, -117, -118, -119, -642, -642, + -641, -324, -538, -540, -326, -641, -542, -333, -623, -624, + -642, -415, -564, -418, -602, -602, -547, -549, -549, -549, + -563, -565, -566, -567, -568, -569, -570, -571, -642, -573, + -575, -577, -582, -584, -585, -587, -592, -594, -595, -597, + -598, -599, -642, -468, -491, -496, -497, -499, -470, -493, + -471, -495, -472, -473, -642, -476, -478, -642, -479, -482, + -483, -642, -484, -485, -642, -513, -641, -25, -642, -35, + -281, -642, -642, -641, -642, -642, -642, -434, -642, -260, + -262, -642, -642, -70, -256, -257, -427, -642, -642, -72, + -428, -311, -632, -616, -617, -616, -617, -630, -642, -421, + -641, -64, -423, -439, -255, -642, -440, -642, -307, -641, + -271, -275, -642, -609, -610, -19, -23, -82, -642, -88, + -94, -630, -616, -617, -641, -103, -105, -642, -90, -642, + -210, -220, -630, -641, -353, -641, -294, -358, -298, -250, + -636, -635, -252, -636, -303, -305, -607, -641, -362, -641, + -59, -363, -364, -319, -320, -642, -322, -642, -630, -616, + -617, -620, -300, -641, -117, -118, -121, -630, -641, -642, + -642, -642, -641, -564, -564, -642, -630, -642, -630, -642, + -545, -546, -642, -642, -556, -642, -559, -642, -561, -642, + -371, -642, -373, -375, -378, -381, -630, -576, -586, -596, + -600, -642, -641, -475, -477, -481, -487, -489, -642, -131, + -279, -642, -630, -616, -617, -617, -616, -254, -642, -633, + -641, -44, -206, -45, -207, -71, -46, -209, -47, -208, + -73, -642, -642, -642, -642, -434, -642, -403, -404, -630, + -406, -641, -425, -424, -642, -436, -641, -438, -266, -276, + -86, -101, -98, -310, -13, -15, -354, -356, -641, -461, + -455, -641, -456, -457, -634, -642, -357, -365, -642, -367, + -641, -642, -60, -321, -445, -642, -642, -434, -642, -434, + -642, -642, -327, -330, -642, -630, -642, -334, -605, -416, + -641, -641, -408, -630, -602, -583, -601, -548, -549, -549, + -574, -549, -549, -593, -549, -571, -588, -630, -642, -642, + -380, -572, -498, -501, -502, -503, -504, -642, -12, -280, + -434, -43, -205, -261, -642, -240, -602, -602, -385, -641, + -641, -641, -402, -642, -630, -571, -579, -580, -590, -444, + -66, -641, -641, -460, -642, -642, -459, -251, -317, -642, + -368, -318, -446, -642, -641, -323, -325, -539, -641, -332, + -541, -543, -542, -642, -642, -642, -417, -544, -642, -552, + -642, -554, -642, -557, -642, -560, -562, -372, -374, -376, + -379, -500, -642, -383, -384, -393, -387, -395, -642, -398, + -642, -400, -405, -642, -642, -578, -642, -441, -641, -641, + -108, -109, -642, -642, -116, -458, -641, -447, -642, -641, + -642, -641, -419, -420, -630, -410, -412, -413, -549, -549, + -549, -549, -642, -642, -602, -581, -386, -641, -641, -641, + -641, -591, -641, -407, -589, -642, -301, -14, -454, -641, + -642, -642, -115, -641, -448, -450, -451, -452, -328, -642, + -409, -642, -642, -550, -553, -555, -558, -377, -382, -642, + -390, -642, -392, -642, -396, -642, -399, -401, -300, -620, + -453, -630, -616, -617, -620, -114, -366, -335, -411, -549, + -641, -641, -641, -641, -434, -551, -642, -388, -391, -394, + -397, -641, -389 ] + +racc_goto_table = [ + 6, 387, 4, 232, 349, 453, 276, 577, 523, 294, + 294, 294, 144, 144, 131, 228, 460, 466, 351, 352, + 513, 235, 356, 278, 295, 295, 295, 296, 296, 296, + 343, 413, 330, 330, 139, 220, 316, 569, 572, 703, + 354, 355, 147, 147, 424, 450, 762, 437, 438, 558, + 471, 285, 289, 723, 587, 855, 337, 9, 603, 514, + 507, 893, 548, 9, 695, 509, 127, 330, 330, 330, + 845, 280, 288, 290, 770, 771, 144, 128, 729, 732, + 131, 861, 883, 736, 419, 420, 421, 422, 350, 350, + 890, 920, 350, 394, 667, 396, 398, 401, 404, 407, + 410, 434, 447, 394, 333, 831, 144, 786, 312, 970, + 1005, 314, 700, 132, 315, 700, 968, 345, 1021, 393, + 610, 1007, 373, 377, 1, 774, 776, 778, 644, 411, + 2, 647, 357, 138, 656, 844, 932, 705, 533, 219, + 366, 433, 426, 923, 740, 444, 862, 277, 444, 292, + 304, 305, 693, 444, 350, 350, 350, 350, 658, 341, + 564, 692, 389, 565, 364, 591, 639, 388, 641, 523, + 597, 645, 344, 346, 645, 559, 347, 525, 348, 527, + 758, 528, 529, 9, 760, 703, 948, 595, 596, 1021, + 765, 952, 423, 451, 969, 922, 1068, 924, 472, 889, + 1004, 891, 601, 879, 294, 734, 391, 1007, 767, 516, + 517, 836, 866, 690, 436, 436, 1035, 747, 851, 934, + 432, 443, 1047, 392, 443, 454, 745, 568, 395, 443, + 470, 968, 477, 417, 397, 400, 403, 1017, 983, 406, + 409, 834, 902, 791, 893, 448, 449, 792, 703, 412, + 461, 931, 759, 473, 474, 921, 888, 687, 294, 294, + 700, 700, 885, 1015, 600, 460, 466, 709, 294, 768, + 897, nil, nil, 756, 295, 718, nil, 296, nil, 454, + nil, 890, nil, 295, nil, nil, 296, nil, nil, nil, + 19, nil, 890, 522, 522, nil, 19, nil, nil, 431, + 761, nil, 697, nil, 573, nil, nil, 545, nil, nil, + nil, 236, 330, nil, 660, 131, nil, 542, nil, 711, + 236, 236, 236, 315, 19, 321, 321, nil, 825, 330, + 714, 610, nil, 549, 552, 1027, nil, nil, nil, 562, + 714, 1036, 563, 567, 546, 561, 566, nil, nil, 285, + 19, 1066, 841, 289, 957, 236, 236, 581, 748, 236, + 361, 371, 371, nil, 532, 131, nil, 530, 757, 714, + 937, 593, 890, nil, 350, nil, nil, 714, 531, nil, + nil, nil, nil, 538, 1008, 312, 973, 974, 534, 867, + 312, 315, nil, 540, nil, 594, 315, nil, 869, 515, + 701, 1018, 1001, 568, 1019, 704, 959, 961, 518, 963, + 965, 838, 966, 815, nil, 794, 19, 576, 794, 820, + nil, 236, 236, 236, 236, 19, nil, 144, 703, nil, + 875, 876, 574, 575, 668, nil, 840, 664, nil, 706, + nil, 802, nil, 910, nil, nil, nil, nil, 472, 657, + 451, nil, 460, 466, 522, 522, 294, 147, 674, nil, + nil, nil, nil, 870, nil, nil, nil, 874, nil, nil, + nil, nil, nil, nil, nil, 1070, nil, 454, nil, 470, + nil, nil, 675, nil, 1048, nil, 688, nil, 680, nil, + 811, 813, 610, 610, nil, nil, 816, 818, nil, 461, + 787, nil, 673, nil, 700, nil, nil, 674, 679, 19, + 236, 441, 236, 236, 441, 236, 699, 720, 294, 441, + 236, 236, 838, nil, 1060, nil, 1043, 1044, 1045, 1046, + nil, 675, nil, 19, 330, nil, nil, nil, 549, 454, + 800, nil, 330, nil, 470, 668, 549, nil, 701, 568, + 852, 691, 944, nil, 470, 753, nil, 294, nil, 884, + nil, nil, nil, nil, 461, nil, nil, 294, 886, 236, + 236, 886, nil, 926, 461, nil, nil, 722, 454, 236, + nil, 839, 741, 470, 444, nil, 954, 1075, 454, 470, + nil, nil, nil, 444, 444, nil, nil, 19, nil, 444, + 444, 19, nil, 461, 850, 321, 19, nil, nil, 701, + nil, 461, 568, nil, nil, nil, nil, nil, nil, 917, + 989, 766, 321, nil, nil, 996, 864, 911, 918, nil, + nil, 833, 19, nil, nil, nil, nil, nil, 812, 814, + 294, 236, 19, 19, 817, 819, 475, 737, nil, 1037, + 739, nil, nil, 1000, 6, nil, 798, nil, 896, 144, + 443, 454, 236, nil, 810, nil, 470, nil, 668, 443, + 443, nil, 832, nil, nil, 443, 443, nil, nil, nil, + 909, 799, nil, nil, nil, nil, 461, nil, 827, 147, + nil, 877, 668, nil, nil, nil, nil, 522, nil, nil, + nil, nil, 1074, 330, 519, nil, 1039, 549, nil, nil, + 871, 9, 674, nil, 330, nil, 926, 436, 842, 926, + nil, 849, 926, 853, 926, 854, nil, 535, nil, 668, + 444, nil, nil, nil, nil, 859, 675, 859, 668, 680, + nil, nil, nil, nil, 942, nil, nil, nil, nil, 882, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 560, + nil, nil, 1014, nil, nil, 917, 144, 236, 917, 872, + 917, 886, nil, nil, 918, 912, nil, 918, nil, 918, + 350, nil, nil, 668, nil, nil, nil, nil, 812, 814, + 819, 817, 568, 926, nil, 926, nil, 926, nil, 926, + nil, nil, nil, nil, nil, nil, 443, 1061, 522, 939, + 882, nil, nil, 617, nil, nil, nil, nil, 714, 19, + 926, nil, 997, nil, nil, nil, nil, 321, nil, 236, + nil, 868, nil, nil, 827, 321, nil, nil, nil, 917, + nil, 917, nil, 917, 236, 917, nil, nil, 918, 936, + 918, nil, 918, nil, 918, nil, nil, 19, nil, nil, + 19, nil, nil, nil, nil, nil, 917, nil, 236, nil, + 907, nil, nil, nil, nil, 918, nil, 1034, 236, 350, + 947, 912, nil, 19, nil, 951, nil, 681, 236, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, 882, nil, nil, 29, 929, + nil, nil, nil, nil, nil, nil, nil, 976, 976, 976, + nil, 330, nil, 29, nil, nil, 933, 694, nil, nil, + 330, 698, 29, 29, 29, nil, 29, nil, 940, nil, + nil, nil, nil, nil, 19, nil, nil, 707, nil, nil, + 441, 236, nil, 710, nil, nil, nil, nil, 953, 441, + 441, nil, 29, nil, nil, 441, 441, 29, 29, nil, + nil, 29, 728, nil, nil, nil, nil, nil, nil, 330, + nil, nil, nil, nil, nil, 1040, 849, nil, 1030, nil, + nil, nil, nil, nil, nil, nil, 321, 859, nil, 977, + 979, 981, nil, nil, nil, nil, 294, 321, nil, 987, + 988, nil, nil, nil, nil, 976, 976, 976, 976, nil, + 976, nil, 999, 892, 617, 894, 470, 454, 29, nil, + nil, 859, 470, 29, 29, 29, 29, 29, nil, nil, + 780, 19, 668, 726, nil, nil, 19, 236, nil, nil, + 19, nil, 461, nil, nil, nil, nil, nil, nil, 743, + 744, nil, 746, nil, nil, nil, nil, 1028, 976, 976, + 976, 976, nil, nil, 1033, nil, nil, 919, nil, 976, + 19, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 441, 1050, 1052, 1054, + 1056, nil, 1057, nil, nil, nil, nil, 32, nil, nil, + nil, nil, nil, 32, nil, nil, nil, nil, nil, 19, + nil, 29, 29, 29, 29, 29, 29, 29, 32, nil, + nil, 29, 29, 29, nil, 843, 19, 32, 32, 32, + nil, 32, nil, nil, nil, 29, 236, nil, 19, nil, + 1077, 1078, 1079, 1080, nil, nil, nil, nil, nil, nil, + nil, 1082, nil, nil, nil, nil, nil, 32, 19, 19, + nil, nil, 32, 32, nil, nil, 32, nil, nil, 878, + nil, 29, 29, nil, nil, 617, 617, nil, nil, nil, + nil, 29, nil, nil, nil, 617, nil, 617, nil, 901, + nil, nil, nil, 780, nil, nil, 1009, 900, 1010, 29, + 1011, nil, nil, 29, 985, nil, nil, nil, 29, 19, + 19, nil, nil, 992, nil, nil, 1020, nil, 1022, nil, + 863, nil, 19, 32, nil, nil, 19, nil, 32, 32, + 32, 32, 32, nil, 29, nil, 873, nil, nil, nil, + nil, 925, nil, 29, 29, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1024, nil, 29, nil, nil, 19, nil, nil, + nil, nil, nil, nil, 19, nil, nil, nil, 950, 19, + 1069, nil, nil, nil, nil, nil, 956, 1071, nil, 1072, + nil, 1073, nil, nil, nil, nil, nil, nil, nil, nil, + 967, nil, nil, nil, nil, nil, nil, 236, nil, nil, + 780, 780, nil, nil, 1081, nil, 32, 32, 32, 32, + 32, 32, 32, nil, nil, nil, 32, 32, 32, nil, + 938, nil, nil, nil, nil, nil, 941, nil, nil, nil, + 32, nil, nil, 945, nil, 946, nil, nil, nil, 949, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 29, + 617, nil, nil, nil, nil, nil, 32, 32, nil, nil, + nil, nil, nil, nil, nil, nil, 32, 925, nil, nil, + 925, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 32, nil, nil, nil, 32, nil, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, 29, nil, nil, 780, 780, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, nil, nil, 32, + nil, nil, nil, nil, nil, nil, 29, nil, 32, 32, + 32, nil, nil, nil, nil, nil, nil, nil, nil, 29, + nil, 925, 29, nil, nil, nil, nil, nil, nil, 32, + 29, nil, nil, nil, nil, 1038, nil, nil, nil, nil, + 29, nil, nil, nil, nil, 29, nil, nil, nil, nil, + 29, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1067, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 29, nil, nil, nil, + nil, nil, 29, 29, nil, nil, nil, nil, nil, nil, + 243, 29, 29, nil, nil, nil, nil, 29, 29, 293, + 293, 293, nil, nil, 32, nil, nil, nil, nil, nil, + nil, nil, 339, 340, nil, 342, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 29, 29, + nil, 32, 29, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 32, nil, nil, 32, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, 18, 29, nil, nil, 32, nil, 18, nil, nil, + 32, nil, nil, nil, nil, 32, nil, nil, 29, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 29, nil, + nil, 18, nil, nil, nil, nil, nil, nil, 29, nil, + 29, 32, nil, nil, nil, nil, nil, 32, 32, 293, + 446, nil, nil, 452, 293, nil, 32, 32, 452, nil, + 29, 29, 32, 32, nil, nil, nil, nil, nil, nil, + nil, 243, nil, nil, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, nil, 18, nil, nil, + 506, nil, nil, nil, nil, nil, 18, nil, 293, 293, + nil, 29, 29, nil, nil, nil, nil, nil, 293, nil, + nil, nil, nil, nil, 29, 293, 16, 293, 29, 293, + 293, nil, 16, nil, nil, nil, nil, nil, 32, nil, + nil, nil, nil, 32, 32, nil, nil, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 16, nil, nil, nil, nil, nil, nil, nil, 554, 29, + 555, nil, nil, nil, 293, 293, 29, 32, nil, nil, + nil, 29, nil, nil, nil, nil, 16, nil, nil, nil, + 18, nil, 18, 32, nil, 18, 365, nil, nil, nil, + 18, nil, nil, nil, nil, nil, nil, nil, nil, 29, + nil, nil, nil, nil, 18, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 32, nil, 32, nil, nil, nil, nil, + nil, nil, 16, nil, nil, nil, nil, nil, nil, nil, + nil, 16, 293, nil, nil, 32, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 18, nil, + nil, nil, 18, nil, nil, nil, nil, 18, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 293, nil, 452, 452, + 452, nil, nil, 18, nil, nil, 32, 32, nil, nil, + nil, nil, nil, 18, 18, nil, nil, nil, nil, 32, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, nil, 439, 293, nil, + 439, 293, nil, 293, nil, 439, nil, nil, nil, 20, + nil, nil, nil, nil, nil, 20, nil, nil, 293, 16, + nil, nil, nil, nil, 32, nil, nil, 452, 721, nil, + nil, 32, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, nil, 20, 323, 323, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 293, nil, nil, + nil, nil, nil, nil, 32, nil, nil, 293, nil, 20, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 363, + 372, 372, nil, 16, nil, nil, nil, 16, nil, nil, + nil, nil, 16, nil, nil, nil, nil, nil, 293, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 16, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 16, 16, + nil, nil, nil, nil, nil, 20, nil, nil, 293, 452, + 293, nil, nil, 807, 20, nil, 293, 293, 452, 452, + 18, nil, nil, nil, 452, 452, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 293, + nil, nil, nil, nil, nil, nil, nil, nil, 18, nil, + nil, 18, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 293, nil, nil, nil, nil, 293, nil, nil, + 293, nil, nil, nil, 18, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 293, nil, nil, nil, 20, nil, + 442, nil, nil, 442, nil, nil, nil, nil, 442, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 20, nil, nil, nil, 293, nil, 41, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, 42, 293, nil, + nil, 18, nil, 42, nil, 452, nil, nil, nil, nil, + 18, 18, 41, 319, 319, nil, 18, 18, 452, 452, + 452, 452, nil, 915, nil, 16, nil, nil, nil, nil, + nil, 42, 320, 320, nil, nil, 20, nil, 41, nil, + 20, nil, nil, nil, 323, 20, nil, nil, 359, 375, + 375, 375, nil, nil, nil, nil, nil, 42, nil, nil, + nil, 323, 293, 16, nil, nil, 16, 360, 376, 376, + 376, 20, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 20, 20, nil, nil, nil, nil, nil, nil, 16, + nil, nil, 18, nil, nil, nil, nil, 18, nil, nil, + nil, 18, nil, nil, 41, nil, nil, nil, nil, nil, + 293, 452, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 42, nil, nil, nil, nil, nil, nil, + nil, 18, 42, nil, nil, nil, nil, nil, nil, nil, + 293, nil, nil, nil, nil, nil, nil, 18, nil, nil, + 16, nil, nil, nil, nil, nil, 439, nil, nil, nil, + nil, nil, nil, nil, nil, 439, 439, nil, nil, nil, + 18, 439, 439, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, + nil, nil, nil, nil, nil, 293, nil, 41, nil, 18, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, 18, + 18, 41, nil, nil, nil, nil, 293, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, nil, nil, nil, 16, nil, nil, + nil, nil, 16, nil, nil, nil, 16, nil, 20, nil, + nil, nil, nil, nil, nil, nil, 323, nil, nil, nil, + 18, 18, nil, nil, 323, nil, nil, nil, nil, nil, + nil, nil, nil, 18, nil, 41, 16, 18, nil, 41, + nil, nil, nil, 319, 41, nil, 20, nil, nil, 20, + nil, nil, 439, nil, 42, nil, nil, nil, 42, nil, + 319, nil, 320, 42, nil, nil, nil, nil, nil, nil, + 41, nil, 20, nil, nil, 16, nil, nil, 18, 320, + 41, 41, nil, nil, nil, 18, nil, nil, nil, 42, + 18, nil, 16, nil, nil, nil, nil, nil, nil, 42, + 42, nil, nil, nil, 16, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 16, 16, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, nil, nil, 442, + nil, nil, nil, nil, nil, nil, nil, nil, 442, 442, + nil, nil, nil, nil, 442, 442, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, 16, nil, nil, 995, + nil, nil, nil, nil, nil, 323, nil, nil, 16, nil, + nil, nil, 16, nil, nil, nil, 323, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 20, nil, nil, 16, nil, 20, nil, nil, nil, 20, + 16, nil, nil, nil, nil, 16, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, 319, nil, nil, 906, 20, + nil, nil, nil, 319, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, 320, 442, nil, nil, nil, nil, + nil, nil, 320, nil, nil, 41, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, nil, nil, 42, nil, nil, 42, nil, nil, + nil, 41, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 20, nil, nil, + 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 20, 20, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 42, nil, 372, nil, nil, nil, nil, 20, 20, + nil, nil, 994, nil, nil, nil, nil, nil, nil, nil, + nil, 20, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, 319, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 319, nil, nil, nil, nil, + nil, nil, nil, 320, nil, nil, nil, nil, nil, nil, + nil, 372, nil, nil, 320, nil, 20, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, nil, 20, 41, + nil, nil, nil, nil, 41, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, nil, 42, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, 42, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 42, 41, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 42, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 375, nil, nil, nil, nil, 41, 41, nil, + nil, 990, nil, nil, nil, nil, nil, nil, nil, nil, + 41, 376, nil, nil, 41, nil, 42, 42, nil, nil, + 991, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, nil, 42, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 375, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, 41, nil, nil, nil, nil, 41, nil, 376, + nil, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, 42, nil, nil, nil, nil, 42 ] + +racc_goto_check = [ + 6, 70, 2, 40, 102, 36, 168, 113, 87, 46, + 46, 46, 71, 71, 118, 38, 50, 50, 24, 24, + 52, 27, 24, 38, 82, 82, 82, 84, 84, 84, + 40, 70, 78, 78, 22, 22, 63, 106, 106, 216, + 42, 42, 73, 73, 10, 33, 121, 29, 29, 12, + 33, 85, 85, 15, 68, 107, 76, 9, 167, 36, + 169, 211, 65, 9, 53, 50, 5, 78, 78, 78, + 17, 51, 51, 51, 150, 150, 71, 8, 83, 83, + 118, 109, 159, 83, 24, 24, 24, 24, 31, 31, + 206, 155, 31, 6, 37, 6, 6, 6, 6, 6, + 6, 80, 80, 6, 64, 157, 71, 144, 59, 145, + 161, 60, 88, 7, 14, 88, 142, 9, 212, 185, + 201, 162, 69, 69, 1, 204, 204, 204, 189, 185, + 3, 189, 5, 11, 13, 16, 18, 20, 21, 23, + 26, 30, 32, 159, 43, 25, 45, 49, 25, 58, + 58, 58, 55, 25, 31, 31, 31, 31, 74, 79, + 81, 86, 98, 101, 115, 117, 190, 122, 190, 87, + 123, 190, 124, 125, 190, 126, 127, 80, 128, 80, + 129, 80, 80, 9, 130, 216, 131, 132, 133, 212, + 134, 135, 9, 75, 146, 147, 161, 153, 75, 156, + 160, 156, 163, 164, 46, 37, 165, 162, 166, 171, + 172, 174, 175, 177, 82, 82, 178, 179, 180, 181, + 27, 27, 145, 184, 27, 6, 113, 80, 186, 27, + 71, 142, 38, 7, 187, 188, 191, 155, 159, 192, + 193, 53, 194, 195, 211, 31, 31, 196, 216, 199, + 85, 157, 200, 31, 31, 156, 205, 36, 46, 46, + 88, 88, 208, 209, 215, 50, 50, 65, 46, 167, + 144, nil, nil, 68, 82, 65, nil, 84, nil, 6, + nil, 206, nil, 82, nil, nil, 84, nil, nil, nil, + 35, nil, 206, 6, 6, nil, 35, nil, nil, 14, + 12, nil, 169, nil, 24, nil, nil, 40, nil, nil, + nil, 35, 78, nil, 80, 118, nil, 38, nil, 36, + 35, 35, 35, 14, 35, 35, 35, nil, 37, 78, + 50, 201, nil, 63, 38, 17, nil, nil, nil, 82, + 50, 109, 84, 84, 76, 6, 6, nil, nil, 85, + 35, 107, 37, 85, 150, 35, 35, 38, 36, 35, + 35, 35, 35, nil, 9, 118, nil, 5, 36, 50, + 83, 6, 206, nil, 31, nil, nil, 50, 8, nil, + nil, nil, nil, 64, 156, 59, 150, 150, 60, 37, + 59, 14, nil, 60, nil, 31, 14, nil, 37, 58, + 80, 156, 121, 80, 156, 80, 204, 204, 58, 204, + 204, 87, 204, 52, nil, 190, 35, 5, 190, 52, + nil, 35, 35, 35, 35, 35, nil, 71, 216, nil, + 167, 167, 14, 14, 40, nil, 65, 38, nil, 10, + nil, 36, nil, 37, nil, nil, nil, nil, 75, 22, + 75, nil, 50, 50, 6, 6, 46, 73, 6, nil, + nil, nil, nil, 12, nil, nil, nil, 12, nil, nil, + nil, nil, nil, nil, nil, 156, nil, 6, nil, 71, + nil, nil, 85, nil, 150, nil, 40, nil, 85, nil, + 33, 33, 201, 201, nil, nil, 33, 33, nil, 85, + 80, nil, 51, nil, 88, nil, nil, 6, 51, 35, + 35, 35, 35, 35, 35, 35, 84, 75, 46, 35, + 35, 35, 87, nil, 15, nil, 204, 204, 204, 204, + nil, 85, nil, 35, 78, nil, nil, nil, 63, 6, + 80, nil, 78, nil, 71, 40, 63, nil, 80, 80, + 29, 51, 106, nil, 71, 42, nil, 46, nil, 149, + nil, nil, nil, nil, 85, nil, nil, 46, 151, 35, + 35, 151, nil, 207, 85, nil, nil, 31, 6, 35, + nil, 80, 118, 71, 25, nil, 12, 204, 6, 71, + nil, nil, nil, 25, 25, nil, nil, 35, nil, 25, + 25, 35, nil, 85, 80, 35, 35, nil, nil, 80, + nil, 85, 80, nil, nil, nil, nil, nil, nil, 149, + 106, 31, 35, nil, nil, 106, 80, 33, 151, nil, + nil, 102, 35, nil, nil, nil, nil, nil, 75, 75, + 46, 35, 35, 35, 75, 75, 61, 14, nil, 113, + 14, nil, nil, 12, 6, nil, 2, nil, 80, 71, + 27, 6, 35, nil, 84, nil, 71, nil, 40, 27, + 27, nil, 168, nil, nil, 27, 27, nil, nil, nil, + 80, 22, nil, nil, nil, nil, 85, nil, 6, 73, + nil, 70, 40, nil, nil, nil, nil, 6, nil, nil, + nil, nil, 37, 78, 61, nil, 12, 63, nil, nil, + 24, 9, 6, nil, 78, nil, 207, 82, 63, 207, + nil, 6, 207, 6, 207, 84, nil, 61, nil, 40, + 25, nil, nil, nil, nil, 6, 85, 6, 40, 85, + nil, nil, nil, nil, 80, nil, nil, nil, nil, 40, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 61, + nil, nil, 149, nil, nil, 149, 71, 35, 149, 118, + 149, 151, nil, nil, 151, 75, nil, 151, nil, 151, + 31, nil, nil, 40, nil, nil, nil, nil, 75, 75, + 75, 75, 80, 207, nil, 207, nil, 207, nil, 207, + nil, nil, nil, nil, nil, nil, 27, 36, 6, 24, + 40, nil, nil, 143, nil, nil, nil, nil, 50, 35, + 207, nil, 80, nil, nil, nil, nil, 35, nil, 35, + nil, 14, nil, nil, 6, 35, nil, nil, nil, 149, + nil, 149, nil, 149, 35, 149, nil, nil, 151, 6, + 151, nil, 151, nil, 151, nil, nil, 35, nil, nil, + 35, nil, nil, nil, nil, nil, 149, nil, 35, nil, + 14, nil, nil, nil, nil, 151, nil, 80, 35, 31, + 118, 75, nil, 35, nil, 118, nil, 61, 35, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 40, nil, nil, 54, 14, + nil, nil, nil, nil, nil, nil, nil, 6, 6, 6, + nil, 78, nil, 54, nil, nil, 14, 61, nil, nil, + 78, 61, 54, 54, 54, nil, 54, nil, 14, nil, + nil, nil, nil, nil, 35, nil, nil, 61, nil, nil, + 35, 35, nil, 61, nil, nil, nil, nil, 14, 35, + 35, nil, 54, nil, nil, 35, 35, 54, 54, nil, + nil, 54, 61, nil, nil, nil, nil, nil, nil, 78, + nil, nil, nil, nil, nil, 40, 6, nil, 38, nil, + nil, nil, nil, nil, nil, nil, 35, 6, nil, 152, + 152, 152, nil, nil, nil, nil, 46, 35, nil, 14, + 14, nil, nil, nil, nil, 6, 6, 6, 6, nil, + 6, nil, 14, 154, 143, 154, 71, 6, 54, nil, + nil, 6, 71, 54, 54, 54, 54, 54, nil, nil, + 143, 35, 40, 100, nil, nil, 35, 35, nil, nil, + 35, nil, 85, nil, nil, nil, nil, nil, nil, 100, + 100, nil, 100, nil, nil, nil, nil, 14, 6, 6, + 6, 6, nil, nil, 14, nil, nil, 154, nil, 6, + 35, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 35, 152, 152, 152, + 152, nil, 152, nil, nil, nil, nil, 57, nil, nil, + nil, nil, nil, 57, nil, nil, nil, nil, nil, 35, + nil, 54, 54, 54, 54, 54, 54, 54, 57, nil, + nil, 54, 54, 54, nil, 61, 35, 57, 57, 57, + nil, 57, nil, nil, nil, 54, 35, nil, 35, nil, + 152, 152, 152, 152, nil, nil, nil, nil, nil, nil, + nil, 152, nil, nil, nil, nil, nil, 57, 35, 35, + nil, nil, 57, 57, nil, nil, 57, nil, nil, 61, + nil, 54, 54, nil, nil, 143, 143, nil, nil, nil, + nil, 54, nil, nil, nil, 143, nil, 143, nil, 61, + nil, nil, nil, 143, nil, nil, 154, 143, 154, 54, + 154, nil, nil, 54, 35, nil, nil, nil, 54, 35, + 35, nil, nil, 35, nil, nil, 154, nil, 154, nil, + 100, nil, 35, 57, nil, nil, 35, nil, 57, 57, + 57, 57, 57, nil, 54, nil, 100, nil, nil, nil, + nil, 143, nil, 54, 54, 54, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 35, nil, 54, nil, nil, 35, nil, nil, + nil, nil, nil, nil, 35, nil, nil, nil, 61, 35, + 154, nil, nil, nil, nil, nil, 61, 154, nil, 154, + nil, 154, nil, nil, nil, nil, nil, nil, nil, nil, + 61, nil, nil, nil, nil, nil, nil, 35, nil, nil, + 143, 143, nil, nil, 154, nil, 57, 57, 57, 57, + 57, 57, 57, nil, nil, nil, 57, 57, 57, nil, + 100, nil, nil, nil, nil, nil, 100, nil, nil, nil, + 57, nil, nil, 100, nil, 100, nil, nil, nil, 100, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 54, + 143, nil, nil, nil, nil, nil, 57, 57, nil, nil, + nil, nil, nil, nil, nil, nil, 57, 143, nil, nil, + 143, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 57, nil, nil, nil, 57, nil, + nil, nil, nil, 57, nil, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 143, 143, nil, nil, nil, nil, + nil, 54, nil, nil, nil, nil, nil, nil, nil, 57, + nil, nil, nil, nil, nil, nil, 54, nil, 57, 57, + 57, nil, nil, nil, nil, nil, nil, nil, nil, 54, + nil, 143, 54, nil, nil, nil, nil, nil, nil, 57, + 54, nil, nil, nil, nil, 100, nil, nil, nil, nil, + 54, nil, nil, nil, nil, 54, nil, nil, nil, nil, + 54, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 100, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 54, nil, nil, nil, + nil, nil, 54, 54, nil, nil, nil, nil, nil, nil, + 41, 54, 54, nil, nil, nil, nil, 54, 54, 41, + 41, 41, nil, nil, 57, nil, nil, nil, nil, nil, + nil, nil, 41, 41, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 54, 54, + nil, 57, 54, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 57, nil, nil, 57, nil, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, nil, + nil, 34, 54, nil, nil, 57, nil, 34, nil, nil, + 57, nil, nil, nil, nil, 57, nil, nil, 54, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, nil, + nil, 54, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 34, nil, nil, nil, nil, nil, nil, 54, nil, + 54, 57, nil, nil, nil, nil, nil, 57, 57, 41, + 41, nil, nil, 41, 41, nil, 57, 57, 41, nil, + 54, 54, 57, 57, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, nil, 34, nil, nil, + 41, nil, nil, nil, nil, nil, 34, nil, 41, 41, + nil, 54, 54, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, 54, 41, 28, 41, 54, 41, + 41, nil, 28, nil, nil, nil, nil, nil, 57, nil, + nil, nil, nil, 57, 57, nil, nil, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 28, nil, nil, nil, nil, nil, nil, nil, 41, 54, + 41, nil, nil, nil, 41, 41, 54, 57, nil, nil, + nil, 54, nil, nil, nil, nil, 28, nil, nil, nil, + 34, nil, 34, 57, nil, 34, 28, nil, nil, nil, + 34, nil, nil, nil, nil, nil, nil, nil, nil, 54, + nil, nil, nil, nil, 34, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 57, nil, 57, nil, nil, nil, nil, + nil, nil, 28, nil, nil, nil, nil, nil, nil, nil, + nil, 28, 41, nil, nil, 57, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 34, nil, + nil, nil, 34, nil, nil, nil, nil, 34, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, 41, 41, + 41, nil, nil, 34, nil, nil, 57, 57, nil, nil, + nil, nil, nil, 34, 34, nil, nil, nil, nil, 57, + nil, nil, nil, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, 28, 41, nil, + 28, 41, nil, 41, nil, 28, nil, nil, nil, 39, + nil, nil, nil, nil, nil, 39, nil, nil, 41, 28, + nil, nil, nil, nil, 57, nil, nil, 41, 41, nil, + nil, 57, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, nil, 39, 39, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, 57, nil, nil, 41, nil, 39, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 39, + 39, 39, nil, 28, nil, nil, nil, 28, nil, nil, + nil, nil, 28, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 28, 28, + nil, nil, nil, nil, nil, 39, nil, nil, 41, 41, + 41, nil, nil, 41, 39, nil, 41, 41, 41, 41, + 34, nil, nil, nil, 41, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, 34, nil, + nil, 34, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 41, nil, nil, nil, nil, 41, nil, nil, + 41, nil, nil, nil, 34, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, 39, nil, + 39, nil, nil, 39, nil, nil, nil, nil, 39, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, nil, nil, nil, 41, nil, 66, nil, + nil, nil, nil, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, 67, 41, nil, + nil, 34, nil, 67, nil, 41, nil, nil, nil, nil, + 34, 34, 66, 66, 66, nil, 34, 34, 41, 41, + 41, 41, nil, 41, nil, 28, nil, nil, nil, nil, + nil, 67, 67, 67, nil, nil, 39, nil, 66, nil, + 39, nil, nil, nil, 39, 39, nil, nil, 66, 66, + 66, 66, nil, nil, nil, nil, nil, 67, nil, nil, + nil, 39, 41, 28, nil, nil, 28, 67, 67, 67, + 67, 39, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 39, 39, nil, nil, nil, nil, nil, nil, 28, + nil, nil, 34, nil, nil, nil, nil, 34, nil, nil, + nil, 34, nil, nil, 66, nil, nil, nil, nil, nil, + 41, 41, nil, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, 34, 67, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, 34, nil, nil, + 28, nil, nil, nil, nil, nil, 28, nil, nil, nil, + nil, nil, nil, nil, nil, 28, 28, nil, nil, nil, + 34, 28, 28, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 66, nil, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, 34, + 34, 66, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, nil, nil, 28, nil, nil, + nil, nil, 28, nil, nil, nil, 28, nil, 39, nil, + nil, nil, nil, nil, nil, nil, 39, nil, nil, nil, + 34, 34, nil, nil, 39, nil, nil, nil, nil, nil, + nil, nil, nil, 34, nil, 66, 28, 34, nil, 66, + nil, nil, nil, 66, 66, nil, 39, nil, nil, 39, + nil, nil, 28, nil, 67, nil, nil, nil, 67, nil, + 66, nil, 67, 67, nil, nil, nil, nil, nil, nil, + 66, nil, 39, nil, nil, 28, nil, nil, 34, 67, + 66, 66, nil, nil, nil, 34, nil, nil, nil, 67, + 34, nil, 28, nil, nil, nil, nil, nil, nil, 67, + 67, nil, nil, nil, 28, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 28, 28, nil, nil, nil, nil, + nil, nil, nil, 39, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, nil, nil, nil, 39, 39, + nil, nil, nil, nil, 39, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, 28, nil, nil, 28, + nil, nil, nil, nil, nil, 39, nil, nil, 28, nil, + nil, nil, 28, nil, nil, nil, 39, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 39, nil, nil, 28, nil, 39, nil, nil, nil, 39, + 28, nil, nil, nil, nil, 28, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, nil, nil, nil, 66, nil, nil, 39, 39, + nil, nil, nil, 66, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, 67, 39, nil, nil, nil, nil, + nil, nil, 67, nil, nil, 66, nil, nil, 66, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, nil, nil, 67, nil, nil, 67, nil, nil, + nil, 66, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 39, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 39, 39, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 66, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, nil, 39, nil, nil, nil, nil, 39, 39, + nil, nil, 39, nil, nil, nil, nil, nil, nil, nil, + nil, 39, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, 39, nil, nil, 67, nil, 39, nil, nil, nil, + nil, nil, nil, 39, nil, nil, nil, nil, 39, 66, + nil, nil, nil, nil, 66, nil, nil, nil, 66, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, 67, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 66, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 66, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 66, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 67, 66, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 67, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 66, nil, nil, nil, nil, 66, 66, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, nil, + 66, 67, nil, nil, 66, nil, 67, 67, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 66, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, nil, 66, nil, nil, nil, nil, 66, nil, 67, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, 67 ] + +racc_goto_pointer = [ + nil, 124, 0, 130, nil, 61, -2, 105, 72, 55, + -94, 123, -295, -291, 78, -504, -588, -653, -708, nil, + -394, -173, 23, 127, -49, -78, 68, -2, 1844, -175, + -81, 21, 3, -181, 1689, 288, -222, -359, -4, 2077, + -19, 1547, -29, -429, nil, -594, -23, nil, nil, 120, + -212, 42, -260, -452, 900, -360, nil, 1105, 117, 72, + 75, 413, nil, -1, 66, -272, 2326, 2345, -315, 49, + -74, 1, nil, 31, -272, -33, 12, nil, -5, 112, + -121, -187, -8, -484, -5, 22, -348, -288, -409, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 87, nil, + 485, -185, -61, nil, nil, nil, -314, -682, nil, -658, + nil, nil, nil, -350, nil, 92, nil, -208, 9, nil, + nil, -550, 92, -218, 111, 111, -170, 113, 114, -411, + -410, -686, -190, -199, -407, -686, nil, nil, nil, nil, + nil, nil, -782, 422, -511, -790, -704, -634, nil, -210, + -530, -201, 80, -632, 248, -738, -574, -585, nil, -686, + -755, -845, -834, -189, -564, 117, -393, -333, -19, -215, + nil, -77, -77, nil, -485, -535, nil, -295, -783, -362, + -507, -632, nil, nil, 131, 24, 131, 136, 136, -272, + -229, 136, 138, 138, -549, -393, -390, nil, nil, 144, + -340, -271, nil, nil, -482, -517, -683, -256, -507, -709, + nil, -714, -860, nil, nil, -126, -485 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 307, 7, 358, 310, + nil, nil, nil, nil, 557, nil, nil, nil, nil, 306, + 308, nil, nil, nil, nil, 14, 15, 21, 241, nil, + nil, 17, nil, 440, 242, 338, nil, nil, 589, 240, + 476, 24, nil, nil, 353, nil, 25, 26, 27, nil, + 717, nil, nil, nil, 327, nil, 28, 324, 455, 35, + nil, nil, 37, 40, 39, nil, 237, 238, 370, nil, + 146, 463, 145, 91, nil, 445, 107, 47, 50, 273, + 299, nil, 456, nil, 457, 468, 676, 520, 297, 282, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, + nil, nil, 283, 65, 66, 67, nil, nil, 68, 857, + 69, 70, 71, nil, 72, nil, 73, nil, 570, 74, + 75, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 287, 275, 725, 848, + 579, 858, 782, 895, nil, 783, 784, 1016, 916, 605, + nil, 606, nil, nil, 607, nil, 609, nil, 828, nil, + nil, nil, 615, nil, nil, nil, nil, nil, nil, nil, + 467, nil, nil, 696, nil, nil, 508, nil, nil, nil, + nil, nil, 90, 92, 94, nil, nil, nil, nil, nil, + 634, nil, nil, nil, nil, nil, nil, 103, 104, nil, + nil, 887, 764, 604, nil, 608, 619, 621, 622, 927, + 625, 626, 928, 629, 632, nil, 301 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 148, :_reduce_1, + 2, 146, :_reduce_2, + 2, 147, :_reduce_3, + 1, 149, :_reduce_none, + 1, 149, :_reduce_none, + 3, 149, :_reduce_6, + 2, 149, :_reduce_none, + 1, 152, :_reduce_none, + 0, 156, :_reduce_9, + 3, 152, :_reduce_10, + 0, 158, :_reduce_11, + 4, 155, :_reduce_12, + 0, 163, :_reduce_13, + 6, 157, :_reduce_14, + 3, 157, :_reduce_15, + 2, 159, :_reduce_16, + 1, 164, :_reduce_none, + 1, 164, :_reduce_none, + 3, 164, :_reduce_19, + 2, 164, :_reduce_20, + 1, 165, :_reduce_none, + 0, 166, :_reduce_22, + 3, 165, :_reduce_23, + 0, 177, :_reduce_24, + 4, 154, :_reduce_25, + 3, 154, :_reduce_26, + 3, 154, :_reduce_27, + 3, 154, :_reduce_28, + 2, 154, :_reduce_29, + 3, 154, :_reduce_30, + 3, 154, :_reduce_31, + 3, 154, :_reduce_32, + 3, 154, :_reduce_33, + 3, 154, :_reduce_34, + 4, 154, :_reduce_35, + 1, 154, :_reduce_none, + 3, 154, :_reduce_37, + 3, 154, :_reduce_38, + 3, 154, :_reduce_39, + 1, 154, :_reduce_none, + 3, 170, :_reduce_41, + 3, 170, :_reduce_42, + 6, 170, :_reduce_43, + 5, 170, :_reduce_44, + 5, 170, :_reduce_45, + 5, 170, :_reduce_46, + 5, 170, :_reduce_47, + 3, 170, :_reduce_48, + 1, 178, :_reduce_49, + 1, 178, :_reduce_none, + 1, 176, :_reduce_none, + 3, 176, :_reduce_52, + 3, 176, :_reduce_53, + 3, 176, :_reduce_54, + 2, 176, :_reduce_55, + 1, 176, :_reduce_none, + 1, 169, :_reduce_57, + 0, 189, :_reduce_58, + 0, 190, :_reduce_59, + 4, 187, :_reduce_60, + 1, 172, :_reduce_none, + 1, 172, :_reduce_none, + 1, 192, :_reduce_none, + 4, 192, :_reduce_64, + 0, 200, :_reduce_65, + 4, 197, :_reduce_66, + 1, 199, :_reduce_67, + 2, 191, :_reduce_68, + 3, 191, :_reduce_69, + 4, 191, :_reduce_70, + 5, 191, :_reduce_71, + 4, 191, :_reduce_72, + 5, 191, :_reduce_73, + 2, 191, :_reduce_74, + 2, 191, :_reduce_75, + 2, 191, :_reduce_76, + 2, 191, :_reduce_77, + 2, 191, :_reduce_78, + 1, 171, :_reduce_none, + 3, 171, :_reduce_80, + 1, 205, :_reduce_none, + 3, 205, :_reduce_82, + 1, 204, :_reduce_83, + 2, 204, :_reduce_84, + 3, 204, :_reduce_85, + 5, 204, :_reduce_86, + 2, 204, :_reduce_87, + 4, 204, :_reduce_88, + 2, 204, :_reduce_89, + 4, 204, :_reduce_90, + 1, 204, :_reduce_91, + 3, 204, :_reduce_92, + 1, 208, :_reduce_none, + 3, 208, :_reduce_94, + 2, 207, :_reduce_95, + 3, 207, :_reduce_96, + 1, 210, :_reduce_97, + 3, 210, :_reduce_98, + 1, 209, :_reduce_99, + 1, 209, :_reduce_100, + 4, 209, :_reduce_101, + 3, 209, :_reduce_102, + 3, 209, :_reduce_103, + 3, 209, :_reduce_104, + 3, 209, :_reduce_105, + 2, 209, :_reduce_106, + 1, 209, :_reduce_107, + 1, 173, :_reduce_108, + 1, 173, :_reduce_109, + 4, 173, :_reduce_110, + 3, 173, :_reduce_111, + 3, 173, :_reduce_112, + 3, 173, :_reduce_113, + 3, 173, :_reduce_114, + 2, 173, :_reduce_115, + 1, 173, :_reduce_116, + 1, 213, :_reduce_117, + 1, 213, :_reduce_none, + 2, 214, :_reduce_119, + 1, 214, :_reduce_120, + 3, 214, :_reduce_121, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_125, + 1, 215, :_reduce_none, + 1, 167, :_reduce_127, + 1, 167, :_reduce_none, + 1, 168, :_reduce_129, + 0, 219, :_reduce_130, + 4, 168, :_reduce_131, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 3, 186, :_reduce_203, + 3, 186, :_reduce_204, + 6, 186, :_reduce_205, + 5, 186, :_reduce_206, + 5, 186, :_reduce_207, + 5, 186, :_reduce_208, + 5, 186, :_reduce_209, + 4, 186, :_reduce_210, + 3, 186, :_reduce_211, + 3, 186, :_reduce_212, + 3, 186, :_reduce_213, + 3, 186, :_reduce_214, + 3, 186, :_reduce_215, + 3, 186, :_reduce_216, + 3, 186, :_reduce_217, + 3, 186, :_reduce_218, + 3, 186, :_reduce_219, + 4, 186, :_reduce_220, + 2, 186, :_reduce_221, + 2, 186, :_reduce_222, + 3, 186, :_reduce_223, + 3, 186, :_reduce_224, + 3, 186, :_reduce_225, + 3, 186, :_reduce_226, + 1, 186, :_reduce_none, + 3, 186, :_reduce_228, + 3, 186, :_reduce_229, + 3, 186, :_reduce_230, + 3, 186, :_reduce_231, + 3, 186, :_reduce_232, + 2, 186, :_reduce_233, + 2, 186, :_reduce_234, + 3, 186, :_reduce_235, + 3, 186, :_reduce_236, + 3, 186, :_reduce_237, + 3, 186, :_reduce_238, + 3, 186, :_reduce_239, + 6, 186, :_reduce_240, + 1, 186, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 3, 222, :_reduce_246, + 3, 222, :_reduce_247, + 1, 225, :_reduce_248, + 1, 226, :_reduce_none, + 2, 226, :_reduce_250, + 4, 226, :_reduce_251, + 2, 226, :_reduce_252, + 1, 220, :_reduce_none, + 3, 220, :_reduce_254, + 3, 230, :_reduce_255, + 1, 231, :_reduce_none, + 1, 231, :_reduce_none, + 1, 181, :_reduce_none, + 1, 181, :_reduce_none, + 2, 181, :_reduce_260, + 4, 181, :_reduce_261, + 2, 181, :_reduce_262, + 1, 203, :_reduce_263, + 2, 203, :_reduce_264, + 2, 203, :_reduce_265, + 4, 203, :_reduce_266, + 1, 203, :_reduce_267, + 0, 234, :_reduce_268, + 2, 196, :_reduce_269, + 2, 233, :_reduce_270, + 2, 232, :_reduce_271, + 1, 232, :_reduce_none, + 1, 227, :_reduce_273, + 2, 227, :_reduce_274, + 3, 227, :_reduce_275, + 4, 227, :_reduce_276, + 1, 175, :_reduce_277, + 1, 175, :_reduce_278, + 3, 174, :_reduce_279, + 4, 174, :_reduce_280, + 2, 174, :_reduce_281, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_292, + 0, 269, :_reduce_293, + 4, 223, :_reduce_294, + 0, 270, :_reduce_295, + 3, 223, :_reduce_296, + 0, 271, :_reduce_297, + 4, 223, :_reduce_298, + 3, 223, :_reduce_299, + 3, 223, :_reduce_300, + 2, 223, :_reduce_301, + 0, 272, :_reduce_302, + 4, 223, :_reduce_303, + 0, 273, :_reduce_304, + 4, 223, :_reduce_305, + 1, 223, :_reduce_306, + 4, 223, :_reduce_307, + 3, 223, :_reduce_308, + 1, 223, :_reduce_309, + 5, 223, :_reduce_310, + 4, 223, :_reduce_311, + 3, 223, :_reduce_312, + 2, 223, :_reduce_313, + 1, 223, :_reduce_none, + 2, 223, :_reduce_315, + 1, 223, :_reduce_316, + 6, 223, :_reduce_317, + 6, 223, :_reduce_318, + 4, 223, :_reduce_319, + 4, 223, :_reduce_320, + 5, 223, :_reduce_321, + 4, 223, :_reduce_322, + 6, 223, :_reduce_323, + 0, 274, :_reduce_324, + 6, 223, :_reduce_325, + 0, 275, :_reduce_326, + 0, 276, :_reduce_327, + 8, 223, :_reduce_328, + 0, 277, :_reduce_329, + 5, 223, :_reduce_330, + 0, 278, :_reduce_331, + 6, 223, :_reduce_332, + 0, 279, :_reduce_333, + 0, 280, :_reduce_334, + 9, 223, :_reduce_335, + 1, 223, :_reduce_336, + 1, 223, :_reduce_337, + 1, 223, :_reduce_338, + 1, 223, :_reduce_339, + 1, 180, :_reduce_340, + 1, 244, :_reduce_none, + 1, 250, :_reduce_none, + 1, 253, :_reduce_none, + 1, 255, :_reduce_none, + 1, 256, :_reduce_none, + 1, 257, :_reduce_none, + 1, 259, :_reduce_none, + 1, 261, :_reduce_348, + 1, 264, :_reduce_349, + 1, 265, :_reduce_350, + 1, 281, :_reduce_none, + 1, 282, :_reduce_none, + 1, 283, :_reduce_none, + 1, 284, :_reduce_none, + 1, 285, :_reduce_none, + 1, 161, :_reduce_none, + 1, 286, :_reduce_none, + 1, 245, :_reduce_none, + 1, 202, :_reduce_none, + 1, 251, :_reduce_none, + 1, 251, :_reduce_none, + 2, 251, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 252, :_reduce_none, + 5, 252, :_reduce_366, + 1, 254, :_reduce_none, + 2, 254, :_reduce_368, + 1, 260, :_reduce_none, + 1, 260, :_reduce_370, + 1, 287, :_reduce_none, + 3, 287, :_reduce_372, + 1, 290, :_reduce_373, + 3, 290, :_reduce_374, + 1, 289, :_reduce_375, + 3, 289, :_reduce_376, + 5, 289, :_reduce_377, + 1, 289, :_reduce_378, + 3, 289, :_reduce_379, + 2, 291, :_reduce_380, + 1, 291, :_reduce_381, + 4, 292, :_reduce_382, + 2, 292, :_reduce_383, + 2, 292, :_reduce_384, + 1, 292, :_reduce_385, + 2, 297, :_reduce_386, + 1, 297, :_reduce_none, + 6, 298, :_reduce_388, + 8, 298, :_reduce_389, + 4, 298, :_reduce_390, + 6, 298, :_reduce_391, + 4, 298, :_reduce_392, + 2, 298, :_reduce_393, + 6, 298, :_reduce_394, + 2, 298, :_reduce_395, + 4, 298, :_reduce_396, + 6, 298, :_reduce_397, + 2, 298, :_reduce_398, + 4, 298, :_reduce_399, + 2, 298, :_reduce_400, + 4, 298, :_reduce_401, + 1, 298, :_reduce_402, + 1, 302, :_reduce_403, + 1, 302, :_reduce_404, + 3, 303, :_reduce_405, + 1, 303, :_reduce_406, + 4, 303, :_reduce_407, + 1, 304, :_reduce_none, + 4, 304, :_reduce_409, + 1, 305, :_reduce_410, + 3, 305, :_reduce_411, + 1, 306, :_reduce_412, + 1, 306, :_reduce_none, + 0, 310, :_reduce_414, + 0, 311, :_reduce_415, + 5, 249, :_reduce_416, + 4, 308, :_reduce_417, + 1, 308, :_reduce_418, + 3, 309, :_reduce_419, + 3, 309, :_reduce_420, + 3, 313, :_reduce_421, + 2, 193, :_reduce_422, + 4, 193, :_reduce_423, + 5, 193, :_reduce_424, + 5, 193, :_reduce_425, + 2, 248, :_reduce_426, + 4, 248, :_reduce_427, + 4, 248, :_reduce_428, + 3, 248, :_reduce_429, + 3, 248, :_reduce_430, + 3, 248, :_reduce_431, + 2, 248, :_reduce_432, + 1, 248, :_reduce_433, + 4, 248, :_reduce_434, + 0, 316, :_reduce_435, + 4, 247, :_reduce_436, + 0, 317, :_reduce_437, + 4, 247, :_reduce_438, + 0, 318, :_reduce_439, + 0, 319, :_reduce_440, + 4, 198, :_reduce_441, + 0, 321, :_reduce_442, + 0, 322, :_reduce_443, + 4, 314, :_reduce_444, + 1, 320, :_reduce_445, + 2, 320, :_reduce_446, + 3, 320, :_reduce_447, + 4, 320, :_reduce_448, + 0, 324, :_reduce_449, + 6, 258, :_reduce_450, + 1, 323, :_reduce_none, + 1, 323, :_reduce_none, + 6, 160, :_reduce_453, + 0, 160, :_reduce_454, + 1, 325, :_reduce_455, + 1, 325, :_reduce_none, + 1, 325, :_reduce_none, + 2, 326, :_reduce_458, + 1, 326, :_reduce_none, + 2, 162, :_reduce_460, + 1, 162, :_reduce_none, + 1, 235, :_reduce_462, + 1, 235, :_reduce_none, + 1, 236, :_reduce_464, + 1, 328, :_reduce_465, + 1, 328, :_reduce_none, + 2, 328, :_reduce_467, + 3, 329, :_reduce_468, + 1, 329, :_reduce_469, + 3, 237, :_reduce_470, + 3, 238, :_reduce_471, + 3, 239, :_reduce_472, + 3, 239, :_reduce_473, + 1, 333, :_reduce_474, + 3, 333, :_reduce_475, + 1, 334, :_reduce_none, + 2, 334, :_reduce_477, + 3, 241, :_reduce_478, + 3, 241, :_reduce_479, + 1, 336, :_reduce_480, + 3, 336, :_reduce_481, + 3, 240, :_reduce_482, + 3, 240, :_reduce_483, + 3, 242, :_reduce_484, + 3, 242, :_reduce_485, + 1, 337, :_reduce_486, + 3, 337, :_reduce_487, + 1, 338, :_reduce_488, + 3, 338, :_reduce_489, + 1, 330, :_reduce_490, + 2, 330, :_reduce_491, + 1, 331, :_reduce_492, + 2, 331, :_reduce_493, + 1, 332, :_reduce_494, + 2, 332, :_reduce_495, + 1, 335, :_reduce_496, + 0, 340, :_reduce_497, + 3, 335, :_reduce_498, + 0, 341, :_reduce_499, + 4, 335, :_reduce_500, + 1, 339, :_reduce_501, + 1, 339, :_reduce_502, + 1, 339, :_reduce_503, + 1, 339, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 2, 342, :_reduce_507, + 1, 342, :_reduce_508, + 1, 344, :_reduce_none, + 1, 344, :_reduce_none, + 1, 344, :_reduce_none, + 1, 344, :_reduce_none, + 3, 343, :_reduce_513, + 1, 327, :_reduce_none, + 2, 327, :_reduce_515, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 211, :_reduce_none, + 1, 211, :_reduce_none, + 1, 211, :_reduce_none, + 1, 211, :_reduce_none, + 1, 211, :_reduce_none, + 1, 212, :_reduce_525, + 1, 212, :_reduce_526, + 1, 212, :_reduce_527, + 1, 212, :_reduce_528, + 1, 212, :_reduce_529, + 1, 212, :_reduce_530, + 1, 212, :_reduce_531, + 1, 243, :_reduce_532, + 1, 243, :_reduce_533, + 1, 179, :_reduce_534, + 1, 179, :_reduce_535, + 1, 184, :_reduce_536, + 1, 184, :_reduce_537, + 0, 345, :_reduce_538, + 4, 262, :_reduce_539, + 1, 262, :_reduce_540, + 3, 266, :_reduce_541, + 0, 347, :_reduce_542, + 3, 266, :_reduce_543, + 4, 346, :_reduce_544, + 2, 346, :_reduce_545, + 2, 346, :_reduce_546, + 1, 346, :_reduce_none, + 2, 349, :_reduce_548, + 0, 349, :_reduce_549, + 6, 312, :_reduce_550, + 8, 312, :_reduce_551, + 4, 312, :_reduce_552, + 6, 312, :_reduce_553, + 4, 312, :_reduce_554, + 6, 312, :_reduce_555, + 2, 312, :_reduce_556, + 4, 312, :_reduce_557, + 6, 312, :_reduce_558, + 2, 312, :_reduce_559, + 4, 312, :_reduce_560, + 2, 312, :_reduce_561, + 4, 312, :_reduce_562, + 1, 312, :_reduce_563, + 0, 312, :_reduce_564, + 1, 307, :_reduce_565, + 1, 307, :_reduce_566, + 1, 307, :_reduce_567, + 1, 307, :_reduce_568, + 1, 288, :_reduce_none, + 1, 288, :_reduce_570, + 1, 351, :_reduce_none, + 3, 351, :_reduce_572, + 1, 299, :_reduce_573, + 3, 299, :_reduce_574, + 1, 352, :_reduce_none, + 2, 353, :_reduce_576, + 1, 353, :_reduce_577, + 2, 354, :_reduce_578, + 1, 354, :_reduce_579, + 1, 293, :_reduce_none, + 3, 293, :_reduce_581, + 1, 348, :_reduce_none, + 3, 348, :_reduce_583, + 1, 355, :_reduce_none, + 1, 355, :_reduce_none, + 2, 294, :_reduce_586, + 1, 294, :_reduce_587, + 3, 356, :_reduce_588, + 3, 357, :_reduce_589, + 1, 300, :_reduce_590, + 3, 300, :_reduce_591, + 1, 350, :_reduce_592, + 3, 350, :_reduce_593, + 1, 358, :_reduce_none, + 1, 358, :_reduce_none, + 2, 301, :_reduce_596, + 1, 301, :_reduce_597, + 1, 359, :_reduce_none, + 1, 359, :_reduce_none, + 2, 296, :_reduce_600, + 2, 295, :_reduce_601, + 0, 295, :_reduce_602, + 1, 267, :_reduce_none, + 0, 360, :_reduce_604, + 4, 267, :_reduce_605, + 1, 246, :_reduce_606, + 2, 246, :_reduce_none, + 1, 229, :_reduce_none, + 3, 229, :_reduce_609, + 3, 361, :_reduce_610, + 2, 361, :_reduce_611, + 2, 361, :_reduce_612, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 1, 315, :_reduce_none, + 1, 315, :_reduce_none, + 1, 315, :_reduce_none, + 1, 268, :_reduce_none, + 1, 268, :_reduce_none, + 1, 183, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 0, 150, :_reduce_none, + 1, 150, :_reduce_none, + 0, 185, :_reduce_none, + 1, 185, :_reduce_none, + 2, 206, :_reduce_632, + 2, 182, :_reduce_633, + 0, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 263, :_reduce_637, + 1, 263, :_reduce_none, + 1, 153, :_reduce_none, + 2, 153, :_reduce_640, + 0, 151, :_reduce_641 ] + +racc_reduce_n = 642 + +racc_shift_n = 1083 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLOWEST => 141, + :tEQL => 142, + :tBDOT2 => 143, + :tBDOT3 => 144 } + +racc_nt_base = 145 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLOWEST", + "tEQL", + "tBDOT2", + "tBDOT3", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "@3", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@4", + "stmts", + "stmt_or_begin", + "@5", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@6", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@7", + "@8", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@9", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@10", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@11", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "dot_or_colon", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "@23", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@24", + "@25", + "f_args", + "do_block", + "do_body", + "operation3", + "@26", + "@27", + "@28", + "@29", + "case_args", + "@30", + "@31", + "cases", + "@32", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "@34", + "ssym", + "dsym", + "sym", + "@35", + "args_tail", + "@36", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@37", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_12(val, _values, result) + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_13(val, _values, result) + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + + result +end + +def _reduce_14(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_15(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_16(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 17 omitted + +# reduce 18 omitted + +def _reduce_19(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_20(val, _values, result) + result = val[1] + debug 12 + + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_23(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_24(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_25(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_27(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_28(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_29(val, _values, result) + result = val[1] + + result +end + +def _reduce_30(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_31(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_33(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_34(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_35(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_38(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_49(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +# reduce 50 omitted + +# reduce 51 omitted + +def _reduce_52(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_53(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_54(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_55(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_58(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_59(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_60(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 61 omitted + +# reduce 62 omitted + +# reduce 63 omitted + +def _reduce_64(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_65(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_66(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_67(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_68(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_69(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_70(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_71(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_72(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_73(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_74(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_75(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_76(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_77(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_78(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 79 omitted + +def _reduce_80(val, _values, result) + result = val[1] + + result +end + +# reduce 81 omitted + +def _reduce_82(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_83(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_84(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_85(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_86(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_87(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_88(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_89(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_90(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_91(val, _values, result) + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_92(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 93 omitted + +def _reduce_94(val, _values, result) + result = val[1] + + result +end + +def _reduce_95(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_96(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_97(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_98(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_99(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_100(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_101(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_102(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_103(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_104(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_105(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_106(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_107(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_108(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_109(val, _values, result) + var, = val + + result = self.assignable var + + debug 16 + + result +end + +def _reduce_110(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_111(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_112(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_113(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_114(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_115(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_116(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_117(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 118 omitted + +def _reduce_119(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_120(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_121(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +def _reduce_125(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 126 omitted + +def _reduce_127(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 128 omitted + +def _reduce_129(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_130(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_131(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +def _reduce_203(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_204(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_205(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_206(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_207(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_208(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_209(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_210(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_211(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_212(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_213(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_214(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_215(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_220(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_221(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_222(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_223(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 227 omitted + +def _reduce_228(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_231(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_232(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_233(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_234(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_235(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_236(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_238(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_239(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_240(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +# reduce 241 omitted + +# reduce 242 omitted + +# reduce 243 omitted + +# reduce 244 omitted + +# reduce 245 omitted + +def _reduce_246(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_247(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_248(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 249 omitted + +def _reduce_250(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_251(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_252(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 253 omitted + +def _reduce_254(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_255(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +# reduce 256 omitted + +# reduce 257 omitted + +# reduce 258 omitted + +# reduce 259 omitted + +def _reduce_260(val, _values, result) + result = args val + + result +end + +def _reduce_261(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_262(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_263(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_264(val, _values, result) + result = call_args val + + result +end + +def _reduce_265(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_266(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_267(val, _values, result) + result = call_args val + + result +end + +def _reduce_268(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_269(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_270(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_271(val, _values, result) + result = val[1] + + result +end + +# reduce 272 omitted + +def _reduce_273(val, _values, result) + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + + result +end + +def _reduce_274(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_275(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_276(val, _values, result) + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_277(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_278(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_279(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_280(val, _values, result) + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_281(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 282 omitted + +# reduce 283 omitted + +# reduce 284 omitted + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +# reduce 290 omitted + +# reduce 291 omitted + +def _reduce_292(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_293(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_294(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_295(val, _values, result) + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + + result +end + +def _reduce_296(val, _values, result) + _, line, _ = val + result = s(:begin).line line + + result +end + +def _reduce_297(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_298(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_299(val, _values, result) + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + + result +end + +def _reduce_300(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_301(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_302(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_303(val, _values, result) + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_304(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_305(val, _values, result) + result = new_hash val + + result +end + +def _reduce_306(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_307(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_308(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_309(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_310(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_311(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_312(val, _values, result) + debug 20 + + result +end + +def _reduce_313(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 314 omitted + +def _reduce_315(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_316(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_317(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_318(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_319(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_320(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_321(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_322(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_323(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_324(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_325(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_326(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_327(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_328(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_329(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_330(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_331(val, _values, result) + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result +end + +def _reduce_332(val, _values, result) + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_333(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_334(val, _values, result) + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + + result +end + +def _reduce_335(val, _values, result) + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_336(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_337(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_338(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_339(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_340(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 341 omitted + +# reduce 342 omitted + +# reduce 343 omitted + +# reduce 344 omitted + +# reduce 345 omitted + +# reduce 346 omitted + +# reduce 347 omitted + +def _reduce_348(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_349(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_350(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +# reduce 351 omitted + +# reduce 352 omitted + +# reduce 353 omitted + +# reduce 354 omitted + +# reduce 355 omitted + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +# reduce 360 omitted + +# reduce 361 omitted + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +def _reduce_366(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 367 omitted + +def _reduce_368(val, _values, result) + result = val[1] + + result +end + +# reduce 369 omitted + +def _reduce_370(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = val[1] + + result +end + +def _reduce_373(val, _values, result) + sym, = val + + result = s(:array, sym).line lexer.lineno + + result +end + +def _reduce_374(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_375(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_376(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_377(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_378(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_379(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_380(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_381(val, _values, result) + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + + result +end + +def _reduce_382(val, _values, result) + result = call_args val + + result +end + +def _reduce_383(val, _values, result) + result = call_args val + + result +end + +def _reduce_384(val, _values, result) + result = call_args val + + result +end + +def _reduce_385(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_386(val, _values, result) + result = args val + + result +end + +# reduce 387 omitted + +def _reduce_388(val, _values, result) + result = args val + + result +end + +def _reduce_389(val, _values, result) + result = args val + + result +end + +def _reduce_390(val, _values, result) + result = args val + + result +end + +def _reduce_391(val, _values, result) + result = args val + + result +end + +def _reduce_392(val, _values, result) + result = args val + + result +end + +def _reduce_393(val, _values, result) + result = args(val) << nil + + result +end + +def _reduce_394(val, _values, result) + result = args val + + result +end + +def _reduce_395(val, _values, result) + result = args val + + result +end + +def _reduce_396(val, _values, result) + result = args val + + result +end + +def _reduce_397(val, _values, result) + result = args val + + result +end + +def _reduce_398(val, _values, result) + result = args val + + result +end + +def _reduce_399(val, _values, result) + result = args val + + result +end + +def _reduce_400(val, _values, result) + result = args val + + result +end + +def _reduce_401(val, _values, result) + result = args val + + result +end + +def _reduce_402(val, _values, result) + result = args val + + result +end + +def _reduce_403(val, _values, result) + result = 0 + result +end + +def _reduce_404(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_405(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +def _reduce_406(val, _values, result) + result = s(:args).line lexer.lineno + + result +end + +def _reduce_407(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +# reduce 408 omitted + +def _reduce_409(val, _values, result) + result = args val + + result +end + +def _reduce_410(val, _values, result) + result = args val + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +def _reduce_412(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 413 omitted + +def _reduce_414(val, _values, result) + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_415(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_416(val, _values, result) + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_417(val, _values, result) + result = args val + + result +end + +def _reduce_418(val, _values, result) + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_419(val, _values, result) + result = val[1] + + result +end + +def _reduce_420(val, _values, result) + result = val[1] + + result +end + +def _reduce_421(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_422(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_423(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_424(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_425(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_426(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_427(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_428(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_429(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_430(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_431(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_432(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_433(val, _values, result) + result = s(:zsuper).line lexer.lineno + + result +end + +def _reduce_434(val, _values, result) + result = new_aref val + + result +end + +def _reduce_435(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_436(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_437(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_438(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_439(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_440(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_441(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_442(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_443(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_444(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_445(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_446(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_447(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_448(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_449(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_450(val, _values, result) + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + + result +end + +# reduce 451 omitted + +# reduce 452 omitted + +def _reduce_453(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_454(val, _values, result) + result = nil + + result +end + +def _reduce_455(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 456 omitted + +# reduce 457 omitted + +def _reduce_458(val, _values, result) + result = val[1] + + result +end + +# reduce 459 omitted + +def _reduce_460(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 461 omitted + +def _reduce_462(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 463 omitted + +def _reduce_464(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_465(val, _values, result) + debug 37 + + result +end + +# reduce 466 omitted + +def _reduce_467(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_468(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_469(val, _values, result) + result = new_string val + + result +end + +def _reduce_470(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_471(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_472(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_473(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_474(val, _values, result) + result = new_word_list + + result +end + +def _reduce_475(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 476 omitted + +def _reduce_477(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_478(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_479(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_480(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_481(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_482(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_483(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_484(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_485(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_486(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_487(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_488(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_489(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_490(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_491(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_492(val, _values, result) + result = nil + + result +end + +def _reduce_493(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_494(val, _values, result) + result = nil + + result +end + +def _reduce_495(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_496(val, _values, result) + result = new_string val + + result +end + +def _reduce_497(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_498(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_499(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_500(val, _values, result) + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_501(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_502(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_503(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 504 omitted + +# reduce 505 omitted + +# reduce 506 omitted + +def _reduce_507(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_508(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 509 omitted + +# reduce 510 omitted + +# reduce 511 omitted + +# reduce 512 omitted + +def _reduce_513(val, _values, result) + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + + result +end + +# reduce 514 omitted + +def _reduce_515(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 516 omitted + +# reduce 517 omitted + +# reduce 518 omitted + +# reduce 519 omitted + +# reduce 520 omitted + +# reduce 521 omitted + +# reduce 522 omitted + +# reduce 523 omitted + +# reduce 524 omitted + +def _reduce_525(val, _values, result) + result = s(:nil).line lexer.lineno + result +end + +def _reduce_526(val, _values, result) + result = s(:self).line lexer.lineno + result +end + +def _reduce_527(val, _values, result) + result = s(:true).line lexer.lineno + result +end + +def _reduce_528(val, _values, result) + result = s(:false).line lexer.lineno + result +end + +def _reduce_529(val, _values, result) + result = s(:str, self.file).line lexer.lineno + result +end + +def _reduce_530(val, _values, result) + result = s(:lit, lexer.lineno).line lexer.lineno + result +end + +def _reduce_531(val, _values, result) + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_532(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + + result +end + +def _reduce_533(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_534(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_535(val, _values, result) + result = self.assignable val[0] + debug 40 + + result +end + +def _reduce_536(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_537(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_538(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_539(val, _values, result) + result = val[2] + + result +end + +def _reduce_540(val, _values, result) + result = nil + + result +end + +def _reduce_541(val, _values, result) + result = end_args val + + result +end + +def _reduce_542(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_543(val, _values, result) + result = end_args val + + result +end + +def _reduce_544(val, _values, result) + result = args val + + result +end + +def _reduce_545(val, _values, result) + result = args val + + result +end + +def _reduce_546(val, _values, result) + result = args val + + result +end + +# reduce 547 omitted + +def _reduce_548(val, _values, result) + result = val[1] + + result +end + +def _reduce_549(val, _values, result) + result = nil + + result +end + +def _reduce_550(val, _values, result) + result = args val + + result +end + +def _reduce_551(val, _values, result) + result = args val + + result +end + +def _reduce_552(val, _values, result) + result = args val + + result +end + +def _reduce_553(val, _values, result) + result = args val + + result +end + +def _reduce_554(val, _values, result) + result = args val + + result +end + +def _reduce_555(val, _values, result) + result = args val + + result +end + +def _reduce_556(val, _values, result) + result = args val + + result +end + +def _reduce_557(val, _values, result) + result = args val + + result +end + +def _reduce_558(val, _values, result) + result = args val + + result +end + +def _reduce_559(val, _values, result) + result = args val + + result +end + +def _reduce_560(val, _values, result) + result = args val + + result +end + +def _reduce_561(val, _values, result) + result = args val + + result +end + +def _reduce_562(val, _values, result) + result = args val + + result +end + +def _reduce_563(val, _values, result) + result = args val + + result +end + +def _reduce_564(val, _values, result) + result = args val + # result.line lexer.lineno + + result +end + +def _reduce_565(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_566(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_567(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_568(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 571 omitted + +def _reduce_572(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_573(val, _values, result) + result = new_arg val + + result +end + +def _reduce_574(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +# reduce 575 omitted + +def _reduce_576(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_577(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_578(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_579(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 580 omitted + +def _reduce_581(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 582 omitted + +def _reduce_583(val, _values, result) + result = args val + + result +end + +# reduce 584 omitted + +# reduce 585 omitted + +def _reduce_586(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_587(val, _values, result) + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + + result +end + +def _reduce_588(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + + result +end + +def _reduce_589(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + + result +end + +def _reduce_590(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_591(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_592(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_593(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 594 omitted + +# reduce 595 omitted + +def _reduce_596(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_597(val, _values, result) + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + + result +end + +# reduce 598 omitted + +# reduce 599 omitted + +def _reduce_600(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_601(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_602(val, _values, result) + result = nil + + result +end + +# reduce 603 omitted + +def _reduce_604(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_605(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_606(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 607 omitted + +# reduce 608 omitted + +def _reduce_609(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_610(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_611(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_612(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 613 omitted + +# reduce 614 omitted + +# reduce 615 omitted + +# reduce 616 omitted + +# reduce 617 omitted + +# reduce 618 omitted + +# reduce 619 omitted + +# reduce 620 omitted + +# reduce 621 omitted + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +# reduce 626 omitted + +# reduce 627 omitted + +# reduce 628 omitted + +# reduce 629 omitted + +# reduce 630 omitted + +# reduce 631 omitted + +def _reduce_632(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_633(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 634 omitted + +# reduce 635 omitted + +# reduce 636 omitted + +def _reduce_637(val, _values, result) + yyerrok + result +end + +# reduce 638 omitted + +# reduce 639 omitted + +def _reduce_640(val, _values, result) + yyerrok + result +end + +def _reduce_641(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby21Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby21_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby21_parser.y new file mode 100644 index 000000000..974ccc340 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby21_parser.y @@ -0,0 +1,2724 @@ +# -*- racc -*- + +class Ruby21Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + compstmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_item: f_norm_arg + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + + f_opt: f_norm_arg tEQL arg_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + + f_block_opt: f_norm_arg tEQL primary_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby22_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby22_parser.rb new file mode 100644 index 000000000..fd12e3a16 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby22_parser.rb @@ -0,0 +1,11122 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby22Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -520, 573, 573, 654, 573, 573, 284, -520, -520, -520, + 3, 573, -520, -520, -520, 284, -520, 233, -94, 657, + 224, 225, 95, -111, -520, 254, -520, -520, -520, -108, + 96, -109, -80, 130, 224, 225, -520, -520, 129, -520, + -520, -520, -520, -520, 231, -102, -116, -104, -113, -115, + -111, -110, -113, 234, 428, 126, 886, 251, -110, 430, + 429, 253, 252, 224, 225, 221, 653, -520, -520, -520, + -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, + -520, 746, 656, -520, -520, -520, -107, -520, -520, 224, + 225, -520, 851, 286, -520, -520, 222, -520, 852, -520, + -116, -520, 286, -520, -520, -520, -520, -520, -520, -520, + 234, -520, -102, -520, -104, 130, 130, -112, 130, 130, + 129, 129, 948, 129, 129, 130, -520, -520, -520, -520, + 129, -520, -523, -520, -99, -112, -100, -111, -520, -523, + -523, -523, -111, -520, -523, -523, -523, -102, -523, -104, + -102, -107, -104, 234, -106, -102, -523, -104, -523, -523, + -523, 885, -113, -101, -102, -110, -104, -113, -523, -523, + -110, -523, -523, -523, -523, -523, -114, 108, 109, 234, + 834, 130, 284, -618, 834, 230, 129, 284, -534, 108, + 109, -520, 279, 735, 224, 225, 734, -615, -520, -523, + -523, -523, -523, -523, -523, -523, -523, -523, -523, -523, + -523, -523, -523, -618, 833, -523, -523, -523, 833, -523, + -523, -523, -103, -523, 638, -530, -523, -523, -523, -523, + -616, -523, -530, -523, 223, -523, -523, -523, -523, -523, + -523, -523, -619, -523, -108, -523, -534, 281, 638, -112, + -520, 638, 281, 226, -112, 110, 111, -520, -523, -523, + -523, -523, -615, -523, -300, -523, -520, 110, 111, 286, + -523, -300, -300, -300, 286, -523, 623, -300, -300, 254, + -300, -105, 230, -523, -615, 640, 639, 626, -99, 229, + -523, 130, -622, -434, 797, -616, 129, 274, 227, -523, + -300, -300, -108, -300, -300, -300, -300, -300, 336, 640, + 639, 251, 640, 639, 636, 253, 252, -616, 799, -529, + 634, 633, 638, 130, 735, 337, -529, 737, 129, -622, + -535, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, -300, -300, -300, -622, -434, -300, -300, -300, + 638, 680, -622, -434, 627, -300, 587, -618, -300, 482, + 588, -622, -434, -300, 638, -300, 234, -300, -300, -300, + -300, -300, -300, -300, 231, -300, 623, -300, 638, -622, + -434, 638, -622, 640, 639, 636, -109, 626, 400, -622, + -300, -300, -622, -105, -618, -300, -535, 552, -622, -622, + -622, -622, -300, 708, 130, -622, -622, -114, -622, 129, + 403, 640, 639, 641, 406, -116, -622, -622, 825, 638, + 634, 633, 643, 224, 225, 640, 639, 646, -622, -622, + -116, -622, -622, -622, -622, -622, 552, 409, -100, 640, + 639, 651, 640, 639, 658, 735, 674, 865, 737, 580, + 826, 674, -109, -115, 627, 675, 919, 812, 426, -622, + -622, -622, -622, -622, -622, -622, -622, -622, -622, -622, + -622, -622, -622, 431, -111, -622, -622, -622, -106, 681, + 640, 639, 675, -622, 812, 130, -622, -531, -102, 481, + 129, -622, -115, -622, -531, -622, -622, -622, -622, -622, + -622, -622, -111, -622, -622, -622, -113, -111, 483, -340, + -528, -113, -110, -110, 271, 272, -340, -528, -622, -622, + -622, -103, 484, -622, -104, -340, -101, -622, -622, -622, + -622, 233, -622, -622, -622, -112, -622, 130, -113, 513, + -110, 522, 129, 525, 254, -622, -622, -622, -622, 270, + 269, -525, 735, 861, 865, 737, -622, -622, -525, -622, + -622, -622, -622, -622, 618, -526, 615, 614, 613, 527, + 616, 618, -526, 615, 614, 613, 251, 616, -527, 600, + 253, 252, 249, 250, -79, -527, 601, -622, -622, -622, + -622, -622, -622, -622, -622, -622, -622, -622, -622, -622, + -622, 234, 785, -622, -622, -622, 230, 827, -622, 785, + 538, -622, 539, 479, -622, -622, 546, -622, 789, -622, + 291, -622, 480, -622, -622, -622, -622, -622, -622, -622, + 234, -622, -622, -622, 618, 281, 615, 614, 613, 623, + 616, 133, 134, 135, 136, 137, -622, -622, -622, -622, + 626, -622, -300, -622, 234, -532, 549, 1046, -622, -300, + -300, -300, -532, -112, -300, -300, -300, 553, -300, 254, + -533, -532, 621, 604, 634, 633, 254, -533, -300, -300, + -300, 631, 630, 634, 633, 234, -533, 580, -300, -300, + 419, -300, -300, -300, -300, -300, 618, 585, 615, 614, + 613, 586, 616, 618, 594, 615, 614, 613, 251, 616, + 861, 865, 253, 252, 249, 250, 645, 627, 649, -300, + -300, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, -300, 652, 785, -300, -300, -300, 230, 828, + -300, 785, 655, -300, 662, 545, -300, -300, -273, -300, + 789, -300, 664, -300, 543, -300, -300, -300, -300, -300, + -300, -300, 665, -300, 234, -300, 618, 672, 615, 614, + 613, 623, 616, 133, 134, 135, 136, 137, -300, -300, + -300, -300, 626, -300, -300, -300, 673, 281, 685, 254, + -300, -300, -300, -300, 254, -114, 254, -300, -300, 618, + -300, 615, 614, 613, 621, 616, 618, 254, 615, 614, + 613, 692, 616, 631, 630, 634, 633, 234, 234, 426, + -300, -300, -291, -300, -300, -300, -300, -300, 234, -291, + -94, 712, 230, 234, 230, 558, 723, 785, -291, 555, + 728, 584, 731, 234, 785, 234, 789, 739, 480, 627, + 582, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, -300, -300, -300, 230, 230, -300, -300, -300, + -301, 680, 590, 668, 527, -300, 742, -301, -300, 731, + 731, 592, 666, -300, 580, -300, -301, -300, -300, -300, + -300, -300, -300, -300, 731, -300, 767, -300, -301, 773, + 230, -532, -533, 776, 777, -301, 779, 1030, -532, -533, + -300, -300, -622, -300, -301, -300, 592, -532, -533, -622, + -622, -622, -300, 781, 783, -622, -622, -114, -622, 254, + -644, -644, -644, -644, 271, 272, 792, -622, -644, -644, + 230, 793, 794, -291, 800, 264, 265, 1036, -622, -622, + -291, -622, -622, -622, -622, -622, 1034, 801, -274, -291, + 813, 251, 513, 257, 513, 253, 252, 249, 250, 270, + 269, 255, 618, 256, 615, 614, 613, 234, 616, -622, + -622, -622, -622, -622, -622, -622, -622, -622, -622, -622, + -622, -622, -622, -300, 230, -622, -622, -622, 830, 681, + -300, 1030, 274, -622, 839, -619, -622, 841, 525, -300, + 592, -622, 527, -622, 723, -622, -622, -622, -622, -622, + -622, -622, 234, -622, -622, -622, -301, 281, 281, 723, + 908, 909, 254, -301, 910, 124, 125, 865, -622, -622, + 731, -622, -301, -622, 8, 85, 86, 87, 12, 78, + -622, 234, 234, 79, 80, -112, 731, 234, 83, 903, + 81, 82, 84, 33, 34, 76, 77, 133, 134, 135, + 136, 137, 88, 31, 30, 118, 117, 119, 120, 904, + 234, 22, 913, -275, 234, 918, 669, 11, 49, 10, + 13, 122, 121, 123, 112, 60, 114, 113, 115, 935, + 116, 124, 125, 723, 108, 109, -273, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, -300, 247, 248, 940, 731, 264, 265, -300, 43, + 731, 731, 36, -619, 731, 62, 63, -300, 731, 64, + 234, 38, 251, 960, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, 234, 776, -300, 105, 95, + 97, 98, 99, 101, -300, 963, 965, 96, 106, -619, + 268, 967, -248, -300, 969, 89, 969, 234, 93, 100, + 102, 976, 110, 111, 310, 85, 86, 87, 12, 78, + -276, 977, 776, 79, 80, 980, 983, 985, 83, 987, + 81, 82, 84, 33, 34, 76, 77, 133, 134, 135, + 136, 137, 88, 31, 30, 118, 117, 119, 120, 234, + 989, 22, 767, 1007, 1008, 1017, 669, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, 1018, + 116, 124, 125, 1028, 108, 109, 1031, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, 851, 247, 248, 1037, 731, 264, 265, 1047, 43, + 969, 969, 314, 969, 776, 62, 63, 1054, 1056, 64, + 1058, 38, 251, 1060, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, 1060, 728, 731, 105, 95, + 97, 98, 99, 101, 1018, -619, -618, 96, 106, 234, + 268, 969, 1081, 1060, 1060, 89, 1060, 1060, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + 1011, 22, 615, 614, 613, nil, 616, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, nil, 247, 248, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + 268, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + 1011, 22, 615, 614, 613, nil, 616, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, nil, 247, 248, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + 268, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, nil, 247, 248, nil, nil, 264, 265, nil, 43, + nil, nil, 314, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, 234, + 268, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, nil, 247, 248, nil, nil, 264, 265, nil, 43, + nil, nil, 314, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + 268, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, nil, 247, 248, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + 268, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, nil, 247, 248, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + 268, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, nil, -644, -644, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, 267, 262, + 263, nil, -644, -644, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, -644, -644, -644, -644, 271, 272, nil, nil, -644, + -644, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, -644, -644, -644, -644, 271, 272, nil, nil, -644, + -644, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 8, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 10, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, -644, -644, -644, -644, 271, 272, nil, nil, -644, + -644, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, -644, -644, -644, -644, 271, 272, nil, nil, -644, + -644, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, -644, -644, -644, -644, 271, 272, nil, nil, -644, + -644, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, nil, nil, 262, + 263, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, 258, 259, 260, 261, 271, 272, 266, nil, 262, + 263, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 270, 269, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, 254, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + 264, 265, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, 251, 96, 106, nil, + 253, 252, 249, 250, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + nil, nil, 255, 23, 256, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + 254, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 264, 265, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, 251, nil, 257, 48, 253, 252, 249, 250, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 310, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, 312, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 10, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, 618, 64, 615, 614, + 613, 623, 616, 48, nil, nil, nil, nil, nil, nil, + nil, 244, 626, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, 621, -433, 93, 100, 102, nil, + 110, 111, -433, -433, -433, 634, 633, -433, -433, -433, + 618, -433, 615, 614, 613, 623, 616, nil, nil, nil, + -433, -433, -433, nil, nil, nil, 626, nil, nil, nil, + nil, -433, -433, nil, -433, -433, -433, -433, -433, 627, + nil, nil, nil, nil, nil, nil, nil, nil, 621, nil, + nil, nil, nil, nil, nil, nil, nil, 631, 630, 634, + 633, nil, -433, -433, -433, -433, -433, -433, -433, -433, + -433, -433, -433, -433, -433, -433, nil, nil, -433, -433, + -433, nil, nil, -433, nil, 281, -433, nil, nil, -433, + -433, nil, -433, 627, -433, nil, -433, nil, -433, -433, + -433, -433, -433, -433, -433, nil, -433, -433, -433, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, -433, -433, -309, -433, nil, -433, nil, nil, nil, + -309, -309, -309, -433, nil, -309, -309, -309, 618, -309, + 615, 614, 613, 623, 616, nil, nil, nil, nil, -309, + -309, nil, nil, nil, 626, nil, nil, nil, nil, -309, + -309, nil, -309, -309, -309, -309, -309, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 621, nil, nil, nil, + nil, nil, nil, nil, nil, 631, 630, 634, 633, nil, + -309, -309, -309, -309, -309, -309, -309, -309, -309, -309, + -309, -309, -309, -309, nil, nil, -309, -309, -309, nil, + nil, -309, nil, 291, -309, nil, nil, -309, -309, nil, + -309, 627, -309, nil, -309, nil, -309, -309, -309, -309, + -309, -309, -309, nil, -309, nil, -309, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, -309, + -309, nil, -309, nil, -309, 85, 86, 87, nil, 78, + nil, -309, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 303, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, 300, nil, 298, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 301, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 304, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 303, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + 300, nil, 298, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 301, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 304, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 303, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, 300, + nil, 298, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 301, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 304, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 329, 330, 76, 77, nil, nil, nil, nil, nil, 88, + 326, 332, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 327, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, nil, nil, 333, nil, nil, nil, + nil, nil, 618, nil, 615, 614, 613, 623, 616, nil, + nil, nil, nil, nil, nil, nil, 323, nil, 626, 319, + nil, nil, 62, 63, nil, nil, 64, nil, 318, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 621, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, 634, 633, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, 627, 81, 82, 84, 329, + 330, 76, 77, nil, nil, nil, nil, nil, 88, 326, + 332, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 327, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, nil, nil, 333, nil, nil, nil, nil, + nil, 618, nil, 615, 614, 613, 623, 616, nil, nil, + nil, nil, nil, nil, nil, 323, nil, 626, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 621, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + 634, 633, nil, 96, 106, nil, nil, nil, 335, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, 627, 81, 82, 84, 329, 330, + 76, 77, nil, nil, nil, nil, nil, 88, 326, 332, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 329, 330, 76, 77, + nil, nil, nil, nil, nil, 88, 326, 332, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, 618, 64, 615, 614, 613, 623, 616, 48, nil, + nil, nil, nil, nil, nil, nil, 244, 626, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, 621, + -292, 93, 100, 102, nil, 110, 111, -292, -292, -292, + 634, 633, -292, -292, -292, 618, -292, 615, 614, 613, + 623, 616, nil, nil, nil, nil, -292, -292, -292, nil, + nil, 626, nil, nil, nil, nil, -292, -292, nil, -292, + -292, -292, -292, -292, 627, nil, nil, nil, nil, nil, + nil, nil, nil, 621, nil, nil, nil, nil, nil, nil, + nil, nil, 631, 630, 634, 633, nil, -292, -292, -292, + -292, -292, -292, -292, -292, -292, -292, -292, -292, -292, + -292, nil, nil, -292, -292, -292, nil, nil, -292, nil, + nil, -292, nil, nil, -292, -292, nil, -292, 627, -292, + nil, -292, nil, -292, -292, -292, -292, -292, -292, -292, + nil, -292, nil, -292, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, -292, -292, -292, -292, + nil, -292, nil, -292, nil, nil, nil, -643, -292, 85, + 86, 87, 12, 78, -643, -643, -643, 79, 80, -643, + -643, -643, 83, -643, 81, 82, 84, 33, 34, 76, + 77, nil, -643, -643, -643, nil, 88, 31, 30, 118, + 117, 119, 120, -643, -643, 22, -643, -643, -643, -643, + -643, 11, 49, nil, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, -643, -643, -643, -643, -643, -643, + -643, -643, -643, -643, -643, -643, -643, -643, nil, nil, + -643, -643, -643, 43, nil, -643, 36, 281, -643, 62, + 63, -643, -643, 64, -643, 38, -643, nil, -643, 48, + -643, -643, -643, -643, -643, -643, -643, 23, -643, -643, + -643, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, -643, -643, nil, -643, nil, -643, 89, + nil, nil, 93, 100, 102, -643, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + 130, nil, nil, nil, nil, 129, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 327, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 333, + nil, nil, nil, nil, nil, 618, nil, 615, 614, 613, + 623, 616, nil, nil, nil, nil, nil, nil, nil, 363, + nil, 626, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 621, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 634, 633, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 627, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 327, nil, nil, + 122, 121, 123, 368, 60, 114, 113, 369, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 333, nil, + nil, nil, nil, nil, 618, nil, 615, 614, 613, 623, + 616, nil, nil, nil, nil, 375, nil, nil, 370, nil, + 626, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 621, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 634, 633, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 627, 81, 82, + 84, 329, 330, 76, 77, nil, nil, nil, nil, nil, + 88, 326, 332, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 327, nil, nil, 122, + 121, 123, 368, 60, 114, 113, 369, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 333, nil, nil, + nil, nil, nil, 618, nil, 615, 614, 613, 623, 616, + nil, nil, nil, nil, nil, nil, nil, 370, nil, 626, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 621, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, 634, 633, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, 12, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, 627, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 49, 10, 13, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 43, nil, nil, 36, + nil, nil, 62, 63, nil, nil, 64, nil, 38, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, 419, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + 12, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 49, nil, 13, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 43, nil, nil, 36, nil, nil, 62, 63, nil, + nil, 64, nil, 38, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, 436, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, 436, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 303, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, 300, nil, 298, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 301, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 304, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, 234, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 329, 330, 76, 77, nil, nil, + nil, nil, nil, 88, 326, 332, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 329, 330, 76, 77, nil, nil, nil, nil, nil, + 88, 326, 332, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 329, 330, 76, 77, nil, nil, nil, nil, nil, 88, + 326, 332, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 329, + 330, 76, 77, nil, nil, nil, nil, nil, 88, 326, + 332, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 329, 330, + 76, 77, nil, nil, nil, nil, nil, 88, 326, 332, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 329, 330, 76, 77, + nil, nil, nil, nil, nil, 88, 326, 332, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 329, 330, 76, 77, nil, nil, + nil, nil, nil, 88, 326, 332, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 329, 330, 76, 77, nil, nil, nil, nil, nil, + 88, 326, 332, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 329, 330, 76, 77, nil, nil, nil, nil, nil, 88, + 326, 332, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 329, + 330, 76, 77, nil, nil, nil, nil, nil, 88, 326, + 332, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 329, 330, + 76, 77, nil, nil, nil, nil, nil, 88, 326, 332, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 329, 330, 76, 77, + nil, nil, nil, nil, nil, 88, 326, 332, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 329, 330, 76, 77, nil, nil, + nil, nil, nil, 88, 326, 332, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 303, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, 300, + nil, 298, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 301, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 304, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 303, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, 300, nil, + 298, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 301, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 304, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 303, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, 300, nil, 298, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 301, 97, 98, 99, 101, + nil, nil, nil, 96, 106, 234, nil, nil, nil, nil, + nil, 89, nil, 304, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 329, 330, + 76, 77, nil, nil, nil, nil, nil, 88, 326, 332, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 329, 330, 76, 77, + nil, nil, nil, nil, nil, 88, 326, 332, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, 12, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 49, + nil, 13, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, 36, nil, nil, 62, 63, nil, nil, + 64, nil, 38, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 327, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 333, + nil, nil, nil, nil, nil, 618, nil, 615, 614, 613, + 623, 616, nil, nil, nil, nil, nil, nil, nil, 323, + nil, 626, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 621, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 634, 633, nil, 96, 106, nil, + nil, nil, 541, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 627, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 327, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 333, nil, + nil, nil, nil, nil, 618, nil, 615, 614, 613, 623, + 616, nil, nil, nil, nil, nil, nil, nil, 323, nil, + 626, 319, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 621, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 634, 633, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 627, 81, 82, + 84, 329, 330, 76, 77, nil, nil, nil, nil, nil, + 88, 326, 332, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 329, 330, 76, 77, nil, nil, nil, nil, nil, 88, + 326, 332, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + 558, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 329, + 330, 76, 77, nil, nil, nil, nil, nil, 88, 326, + 332, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 303, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, 300, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 301, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 304, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 329, 330, + 76, 77, nil, nil, nil, nil, nil, 88, 326, 332, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 303, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 301, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 304, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + 618, 64, 615, 614, 613, 623, 616, 48, nil, nil, + nil, nil, nil, nil, nil, 244, 626, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, 621, -623, + 93, 100, 102, nil, 110, 111, -623, -623, -623, 634, + 633, -623, -623, -623, 618, -623, 615, 614, 613, 623, + 616, nil, nil, nil, -623, -623, -623, -623, nil, nil, + 626, nil, nil, nil, nil, -623, -623, nil, -623, -623, + -623, -623, -623, 627, nil, nil, nil, nil, nil, nil, + nil, nil, 621, nil, nil, nil, nil, nil, nil, nil, + nil, 631, 630, 634, 633, nil, -623, -623, -623, -623, + -623, -623, -623, -623, -623, -623, -623, -623, -623, -623, + nil, nil, -623, -623, -623, nil, nil, -623, nil, nil, + -623, nil, nil, -623, -623, nil, -623, 627, -623, nil, + -623, nil, -623, -623, -623, -623, -623, -623, -623, nil, + -623, -623, -623, 618, nil, 615, 614, 613, 623, 616, + nil, nil, nil, nil, nil, -623, -623, -623, -623, 626, + -623, -624, -623, nil, nil, nil, nil, -623, -624, -624, + -624, nil, nil, -624, -624, -624, nil, -624, nil, nil, + nil, 621, nil, nil, nil, nil, -624, -624, -624, -624, + 631, 630, 634, 633, nil, nil, nil, -624, -624, nil, + -624, -624, -624, -624, -624, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 234, nil, + nil, nil, nil, nil, nil, nil, 627, nil, -624, -624, + -624, -624, -624, -624, -624, -624, -624, -624, -624, -624, + -624, -624, nil, nil, -624, -624, -624, nil, nil, -624, + nil, nil, -624, nil, nil, -624, -624, nil, -624, nil, + -624, nil, -624, nil, -624, -624, -624, -624, -624, -624, + -624, nil, -624, -624, -624, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, -624, -624, -624, + -624, nil, -624, nil, -624, nil, 85, 86, 87, -624, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 303, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, 300, nil, 298, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 301, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 304, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 329, 330, 76, 77, nil, nil, nil, nil, nil, + 88, 326, 332, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, -643, 93, 100, 102, nil, + 110, 111, -643, -643, -643, nil, nil, -643, -643, -643, + nil, -643, nil, nil, nil, nil, nil, nil, nil, nil, + -643, -643, nil, nil, nil, nil, nil, nil, nil, nil, + nil, -643, -643, nil, -643, -643, -643, -643, -643, nil, + nil, nil, nil, nil, nil, nil, 511, 463, nil, nil, + 512, nil, nil, nil, nil, nil, nil, nil, nil, 173, + 174, nil, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, -643, nil, nil, 175, 176, 161, 162, + -643, nil, nil, nil, nil, 281, -643, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, -643, -643, 177, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, -643, nil, 85, 86, 87, -643, 78, nil, 170, + nil, 79, 80, -643, nil, nil, 83, nil, 81, 82, + 84, 329, 330, 76, 77, nil, nil, nil, nil, nil, + 88, 326, 332, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 303, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, 705, + nil, 298, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 301, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 304, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 329, 330, 76, 77, nil, nil, nil, nil, nil, 88, + 326, 332, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 303, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + 298, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 301, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 304, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 329, + 330, 76, 77, nil, nil, nil, nil, nil, 88, 326, + 332, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 312, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, 419, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 327, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, nil, nil, 333, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 323, nil, nil, 319, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, 303, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, 300, nil, 298, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 301, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + 304, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 327, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 333, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 323, nil, nil, 319, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 329, 330, 76, 77, nil, nil, + nil, nil, nil, 88, 326, 332, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 303, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, 300, + nil, 298, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 301, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 304, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 303, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, 300, nil, + 298, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 301, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 304, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 329, 330, + 76, 77, nil, nil, nil, nil, nil, 88, 326, 332, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, 805, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 303, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, 300, nil, 298, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 301, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 304, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 329, 330, 76, 77, nil, nil, + nil, nil, nil, 88, 326, 332, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 303, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, 705, nil, 298, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 301, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 304, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 303, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, 298, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 301, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 304, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 329, 330, 76, 77, + nil, nil, nil, nil, nil, 88, 326, 332, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 327, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 333, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 323, nil, nil, 319, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 329, 330, 76, 77, nil, nil, + nil, nil, nil, 88, 326, 332, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 327, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 333, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 323, nil, nil, 319, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, 436, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 303, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + 705, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 301, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 304, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 329, 330, 76, 77, nil, nil, nil, nil, nil, + 88, 326, 332, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 303, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 301, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 304, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 329, 330, 76, 77, nil, nil, nil, nil, nil, 88, + 326, 332, 118, 117, 119, 120, nil, nil, 246, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, 870, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 329, 330, + 76, 77, nil, nil, nil, nil, nil, 88, 326, 332, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 239, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 239, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 329, 330, 76, 77, nil, nil, + nil, nil, nil, 88, 326, 332, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 329, 330, 76, 77, nil, nil, nil, nil, nil, + 88, 326, 332, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 239, nil, nil, 245, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 329, + 330, 76, 77, nil, nil, nil, nil, nil, 88, 326, + 332, 118, 117, 119, 120, nil, nil, 246, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 239, nil, nil, 245, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 329, 330, + 76, 77, nil, nil, nil, nil, nil, 88, 326, 332, + 118, 117, 119, 120, nil, nil, 246, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 303, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 239, nil, nil, 245, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, 298, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, nil, nil, 105, 301, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 304, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 329, 330, 76, + 77, nil, nil, nil, nil, nil, 88, 326, 332, 118, + 117, 119, 120, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 239, nil, nil, 245, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 329, 330, 76, 77, + nil, nil, nil, nil, nil, 88, 326, 332, 118, 117, + 119, 120, nil, nil, 246, nil, nil, nil, nil, nil, + nil, 327, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 333, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 991, nil, nil, 245, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 329, 330, 76, 77, nil, + nil, nil, nil, nil, 88, 326, 332, 118, 117, 119, + 120, nil, nil, 246, nil, nil, nil, nil, nil, nil, + 327, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 333, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 998, nil, nil, 245, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 329, 330, 76, 77, nil, nil, + nil, nil, nil, 88, 326, 332, 118, 117, 119, 120, + nil, nil, 246, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 239, nil, nil, 245, nil, nil, 62, 63, nil, nil, + 64, nil, 1003, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 329, 330, 76, 77, nil, nil, nil, + nil, nil, 88, 326, 332, 118, 117, 119, 120, nil, + nil, 246, nil, nil, nil, nil, nil, nil, 327, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 333, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 991, + nil, nil, 245, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 329, 330, 76, 77, nil, nil, nil, nil, + nil, 88, 326, 332, 118, 117, 119, 120, nil, nil, + 246, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 239, nil, + nil, 245, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 246, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 303, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + 245, nil, nil, 62, 63, nil, nil, 64, nil, 300, + nil, 298, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 105, 301, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 304, 93, 100, 102, nil, + 110, 111, 188, 199, 189, 212, 185, 205, 195, 194, + 215, 216, 210, 193, 192, 187, 213, 217, 218, 197, + 186, 200, 204, 206, 198, 191, nil, nil, nil, 207, + 214, 209, 208, 201, 211, 196, 184, 203, 202, nil, + nil, nil, nil, nil, 183, 190, 181, 182, 178, 179, + 180, 141, 143, 140, nil, 142, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, nil, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, 105, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 106, nil, nil, nil, nil, + nil, nil, nil, nil, 170, 188, 199, 189, 212, 185, + 205, 195, 194, 215, 216, 210, 193, 192, 187, 213, + 217, 218, 197, 186, 200, 204, 206, 198, 191, nil, + nil, nil, 207, 214, 209, 208, 201, 211, 196, 184, + 203, 202, nil, nil, nil, nil, nil, 183, 190, 181, + 182, 178, 179, 180, 141, 143, nil, nil, 142, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, nil, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, 105, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 106, nil, + nil, nil, nil, nil, nil, nil, nil, 170, 188, 199, + 189, 212, 185, 205, 195, 194, 215, 216, 210, 193, + 192, 187, 213, 217, 218, 197, 186, 200, 204, 206, + 198, 191, nil, nil, nil, 207, 214, 209, 386, 385, + 387, 384, 184, 203, 202, nil, nil, nil, nil, nil, + 183, 190, 181, 182, 381, 382, 383, 379, 143, 114, + 113, 380, nil, 116, nil, nil, nil, nil, nil, nil, + 173, 174, nil, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 391, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 170, 188, 199, 189, 212, 185, 205, 195, 194, 215, + 216, 210, 193, 192, 187, 213, 217, 218, 197, 186, + 200, 204, 206, 198, 191, nil, nil, nil, 207, 214, + 209, 208, 201, 211, 196, 184, 203, 202, nil, nil, + nil, nil, nil, 183, 190, 181, 182, 178, 179, 180, + 141, 143, 416, 415, 142, nil, 417, nil, nil, nil, + nil, nil, nil, 173, 174, nil, 169, 151, 152, 153, + 160, 157, 159, nil, nil, 154, 155, nil, nil, nil, + 175, 176, 161, 162, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 166, 165, nil, + 150, 172, 168, 167, 163, 164, 158, 156, 148, 171, + 149, nil, nil, 177, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 170, 188, 199, 189, 212, 185, 205, + 195, 194, 215, 216, 210, 193, 192, 187, 213, 217, + 218, 197, 186, 200, 204, 206, 198, 191, nil, nil, + nil, 207, 214, 209, 208, 201, 211, 196, 184, 203, + 202, nil, nil, nil, nil, nil, 183, 190, 181, 182, + 178, 179, 180, 141, 143, nil, nil, 142, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, nil, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, 105, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 106, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 188, 199, 189, + 212, 185, 205, 195, 194, 215, 216, 210, 193, 192, + 187, 213, 217, 218, 197, 186, 200, 204, 206, 198, + 191, nil, nil, nil, 207, 214, 209, 208, 201, 211, + 196, 184, 203, 202, nil, nil, nil, nil, nil, 183, + 190, 181, 182, 178, 179, 180, 141, 143, nil, nil, + 142, nil, nil, nil, nil, nil, nil, nil, nil, 173, + 174, nil, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + 105, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 106, nil, nil, nil, nil, nil, nil, nil, nil, 170, + 188, 199, 189, 212, 185, 205, 195, 194, 215, 216, + 210, 193, 192, 187, 213, 217, 218, 197, 186, 200, + 204, 206, 198, 191, nil, nil, nil, 207, 214, 209, + 208, 201, 211, 196, 184, 203, 202, nil, nil, nil, + nil, nil, 183, 190, 181, 182, 178, 179, 180, 141, + 143, nil, nil, 142, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, nil, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 459, 463, nil, + nil, 460, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 466, 470, nil, nil, 465, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 686, 463, nil, nil, 687, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 281, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 688, 470, nil, nil, 689, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 281, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 716, + 463, nil, nil, 717, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 281, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 719, 470, nil, + nil, 720, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 686, 463, nil, nil, 687, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 688, 470, nil, nil, 689, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 281, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 753, 463, nil, nil, 754, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 281, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 755, + 470, nil, nil, 756, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 281, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 758, 470, nil, + nil, 759, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 511, 463, nil, nil, 512, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 807, 463, nil, nil, 808, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 281, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 810, 470, nil, nil, 809, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 281, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, 618, 177, 615, 614, 613, 623, 616, + 618, nil, 615, 614, 613, 623, 616, nil, nil, 626, + nil, nil, nil, nil, 170, nil, 626, 618, nil, 615, + 614, 613, 623, 616, nil, nil, nil, nil, nil, nil, + nil, 621, nil, 626, nil, nil, nil, nil, 621, nil, + 631, 630, 634, 633, nil, nil, nil, 631, 630, 634, + 633, nil, nil, nil, nil, 621, nil, nil, nil, nil, + nil, nil, nil, nil, 631, 630, 634, 633, nil, nil, + nil, 1064, 470, nil, nil, 1063, 627, nil, nil, nil, + nil, nil, nil, 627, 173, 174, nil, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + 627, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 281, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 1067, + 463, nil, nil, 1068, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 281, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 1069, 470, nil, + nil, 1070, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, 618, + 177, 615, 614, 613, 623, 616, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 626, nil, nil, nil, nil, + 170, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 621, nil, nil, + nil, nil, nil, nil, nil, nil, 631, 630, 634, 633, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 627 ] + +racc_action_check = [ + 112, 352, 353, 407, 939, 871, 65, 112, 112, 112, + 1, 944, 112, 112, 112, 695, 112, 22, 711, 410, + 475, 475, 92, 1067, 112, 487, 112, 112, 112, 360, + 92, 361, 711, 5, 17, 17, 112, 112, 5, 112, + 112, 112, 112, 112, 20, 716, 364, 717, 1068, 585, + 753, 1079, 754, 22, 140, 3, 771, 487, 872, 140, + 140, 487, 487, 726, 726, 13, 407, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 575, 410, 112, 112, 112, 20, 112, 112, 770, + 770, 112, 727, 65, 112, 112, 15, 112, 727, 112, + 20, 112, 695, 112, 112, 112, 112, 112, 112, 112, + 475, 112, 716, 112, 717, 352, 353, 755, 939, 871, + 352, 353, 871, 939, 871, 944, 112, 112, 112, 112, + 944, 112, 115, 112, 360, 1069, 361, 1067, 112, 115, + 115, 115, 1067, 112, 115, 115, 115, 716, 115, 717, + 716, 364, 717, 726, 585, 753, 115, 754, 115, 115, + 115, 771, 1068, 872, 716, 1079, 717, 1068, 115, 115, + 1079, 115, 115, 115, 115, 115, 756, 44, 44, 770, + 693, 575, 29, 755, 840, 27, 575, 328, 237, 333, + 333, 379, 27, 564, 351, 351, 564, 368, 379, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 1069, 693, 115, 115, 115, 840, 115, + 115, 380, 755, 115, 647, 381, 115, 115, 380, 115, + 369, 115, 381, 115, 16, 115, 115, 115, 115, 115, + 115, 115, 756, 115, 237, 115, 41, 29, 650, 1069, + 368, 394, 328, 18, 1069, 44, 44, 368, 115, 115, + 115, 115, 368, 115, 465, 115, 368, 333, 333, 29, + 115, 465, 465, 465, 328, 115, 773, 465, 465, 488, + 465, 756, 19, 369, 368, 647, 647, 773, 41, 19, + 369, 307, 719, 846, 647, 369, 307, 25, 19, 369, + 465, 465, 41, 465, 465, 465, 465, 465, 40, 650, + 650, 488, 394, 394, 394, 488, 488, 369, 650, 382, + 773, 773, 529, 357, 565, 43, 382, 565, 357, 758, + 238, 465, 465, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 465, 465, 465, 719, 846, 465, 465, 465, + 396, 465, 719, 846, 773, 465, 370, 719, 465, 240, + 370, 719, 846, 465, 401, 465, 49, 465, 465, 465, + 465, 465, 465, 465, 443, 465, 977, 465, 404, 719, + 846, 412, 758, 529, 529, 529, 238, 977, 99, 758, + 465, 465, 466, 465, 758, 465, 42, 481, 758, 466, + 466, 466, 465, 529, 764, 466, 466, 465, 466, 764, + 100, 396, 396, 396, 101, 240, 758, 466, 686, 398, + 977, 977, 398, 596, 596, 401, 401, 401, 466, 466, + 443, 466, 466, 466, 466, 466, 337, 102, 42, 404, + 404, 404, 412, 412, 412, 569, 459, 1004, 569, 1004, + 687, 807, 42, 481, 977, 808, 829, 915, 138, 466, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 466, 219, 686, 466, 466, 466, 337, 466, + 398, 398, 460, 466, 670, 876, 466, 383, 459, 239, + 876, 466, 337, 466, 383, 466, 466, 466, 466, 466, + 466, 466, 459, 466, 466, 466, 687, 807, 241, 50, + 384, 808, 829, 915, 47, 47, 50, 384, 466, 466, + 688, 466, 242, 466, 460, 50, 670, 688, 688, 688, + 466, 246, 688, 688, 688, 466, 688, 881, 460, 280, + 670, 295, 881, 296, 502, 688, 688, 688, 688, 47, + 47, 385, 859, 741, 741, 859, 688, 688, 385, 688, + 688, 688, 688, 688, 904, 386, 904, 904, 904, 299, + 904, 621, 386, 621, 621, 621, 502, 621, 387, 389, + 502, 502, 502, 502, 313, 387, 389, 688, 688, 688, + 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 315, 904, 688, 688, 688, 236, 688, 688, 621, + 316, 688, 317, 236, 688, 688, 323, 688, 621, 688, + 326, 688, 236, 688, 688, 688, 688, 688, 688, 688, + 327, 688, 688, 688, 392, 332, 392, 392, 392, 392, + 392, 9, 9, 9, 9, 9, 688, 688, 688, 688, + 392, 688, 689, 688, 1009, 320, 334, 1009, 688, 689, + 689, 689, 320, 688, 689, 689, 689, 338, 689, 341, + 321, 320, 392, 392, 776, 776, 503, 321, 689, 689, + 689, 392, 392, 392, 392, 347, 321, 358, 689, 689, + 359, 689, 689, 689, 689, 689, 1017, 363, 1017, 1017, + 1017, 365, 1017, 785, 374, 785, 785, 785, 503, 785, + 1038, 1038, 503, 503, 503, 503, 400, 392, 403, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 406, 1017, 689, 689, 689, 322, 689, + 689, 785, 409, 689, 432, 322, 689, 689, 435, 689, + 785, 689, 437, 689, 322, 689, 689, 689, 689, 689, + 689, 689, 440, 689, 454, 689, 604, 457, 604, 604, + 604, 604, 604, 311, 311, 311, 311, 311, 689, 689, + 689, 689, 604, 689, 809, 689, 458, 467, 477, 489, + 689, 809, 809, 809, 490, 689, 491, 809, 809, 903, + 809, 903, 903, 903, 604, 903, 1018, 492, 1018, 1018, + 1018, 508, 1018, 604, 604, 604, 604, 515, 519, 535, + 809, 809, 324, 809, 809, 809, 809, 809, 536, 324, + 537, 540, 339, 542, 362, 547, 550, 903, 324, 339, + 559, 362, 560, 561, 1018, 566, 903, 567, 339, 604, + 362, 809, 809, 809, 809, 809, 809, 809, 809, 809, + 809, 809, 809, 809, 809, 372, 442, 809, 809, 809, + 546, 809, 372, 442, 570, 809, 572, 546, 809, 576, + 577, 372, 442, 809, 578, 809, 546, 809, 809, 809, + 809, 809, 809, 809, 579, 809, 598, 809, 588, 606, + 990, 995, 996, 607, 609, 588, 610, 990, 995, 996, + 809, 809, 810, 809, 588, 809, 990, 995, 996, 810, + 810, 810, 809, 611, 620, 810, 810, 809, 810, 496, + 496, 496, 496, 496, 496, 496, 628, 810, 496, 496, + 997, 632, 635, 999, 654, 496, 496, 997, 810, 810, + 999, 810, 810, 810, 810, 810, 997, 657, 663, 999, + 671, 496, 676, 496, 682, 496, 496, 496, 496, 496, + 496, 496, 789, 496, 789, 789, 789, 690, 789, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 720, 1029, 810, 810, 810, 691, 810, + 720, 1029, 694, 810, 698, 720, 810, 700, 702, 720, + 1029, 810, 704, 810, 713, 810, 810, 810, 810, 810, + 810, 810, 715, 810, 810, 810, 1037, 718, 721, 722, + 795, 795, 725, 1037, 795, 795, 795, 743, 810, 810, + 749, 810, 1037, 810, 2, 2, 2, 2, 2, 2, + 810, 752, 761, 2, 2, 810, 765, 772, 2, 787, + 2, 2, 2, 2, 2, 2, 2, 346, 346, 346, + 346, 346, 2, 2, 2, 2, 2, 2, 2, 788, + 790, 2, 802, 804, 806, 814, 447, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 838, + 2, 2, 2, 845, 2, 2, 855, 2, 2, 2, + 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, + 447, 759, 447, 447, 856, 860, 447, 447, 759, 2, + 866, 873, 2, 759, 875, 2, 2, 759, 879, 2, + 880, 2, 447, 887, 447, 2, 447, 447, 447, 447, + 447, 447, 447, 2, 447, 888, 889, 1070, 2, 2, + 2, 2, 2, 2, 1070, 893, 894, 2, 2, 1070, + 447, 896, 447, 1070, 897, 2, 899, 902, 2, 2, + 2, 912, 2, 2, 36, 36, 36, 36, 36, 36, + 914, 921, 922, 36, 36, 924, 925, 926, 36, 928, + 36, 36, 36, 36, 36, 36, 36, 534, 534, 534, + 534, 534, 36, 36, 36, 36, 36, 36, 36, 929, + 930, 36, 957, 958, 959, 974, 453, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 975, + 36, 36, 36, 988, 36, 36, 991, 36, 36, 36, + 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, + 453, 993, 453, 453, 998, 1005, 453, 453, 1013, 36, + 1014, 1015, 36, 1016, 1019, 36, 36, 1022, 1023, 36, + 1024, 36, 453, 1025, 453, 36, 453, 453, 453, 453, + 453, 453, 453, 36, 453, 1027, 1033, 1044, 36, 36, + 36, 36, 36, 36, 1052, 1063, 1064, 36, 36, 1066, + 453, 1074, 1075, 1076, 1077, 36, 1078, 1086, 36, 36, + 36, nil, 36, 36, 221, 221, 221, 221, 221, 221, + nil, nil, nil, 221, 221, nil, nil, nil, 221, nil, + 221, 221, 221, 221, 221, 221, 221, nil, nil, nil, + nil, nil, 221, 221, 221, 221, 221, 221, 221, nil, + 960, 221, 960, 960, 960, nil, 960, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, 221, nil, + 221, 221, 221, nil, 221, 221, nil, 221, 221, 221, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, nil, 24, 24, nil, nil, 24, 24, nil, 221, + nil, nil, 221, nil, nil, 221, 221, nil, nil, 221, + nil, 221, 24, nil, 24, 221, 24, 24, 24, 24, + 24, 24, 24, 221, 24, nil, nil, nil, 221, 221, + 221, 221, 221, 221, nil, nil, nil, 221, 221, nil, + 24, nil, nil, nil, nil, 221, nil, nil, 221, 221, + 221, nil, 221, 221, 245, 245, 245, 245, 245, 245, + nil, nil, nil, 245, 245, nil, nil, nil, 245, nil, + 245, 245, 245, 245, 245, 245, 245, nil, nil, nil, + nil, nil, 245, 245, 245, 245, 245, 245, 245, nil, + 1046, 245, 1046, 1046, 1046, nil, 1046, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, nil, + 245, 245, 245, nil, 245, 245, nil, 245, 245, 245, + 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, + 293, nil, 293, 293, nil, nil, 293, 293, nil, 245, + nil, nil, 245, nil, nil, 245, 245, nil, nil, 245, + nil, 245, 293, nil, 293, 245, 293, 293, 293, 293, + 293, 293, 293, 245, 293, nil, nil, nil, 245, 245, + 245, 245, 245, 245, nil, nil, nil, 245, 245, nil, + 293, nil, nil, nil, nil, 245, nil, nil, 245, 245, + 245, nil, 245, 245, 314, 314, 314, 314, 314, 314, + nil, nil, nil, 314, 314, nil, nil, nil, 314, nil, + 314, 314, 314, 314, 314, 314, 314, nil, nil, nil, + nil, nil, 314, 314, 314, 314, 314, 314, 314, nil, + nil, 314, nil, nil, nil, nil, nil, 314, 314, 314, + 314, 314, 314, 314, 314, 314, 314, 314, 314, nil, + 314, 314, 314, nil, 314, 314, nil, 314, 314, 314, + 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, + 506, nil, 506, 506, nil, nil, 506, 506, nil, 314, + nil, nil, 314, nil, nil, 314, 314, nil, nil, 314, + nil, 314, 506, nil, 506, 314, 506, 506, 506, 506, + 506, 506, 506, 314, 506, nil, nil, nil, 314, 314, + 314, 314, 314, 314, nil, nil, nil, 314, 314, 506, + 506, nil, nil, nil, nil, 314, nil, nil, 314, 314, + 314, nil, 314, 314, 319, 319, 319, 319, 319, 319, + nil, nil, nil, 319, 319, nil, nil, nil, 319, nil, + 319, 319, 319, 319, 319, 319, 319, nil, nil, nil, + nil, nil, 319, 319, 319, 319, 319, 319, 319, nil, + nil, 319, nil, nil, nil, nil, nil, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, nil, + 319, 319, 319, nil, 319, 319, nil, 319, 319, 319, + 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, + 557, nil, 557, 557, nil, nil, 557, 557, nil, 319, + nil, nil, 319, nil, nil, 319, 319, nil, nil, 319, + nil, 319, 557, nil, 557, 319, 557, 557, 557, 557, + 557, 557, 557, 319, 557, nil, nil, nil, 319, 319, + 319, 319, 319, 319, nil, nil, nil, 319, 319, nil, + 557, nil, nil, nil, nil, 319, nil, nil, 319, 319, + 319, nil, 319, 319, 345, 345, 345, 345, 345, 345, + nil, nil, nil, 345, 345, nil, nil, nil, 345, nil, + 345, 345, 345, 345, 345, 345, 345, nil, nil, nil, + nil, nil, 345, 345, 345, 345, 345, 345, 345, nil, + nil, 345, nil, nil, nil, nil, nil, 345, 345, 345, + 345, 345, 345, 345, 345, 345, 345, 345, 345, nil, + 345, 345, 345, nil, 345, 345, nil, 345, 345, 345, + 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, + 811, nil, 811, 811, nil, nil, 811, 811, nil, 345, + nil, nil, 345, nil, nil, 345, 345, nil, nil, 345, + nil, 345, 811, nil, 811, 345, 811, 811, 811, 811, + 811, 811, 811, 345, 811, nil, nil, nil, 345, 345, + 345, 345, 345, 345, nil, nil, nil, 345, 345, nil, + 811, nil, nil, nil, nil, 345, nil, nil, 345, 345, + 345, nil, 345, 345, 355, 355, 355, 355, 355, 355, + nil, nil, nil, 355, 355, nil, nil, nil, 355, nil, + 355, 355, 355, 355, 355, 355, 355, nil, nil, nil, + nil, nil, 355, 355, 355, 355, 355, 355, 355, nil, + nil, 355, nil, nil, nil, nil, nil, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, 355, nil, + 355, 355, 355, nil, 355, 355, nil, 355, 355, 355, + 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, + 920, nil, 920, 920, nil, nil, 920, 920, nil, 355, + nil, nil, 355, nil, nil, 355, 355, nil, nil, 355, + nil, 355, 920, nil, 920, 355, 920, 920, 920, 920, + 920, 920, 920, 355, 920, nil, nil, nil, 355, 355, + 355, 355, 355, 355, nil, nil, nil, 355, 355, nil, + 920, nil, nil, nil, nil, 355, nil, nil, 355, 355, + 355, nil, 355, 355, 356, 356, 356, 356, 356, 356, + nil, nil, nil, 356, 356, nil, nil, nil, 356, nil, + 356, 356, 356, 356, 356, 356, 356, nil, nil, nil, + nil, nil, 356, 356, 356, 356, 356, 356, 356, nil, + nil, 356, nil, nil, nil, nil, nil, 356, 356, 356, + 356, 356, 356, 356, 356, 356, 356, 356, 356, nil, + 356, 356, 356, nil, 356, 356, nil, 356, 356, 356, + 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, + 485, nil, 485, 485, nil, nil, 485, 485, nil, 356, + nil, nil, 356, nil, nil, 356, 356, nil, nil, 356, + nil, 356, 485, nil, 485, 356, 485, 485, 485, 485, + 485, 485, 485, 356, 485, nil, nil, nil, 356, 356, + 356, 356, 356, 356, nil, nil, nil, 356, 356, nil, + nil, nil, nil, nil, nil, 356, nil, nil, 356, 356, + 356, nil, 356, 356, 571, 571, 571, 571, 571, 571, + nil, nil, nil, 571, 571, nil, nil, nil, 571, nil, + 571, 571, 571, 571, 571, 571, 571, nil, nil, nil, + nil, nil, 571, 571, 571, 571, 571, 571, 571, nil, + nil, 571, nil, nil, nil, nil, nil, 571, 571, 571, + 571, 571, 571, 571, 571, 571, 571, 571, 571, nil, + 571, 571, 571, nil, 571, 571, nil, 571, 571, 571, + 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, + 486, nil, 486, 486, nil, nil, 486, 486, nil, 571, + nil, nil, 571, nil, nil, 571, 571, nil, nil, 571, + nil, 571, 486, nil, 486, 571, 486, 486, 486, 486, + 486, 486, 486, 571, 486, nil, nil, nil, 571, 571, + 571, 571, 571, 571, nil, nil, nil, 571, 571, nil, + nil, nil, nil, nil, nil, 571, nil, nil, 571, 571, + 571, nil, 571, 571, 574, 574, 574, 574, 574, 574, + nil, nil, nil, 574, 574, nil, nil, nil, 574, nil, + 574, 574, 574, 574, 574, 574, 574, nil, nil, nil, + nil, nil, 574, 574, 574, 574, 574, 574, 574, nil, + nil, 574, nil, nil, nil, nil, nil, 574, 574, 574, + 574, 574, 574, 574, 574, 574, 574, 574, 574, nil, + 574, 574, 574, nil, 574, 574, nil, 574, 574, 574, + 497, 497, 497, 497, 497, 497, 497, nil, nil, 497, + 497, nil, nil, nil, nil, nil, 497, 497, nil, 574, + nil, nil, 574, nil, nil, 574, 574, nil, nil, 574, + nil, 574, 497, nil, 497, 574, 497, 497, 497, 497, + 497, 497, 497, 574, 497, nil, nil, nil, 574, 574, + 574, 574, 574, 574, nil, nil, nil, 574, 574, nil, + nil, nil, nil, nil, nil, 574, nil, nil, 574, 574, + 574, nil, 574, 574, 597, 597, 597, 597, 597, 597, + nil, nil, nil, 597, 597, nil, nil, nil, 597, nil, + 597, 597, 597, 597, 597, 597, 597, nil, nil, nil, + nil, nil, 597, 597, 597, 597, 597, 597, 597, nil, + nil, 597, nil, nil, nil, nil, nil, 597, 597, 597, + 597, 597, 597, 597, 597, 597, 597, 597, 597, nil, + 597, 597, 597, nil, 597, 597, nil, 597, 597, 597, + 498, 498, 498, 498, 498, 498, 498, nil, nil, 498, + 498, nil, nil, nil, nil, nil, 498, 498, nil, 597, + nil, nil, 597, nil, nil, 597, 597, nil, nil, 597, + nil, 597, 498, nil, 498, 597, 498, 498, 498, 498, + 498, 498, 498, 597, 498, nil, nil, nil, 597, 597, + 597, 597, 597, 597, nil, nil, nil, 597, 597, nil, + nil, nil, nil, nil, nil, 597, nil, nil, 597, 597, + 597, nil, 597, 597, 659, 659, 659, 659, 659, 659, + nil, nil, nil, 659, 659, nil, nil, nil, 659, nil, + 659, 659, 659, 659, 659, 659, 659, nil, nil, nil, + nil, nil, 659, 659, 659, 659, 659, 659, 659, nil, + nil, 659, nil, nil, nil, nil, nil, 659, 659, 659, + 659, 659, 659, 659, 659, 659, 659, 659, 659, nil, + 659, 659, 659, nil, 659, 659, nil, 659, 659, 659, + 499, 499, 499, 499, 499, 499, 499, nil, nil, 499, + 499, nil, nil, nil, nil, nil, 499, 499, nil, 659, + nil, nil, 659, nil, nil, 659, 659, nil, nil, 659, + nil, 659, 499, nil, 499, 659, 499, 499, 499, 499, + 499, 499, 499, 659, 499, nil, nil, nil, 659, 659, + 659, 659, 659, 659, nil, nil, nil, 659, 659, nil, + nil, nil, nil, nil, nil, 659, nil, nil, 659, 659, + 659, nil, 659, 659, 757, 757, 757, 757, 757, 757, + nil, nil, nil, 757, 757, nil, nil, nil, 757, nil, + 757, 757, 757, 757, 757, 757, 757, nil, nil, nil, + nil, nil, 757, 757, 757, 757, 757, 757, 757, nil, + nil, 757, nil, nil, nil, nil, nil, 757, 757, 757, + 757, 757, 757, 757, 757, 757, 757, 757, 757, nil, + 757, 757, 757, nil, 757, 757, nil, 757, 757, 757, + 500, 500, 500, 500, 500, 500, 500, nil, nil, 500, + 500, nil, nil, nil, nil, nil, 500, 500, nil, 757, + nil, nil, 757, nil, nil, 757, 757, nil, nil, 757, + nil, 757, 500, nil, 500, 757, 500, 500, 500, 500, + 500, 500, 500, 757, 500, nil, nil, nil, 757, 757, + 757, 757, 757, 757, nil, nil, nil, 757, 757, nil, + nil, nil, nil, nil, nil, 757, nil, nil, 757, 757, + 757, nil, 757, 757, 762, 762, 762, 762, 762, 762, + nil, nil, nil, 762, 762, nil, nil, nil, 762, nil, + 762, 762, 762, 762, 762, 762, 762, nil, nil, nil, + nil, nil, 762, 762, 762, 762, 762, 762, 762, nil, + nil, 762, nil, nil, nil, nil, nil, 762, 762, 762, + 762, 762, 762, 762, 762, 762, 762, 762, 762, nil, + 762, 762, 762, nil, 762, 762, nil, 762, 762, 762, + 501, 501, 501, 501, 501, 501, 501, nil, nil, 501, + 501, nil, nil, nil, nil, nil, 501, 501, nil, 762, + nil, nil, 762, nil, nil, 762, 762, nil, nil, 762, + nil, 762, 501, nil, 501, 762, 501, 501, 501, 501, + 501, 501, 501, 762, 501, nil, nil, nil, 762, 762, + 762, 762, 762, 762, nil, nil, nil, 762, 762, nil, + nil, nil, nil, nil, nil, 762, nil, nil, 762, 762, + 762, nil, 762, 762, 766, 766, 766, 766, 766, 766, + nil, nil, nil, 766, 766, nil, nil, nil, 766, nil, + 766, 766, 766, 766, 766, 766, 766, nil, nil, nil, + nil, nil, 766, 766, 766, 766, 766, 766, 766, nil, + nil, 766, nil, nil, nil, nil, nil, 766, 766, 766, + 766, 766, 766, 766, 766, 766, 766, 766, 766, nil, + 766, 766, 766, nil, 766, 766, nil, 766, 766, 766, + 504, 504, 504, 504, 504, 504, 504, nil, nil, 504, + 504, nil, nil, nil, nil, nil, 504, 504, nil, 766, + nil, nil, 766, nil, nil, 766, 766, nil, nil, 766, + nil, 766, 504, nil, 504, 766, 504, 504, 504, 504, + 504, 504, 504, 766, 504, nil, nil, nil, 766, 766, + 766, 766, 766, 766, nil, nil, nil, 766, 766, nil, + nil, nil, nil, nil, nil, 766, nil, nil, 766, 766, + 766, nil, 766, 766, 796, 796, 796, 796, 796, 796, + nil, nil, nil, 796, 796, nil, nil, nil, 796, nil, + 796, 796, 796, 796, 796, 796, 796, nil, nil, nil, + nil, nil, 796, 796, 796, 796, 796, 796, 796, nil, + nil, 796, nil, nil, nil, nil, nil, 796, 796, 796, + 796, 796, 796, 796, 796, 796, 796, 796, 796, nil, + 796, 796, 796, nil, 796, 796, nil, 796, 796, 796, + 505, 505, 505, 505, 505, 505, 505, 505, nil, 505, + 505, nil, nil, nil, nil, nil, 505, 505, nil, 796, + nil, nil, 796, nil, nil, 796, 796, nil, nil, 796, + nil, 796, 505, nil, 505, 796, 505, 505, 505, 505, + 505, 505, 505, 796, 505, nil, nil, nil, 796, 796, + 796, 796, 796, 796, nil, nil, nil, 796, 796, nil, + nil, nil, nil, nil, nil, 796, nil, nil, 796, 796, + 796, nil, 796, 796, 835, 835, 835, 835, 835, 835, + nil, nil, nil, 835, 835, nil, nil, nil, 835, nil, + 835, 835, 835, 835, 835, 835, 835, nil, nil, nil, + nil, nil, 835, 835, 835, 835, 835, 835, 835, nil, + nil, 835, nil, nil, nil, nil, nil, 835, 835, 835, + 835, 835, 835, 835, 835, 835, 835, 835, 835, nil, + 835, 835, 835, nil, 835, 835, nil, 835, 835, 835, + 507, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 507, 507, nil, 835, + nil, nil, 835, nil, 495, 835, 835, nil, nil, 835, + nil, 835, 507, nil, 507, 835, 507, 507, 507, 507, + 495, 495, 507, 835, 507, nil, nil, nil, 835, 835, + 835, 835, 835, 835, nil, nil, 495, 835, 835, nil, + 495, 495, 495, 495, nil, 835, nil, nil, 835, 835, + 835, nil, 835, 835, 853, 853, 853, 853, 853, 853, + nil, nil, nil, 853, 853, nil, nil, nil, 853, nil, + 853, 853, 853, 853, 853, 853, 853, nil, nil, nil, + nil, nil, 853, 853, 853, 853, 853, 853, 853, nil, + nil, 853, nil, nil, nil, nil, nil, 853, 853, 853, + 853, 853, 853, 853, 853, 853, 853, 853, 853, nil, + 853, 853, 853, nil, 853, 853, nil, 853, 853, 853, + 556, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 556, 556, nil, 853, + nil, nil, 853, nil, nil, 853, 853, nil, nil, 853, + nil, 853, 556, nil, 556, 853, 556, 556, 556, 556, + nil, nil, 556, 853, 556, nil, nil, nil, 853, 853, + 853, 853, 853, 853, nil, nil, nil, 853, 853, nil, + nil, nil, nil, nil, nil, 853, nil, nil, 853, 853, + 853, nil, 853, 853, 865, 865, 865, 865, 865, 865, + nil, nil, nil, 865, 865, nil, nil, nil, 865, nil, + 865, 865, 865, 865, 865, 865, 865, nil, nil, nil, + nil, nil, 865, 865, 865, 865, 865, 865, 865, nil, + nil, 865, nil, nil, nil, nil, nil, 865, 865, 865, + 865, 865, 865, 865, 865, 865, 865, 865, 865, nil, + 865, 865, 865, nil, 865, 865, nil, 865, 865, 865, + 493, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 493, 493, nil, 865, + nil, nil, 865, nil, nil, 865, 865, nil, nil, 865, + nil, 865, 493, nil, 493, 865, 493, 493, 493, 493, + nil, nil, nil, 865, nil, nil, nil, nil, 865, 865, + 865, 865, 865, 865, nil, nil, nil, 865, 865, nil, + nil, nil, nil, nil, nil, 865, nil, nil, 865, 865, + 865, nil, 865, 865, 885, 885, 885, 885, 885, 885, + nil, nil, nil, 885, 885, nil, nil, nil, 885, nil, + 885, 885, 885, 885, 885, 885, 885, nil, nil, nil, + nil, nil, 885, 885, 885, 885, 885, 885, 885, nil, + nil, 885, nil, nil, nil, nil, nil, 885, 885, 885, + 885, 885, 885, 885, 885, 885, 885, 885, 885, nil, + 885, 885, 885, nil, 885, 885, nil, 885, 885, 885, + 494, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 494, 494, nil, 885, + nil, nil, 885, nil, nil, 885, 885, nil, nil, 885, + nil, 885, 494, nil, 494, 885, 494, 494, 494, 494, + nil, nil, nil, 885, nil, nil, nil, nil, 885, 885, + 885, 885, 885, 885, nil, nil, nil, 885, 885, nil, + nil, nil, nil, nil, nil, 885, nil, nil, 885, 885, + 885, nil, 885, 885, 886, 886, 886, 886, 886, 886, + nil, nil, nil, 886, 886, nil, nil, nil, 886, nil, + 886, 886, 886, 886, 886, 886, 886, nil, nil, nil, + nil, nil, 886, 886, 886, 886, 886, 886, 886, nil, + nil, 886, nil, nil, nil, nil, nil, 886, 886, 886, + 886, 886, 886, 886, 886, 886, 886, 886, 886, nil, + 886, 886, 886, nil, 886, 886, nil, 886, 886, 886, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 886, + nil, nil, 886, nil, nil, 886, 886, nil, nil, 886, + nil, 886, nil, nil, nil, 886, nil, nil, nil, nil, + nil, nil, nil, 886, nil, nil, nil, nil, 886, 886, + 886, 886, 886, 886, nil, nil, nil, 886, 886, nil, + nil, nil, nil, nil, nil, 886, nil, nil, 886, 886, + 886, nil, 886, 886, 936, 936, 936, 936, 936, 936, + nil, nil, nil, 936, 936, nil, nil, nil, 936, nil, + 936, 936, 936, 936, 936, 936, 936, nil, nil, nil, + nil, nil, 936, 936, 936, 936, 936, 936, 936, nil, + nil, 936, nil, nil, nil, nil, nil, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, nil, + 936, 936, 936, nil, 936, 936, nil, 936, 936, 936, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 936, + nil, nil, 936, nil, nil, 936, 936, nil, nil, 936, + nil, 936, nil, nil, nil, 936, nil, nil, nil, nil, + nil, nil, nil, 936, nil, nil, nil, nil, 936, 936, + 936, 936, 936, 936, nil, nil, nil, 936, 936, nil, + nil, nil, nil, nil, nil, 936, nil, nil, 936, 936, + 936, nil, 936, 936, 937, 937, 937, 937, 937, 937, + nil, nil, nil, 937, 937, nil, nil, nil, 937, nil, + 937, 937, 937, 937, 937, 937, 937, nil, nil, nil, + nil, nil, 937, 937, 937, 937, 937, 937, 937, nil, + nil, 937, nil, nil, nil, nil, nil, 937, 937, 937, + 937, 937, 937, 937, 937, 937, 937, 937, 937, nil, + 937, 937, 937, nil, 937, 937, nil, 937, 937, 937, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 937, + nil, nil, 937, nil, nil, 937, 937, nil, nil, 937, + nil, 937, nil, nil, nil, 937, nil, nil, nil, nil, + nil, nil, nil, 937, nil, nil, nil, nil, 937, 937, + 937, 937, 937, 937, nil, nil, nil, 937, 937, nil, + nil, nil, nil, nil, nil, 937, nil, nil, 937, 937, + 937, nil, 937, 937, 949, 949, 949, 949, 949, 949, + nil, nil, nil, 949, 949, nil, nil, nil, 949, nil, + 949, 949, 949, 949, 949, 949, 949, nil, nil, nil, + nil, nil, 949, 949, 949, 949, 949, 949, 949, nil, + nil, 949, nil, nil, nil, nil, nil, 949, 949, 949, + 949, 949, 949, 949, 949, 949, 949, 949, 949, nil, + 949, 949, 949, nil, 949, 949, nil, 949, 949, 949, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 949, + nil, nil, 949, nil, nil, 949, 949, nil, nil, 949, + nil, 949, nil, nil, nil, 949, nil, nil, nil, nil, + nil, nil, nil, 949, nil, nil, nil, nil, 949, 949, + 949, 949, 949, 949, nil, nil, nil, 949, 949, nil, + nil, nil, nil, nil, nil, 949, nil, nil, 949, 949, + 949, nil, 949, 949, 953, 953, 953, 953, 953, 953, + nil, nil, nil, 953, 953, nil, nil, nil, 953, nil, + 953, 953, 953, 953, 953, 953, 953, nil, nil, nil, + nil, nil, 953, 953, 953, 953, 953, 953, 953, nil, + nil, 953, nil, nil, nil, nil, nil, 953, 953, 953, + 953, 953, 953, 953, 953, 953, 953, 953, 953, nil, + 953, 953, 953, nil, 953, 953, nil, 953, 953, 953, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 953, + nil, nil, 953, nil, nil, 953, 953, nil, nil, 953, + nil, 953, nil, nil, nil, 953, nil, nil, nil, nil, + nil, nil, nil, 953, nil, nil, nil, nil, 953, 953, + 953, 953, 953, 953, nil, nil, nil, 953, 953, nil, + nil, nil, nil, nil, nil, 953, nil, nil, 953, 953, + 953, nil, 953, 953, 994, 994, 994, 994, 994, 994, + nil, nil, nil, 994, 994, nil, nil, nil, 994, nil, + 994, 994, 994, 994, 994, 994, 994, nil, nil, nil, + nil, nil, 994, 994, 994, 994, 994, 994, 994, nil, + nil, 994, nil, nil, nil, nil, nil, 994, 994, 994, + 994, 994, 994, 994, 994, 994, 994, 994, 994, nil, + 994, 994, 994, nil, 994, 994, nil, 994, 994, 994, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 994, + nil, nil, 994, nil, nil, 994, 994, nil, nil, 994, + nil, 994, nil, nil, nil, 994, nil, nil, nil, nil, + nil, nil, nil, 994, nil, nil, nil, nil, 994, 994, + 994, 994, 994, 994, nil, nil, nil, 994, 994, nil, + nil, nil, nil, nil, nil, 994, nil, nil, 994, 994, + 994, nil, 994, 994, 1001, 1001, 1001, 1001, 1001, 1001, + nil, nil, nil, 1001, 1001, nil, nil, nil, 1001, nil, + 1001, 1001, 1001, 1001, 1001, 1001, 1001, nil, nil, nil, + nil, nil, 1001, 1001, 1001, 1001, 1001, 1001, 1001, nil, + nil, 1001, nil, nil, nil, nil, nil, 1001, 1001, 1001, + 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, nil, + 1001, 1001, 1001, nil, 1001, 1001, nil, 1001, 1001, 1001, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1001, + nil, nil, 1001, nil, nil, 1001, 1001, nil, nil, 1001, + nil, 1001, nil, nil, nil, 1001, nil, nil, nil, nil, + nil, nil, nil, 1001, nil, nil, nil, nil, 1001, 1001, + 1001, 1001, 1001, 1001, nil, nil, nil, 1001, 1001, nil, + nil, nil, nil, nil, nil, 1001, nil, nil, 1001, 1001, + 1001, nil, 1001, 1001, 1006, 1006, 1006, 1006, 1006, 1006, + nil, nil, nil, 1006, 1006, nil, nil, nil, 1006, nil, + 1006, 1006, 1006, 1006, 1006, 1006, 1006, nil, nil, nil, + nil, nil, 1006, 1006, 1006, 1006, 1006, 1006, 1006, nil, + nil, 1006, nil, nil, nil, nil, nil, 1006, 1006, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, nil, + 1006, 1006, 1006, nil, 1006, 1006, nil, 1006, 1006, 1006, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1006, + nil, nil, 1006, nil, nil, 1006, 1006, nil, nil, 1006, + nil, 1006, nil, nil, nil, 1006, nil, nil, nil, nil, + nil, nil, nil, 1006, nil, nil, nil, nil, 1006, 1006, + 1006, 1006, 1006, 1006, nil, nil, nil, 1006, 1006, nil, + nil, nil, nil, nil, nil, 1006, nil, nil, 1006, 1006, + 1006, nil, 1006, 1006, 8, 8, 8, 8, 8, nil, + nil, nil, 8, 8, nil, nil, nil, 8, nil, 8, + 8, 8, 8, 8, 8, 8, nil, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, 8, nil, nil, + 8, nil, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, nil, 8, + 8, 8, nil, 8, 8, nil, 8, 8, 8, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 8, nil, + nil, 8, nil, nil, 8, 8, nil, nil, 8, nil, + 8, nil, nil, nil, 8, nil, nil, nil, nil, nil, + nil, nil, 8, nil, nil, nil, nil, 8, 8, 8, + 8, 8, 8, nil, nil, nil, 8, 8, nil, nil, + nil, nil, nil, nil, 8, nil, nil, 8, 8, 8, + nil, 8, 8, 23, 23, 23, nil, 23, nil, nil, + nil, 23, 23, nil, nil, nil, 23, nil, 23, 23, + 23, 23, 23, 23, 23, nil, nil, nil, nil, nil, + 23, 23, 23, 23, 23, 23, 23, nil, nil, 23, + nil, nil, nil, nil, nil, nil, 23, nil, nil, 23, + 23, 23, 23, 23, 23, 23, 23, nil, 23, 23, + 23, nil, 23, 23, nil, 23, 23, 23, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + 23, nil, nil, 23, 23, nil, 781, 23, 781, 781, + 781, 781, 781, 23, nil, nil, nil, nil, nil, nil, + nil, 23, 781, nil, nil, nil, 23, 23, 23, 23, + 23, 23, nil, nil, nil, 23, 23, nil, nil, nil, + nil, nil, nil, 23, 781, 30, 23, 23, 23, nil, + 23, 23, 30, 30, 30, 781, 781, 30, 30, 30, + 767, 30, 767, 767, 767, 767, 767, nil, nil, nil, + 30, 30, 30, nil, nil, nil, 767, nil, nil, nil, + nil, 30, 30, nil, 30, 30, 30, 30, 30, 781, + nil, nil, nil, nil, nil, nil, nil, nil, 767, nil, + nil, nil, nil, nil, nil, nil, nil, 767, 767, 767, + 767, nil, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, nil, nil, 30, 30, + 30, nil, nil, 30, nil, 30, 30, nil, nil, 30, + 30, nil, 30, 767, 30, nil, 30, nil, 30, 30, + 30, 30, 30, 30, 30, nil, 30, 30, 30, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 30, 30, 31, 30, nil, 30, nil, nil, nil, + 31, 31, 31, 30, nil, 31, 31, 31, 768, 31, + 768, 768, 768, 768, 768, nil, nil, nil, nil, 31, + 31, nil, nil, nil, 768, nil, nil, nil, nil, 31, + 31, nil, 31, 31, 31, 31, 31, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 768, nil, nil, nil, + nil, nil, nil, nil, nil, 768, 768, 768, 768, nil, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, nil, nil, 31, 31, 31, nil, + nil, 31, nil, 31, 31, nil, nil, 31, 31, nil, + 31, 768, 31, nil, 31, nil, 31, 31, 31, 31, + 31, 31, 31, nil, 31, nil, 31, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 31, + 31, nil, 31, nil, 31, 32, 32, 32, nil, 32, + nil, 31, nil, 32, 32, nil, nil, nil, 32, nil, + 32, 32, 32, 32, 32, 32, 32, nil, nil, nil, + nil, nil, 32, 32, 32, 32, 32, 32, 32, nil, + nil, 32, nil, nil, nil, nil, nil, nil, 32, nil, + nil, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, nil, 32, 32, nil, 32, 32, 32, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 32, + nil, nil, 32, nil, nil, 32, 32, nil, nil, 32, + nil, 32, nil, 32, nil, 32, nil, nil, nil, nil, + nil, nil, nil, 32, nil, nil, nil, nil, 32, 32, + 32, 32, 32, 32, nil, nil, nil, 32, 32, nil, + nil, nil, nil, nil, nil, 32, nil, 32, 32, 32, + 32, nil, 32, 32, 33, 33, 33, nil, 33, nil, + nil, nil, 33, 33, nil, nil, nil, 33, nil, 33, + 33, 33, 33, 33, 33, 33, nil, nil, nil, nil, + nil, 33, 33, 33, 33, 33, 33, 33, nil, nil, + 33, nil, nil, nil, nil, nil, nil, 33, nil, nil, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, nil, 33, 33, nil, 33, 33, 33, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 33, nil, + nil, 33, nil, nil, 33, 33, nil, nil, 33, nil, + 33, nil, 33, nil, 33, nil, nil, nil, nil, nil, + nil, nil, 33, nil, nil, nil, nil, 33, 33, 33, + 33, 33, 33, nil, nil, nil, 33, 33, nil, nil, + nil, nil, nil, nil, 33, nil, 33, 33, 33, 33, + nil, 33, 33, 34, 34, 34, nil, 34, nil, nil, + nil, 34, 34, nil, nil, nil, 34, nil, 34, 34, + 34, 34, 34, 34, 34, nil, nil, nil, nil, nil, + 34, 34, 34, 34, 34, 34, 34, nil, nil, 34, + nil, nil, nil, nil, nil, nil, 34, nil, nil, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, nil, 34, 34, nil, 34, 34, 34, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + 34, nil, nil, 34, 34, nil, nil, 34, nil, 34, + nil, 34, nil, 34, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, nil, 34, 34, 34, 34, + 34, 34, nil, nil, nil, 34, 34, nil, nil, nil, + nil, nil, nil, 34, nil, 34, 34, 34, 34, nil, + 34, 34, 37, 37, 37, nil, 37, nil, nil, nil, + 37, 37, nil, nil, nil, 37, nil, 37, 37, 37, + 37, 37, 37, 37, nil, nil, nil, nil, nil, 37, + 37, 37, 37, 37, 37, 37, nil, nil, 37, nil, + nil, nil, nil, nil, nil, 37, nil, nil, 37, 37, + 37, 37, 37, 37, 37, 37, nil, 37, 37, 37, + nil, 37, 37, nil, nil, nil, 37, nil, nil, nil, + nil, nil, 965, nil, 965, 965, 965, 965, 965, nil, + nil, nil, nil, nil, nil, nil, 37, nil, 965, 37, + nil, nil, 37, 37, nil, nil, 37, nil, 37, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 965, nil, nil, nil, nil, 37, 37, 37, 37, 37, + 37, 965, 965, nil, 37, 37, nil, nil, nil, nil, + nil, nil, 37, nil, nil, 37, 37, 37, nil, 37, + 37, 38, 38, 38, nil, 38, nil, nil, nil, 38, + 38, nil, nil, nil, 38, 965, 38, 38, 38, 38, + 38, 38, 38, nil, nil, nil, nil, nil, 38, 38, + 38, 38, 38, 38, 38, nil, nil, 38, nil, nil, + nil, nil, nil, nil, 38, nil, nil, 38, 38, 38, + 38, 38, 38, 38, 38, nil, 38, 38, 38, nil, + 38, 38, nil, nil, nil, 38, nil, nil, nil, nil, + nil, 967, nil, 967, 967, 967, 967, 967, nil, nil, + nil, nil, nil, nil, nil, 38, nil, 967, 38, nil, + nil, 38, 38, nil, nil, 38, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 967, + nil, nil, nil, nil, 38, 38, 38, 38, 38, 38, + 967, 967, nil, 38, 38, nil, nil, nil, 38, nil, + nil, 38, nil, nil, 38, 38, 38, nil, 38, 38, + 45, 45, 45, nil, 45, nil, nil, nil, 45, 45, + nil, nil, nil, 45, 967, 45, 45, 45, 45, 45, + 45, 45, nil, nil, nil, nil, nil, 45, 45, 45, + 45, 45, 45, 45, nil, nil, 45, nil, nil, nil, + nil, nil, nil, 45, nil, nil, 45, 45, 45, 45, + 45, 45, 45, 45, nil, 45, 45, 45, nil, 45, + 45, nil, 45, 45, 45, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 45, nil, nil, 45, nil, nil, + 45, 45, nil, nil, 45, nil, nil, nil, nil, nil, + 45, nil, nil, nil, nil, nil, nil, nil, 45, nil, + nil, nil, nil, 45, 45, 45, 45, 45, 45, nil, + nil, nil, 45, 45, nil, nil, nil, nil, nil, nil, + 45, nil, nil, 45, 45, 45, nil, 45, 45, 46, + 46, 46, nil, 46, nil, nil, nil, 46, 46, nil, + nil, nil, 46, nil, 46, 46, 46, 46, 46, 46, + 46, nil, nil, nil, nil, nil, 46, 46, 46, 46, + 46, 46, 46, nil, nil, 46, nil, nil, nil, nil, + nil, nil, 46, nil, nil, 46, 46, 46, 46, 46, + 46, 46, 46, nil, 46, 46, 46, nil, 46, 46, + nil, 46, 46, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 46, nil, nil, 46, nil, nil, 46, + 46, nil, nil, 46, nil, nil, nil, nil, nil, 46, + nil, nil, nil, nil, nil, nil, nil, 46, nil, nil, + nil, nil, 46, 46, 46, 46, 46, 46, nil, nil, + nil, 46, 46, nil, nil, nil, nil, nil, nil, 46, + nil, nil, 46, 46, 46, nil, 46, 46, 48, 48, + 48, nil, 48, nil, nil, nil, 48, 48, nil, nil, + nil, 48, nil, 48, 48, 48, 48, 48, 48, 48, + nil, nil, nil, nil, nil, 48, 48, 48, 48, 48, + 48, 48, nil, nil, 48, nil, nil, nil, nil, nil, + nil, 48, nil, nil, 48, 48, 48, 48, 48, 48, + 48, 48, nil, 48, 48, 48, nil, 48, 48, nil, + 48, 48, 48, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 48, nil, nil, 48, nil, nil, 48, 48, + nil, 969, 48, 969, 969, 969, 969, 969, 48, nil, + nil, nil, nil, nil, nil, nil, 48, 969, nil, nil, + nil, 48, 48, 48, 48, 48, 48, nil, nil, nil, + 48, 48, nil, nil, nil, nil, nil, nil, 48, 969, + 60, 48, 48, 48, nil, 48, 48, 60, 60, 60, + 969, 969, 60, 60, 60, 777, 60, 777, 777, 777, + 777, 777, nil, nil, nil, nil, 60, 60, 60, nil, + nil, 777, nil, nil, nil, nil, 60, 60, nil, 60, + 60, 60, 60, 60, 969, nil, nil, nil, nil, nil, + nil, nil, nil, 777, nil, nil, nil, nil, nil, nil, + nil, nil, 777, 777, 777, 777, nil, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, nil, nil, 60, 60, 60, nil, nil, 60, nil, + nil, 60, nil, nil, 60, 60, nil, 60, 777, 60, + nil, 60, nil, 60, 60, 60, 60, 60, 60, 60, + nil, 60, nil, 60, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 60, 60, 60, 60, + nil, 60, nil, 60, nil, nil, nil, 461, 60, 62, + 62, 62, 62, 62, 461, 461, 461, 62, 62, 461, + 461, 461, 62, 461, 62, 62, 62, 62, 62, 62, + 62, nil, 461, 461, 461, nil, 62, 62, 62, 62, + 62, 62, 62, 461, 461, 62, 461, 461, 461, 461, + 461, 62, 62, nil, 62, 62, 62, 62, 62, 62, + 62, 62, 62, nil, 62, 62, 62, nil, 62, 62, + nil, 62, 62, 62, 461, 461, 461, 461, 461, 461, + 461, 461, 461, 461, 461, 461, 461, 461, nil, nil, + 461, 461, 461, 62, nil, 461, 62, 461, 461, 62, + 62, 461, 461, 62, 461, 62, 461, nil, 461, 62, + 461, 461, 461, 461, 461, 461, 461, 62, 461, 461, + 461, nil, 62, 62, 62, 62, 62, 62, nil, nil, + nil, 62, 62, 461, 461, nil, 461, nil, 461, 62, + nil, nil, 62, 62, 62, 461, 62, 62, 67, 67, + 67, nil, 67, nil, nil, nil, 67, 67, nil, nil, + nil, 67, nil, 67, 67, 67, 67, 67, 67, 67, + nil, nil, nil, nil, nil, 67, 67, 67, 67, 67, + 67, 67, nil, nil, 67, nil, nil, nil, nil, nil, + nil, 67, nil, nil, 67, 67, 67, 67, 67, 67, + 67, 67, nil, 67, 67, 67, nil, 67, 67, nil, + 67, 67, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, 67, nil, nil, 67, 67, + nil, nil, 67, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, 67, 67, 67, 67, 67, 67, nil, nil, nil, + 67, 67, nil, nil, nil, nil, nil, nil, 67, nil, + nil, 67, 67, 67, nil, 67, 67, 68, 68, 68, + nil, 68, nil, nil, nil, 68, 68, nil, nil, nil, + 68, nil, 68, 68, 68, 68, 68, 68, 68, nil, + nil, nil, nil, nil, 68, 68, 68, 68, 68, 68, + 68, nil, nil, 68, nil, nil, nil, nil, nil, nil, + 68, nil, nil, 68, 68, 68, 68, 68, 68, 68, + 68, nil, 68, 68, 68, nil, 68, 68, nil, 68, + 68, 68, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 68, nil, nil, 68, nil, nil, 68, 68, nil, + nil, 68, nil, nil, nil, nil, nil, 68, nil, nil, + nil, nil, nil, nil, nil, 68, nil, nil, nil, nil, + 68, 68, 68, 68, 68, 68, nil, nil, nil, 68, + 68, nil, nil, nil, nil, nil, nil, 68, nil, nil, + 68, 68, 68, nil, 68, 68, 71, 71, 71, nil, + 71, nil, nil, nil, 71, 71, nil, nil, nil, 71, + nil, 71, 71, 71, 71, 71, 71, 71, nil, nil, + nil, nil, nil, 71, 71, 71, 71, 71, 71, 71, + nil, nil, 71, nil, nil, nil, nil, nil, nil, 71, + nil, nil, 71, 71, 71, 71, 71, 71, 71, 71, + nil, 71, 71, 71, nil, 71, 71, nil, 71, 71, + 71, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 71, nil, nil, 71, nil, nil, 71, 71, nil, nil, + 71, nil, nil, nil, nil, nil, 71, nil, nil, nil, + nil, nil, nil, nil, 71, nil, nil, nil, nil, 71, + 71, 71, 71, 71, 71, nil, nil, nil, 71, 71, + 71, nil, nil, nil, nil, 71, 71, nil, nil, 71, + 71, 71, nil, 71, 71, 72, 72, 72, nil, 72, + nil, nil, nil, 72, 72, nil, nil, nil, 72, nil, + 72, 72, 72, 72, 72, 72, 72, nil, nil, nil, + nil, nil, 72, 72, 72, 72, 72, 72, 72, nil, + nil, 72, nil, nil, nil, nil, nil, nil, 72, nil, + nil, 72, 72, 72, 72, 72, 72, 72, 72, nil, + 72, 72, 72, nil, 72, 72, nil, nil, nil, 72, + nil, nil, nil, nil, nil, 985, nil, 985, 985, 985, + 985, 985, nil, nil, nil, nil, nil, nil, nil, 72, + nil, 985, 72, nil, nil, 72, 72, nil, nil, 72, + nil, 72, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 985, nil, nil, nil, nil, 72, 72, + 72, 72, 72, 72, 985, 985, nil, 72, 72, nil, + nil, nil, nil, nil, nil, 72, nil, nil, 72, 72, + 72, nil, 72, 72, 73, 73, 73, nil, 73, nil, + nil, nil, 73, 73, nil, nil, nil, 73, 985, 73, + 73, 73, 73, 73, 73, 73, nil, nil, nil, nil, + nil, 73, 73, 73, 73, 73, 73, 73, nil, nil, + 73, nil, nil, nil, nil, nil, nil, 73, nil, nil, + 73, 73, 73, 73, 73, 73, 73, 73, nil, 73, + 73, 73, nil, 73, 73, nil, nil, nil, 73, nil, + nil, nil, nil, nil, 1047, nil, 1047, 1047, 1047, 1047, + 1047, nil, nil, nil, nil, 73, nil, nil, 73, nil, + 1047, 73, nil, nil, 73, 73, nil, nil, 73, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1047, nil, nil, nil, nil, 73, 73, 73, + 73, 73, 73, 1047, 1047, nil, 73, 73, nil, nil, + nil, nil, nil, nil, 73, nil, nil, 73, 73, 73, + nil, 73, 73, 74, 74, 74, nil, 74, nil, nil, + nil, 74, 74, nil, nil, nil, 74, 1047, 74, 74, + 74, 74, 74, 74, 74, nil, nil, nil, nil, nil, + 74, 74, 74, 74, 74, 74, 74, nil, nil, 74, + nil, nil, nil, nil, nil, nil, 74, nil, nil, 74, + 74, 74, 74, 74, 74, 74, 74, nil, 74, 74, + 74, nil, 74, 74, nil, nil, nil, 74, nil, nil, + nil, nil, nil, 1056, nil, 1056, 1056, 1056, 1056, 1056, + nil, nil, nil, nil, nil, nil, nil, 74, nil, 1056, + 74, nil, nil, 74, 74, nil, nil, 74, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1056, nil, nil, nil, nil, 74, 74, 74, 74, + 74, 74, 1056, 1056, nil, 74, 74, nil, nil, nil, + nil, nil, nil, 74, nil, nil, 74, 74, 74, nil, + 74, 74, 128, 128, 128, 128, 128, nil, nil, nil, + 128, 128, nil, nil, nil, 128, 1056, 128, 128, 128, + 128, 128, 128, 128, nil, nil, nil, nil, nil, 128, + 128, 128, 128, 128, 128, 128, nil, nil, 128, nil, + nil, nil, nil, nil, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, nil, 128, 128, 128, + nil, 128, 128, nil, 128, 128, 128, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 128, nil, nil, 128, + nil, nil, 128, 128, nil, nil, 128, nil, 128, nil, + nil, nil, 128, nil, nil, nil, nil, nil, nil, nil, + 128, nil, nil, nil, nil, 128, 128, 128, 128, 128, + 128, nil, nil, nil, 128, 128, nil, nil, nil, nil, + nil, 128, 128, nil, nil, 128, 128, 128, nil, 128, + 128, 133, 133, 133, nil, 133, nil, nil, nil, 133, + 133, nil, nil, nil, 133, nil, 133, 133, 133, 133, + 133, 133, 133, nil, nil, nil, nil, nil, 133, 133, + 133, 133, 133, 133, 133, nil, nil, 133, nil, nil, + nil, nil, nil, nil, 133, nil, nil, 133, 133, 133, + 133, 133, 133, 133, 133, nil, 133, 133, 133, nil, + 133, 133, nil, 133, 133, 133, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 133, nil, nil, 133, nil, + nil, 133, 133, nil, nil, 133, nil, nil, nil, nil, + nil, 133, nil, nil, nil, nil, nil, nil, nil, 133, + nil, nil, nil, nil, 133, 133, 133, 133, 133, 133, + nil, nil, nil, 133, 133, nil, nil, nil, nil, nil, + nil, 133, nil, nil, 133, 133, 133, nil, 133, 133, + 134, 134, 134, nil, 134, nil, nil, nil, 134, 134, + nil, nil, nil, 134, nil, 134, 134, 134, 134, 134, + 134, 134, nil, nil, nil, nil, nil, 134, 134, 134, + 134, 134, 134, 134, nil, nil, 134, nil, nil, nil, + nil, nil, nil, 134, nil, nil, 134, 134, 134, 134, + 134, 134, 134, 134, nil, 134, 134, 134, nil, 134, + 134, nil, 134, 134, 134, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 134, nil, nil, 134, nil, nil, + 134, 134, nil, nil, 134, nil, nil, nil, nil, nil, + 134, nil, nil, nil, nil, nil, nil, nil, 134, nil, + nil, nil, nil, 134, 134, 134, 134, 134, 134, nil, + nil, nil, 134, 134, nil, nil, nil, nil, nil, nil, + 134, nil, nil, 134, 134, 134, nil, 134, 134, 135, + 135, 135, nil, 135, nil, nil, nil, 135, 135, nil, + nil, nil, 135, nil, 135, 135, 135, 135, 135, 135, + 135, nil, nil, nil, nil, nil, 135, 135, 135, 135, + 135, 135, 135, nil, nil, 135, nil, nil, nil, nil, + nil, nil, 135, nil, nil, 135, 135, 135, 135, 135, + 135, 135, 135, nil, 135, 135, 135, nil, 135, 135, + nil, 135, 135, 135, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 135, nil, nil, 135, nil, nil, 135, + 135, nil, nil, 135, nil, nil, nil, nil, nil, 135, + nil, nil, nil, nil, nil, nil, nil, 135, nil, nil, + nil, nil, 135, 135, 135, 135, 135, 135, nil, nil, + nil, 135, 135, nil, nil, nil, nil, nil, nil, 135, + nil, nil, 135, 135, 135, nil, 135, 135, 136, 136, + 136, nil, 136, nil, nil, nil, 136, 136, nil, nil, + nil, 136, nil, 136, 136, 136, 136, 136, 136, 136, + nil, nil, nil, nil, nil, 136, 136, 136, 136, 136, + 136, 136, nil, nil, 136, nil, nil, nil, nil, nil, + nil, 136, nil, nil, 136, 136, 136, 136, 136, 136, + 136, 136, nil, 136, 136, 136, nil, 136, 136, nil, + 136, 136, 136, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 136, nil, nil, 136, nil, nil, 136, 136, + nil, nil, 136, nil, nil, nil, nil, nil, 136, nil, + nil, nil, nil, nil, nil, nil, 136, nil, nil, nil, + nil, 136, 136, 136, 136, 136, 136, nil, nil, nil, + 136, 136, nil, nil, nil, nil, nil, nil, 136, nil, + nil, 136, 136, 136, nil, 136, 136, 137, 137, 137, + 137, 137, nil, nil, nil, 137, 137, nil, nil, nil, + 137, nil, 137, 137, 137, 137, 137, 137, 137, nil, + nil, nil, nil, nil, 137, 137, 137, 137, 137, 137, + 137, nil, nil, 137, nil, nil, nil, nil, nil, 137, + 137, nil, 137, 137, 137, 137, 137, 137, 137, 137, + 137, nil, 137, 137, 137, nil, 137, 137, nil, 137, + 137, 137, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 137, nil, nil, 137, nil, nil, 137, 137, nil, + nil, 137, nil, 137, nil, nil, nil, 137, nil, nil, + nil, nil, nil, nil, nil, 137, nil, nil, nil, nil, + 137, 137, 137, 137, 137, 137, nil, nil, nil, 137, + 137, nil, nil, nil, nil, nil, nil, 137, nil, nil, + 137, 137, 137, nil, 137, 137, 222, 222, 222, nil, + 222, nil, nil, nil, 222, 222, nil, nil, nil, 222, + nil, 222, 222, 222, 222, 222, 222, 222, nil, nil, + nil, nil, nil, 222, 222, 222, 222, 222, 222, 222, + nil, nil, 222, nil, nil, nil, nil, nil, nil, 222, + nil, nil, 222, 222, 222, 222, 222, 222, 222, 222, + nil, 222, 222, 222, nil, 222, 222, nil, 222, 222, + 222, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 222, nil, nil, 222, nil, nil, 222, 222, nil, nil, + 222, nil, 222, nil, nil, nil, 222, nil, nil, nil, + nil, nil, nil, nil, 222, nil, nil, nil, nil, 222, + 222, 222, 222, 222, 222, nil, nil, nil, 222, 222, + nil, nil, nil, nil, nil, nil, 222, nil, nil, 222, + 222, 222, nil, 222, 222, 223, 223, 223, nil, 223, + nil, nil, nil, 223, 223, nil, nil, nil, 223, nil, + 223, 223, 223, 223, 223, 223, 223, nil, nil, nil, + nil, nil, 223, 223, 223, 223, 223, 223, 223, nil, + nil, 223, nil, nil, nil, nil, nil, nil, 223, nil, + nil, 223, 223, 223, 223, 223, 223, 223, 223, nil, + 223, 223, 223, nil, 223, 223, nil, 223, 223, 223, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 223, + nil, nil, 223, nil, nil, 223, 223, nil, nil, 223, + nil, 223, nil, nil, nil, 223, nil, nil, nil, nil, + nil, nil, nil, 223, nil, nil, nil, nil, 223, 223, + 223, 223, 223, 223, nil, nil, nil, 223, 223, nil, + nil, nil, nil, nil, nil, 223, nil, nil, 223, 223, + 223, nil, 223, 223, 224, 224, 224, nil, 224, nil, + nil, nil, 224, 224, nil, nil, nil, 224, nil, 224, + 224, 224, 224, 224, 224, 224, nil, nil, nil, nil, + nil, 224, 224, 224, 224, 224, 224, 224, nil, nil, + 224, nil, nil, nil, nil, nil, nil, 224, nil, nil, + 224, 224, 224, 224, 224, 224, 224, 224, nil, 224, + 224, 224, nil, 224, 224, nil, 224, 224, 224, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 224, nil, + nil, 224, nil, nil, 224, 224, nil, nil, 224, nil, + nil, nil, nil, nil, 224, nil, nil, nil, nil, nil, + nil, nil, 224, nil, nil, nil, nil, 224, 224, 224, + 224, 224, 224, nil, nil, nil, 224, 224, nil, nil, + nil, nil, nil, nil, 224, nil, nil, 224, 224, 224, + nil, 224, 224, 225, 225, 225, nil, 225, nil, nil, + nil, 225, 225, nil, nil, nil, 225, nil, 225, 225, + 225, 225, 225, 225, 225, nil, nil, nil, nil, nil, + 225, 225, 225, 225, 225, 225, 225, nil, nil, 225, + nil, nil, nil, nil, nil, nil, 225, nil, nil, 225, + 225, 225, 225, 225, 225, 225, 225, nil, 225, 225, + 225, nil, 225, 225, nil, 225, 225, 225, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 225, nil, nil, + 225, nil, nil, 225, 225, nil, nil, 225, nil, nil, + nil, nil, nil, 225, nil, nil, nil, nil, nil, nil, + nil, 225, nil, nil, nil, nil, 225, 225, 225, 225, + 225, 225, nil, nil, nil, 225, 225, nil, nil, nil, + nil, nil, nil, 225, nil, nil, 225, 225, 225, nil, + 225, 225, 226, 226, 226, nil, 226, nil, nil, nil, + 226, 226, nil, nil, nil, 226, nil, 226, 226, 226, + 226, 226, 226, 226, nil, nil, nil, nil, nil, 226, + 226, 226, 226, 226, 226, 226, nil, nil, 226, nil, + nil, nil, nil, nil, nil, 226, nil, nil, 226, 226, + 226, 226, 226, 226, 226, 226, nil, 226, 226, 226, + nil, 226, 226, nil, 226, 226, 226, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 226, nil, nil, 226, + nil, nil, 226, 226, nil, nil, 226, nil, nil, nil, + nil, nil, 226, nil, nil, nil, nil, nil, nil, nil, + 226, nil, nil, nil, nil, 226, 226, 226, 226, 226, + 226, nil, nil, nil, 226, 226, nil, nil, nil, nil, + nil, nil, 226, nil, nil, 226, 226, 226, nil, 226, + 226, 227, 227, 227, nil, 227, nil, nil, nil, 227, + 227, nil, nil, nil, 227, nil, 227, 227, 227, 227, + 227, 227, 227, nil, nil, nil, nil, nil, 227, 227, + 227, 227, 227, 227, 227, nil, nil, 227, nil, nil, + nil, nil, nil, nil, 227, nil, nil, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, nil, + 227, 227, nil, 227, 227, 227, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 227, nil, nil, 227, nil, + nil, 227, 227, nil, nil, 227, nil, 227, nil, 227, + nil, 227, nil, nil, nil, nil, nil, nil, nil, 227, + nil, nil, nil, nil, 227, 227, 227, 227, 227, 227, + nil, nil, nil, 227, 227, nil, nil, nil, nil, nil, + nil, 227, nil, 227, 227, 227, 227, nil, 227, 227, + 231, 231, 231, nil, 231, nil, nil, nil, 231, 231, + nil, nil, nil, 231, nil, 231, 231, 231, 231, 231, + 231, 231, nil, nil, nil, nil, nil, 231, 231, 231, + 231, 231, 231, 231, nil, nil, 231, nil, nil, nil, + nil, nil, nil, 231, nil, nil, 231, 231, 231, 231, + 231, 231, 231, 231, nil, 231, 231, 231, nil, 231, + 231, nil, 231, 231, 231, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 231, nil, nil, 231, nil, nil, + 231, 231, nil, nil, 231, nil, nil, nil, nil, nil, + 231, nil, nil, nil, nil, nil, nil, nil, 231, nil, + nil, nil, nil, 231, 231, 231, 231, 231, 231, nil, + nil, nil, 231, 231, nil, nil, nil, nil, nil, nil, + 231, nil, nil, 231, 231, 231, nil, 231, 231, 232, + 232, 232, nil, 232, nil, nil, nil, 232, 232, nil, + nil, nil, 232, nil, 232, 232, 232, 232, 232, 232, + 232, nil, nil, nil, nil, nil, 232, 232, 232, 232, + 232, 232, 232, nil, nil, 232, nil, nil, nil, nil, + nil, nil, 232, nil, nil, 232, 232, 232, 232, 232, + 232, 232, 232, nil, 232, 232, 232, nil, 232, 232, + nil, 232, 232, 232, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 232, nil, nil, 232, nil, nil, 232, + 232, nil, nil, 232, nil, nil, nil, nil, nil, 232, + nil, nil, nil, nil, nil, nil, nil, 232, nil, nil, + nil, nil, 232, 232, 232, 232, 232, 232, nil, nil, + nil, 232, 232, nil, nil, nil, nil, nil, nil, 232, + nil, nil, 232, 232, 232, nil, 232, 232, 233, 233, + 233, nil, 233, nil, nil, nil, 233, 233, nil, nil, + nil, 233, nil, 233, 233, 233, 233, 233, 233, 233, + nil, nil, nil, nil, nil, 233, 233, 233, 233, 233, + 233, 233, nil, nil, 233, nil, nil, nil, nil, nil, + nil, 233, nil, nil, 233, 233, 233, 233, 233, 233, + 233, 233, nil, 233, 233, 233, nil, 233, 233, nil, + 233, 233, 233, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 233, nil, nil, 233, nil, nil, 233, 233, + nil, nil, 233, nil, nil, nil, nil, nil, 233, nil, + nil, nil, nil, nil, nil, nil, 233, nil, nil, nil, + nil, 233, 233, 233, 233, 233, 233, nil, nil, nil, + 233, 233, 233, nil, nil, nil, nil, nil, 233, nil, + nil, 233, 233, 233, nil, 233, 233, 244, 244, 244, + nil, 244, nil, nil, nil, 244, 244, nil, nil, nil, + 244, nil, 244, 244, 244, 244, 244, 244, 244, nil, + nil, nil, nil, nil, 244, 244, 244, 244, 244, 244, + 244, nil, nil, 244, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 244, 244, 244, 244, 244, 244, 244, + 244, nil, 244, 244, 244, nil, 244, 244, nil, 244, + 244, 244, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 244, nil, nil, 244, 244, nil, + nil, 244, nil, nil, nil, nil, nil, 244, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, nil, nil, + 244, 244, 244, 244, 244, 244, nil, nil, nil, 244, + 244, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 244, 244, 244, nil, 244, 244, 247, 247, 247, nil, + 247, nil, nil, nil, 247, 247, nil, nil, nil, 247, + nil, 247, 247, 247, 247, 247, 247, 247, nil, nil, + nil, nil, nil, 247, 247, 247, 247, 247, 247, 247, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 247, + nil, nil, 247, 247, 247, 247, 247, 247, 247, 247, + nil, 247, 247, 247, nil, 247, 247, nil, 247, 247, + 247, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, 247, nil, nil, 247, 247, nil, nil, + 247, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 247, + 247, 247, 247, 247, 247, nil, nil, nil, 247, 247, + nil, nil, nil, nil, nil, nil, 247, nil, nil, 247, + 247, 247, nil, 247, 247, 248, 248, 248, nil, 248, + nil, nil, nil, 248, 248, nil, nil, nil, 248, nil, + 248, 248, 248, 248, 248, 248, 248, nil, nil, nil, + nil, nil, 248, 248, 248, 248, 248, 248, 248, nil, + nil, 248, nil, nil, nil, nil, nil, nil, 248, nil, + nil, 248, 248, 248, 248, 248, 248, 248, 248, nil, + 248, 248, 248, nil, 248, 248, nil, 248, 248, 248, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 248, + nil, nil, 248, nil, nil, 248, 248, nil, nil, 248, + nil, nil, nil, nil, nil, 248, nil, nil, nil, nil, + nil, nil, nil, 248, nil, nil, nil, nil, 248, 248, + 248, 248, 248, 248, nil, nil, nil, 248, 248, nil, + nil, nil, nil, nil, nil, 248, nil, nil, 248, 248, + 248, nil, 248, 248, 249, 249, 249, nil, 249, nil, + nil, nil, 249, 249, nil, nil, nil, 249, nil, 249, + 249, 249, 249, 249, 249, 249, nil, nil, nil, nil, + nil, 249, 249, 249, 249, 249, 249, 249, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 249, nil, nil, + 249, 249, 249, 249, 249, 249, 249, 249, nil, 249, + 249, 249, nil, 249, 249, nil, 249, 249, 249, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, 249, nil, nil, 249, 249, nil, nil, 249, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 249, 249, 249, + 249, 249, 249, nil, nil, nil, 249, 249, nil, nil, + nil, nil, nil, nil, 249, nil, nil, 249, 249, 249, + nil, 249, 249, 250, 250, 250, nil, 250, nil, nil, + nil, 250, 250, nil, nil, nil, 250, nil, 250, 250, + 250, 250, 250, 250, 250, nil, nil, nil, nil, nil, + 250, 250, 250, 250, 250, 250, 250, nil, nil, 250, + nil, nil, nil, nil, nil, nil, 250, nil, nil, 250, + 250, 250, 250, 250, 250, 250, 250, nil, 250, 250, + 250, nil, 250, 250, nil, 250, 250, 250, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 250, nil, nil, + 250, nil, nil, 250, 250, nil, nil, 250, nil, nil, + nil, nil, nil, 250, nil, nil, nil, nil, nil, nil, + nil, 250, nil, nil, nil, nil, 250, 250, 250, 250, + 250, 250, nil, nil, nil, 250, 250, nil, nil, nil, + nil, nil, nil, 250, nil, nil, 250, 250, 250, nil, + 250, 250, 251, 251, 251, nil, 251, nil, nil, nil, + 251, 251, nil, nil, nil, 251, nil, 251, 251, 251, + 251, 251, 251, 251, nil, nil, nil, nil, nil, 251, + 251, 251, 251, 251, 251, 251, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 251, nil, nil, 251, 251, + 251, 251, 251, 251, 251, 251, nil, 251, 251, 251, + nil, 251, 251, nil, 251, 251, 251, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 251, nil, nil, 251, + nil, nil, 251, 251, nil, nil, 251, nil, nil, nil, + nil, nil, 251, nil, nil, nil, nil, nil, nil, nil, + 251, nil, nil, nil, nil, 251, 251, 251, 251, 251, + 251, nil, nil, nil, 251, 251, nil, nil, nil, nil, + nil, nil, 251, nil, nil, 251, 251, 251, nil, 251, + 251, 252, 252, 252, nil, 252, nil, nil, nil, 252, + 252, nil, nil, nil, 252, nil, 252, 252, 252, 252, + 252, 252, 252, nil, nil, nil, nil, nil, 252, 252, + 252, 252, 252, 252, 252, nil, nil, 252, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 252, 252, 252, + 252, 252, 252, 252, 252, nil, 252, 252, 252, nil, + 252, 252, nil, 252, 252, 252, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 252, nil, + nil, 252, 252, nil, nil, 252, nil, nil, nil, nil, + nil, 252, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, nil, nil, 252, 252, 252, 252, 252, 252, + nil, nil, nil, 252, 252, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 252, 252, 252, nil, 252, 252, + 253, 253, 253, nil, 253, nil, nil, nil, 253, 253, + nil, nil, nil, 253, nil, 253, 253, 253, 253, 253, + 253, 253, nil, nil, nil, nil, nil, 253, 253, 253, + 253, 253, 253, 253, nil, nil, 253, nil, nil, nil, + nil, nil, nil, 253, nil, nil, 253, 253, 253, 253, + 253, 253, 253, 253, nil, 253, 253, 253, nil, 253, + 253, nil, 253, 253, 253, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 253, nil, nil, 253, nil, nil, + 253, 253, nil, nil, 253, nil, nil, nil, nil, nil, + 253, nil, nil, nil, nil, nil, nil, nil, 253, nil, + nil, nil, nil, 253, 253, 253, 253, 253, 253, nil, + nil, nil, 253, 253, nil, nil, nil, nil, nil, nil, + 253, nil, nil, 253, 253, 253, nil, 253, 253, 254, + 254, 254, nil, 254, nil, nil, nil, 254, 254, nil, + nil, nil, 254, nil, 254, 254, 254, 254, 254, 254, + 254, nil, nil, nil, nil, nil, 254, 254, 254, 254, + 254, 254, 254, nil, nil, 254, nil, nil, nil, nil, + nil, nil, 254, nil, nil, 254, 254, 254, 254, 254, + 254, 254, 254, nil, 254, 254, 254, nil, 254, 254, + nil, 254, 254, 254, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 254, nil, nil, 254, nil, nil, 254, + 254, nil, nil, 254, nil, nil, nil, nil, nil, 254, + nil, nil, nil, nil, nil, nil, nil, 254, nil, nil, + nil, nil, 254, 254, 254, 254, 254, 254, nil, nil, + nil, 254, 254, nil, nil, nil, nil, nil, nil, 254, + nil, nil, 254, 254, 254, nil, 254, 254, 255, 255, + 255, nil, 255, nil, nil, nil, 255, 255, nil, nil, + nil, 255, nil, 255, 255, 255, 255, 255, 255, 255, + nil, nil, nil, nil, nil, 255, 255, 255, 255, 255, + 255, 255, nil, nil, 255, nil, nil, nil, nil, nil, + nil, 255, nil, nil, 255, 255, 255, 255, 255, 255, + 255, 255, nil, 255, 255, 255, nil, 255, 255, nil, + 255, 255, 255, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 255, nil, nil, 255, nil, nil, 255, 255, + nil, nil, 255, nil, nil, nil, nil, nil, 255, nil, + nil, nil, nil, nil, nil, nil, 255, nil, nil, nil, + nil, 255, 255, 255, 255, 255, 255, nil, nil, nil, + 255, 255, nil, nil, nil, nil, nil, nil, 255, nil, + nil, 255, 255, 255, nil, 255, 255, 256, 256, 256, + nil, 256, nil, nil, nil, 256, 256, nil, nil, nil, + 256, nil, 256, 256, 256, 256, 256, 256, 256, nil, + nil, nil, nil, nil, 256, 256, 256, 256, 256, 256, + 256, nil, nil, 256, nil, nil, nil, nil, nil, nil, + 256, nil, nil, 256, 256, 256, 256, 256, 256, 256, + 256, nil, 256, 256, 256, nil, 256, 256, nil, 256, + 256, 256, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 256, nil, nil, 256, nil, nil, 256, 256, nil, + nil, 256, nil, nil, nil, nil, nil, 256, nil, nil, + nil, nil, nil, nil, nil, 256, nil, nil, nil, nil, + 256, 256, 256, 256, 256, 256, nil, nil, nil, 256, + 256, nil, nil, nil, nil, nil, nil, 256, nil, nil, + 256, 256, 256, nil, 256, 256, 257, 257, 257, nil, + 257, nil, nil, nil, 257, 257, nil, nil, nil, 257, + nil, 257, 257, 257, 257, 257, 257, 257, nil, nil, + nil, nil, nil, 257, 257, 257, 257, 257, 257, 257, + nil, nil, 257, nil, nil, nil, nil, nil, nil, 257, + nil, nil, 257, 257, 257, 257, 257, 257, 257, 257, + nil, 257, 257, 257, nil, 257, 257, nil, 257, 257, + 257, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, 257, nil, nil, 257, 257, nil, nil, + 257, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 257, + 257, 257, 257, 257, 257, nil, nil, nil, 257, 257, + nil, nil, nil, nil, nil, nil, 257, nil, nil, 257, + 257, 257, nil, 257, 257, 258, 258, 258, nil, 258, + nil, nil, nil, 258, 258, nil, nil, nil, 258, nil, + 258, 258, 258, 258, 258, 258, 258, nil, nil, nil, + nil, nil, 258, 258, 258, 258, 258, 258, 258, nil, + nil, 258, nil, nil, nil, nil, nil, nil, 258, nil, + nil, 258, 258, 258, 258, 258, 258, 258, 258, nil, + 258, 258, 258, nil, 258, 258, nil, 258, 258, 258, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 258, + nil, nil, 258, nil, nil, 258, 258, nil, nil, 258, + nil, nil, nil, nil, nil, 258, nil, nil, nil, nil, + nil, nil, nil, 258, nil, nil, nil, nil, 258, 258, + 258, 258, 258, 258, nil, nil, nil, 258, 258, nil, + nil, nil, nil, nil, nil, 258, nil, nil, 258, 258, + 258, nil, 258, 258, 259, 259, 259, nil, 259, nil, + nil, nil, 259, 259, nil, nil, nil, 259, nil, 259, + 259, 259, 259, 259, 259, 259, nil, nil, nil, nil, + nil, 259, 259, 259, 259, 259, 259, 259, nil, nil, + 259, nil, nil, nil, nil, nil, nil, 259, nil, nil, + 259, 259, 259, 259, 259, 259, 259, 259, nil, 259, + 259, 259, nil, 259, 259, nil, 259, 259, 259, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 259, nil, + nil, 259, nil, nil, 259, 259, nil, nil, 259, nil, + nil, nil, nil, nil, 259, nil, nil, nil, nil, nil, + nil, nil, 259, nil, nil, nil, nil, 259, 259, 259, + 259, 259, 259, nil, nil, nil, 259, 259, nil, nil, + nil, nil, nil, nil, 259, nil, nil, 259, 259, 259, + nil, 259, 259, 260, 260, 260, nil, 260, nil, nil, + nil, 260, 260, nil, nil, nil, 260, nil, 260, 260, + 260, 260, 260, 260, 260, nil, nil, nil, nil, nil, + 260, 260, 260, 260, 260, 260, 260, nil, nil, 260, + nil, nil, nil, nil, nil, nil, 260, nil, nil, 260, + 260, 260, 260, 260, 260, 260, 260, nil, 260, 260, + 260, nil, 260, 260, nil, 260, 260, 260, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 260, nil, nil, + 260, nil, nil, 260, 260, nil, nil, 260, nil, nil, + nil, nil, nil, 260, nil, nil, nil, nil, nil, nil, + nil, 260, nil, nil, nil, nil, 260, 260, 260, 260, + 260, 260, nil, nil, nil, 260, 260, nil, nil, nil, + nil, nil, nil, 260, nil, nil, 260, 260, 260, nil, + 260, 260, 261, 261, 261, nil, 261, nil, nil, nil, + 261, 261, nil, nil, nil, 261, nil, 261, 261, 261, + 261, 261, 261, 261, nil, nil, nil, nil, nil, 261, + 261, 261, 261, 261, 261, 261, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 261, nil, nil, 261, 261, + 261, 261, 261, 261, 261, 261, nil, 261, 261, 261, + nil, 261, 261, nil, 261, 261, 261, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 261, nil, nil, 261, + nil, nil, 261, 261, nil, nil, 261, nil, nil, nil, + nil, nil, 261, nil, nil, nil, nil, nil, nil, nil, + 261, nil, nil, nil, nil, 261, 261, 261, 261, 261, + 261, nil, nil, nil, 261, 261, nil, nil, nil, nil, + nil, nil, 261, nil, nil, 261, 261, 261, nil, 261, + 261, 262, 262, 262, nil, 262, nil, nil, nil, 262, + 262, nil, nil, nil, 262, nil, 262, 262, 262, 262, + 262, 262, 262, nil, nil, nil, nil, nil, 262, 262, + 262, 262, 262, 262, 262, nil, nil, 262, nil, nil, + nil, nil, nil, nil, 262, nil, nil, 262, 262, 262, + 262, 262, 262, 262, 262, nil, 262, 262, 262, nil, + 262, 262, nil, 262, 262, 262, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 262, nil, nil, 262, nil, + nil, 262, 262, nil, nil, 262, nil, nil, nil, nil, + nil, 262, nil, nil, nil, nil, nil, nil, nil, 262, + nil, nil, nil, nil, 262, 262, 262, 262, 262, 262, + nil, nil, nil, 262, 262, nil, nil, nil, nil, nil, + nil, 262, nil, nil, 262, 262, 262, nil, 262, 262, + 263, 263, 263, nil, 263, nil, nil, nil, 263, 263, + nil, nil, nil, 263, nil, 263, 263, 263, 263, 263, + 263, 263, nil, nil, nil, nil, nil, 263, 263, 263, + 263, 263, 263, 263, nil, nil, 263, nil, nil, nil, + nil, nil, nil, 263, nil, nil, 263, 263, 263, 263, + 263, 263, 263, 263, nil, 263, 263, 263, nil, 263, + 263, nil, 263, 263, 263, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 263, nil, nil, 263, nil, nil, + 263, 263, nil, nil, 263, nil, nil, nil, nil, nil, + 263, nil, nil, nil, nil, nil, nil, nil, 263, nil, + nil, nil, nil, 263, 263, 263, 263, 263, 263, nil, + nil, nil, 263, 263, nil, nil, nil, nil, nil, nil, + 263, nil, nil, 263, 263, 263, nil, 263, 263, 264, + 264, 264, nil, 264, nil, nil, nil, 264, 264, nil, + nil, nil, 264, nil, 264, 264, 264, 264, 264, 264, + 264, nil, nil, nil, nil, nil, 264, 264, 264, 264, + 264, 264, 264, nil, nil, 264, nil, nil, nil, nil, + nil, nil, 264, nil, nil, 264, 264, 264, 264, 264, + 264, 264, 264, nil, 264, 264, 264, nil, 264, 264, + nil, 264, 264, 264, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 264, nil, nil, 264, nil, nil, 264, + 264, nil, nil, 264, nil, nil, nil, nil, nil, 264, + nil, nil, nil, nil, nil, nil, nil, 264, nil, nil, + nil, nil, 264, 264, 264, 264, 264, 264, nil, nil, + nil, 264, 264, nil, nil, nil, nil, nil, nil, 264, + nil, nil, 264, 264, 264, nil, 264, 264, 265, 265, + 265, nil, 265, nil, nil, nil, 265, 265, nil, nil, + nil, 265, nil, 265, 265, 265, 265, 265, 265, 265, + nil, nil, nil, nil, nil, 265, 265, 265, 265, 265, + 265, 265, nil, nil, 265, nil, nil, nil, nil, nil, + nil, 265, nil, nil, 265, 265, 265, 265, 265, 265, + 265, 265, nil, 265, 265, 265, nil, 265, 265, nil, + 265, 265, 265, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 265, nil, nil, 265, nil, nil, 265, 265, + nil, nil, 265, nil, nil, nil, nil, nil, 265, nil, + nil, nil, nil, nil, nil, nil, 265, nil, nil, nil, + nil, 265, 265, 265, 265, 265, 265, nil, nil, nil, + 265, 265, nil, nil, nil, nil, nil, nil, 265, nil, + nil, 265, 265, 265, nil, 265, 265, 266, 266, 266, + nil, 266, nil, nil, nil, 266, 266, nil, nil, nil, + 266, nil, 266, 266, 266, 266, 266, 266, 266, nil, + nil, nil, nil, nil, 266, 266, 266, 266, 266, 266, + 266, nil, nil, 266, nil, nil, nil, nil, nil, nil, + 266, nil, nil, 266, 266, 266, 266, 266, 266, 266, + 266, nil, 266, 266, 266, nil, 266, 266, nil, 266, + 266, 266, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 266, nil, nil, 266, nil, nil, 266, 266, nil, + nil, 266, nil, nil, nil, nil, nil, 266, nil, nil, + nil, nil, nil, nil, nil, 266, nil, nil, nil, nil, + 266, 266, 266, 266, 266, 266, nil, nil, nil, 266, + 266, nil, nil, nil, nil, nil, nil, 266, nil, nil, + 266, 266, 266, nil, 266, 266, 267, 267, 267, nil, + 267, nil, nil, nil, 267, 267, nil, nil, nil, 267, + nil, 267, 267, 267, 267, 267, 267, 267, nil, nil, + nil, nil, nil, 267, 267, 267, 267, 267, 267, 267, + nil, nil, 267, nil, nil, nil, nil, nil, nil, 267, + nil, nil, 267, 267, 267, 267, 267, 267, 267, 267, + nil, 267, 267, 267, nil, 267, 267, nil, 267, 267, + 267, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 267, nil, nil, 267, nil, nil, 267, 267, nil, nil, + 267, nil, nil, nil, nil, nil, 267, nil, nil, nil, + nil, nil, nil, nil, 267, nil, nil, nil, nil, 267, + 267, 267, 267, 267, 267, nil, nil, nil, 267, 267, + nil, nil, nil, nil, nil, nil, 267, nil, nil, 267, + 267, 267, nil, 267, 267, 268, 268, 268, nil, 268, + nil, nil, nil, 268, 268, nil, nil, nil, 268, nil, + 268, 268, 268, 268, 268, 268, 268, nil, nil, nil, + nil, nil, 268, 268, 268, 268, 268, 268, 268, nil, + nil, 268, nil, nil, nil, nil, nil, nil, 268, nil, + nil, 268, 268, 268, 268, 268, 268, 268, 268, nil, + 268, 268, 268, nil, 268, 268, nil, 268, 268, 268, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 268, + nil, nil, 268, nil, nil, 268, 268, nil, nil, 268, + nil, nil, nil, nil, nil, 268, nil, nil, nil, nil, + nil, nil, nil, 268, nil, nil, nil, nil, 268, 268, + 268, 268, 268, 268, nil, nil, nil, 268, 268, nil, + nil, nil, nil, nil, nil, 268, nil, nil, 268, 268, + 268, nil, 268, 268, 273, 273, 273, nil, 273, nil, + nil, nil, 273, 273, nil, nil, nil, 273, nil, 273, + 273, 273, 273, 273, 273, 273, nil, nil, nil, nil, + nil, 273, 273, 273, 273, 273, 273, 273, nil, nil, + 273, nil, nil, nil, nil, nil, nil, 273, nil, nil, + 273, 273, 273, 273, 273, 273, 273, 273, nil, 273, + 273, 273, nil, 273, 273, nil, 273, 273, 273, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 273, nil, + nil, 273, nil, nil, 273, 273, nil, nil, 273, nil, + nil, nil, nil, nil, 273, nil, nil, nil, nil, nil, + nil, nil, 273, nil, nil, nil, nil, 273, 273, 273, + 273, 273, 273, nil, nil, nil, 273, 273, nil, nil, + nil, nil, nil, nil, 273, nil, nil, 273, 273, 273, + nil, 273, 273, 281, 281, 281, nil, 281, nil, nil, + nil, 281, 281, nil, nil, nil, 281, nil, 281, 281, + 281, 281, 281, 281, 281, nil, nil, nil, nil, nil, + 281, 281, 281, 281, 281, 281, 281, nil, nil, 281, + nil, nil, nil, nil, nil, nil, 281, nil, nil, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, nil, 281, 281, nil, 281, 281, 281, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 281, nil, nil, + 281, nil, nil, 281, 281, nil, nil, 281, nil, 281, + nil, 281, nil, 281, nil, nil, nil, nil, nil, nil, + nil, 281, nil, nil, nil, nil, 281, 281, 281, 281, + 281, 281, nil, nil, nil, 281, 281, nil, nil, nil, + nil, nil, nil, 281, nil, 281, 281, 281, 281, nil, + 281, 281, 282, 282, 282, nil, 282, nil, nil, nil, + 282, 282, nil, nil, nil, 282, nil, 282, 282, 282, + 282, 282, 282, 282, nil, nil, nil, nil, nil, 282, + 282, 282, 282, 282, 282, 282, nil, nil, 282, nil, + nil, nil, nil, nil, nil, 282, nil, nil, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + nil, 282, 282, nil, 282, 282, 282, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 282, nil, nil, 282, + nil, nil, 282, 282, nil, nil, 282, nil, 282, nil, + 282, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, 282, 282, 282, 282, 282, + 282, nil, nil, nil, 282, 282, nil, nil, nil, nil, + nil, nil, 282, nil, 282, 282, 282, 282, nil, 282, + 282, 291, 291, 291, nil, 291, nil, nil, nil, 291, + 291, nil, nil, nil, 291, nil, 291, 291, 291, 291, + 291, 291, 291, nil, nil, nil, nil, nil, 291, 291, + 291, 291, 291, 291, 291, nil, nil, 291, nil, nil, + nil, nil, nil, nil, 291, nil, nil, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, nil, + 291, 291, nil, 291, 291, 291, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 291, nil, nil, 291, nil, + nil, 291, 291, nil, nil, 291, nil, 291, nil, 291, + nil, 291, nil, nil, nil, nil, nil, nil, nil, 291, + nil, nil, nil, nil, 291, 291, 291, 291, 291, 291, + nil, nil, nil, 291, 291, 291, nil, nil, nil, nil, + nil, 291, nil, 291, 291, 291, 291, nil, 291, 291, + 298, 298, 298, nil, 298, nil, nil, nil, 298, 298, + nil, nil, nil, 298, nil, 298, 298, 298, 298, 298, + 298, 298, nil, nil, nil, nil, nil, 298, 298, 298, + 298, 298, 298, 298, nil, nil, 298, nil, nil, nil, + nil, nil, nil, 298, nil, nil, 298, 298, 298, 298, + 298, 298, 298, 298, nil, 298, 298, 298, nil, 298, + 298, nil, 298, 298, 298, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 298, nil, nil, 298, nil, nil, + 298, 298, nil, nil, 298, nil, nil, nil, nil, nil, + 298, nil, nil, nil, nil, nil, nil, nil, 298, nil, + nil, nil, nil, 298, 298, 298, 298, 298, 298, nil, + nil, nil, 298, 298, nil, nil, nil, nil, nil, nil, + 298, nil, nil, 298, 298, 298, nil, 298, 298, 300, + 300, 300, nil, 300, nil, nil, nil, 300, 300, nil, + nil, nil, 300, nil, 300, 300, 300, 300, 300, 300, + 300, nil, nil, nil, nil, nil, 300, 300, 300, 300, + 300, 300, 300, nil, nil, 300, nil, nil, nil, nil, + nil, nil, 300, nil, nil, 300, 300, 300, 300, 300, + 300, 300, 300, nil, 300, 300, 300, nil, 300, 300, + nil, 300, 300, 300, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 300, nil, nil, 300, nil, nil, 300, + 300, nil, nil, 300, nil, nil, nil, nil, nil, 300, + nil, nil, nil, nil, nil, nil, nil, 300, nil, nil, + nil, nil, 300, 300, 300, 300, 300, 300, nil, nil, + nil, 300, 300, nil, nil, nil, nil, nil, nil, 300, + nil, nil, 300, 300, 300, nil, 300, 300, 303, 303, + 303, nil, 303, nil, nil, nil, 303, 303, nil, nil, + nil, 303, nil, 303, 303, 303, 303, 303, 303, 303, + nil, nil, nil, nil, nil, 303, 303, 303, 303, 303, + 303, 303, nil, nil, 303, nil, nil, nil, nil, nil, + nil, 303, nil, nil, 303, 303, 303, 303, 303, 303, + 303, 303, nil, 303, 303, 303, nil, 303, 303, nil, + 303, 303, 303, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 303, nil, nil, 303, nil, nil, 303, 303, + nil, nil, 303, nil, nil, nil, nil, nil, 303, nil, + nil, nil, nil, nil, nil, nil, 303, nil, nil, nil, + nil, 303, 303, 303, 303, 303, 303, nil, nil, nil, + 303, 303, nil, nil, nil, nil, nil, nil, 303, nil, + nil, 303, 303, 303, nil, 303, 303, 304, 304, 304, + nil, 304, nil, nil, nil, 304, 304, nil, nil, nil, + 304, nil, 304, 304, 304, 304, 304, 304, 304, nil, + nil, nil, nil, nil, 304, 304, 304, 304, 304, 304, + 304, nil, nil, 304, nil, nil, nil, nil, nil, nil, + 304, nil, nil, 304, 304, 304, 304, 304, 304, 304, + 304, nil, 304, 304, 304, nil, 304, 304, nil, 304, + 304, 304, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 304, nil, nil, 304, nil, nil, 304, 304, nil, + nil, 304, nil, nil, nil, nil, nil, 304, nil, nil, + nil, nil, nil, nil, nil, 304, nil, nil, nil, nil, + 304, 304, 304, 304, 304, 304, nil, nil, nil, 304, + 304, nil, nil, nil, nil, nil, nil, 304, nil, nil, + 304, 304, 304, nil, 304, 304, 310, 310, 310, 310, + 310, nil, nil, nil, 310, 310, nil, nil, nil, 310, + nil, 310, 310, 310, 310, 310, 310, 310, nil, nil, + nil, nil, nil, 310, 310, 310, 310, 310, 310, 310, + nil, nil, 310, nil, nil, nil, nil, nil, 310, 310, + nil, 310, 310, 310, 310, 310, 310, 310, 310, 310, + nil, 310, 310, 310, nil, 310, 310, nil, 310, 310, + 310, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 310, nil, nil, 310, nil, nil, 310, 310, nil, nil, + 310, nil, 310, nil, nil, nil, 310, nil, nil, nil, + nil, nil, nil, nil, 310, nil, nil, nil, nil, 310, + 310, 310, 310, 310, 310, nil, nil, nil, 310, 310, + nil, nil, nil, nil, nil, nil, 310, nil, nil, 310, + 310, 310, nil, 310, 310, 318, 318, 318, nil, 318, + nil, nil, nil, 318, 318, nil, nil, nil, 318, nil, + 318, 318, 318, 318, 318, 318, 318, nil, nil, nil, + nil, nil, 318, 318, 318, 318, 318, 318, 318, nil, + nil, 318, nil, nil, nil, nil, nil, nil, 318, nil, + nil, 318, 318, 318, 318, 318, 318, 318, 318, nil, + 318, 318, 318, nil, 318, 318, nil, nil, nil, 318, + nil, nil, nil, nil, nil, 1058, nil, 1058, 1058, 1058, + 1058, 1058, nil, nil, nil, nil, nil, nil, nil, 318, + nil, 1058, 318, nil, nil, 318, 318, nil, nil, 318, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1058, nil, nil, nil, nil, 318, 318, + 318, 318, 318, 318, 1058, 1058, nil, 318, 318, nil, + nil, nil, 318, nil, nil, 318, nil, nil, 318, 318, + 318, nil, 318, 318, 335, 335, 335, nil, 335, nil, + nil, nil, 335, 335, nil, nil, nil, 335, 1058, 335, + 335, 335, 335, 335, 335, 335, nil, nil, nil, nil, + nil, 335, 335, 335, 335, 335, 335, 335, nil, nil, + 335, nil, nil, nil, nil, nil, nil, 335, nil, nil, + 335, 335, 335, 335, 335, 335, 335, 335, nil, 335, + 335, 335, nil, 335, 335, nil, nil, nil, 335, nil, + nil, nil, nil, nil, 1060, nil, 1060, 1060, 1060, 1060, + 1060, nil, nil, nil, nil, nil, nil, nil, 335, nil, + 1060, 335, nil, nil, 335, 335, nil, nil, 335, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1060, nil, nil, nil, nil, 335, 335, 335, + 335, 335, 335, 1060, 1060, nil, 335, 335, nil, nil, + nil, nil, nil, nil, 335, nil, nil, 335, 335, 335, + nil, 335, 335, 342, 342, 342, nil, 342, nil, nil, + nil, 342, 342, nil, nil, nil, 342, 1060, 342, 342, + 342, 342, 342, 342, 342, nil, nil, nil, nil, nil, + 342, 342, 342, 342, 342, 342, 342, nil, nil, 342, + nil, nil, nil, nil, nil, nil, 342, nil, nil, 342, + 342, 342, 342, 342, 342, 342, 342, nil, 342, 342, + 342, nil, 342, 342, nil, 342, 342, 342, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 342, nil, nil, + 342, nil, nil, 342, 342, nil, nil, 342, nil, nil, + nil, nil, nil, 342, nil, nil, nil, nil, nil, nil, + nil, 342, nil, nil, nil, nil, 342, 342, 342, 342, + 342, 342, nil, nil, nil, 342, 342, nil, nil, nil, + nil, nil, nil, 342, nil, nil, 342, 342, 342, nil, + 342, 342, 344, 344, 344, nil, 344, nil, nil, nil, + 344, 344, nil, nil, nil, 344, nil, 344, 344, 344, + 344, 344, 344, 344, nil, nil, nil, nil, nil, 344, + 344, 344, 344, 344, 344, 344, nil, nil, 344, nil, + nil, nil, nil, nil, nil, 344, nil, nil, 344, 344, + 344, 344, 344, 344, 344, 344, nil, 344, 344, 344, + nil, 344, 344, nil, 344, 344, 344, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 344, nil, nil, 344, + 344, nil, 344, 344, nil, nil, 344, nil, nil, nil, + nil, nil, 344, nil, nil, nil, nil, nil, nil, nil, + 344, nil, nil, nil, nil, 344, 344, 344, 344, 344, + 344, nil, nil, nil, 344, 344, nil, nil, nil, nil, + nil, nil, 344, nil, nil, 344, 344, 344, nil, 344, + 344, 348, 348, 348, nil, 348, nil, nil, nil, 348, + 348, nil, nil, nil, 348, nil, 348, 348, 348, 348, + 348, 348, 348, nil, nil, nil, nil, nil, 348, 348, + 348, 348, 348, 348, 348, nil, nil, 348, nil, nil, + nil, nil, nil, nil, 348, nil, nil, 348, 348, 348, + 348, 348, 348, 348, 348, 348, 348, 348, 348, nil, + 348, 348, nil, 348, 348, 348, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 348, nil, nil, 348, nil, + nil, 348, 348, nil, nil, 348, nil, 348, nil, nil, + nil, 348, nil, nil, nil, nil, nil, nil, nil, 348, + nil, nil, nil, nil, 348, 348, 348, 348, 348, 348, + nil, nil, nil, 348, 348, nil, nil, nil, nil, nil, + nil, 348, nil, 348, 348, 348, 348, nil, 348, 348, + 349, 349, 349, nil, 349, nil, nil, nil, 349, 349, + nil, nil, nil, 349, nil, 349, 349, 349, 349, 349, + 349, 349, nil, nil, nil, nil, nil, 349, 349, 349, + 349, 349, 349, 349, nil, nil, 349, nil, nil, nil, + nil, nil, nil, 349, nil, nil, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, nil, 349, + 349, nil, 349, 349, 349, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 349, nil, nil, 349, nil, nil, + 349, 349, nil, nil, 349, nil, nil, nil, nil, nil, + 349, nil, nil, nil, nil, nil, nil, nil, 349, nil, + nil, nil, nil, 349, 349, 349, 349, 349, 349, nil, + nil, nil, 349, 349, nil, nil, nil, nil, nil, nil, + 349, nil, 349, 349, 349, 349, nil, 349, 349, 354, + 354, 354, nil, 354, nil, nil, nil, 354, 354, nil, + nil, nil, 354, nil, 354, 354, 354, 354, 354, 354, + 354, nil, nil, nil, nil, nil, 354, 354, 354, 354, + 354, 354, 354, nil, nil, 354, nil, nil, nil, nil, + nil, nil, 354, nil, nil, 354, 354, 354, 354, 354, + 354, 354, 354, nil, 354, 354, 354, nil, 354, 354, + nil, 354, 354, 354, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 354, nil, nil, 354, nil, nil, 354, + 354, nil, nil, 354, nil, nil, nil, nil, nil, 354, + nil, nil, nil, nil, nil, nil, nil, 354, nil, nil, + nil, nil, 354, 354, 354, 354, 354, 354, nil, nil, + nil, 354, 354, nil, nil, nil, nil, nil, nil, 354, + nil, nil, 354, 354, 354, nil, 354, 354, 375, 375, + 375, nil, 375, nil, nil, nil, 375, 375, nil, nil, + nil, 375, nil, 375, 375, 375, 375, 375, 375, 375, + nil, nil, nil, nil, nil, 375, 375, 375, 375, 375, + 375, 375, nil, nil, 375, nil, nil, nil, nil, nil, + nil, 375, nil, nil, 375, 375, 375, 375, 375, 375, + 375, 375, nil, 375, 375, 375, nil, 375, 375, nil, + 375, 375, 375, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 375, nil, nil, 375, nil, nil, 375, 375, + nil, nil, 375, nil, nil, nil, nil, nil, 375, nil, + nil, nil, nil, nil, nil, nil, 375, nil, nil, nil, + nil, 375, 375, 375, 375, 375, 375, nil, nil, nil, + 375, 375, nil, nil, nil, nil, nil, nil, 375, nil, + nil, 375, 375, 375, nil, 375, 375, 436, 436, 436, + nil, 436, nil, nil, nil, 436, 436, nil, nil, nil, + 436, nil, 436, 436, 436, 436, 436, 436, 436, nil, + nil, nil, nil, nil, 436, 436, 436, 436, 436, 436, + 436, nil, nil, 436, nil, nil, nil, nil, nil, nil, + 436, nil, nil, 436, 436, 436, 436, 436, 436, 436, + 436, nil, 436, 436, 436, nil, 436, 436, nil, 436, + 436, 436, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 436, nil, nil, 436, nil, nil, 436, 436, nil, + 1081, 436, 1081, 1081, 1081, 1081, 1081, 436, nil, nil, + nil, nil, nil, nil, nil, 436, 1081, nil, nil, nil, + 436, 436, 436, 436, 436, 436, nil, nil, nil, 436, + 436, nil, nil, nil, nil, nil, nil, 436, 1081, 470, + 436, 436, 436, nil, 436, 436, 470, 470, 470, 1081, + 1081, 470, 470, 470, 779, 470, 779, 779, 779, 779, + 779, nil, nil, nil, 470, 470, 470, 470, nil, nil, + 779, nil, nil, nil, nil, 470, 470, nil, 470, 470, + 470, 470, 470, 1081, nil, nil, nil, nil, nil, nil, + nil, nil, 779, nil, nil, nil, nil, nil, nil, nil, + nil, 779, 779, 779, 779, nil, 470, 470, 470, 470, + 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, + nil, nil, 470, 470, 470, nil, nil, 470, nil, nil, + 470, nil, nil, 470, 470, nil, 470, 779, 470, nil, + 470, nil, 470, 470, 470, 470, 470, 470, 470, nil, + 470, 470, 470, 833, nil, 833, 833, 833, 833, 833, + nil, nil, nil, nil, nil, 470, 470, 470, 470, 833, + 470, 471, 470, nil, nil, nil, nil, 470, 471, 471, + 471, nil, nil, 471, 471, 471, nil, 471, nil, nil, + nil, 833, nil, nil, nil, nil, 471, 471, 471, 471, + 833, 833, 833, 833, nil, nil, nil, 471, 471, nil, + 471, 471, 471, 471, 471, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 833, nil, + nil, nil, nil, nil, nil, nil, 833, nil, 471, 471, + 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, + 471, 471, nil, nil, 471, 471, 471, nil, nil, 471, + nil, nil, 471, nil, nil, 471, 471, nil, 471, nil, + 471, nil, 471, nil, 471, 471, 471, 471, 471, 471, + 471, nil, 471, 471, 471, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 471, 471, 471, + 471, nil, 471, nil, 471, nil, 480, 480, 480, 471, + 480, nil, nil, nil, 480, 480, nil, nil, nil, 480, + nil, 480, 480, 480, 480, 480, 480, 480, nil, nil, + nil, nil, nil, 480, 480, 480, 480, 480, 480, 480, + nil, nil, 480, nil, nil, nil, nil, nil, nil, 480, + nil, nil, 480, 480, 480, 480, 480, 480, 480, 480, + 480, 480, 480, 480, nil, 480, 480, nil, 480, 480, + 480, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 480, nil, nil, 480, nil, nil, 480, 480, nil, nil, + 480, nil, 480, nil, 480, nil, 480, nil, nil, nil, + nil, nil, nil, nil, 480, nil, nil, nil, nil, 480, + 480, 480, 480, 480, 480, nil, nil, nil, 480, 480, + nil, nil, nil, nil, nil, nil, 480, nil, 480, 480, + 480, 480, nil, 480, 480, 482, 482, 482, nil, 482, + nil, nil, nil, 482, 482, nil, nil, nil, 482, nil, + 482, 482, 482, 482, 482, 482, 482, nil, nil, nil, + nil, nil, 482, 482, 482, 482, 482, 482, 482, nil, + nil, 482, nil, nil, nil, nil, nil, nil, 482, nil, + nil, 482, 482, 482, 482, 482, 482, 482, 482, nil, + 482, 482, 482, nil, 482, 482, nil, 482, 482, 482, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 482, + nil, nil, 482, nil, nil, 482, 482, nil, nil, 482, + nil, nil, nil, nil, nil, 482, nil, nil, nil, nil, + nil, nil, nil, 482, nil, nil, nil, nil, 482, 482, + 482, 482, 482, 482, nil, nil, nil, 482, 482, nil, + nil, nil, nil, nil, nil, 482, nil, nil, 482, 482, + 482, nil, 482, 482, 483, 483, 483, nil, 483, nil, + nil, nil, 483, 483, nil, nil, nil, 483, nil, 483, + 483, 483, 483, 483, 483, 483, nil, nil, nil, nil, + nil, 483, 483, 483, 483, 483, 483, 483, nil, nil, + 483, nil, nil, nil, nil, nil, nil, 483, nil, nil, + 483, 483, 483, 483, 483, 483, 483, 483, nil, 483, + 483, 483, nil, 483, 483, nil, 483, 483, 483, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 483, nil, + nil, 483, nil, nil, 483, 483, nil, nil, 483, nil, + nil, nil, nil, nil, 483, nil, nil, nil, nil, nil, + nil, nil, 483, nil, nil, nil, nil, 483, 483, 483, + 483, 483, 483, nil, nil, nil, 483, 483, nil, nil, + nil, nil, nil, nil, 483, nil, nil, 483, 483, 483, + nil, 483, 483, 484, 484, 484, nil, 484, nil, nil, + nil, 484, 484, nil, nil, nil, 484, nil, 484, 484, + 484, 484, 484, 484, 484, nil, nil, nil, nil, nil, + 484, 484, 484, 484, 484, 484, 484, nil, nil, 484, + nil, nil, nil, nil, nil, nil, 484, nil, nil, 484, + 484, 484, 484, 484, 484, 484, 484, nil, 484, 484, + 484, nil, 484, 484, nil, 484, 484, 484, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 484, nil, nil, + 484, nil, nil, 484, 484, nil, nil, 484, nil, nil, + nil, nil, nil, 484, nil, nil, nil, nil, nil, nil, + nil, 484, nil, nil, nil, nil, 484, 484, 484, 484, + 484, 484, nil, nil, nil, 484, 484, nil, nil, nil, + nil, nil, nil, 484, nil, 510, 484, 484, 484, nil, + 484, 484, 510, 510, 510, nil, nil, 510, 510, 510, + nil, 510, nil, nil, nil, nil, nil, nil, nil, nil, + 510, 510, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 510, 510, nil, 510, 510, 510, 510, 510, nil, + nil, nil, nil, nil, nil, nil, 277, 277, nil, nil, + 277, nil, nil, nil, nil, nil, nil, nil, nil, 277, + 277, nil, 277, 277, 277, 277, 277, 277, 277, nil, + nil, 277, 277, 510, nil, nil, 277, 277, 277, 277, + 510, nil, nil, nil, nil, 510, 510, nil, nil, nil, + nil, nil, nil, 277, 277, nil, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 510, 510, 277, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 510, nil, 522, 522, 522, 510, 522, nil, 277, + nil, 522, 522, 510, nil, nil, 522, nil, 522, 522, + 522, 522, 522, 522, 522, nil, nil, nil, nil, nil, + 522, 522, 522, 522, 522, 522, 522, nil, nil, 522, + nil, nil, nil, nil, nil, nil, 522, nil, nil, 522, + 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, + 522, nil, 522, 522, nil, 522, 522, 522, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 522, nil, nil, + 522, nil, nil, 522, 522, nil, nil, 522, nil, 522, + nil, 522, nil, 522, nil, nil, nil, nil, nil, nil, + nil, 522, nil, nil, nil, nil, 522, 522, 522, 522, + 522, 522, nil, nil, nil, 522, 522, nil, nil, nil, + nil, nil, nil, 522, nil, 522, 522, 522, 522, nil, + 522, 522, 525, 525, 525, nil, 525, nil, nil, nil, + 525, 525, nil, nil, nil, 525, nil, 525, 525, 525, + 525, 525, 525, 525, nil, nil, nil, nil, nil, 525, + 525, 525, 525, 525, 525, 525, nil, nil, 525, nil, + nil, nil, nil, nil, nil, 525, nil, nil, 525, 525, + 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, + nil, 525, 525, nil, 525, 525, 525, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 525, nil, nil, 525, + nil, nil, 525, 525, nil, nil, 525, nil, nil, nil, + 525, nil, 525, nil, nil, nil, nil, nil, nil, nil, + 525, nil, nil, nil, nil, 525, 525, 525, 525, 525, + 525, nil, nil, nil, 525, 525, nil, nil, nil, nil, + nil, nil, 525, nil, 525, 525, 525, 525, nil, 525, + 525, 527, 527, 527, nil, 527, nil, nil, nil, 527, + 527, nil, nil, nil, 527, nil, 527, 527, 527, 527, + 527, 527, 527, nil, nil, nil, nil, nil, 527, 527, + 527, 527, 527, 527, 527, nil, nil, 527, nil, nil, + nil, nil, nil, nil, 527, nil, nil, 527, 527, 527, + 527, 527, 527, 527, 527, nil, 527, 527, 527, nil, + 527, 527, nil, 527, 527, 527, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 527, nil, nil, 527, nil, + nil, 527, 527, nil, nil, 527, nil, nil, nil, nil, + nil, 527, nil, nil, nil, nil, nil, nil, nil, 527, + nil, nil, nil, nil, 527, 527, 527, 527, 527, 527, + nil, nil, nil, 527, 527, nil, nil, nil, nil, nil, + nil, 527, nil, nil, 527, 527, 527, nil, 527, 527, + 533, 533, 533, 533, 533, nil, nil, nil, 533, 533, + nil, nil, nil, 533, nil, 533, 533, 533, 533, 533, + 533, 533, nil, nil, nil, nil, nil, 533, 533, 533, + 533, 533, 533, 533, nil, nil, 533, nil, nil, nil, + nil, nil, 533, 533, 533, 533, 533, 533, 533, 533, + 533, 533, 533, 533, nil, 533, 533, 533, nil, 533, + 533, nil, 533, 533, 533, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 533, nil, nil, 533, nil, nil, + 533, 533, nil, nil, 533, nil, 533, nil, nil, nil, + 533, nil, nil, nil, nil, nil, nil, nil, 533, nil, + nil, nil, nil, 533, 533, 533, 533, 533, 533, nil, + nil, nil, 533, 533, nil, nil, nil, nil, nil, 533, + 533, nil, nil, 533, 533, 533, nil, 533, 533, 541, + 541, 541, nil, 541, nil, nil, nil, 541, 541, nil, + nil, nil, 541, nil, 541, 541, 541, 541, 541, 541, + 541, nil, nil, nil, nil, nil, 541, 541, 541, 541, + 541, 541, 541, nil, nil, 541, nil, nil, nil, nil, + nil, nil, 541, nil, nil, 541, 541, 541, 541, 541, + 541, 541, 541, nil, 541, 541, 541, nil, 541, 541, + nil, nil, nil, 541, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 541, nil, nil, 541, nil, nil, 541, + 541, nil, nil, 541, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 541, 541, 541, 541, 541, 541, nil, nil, + nil, 541, 541, nil, nil, nil, nil, nil, nil, 541, + nil, nil, 541, 541, 541, nil, 541, 541, 543, 543, + 543, nil, 543, nil, nil, nil, 543, 543, nil, nil, + nil, 543, nil, 543, 543, 543, 543, 543, 543, 543, + nil, nil, nil, nil, nil, 543, 543, 543, 543, 543, + 543, 543, nil, nil, 543, nil, nil, nil, nil, nil, + nil, 543, nil, nil, 543, 543, 543, 543, 543, 543, + 543, 543, 543, 543, 543, 543, nil, 543, 543, nil, + 543, 543, 543, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 543, nil, nil, 543, nil, nil, 543, 543, + nil, nil, 543, nil, 543, nil, 543, nil, 543, nil, + nil, nil, nil, nil, nil, nil, 543, nil, nil, nil, + nil, 543, 543, 543, 543, 543, 543, nil, nil, nil, + 543, 543, nil, nil, nil, nil, nil, nil, 543, nil, + 543, 543, 543, 543, nil, 543, 543, 549, 549, 549, + nil, 549, nil, nil, nil, 549, 549, nil, nil, nil, + 549, nil, 549, 549, 549, 549, 549, 549, 549, nil, + nil, nil, nil, nil, 549, 549, 549, 549, 549, 549, + 549, nil, nil, 549, nil, nil, nil, nil, nil, nil, + 549, nil, nil, 549, 549, 549, 549, 549, 549, 549, + 549, nil, 549, 549, 549, nil, 549, 549, nil, nil, + nil, 549, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 549, nil, nil, 549, nil, nil, 549, 549, nil, + nil, 549, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 549, 549, 549, 549, 549, 549, nil, nil, nil, 549, + 549, nil, nil, nil, nil, nil, nil, 549, nil, nil, + 549, 549, 549, nil, 549, 549, 552, 552, 552, nil, + 552, nil, nil, nil, 552, 552, nil, nil, nil, 552, + nil, 552, 552, 552, 552, 552, 552, 552, nil, nil, + nil, nil, nil, 552, 552, 552, 552, 552, 552, 552, + nil, nil, 552, nil, nil, nil, nil, nil, nil, 552, + nil, nil, 552, 552, 552, 552, 552, 552, 552, 552, + nil, 552, 552, 552, nil, 552, 552, nil, 552, 552, + 552, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 552, nil, nil, 552, nil, nil, 552, 552, nil, nil, + 552, nil, nil, nil, nil, nil, 552, nil, nil, nil, + nil, nil, nil, nil, 552, nil, nil, nil, nil, 552, + 552, 552, 552, 552, 552, nil, nil, nil, 552, 552, + nil, nil, nil, nil, nil, nil, 552, nil, nil, 552, + 552, 552, nil, 552, 552, 553, 553, 553, nil, 553, + nil, nil, nil, 553, 553, nil, nil, nil, 553, nil, + 553, 553, 553, 553, 553, 553, 553, nil, nil, nil, + nil, nil, 553, 553, 553, 553, 553, 553, 553, nil, + nil, 553, nil, nil, nil, nil, nil, nil, 553, nil, + nil, 553, 553, 553, 553, 553, 553, 553, 553, nil, + 553, 553, 553, nil, 553, 553, nil, 553, 553, 553, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 553, + nil, nil, 553, nil, nil, 553, 553, nil, nil, 553, + nil, nil, nil, nil, nil, 553, nil, nil, nil, nil, + nil, nil, nil, 553, nil, nil, nil, nil, 553, 553, + 553, 553, 553, 553, nil, nil, nil, 553, 553, nil, + nil, nil, nil, nil, nil, 553, nil, nil, 553, 553, + 553, nil, 553, 553, 558, 558, 558, nil, 558, nil, + nil, nil, 558, 558, nil, nil, nil, 558, nil, 558, + 558, 558, 558, 558, 558, 558, nil, nil, nil, nil, + nil, 558, 558, 558, 558, 558, 558, 558, nil, nil, + 558, nil, nil, nil, nil, nil, nil, 558, nil, nil, + 558, 558, 558, 558, 558, 558, 558, 558, nil, 558, + 558, 558, nil, 558, 558, nil, 558, 558, 558, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 558, nil, + nil, 558, nil, nil, 558, 558, nil, nil, 558, nil, + nil, nil, nil, nil, 558, nil, nil, nil, nil, nil, + nil, nil, 558, nil, nil, nil, nil, 558, 558, 558, + 558, 558, 558, nil, nil, nil, 558, 558, nil, nil, + nil, nil, nil, nil, 558, nil, nil, 558, 558, 558, + nil, 558, 558, 582, 582, 582, nil, 582, nil, nil, + nil, 582, 582, nil, nil, nil, 582, nil, 582, 582, + 582, 582, 582, 582, 582, nil, nil, nil, nil, nil, + 582, 582, 582, 582, 582, 582, 582, nil, nil, 582, + nil, nil, nil, nil, nil, nil, 582, nil, nil, 582, + 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, + 582, nil, 582, 582, nil, 582, 582, 582, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 582, nil, nil, + 582, nil, nil, 582, 582, nil, nil, 582, nil, 582, + nil, 582, nil, 582, nil, nil, nil, nil, nil, nil, + nil, 582, nil, nil, nil, nil, 582, 582, 582, 582, + 582, 582, nil, nil, nil, 582, 582, nil, nil, nil, + nil, nil, nil, 582, nil, 582, 582, 582, 582, nil, + 582, 582, 592, 592, 592, nil, 592, nil, nil, nil, + 592, 592, nil, nil, nil, 592, nil, 592, 592, 592, + 592, 592, 592, 592, nil, nil, nil, nil, nil, 592, + 592, 592, 592, 592, 592, 592, nil, nil, 592, nil, + nil, nil, nil, nil, nil, 592, nil, nil, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, + nil, 592, 592, nil, 592, 592, 592, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 592, nil, nil, 592, + nil, nil, 592, 592, nil, nil, 592, nil, 592, nil, + 592, nil, 592, nil, nil, nil, nil, nil, nil, nil, + 592, nil, nil, nil, nil, 592, 592, 592, 592, 592, + 592, nil, nil, nil, 592, 592, nil, nil, nil, nil, + nil, nil, 592, nil, 592, 592, 592, 592, nil, 592, + 592, 602, 602, 602, nil, 602, nil, nil, nil, 602, + 602, nil, nil, nil, 602, nil, 602, 602, 602, 602, + 602, 602, 602, nil, nil, nil, nil, nil, 602, 602, + 602, 602, 602, 602, 602, nil, nil, 602, nil, nil, + nil, nil, nil, nil, 602, nil, nil, 602, 602, 602, + 602, 602, 602, 602, 602, nil, 602, 602, 602, nil, + 602, 602, nil, 602, 602, 602, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 602, nil, nil, 602, nil, + nil, 602, 602, nil, nil, 602, nil, nil, nil, nil, + nil, 602, nil, nil, nil, nil, nil, nil, nil, 602, + nil, nil, nil, nil, 602, 602, 602, 602, 602, 602, + nil, nil, nil, 602, 602, nil, nil, nil, nil, nil, + nil, 602, nil, nil, 602, 602, 602, nil, 602, 602, + 624, 624, 624, nil, 624, nil, nil, nil, 624, 624, + nil, nil, nil, 624, nil, 624, 624, 624, 624, 624, + 624, 624, nil, nil, nil, nil, nil, 624, 624, 624, + 624, 624, 624, 624, nil, nil, 624, nil, nil, nil, + nil, nil, nil, 624, nil, nil, 624, 624, 624, 624, + 624, 624, 624, 624, nil, 624, 624, 624, nil, 624, + 624, nil, 624, 624, 624, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 624, nil, nil, 624, nil, nil, + 624, 624, nil, nil, 624, nil, nil, nil, nil, nil, + 624, nil, nil, nil, nil, nil, nil, nil, 624, nil, + nil, nil, nil, 624, 624, 624, 624, 624, 624, nil, + nil, nil, 624, 624, nil, nil, nil, nil, nil, nil, + 624, nil, nil, 624, 624, 624, nil, 624, 624, 664, + 664, 664, nil, 664, nil, nil, nil, 664, 664, nil, + nil, nil, 664, nil, 664, 664, 664, 664, 664, 664, + 664, nil, nil, nil, nil, nil, 664, 664, 664, 664, + 664, 664, 664, nil, nil, 664, nil, nil, nil, nil, + nil, nil, 664, nil, nil, 664, 664, 664, 664, 664, + 664, 664, 664, nil, 664, 664, 664, nil, 664, 664, + nil, 664, 664, 664, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 664, nil, nil, 664, nil, nil, 664, + 664, nil, nil, 664, nil, 664, nil, nil, nil, 664, + nil, nil, nil, nil, nil, nil, nil, 664, nil, nil, + nil, nil, 664, 664, 664, 664, 664, 664, nil, nil, + nil, 664, 664, nil, nil, nil, nil, nil, nil, 664, + nil, nil, 664, 664, 664, nil, 664, 664, 665, 665, + 665, nil, 665, nil, nil, nil, 665, 665, nil, nil, + nil, 665, nil, 665, 665, 665, 665, 665, 665, 665, + nil, nil, nil, nil, nil, 665, 665, 665, 665, 665, + 665, 665, nil, nil, 665, nil, nil, nil, nil, nil, + nil, 665, nil, nil, 665, 665, 665, 665, 665, 665, + 665, 665, nil, 665, 665, 665, nil, 665, 665, nil, + 665, 665, 665, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 665, nil, nil, 665, nil, nil, 665, 665, + nil, nil, 665, nil, nil, nil, nil, nil, 665, nil, + nil, nil, nil, nil, nil, nil, 665, nil, nil, nil, + nil, 665, 665, 665, 665, 665, 665, nil, nil, nil, + 665, 665, nil, nil, nil, nil, nil, nil, 665, nil, + nil, 665, 665, 665, nil, 665, 665, 666, 666, 666, + nil, 666, nil, nil, nil, 666, 666, nil, nil, nil, + 666, nil, 666, 666, 666, 666, 666, 666, 666, nil, + nil, nil, nil, nil, 666, 666, 666, 666, 666, 666, + 666, nil, nil, 666, nil, nil, nil, nil, nil, nil, + 666, nil, nil, 666, 666, 666, 666, 666, 666, 666, + 666, 666, 666, 666, 666, nil, 666, 666, nil, 666, + 666, 666, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 666, nil, nil, 666, nil, nil, 666, 666, nil, + nil, 666, nil, 666, nil, 666, nil, 666, nil, nil, + nil, nil, nil, nil, nil, 666, nil, nil, nil, nil, + 666, 666, 666, 666, 666, 666, nil, nil, nil, 666, + 666, nil, nil, nil, nil, nil, nil, 666, nil, 666, + 666, 666, 666, nil, 666, 666, 669, 669, 669, nil, + 669, nil, nil, nil, 669, 669, nil, nil, nil, 669, + nil, 669, 669, 669, 669, 669, 669, 669, nil, nil, + nil, nil, nil, 669, 669, 669, 669, 669, 669, 669, + nil, nil, 669, nil, nil, nil, nil, nil, nil, 669, + nil, nil, 669, 669, 669, 669, 669, 669, 669, 669, + nil, 669, 669, 669, nil, 669, 669, nil, 669, 669, + 669, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 669, nil, nil, 669, nil, nil, 669, 669, nil, nil, + 669, nil, nil, nil, nil, nil, 669, nil, nil, nil, + nil, nil, nil, nil, 669, nil, nil, nil, nil, 669, + 669, 669, 669, 669, 669, nil, nil, nil, 669, 669, + nil, nil, nil, nil, nil, nil, 669, nil, nil, 669, + 669, 669, nil, 669, 669, 672, 672, 672, nil, 672, + nil, nil, nil, 672, 672, nil, nil, nil, 672, nil, + 672, 672, 672, 672, 672, 672, 672, nil, nil, nil, + nil, nil, 672, 672, 672, 672, 672, 672, 672, nil, + nil, 672, nil, nil, nil, nil, nil, nil, 672, nil, + nil, 672, 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, nil, 672, 672, nil, 672, 672, 672, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 672, + nil, nil, 672, nil, nil, 672, 672, nil, nil, 672, + nil, 672, nil, 672, nil, 672, nil, nil, nil, nil, + nil, nil, nil, 672, nil, nil, nil, nil, 672, 672, + 672, 672, 672, 672, nil, nil, nil, 672, 672, nil, + nil, nil, nil, nil, nil, 672, nil, 672, 672, 672, + 672, nil, 672, 672, 673, 673, 673, nil, 673, nil, + nil, nil, 673, 673, nil, nil, nil, 673, nil, 673, + 673, 673, 673, 673, 673, 673, nil, nil, nil, nil, + nil, 673, 673, 673, 673, 673, 673, 673, nil, nil, + 673, nil, nil, nil, nil, nil, nil, 673, nil, nil, + 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, + 673, 673, nil, 673, 673, nil, 673, 673, 673, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 673, nil, + nil, 673, nil, nil, 673, 673, nil, nil, 673, nil, + nil, nil, 673, nil, 673, nil, nil, nil, nil, nil, + nil, nil, 673, nil, nil, nil, nil, 673, 673, 673, + 673, 673, 673, nil, nil, nil, 673, 673, nil, nil, + nil, nil, nil, nil, 673, nil, 673, 673, 673, 673, + nil, 673, 673, 674, 674, 674, nil, 674, nil, nil, + nil, 674, 674, nil, nil, nil, 674, nil, 674, 674, + 674, 674, 674, 674, 674, nil, nil, nil, nil, nil, + 674, 674, 674, 674, 674, 674, 674, nil, nil, 674, + nil, nil, nil, nil, nil, nil, 674, nil, nil, 674, + 674, 674, 674, 674, 674, 674, 674, nil, 674, 674, + 674, nil, 674, 674, nil, 674, 674, 674, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 674, nil, nil, + 674, nil, nil, 674, 674, nil, nil, 674, nil, nil, + nil, nil, nil, 674, nil, nil, nil, nil, nil, nil, + nil, 674, nil, nil, nil, nil, 674, 674, 674, 674, + 674, 674, nil, nil, nil, 674, 674, nil, nil, nil, + nil, nil, nil, 674, nil, nil, 674, 674, 674, nil, + 674, 674, 675, 675, 675, nil, 675, nil, nil, nil, + 675, 675, nil, nil, nil, 675, nil, 675, 675, 675, + 675, 675, 675, 675, nil, nil, nil, nil, nil, 675, + 675, 675, 675, 675, 675, 675, nil, nil, 675, nil, + nil, nil, nil, nil, nil, 675, nil, nil, 675, 675, + 675, 675, 675, 675, 675, 675, nil, 675, 675, 675, + nil, 675, 675, nil, 675, 675, 675, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 675, nil, nil, 675, + nil, nil, 675, 675, nil, nil, 675, nil, nil, nil, + nil, nil, 675, nil, nil, nil, nil, nil, nil, nil, + 675, nil, nil, nil, nil, 675, 675, 675, 675, 675, + 675, nil, nil, nil, 675, 675, nil, nil, nil, nil, + nil, nil, 675, nil, nil, 675, 675, 675, nil, 675, + 675, 680, 680, 680, nil, 680, nil, nil, nil, 680, + 680, nil, nil, nil, 680, nil, 680, 680, 680, 680, + 680, 680, 680, nil, nil, nil, nil, nil, 680, 680, + 680, 680, 680, 680, 680, nil, nil, 680, nil, nil, + nil, nil, nil, nil, 680, nil, nil, 680, 680, 680, + 680, 680, 680, 680, 680, nil, 680, 680, 680, nil, + 680, 680, nil, 680, 680, 680, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 680, nil, nil, 680, nil, + nil, 680, 680, nil, nil, 680, nil, nil, nil, nil, + nil, 680, nil, nil, nil, nil, nil, nil, nil, 680, + nil, nil, nil, nil, 680, 680, 680, 680, 680, 680, + nil, nil, nil, 680, 680, nil, nil, nil, nil, nil, + nil, 680, nil, nil, 680, 680, 680, nil, 680, 680, + 681, 681, 681, nil, 681, nil, nil, nil, 681, 681, + nil, nil, nil, 681, nil, 681, 681, 681, 681, 681, + 681, 681, nil, nil, nil, nil, nil, 681, 681, 681, + 681, 681, 681, 681, nil, nil, 681, nil, nil, nil, + nil, nil, nil, 681, nil, nil, 681, 681, 681, 681, + 681, 681, 681, 681, nil, 681, 681, 681, nil, 681, + 681, nil, 681, 681, 681, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 681, nil, nil, 681, nil, nil, + 681, 681, nil, nil, 681, nil, nil, nil, nil, nil, + 681, nil, nil, nil, nil, nil, nil, nil, 681, nil, + nil, nil, nil, 681, 681, 681, 681, 681, 681, nil, + nil, nil, 681, 681, nil, nil, nil, nil, nil, nil, + 681, nil, nil, 681, 681, 681, nil, 681, 681, 705, + 705, 705, nil, 705, nil, nil, nil, 705, 705, nil, + nil, nil, 705, nil, 705, 705, 705, 705, 705, 705, + 705, nil, nil, nil, nil, nil, 705, 705, 705, 705, + 705, 705, 705, nil, nil, 705, nil, nil, nil, nil, + nil, nil, 705, nil, nil, 705, 705, 705, 705, 705, + 705, 705, 705, nil, 705, 705, 705, nil, 705, 705, + nil, 705, 705, 705, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 705, nil, nil, 705, nil, nil, 705, + 705, nil, nil, 705, nil, nil, nil, nil, nil, 705, + nil, nil, nil, nil, nil, nil, nil, 705, nil, nil, + nil, nil, 705, 705, 705, 705, 705, 705, nil, nil, + nil, 705, 705, nil, nil, nil, nil, nil, nil, 705, + nil, nil, 705, 705, 705, nil, 705, 705, 708, 708, + 708, nil, 708, nil, nil, nil, 708, 708, nil, nil, + nil, 708, nil, 708, 708, 708, 708, 708, 708, 708, + nil, nil, nil, nil, nil, 708, 708, 708, 708, 708, + 708, 708, nil, nil, 708, nil, nil, nil, nil, nil, + nil, 708, nil, nil, 708, 708, 708, 708, 708, 708, + 708, 708, nil, 708, 708, 708, nil, 708, 708, nil, + 708, 708, 708, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 708, nil, nil, 708, nil, nil, 708, 708, + nil, nil, 708, nil, nil, nil, nil, nil, 708, nil, + nil, nil, nil, nil, nil, nil, 708, nil, nil, nil, + nil, 708, 708, 708, 708, 708, 708, nil, nil, nil, + 708, 708, nil, nil, nil, nil, nil, nil, 708, nil, + nil, 708, 708, 708, nil, 708, 708, 712, 712, 712, + nil, 712, nil, nil, nil, 712, 712, nil, nil, nil, + 712, nil, 712, 712, 712, 712, 712, 712, 712, nil, + nil, nil, nil, nil, 712, 712, 712, 712, 712, 712, + 712, nil, nil, 712, nil, nil, nil, nil, nil, nil, + 712, nil, nil, 712, 712, 712, 712, 712, 712, 712, + 712, nil, 712, 712, 712, nil, 712, 712, nil, nil, + nil, 712, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 712, nil, nil, 712, nil, nil, 712, 712, nil, + nil, 712, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 712, 712, 712, 712, 712, 712, nil, nil, nil, 712, + 712, nil, nil, nil, nil, nil, nil, 712, nil, nil, + 712, 712, 712, nil, 712, 712, 723, 723, 723, nil, + 723, nil, nil, nil, 723, 723, nil, nil, nil, 723, + nil, 723, 723, 723, 723, 723, 723, 723, nil, nil, + nil, nil, nil, 723, 723, 723, 723, 723, 723, 723, + nil, nil, 723, nil, nil, nil, nil, nil, nil, 723, + nil, nil, 723, 723, 723, 723, 723, 723, 723, 723, + nil, 723, 723, 723, nil, 723, 723, nil, nil, nil, + 723, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 723, nil, nil, 723, nil, nil, 723, 723, nil, nil, + 723, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 723, + 723, 723, 723, 723, 723, nil, nil, nil, 723, 723, + nil, nil, nil, nil, nil, nil, 723, nil, nil, 723, + 723, 723, nil, 723, 723, 729, 729, 729, nil, 729, + nil, nil, nil, 729, 729, nil, nil, nil, 729, nil, + 729, 729, 729, 729, 729, 729, 729, nil, nil, nil, + nil, nil, 729, 729, 729, 729, 729, 729, 729, nil, + nil, 729, nil, nil, nil, nil, nil, nil, 729, nil, + nil, 729, 729, 729, 729, 729, 729, 729, 729, nil, + 729, 729, 729, nil, 729, 729, nil, 729, 729, 729, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 729, + nil, nil, 729, nil, nil, 729, 729, nil, nil, 729, + nil, 729, nil, nil, nil, 729, nil, nil, nil, nil, + nil, nil, nil, 729, nil, nil, nil, nil, 729, 729, + 729, 729, 729, 729, nil, nil, nil, 729, 729, nil, + nil, nil, nil, nil, nil, 729, nil, nil, 729, 729, + 729, nil, 729, 729, 734, 734, 734, nil, 734, nil, + nil, nil, 734, 734, nil, nil, nil, 734, nil, 734, + 734, 734, 734, 734, 734, 734, nil, nil, nil, nil, + nil, 734, 734, 734, 734, 734, 734, 734, nil, nil, + 734, nil, nil, nil, nil, nil, nil, 734, nil, nil, + 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, + 734, 734, nil, 734, 734, nil, 734, 734, 734, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 734, nil, + nil, 734, nil, nil, 734, 734, nil, nil, 734, nil, + 734, nil, nil, nil, 734, nil, nil, nil, nil, nil, + nil, nil, 734, nil, nil, nil, nil, 734, 734, 734, + 734, 734, 734, nil, nil, nil, 734, 734, nil, nil, + nil, nil, nil, nil, 734, nil, 734, 734, 734, 734, + nil, 734, 734, 737, 737, 737, nil, 737, nil, nil, + nil, 737, 737, nil, nil, nil, 737, nil, 737, 737, + 737, 737, 737, 737, 737, nil, nil, nil, nil, nil, + 737, 737, 737, 737, 737, 737, 737, nil, nil, 737, + nil, nil, nil, nil, nil, nil, 737, nil, nil, 737, + 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, + 737, nil, 737, 737, nil, 737, 737, 737, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 737, nil, nil, + 737, nil, nil, 737, 737, nil, nil, 737, nil, nil, + nil, nil, nil, 737, nil, nil, nil, nil, nil, nil, + nil, 737, nil, nil, nil, nil, 737, 737, 737, 737, + 737, 737, nil, nil, nil, 737, 737, nil, nil, nil, + nil, nil, nil, 737, nil, 737, 737, 737, 737, nil, + 737, 737, 751, 751, 751, nil, 751, nil, nil, nil, + 751, 751, nil, nil, nil, 751, nil, 751, 751, 751, + 751, 751, 751, 751, nil, nil, nil, nil, nil, 751, + 751, 751, 751, 751, 751, 751, nil, nil, 751, nil, + nil, nil, nil, nil, nil, 751, nil, nil, 751, 751, + 751, 751, 751, 751, 751, 751, nil, 751, 751, 751, + nil, 751, 751, nil, 751, 751, 751, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 751, nil, nil, 751, + nil, nil, 751, 751, nil, nil, 751, nil, 751, nil, + nil, nil, 751, nil, nil, nil, nil, nil, nil, nil, + 751, nil, nil, nil, nil, 751, 751, 751, 751, 751, + 751, nil, nil, nil, 751, 751, nil, nil, nil, nil, + nil, nil, 751, nil, nil, 751, 751, 751, nil, 751, + 751, 763, 763, 763, nil, 763, nil, nil, nil, 763, + 763, nil, nil, nil, 763, nil, 763, 763, 763, 763, + 763, 763, 763, nil, nil, nil, nil, nil, 763, 763, + 763, 763, 763, 763, 763, nil, nil, 763, nil, nil, + nil, nil, nil, nil, 763, nil, nil, 763, 763, 763, + 763, 763, 763, 763, 763, nil, 763, 763, 763, nil, + 763, 763, nil, 763, 763, 763, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 763, nil, nil, 763, nil, + nil, 763, 763, nil, nil, 763, nil, nil, nil, nil, + nil, 763, nil, nil, nil, nil, nil, nil, nil, 763, + nil, nil, nil, nil, 763, 763, 763, 763, 763, 763, + nil, nil, nil, 763, 763, nil, nil, nil, nil, nil, + nil, 763, nil, nil, 763, 763, 763, nil, 763, 763, + 783, 783, 783, nil, 783, nil, nil, nil, 783, 783, + nil, nil, nil, 783, nil, 783, 783, 783, 783, 783, + 783, 783, nil, nil, nil, nil, nil, 783, 783, 783, + 783, 783, 783, 783, nil, nil, 783, nil, nil, nil, + nil, nil, nil, 783, nil, nil, 783, 783, 783, 783, + 783, 783, 783, 783, nil, 783, 783, 783, nil, 783, + 783, nil, 783, 783, 783, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 783, nil, nil, 783, nil, nil, + 783, 783, nil, nil, 783, nil, nil, nil, nil, nil, + 783, nil, nil, nil, nil, nil, nil, nil, 783, nil, + nil, nil, nil, 783, 783, 783, 783, 783, 783, nil, + nil, nil, 783, 783, nil, nil, nil, nil, nil, nil, + 783, nil, nil, 783, 783, 783, nil, 783, 783, 805, + 805, 805, nil, 805, nil, nil, nil, 805, 805, nil, + nil, nil, 805, nil, 805, 805, 805, 805, 805, 805, + 805, nil, nil, nil, nil, nil, 805, 805, 805, 805, + 805, 805, 805, nil, nil, 805, nil, nil, nil, nil, + nil, nil, 805, nil, nil, 805, 805, 805, 805, 805, + 805, 805, 805, nil, 805, 805, 805, nil, 805, 805, + nil, 805, 805, 805, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 805, nil, nil, 805, nil, nil, 805, + 805, nil, nil, 805, nil, nil, nil, nil, nil, 805, + nil, nil, nil, nil, nil, nil, nil, 805, nil, nil, + nil, nil, 805, 805, 805, 805, 805, 805, nil, nil, + nil, 805, 805, nil, nil, nil, nil, nil, nil, 805, + nil, nil, 805, 805, 805, nil, 805, 805, 812, 812, + 812, nil, 812, nil, nil, nil, 812, 812, nil, nil, + nil, 812, nil, 812, 812, 812, 812, 812, 812, 812, + nil, nil, nil, nil, nil, 812, 812, 812, 812, 812, + 812, 812, nil, nil, 812, nil, nil, nil, nil, nil, + nil, 812, nil, nil, 812, 812, 812, 812, 812, 812, + 812, 812, nil, 812, 812, 812, nil, 812, 812, nil, + 812, 812, 812, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 812, nil, nil, 812, nil, nil, 812, 812, + nil, nil, 812, nil, nil, nil, nil, nil, 812, nil, + nil, nil, nil, nil, nil, nil, 812, nil, nil, nil, + nil, 812, 812, 812, 812, 812, 812, nil, nil, nil, + 812, 812, nil, nil, nil, nil, nil, nil, 812, nil, + nil, 812, 812, 812, nil, 812, 812, 825, 825, 825, + nil, 825, nil, nil, nil, 825, 825, nil, nil, nil, + 825, nil, 825, 825, 825, 825, 825, 825, 825, nil, + nil, nil, nil, nil, 825, 825, 825, 825, 825, 825, + 825, nil, nil, 825, nil, nil, nil, nil, nil, nil, + 825, nil, nil, 825, 825, 825, 825, 825, 825, 825, + 825, nil, 825, 825, 825, nil, 825, 825, nil, 825, + 825, 825, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 825, nil, nil, 825, nil, nil, 825, 825, nil, + nil, 825, nil, nil, nil, nil, nil, 825, nil, nil, + nil, nil, nil, nil, nil, 825, nil, nil, nil, nil, + 825, 825, 825, 825, 825, 825, nil, nil, nil, 825, + 825, nil, nil, nil, nil, nil, nil, 825, nil, nil, + 825, 825, 825, nil, 825, 825, 826, 826, 826, nil, + 826, nil, nil, nil, 826, 826, nil, nil, nil, 826, + nil, 826, 826, 826, 826, 826, 826, 826, nil, nil, + nil, nil, nil, 826, 826, 826, 826, 826, 826, 826, + nil, nil, 826, nil, nil, nil, nil, nil, nil, 826, + nil, nil, 826, 826, 826, 826, 826, 826, 826, 826, + nil, 826, 826, 826, nil, 826, 826, nil, 826, 826, + 826, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 826, nil, nil, 826, nil, nil, 826, 826, nil, nil, + 826, nil, nil, nil, nil, nil, 826, nil, nil, nil, + nil, nil, nil, nil, 826, nil, nil, nil, nil, 826, + 826, 826, 826, 826, 826, nil, nil, nil, 826, 826, + nil, nil, nil, nil, nil, nil, 826, nil, nil, 826, + 826, 826, nil, 826, 826, 827, 827, 827, nil, 827, + nil, nil, nil, 827, 827, nil, nil, nil, 827, nil, + 827, 827, 827, 827, 827, 827, 827, nil, nil, nil, + nil, nil, 827, 827, 827, 827, 827, 827, 827, nil, + nil, 827, nil, nil, nil, nil, nil, nil, 827, nil, + nil, 827, 827, 827, 827, 827, 827, 827, 827, nil, + 827, 827, 827, nil, 827, 827, nil, 827, 827, 827, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 827, + nil, nil, 827, nil, nil, 827, 827, nil, nil, 827, + nil, nil, nil, nil, nil, 827, nil, nil, nil, nil, + nil, nil, nil, 827, nil, nil, nil, nil, 827, 827, + 827, 827, 827, 827, nil, nil, nil, 827, 827, nil, + nil, nil, nil, nil, nil, 827, nil, nil, 827, 827, + 827, nil, 827, 827, 828, 828, 828, nil, 828, nil, + nil, nil, 828, 828, nil, nil, nil, 828, nil, 828, + 828, 828, 828, 828, 828, 828, nil, nil, nil, nil, + nil, 828, 828, 828, 828, 828, 828, 828, nil, nil, + 828, nil, nil, nil, nil, nil, nil, 828, nil, nil, + 828, 828, 828, 828, 828, 828, 828, 828, nil, 828, + 828, 828, nil, 828, 828, nil, 828, 828, 828, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 828, nil, + nil, 828, nil, nil, 828, 828, nil, nil, 828, nil, + nil, nil, nil, nil, 828, nil, nil, nil, nil, nil, + nil, nil, 828, nil, nil, nil, nil, 828, 828, 828, + 828, 828, 828, nil, nil, nil, 828, 828, nil, nil, + nil, nil, nil, nil, 828, nil, nil, 828, 828, 828, + nil, 828, 828, 830, 830, 830, nil, 830, nil, nil, + nil, 830, 830, nil, nil, nil, 830, nil, 830, 830, + 830, 830, 830, 830, 830, nil, nil, nil, nil, nil, + 830, 830, 830, 830, 830, 830, 830, nil, nil, 830, + nil, nil, nil, nil, nil, nil, 830, nil, nil, 830, + 830, 830, 830, 830, 830, 830, 830, nil, 830, 830, + 830, nil, 830, 830, nil, 830, 830, 830, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 830, nil, nil, + 830, nil, nil, 830, 830, nil, nil, 830, nil, nil, + nil, nil, nil, 830, nil, nil, nil, nil, nil, nil, + nil, 830, nil, nil, nil, nil, 830, 830, 830, 830, + 830, 830, nil, nil, nil, 830, 830, nil, nil, nil, + nil, nil, nil, 830, nil, nil, 830, 830, 830, nil, + 830, 830, 863, 863, 863, nil, 863, nil, nil, nil, + 863, 863, nil, nil, nil, 863, nil, 863, 863, 863, + 863, 863, 863, 863, nil, nil, nil, nil, nil, 863, + 863, 863, 863, 863, 863, 863, nil, nil, 863, nil, + nil, nil, nil, nil, nil, 863, nil, nil, 863, 863, + 863, 863, 863, 863, 863, 863, nil, 863, 863, 863, + nil, 863, 863, nil, 863, 863, 863, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 863, nil, nil, 863, + nil, nil, 863, 863, nil, nil, 863, nil, nil, nil, + nil, nil, 863, nil, nil, nil, nil, nil, nil, nil, + 863, nil, nil, nil, nil, 863, 863, 863, 863, 863, + 863, nil, nil, nil, 863, 863, nil, nil, nil, nil, + nil, nil, 863, nil, nil, 863, 863, 863, nil, 863, + 863, 870, 870, 870, nil, 870, nil, nil, nil, 870, + 870, nil, nil, nil, 870, nil, 870, 870, 870, 870, + 870, 870, 870, nil, nil, nil, nil, nil, 870, 870, + 870, 870, 870, 870, 870, nil, nil, 870, nil, nil, + nil, nil, nil, nil, 870, nil, nil, 870, 870, 870, + 870, 870, 870, 870, 870, nil, 870, 870, 870, nil, + 870, 870, nil, 870, 870, 870, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 870, nil, nil, 870, nil, + nil, 870, 870, nil, nil, 870, nil, nil, nil, nil, + nil, 870, nil, nil, nil, nil, nil, nil, nil, 870, + nil, nil, nil, nil, 870, 870, 870, 870, 870, 870, + nil, nil, nil, 870, 870, nil, nil, nil, nil, nil, + nil, 870, nil, nil, 870, 870, 870, nil, 870, 870, + 918, 918, 918, nil, 918, nil, nil, nil, 918, 918, + nil, nil, nil, 918, nil, 918, 918, 918, 918, 918, + 918, 918, nil, nil, nil, nil, nil, 918, 918, 918, + 918, 918, 918, 918, nil, nil, 918, nil, nil, nil, + nil, nil, nil, 918, nil, nil, 918, 918, 918, 918, + 918, 918, 918, 918, 918, 918, 918, 918, nil, 918, + 918, nil, 918, 918, 918, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 918, nil, nil, 918, nil, nil, + 918, 918, nil, nil, 918, nil, nil, nil, 918, nil, + 918, nil, nil, nil, nil, nil, nil, nil, 918, nil, + nil, nil, nil, 918, 918, 918, 918, 918, 918, nil, + nil, nil, 918, 918, nil, nil, nil, nil, nil, nil, + 918, nil, 918, 918, 918, 918, nil, 918, 918, 919, + 919, 919, nil, 919, nil, nil, nil, 919, 919, nil, + nil, nil, 919, nil, 919, 919, 919, 919, 919, 919, + 919, nil, nil, nil, nil, nil, 919, 919, 919, 919, + 919, 919, 919, nil, nil, 919, nil, nil, nil, nil, + nil, nil, 919, nil, nil, 919, 919, 919, 919, 919, + 919, 919, 919, nil, 919, 919, 919, nil, 919, 919, + nil, 919, 919, 919, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 919, nil, nil, 919, nil, nil, 919, + 919, nil, nil, 919, nil, nil, nil, nil, nil, 919, + nil, nil, nil, nil, nil, nil, nil, 919, nil, nil, + nil, nil, 919, 919, 919, 919, 919, 919, nil, nil, + nil, 919, 919, nil, nil, nil, nil, nil, nil, 919, + nil, nil, 919, 919, 919, nil, 919, 919, 931, 931, + 931, nil, 931, nil, nil, nil, 931, 931, nil, nil, + nil, 931, nil, 931, 931, 931, 931, 931, 931, 931, + nil, nil, nil, nil, nil, 931, 931, 931, 931, 931, + 931, 931, nil, nil, 931, nil, nil, nil, nil, nil, + nil, 931, nil, nil, 931, 931, 931, 931, 931, 931, + 931, 931, nil, 931, 931, 931, nil, 931, 931, nil, + nil, nil, 931, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 931, nil, nil, 931, nil, nil, 931, 931, + nil, nil, 931, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 931, 931, 931, 931, 931, 931, nil, nil, nil, + 931, 931, nil, nil, nil, nil, nil, nil, 931, nil, + nil, 931, 931, 931, nil, 931, 931, 940, 940, 940, + nil, 940, nil, nil, nil, 940, 940, nil, nil, nil, + 940, nil, 940, 940, 940, 940, 940, 940, 940, nil, + nil, nil, nil, nil, 940, 940, 940, 940, 940, 940, + 940, nil, nil, 940, nil, nil, nil, nil, nil, nil, + 940, nil, nil, 940, 940, 940, 940, 940, 940, 940, + 940, nil, 940, 940, 940, nil, 940, 940, nil, nil, + nil, 940, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 940, nil, nil, 940, nil, nil, 940, 940, nil, + nil, 940, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 940, 940, 940, 940, 940, 940, nil, nil, nil, 940, + 940, nil, nil, nil, nil, nil, nil, 940, nil, nil, + 940, 940, 940, nil, 940, 940, 948, 948, 948, nil, + 948, nil, nil, nil, 948, 948, nil, nil, nil, 948, + nil, 948, 948, 948, 948, 948, 948, 948, nil, nil, + nil, nil, nil, 948, 948, 948, 948, 948, 948, 948, + nil, nil, 948, nil, nil, nil, nil, nil, nil, 948, + nil, nil, 948, 948, 948, 948, 948, 948, 948, 948, + nil, 948, 948, 948, nil, 948, 948, nil, 948, 948, + 948, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 948, nil, nil, 948, nil, nil, 948, 948, nil, nil, + 948, nil, 948, nil, nil, nil, 948, nil, nil, nil, + nil, nil, nil, nil, 948, nil, nil, nil, nil, 948, + 948, 948, 948, 948, 948, nil, nil, nil, 948, 948, + nil, nil, nil, nil, nil, nil, 948, nil, nil, 948, + 948, 948, nil, 948, 948, 989, 989, 989, nil, 989, + nil, nil, nil, 989, 989, nil, nil, nil, 989, nil, + 989, 989, 989, 989, 989, 989, 989, nil, nil, nil, + nil, nil, 989, 989, 989, 989, 989, 989, 989, nil, + nil, 989, nil, nil, nil, nil, nil, nil, 989, nil, + nil, 989, 989, 989, 989, 989, 989, 989, 989, nil, + 989, 989, 989, nil, 989, 989, nil, nil, nil, 989, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 989, + nil, nil, 989, nil, nil, 989, 989, nil, nil, 989, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 989, 989, + 989, 989, 989, 989, nil, nil, nil, 989, 989, nil, + nil, nil, nil, nil, nil, 989, nil, nil, 989, 989, + 989, nil, 989, 989, 1003, 1003, 1003, nil, 1003, nil, + nil, nil, 1003, 1003, nil, nil, nil, 1003, nil, 1003, + 1003, 1003, 1003, 1003, 1003, 1003, nil, nil, nil, nil, + nil, 1003, 1003, 1003, 1003, 1003, 1003, 1003, nil, nil, + 1003, nil, nil, nil, nil, nil, nil, 1003, nil, nil, + 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, nil, 1003, + 1003, 1003, nil, 1003, 1003, nil, 1003, 1003, 1003, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1003, nil, + nil, 1003, nil, nil, 1003, 1003, nil, nil, 1003, nil, + nil, nil, nil, nil, 1003, nil, nil, nil, nil, nil, + nil, nil, 1003, nil, nil, nil, nil, 1003, 1003, 1003, + 1003, 1003, 1003, nil, nil, nil, 1003, 1003, nil, nil, + nil, nil, nil, nil, 1003, nil, nil, 1003, 1003, 1003, + nil, 1003, 1003, 1034, 1034, 1034, nil, 1034, nil, nil, + nil, 1034, 1034, nil, nil, nil, 1034, nil, 1034, 1034, + 1034, 1034, 1034, 1034, 1034, nil, nil, nil, nil, nil, + 1034, 1034, 1034, 1034, 1034, 1034, 1034, nil, nil, 1034, + nil, nil, nil, nil, nil, nil, 1034, nil, nil, 1034, + 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, + 1034, nil, 1034, 1034, nil, 1034, 1034, 1034, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1034, nil, nil, + 1034, nil, nil, 1034, 1034, nil, nil, 1034, nil, 1034, + nil, 1034, nil, 1034, nil, nil, nil, nil, nil, nil, + nil, 1034, nil, nil, nil, nil, 1034, 1034, 1034, 1034, + 1034, 1034, nil, nil, nil, 1034, 1034, nil, nil, nil, + nil, nil, nil, 1034, nil, 1034, 1034, 1034, 1034, nil, + 1034, 1034, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, nil, nil, nil, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, nil, + nil, nil, nil, nil, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, nil, 11, nil, nil, nil, nil, + nil, nil, nil, nil, 11, 11, nil, 11, 11, 11, + 11, 11, 11, 11, nil, nil, 11, 11, nil, nil, + nil, 11, 11, 11, 11, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 11, 11, + nil, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, nil, nil, 11, 11, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 11, nil, nil, nil, nil, + nil, nil, nil, nil, 11, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, nil, + nil, nil, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, nil, nil, nil, nil, nil, 12, 12, 12, + 12, 12, 12, 12, 12, 12, nil, nil, 12, nil, + nil, nil, nil, nil, nil, nil, nil, 12, 12, nil, + 12, 12, 12, 12, 12, 12, 12, nil, nil, 12, + 12, nil, nil, nil, 12, 12, 12, 12, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 12, 12, nil, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, nil, nil, 12, 12, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 12, nil, + nil, nil, nil, nil, nil, nil, nil, 12, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, nil, nil, nil, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, nil, nil, nil, nil, nil, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, nil, 75, nil, nil, nil, nil, nil, nil, + 75, 75, nil, 75, 75, 75, 75, 75, 75, 75, + nil, nil, 75, 75, nil, nil, nil, 75, 75, 75, + 75, nil, nil, nil, nil, nil, 75, nil, nil, nil, + nil, nil, nil, nil, 75, 75, nil, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, nil, nil, + 75, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 75, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, nil, nil, nil, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, nil, nil, + nil, nil, nil, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, nil, 105, nil, nil, nil, + nil, nil, nil, 105, 105, nil, 105, 105, 105, 105, + 105, 105, 105, nil, nil, 105, 105, nil, nil, nil, + 105, 105, 105, 105, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 105, nil, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, nil, nil, 105, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 105, 427, 427, 427, 427, 427, 427, + 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, + 427, 427, 427, 427, 427, 427, 427, 427, nil, nil, + nil, 427, 427, 427, 427, 427, 427, 427, 427, 427, + 427, nil, nil, nil, nil, nil, 427, 427, 427, 427, + 427, 427, 427, 427, 427, nil, nil, 427, nil, nil, + nil, nil, nil, nil, nil, nil, 427, 427, nil, 427, + 427, 427, 427, 427, 427, 427, nil, nil, 427, 427, + nil, nil, nil, 427, 427, 427, 427, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 427, 427, nil, 427, 427, 427, 427, 427, 427, 427, + 427, 427, 427, 427, nil, nil, 427, 427, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 427, nil, nil, + nil, nil, nil, nil, nil, nil, 427, 661, 661, 661, + 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, + 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, + 661, nil, nil, nil, 661, 661, 661, 661, 661, 661, + 661, 661, 661, 661, nil, nil, nil, nil, nil, 661, + 661, 661, 661, 661, 661, 661, 661, 661, nil, nil, + 661, nil, nil, nil, nil, nil, nil, nil, nil, 661, + 661, nil, 661, 661, 661, 661, 661, 661, 661, nil, + nil, 661, 661, nil, nil, nil, 661, 661, 661, 661, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 661, 661, nil, 661, 661, 661, 661, + 661, 661, 661, 661, 661, 661, 661, nil, nil, 661, + 661, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 661, nil, nil, nil, nil, nil, nil, nil, nil, 661, + 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, + 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, + 769, 769, 769, 769, nil, nil, nil, 769, 769, 769, + 769, 769, 769, 769, 769, 769, 769, nil, nil, nil, + nil, nil, 769, 769, 769, 769, 769, 769, 769, 769, + 769, nil, nil, 769, nil, nil, nil, nil, nil, nil, + nil, nil, 769, 769, nil, 769, 769, 769, 769, 769, + 769, 769, nil, nil, 769, 769, nil, nil, nil, 769, + 769, 769, 769, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 769, 769, nil, 769, + 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, + nil, nil, 769, nil, nil, nil, nil, 228, 228, nil, + nil, 228, nil, nil, nil, nil, nil, nil, nil, nil, + 228, 228, 769, 228, 228, 228, 228, 228, 228, 228, + nil, nil, 228, 228, nil, nil, nil, 228, 228, 228, + 228, nil, nil, nil, nil, nil, 228, nil, nil, nil, + nil, nil, nil, nil, 228, 228, nil, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, nil, nil, + 228, nil, nil, nil, nil, 229, 229, nil, nil, 229, + nil, nil, nil, nil, nil, nil, nil, nil, 229, 229, + 228, 229, 229, 229, 229, 229, 229, 229, nil, nil, + 229, 229, nil, nil, nil, 229, 229, 229, 229, nil, + nil, nil, nil, nil, 229, nil, nil, nil, nil, nil, + nil, nil, 229, 229, nil, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, nil, nil, 229, nil, + nil, nil, nil, 478, 478, nil, nil, 478, nil, nil, + nil, nil, nil, nil, nil, nil, 478, 478, 229, 478, + 478, 478, 478, 478, 478, 478, nil, nil, 478, 478, + nil, nil, nil, 478, 478, 478, 478, nil, nil, nil, + nil, nil, 478, nil, nil, nil, nil, nil, nil, nil, + 478, 478, nil, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, nil, nil, 478, nil, nil, nil, + nil, 479, 479, nil, nil, 479, nil, nil, nil, nil, + nil, nil, nil, nil, 479, 479, 478, 479, 479, 479, + 479, 479, 479, 479, nil, nil, 479, 479, nil, nil, + nil, 479, 479, 479, 479, nil, nil, nil, nil, nil, + 479, nil, nil, nil, nil, nil, nil, nil, 479, 479, + nil, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, nil, nil, 479, nil, nil, nil, nil, 544, + 544, nil, nil, 544, nil, nil, nil, nil, nil, nil, + nil, nil, 544, 544, 479, 544, 544, 544, 544, 544, + 544, 544, nil, nil, 544, 544, nil, nil, nil, 544, + 544, 544, 544, nil, nil, nil, nil, nil, 544, nil, + nil, nil, nil, nil, nil, nil, 544, 544, nil, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + nil, nil, 544, nil, nil, nil, nil, 545, 545, nil, + nil, 545, nil, nil, nil, nil, nil, nil, nil, nil, + 545, 545, 544, 545, 545, 545, 545, 545, 545, 545, + nil, nil, 545, 545, nil, nil, nil, 545, 545, 545, + 545, nil, nil, nil, nil, nil, 545, nil, nil, nil, + nil, nil, nil, nil, 545, 545, nil, 545, 545, 545, + 545, 545, 545, 545, 545, 545, 545, 545, nil, nil, + 545, nil, nil, nil, nil, 554, 554, nil, nil, 554, + nil, nil, nil, nil, nil, nil, nil, nil, 554, 554, + 545, 554, 554, 554, 554, 554, 554, 554, nil, nil, + 554, 554, nil, nil, nil, 554, 554, 554, 554, nil, + nil, nil, nil, nil, 554, nil, nil, nil, nil, nil, + nil, nil, 554, 554, nil, 554, 554, 554, 554, 554, + 554, 554, 554, 554, 554, 554, nil, nil, 554, nil, + nil, nil, nil, 555, 555, nil, nil, 555, nil, nil, + nil, nil, nil, nil, nil, nil, 555, 555, 554, 555, + 555, 555, 555, 555, 555, 555, nil, nil, 555, 555, + nil, nil, nil, 555, 555, 555, 555, nil, nil, nil, + nil, nil, 555, nil, nil, nil, nil, nil, nil, nil, + 555, 555, nil, 555, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, nil, nil, 555, nil, nil, nil, + nil, 583, 583, nil, nil, 583, nil, nil, nil, nil, + nil, nil, nil, nil, 583, 583, 555, 583, 583, 583, + 583, 583, 583, 583, nil, nil, 583, 583, nil, nil, + nil, 583, 583, 583, 583, nil, nil, nil, nil, nil, + 583, nil, nil, nil, nil, nil, nil, nil, 583, 583, + nil, 583, 583, 583, 583, 583, 583, 583, 583, 583, + 583, 583, nil, nil, 583, nil, nil, nil, nil, 584, + 584, nil, nil, 584, nil, nil, nil, nil, nil, nil, + nil, nil, 584, 584, 583, 584, 584, 584, 584, 584, + 584, 584, nil, nil, 584, 584, nil, nil, nil, 584, + 584, 584, 584, nil, nil, nil, nil, nil, 584, nil, + nil, nil, nil, nil, nil, nil, 584, 584, nil, 584, + 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, + nil, nil, 584, nil, nil, nil, nil, 590, 590, nil, + nil, 590, nil, nil, nil, nil, nil, nil, nil, nil, + 590, 590, 584, 590, 590, 590, 590, 590, 590, 590, + nil, nil, 590, 590, nil, nil, nil, 590, 590, 590, + 590, nil, nil, nil, nil, nil, 590, nil, nil, nil, + nil, nil, nil, nil, 590, 590, nil, 590, 590, 590, + 590, 590, 590, 590, 590, 590, 590, 590, nil, nil, + 590, nil, nil, nil, nil, 591, 591, nil, nil, 591, + nil, nil, nil, nil, nil, nil, nil, nil, 591, 591, + 590, 591, 591, 591, 591, 591, 591, 591, nil, nil, + 591, 591, nil, nil, nil, 591, 591, 591, 591, nil, + nil, nil, nil, nil, 591, nil, nil, nil, nil, nil, + nil, nil, 591, 591, nil, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, nil, nil, 591, nil, + nil, nil, nil, 667, 667, nil, nil, 667, nil, nil, + nil, nil, nil, nil, nil, nil, 667, 667, 591, 667, + 667, 667, 667, 667, 667, 667, nil, nil, 667, 667, + nil, nil, nil, 667, 667, 667, 667, nil, nil, nil, + nil, nil, 667, nil, nil, nil, nil, nil, nil, nil, + 667, 667, nil, 667, 667, 667, 667, 667, 667, 667, + 667, 667, 667, 667, nil, nil, 667, nil, nil, nil, + nil, 668, 668, nil, nil, 668, nil, nil, nil, nil, + nil, nil, nil, nil, 668, 668, 667, 668, 668, 668, + 668, 668, 668, 668, nil, nil, 668, 668, nil, nil, + nil, 668, 668, 668, 668, nil, nil, nil, nil, nil, + 668, nil, nil, nil, nil, nil, nil, nil, 668, 668, + nil, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 668, nil, 963, 668, 963, 963, 963, 963, 963, + 980, nil, 980, 980, 980, 980, 980, nil, nil, 963, + nil, nil, nil, nil, 668, nil, 980, 983, nil, 983, + 983, 983, 983, 983, nil, nil, nil, nil, nil, nil, + nil, 963, nil, 983, nil, nil, nil, nil, 980, nil, + 963, 963, 963, 963, nil, nil, nil, 980, 980, 980, + 980, nil, nil, nil, nil, 983, nil, nil, nil, nil, + nil, nil, nil, nil, 983, 983, 983, 983, nil, nil, + nil, 1030, 1030, nil, nil, 1030, 963, nil, nil, nil, + nil, nil, nil, 980, 1030, 1030, nil, 1030, 1030, 1030, + 1030, 1030, 1030, 1030, nil, nil, 1030, 1030, nil, nil, + 983, 1030, 1030, 1030, 1030, nil, nil, nil, nil, nil, + 1030, nil, nil, nil, nil, nil, nil, nil, 1030, 1030, + nil, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, + 1030, 1030, nil, nil, 1030, nil, nil, nil, nil, 1035, + 1035, nil, nil, 1035, nil, nil, nil, nil, nil, nil, + nil, nil, 1035, 1035, 1030, 1035, 1035, 1035, 1035, 1035, + 1035, 1035, nil, nil, 1035, 1035, nil, nil, nil, 1035, + 1035, 1035, 1035, nil, nil, nil, nil, nil, 1035, nil, + nil, nil, nil, nil, nil, nil, 1035, 1035, nil, 1035, + 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, + nil, nil, 1035, nil, nil, nil, nil, 1036, 1036, nil, + nil, 1036, nil, nil, nil, nil, nil, nil, nil, nil, + 1036, 1036, 1035, 1036, 1036, 1036, 1036, 1036, 1036, 1036, + nil, nil, 1036, 1036, nil, nil, nil, 1036, 1036, 1036, + 1036, nil, nil, nil, nil, nil, 1036, nil, nil, nil, + nil, nil, nil, nil, 1036, 1036, nil, 1036, 1036, 1036, + 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, nil, 1054, + 1036, 1054, 1054, 1054, 1054, 1054, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1054, nil, nil, nil, nil, + 1036, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1054, nil, nil, + nil, nil, nil, nil, nil, nil, 1054, 1054, 1054, 1054, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1054 ] + +racc_action_pointer = [ + nil, 10, 1043, 55, nil, -93, nil, nil, 5102, 602, + nil, 23660, 23793, -47, nil, -47, 91, -2, 166, 204, + -43, nil, -73, 5241, 1323, 270, nil, 107, nil, 157, + 5375, 5503, 5633, 5772, 5911, nil, 1183, 6050, 6189, nil, + 179, 159, 309, 270, 116, 6328, 6467, 442, 6606, 240, + 431, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 6740, nil, 6877, nil, nil, -19, nil, 7016, 7155, nil, + nil, 7294, 7433, 7572, 7711, 23926, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -94, nil, nil, nil, nil, nil, nil, 258, + 280, 284, 307, nil, nil, 24059, nil, nil, nil, nil, + nil, nil, 0, nil, nil, 132, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 7850, nil, + nil, nil, nil, 7989, 8128, 8267, 8406, 8545, 346, nil, + 1, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 344, + nil, 1323, 8684, 8823, 8962, 9101, 9240, 9379, 24526, 24594, + nil, 9518, 9657, 9796, nil, nil, 528, 101, 243, 434, + 272, 365, 435, nil, 9935, 1463, 441, 10074, 10213, 10352, + 10491, 10630, 10769, 10908, 11047, 11186, 11325, 11464, 11603, 11742, + 11881, 12020, 12159, 12298, 12437, 12576, 12715, 12854, 12993, nil, + nil, nil, nil, 13132, nil, nil, nil, 16445, nil, nil, + 442, 13271, 13410, nil, nil, nil, nil, nil, nil, nil, + nil, 13549, nil, 1463, nil, 412, 414, nil, 13688, 481, + 13827, nil, nil, 13966, 14105, nil, nil, 165, nil, nil, + 14244, 734, nil, 441, 1603, 475, 519, 483, 14383, 1743, + 577, 592, 660, 561, 744, nil, 530, 504, 162, nil, + nil, nil, 545, 128, 527, 14522, nil, 349, 600, 754, + nil, 602, 14661, nil, 14800, 1883, 1028, 559, 14939, 15078, + nil, 158, -11, -10, 15217, 2023, 2163, 197, 671, 559, + 5, 7, 756, 642, 22, 677, nil, nil, 172, 205, + 305, nil, 787, nil, 597, 15356, nil, nil, nil, 113, + 143, 147, 241, 409, 432, 473, 487, 500, nil, 501, + nil, nil, 583, nil, 191, nil, 290, nil, 359, nil, + 593, 304, nil, 595, 318, nil, 610, -57, nil, 619, + -41, nil, 321, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 24192, nil, nil, + nil, nil, 631, nil, nil, 619, 15495, 623, nil, nil, + 619, nil, 788, 287, nil, nil, nil, 1043, nil, nil, + nil, nil, nil, 1183, 638, nil, nil, 638, 657, 359, + 395, 6877, nil, nil, nil, 264, 392, 697, nil, nil, + 15629, 15761, nil, nil, nil, -16, nil, 697, 24662, 24730, + 15894, 310, 16033, 16172, 16311, 2163, 2303, -42, 212, 722, + 727, 729, 740, 3703, 3843, 3447, 862, 2443, 2583, 2723, + 2863, 3003, 477, 609, 3143, 3283, 1603, 3423, 802, nil, + 16445, nil, nil, nil, nil, 691, nil, nil, nil, 692, + nil, nil, 16571, nil, nil, 16710, nil, 16849, nil, 262, + nil, nil, nil, 16988, 1168, 707, 702, 701, nil, nil, + 702, 17127, 707, 17266, 24798, 24866, 792, 745, nil, 17405, + 707, nil, 17544, 17683, 24934, 25002, 3563, 1743, 17822, 833, + 833, 717, nil, nil, 67, 198, 719, 734, nil, 319, + 786, 2303, 864, nil, 2443, 55, 870, 871, 868, 885, + nil, nil, 17961, 25070, 25138, 25, nil, nil, 820, nil, + 25206, 25274, 18100, nil, nil, nil, 387, 2583, 806, nil, + nil, nil, 18239, nil, 715, nil, 770, 774, nil, 775, + 777, 794, nil, nil, nil, nil, nil, nil, nil, nil, + 781, 520, nil, nil, 18378, nil, nil, nil, 885, nil, + nil, nil, 890, nil, nil, 891, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 164, nil, nil, + 188, nil, nil, nil, 814, nil, nil, 827, nil, 2723, + nil, 24325, nil, 829, 18517, 18656, 18795, 25342, 25410, 18934, + 397, 865, 19073, 19212, 19351, 19490, 865, nil, nil, nil, + 19629, 19768, 867, nil, nil, nil, 331, 363, 520, 652, + 851, 870, nil, 105, 975, -10, nil, nil, 891, nil, + 998, nil, 879, nil, 924, 19907, nil, nil, 20046, nil, + nil, -111, 20185, 885, nil, 896, 21, 23, 937, 267, + 915, 938, 900, 20324, nil, 965, 27, 84, nil, 20463, + nil, nil, nil, nil, 20602, nil, nil, 20741, nil, nil, + nil, 540, nil, 1023, nil, nil, nil, nil, nil, 1031, + nil, 20880, 925, 26, 28, 93, 152, 2863, 304, 1043, + nil, 926, 3003, 21019, 278, 1047, 3143, 5339, 5467, 24458, + 53, 28, 931, 220, nil, nil, 574, 6704, nil, 15593, + nil, 5285, nil, 21158, nil, 652, nil, 930, 950, 921, + 954, nil, nil, nil, nil, 977, 3283, nil, nil, nil, + nil, nil, 969, nil, 954, 21297, 958, 364, 368, 784, + 912, 1883, 21436, nil, 956, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 21575, 21714, 21853, 21992, 369, + 22131, nil, nil, 15692, nil, 3423, nil, nil, 986, nil, + 109, nil, nil, nil, nil, 974, 268, nil, nil, nil, + nil, nil, nil, 3563, nil, 977, 1036, nil, nil, 426, + 1116, nil, nil, 22270, nil, 3703, 1121, nil, nil, nil, + 22409, -7, 34, 1122, nil, 1125, 359, nil, nil, 1129, + 1014, 411, nil, nil, nil, 3843, 3983, 1012, 1029, 1027, + nil, nil, nil, 1036, 1037, nil, 1042, 1045, nil, 1047, + nil, nil, 1051, 748, 513, nil, nil, nil, nil, nil, + nil, nil, 1043, nil, 1061, 370, nil, nil, 22548, 22687, + 2023, 1062, 1063, nil, 1066, 1067, 1068, nil, 1090, 1093, + 1077, 22826, nil, nil, nil, nil, 4123, 4263, nil, -8, + 22965, nil, nil, nil, -1, nil, nil, nil, 23104, 4403, + nil, nil, nil, 4543, nil, nil, nil, 1132, 1110, 1215, + 1309, nil, nil, 25472, nil, 6071, nil, 6210, nil, 6650, + nil, nil, nil, nil, 1096, 1110, nil, 320, nil, nil, + 25479, nil, nil, 25496, nil, 7454, nil, nil, 1134, 23243, + 822, 1191, nil, 1253, 4683, 823, 824, 862, 1209, 865, + nil, 4823, nil, 23382, 433, 1256, 4963, nil, nil, 528, + nil, nil, nil, 1139, 1141, 1142, 1144, 645, 755, 1145, + nil, nil, 1148, 1149, 1151, 1154, nil, 1166, nil, 916, + 25550, nil, nil, 1289, 23521, 25618, 25686, 948, 697, nil, + nil, nil, nil, nil, 1288, nil, 1449, 7593, nil, nil, + nil, nil, 1175, nil, 25748, nil, 7732, nil, 14404, nil, + 14543, nil, nil, 1215, 1216, nil, 1183, 11, 36, 123, + 1079, nil, nil, nil, 1182, 1183, 1184, 1185, 1187, 39, + nil, 15539, nil, nil, nil, nil, 1188, nil ] + +racc_action_default = [ + -1, -644, -643, -644, -2, -630, -4, -5, -644, -8, + -9, -644, -644, -644, -36, -644, -644, -40, -644, -644, + -291, -51, -632, -644, -56, -61, -62, -63, -67, -268, + -268, -268, -306, -336, -337, -79, -643, -83, -91, -93, + -644, -532, -533, -644, -644, -644, -644, -227, -644, -632, + -241, -282, -283, -284, -285, -286, -287, -288, -289, -290, + -617, -293, -295, -302, -304, -314, -316, -644, -644, -58, + -58, -630, -644, -644, -644, -644, -338, -339, -341, -342, + -343, -344, -345, -346, -347, -348, -349, -350, -359, -414, + -462, -463, -464, -465, -466, -643, -469, -643, -643, -643, + -643, -643, -643, -505, -506, -643, -508, -514, -516, -517, + -518, -519, -615, -521, -522, -616, -524, -525, -526, -527, + -528, -529, -530, -531, -536, -537, 1088, -3, -631, -639, + -640, -641, -7, -644, -644, -644, -644, -644, -644, -24, + -644, -122, -123, -124, -125, -126, -127, -128, -132, -133, + -134, -135, -136, -137, -138, -139, -140, -141, -142, -143, + -144, -145, -146, -147, -148, -149, -150, -151, -152, -153, + -154, -155, -156, -157, -158, -159, -160, -161, -162, -163, + -164, -165, -166, -167, -168, -169, -170, -171, -172, -173, + -174, -175, -176, -177, -178, -179, -180, -181, -182, -183, + -184, -185, -186, -187, -188, -189, -190, -191, -192, -193, + -194, -195, -196, -197, -198, -199, -200, -201, -202, -29, + -129, -643, -644, -644, -644, -644, -644, -643, -644, -644, + -627, -644, -644, -632, -633, -55, -644, -532, -533, -644, + -291, -644, -644, -233, -644, -643, -644, -644, -644, -644, + -644, -644, -644, -644, -644, -644, -644, -644, -644, -644, + -644, -644, -644, -644, -644, -644, -644, -644, -644, -242, + -243, -244, -245, -644, -352, -442, -422, -644, -628, -629, + -68, -643, -644, -313, -351, -426, -435, -437, -74, -432, + -75, -632, -76, -248, -263, -643, -643, -267, -644, -273, + -644, -643, -609, -644, -644, -77, -78, -630, -17, -18, + -644, -21, -22, -81, -643, -632, -644, -84, -87, -643, + -99, -100, -644, -644, -107, -306, -309, -632, -644, -336, + -337, -340, -433, -644, -89, -644, -95, -301, -515, -644, + -221, -222, -644, -234, -644, -643, -297, -632, -643, -643, + -315, -57, -644, -644, -644, -643, -643, -630, -644, -631, + -532, -533, -644, -644, -291, -644, -369, -370, -117, -118, + -644, -120, -644, -291, -643, -644, -532, -533, -329, -122, + -123, -162, -163, -164, -180, -185, -192, -195, -331, -644, + -604, -605, -564, -467, -644, -490, -644, -492, -644, -494, + -644, -644, -474, -644, -644, -480, -644, -644, -486, -644, + -644, -488, -644, -507, -509, -510, -511, -512, -6, -642, + -30, -31, -32, -33, -34, -10, -11, -644, -26, -27, + -28, -130, -644, -37, -39, -278, -644, -644, -277, -38, + -644, -41, -644, -291, -49, -50, -203, -253, -273, -52, + -53, -42, -204, -253, -632, -258, -259, -643, -643, -618, + -619, -268, -430, -620, -621, -619, -618, -268, -429, -431, + -620, -621, -48, -211, -54, -632, -312, -644, -644, -644, + -643, -301, -644, -644, -644, -212, -213, -214, -215, -216, + -217, -218, -219, -223, -224, -225, -226, -228, -229, -230, + -231, -232, -235, -236, -237, -238, -632, -246, -644, -443, + -268, -618, -619, -65, -69, -632, -269, -439, -442, -632, + -308, -264, -644, -272, -265, -644, -270, -644, -274, -644, + -612, -614, -16, -631, -20, -644, -632, -80, -299, -96, + -85, -644, -632, -643, -644, -644, -106, -644, -515, -644, + -92, -97, -644, -644, -644, -644, -247, -239, -644, -454, + -644, -632, -296, -249, -636, -636, -632, -644, -607, -636, + -644, -643, -360, -361, -643, -644, -644, -644, -644, -644, + -355, -449, -643, -644, -644, -301, -58, -117, -118, -119, + -644, -644, -643, -324, -538, -540, -326, -643, -542, -333, + -625, -626, -644, -415, -564, -418, -603, -603, -547, -549, + -549, -549, -563, -565, -566, -567, -568, -569, -570, -571, + -572, -644, -574, -576, -578, -583, -585, -586, -588, -593, + -595, -596, -598, -599, -600, -644, -468, -491, -496, -497, + -499, -470, -493, -471, -495, -472, -473, -644, -476, -478, + -644, -479, -482, -483, -644, -484, -485, -644, -513, -643, + -25, -644, -35, -281, -644, -644, -643, -644, -644, -644, + -434, -644, -260, -262, -644, -644, -70, -256, -257, -427, + -644, -644, -72, -428, -311, -634, -618, -619, -618, -619, + -632, -644, -421, -643, -64, -423, -439, -255, -644, -440, + -644, -307, -643, -271, -275, -644, -610, -611, -644, -19, + -23, -82, -644, -88, -94, -632, -618, -619, -643, -103, + -105, -644, -90, -644, -210, -220, -632, -643, -353, -643, + -294, -358, -298, -250, -638, -637, -252, -638, -303, -305, + -608, -643, -362, -643, -59, -363, -364, -319, -320, -644, + -322, -644, -632, -618, -619, -622, -300, -643, -117, -118, + -121, -632, -643, -644, -644, -644, -643, -564, -564, -644, + -632, -644, -632, -644, -545, -546, -644, -644, -556, -644, + -559, -644, -561, -644, -371, -644, -373, -375, -378, -381, + -632, -577, -587, -597, -601, -644, -643, -475, -477, -481, + -487, -489, -644, -131, -279, -644, -632, -618, -619, -619, + -618, -254, -644, -635, -643, -44, -206, -45, -207, -71, + -46, -209, -47, -208, -73, -644, -644, -644, -644, -434, + -644, -403, -404, -632, -406, -643, -425, -424, -644, -436, + -643, -438, -266, -276, -613, -86, -101, -98, -310, -13, + -15, -354, -356, -643, -461, -455, -643, -456, -457, -636, + -644, -357, -365, -644, -367, -643, -644, -60, -321, -445, + -644, -644, -434, -644, -434, -644, -644, -327, -330, -644, + -632, -644, -334, -606, -416, -643, -643, -408, -632, -603, + -584, -602, -548, -549, -549, -575, -549, -549, -594, -549, + -572, -589, -632, -644, -644, -380, -573, -498, -501, -502, + -503, -504, -644, -12, -280, -434, -43, -205, -261, -644, + -240, -603, -603, -385, -643, -643, -643, -402, -644, -632, + -572, -580, -581, -591, -444, -66, -643, -643, -460, -644, + -644, -459, -251, -317, -644, -368, -318, -446, -644, -643, + -323, -325, -539, -643, -332, -541, -543, -542, -644, -644, + -644, -417, -544, -644, -552, -644, -554, -644, -557, -644, + -560, -562, -372, -374, -376, -379, -500, -644, -383, -384, + -393, -387, -395, -644, -398, -644, -400, -405, -644, -644, + -579, -644, -441, -643, -643, -108, -109, -644, -644, -116, + -458, -643, -447, -644, -643, -644, -643, -419, -420, -632, + -410, -412, -413, -549, -549, -549, -549, -644, -644, -603, + -582, -386, -643, -643, -643, -643, -592, -643, -407, -590, + -644, -301, -14, -454, -643, -644, -644, -115, -643, -448, + -450, -451, -452, -328, -644, -409, -644, -644, -550, -553, + -555, -558, -377, -382, -644, -390, -644, -392, -644, -396, + -644, -399, -401, -300, -622, -453, -632, -618, -619, -622, + -114, -366, -335, -411, -549, -643, -643, -643, -643, -434, + -551, -644, -388, -391, -394, -397, -643, -389 ] + +racc_goto_table = [ + 6, 131, 350, 232, 454, 296, 296, 296, 144, 144, + 294, 294, 294, 276, 228, 388, 4, 352, 353, 727, + 579, 357, 278, 355, 356, 524, 295, 295, 295, 338, + 344, 550, 9, 139, 220, 235, 128, 514, 9, 438, + 439, 670, 285, 289, 425, 414, 766, 147, 147, 571, + 574, 317, 127, 860, 331, 331, 703, 334, 515, 703, + 774, 775, 461, 467, 508, 898, 850, 131, 733, 736, + 888, 589, 144, 740, 706, 280, 288, 290, 394, 698, + 790, 925, 835, 420, 421, 422, 423, 1010, 412, 331, + 331, 331, 346, 395, 132, 397, 399, 402, 405, 408, + 411, 1026, 144, 395, 313, 973, 315, 620, 975, 866, + 560, 510, 647, 1012, 1, 650, 374, 378, 358, 2, + 138, 659, 849, 937, 351, 351, 709, 535, 351, 219, + 367, 928, 784, 292, 305, 306, 434, 476, 427, 744, + 867, 277, 696, 445, 452, 661, 445, 342, 566, 473, + 695, 445, 390, 738, 567, 365, 593, 389, 9, 599, + 345, 605, 347, 561, 348, 451, 349, 424, 762, 612, + 472, 764, 1026, 1073, 953, 597, 598, 769, 957, 974, + 927, 929, 1009, 603, 884, 392, 316, 524, 895, 771, + 351, 351, 351, 351, 517, 520, 642, 518, 644, 1012, + 894, 648, 896, 840, 648, 294, 703, 703, 871, 693, + 1040, 751, 856, 939, 418, 393, 437, 437, 396, 537, + 973, 1052, 706, 398, 401, 455, 471, 988, 1022, 936, + 404, 478, 407, 410, 433, 444, 907, 713, 444, 795, + 749, 462, 796, 444, 902, 722, 413, 763, 893, 898, + 890, 562, 1020, 602, nil, 296, 926, 690, 838, 294, + 294, nil, nil, nil, 296, nil, nil, nil, nil, 294, + nil, nil, nil, nil, nil, nil, 295, 829, nil, 455, + nil, 449, 450, nil, 529, 295, 706, nil, nil, 474, + 475, 760, nil, 523, 523, 19, 784, nil, nil, 395, + 905, 19, 846, 131, 575, nil, nil, 700, 547, nil, + nil, nil, 461, 467, nil, nil, 236, 544, 548, 620, + 715, 565, 569, nil, nil, 236, 236, 236, nil, 19, + 322, 322, 1032, nil, 554, 331, nil, 540, 533, 872, + 534, 285, 564, 962, nil, 289, 563, 568, 874, 551, + 1071, nil, 331, 131, 532, 19, nil, 583, nil, 752, + 236, 236, 765, 942, 236, 362, 372, 372, nil, 761, + 1041, 432, 595, 772, nil, 978, 979, nil, 718, 684, + 895, 612, 313, 516, 536, nil, 1013, 313, 718, 542, + nil, 895, 519, 915, nil, 316, nil, nil, nil, nil, + 473, nil, 452, 1023, 578, 1006, 1024, nil, 845, nil, + nil, 351, nil, nil, 784, 784, nil, 718, nil, 697, + nil, 19, nil, 701, 144, 718, 236, 236, 236, 236, + 19, 842, 596, 819, nil, 671, nil, 667, nil, 824, + 711, 710, nil, 806, nil, nil, 714, 798, nil, 660, + 798, nil, 703, nil, nil, 523, 523, nil, 294, 677, + nil, nil, 41, 147, 316, 732, nil, 706, 41, 316, + 724, 895, nil, 1053, 678, nil, 471, 1075, 455, nil, + 683, nil, 620, 620, nil, nil, nil, 691, nil, nil, + nil, 462, 620, 1065, 620, 702, 41, 320, 320, nil, + nil, 461, 467, nil, nil, 576, 577, 676, 677, nil, + nil, nil, nil, 682, 19, 236, 442, 236, 236, 442, + 236, 294, 41, 678, 442, 236, 236, 875, 784, 784, + nil, 879, 360, 376, 376, 376, 880, 881, 19, nil, + 757, 455, 471, 842, 612, 612, 857, 671, 930, nil, + nil, nil, 471, nil, nil, 551, 694, 462, 331, nil, + 294, nil, nil, 551, nil, nil, 331, 462, 949, nil, + 294, 745, nil, nil, 236, 236, nil, nil, nil, nil, + 455, 471, nil, nil, 236, 445, nil, 471, 41, nil, + 455, nil, 816, 818, 445, 445, 462, 41, 821, 823, + 445, 445, nil, 19, 462, nil, nil, 19, nil, nil, + nil, 322, 19, 815, 817, 726, nil, nil, nil, 820, + 822, nil, nil, nil, nil, nil, nil, nil, 322, nil, + 848, nil, 837, nil, nil, nil, 994, nil, 19, nil, + nil, 1001, nil, nil, 294, 814, 889, 236, 19, 19, + nil, 959, nil, 1079, nil, nil, nil, 6, 144, 770, + nil, nil, nil, nil, 455, 471, 1042, nil, 236, nil, + nil, 671, nil, 802, 883, nil, nil, 444, 620, nil, + 462, 41, 836, 803, nil, nil, 444, 444, nil, 9, + nil, 831, 444, 444, 906, 930, 671, 147, 930, nil, + 523, nil, nil, nil, nil, 41, 922, 859, nil, 882, + 778, 780, 782, 876, nil, nil, 677, nil, 1005, nil, + nil, 741, nil, 437, 743, 854, 551, 858, nil, 331, + 917, 678, 445, 671, 683, nil, nil, 847, nil, 864, + 331, 864, 671, 816, 818, 823, 821, nil, nil, nil, + nil, 916, nil, 887, nil, nil, nil, nil, nil, nil, + 877, nil, nil, nil, 730, nil, 144, nil, nil, 930, + 41, 1044, nil, 236, 41, nil, nil, nil, 320, 41, + 747, 748, nil, 750, 955, nil, nil, 671, nil, nil, + nil, nil, 961, nil, nil, 320, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, 972, nil, nil, nil, + nil, 1066, 523, 944, 887, 41, 41, nil, nil, nil, + 351, nil, nil, nil, 444, nil, 19, nil, nil, nil, + nil, nil, nil, nil, 322, nil, 236, 917, 831, nil, + nil, nil, 322, nil, nil, nil, nil, nil, nil, nil, + 1019, 236, nil, 922, 941, nil, 922, nil, 922, nil, + nil, nil, nil, nil, 19, nil, nil, 19, nil, 718, + nil, nil, 952, nil, nil, 236, nil, 956, 891, nil, + nil, 891, nil, nil, nil, 236, nil, nil, nil, nil, + 19, nil, nil, nil, nil, 236, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 873, nil, nil, + 887, 29, nil, nil, nil, nil, nil, 29, nil, nil, + 351, nil, 981, 981, 981, nil, nil, 922, nil, 922, + nil, 922, 29, 922, nil, nil, nil, nil, 923, nil, + nil, 29, 29, 29, nil, 29, 912, nil, 331, nil, + nil, nil, 19, 868, 922, nil, nil, 331, 442, 236, + nil, nil, nil, nil, 897, nil, 899, 442, 442, 878, + nil, 29, nil, 442, 442, nil, 29, 29, nil, nil, + 29, nil, nil, nil, nil, 934, nil, nil, nil, nil, + 1045, 854, 1035, 41, 964, 966, nil, 968, 970, nil, + 971, 320, 864, 938, nil, 322, 331, nil, nil, 320, + nil, nil, 294, nil, nil, 945, 322, nil, 924, nil, + 981, 981, 981, 981, nil, 981, nil, 471, nil, nil, + 931, 41, 455, 471, 41, 958, 864, 29, nil, nil, + nil, nil, 29, 29, 29, 29, 29, 671, 462, nil, + 19, nil, nil, nil, nil, 19, 236, 41, nil, 19, + nil, nil, nil, nil, 943, nil, nil, nil, nil, nil, + 946, nil, nil, 981, 981, 981, 981, 950, nil, 951, + nil, nil, 891, 954, 981, 923, 992, 993, 923, 19, + 923, nil, nil, nil, nil, nil, nil, nil, nil, 1004, + nil, nil, nil, nil, nil, 442, nil, 982, 984, 986, + nil, nil, nil, nil, 1048, 1049, 1050, 1051, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, 19, nil, + 29, 29, 29, 29, 29, 29, 29, nil, nil, nil, + 29, 29, 29, nil, 1033, nil, 19, nil, 1014, nil, + 1015, 1038, 1016, nil, 29, nil, 236, nil, 19, 923, + nil, 923, nil, 923, nil, 923, nil, nil, 1025, nil, + 1027, nil, 320, nil, 931, 1080, nil, 931, 19, 19, + 931, nil, 931, 320, nil, nil, 923, nil, nil, nil, + 29, 29, nil, nil, nil, nil, nil, nil, nil, nil, + 29, nil, nil, nil, nil, 1055, 1057, 1059, 1061, 1043, + 1062, nil, nil, nil, nil, nil, nil, 41, nil, 29, + nil, nil, 41, 29, 990, nil, 41, nil, 29, 19, + 19, nil, 1074, 997, nil, nil, nil, nil, nil, 1076, + nil, 1077, 19, 1078, nil, nil, 19, nil, 1072, nil, + nil, 931, nil, 931, 29, 931, 41, 931, 1082, 1083, + 1084, 1085, nil, 29, 29, 29, 1086, nil, nil, 1087, + nil, nil, nil, nil, nil, nil, nil, nil, 931, nil, + nil, nil, 1029, nil, 29, nil, nil, 19, nil, nil, + nil, nil, nil, nil, 19, 41, nil, nil, nil, 19, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 236, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, 41, 41, nil, 32, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 32, nil, 435, 448, nil, nil, nil, + nil, nil, 32, 32, 32, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 29, + nil, 376, nil, nil, nil, nil, 41, 41, nil, nil, + 995, nil, 32, nil, nil, nil, nil, 32, 32, 41, + nil, 32, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 526, 29, 528, nil, nil, 530, 531, nil, 376, + nil, nil, 29, nil, 41, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, 41, 29, 32, nil, + nil, nil, nil, 32, 32, 32, 32, 32, nil, nil, + 29, nil, nil, 29, nil, nil, nil, nil, nil, nil, + nil, 29, 570, nil, nil, nil, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, 29, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 32, 32, 32, 32, 32, 32, 32, 29, nil, + nil, 32, 32, 32, 29, 29, nil, nil, nil, 663, + nil, nil, nil, 29, 29, 32, nil, nil, nil, 29, + 29, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 32, 32, nil, nil, nil, nil, nil, nil, nil, + nil, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 32, nil, nil, nil, 32, nil, nil, nil, nil, 32, + nil, nil, nil, nil, nil, 704, 29, nil, 570, nil, + 707, 29, 29, nil, nil, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, 32, 32, 32, nil, nil, nil, + nil, nil, nil, nil, nil, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, 791, nil, nil, + nil, nil, 29, nil, 29, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 804, 243, nil, + nil, nil, nil, nil, nil, 704, 570, 293, 293, 293, + 32, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 340, 341, nil, 343, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 29, 29, nil, 843, nil, + nil, 844, nil, nil, nil, nil, nil, nil, 29, nil, + nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 855, 32, nil, 16, nil, 704, nil, nil, + 570, 16, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 869, nil, nil, nil, 32, nil, + nil, nil, nil, 29, nil, nil, nil, nil, nil, 16, + 29, 32, nil, nil, 32, 29, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, 901, nil, nil, nil, + nil, nil, 32, nil, nil, 16, nil, 32, nil, nil, + nil, nil, 32, 29, nil, 366, nil, nil, 914, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 32, + nil, 16, nil, nil, nil, 32, 32, 293, 447, nil, + 16, 453, 293, 947, 32, 32, 453, nil, nil, nil, + 32, 32, nil, nil, nil, nil, nil, nil, nil, 243, + nil, nil, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, nil, nil, nil, nil, 507, nil, + nil, 570, nil, nil, nil, nil, 293, 293, nil, nil, + nil, nil, nil, nil, nil, nil, 293, nil, nil, nil, + nil, nil, nil, 293, nil, 293, nil, nil, 293, 293, + nil, 1002, nil, nil, 16, nil, 440, 32, nil, 440, + nil, nil, 32, 32, 440, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 16, nil, + nil, nil, nil, nil, nil, nil, 18, 556, nil, 557, + nil, nil, 18, 293, 293, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1039, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, 16, nil, nil, 18, 16, nil, nil, + nil, nil, 16, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 32, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 16, nil, + nil, 293, nil, nil, nil, 32, 32, nil, 16, 16, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 18, nil, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, 293, nil, 453, 453, 453, + nil, nil, nil, nil, nil, nil, 32, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 32, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 293, nil, nil, + 293, nil, 293, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 293, nil, + nil, nil, nil, nil, 32, nil, nil, 453, 725, nil, + nil, 32, nil, nil, nil, 18, 32, 18, nil, nil, + 18, nil, nil, nil, nil, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 293, nil, 18, + nil, nil, nil, nil, 32, nil, nil, 293, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 16, nil, nil, 293, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 18, nil, nil, nil, 18, nil, + nil, nil, nil, 18, 16, nil, nil, 16, nil, 293, + 453, 293, nil, nil, 811, nil, nil, 293, 293, 453, + 453, nil, nil, nil, nil, 453, 453, nil, nil, 18, + 16, nil, nil, nil, nil, nil, nil, nil, nil, 18, + 18, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 293, nil, nil, 293, nil, nil, nil, nil, nil, 20, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, 293, nil, nil, nil, nil, 293, + nil, nil, 293, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 16, 20, 324, 324, 293, nil, 440, nil, + nil, nil, nil, nil, nil, nil, nil, 440, 440, nil, + nil, nil, nil, 440, 440, nil, nil, nil, nil, 20, + nil, nil, nil, nil, nil, nil, nil, nil, 293, 364, + 373, 373, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 293, nil, nil, nil, nil, nil, nil, 453, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 453, 453, 453, 453, nil, 920, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + 16, nil, nil, nil, 20, 16, nil, nil, nil, 16, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 293, nil, 18, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 16, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 440, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, 18, nil, + nil, nil, nil, 293, 453, nil, nil, nil, 16, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 20, nil, + 443, 18, nil, 443, nil, nil, 16, nil, 443, nil, + nil, nil, nil, 293, nil, nil, nil, nil, 16, nil, + nil, nil, 20, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 16, 16, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 18, nil, nil, nil, nil, 293, 18, + nil, nil, nil, nil, nil, nil, nil, nil, 18, 18, + 42, nil, nil, nil, 18, 18, 42, 20, nil, 16, + 16, 20, nil, 1000, nil, 324, 20, nil, nil, 293, + nil, nil, 16, nil, nil, nil, 16, nil, nil, nil, + nil, nil, 324, nil, 42, 321, 321, nil, nil, nil, + nil, nil, 20, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 20, 20, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, nil, nil, nil, 16, nil, nil, + 361, 377, 377, 377, 16, nil, nil, nil, nil, 16, + nil, 18, nil, nil, nil, nil, 18, nil, nil, nil, + 18, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, 42, 18, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 18, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 18, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 18, + 18, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 20, nil, nil, nil, nil, nil, nil, nil, 324, nil, + nil, nil, nil, 42, nil, nil, 324, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 18, 18, nil, nil, nil, nil, nil, nil, 20, nil, + nil, 20, nil, 18, nil, nil, nil, 18, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 20, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, 42, nil, nil, nil, 321, 42, 18, nil, + nil, nil, nil, nil, nil, 18, nil, nil, nil, nil, + 18, nil, nil, 321, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 42, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 42, 42, nil, 20, nil, nil, nil, + nil, nil, 443, nil, nil, nil, nil, nil, nil, nil, + nil, 443, 443, nil, nil, nil, nil, 443, 443, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 324, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 324, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 20, nil, nil, nil, nil, 20, + nil, nil, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 911, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 443, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 42, 20, nil, nil, nil, nil, nil, nil, 321, + nil, nil, nil, nil, nil, nil, nil, 321, nil, nil, + 20, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 20, nil, nil, nil, nil, nil, nil, 42, + nil, nil, 42, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 20, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 42, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 373, nil, + nil, nil, nil, 20, 20, nil, nil, 999, nil, nil, + nil, nil, nil, nil, nil, nil, 20, nil, nil, nil, + 20, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 373, nil, nil, nil, + nil, 20, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, nil, 20, nil, nil, nil, nil, nil, nil, + 321, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 321, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 42, nil, nil, nil, nil, + 42, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 42, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 42, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 42, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 42, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 377, + nil, nil, nil, nil, 42, 42, nil, nil, 996, nil, + nil, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, 42, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 377, nil, nil, + nil, nil, 42, nil, nil, nil, nil, nil, nil, 42, + nil, nil, nil, nil, 42 ] + +racc_goto_check = [ + 6, 118, 102, 40, 36, 84, 84, 84, 71, 71, + 46, 46, 46, 168, 38, 70, 2, 24, 24, 15, + 113, 24, 38, 42, 42, 87, 82, 82, 82, 76, + 40, 65, 9, 22, 22, 27, 8, 52, 9, 29, + 29, 37, 85, 85, 10, 70, 121, 73, 73, 106, + 106, 63, 5, 107, 78, 78, 88, 64, 36, 88, + 150, 150, 50, 50, 169, 212, 17, 118, 83, 83, + 159, 68, 71, 83, 217, 51, 51, 51, 185, 53, + 144, 155, 157, 24, 24, 24, 24, 161, 185, 78, + 78, 78, 9, 6, 7, 6, 6, 6, 6, 6, + 6, 213, 71, 6, 59, 142, 60, 206, 145, 109, + 12, 50, 189, 162, 1, 189, 69, 69, 5, 3, + 11, 13, 16, 18, 31, 31, 20, 21, 31, 23, + 26, 159, 143, 58, 58, 58, 30, 61, 32, 43, + 45, 49, 55, 25, 75, 74, 25, 79, 81, 75, + 86, 25, 98, 37, 101, 115, 117, 122, 9, 123, + 124, 167, 125, 126, 127, 33, 128, 9, 129, 201, + 33, 130, 213, 161, 131, 132, 133, 134, 135, 146, + 147, 153, 160, 163, 164, 165, 14, 87, 207, 166, + 31, 31, 31, 31, 171, 61, 190, 172, 190, 162, + 156, 190, 156, 174, 190, 46, 88, 88, 175, 177, + 178, 179, 180, 181, 7, 184, 82, 82, 186, 61, + 142, 145, 217, 187, 188, 6, 71, 159, 155, 157, + 191, 38, 192, 193, 27, 27, 194, 65, 27, 195, + 113, 85, 196, 27, 144, 65, 199, 200, 205, 212, + 209, 61, 210, 216, nil, 84, 156, 36, 53, 46, + 46, nil, nil, nil, 84, nil, nil, nil, nil, 46, + nil, nil, nil, nil, nil, nil, 82, 37, nil, 6, + nil, 31, 31, nil, 185, 82, 217, nil, nil, 31, + 31, 68, nil, 6, 6, 35, 143, nil, nil, 6, + 143, 35, 37, 118, 24, nil, nil, 169, 40, nil, + nil, nil, 50, 50, nil, nil, 35, 38, 76, 206, + 36, 84, 84, nil, nil, 35, 35, 35, nil, 35, + 35, 35, 17, nil, 38, 78, nil, 64, 8, 37, + 9, 85, 82, 150, nil, 85, 6, 6, 37, 63, + 107, nil, 78, 118, 5, 35, nil, 38, nil, 36, + 35, 35, 12, 83, 35, 35, 35, 35, nil, 36, + 109, 14, 6, 167, nil, 150, 150, nil, 50, 61, + 207, 201, 59, 58, 60, nil, 156, 59, 50, 60, + nil, 207, 58, 37, nil, 14, nil, nil, nil, nil, + 75, nil, 75, 156, 5, 121, 156, nil, 65, nil, + nil, 31, nil, nil, 143, 143, nil, 50, nil, 61, + nil, 35, nil, 61, 71, 50, 35, 35, 35, 35, + 35, 87, 31, 52, nil, 40, nil, 38, nil, 52, + 61, 10, nil, 36, nil, nil, 61, 190, nil, 22, + 190, nil, 88, nil, nil, 6, 6, nil, 46, 6, + nil, nil, 66, 73, 14, 61, nil, 217, 66, 14, + 75, 207, nil, 150, 85, nil, 71, 156, 6, nil, + 85, nil, 206, 206, nil, nil, nil, 40, nil, nil, + nil, 85, 206, 15, 206, 84, 66, 66, 66, nil, + nil, 50, 50, nil, nil, 14, 14, 51, 6, nil, + nil, nil, nil, 51, 35, 35, 35, 35, 35, 35, + 35, 46, 66, 85, 35, 35, 35, 12, 143, 143, + nil, 12, 66, 66, 66, 66, 167, 167, 35, nil, + 42, 6, 71, 87, 201, 201, 29, 40, 206, nil, + nil, nil, 71, nil, nil, 63, 51, 85, 78, nil, + 46, nil, nil, 63, nil, nil, 78, 85, 106, nil, + 46, 118, nil, nil, 35, 35, nil, nil, nil, nil, + 6, 71, nil, nil, 35, 25, nil, 71, 66, nil, + 6, nil, 75, 75, 25, 25, 85, 66, 75, 75, + 25, 25, nil, 35, 85, nil, nil, 35, nil, nil, + nil, 35, 35, 33, 33, 31, nil, nil, nil, 33, + 33, nil, nil, nil, nil, nil, nil, nil, 35, nil, + 61, nil, 102, nil, nil, nil, 106, nil, 35, nil, + nil, 106, nil, nil, 46, 84, 149, 35, 35, 35, + nil, 12, nil, 37, nil, nil, nil, 6, 71, 31, + nil, nil, nil, nil, 6, 71, 113, nil, 35, nil, + nil, 40, nil, 2, 61, nil, nil, 27, 206, nil, + 85, 66, 168, 22, nil, nil, 27, 27, nil, 9, + nil, 6, 27, 27, 61, 206, 40, 73, 206, nil, + 6, nil, nil, nil, nil, 66, 149, 84, nil, 70, + 204, 204, 204, 24, nil, nil, 6, nil, 12, nil, + nil, 14, nil, 82, 14, 6, 63, 6, nil, 78, + 75, 85, 25, 40, 85, nil, nil, 63, nil, 6, + 78, 6, 40, 75, 75, 75, 75, nil, nil, nil, + nil, 33, nil, 40, nil, nil, nil, nil, nil, nil, + 118, nil, nil, nil, 100, nil, 71, nil, nil, 206, + 66, 12, nil, 35, 66, nil, nil, nil, 66, 66, + 100, 100, nil, 100, 61, nil, nil, 40, nil, nil, + nil, nil, 61, nil, nil, 66, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, 61, nil, nil, nil, + nil, 36, 6, 24, 40, 66, 66, nil, nil, nil, + 31, nil, nil, nil, 27, nil, 35, nil, nil, nil, + nil, nil, nil, nil, 35, nil, 35, 75, 6, nil, + nil, nil, 35, nil, nil, nil, nil, nil, nil, nil, + 149, 35, nil, 149, 6, nil, 149, nil, 149, nil, + nil, nil, nil, nil, 35, nil, nil, 35, nil, 50, + nil, nil, 118, nil, nil, 35, nil, 118, 151, nil, + nil, 151, nil, nil, nil, 35, nil, nil, nil, nil, + 35, nil, nil, nil, nil, 35, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 14, nil, nil, + 40, 54, nil, nil, nil, nil, nil, 54, nil, nil, + 31, nil, 6, 6, 6, nil, nil, 149, nil, 149, + nil, 149, 54, 149, nil, nil, nil, nil, 151, nil, + nil, 54, 54, 54, nil, 54, 14, nil, 78, nil, + nil, nil, 35, 100, 149, nil, nil, 78, 35, 35, + nil, nil, nil, nil, 154, nil, 154, 35, 35, 100, + nil, 54, nil, 35, 35, nil, 54, 54, nil, nil, + 54, nil, nil, nil, nil, 14, nil, nil, nil, nil, + 40, 6, 38, 66, 204, 204, nil, 204, 204, nil, + 204, 66, 6, 14, nil, 35, 78, nil, nil, 66, + nil, nil, 46, nil, nil, 14, 35, nil, 154, nil, + 6, 6, 6, 6, nil, 6, nil, 71, nil, nil, + 208, 66, 6, 71, 66, 14, 6, 54, nil, nil, + nil, nil, 54, 54, 54, 54, 54, 40, 85, nil, + 35, nil, nil, nil, nil, 35, 35, 66, nil, 35, + nil, nil, nil, nil, 100, nil, nil, nil, nil, nil, + 100, nil, nil, 6, 6, 6, 6, 100, nil, 100, + nil, nil, 151, 100, 6, 151, 14, 14, 151, 35, + 151, nil, nil, nil, nil, nil, nil, nil, nil, 14, + nil, nil, nil, nil, nil, 35, nil, 152, 152, 152, + nil, nil, nil, nil, 204, 204, 204, 204, nil, 66, + nil, nil, nil, nil, nil, nil, nil, nil, 35, nil, + 54, 54, 54, 54, 54, 54, 54, nil, nil, nil, + 54, 54, 54, nil, 14, nil, 35, nil, 154, nil, + 154, 14, 154, nil, 54, nil, 35, nil, 35, 151, + nil, 151, nil, 151, nil, 151, nil, nil, 154, nil, + 154, nil, 66, nil, 208, 204, nil, 208, 35, 35, + 208, nil, 208, 66, nil, nil, 151, nil, nil, nil, + 54, 54, nil, nil, nil, nil, nil, nil, nil, nil, + 54, nil, nil, nil, nil, 152, 152, 152, 152, 100, + 152, nil, nil, nil, nil, nil, nil, 66, nil, 54, + nil, nil, 66, 54, 35, nil, 66, nil, 54, 35, + 35, nil, 154, 35, nil, nil, nil, nil, nil, 154, + nil, 154, 35, 154, nil, nil, 35, nil, 100, nil, + nil, 208, nil, 208, 54, 208, 66, 208, 152, 152, + 152, 152, nil, 54, 54, 54, 154, nil, nil, 152, + nil, nil, nil, nil, nil, nil, nil, nil, 208, nil, + nil, nil, 35, nil, 54, nil, nil, 35, nil, nil, + nil, nil, nil, nil, 35, 66, nil, nil, nil, 35, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, nil, 35, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, nil, nil, 66, 66, nil, 57, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 57, nil, 80, 80, nil, nil, nil, + nil, nil, 57, 57, 57, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 54, + nil, 66, nil, nil, nil, nil, 66, 66, nil, nil, + 66, nil, 57, nil, nil, nil, nil, 57, 57, 66, + nil, 57, nil, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 80, 54, 80, nil, nil, 80, 80, nil, 66, + nil, nil, 54, nil, 66, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, 66, 54, 57, nil, + nil, nil, nil, 57, 57, 57, 57, 57, nil, nil, + 54, nil, nil, 54, nil, nil, nil, nil, nil, nil, + nil, 54, 80, nil, nil, nil, nil, nil, nil, nil, + nil, 54, nil, nil, nil, nil, 54, nil, nil, nil, + nil, 54, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 57, 57, 57, 57, 57, 57, 57, 54, nil, + nil, 57, 57, 57, 54, 54, nil, nil, nil, 80, + nil, nil, nil, 54, 54, 57, nil, nil, nil, 54, + 54, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 57, 57, nil, nil, nil, nil, nil, nil, nil, + nil, 57, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 57, nil, nil, nil, 57, nil, nil, nil, nil, 57, + nil, nil, nil, nil, nil, 80, 54, nil, 80, nil, + 80, 54, 54, nil, nil, 54, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, nil, + nil, nil, nil, nil, 57, 57, 57, nil, nil, nil, + nil, nil, nil, nil, nil, 54, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, nil, + nil, 54, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, nil, nil, 80, nil, nil, + nil, nil, 54, nil, 54, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, 54, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 80, 41, nil, + nil, nil, nil, nil, nil, 80, 80, 41, 41, 41, + 57, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, 41, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 54, 54, nil, 80, nil, + nil, 80, nil, nil, nil, nil, nil, nil, 54, nil, + nil, nil, 54, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 80, 57, nil, 28, nil, 80, nil, nil, + 80, 28, nil, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 80, nil, nil, nil, 57, nil, + nil, nil, nil, 54, nil, nil, nil, nil, nil, 28, + 54, 57, nil, nil, 57, 54, nil, nil, nil, nil, + nil, nil, 57, nil, nil, nil, 80, nil, nil, nil, + nil, nil, 57, nil, nil, 28, nil, 57, nil, nil, + nil, nil, 57, 54, nil, 28, nil, nil, 80, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 57, + nil, 28, nil, nil, nil, 57, 57, 41, 41, nil, + 28, 41, 41, 80, 57, 57, 41, nil, nil, nil, + 57, 57, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, nil, nil, nil, nil, 41, nil, + nil, 80, nil, nil, nil, nil, 41, 41, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, 41, nil, 41, nil, nil, 41, 41, + nil, 80, nil, nil, 28, nil, 28, 57, nil, 28, + nil, nil, 57, 57, 28, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, 34, 41, nil, 41, + nil, nil, 34, 41, 41, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 80, nil, nil, nil, + nil, nil, 57, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, nil, + nil, nil, nil, 28, nil, nil, 34, 28, nil, nil, + nil, nil, 28, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 57, nil, 57, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 28, nil, + nil, 41, nil, nil, nil, 57, 57, nil, 28, 28, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 34, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, 41, nil, 41, 41, 41, + nil, nil, nil, nil, nil, nil, 57, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 57, + nil, nil, nil, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + 41, nil, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, 57, nil, nil, 41, 41, nil, + nil, 57, nil, nil, nil, 34, 57, 34, nil, nil, + 34, nil, nil, nil, nil, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, 34, + nil, nil, nil, nil, 57, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 28, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 34, nil, nil, nil, 34, nil, + nil, nil, nil, 34, 28, nil, nil, 28, nil, 41, + 41, 41, nil, nil, 41, nil, nil, 41, 41, 41, + 41, nil, nil, nil, nil, 41, 41, nil, nil, 34, + 28, nil, nil, nil, nil, nil, nil, nil, nil, 34, + 34, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, 41, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, 41, + nil, nil, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 28, 39, 39, 39, 41, nil, 28, nil, + nil, nil, nil, nil, nil, nil, nil, 28, 28, nil, + nil, nil, nil, 28, 28, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, nil, nil, nil, 41, 39, + 39, 39, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, 41, 41, 41, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + 28, nil, nil, nil, 39, 28, nil, nil, nil, 28, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 34, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 28, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, 34, nil, + nil, nil, nil, 41, 41, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 39, nil, + 39, 34, nil, 39, nil, nil, 28, nil, 39, nil, + nil, nil, nil, 41, nil, nil, nil, nil, 28, nil, + nil, nil, 39, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 28, 28, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 34, nil, nil, nil, nil, 41, 34, + nil, nil, nil, nil, nil, nil, nil, nil, 34, 34, + 67, nil, nil, nil, 34, 34, 67, 39, nil, 28, + 28, 39, nil, 28, nil, 39, 39, nil, nil, 41, + nil, nil, 28, nil, nil, nil, 28, nil, nil, nil, + nil, nil, 39, nil, 67, 67, 67, nil, nil, nil, + nil, nil, 39, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, 39, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, nil, nil, 28, nil, nil, + 67, 67, 67, 67, 28, nil, nil, nil, nil, 28, + nil, 34, nil, nil, nil, nil, 34, nil, nil, nil, + 34, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, 67, 34, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + 34, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 39, nil, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, nil, 67, nil, nil, 39, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 34, 34, nil, nil, nil, nil, nil, nil, 39, nil, + nil, 39, nil, 34, nil, nil, nil, 34, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 39, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, 67, nil, nil, nil, 67, 67, 34, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, nil, + 34, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, 67, nil, 39, nil, nil, nil, + nil, nil, 39, nil, nil, nil, nil, nil, nil, nil, + nil, 39, 39, nil, nil, nil, nil, 39, 39, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 39, nil, nil, nil, nil, 39, + nil, nil, nil, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, 39, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, nil, nil, nil, nil, nil, nil, 67, + nil, nil, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 67, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, nil, 39, 39, nil, nil, 39, nil, nil, + nil, nil, nil, nil, nil, nil, 39, nil, nil, nil, + 39, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 39, nil, nil, nil, + nil, 39, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, nil, 39, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 67, nil, nil, nil, nil, + 67, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, nil, 67, 67, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, 67, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, nil, 67 ] + +racc_goto_pointer = [ + nil, 114, 14, 119, nil, 47, -2, 86, 31, 30, + -94, 110, -235, -305, 150, -540, -605, -661, -726, nil, + -407, -185, 22, 117, -50, -80, 58, 12, 1873, -183, + -86, 57, -1, -61, 2124, 293, -223, -413, -5, 2497, + -19, 1785, -46, -436, nil, -604, -22, nil, nil, 114, + -166, 46, -243, -438, 909, -371, nil, 1340, 101, 68, + 70, -96, nil, 14, 19, -304, 460, 2798, -299, 43, + -60, -3, nil, 36, -286, -82, -15, nil, 17, 100, + 1143, -200, -6, -496, -27, 13, -360, -271, -466, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 77, nil, + 204, -195, -63, nil, nil, nil, -303, -688, nil, -634, + nil, nil, nil, -338, nil, 83, nil, -218, -4, nil, + nil, -552, 82, -230, 99, 100, -183, 101, 102, -425, + -425, -703, -203, -212, -422, -704, nil, nil, nil, nil, + nil, nil, -798, -489, -541, -796, -724, -653, nil, -127, + -546, 105, 183, -652, 185, -752, -577, -611, nil, -702, + -778, -873, -847, -209, -587, 96, -414, -231, -12, -211, + nil, -92, -90, nil, -496, -543, nil, -300, -794, -370, + -517, -643, nil, nil, 123, -17, 121, 125, 125, -289, + -200, 130, 131, 131, -559, -400, -398, nil, nil, 141, + -347, -223, nil, nil, 101, -529, -285, -589, 197, -523, + -725, nil, -714, -882, nil, nil, -138, -451 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 308, 7, 359, 311, + nil, nil, nil, nil, 559, nil, nil, nil, nil, 307, + 309, nil, nil, nil, nil, 14, 15, 21, 241, nil, + nil, 17, nil, 441, 242, 339, nil, nil, 591, 240, + 477, 24, nil, nil, 354, nil, 25, 26, 27, nil, + 721, nil, nil, nil, 328, nil, 28, 325, 456, 35, + nil, nil, 37, 40, 39, nil, 237, 238, 371, nil, + 146, 464, 145, 91, nil, 446, 107, 47, 50, 273, + 299, nil, 457, nil, 458, 469, 679, 521, 297, 282, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, + nil, nil, 283, 65, 66, 67, nil, nil, 68, 862, + 69, 70, 71, nil, 72, nil, 73, nil, 572, 74, + 75, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 287, 275, 729, 853, + 581, 863, 786, 619, nil, 787, 788, 1021, 921, 607, + nil, 608, nil, nil, 609, nil, 611, nil, 832, nil, + nil, nil, 617, nil, nil, nil, nil, nil, nil, nil, + 468, nil, nil, 699, nil, nil, 509, nil, nil, nil, + nil, nil, 90, 92, 94, nil, nil, nil, nil, nil, + 637, nil, nil, nil, nil, nil, nil, 103, 104, nil, + nil, 892, 768, 606, nil, 610, 900, 622, 624, 625, + 932, 628, 629, 933, 632, 635, nil, 302 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 149, :_reduce_1, + 2, 147, :_reduce_2, + 2, 148, :_reduce_3, + 1, 150, :_reduce_none, + 1, 150, :_reduce_none, + 3, 150, :_reduce_6, + 2, 150, :_reduce_none, + 1, 153, :_reduce_none, + 0, 157, :_reduce_9, + 3, 153, :_reduce_10, + 0, 159, :_reduce_11, + 4, 156, :_reduce_12, + 0, 164, :_reduce_13, + 6, 158, :_reduce_14, + 3, 158, :_reduce_15, + 2, 160, :_reduce_16, + 1, 165, :_reduce_none, + 1, 165, :_reduce_none, + 3, 165, :_reduce_19, + 2, 165, :_reduce_20, + 1, 166, :_reduce_none, + 0, 167, :_reduce_22, + 3, 166, :_reduce_23, + 0, 178, :_reduce_24, + 4, 155, :_reduce_25, + 3, 155, :_reduce_26, + 3, 155, :_reduce_27, + 3, 155, :_reduce_28, + 2, 155, :_reduce_29, + 3, 155, :_reduce_30, + 3, 155, :_reduce_31, + 3, 155, :_reduce_32, + 3, 155, :_reduce_33, + 3, 155, :_reduce_34, + 4, 155, :_reduce_35, + 1, 155, :_reduce_none, + 3, 155, :_reduce_37, + 3, 155, :_reduce_38, + 3, 155, :_reduce_39, + 1, 155, :_reduce_none, + 3, 171, :_reduce_41, + 3, 171, :_reduce_42, + 6, 171, :_reduce_43, + 5, 171, :_reduce_44, + 5, 171, :_reduce_45, + 5, 171, :_reduce_46, + 5, 171, :_reduce_47, + 3, 171, :_reduce_48, + 1, 179, :_reduce_49, + 1, 179, :_reduce_none, + 1, 177, :_reduce_none, + 3, 177, :_reduce_52, + 3, 177, :_reduce_53, + 3, 177, :_reduce_54, + 2, 177, :_reduce_55, + 1, 177, :_reduce_none, + 1, 170, :_reduce_57, + 0, 190, :_reduce_58, + 0, 191, :_reduce_59, + 4, 188, :_reduce_60, + 1, 173, :_reduce_none, + 1, 173, :_reduce_none, + 1, 193, :_reduce_none, + 4, 193, :_reduce_64, + 0, 201, :_reduce_65, + 4, 198, :_reduce_66, + 1, 200, :_reduce_67, + 2, 192, :_reduce_68, + 3, 192, :_reduce_69, + 4, 192, :_reduce_70, + 5, 192, :_reduce_71, + 4, 192, :_reduce_72, + 5, 192, :_reduce_73, + 2, 192, :_reduce_74, + 2, 192, :_reduce_75, + 2, 192, :_reduce_76, + 2, 192, :_reduce_77, + 2, 192, :_reduce_78, + 1, 172, :_reduce_none, + 3, 172, :_reduce_80, + 1, 206, :_reduce_none, + 3, 206, :_reduce_82, + 1, 205, :_reduce_83, + 2, 205, :_reduce_84, + 3, 205, :_reduce_85, + 5, 205, :_reduce_86, + 2, 205, :_reduce_87, + 4, 205, :_reduce_88, + 2, 205, :_reduce_89, + 4, 205, :_reduce_90, + 1, 205, :_reduce_91, + 3, 205, :_reduce_92, + 1, 209, :_reduce_none, + 3, 209, :_reduce_94, + 2, 208, :_reduce_95, + 3, 208, :_reduce_96, + 1, 211, :_reduce_97, + 3, 211, :_reduce_98, + 1, 210, :_reduce_99, + 1, 210, :_reduce_100, + 4, 210, :_reduce_101, + 3, 210, :_reduce_102, + 3, 210, :_reduce_103, + 3, 210, :_reduce_104, + 3, 210, :_reduce_105, + 2, 210, :_reduce_106, + 1, 210, :_reduce_107, + 1, 174, :_reduce_108, + 1, 174, :_reduce_109, + 4, 174, :_reduce_110, + 3, 174, :_reduce_111, + 3, 174, :_reduce_112, + 3, 174, :_reduce_113, + 3, 174, :_reduce_114, + 2, 174, :_reduce_115, + 1, 174, :_reduce_116, + 1, 214, :_reduce_117, + 1, 214, :_reduce_none, + 2, 215, :_reduce_119, + 1, 215, :_reduce_120, + 3, 215, :_reduce_121, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_125, + 1, 216, :_reduce_none, + 1, 168, :_reduce_127, + 1, 168, :_reduce_none, + 1, 169, :_reduce_129, + 0, 220, :_reduce_130, + 4, 169, :_reduce_131, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 3, 187, :_reduce_203, + 3, 187, :_reduce_204, + 6, 187, :_reduce_205, + 5, 187, :_reduce_206, + 5, 187, :_reduce_207, + 5, 187, :_reduce_208, + 5, 187, :_reduce_209, + 4, 187, :_reduce_210, + 3, 187, :_reduce_211, + 3, 187, :_reduce_212, + 3, 187, :_reduce_213, + 3, 187, :_reduce_214, + 3, 187, :_reduce_215, + 3, 187, :_reduce_216, + 3, 187, :_reduce_217, + 3, 187, :_reduce_218, + 3, 187, :_reduce_219, + 4, 187, :_reduce_220, + 2, 187, :_reduce_221, + 2, 187, :_reduce_222, + 3, 187, :_reduce_223, + 3, 187, :_reduce_224, + 3, 187, :_reduce_225, + 3, 187, :_reduce_226, + 1, 187, :_reduce_none, + 3, 187, :_reduce_228, + 3, 187, :_reduce_229, + 3, 187, :_reduce_230, + 3, 187, :_reduce_231, + 3, 187, :_reduce_232, + 2, 187, :_reduce_233, + 2, 187, :_reduce_234, + 3, 187, :_reduce_235, + 3, 187, :_reduce_236, + 3, 187, :_reduce_237, + 3, 187, :_reduce_238, + 3, 187, :_reduce_239, + 6, 187, :_reduce_240, + 1, 187, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 3, 223, :_reduce_246, + 3, 223, :_reduce_247, + 1, 226, :_reduce_248, + 1, 227, :_reduce_none, + 2, 227, :_reduce_250, + 4, 227, :_reduce_251, + 2, 227, :_reduce_252, + 1, 221, :_reduce_none, + 3, 221, :_reduce_254, + 3, 231, :_reduce_255, + 1, 232, :_reduce_none, + 1, 232, :_reduce_none, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 2, 182, :_reduce_260, + 4, 182, :_reduce_261, + 2, 182, :_reduce_262, + 1, 204, :_reduce_263, + 2, 204, :_reduce_264, + 2, 204, :_reduce_265, + 4, 204, :_reduce_266, + 1, 204, :_reduce_267, + 0, 235, :_reduce_268, + 2, 197, :_reduce_269, + 2, 234, :_reduce_270, + 2, 233, :_reduce_271, + 1, 233, :_reduce_none, + 1, 228, :_reduce_273, + 2, 228, :_reduce_274, + 3, 228, :_reduce_275, + 4, 228, :_reduce_276, + 1, 176, :_reduce_277, + 1, 176, :_reduce_278, + 3, 175, :_reduce_279, + 4, 175, :_reduce_280, + 2, 175, :_reduce_281, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_292, + 0, 270, :_reduce_293, + 4, 224, :_reduce_294, + 0, 271, :_reduce_295, + 3, 224, :_reduce_296, + 0, 272, :_reduce_297, + 4, 224, :_reduce_298, + 3, 224, :_reduce_299, + 3, 224, :_reduce_300, + 2, 224, :_reduce_301, + 0, 273, :_reduce_302, + 4, 224, :_reduce_303, + 0, 274, :_reduce_304, + 4, 224, :_reduce_305, + 1, 224, :_reduce_306, + 4, 224, :_reduce_307, + 3, 224, :_reduce_308, + 1, 224, :_reduce_309, + 5, 224, :_reduce_310, + 4, 224, :_reduce_311, + 3, 224, :_reduce_312, + 2, 224, :_reduce_313, + 1, 224, :_reduce_none, + 2, 224, :_reduce_315, + 1, 224, :_reduce_316, + 6, 224, :_reduce_317, + 6, 224, :_reduce_318, + 4, 224, :_reduce_319, + 4, 224, :_reduce_320, + 5, 224, :_reduce_321, + 4, 224, :_reduce_322, + 6, 224, :_reduce_323, + 0, 275, :_reduce_324, + 6, 224, :_reduce_325, + 0, 276, :_reduce_326, + 0, 277, :_reduce_327, + 8, 224, :_reduce_328, + 0, 278, :_reduce_329, + 5, 224, :_reduce_330, + 0, 279, :_reduce_331, + 6, 224, :_reduce_332, + 0, 280, :_reduce_333, + 0, 281, :_reduce_334, + 9, 224, :_reduce_335, + 1, 224, :_reduce_336, + 1, 224, :_reduce_337, + 1, 224, :_reduce_338, + 1, 224, :_reduce_339, + 1, 181, :_reduce_340, + 1, 245, :_reduce_none, + 1, 251, :_reduce_none, + 1, 254, :_reduce_none, + 1, 256, :_reduce_none, + 1, 257, :_reduce_none, + 1, 258, :_reduce_none, + 1, 260, :_reduce_none, + 1, 262, :_reduce_348, + 1, 265, :_reduce_349, + 1, 266, :_reduce_350, + 1, 282, :_reduce_none, + 1, 283, :_reduce_none, + 1, 284, :_reduce_none, + 1, 285, :_reduce_none, + 1, 286, :_reduce_none, + 1, 162, :_reduce_none, + 1, 287, :_reduce_none, + 1, 246, :_reduce_none, + 1, 203, :_reduce_none, + 1, 252, :_reduce_none, + 1, 252, :_reduce_none, + 2, 252, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 253, :_reduce_none, + 5, 253, :_reduce_366, + 1, 255, :_reduce_none, + 2, 255, :_reduce_368, + 1, 261, :_reduce_none, + 1, 261, :_reduce_370, + 1, 288, :_reduce_none, + 3, 288, :_reduce_372, + 1, 291, :_reduce_373, + 3, 291, :_reduce_374, + 1, 290, :_reduce_375, + 3, 290, :_reduce_376, + 5, 290, :_reduce_377, + 1, 290, :_reduce_378, + 3, 290, :_reduce_379, + 2, 292, :_reduce_380, + 1, 292, :_reduce_381, + 4, 293, :_reduce_382, + 2, 293, :_reduce_383, + 2, 293, :_reduce_384, + 1, 293, :_reduce_385, + 2, 298, :_reduce_386, + 1, 298, :_reduce_none, + 6, 299, :_reduce_388, + 8, 299, :_reduce_389, + 4, 299, :_reduce_390, + 6, 299, :_reduce_391, + 4, 299, :_reduce_392, + 2, 299, :_reduce_393, + 6, 299, :_reduce_394, + 2, 299, :_reduce_395, + 4, 299, :_reduce_396, + 6, 299, :_reduce_397, + 2, 299, :_reduce_398, + 4, 299, :_reduce_399, + 2, 299, :_reduce_400, + 4, 299, :_reduce_401, + 1, 299, :_reduce_402, + 1, 303, :_reduce_403, + 1, 303, :_reduce_404, + 3, 304, :_reduce_405, + 1, 304, :_reduce_406, + 4, 304, :_reduce_407, + 1, 305, :_reduce_none, + 4, 305, :_reduce_409, + 1, 306, :_reduce_410, + 3, 306, :_reduce_411, + 1, 307, :_reduce_412, + 1, 307, :_reduce_none, + 0, 311, :_reduce_414, + 0, 312, :_reduce_415, + 5, 250, :_reduce_416, + 4, 309, :_reduce_417, + 1, 309, :_reduce_418, + 3, 310, :_reduce_419, + 3, 310, :_reduce_420, + 3, 314, :_reduce_421, + 2, 194, :_reduce_422, + 4, 194, :_reduce_423, + 5, 194, :_reduce_424, + 5, 194, :_reduce_425, + 2, 249, :_reduce_426, + 4, 249, :_reduce_427, + 4, 249, :_reduce_428, + 3, 249, :_reduce_429, + 3, 249, :_reduce_430, + 3, 249, :_reduce_431, + 2, 249, :_reduce_432, + 1, 249, :_reduce_433, + 4, 249, :_reduce_434, + 0, 317, :_reduce_435, + 4, 248, :_reduce_436, + 0, 318, :_reduce_437, + 4, 248, :_reduce_438, + 0, 319, :_reduce_439, + 0, 320, :_reduce_440, + 4, 199, :_reduce_441, + 0, 322, :_reduce_442, + 0, 323, :_reduce_443, + 4, 315, :_reduce_444, + 1, 321, :_reduce_445, + 2, 321, :_reduce_446, + 3, 321, :_reduce_447, + 4, 321, :_reduce_448, + 0, 325, :_reduce_449, + 6, 259, :_reduce_450, + 1, 324, :_reduce_none, + 1, 324, :_reduce_none, + 6, 161, :_reduce_453, + 0, 161, :_reduce_454, + 1, 326, :_reduce_455, + 1, 326, :_reduce_none, + 1, 326, :_reduce_none, + 2, 327, :_reduce_458, + 1, 327, :_reduce_none, + 2, 163, :_reduce_460, + 1, 163, :_reduce_none, + 1, 236, :_reduce_462, + 1, 236, :_reduce_none, + 1, 237, :_reduce_464, + 1, 329, :_reduce_465, + 1, 329, :_reduce_none, + 2, 329, :_reduce_467, + 3, 330, :_reduce_468, + 1, 330, :_reduce_469, + 3, 238, :_reduce_470, + 3, 239, :_reduce_471, + 3, 240, :_reduce_472, + 3, 240, :_reduce_473, + 1, 334, :_reduce_474, + 3, 334, :_reduce_475, + 1, 335, :_reduce_none, + 2, 335, :_reduce_477, + 3, 242, :_reduce_478, + 3, 242, :_reduce_479, + 1, 337, :_reduce_480, + 3, 337, :_reduce_481, + 3, 241, :_reduce_482, + 3, 241, :_reduce_483, + 3, 243, :_reduce_484, + 3, 243, :_reduce_485, + 1, 338, :_reduce_486, + 3, 338, :_reduce_487, + 1, 339, :_reduce_488, + 3, 339, :_reduce_489, + 1, 331, :_reduce_490, + 2, 331, :_reduce_491, + 1, 332, :_reduce_492, + 2, 332, :_reduce_493, + 1, 333, :_reduce_494, + 2, 333, :_reduce_495, + 1, 336, :_reduce_496, + 0, 341, :_reduce_497, + 3, 336, :_reduce_498, + 0, 342, :_reduce_499, + 4, 336, :_reduce_500, + 1, 340, :_reduce_501, + 1, 340, :_reduce_502, + 1, 340, :_reduce_503, + 1, 340, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 2, 343, :_reduce_507, + 1, 343, :_reduce_508, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 1, 345, :_reduce_none, + 3, 344, :_reduce_513, + 1, 328, :_reduce_none, + 2, 328, :_reduce_515, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 213, :_reduce_525, + 1, 213, :_reduce_526, + 1, 213, :_reduce_527, + 1, 213, :_reduce_528, + 1, 213, :_reduce_529, + 1, 213, :_reduce_530, + 1, 213, :_reduce_531, + 1, 244, :_reduce_532, + 1, 244, :_reduce_533, + 1, 180, :_reduce_534, + 1, 180, :_reduce_535, + 1, 185, :_reduce_536, + 1, 185, :_reduce_537, + 0, 346, :_reduce_538, + 4, 263, :_reduce_539, + 1, 263, :_reduce_540, + 3, 267, :_reduce_541, + 0, 348, :_reduce_542, + 3, 267, :_reduce_543, + 4, 347, :_reduce_544, + 2, 347, :_reduce_545, + 2, 347, :_reduce_546, + 1, 347, :_reduce_none, + 2, 350, :_reduce_548, + 0, 350, :_reduce_549, + 6, 313, :_reduce_550, + 8, 313, :_reduce_551, + 4, 313, :_reduce_552, + 6, 313, :_reduce_553, + 4, 313, :_reduce_554, + 6, 313, :_reduce_555, + 2, 313, :_reduce_556, + 4, 313, :_reduce_557, + 6, 313, :_reduce_558, + 2, 313, :_reduce_559, + 4, 313, :_reduce_560, + 2, 313, :_reduce_561, + 4, 313, :_reduce_562, + 1, 313, :_reduce_563, + 0, 313, :_reduce_564, + 1, 308, :_reduce_565, + 1, 308, :_reduce_566, + 1, 308, :_reduce_567, + 1, 308, :_reduce_568, + 1, 289, :_reduce_none, + 1, 289, :_reduce_570, + 1, 352, :_reduce_none, + 1, 353, :_reduce_none, + 3, 353, :_reduce_573, + 1, 300, :_reduce_574, + 3, 300, :_reduce_575, + 1, 354, :_reduce_none, + 2, 355, :_reduce_577, + 1, 355, :_reduce_578, + 2, 356, :_reduce_579, + 1, 356, :_reduce_580, + 1, 294, :_reduce_none, + 3, 294, :_reduce_582, + 1, 349, :_reduce_none, + 3, 349, :_reduce_584, + 1, 357, :_reduce_none, + 1, 357, :_reduce_none, + 2, 295, :_reduce_587, + 1, 295, :_reduce_588, + 3, 358, :_reduce_589, + 3, 359, :_reduce_590, + 1, 301, :_reduce_591, + 3, 301, :_reduce_592, + 1, 351, :_reduce_593, + 3, 351, :_reduce_594, + 1, 360, :_reduce_none, + 1, 360, :_reduce_none, + 2, 302, :_reduce_597, + 1, 302, :_reduce_598, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 2, 297, :_reduce_601, + 2, 296, :_reduce_602, + 0, 296, :_reduce_603, + 1, 268, :_reduce_none, + 0, 362, :_reduce_605, + 4, 268, :_reduce_606, + 1, 247, :_reduce_607, + 2, 247, :_reduce_none, + 1, 230, :_reduce_none, + 3, 230, :_reduce_610, + 3, 363, :_reduce_611, + 2, 363, :_reduce_612, + 4, 363, :_reduce_613, + 2, 363, :_reduce_614, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 1, 316, :_reduce_none, + 1, 316, :_reduce_none, + 1, 316, :_reduce_none, + 1, 269, :_reduce_none, + 1, 269, :_reduce_none, + 1, 184, :_reduce_none, + 1, 195, :_reduce_none, + 1, 195, :_reduce_none, + 0, 151, :_reduce_none, + 1, 151, :_reduce_none, + 0, 186, :_reduce_none, + 1, 186, :_reduce_none, + 2, 207, :_reduce_634, + 2, 183, :_reduce_635, + 0, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 264, :_reduce_639, + 1, 264, :_reduce_none, + 1, 154, :_reduce_none, + 2, 154, :_reduce_642, + 0, 152, :_reduce_643 ] + +racc_reduce_n = 644 + +racc_shift_n = 1088 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLOWEST => 142, + :tEQL => 143, + :tBDOT2 => 144, + :tBDOT3 => 145 } + +racc_nt_base = 146 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLOWEST", + "tEQL", + "tBDOT2", + "tBDOT3", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "@3", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@4", + "stmts", + "stmt_or_begin", + "@5", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@6", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@7", + "@8", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@9", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@10", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@11", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "dot_or_colon", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "@23", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@24", + "@25", + "f_args", + "do_block", + "do_body", + "operation3", + "@26", + "@27", + "@28", + "@29", + "case_args", + "@30", + "@31", + "cases", + "@32", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "@34", + "ssym", + "dsym", + "sym", + "@35", + "args_tail", + "@36", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@37", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_12(val, _values, result) + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_13(val, _values, result) + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + + result +end + +def _reduce_14(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_15(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_16(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 17 omitted + +# reduce 18 omitted + +def _reduce_19(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_20(val, _values, result) + result = val[1] + debug 12 + + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_23(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_24(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_25(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_27(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_28(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_29(val, _values, result) + result = val[1] + + result +end + +def _reduce_30(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_31(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_33(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_34(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_35(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_38(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_49(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +# reduce 50 omitted + +# reduce 51 omitted + +def _reduce_52(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_53(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_54(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_55(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_58(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_59(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_60(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 61 omitted + +# reduce 62 omitted + +# reduce 63 omitted + +def _reduce_64(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_65(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_66(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_67(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_68(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_69(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_70(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_71(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_72(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_73(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_74(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_75(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_76(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_77(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_78(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 79 omitted + +def _reduce_80(val, _values, result) + result = val[1] + + result +end + +# reduce 81 omitted + +def _reduce_82(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_83(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_84(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_85(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_86(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_87(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_88(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_89(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_90(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_91(val, _values, result) + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_92(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 93 omitted + +def _reduce_94(val, _values, result) + result = val[1] + + result +end + +def _reduce_95(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_96(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_97(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_98(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_99(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_100(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_101(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_102(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_103(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_104(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_105(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_106(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_107(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_108(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_109(val, _values, result) + var, = val + + result = self.assignable var + + debug 16 + + result +end + +def _reduce_110(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_111(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_112(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_113(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_114(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_115(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_116(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_117(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 118 omitted + +def _reduce_119(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_120(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_121(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +def _reduce_125(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 126 omitted + +def _reduce_127(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 128 omitted + +def _reduce_129(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_130(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_131(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +def _reduce_203(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_204(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_205(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_206(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_207(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_208(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_209(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_210(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_211(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_212(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_213(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_214(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_215(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_220(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_221(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_222(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_223(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 227 omitted + +def _reduce_228(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_231(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_232(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_233(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_234(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_235(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_236(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_238(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_239(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_240(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +# reduce 241 omitted + +# reduce 242 omitted + +# reduce 243 omitted + +# reduce 244 omitted + +# reduce 245 omitted + +def _reduce_246(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_247(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_248(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 249 omitted + +def _reduce_250(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_251(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_252(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 253 omitted + +def _reduce_254(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_255(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +# reduce 256 omitted + +# reduce 257 omitted + +# reduce 258 omitted + +# reduce 259 omitted + +def _reduce_260(val, _values, result) + result = args val + + result +end + +def _reduce_261(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_262(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_263(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_264(val, _values, result) + result = call_args val + + result +end + +def _reduce_265(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_266(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_267(val, _values, result) + result = call_args val + + result +end + +def _reduce_268(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_269(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_270(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_271(val, _values, result) + result = val[1] + + result +end + +# reduce 272 omitted + +def _reduce_273(val, _values, result) + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + + result +end + +def _reduce_274(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_275(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_276(val, _values, result) + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_277(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_278(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_279(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_280(val, _values, result) + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_281(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 282 omitted + +# reduce 283 omitted + +# reduce 284 omitted + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +# reduce 290 omitted + +# reduce 291 omitted + +def _reduce_292(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_293(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_294(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_295(val, _values, result) + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + + result +end + +def _reduce_296(val, _values, result) + _, line, _ = val + result = s(:begin).line line + + result +end + +def _reduce_297(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_298(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_299(val, _values, result) + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + + result +end + +def _reduce_300(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_301(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_302(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_303(val, _values, result) + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_304(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_305(val, _values, result) + result = new_hash val + + result +end + +def _reduce_306(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_307(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_308(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_309(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_310(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_311(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_312(val, _values, result) + debug 20 + + result +end + +def _reduce_313(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 314 omitted + +def _reduce_315(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_316(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_317(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_318(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_319(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_320(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_321(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_322(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_323(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_324(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_325(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_326(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_327(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_328(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_329(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_330(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_331(val, _values, result) + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result +end + +def _reduce_332(val, _values, result) + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_333(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_334(val, _values, result) + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + + result +end + +def _reduce_335(val, _values, result) + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_336(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_337(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_338(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_339(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_340(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 341 omitted + +# reduce 342 omitted + +# reduce 343 omitted + +# reduce 344 omitted + +# reduce 345 omitted + +# reduce 346 omitted + +# reduce 347 omitted + +def _reduce_348(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_349(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_350(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +# reduce 351 omitted + +# reduce 352 omitted + +# reduce 353 omitted + +# reduce 354 omitted + +# reduce 355 omitted + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +# reduce 360 omitted + +# reduce 361 omitted + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +def _reduce_366(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 367 omitted + +def _reduce_368(val, _values, result) + result = val[1] + + result +end + +# reduce 369 omitted + +def _reduce_370(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = val[1] + + result +end + +def _reduce_373(val, _values, result) + sym, = val + + result = s(:array, sym).line lexer.lineno + + result +end + +def _reduce_374(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_375(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_376(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_377(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_378(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_379(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_380(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_381(val, _values, result) + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + + result +end + +def _reduce_382(val, _values, result) + result = call_args val + + result +end + +def _reduce_383(val, _values, result) + result = call_args val + + result +end + +def _reduce_384(val, _values, result) + result = call_args val + + result +end + +def _reduce_385(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_386(val, _values, result) + result = args val + + result +end + +# reduce 387 omitted + +def _reduce_388(val, _values, result) + result = args val + + result +end + +def _reduce_389(val, _values, result) + result = args val + + result +end + +def _reduce_390(val, _values, result) + result = args val + + result +end + +def _reduce_391(val, _values, result) + result = args val + + result +end + +def _reduce_392(val, _values, result) + result = args val + + result +end + +def _reduce_393(val, _values, result) + result = args(val) << nil + + result +end + +def _reduce_394(val, _values, result) + result = args val + + result +end + +def _reduce_395(val, _values, result) + result = args val + + result +end + +def _reduce_396(val, _values, result) + result = args val + + result +end + +def _reduce_397(val, _values, result) + result = args val + + result +end + +def _reduce_398(val, _values, result) + result = args val + + result +end + +def _reduce_399(val, _values, result) + result = args val + + result +end + +def _reduce_400(val, _values, result) + result = args val + + result +end + +def _reduce_401(val, _values, result) + result = args val + + result +end + +def _reduce_402(val, _values, result) + result = args val + + result +end + +def _reduce_403(val, _values, result) + result = 0 + result +end + +def _reduce_404(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_405(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +def _reduce_406(val, _values, result) + result = s(:args).line lexer.lineno + + result +end + +def _reduce_407(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +# reduce 408 omitted + +def _reduce_409(val, _values, result) + result = args val + + result +end + +def _reduce_410(val, _values, result) + result = args val + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +def _reduce_412(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 413 omitted + +def _reduce_414(val, _values, result) + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_415(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_416(val, _values, result) + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_417(val, _values, result) + result = args val + + result +end + +def _reduce_418(val, _values, result) + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_419(val, _values, result) + result = val[1] + + result +end + +def _reduce_420(val, _values, result) + result = val[1] + + result +end + +def _reduce_421(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_422(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_423(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_424(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_425(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_426(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_427(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_428(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_429(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_430(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_431(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_432(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_433(val, _values, result) + result = s(:zsuper).line lexer.lineno + + result +end + +def _reduce_434(val, _values, result) + result = new_aref val + + result +end + +def _reduce_435(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_436(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_437(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_438(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_439(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_440(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_441(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_442(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_443(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_444(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_445(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_446(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_447(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_448(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_449(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_450(val, _values, result) + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + + result +end + +# reduce 451 omitted + +# reduce 452 omitted + +def _reduce_453(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_454(val, _values, result) + result = nil + + result +end + +def _reduce_455(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 456 omitted + +# reduce 457 omitted + +def _reduce_458(val, _values, result) + result = val[1] + + result +end + +# reduce 459 omitted + +def _reduce_460(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 461 omitted + +def _reduce_462(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 463 omitted + +def _reduce_464(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_465(val, _values, result) + debug 37 + + result +end + +# reduce 466 omitted + +def _reduce_467(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_468(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_469(val, _values, result) + result = new_string val + + result +end + +def _reduce_470(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_471(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_472(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_473(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_474(val, _values, result) + result = new_word_list + + result +end + +def _reduce_475(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 476 omitted + +def _reduce_477(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_478(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_479(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_480(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_481(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_482(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_483(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_484(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_485(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_486(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_487(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_488(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_489(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_490(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_491(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_492(val, _values, result) + result = nil + + result +end + +def _reduce_493(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_494(val, _values, result) + result = nil + + result +end + +def _reduce_495(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_496(val, _values, result) + result = new_string val + + result +end + +def _reduce_497(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_498(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_499(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_500(val, _values, result) + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_501(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_502(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_503(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 504 omitted + +# reduce 505 omitted + +# reduce 506 omitted + +def _reduce_507(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_508(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 509 omitted + +# reduce 510 omitted + +# reduce 511 omitted + +# reduce 512 omitted + +def _reduce_513(val, _values, result) + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + + result +end + +# reduce 514 omitted + +def _reduce_515(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 516 omitted + +# reduce 517 omitted + +# reduce 518 omitted + +# reduce 519 omitted + +# reduce 520 omitted + +# reduce 521 omitted + +# reduce 522 omitted + +# reduce 523 omitted + +# reduce 524 omitted + +def _reduce_525(val, _values, result) + result = s(:nil).line lexer.lineno + result +end + +def _reduce_526(val, _values, result) + result = s(:self).line lexer.lineno + result +end + +def _reduce_527(val, _values, result) + result = s(:true).line lexer.lineno + result +end + +def _reduce_528(val, _values, result) + result = s(:false).line lexer.lineno + result +end + +def _reduce_529(val, _values, result) + result = s(:str, self.file).line lexer.lineno + result +end + +def _reduce_530(val, _values, result) + result = s(:lit, lexer.lineno).line lexer.lineno + result +end + +def _reduce_531(val, _values, result) + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_532(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + + result +end + +def _reduce_533(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_534(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_535(val, _values, result) + result = self.assignable val[0] + debug 40 + + result +end + +def _reduce_536(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_537(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_538(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_539(val, _values, result) + result = val[2] + + result +end + +def _reduce_540(val, _values, result) + result = nil + + result +end + +def _reduce_541(val, _values, result) + result = end_args val + + result +end + +def _reduce_542(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_543(val, _values, result) + result = end_args val + + result +end + +def _reduce_544(val, _values, result) + result = args val + + result +end + +def _reduce_545(val, _values, result) + result = args val + + result +end + +def _reduce_546(val, _values, result) + result = args val + + result +end + +# reduce 547 omitted + +def _reduce_548(val, _values, result) + result = val[1] + + result +end + +def _reduce_549(val, _values, result) + result = nil + + result +end + +def _reduce_550(val, _values, result) + result = args val + + result +end + +def _reduce_551(val, _values, result) + result = args val + + result +end + +def _reduce_552(val, _values, result) + result = args val + + result +end + +def _reduce_553(val, _values, result) + result = args val + + result +end + +def _reduce_554(val, _values, result) + result = args val + + result +end + +def _reduce_555(val, _values, result) + result = args val + + result +end + +def _reduce_556(val, _values, result) + result = args val + + result +end + +def _reduce_557(val, _values, result) + result = args val + + result +end + +def _reduce_558(val, _values, result) + result = args val + + result +end + +def _reduce_559(val, _values, result) + result = args val + + result +end + +def _reduce_560(val, _values, result) + result = args val + + result +end + +def _reduce_561(val, _values, result) + result = args val + + result +end + +def _reduce_562(val, _values, result) + result = args val + + result +end + +def _reduce_563(val, _values, result) + result = args val + + result +end + +def _reduce_564(val, _values, result) + result = args val + # result.line lexer.lineno + + result +end + +def _reduce_565(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_566(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_567(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_568(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 571 omitted + +# reduce 572 omitted + +def _reduce_573(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_574(val, _values, result) + result = new_arg val + + result +end + +def _reduce_575(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +# reduce 576 omitted + +def _reduce_577(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_578(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_579(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_580(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 581 omitted + +def _reduce_582(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 583 omitted + +def _reduce_584(val, _values, result) + result = args val + + result +end + +# reduce 585 omitted + +# reduce 586 omitted + +def _reduce_587(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_588(val, _values, result) + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + + result +end + +def _reduce_589(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + + result +end + +def _reduce_590(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + + result +end + +def _reduce_591(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_592(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_593(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_594(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 595 omitted + +# reduce 596 omitted + +def _reduce_597(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_598(val, _values, result) + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + + result +end + +# reduce 599 omitted + +# reduce 600 omitted + +def _reduce_601(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_602(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_603(val, _values, result) + result = nil + + result +end + +# reduce 604 omitted + +def _reduce_605(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_606(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_607(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 608 omitted + +# reduce 609 omitted + +def _reduce_610(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_611(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_612(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_613(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_614(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 615 omitted + +# reduce 616 omitted + +# reduce 617 omitted + +# reduce 618 omitted + +# reduce 619 omitted + +# reduce 620 omitted + +# reduce 621 omitted + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +# reduce 626 omitted + +# reduce 627 omitted + +# reduce 628 omitted + +# reduce 629 omitted + +# reduce 630 omitted + +# reduce 631 omitted + +# reduce 632 omitted + +# reduce 633 omitted + +def _reduce_634(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_635(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 636 omitted + +# reduce 637 omitted + +# reduce 638 omitted + +def _reduce_639(val, _values, result) + yyerrok + result +end + +# reduce 640 omitted + +# reduce 641 omitted + +def _reduce_642(val, _values, result) + yyerrok + result +end + +def _reduce_643(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby22Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby22_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby22_parser.y new file mode 100644 index 000000000..7d7b53c2d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby22_parser.y @@ -0,0 +1,2735 @@ +# -*- racc -*- + +class Ruby22Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + compstmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + + f_opt: f_arg_asgn tEQL arg_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + + f_block_opt: f_arg_asgn tEQL primary_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby23_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby23_parser.rb new file mode 100644 index 000000000..bc73413cd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby23_parser.rb @@ -0,0 +1,11163 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby23Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -520, 639, 574, 224, 225, -108, -94, -520, -520, -520, + -109, 574, -520, -520, -520, -102, -520, -116, 574, 224, + 225, -80, 574, 655, -520, 285, -520, -520, -520, -115, + 234, -108, -534, 658, 3, -535, -520, -520, 230, -520, + -520, -520, -520, -520, -111, 280, 736, 224, 225, 735, + -109, 95, -104, -113, 574, 887, 747, -103, 736, 96, + 126, 738, 641, 640, 637, -110, 235, -520, -520, -520, + -520, -520, -520, -520, -520, -520, -520, -520, -520, -520, + -520, -116, -102, -520, -520, -520, 654, -520, -520, -108, + 282, -520, -109, 235, -520, -520, 657, -520, 285, -520, + 221, -520, 231, -520, -520, -520, -520, -520, -520, -520, + -99, -520, 287, -520, 222, -100, 130, -102, -115, -104, + -102, 129, -107, -618, -103, 130, -520, -520, -520, -520, + 129, -520, 130, -520, -106, -102, 130, 129, -520, -523, + -111, 129, -520, -113, -520, -108, -523, -523, -523, -102, + -108, -523, -523, -523, -104, -523, 130, -104, -104, -103, + 886, 129, -103, -523, -109, -523, -523, -523, 130, -109, + -101, 949, -104, 129, -110, -523, -523, -103, -523, -523, + -523, -523, -523, -112, -101, 287, -114, -112, 285, -114, + -520, 835, 224, 225, 835, -116, -523, -520, -530, 232, + -116, 224, 225, -523, 223, -530, -523, -523, -523, -523, + -523, -523, -523, -523, -523, -523, -523, -523, -523, -523, + 108, 109, -523, -523, -523, 834, -523, -523, 834, 852, + -523, 285, -115, -523, -523, 853, -523, -115, -523, 226, + -523, -107, -523, -523, -523, -523, -523, -523, -523, 483, + -523, -101, -523, -618, -111, -619, -116, -113, 639, -111, + 639, -618, -113, 275, -619, -523, -523, -523, -523, 232, + -523, -300, -523, 337, 553, 287, 826, -523, -300, -300, + -300, -523, 235, -523, -300, -300, -101, -300, -110, -101, + 624, 235, -103, -110, -105, -534, 282, -112, 110, 111, + -114, 627, -112, 827, -101, -114, -116, -300, -300, 675, + -300, -300, -300, -300, -300, 108, 109, -529, 287, 641, + 640, 641, 640, 338, -529, 639, -116, 130, 798, 235, + 800, -115, 129, -111, 635, 634, -615, -99, -300, -300, + -300, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, -108, 401, -300, -300, -300, 230, 681, 588, + -113, 676, -300, 589, 229, -300, -111, -616, 628, 866, + -300, 581, -300, 227, -300, -300, -300, -300, -300, -300, + -300, 624, -300, -340, -300, 404, 641, 640, 637, -520, + -340, -535, 627, 110, 111, 553, -520, -300, -300, -340, + -105, -615, -300, -622, 920, -520, 709, 813, 407, -300, + -622, -622, -622, -300, 410, -114, -622, -622, -113, -622, + -523, 231, -531, -615, 427, 635, 634, -523, -622, -531, + 639, 255, -616, -100, 230, 432, -523, -106, 639, -622, + -622, 480, -622, -622, -622, -622, -622, -340, -109, -532, + 481, -528, -115, -520, -616, -525, -532, 639, -528, 628, + 482, -110, -525, 252, -110, -532, 736, 254, 253, 738, + -622, -622, -622, -622, -622, -622, -622, -622, -622, -622, + -622, -622, -622, -622, -523, 484, -622, -622, -622, -533, + 682, 641, 640, 642, -622, 485, -533, -622, 231, 641, + 640, 647, -622, 639, -622, -533, -622, -622, -622, -622, + -622, -622, -622, -532, -622, -622, -622, 675, 641, 640, + 652, 234, 619, 514, 616, 615, 614, 624, 617, -622, + -622, 523, -103, -526, -622, 526, 230, -527, 627, 601, + -526, -622, -622, 546, -527, -622, 602, -112, 528, -622, + -622, -622, 544, -533, -622, -622, -622, 255, -622, -102, + 622, 272, 273, -79, 641, 640, 659, -622, -622, -622, + -622, 635, 634, 736, -111, -622, 738, 235, -622, -622, + 1047, -622, -622, -622, -622, -622, 130, 235, -291, 252, + 539, 129, 230, 254, 253, -291, 271, 270, 639, 556, + 231, 644, 130, 540, -291, 628, 547, 129, 481, -622, + -622, -622, -622, -622, -622, -622, -622, -622, -622, -622, + -622, -622, -622, 224, 225, -622, -622, -622, -622, 828, + -622, 862, 866, -622, 676, -622, -622, -622, 292, -622, + -618, -622, 235, -622, -622, -622, -622, -622, -622, -622, + -622, -622, -291, -622, -622, -622, 231, 282, 429, 641, + 640, 130, -622, 431, 430, 550, 129, 230, -622, -622, + -622, -622, 813, -622, 585, -622, -104, 130, 635, 634, + -622, -300, 129, 583, -622, 554, -112, 255, -300, -300, + -300, -113, -622, -300, -300, -300, 619, -300, 616, 615, + 614, 624, 617, 230, 862, 866, 130, -300, -300, -300, + 591, 129, 627, 235, -101, 581, 420, -300, -300, 593, + -300, -300, -300, -300, -300, 586, 587, 595, 646, -110, + 650, 231, 653, 656, 622, 605, 619, 663, 616, 615, + 614, -273, 617, 632, 631, 635, 634, 665, -300, -300, + -300, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, 666, 235, -300, -300, -300, 231, 829, -300, + 673, 674, -300, 282, 786, -300, -300, 686, -300, 628, + -300, 255, -300, 790, -300, -300, -300, -300, -300, -300, + -300, 255, -300, 255, -300, 619, 255, 616, 615, 614, + 624, 617, 133, 134, 135, 136, 137, -300, -300, -300, + -300, 627, -300, -300, -300, 693, 235, 235, 427, -300, + -300, -300, -300, -300, 235, -114, -300, -300, -94, -300, + 230, -301, 713, 622, 235, 559, 724, 669, -301, 729, + 732, -301, 632, 631, 635, 634, 667, -301, -301, -300, + -300, -300, -300, -300, -300, -300, -300, -301, -300, -300, + 235, 235, 740, -619, 528, 743, -300, -300, 732, 732, + 619, -619, 616, 615, 614, -300, 617, 581, 628, 732, + -300, -300, -300, -300, -300, -300, -300, -300, -300, -300, + -300, -300, -300, -300, 231, -301, -300, -300, -300, 768, + 681, 774, 777, 778, -300, -301, 780, -300, 786, 782, + 784, 255, -300, 793, -300, -300, -300, -300, -300, -300, + -300, -300, -300, -300, -300, 619, -300, 616, 615, 614, + 624, 617, 619, 794, 616, 615, 614, 795, 617, -300, + -300, 627, -300, 252, -300, -622, 801, 254, 253, 250, + 251, -300, -622, -622, -622, -300, 802, -114, -622, -622, + -274, -622, 230, 622, 133, 134, 135, 136, 137, 1031, + -622, 814, 632, 631, 635, 634, 230, 514, 593, 514, + 235, -622, -622, 1037, -622, -622, -622, -622, -622, 909, + 910, 230, 1035, 911, 124, 125, 831, 275, 1031, 840, + 619, 842, 616, 615, 614, 526, 617, 593, 628, 528, + 724, 235, -622, -622, -622, -622, -622, -622, -622, -622, + -622, -622, -622, -622, -622, -622, 231, 282, -622, -622, + -622, 619, 682, 616, 615, 614, -622, 617, 786, -622, + 231, 282, 724, 255, -622, 255, -622, 790, -622, -622, + -622, -622, -622, -622, -622, 231, -622, -622, -622, 265, + 266, 1012, 866, 616, 615, 614, 732, 617, 235, 786, + 235, -622, -622, 732, -622, 252, -622, 258, 790, 254, + 253, 250, 251, -622, -433, 235, 904, -622, 905, -112, + 235, -433, -433, -433, 914, -275, -433, -433, -433, 619, + -433, 616, 615, 614, 624, 617, 255, 235, 919, -433, + -433, -433, 936, 724, -273, 627, 941, 732, 732, 732, + -433, -433, 732, -433, -433, -433, -433, -433, 619, 732, + 616, 615, 614, 235, 617, 961, 235, 622, 252, 777, + 964, 966, 254, 253, 250, 251, 632, 631, 635, 634, + 968, -433, -433, -433, -433, -433, -433, -433, -433, -433, + -433, -433, -433, -433, -433, 970, 786, -433, -433, -433, + 970, 235, -433, 977, 282, -433, -276, 978, -433, -433, + 777, -433, 628, -433, 981, -433, 984, -433, -433, -433, + -433, -433, -433, -433, 986, -433, -433, -433, 619, 988, + 616, 615, 614, 624, 617, 133, 134, 135, 136, 137, + -433, -433, 235, -433, 627, -433, -309, 133, 134, 135, + 136, 137, -433, -309, -309, -309, -433, 990, -309, -309, + -309, 768, -309, 255, 1008, 619, 622, 616, 615, 614, + 1009, 617, -309, -309, 1018, 632, 631, 635, 634, 265, + 266, 1019, -309, -309, 1029, -309, -309, -309, -309, -309, + 1012, 1032, 616, 615, 614, 252, 617, 258, 852, 254, + 253, 250, 251, 786, 1038, 256, 732, 257, 1048, 970, + 970, 628, 970, -309, -309, -309, -309, -309, -309, -309, + -309, -309, -309, -309, -309, -309, -309, 777, 1055, -309, + -309, -309, 1057, 1059, -309, 1061, 292, -309, 1061, 729, + -309, -309, 732, -309, 1019, -309, -619, -309, -618, -309, + -309, -309, -309, -309, -309, -309, 235, -309, 970, -309, + 619, 1082, 616, 615, 614, 624, 617, 1061, 1061, 1061, + 1061, nil, -309, -309, nil, -309, 627, -309, -292, nil, + nil, nil, nil, nil, -309, -292, -292, -292, -309, nil, + -292, -292, -292, nil, -292, 255, nil, nil, 622, nil, + nil, nil, nil, nil, -292, -292, -292, 632, 631, 635, + 634, 265, 266, nil, -292, -292, nil, -292, -292, -292, + -292, -292, nil, nil, nil, nil, nil, 252, nil, 258, + nil, 254, 253, 250, 251, nil, nil, 256, nil, 257, + nil, nil, nil, 628, nil, -292, -292, -292, -292, -292, + -292, -292, -292, -292, -292, -292, -292, -292, -292, nil, + nil, -292, -292, -292, nil, nil, -292, nil, nil, -292, + nil, nil, -292, -292, nil, -292, nil, -292, nil, -292, + nil, -292, -292, -292, -292, -292, -292, -292, nil, -292, + nil, -292, 619, nil, 616, 615, 614, 624, 617, nil, + nil, nil, nil, nil, -292, -292, -292, -292, 627, -292, + -644, -292, nil, nil, nil, nil, -292, -644, -644, -644, + -292, nil, -644, -644, -644, nil, -644, 255, nil, nil, + 622, nil, nil, nil, nil, -644, -644, -644, nil, 632, + 631, 635, 634, 265, 266, nil, -644, -644, nil, -644, + -644, -644, -644, -644, nil, nil, nil, nil, nil, 252, + nil, 258, nil, 254, 253, 250, 251, 235, nil, nil, + nil, nil, nil, nil, nil, 628, nil, -644, -644, -644, + -644, -644, -644, -644, -644, -644, -644, -644, -644, -644, + -644, nil, nil, -644, -644, -644, nil, nil, -644, nil, + 282, -644, nil, nil, -644, -644, nil, -644, nil, -644, + nil, -644, nil, -644, -644, -644, -644, -644, -644, -644, + nil, -644, -644, -644, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, -644, -644, nil, -644, + 627, -644, -623, nil, nil, nil, nil, nil, -644, -623, + -623, -623, -644, nil, -623, -623, -623, nil, -623, 255, + nil, nil, 622, nil, nil, nil, nil, -623, -623, -623, + -623, 632, 631, 635, 634, 265, 266, nil, -623, -623, + nil, -623, -623, -623, -623, -623, nil, nil, nil, nil, + nil, 252, nil, nil, nil, 254, 253, 250, 251, nil, + nil, nil, nil, nil, nil, nil, nil, 628, nil, -623, + -623, -623, -623, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -623, nil, nil, -623, -623, -623, nil, nil, + -623, nil, nil, -623, nil, nil, -623, -623, nil, -623, + nil, -623, nil, -623, nil, -623, -623, -623, -623, -623, + -623, -623, nil, -623, -623, -623, 619, nil, 616, 615, + 614, 624, 617, nil, nil, nil, nil, nil, -623, -623, + -623, -623, 627, -623, -624, -623, nil, nil, nil, nil, + -623, -624, -624, -624, -623, nil, -624, -624, -624, nil, + -624, nil, nil, nil, 622, nil, nil, nil, nil, -624, + -624, -624, -624, nil, nil, 635, 634, nil, nil, nil, + -624, -624, nil, -624, -624, -624, -624, -624, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 628, + nil, -624, -624, -624, -624, -624, -624, -624, -624, -624, + -624, -624, -624, -624, -624, nil, nil, -624, -624, -624, + nil, nil, -624, nil, nil, -624, nil, nil, -624, -624, + nil, -624, nil, -624, nil, -624, nil, -624, -624, -624, + -624, -624, -624, -624, nil, -624, -624, -624, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + -624, -624, -624, -624, nil, -624, -644, -624, nil, nil, + nil, nil, -624, -644, -644, -644, -624, nil, -644, -644, + -644, nil, -644, nil, nil, nil, nil, nil, nil, nil, + nil, -644, -644, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -644, -644, nil, -644, -644, -644, -644, -644, + nil, nil, nil, nil, nil, nil, nil, 512, 464, nil, + nil, 513, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, nil, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, -644, nil, nil, 175, 176, 161, + 162, -644, nil, nil, nil, nil, 282, -644, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, -644, -644, + 177, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -644, nil, nil, nil, nil, -644, nil, nil, + 170, nil, nil, nil, -644, nil, nil, nil, -644, 8, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, 670, 11, 49, 10, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, -248, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, 670, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, 235, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, -645, -645, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, -645, -645, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -645, -645, -645, -645, + 272, 273, nil, nil, -645, -645, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -645, -645, -645, -645, + 272, 273, nil, nil, -645, -645, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 8, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 10, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -645, -645, -645, -645, + 272, 273, nil, nil, -645, -645, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -645, -645, -645, -645, + 272, 273, nil, nil, -645, -645, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -645, -645, -645, -645, + 272, 273, nil, nil, -645, -645, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -645, -645, -645, -645, + 272, 273, nil, nil, -645, -645, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, nil, nil, 263, 264, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, nil, 263, 264, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, 10, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 304, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 301, nil, 299, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 302, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 305, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 301, nil, 299, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, nil, nil, 324, nil, + 627, 320, nil, nil, 62, 63, nil, nil, 64, nil, + 319, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 328, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 334, nil, nil, + nil, nil, nil, 619, nil, 616, 615, 614, 624, 617, + nil, nil, nil, nil, nil, nil, nil, 324, nil, 627, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 622, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, 635, 634, nil, 96, 106, nil, nil, nil, + 336, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, 628, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, nil, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + 130, nil, nil, nil, nil, 129, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, 619, nil, 616, 615, 614, + 624, 617, nil, nil, nil, nil, nil, nil, nil, 364, + nil, 627, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 635, 634, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 628, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 369, 60, 114, 113, 370, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, 376, nil, nil, 371, nil, + 627, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 328, nil, nil, 122, + 121, 123, 369, 60, 114, 113, 370, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 334, nil, nil, + nil, nil, nil, 619, nil, 616, 615, 614, 624, 617, + nil, nil, nil, nil, nil, nil, nil, 371, nil, 627, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 622, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, 635, 634, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, 12, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, 628, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 49, 10, 13, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 43, nil, nil, 36, + nil, nil, 62, 63, nil, nil, 64, nil, 38, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, 420, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + 12, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 49, nil, 13, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 43, nil, nil, 36, nil, nil, 62, 63, nil, + nil, 64, nil, 38, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 437, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 437, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, 235, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 304, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, 301, + nil, 299, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 302, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 305, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 301, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, 235, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, 12, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 49, + nil, 13, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, 36, nil, nil, 62, 63, nil, nil, + 64, nil, 38, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, 619, nil, 616, 615, 614, + 624, 617, nil, nil, nil, nil, nil, nil, nil, 324, + nil, 627, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 635, 634, nil, 96, 106, nil, + nil, nil, 542, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 628, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, nil, nil, 324, nil, + 627, 320, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + 559, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 304, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 302, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 305, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 706, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, 313, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, 420, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 328, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 334, nil, nil, nil, nil, nil, 619, nil, + 616, 615, 614, 624, 617, nil, nil, nil, nil, nil, + nil, nil, 324, nil, 627, 320, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 622, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, 635, 634, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, 628, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 304, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 301, nil, 299, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 302, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 305, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 328, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 334, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 324, nil, nil, 320, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 301, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, 806, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 304, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + 706, nil, 299, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 302, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 305, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 304, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, 299, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 302, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 305, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 328, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 334, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 324, nil, nil, 320, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 324, + nil, nil, 320, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + 437, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 304, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, 706, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 302, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 305, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 871, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, 304, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, 299, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 302, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, 305, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 328, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 334, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 992, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 328, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 334, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 999, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 1004, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 992, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 301, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 188, 199, 189, 212, 185, 205, 195, 194, 215, + 216, 210, 193, 192, 187, 213, 217, 218, 197, 186, + 200, 204, 206, 198, 191, nil, nil, nil, 207, 214, + 209, 208, 201, 211, 196, 184, 203, 202, nil, nil, + nil, nil, nil, 183, 190, 181, 182, 178, 179, 180, + 141, 143, 140, nil, 142, nil, nil, nil, nil, nil, + nil, nil, nil, 173, 174, nil, 169, 151, 152, 153, + 160, 157, 159, nil, nil, 154, 155, nil, nil, nil, + 175, 176, 161, 162, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 166, 165, nil, + 150, 172, 168, 167, 163, 164, 158, 156, 148, 171, + 149, nil, nil, 177, 105, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 106, nil, nil, nil, nil, nil, + nil, nil, nil, 170, 188, 199, 189, 212, 185, 205, + 195, 194, 215, 216, 210, 193, 192, 187, 213, 217, + 218, 197, 186, 200, 204, 206, 198, 191, nil, nil, + nil, 207, 214, 209, 208, 201, 211, 196, 184, 203, + 202, nil, nil, nil, nil, nil, 183, 190, 181, 182, + 178, 179, 180, 141, 143, nil, nil, 142, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, nil, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, 105, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 106, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 188, 199, 189, + 212, 185, 205, 195, 194, 215, 216, 210, 193, 192, + 187, 213, 217, 218, 197, 186, 200, 204, 206, 198, + 191, nil, nil, nil, 207, 214, 209, 387, 386, 388, + 385, 184, 203, 202, nil, nil, nil, nil, nil, 183, + 190, 181, 182, 382, 383, 384, 380, 143, 114, 113, + 381, nil, 116, nil, nil, nil, nil, nil, nil, 173, + 174, nil, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, 392, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 170, + 188, 199, 189, 212, 185, 205, 195, 194, 215, 216, + 210, 193, 192, 187, 213, 217, 218, 197, 186, 200, + 204, 206, 198, 191, nil, nil, nil, 207, 214, 209, + 208, 201, 211, 196, 184, 203, 202, nil, nil, nil, + nil, nil, 183, 190, 181, 182, 178, 179, 180, 141, + 143, 417, 416, 142, nil, 418, nil, nil, nil, nil, + nil, nil, 173, 174, nil, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 170, 188, 199, 189, 212, 185, 205, 195, + 194, 215, 216, 210, 193, 192, 187, 213, 217, 218, + 197, 186, 200, 204, 206, 198, 191, nil, nil, nil, + 207, 214, 209, 208, 201, 211, 196, 184, 203, 202, + nil, nil, nil, nil, nil, 183, 190, 181, 182, 178, + 179, 180, 141, 143, nil, nil, 142, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, nil, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, nil, 177, 105, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 106, nil, nil, nil, + nil, nil, nil, nil, nil, 170, 188, 199, 189, 212, + 185, 205, 195, 194, 215, 216, 210, 193, 192, 187, + 213, 217, 218, 197, 186, 200, 204, 206, 198, 191, + nil, nil, nil, 207, 214, 209, 208, 201, 211, 196, + 184, 203, 202, nil, nil, nil, nil, nil, 183, 190, + 181, 182, 178, 179, 180, 141, 143, nil, nil, 142, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + nil, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, 105, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 106, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 188, + 199, 189, 212, 185, 205, 195, 194, 215, 216, 210, + 193, 192, 187, 213, 217, 218, 197, 186, 200, 204, + 206, 198, 191, nil, nil, nil, 207, 214, 209, 208, + 201, 211, 196, 184, 203, 202, nil, nil, nil, nil, + nil, 183, 190, 181, 182, 178, 179, 180, 141, 143, + nil, nil, 142, nil, nil, nil, nil, nil, nil, nil, + nil, 173, 174, nil, 169, 151, 152, 153, 160, 157, + 159, nil, nil, 154, 155, nil, nil, nil, 175, 176, + 161, 162, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 166, 165, nil, 150, 172, + 168, 167, 163, 164, 158, 156, 148, 171, 149, nil, + nil, 177, nil, nil, nil, nil, 460, 464, nil, nil, + 461, nil, nil, nil, nil, nil, nil, nil, nil, 173, + 174, 170, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, 282, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + nil, nil, nil, nil, 467, 471, nil, nil, 466, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, 170, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, 282, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, nil, nil, + nil, nil, 687, 464, nil, nil, 688, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, 170, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, 282, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, nil, 177, nil, nil, nil, nil, + 689, 471, nil, nil, 690, nil, nil, nil, nil, nil, + nil, nil, nil, 173, 174, 170, 169, 151, 152, 153, + 160, 157, 159, nil, nil, 154, 155, nil, nil, nil, + 175, 176, 161, 162, nil, nil, nil, nil, nil, 282, + nil, nil, nil, nil, nil, nil, nil, 166, 165, nil, + 150, 172, 168, 167, 163, 164, 158, 156, 148, 171, + 149, nil, nil, 177, nil, nil, nil, nil, 717, 464, + nil, nil, 718, nil, nil, nil, nil, nil, nil, nil, + nil, 173, 174, 170, 169, 151, 152, 153, 160, 157, + 159, nil, nil, 154, 155, nil, nil, nil, 175, 176, + 161, 162, nil, nil, nil, nil, nil, 282, nil, nil, + nil, nil, nil, nil, nil, 166, 165, nil, 150, 172, + 168, 167, 163, 164, 158, 156, 148, 171, 149, nil, + nil, 177, nil, nil, nil, nil, 720, 471, nil, nil, + 721, nil, nil, nil, nil, nil, nil, nil, nil, 173, + 174, 170, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, 282, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + nil, nil, nil, nil, 687, 464, nil, nil, 688, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, 170, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, 282, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, nil, nil, + nil, nil, 689, 471, nil, nil, 690, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, 170, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, 282, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, nil, 177, nil, nil, nil, nil, + 754, 464, nil, nil, 755, nil, nil, nil, nil, nil, + nil, nil, nil, 173, 174, 170, 169, 151, 152, 153, + 160, 157, 159, nil, nil, 154, 155, nil, nil, nil, + 175, 176, 161, 162, nil, nil, nil, nil, nil, 282, + nil, nil, nil, nil, nil, nil, nil, 166, 165, nil, + 150, 172, 168, 167, 163, 164, 158, 156, 148, 171, + 149, nil, nil, 177, nil, nil, nil, nil, 756, 471, + nil, nil, 757, nil, nil, nil, nil, nil, nil, nil, + nil, 173, 174, 170, 169, 151, 152, 153, 160, 157, + 159, nil, nil, 154, 155, nil, nil, nil, 175, 176, + 161, 162, nil, nil, nil, nil, nil, 282, nil, nil, + nil, nil, nil, nil, nil, 166, 165, nil, 150, 172, + 168, 167, 163, 164, 158, 156, 148, 171, 149, nil, + nil, 177, nil, nil, nil, nil, 759, 471, nil, nil, + 760, nil, nil, nil, nil, nil, nil, nil, nil, 173, + 174, 170, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, 282, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + nil, nil, nil, nil, 512, 464, nil, nil, 513, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, 170, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, 282, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, nil, nil, + nil, nil, 808, 464, nil, nil, 809, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, 170, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, 282, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, nil, 177, nil, nil, nil, nil, + 811, 471, nil, nil, 810, nil, nil, nil, nil, nil, + nil, nil, nil, 173, 174, 170, 169, 151, 152, 153, + 160, 157, 159, nil, nil, 154, 155, nil, nil, nil, + 175, 176, 161, 162, nil, nil, nil, nil, nil, 282, + nil, nil, nil, nil, nil, nil, nil, 166, 165, nil, + 150, 172, 168, 167, 163, 164, 158, 156, 148, 171, + 149, nil, 619, 177, 616, 615, 614, 624, 617, 619, + nil, 616, 615, 614, 624, 617, nil, nil, 627, nil, + nil, nil, nil, 170, nil, 627, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 622, nil, nil, nil, nil, nil, nil, 622, nil, 632, + 631, 635, 634, nil, nil, nil, 632, 631, 635, 634, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1065, 471, nil, + nil, 1064, nil, nil, nil, 628, nil, nil, nil, nil, + 173, 174, 628, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 282, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 1068, 464, nil, nil, 1069, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 1070, 471, nil, nil, 1071, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, 619, 177, 616, 615, 614, + 624, 617, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 627, nil, nil, nil, nil, 170, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, nil, nil, nil, nil, nil, + nil, nil, 632, 631, 635, 634, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 628 ] + +racc_action_check = [ + 112, 395, 353, 476, 476, 361, 712, 112, 112, 112, + 362, 354, 112, 112, 112, 717, 112, 365, 940, 17, + 17, 712, 945, 408, 112, 29, 112, 112, 112, 586, + 22, 996, 238, 411, 1, 239, 112, 112, 27, 112, + 112, 112, 112, 112, 754, 27, 565, 352, 352, 565, + 997, 92, 718, 755, 872, 772, 576, 720, 566, 92, + 3, 566, 395, 395, 395, 873, 22, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 1000, 717, 112, 112, 112, 408, 112, 112, 238, + 29, 112, 239, 476, 112, 112, 411, 112, 65, 112, + 13, 112, 27, 112, 112, 112, 112, 112, 112, 112, + 361, 112, 29, 112, 15, 362, 353, 717, 1038, 718, + 717, 353, 365, 720, 720, 354, 112, 112, 112, 112, + 354, 112, 940, 112, 586, 717, 945, 940, 112, 115, + 1068, 945, 112, 1069, 112, 996, 115, 115, 115, 754, + 996, 115, 115, 115, 718, 115, 576, 718, 755, 720, + 772, 576, 720, 115, 997, 115, 115, 115, 872, 997, + 873, 872, 718, 872, 1080, 115, 115, 720, 115, 115, + 115, 115, 115, 1070, 847, 65, 1071, 756, 696, 757, + 380, 694, 727, 727, 841, 1000, 381, 380, 382, 20, + 1000, 771, 771, 381, 16, 382, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 44, 44, 115, 115, 115, 694, 115, 115, 841, 728, + 115, 329, 1038, 115, 115, 728, 115, 1038, 115, 18, + 115, 20, 115, 115, 115, 115, 115, 115, 115, 241, + 115, 847, 115, 756, 1068, 757, 20, 1069, 648, 1068, + 651, 1070, 1069, 25, 1071, 115, 115, 115, 115, 444, + 115, 466, 115, 40, 482, 696, 687, 115, 466, 466, + 466, 115, 727, 115, 466, 466, 847, 466, 1080, 847, + 774, 771, 756, 1080, 757, 41, 329, 1070, 44, 44, + 1071, 774, 1070, 688, 847, 1071, 241, 466, 466, 808, + 466, 466, 466, 466, 466, 334, 334, 383, 329, 648, + 648, 651, 651, 43, 383, 530, 444, 5, 648, 49, + 651, 482, 5, 687, 774, 774, 369, 41, 466, 466, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 41, 99, 466, 466, 466, 19, 466, 371, + 688, 809, 466, 371, 19, 466, 808, 370, 774, 1005, + 466, 1005, 466, 19, 466, 466, 466, 466, 466, 466, + 466, 978, 466, 50, 466, 100, 530, 530, 530, 369, + 50, 42, 978, 334, 334, 338, 369, 466, 466, 50, + 466, 369, 466, 467, 830, 369, 530, 916, 101, 466, + 467, 467, 467, 466, 102, 466, 467, 467, 809, 467, + 370, 19, 384, 369, 138, 978, 978, 370, 467, 384, + 397, 488, 370, 42, 237, 219, 370, 338, 402, 467, + 467, 237, 467, 467, 467, 467, 467, 50, 42, 321, + 237, 385, 338, 369, 370, 386, 321, 405, 385, 978, + 240, 830, 386, 488, 916, 321, 570, 488, 488, 570, + 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, + 467, 467, 467, 467, 370, 242, 467, 467, 467, 322, + 467, 397, 397, 397, 467, 243, 322, 467, 237, 402, + 402, 402, 467, 413, 467, 322, 467, 467, 467, 467, + 467, 467, 467, 321, 467, 467, 467, 460, 405, 405, + 405, 247, 782, 281, 782, 782, 782, 782, 782, 467, + 467, 296, 467, 387, 467, 297, 323, 388, 782, 390, + 387, 467, 689, 323, 388, 467, 390, 467, 300, 689, + 689, 689, 323, 322, 689, 689, 689, 489, 689, 460, + 782, 47, 47, 314, 413, 413, 413, 689, 689, 689, + 689, 782, 782, 860, 460, 759, 860, 1010, 689, 689, + 1010, 689, 689, 689, 689, 689, 308, 316, 325, 489, + 317, 308, 340, 489, 489, 325, 47, 47, 399, 340, + 323, 399, 358, 318, 325, 782, 324, 358, 340, 689, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 689, 689, 689, 597, 597, 689, 689, 689, 759, 689, + 689, 742, 742, 689, 461, 759, 689, 689, 327, 689, + 759, 689, 328, 689, 759, 689, 689, 689, 689, 689, + 689, 689, 325, 689, 689, 689, 340, 333, 140, 399, + 399, 765, 759, 140, 140, 335, 765, 363, 689, 689, + 689, 689, 671, 689, 363, 689, 461, 877, 777, 777, + 689, 690, 877, 363, 689, 339, 689, 342, 690, 690, + 690, 461, 759, 690, 690, 690, 393, 690, 393, 393, + 393, 393, 393, 373, 1039, 1039, 882, 690, 690, 690, + 373, 882, 393, 348, 671, 359, 360, 690, 690, 373, + 690, 690, 690, 690, 690, 364, 366, 375, 401, 671, + 404, 363, 407, 410, 393, 393, 622, 433, 622, 622, + 622, 436, 622, 393, 393, 393, 393, 438, 690, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 690, 441, 455, 690, 690, 690, 373, 690, 690, + 458, 459, 690, 468, 622, 690, 690, 478, 690, 393, + 690, 490, 690, 622, 690, 690, 690, 690, 690, 690, + 690, 491, 690, 492, 690, 605, 493, 605, 605, 605, + 605, 605, 9, 9, 9, 9, 9, 690, 690, 690, + 690, 605, 690, 810, 690, 509, 516, 520, 536, 690, + 810, 810, 810, 690, 537, 690, 810, 810, 538, 810, + 443, 547, 541, 605, 543, 548, 551, 443, 547, 560, + 561, 589, 605, 605, 605, 605, 443, 547, 589, 810, + 810, 721, 810, 810, 810, 810, 810, 589, 721, 760, + 562, 567, 568, 721, 571, 573, 760, 721, 577, 578, + 905, 760, 905, 905, 905, 760, 905, 579, 605, 580, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 443, 547, 810, 810, 810, 599, + 810, 607, 608, 610, 810, 589, 611, 810, 905, 612, + 621, 503, 810, 629, 810, 721, 810, 810, 810, 810, + 810, 810, 810, 760, 810, 768, 810, 768, 768, 768, + 768, 768, 790, 633, 790, 790, 790, 636, 790, 810, + 810, 768, 810, 503, 810, 811, 655, 503, 503, 503, + 503, 810, 811, 811, 811, 810, 658, 810, 811, 811, + 664, 811, 991, 768, 312, 312, 312, 312, 312, 991, + 811, 672, 768, 768, 768, 768, 998, 677, 991, 683, + 691, 811, 811, 998, 811, 811, 811, 811, 811, 796, + 796, 1030, 998, 796, 796, 796, 692, 695, 1030, 699, + 786, 701, 786, 786, 786, 703, 786, 1030, 768, 705, + 714, 716, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 991, 719, 811, 811, + 811, 904, 811, 904, 904, 904, 811, 904, 786, 811, + 998, 722, 723, 494, 811, 726, 811, 786, 811, 811, + 811, 811, 811, 811, 811, 1030, 811, 811, 811, 494, + 494, 961, 744, 961, 961, 961, 750, 961, 753, 904, + 762, 811, 811, 766, 811, 494, 811, 494, 904, 494, + 494, 494, 494, 811, 30, 773, 788, 811, 789, 811, + 791, 30, 30, 30, 803, 805, 30, 30, 30, 769, + 30, 769, 769, 769, 769, 769, 504, 807, 815, 30, + 30, 30, 839, 846, 856, 769, 857, 861, 867, 874, + 30, 30, 876, 30, 30, 30, 30, 30, 1018, 880, + 1018, 1018, 1018, 881, 1018, 888, 889, 769, 504, 890, + 894, 895, 504, 504, 504, 504, 769, 769, 769, 769, + 897, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 898, 1018, 30, 30, 30, + 900, 903, 30, 913, 30, 30, 915, 922, 30, 30, + 923, 30, 769, 30, 925, 30, 926, 30, 30, 30, + 30, 30, 30, 30, 927, 30, 30, 30, 778, 929, + 778, 778, 778, 778, 778, 347, 347, 347, 347, 347, + 30, 30, 930, 30, 778, 30, 31, 535, 535, 535, + 535, 535, 30, 31, 31, 31, 30, 931, 31, 31, + 31, 958, 31, 508, 959, 1019, 778, 1019, 1019, 1019, + 960, 1019, 31, 31, 975, 778, 778, 778, 778, 508, + 508, 976, 31, 31, 989, 31, 31, 31, 31, 31, + 1047, 992, 1047, 1047, 1047, 508, 1047, 508, 994, 508, + 508, 508, 508, 1019, 999, 508, 1006, 508, 1014, 1015, + 1016, 778, 1017, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 1020, 1023, 31, + 31, 31, 1024, 1025, 31, 1026, 31, 31, 1028, 1034, + 31, 31, 1045, 31, 1053, 31, 1064, 31, 1065, 31, + 31, 31, 31, 31, 31, 31, 1067, 31, 1075, 31, + 780, 1076, 780, 780, 780, 780, 780, 1077, 1078, 1079, + 1087, nil, 31, 31, nil, 31, 780, 31, 60, nil, + nil, nil, nil, nil, 31, 60, 60, 60, 31, nil, + 60, 60, 60, nil, 60, 557, nil, nil, 780, nil, + nil, nil, nil, nil, 60, 60, 60, 780, 780, 780, + 780, 557, 557, nil, 60, 60, nil, 60, 60, 60, + 60, 60, nil, nil, nil, nil, nil, 557, nil, 557, + nil, 557, 557, 557, 557, nil, nil, 557, nil, 557, + nil, nil, nil, 780, nil, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, nil, + nil, 60, 60, 60, nil, nil, 60, nil, nil, 60, + nil, nil, 60, 60, nil, 60, nil, 60, nil, 60, + nil, 60, 60, 60, 60, 60, 60, 60, nil, 60, + nil, 60, 834, nil, 834, 834, 834, 834, 834, nil, + nil, nil, nil, nil, 60, 60, 60, 60, 834, 60, + 462, 60, nil, nil, nil, nil, 60, 462, 462, 462, + 60, nil, 462, 462, 462, nil, 462, 495, nil, nil, + 834, nil, nil, nil, nil, 462, 462, 462, nil, 834, + 834, 834, 834, 495, 495, nil, 462, 462, nil, 462, + 462, 462, 462, 462, nil, nil, nil, nil, nil, 495, + nil, 495, nil, 495, 495, 495, 495, 834, nil, nil, + nil, nil, nil, nil, nil, 834, nil, 462, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, + 462, nil, nil, 462, 462, 462, nil, nil, 462, nil, + 462, 462, nil, nil, 462, 462, nil, 462, nil, 462, + nil, 462, nil, 462, 462, 462, 462, 462, 462, 462, + nil, 462, 462, 462, 964, nil, 964, 964, 964, 964, + 964, nil, nil, nil, nil, nil, 462, 462, nil, 462, + 964, 462, 471, nil, nil, nil, nil, nil, 462, 471, + 471, 471, 462, nil, 471, 471, 471, nil, 471, 496, + nil, nil, 964, nil, nil, nil, nil, 471, 471, 471, + 471, 964, 964, 964, 964, 496, 496, nil, 471, 471, + nil, 471, 471, 471, 471, 471, nil, nil, nil, nil, + nil, 496, nil, nil, nil, 496, 496, 496, 496, nil, + nil, nil, nil, nil, nil, nil, nil, 964, nil, 471, + 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 471, nil, nil, 471, 471, 471, nil, nil, + 471, nil, nil, 471, nil, nil, 471, 471, nil, 471, + nil, 471, nil, 471, nil, 471, 471, 471, 471, 471, + 471, 471, nil, 471, 471, 471, 966, nil, 966, 966, + 966, 966, 966, nil, nil, nil, nil, nil, 471, 471, + 471, 471, 966, 471, 472, 471, nil, nil, nil, nil, + 471, 472, 472, 472, 471, nil, 472, 472, 472, nil, + 472, nil, nil, nil, 966, nil, nil, nil, nil, 472, + 472, 472, 472, nil, nil, 966, 966, nil, nil, nil, + 472, 472, nil, 472, 472, 472, 472, 472, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 966, + nil, 472, 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, nil, nil, 472, 472, 472, + nil, nil, 472, nil, nil, 472, nil, nil, 472, 472, + nil, 472, nil, 472, nil, 472, nil, 472, 472, 472, + 472, 472, 472, 472, nil, 472, 472, 472, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 472, 472, 472, 472, nil, 472, 511, 472, nil, nil, + nil, nil, 472, 511, 511, 511, 472, nil, 511, 511, + 511, nil, 511, nil, nil, nil, nil, nil, nil, nil, + nil, 511, 511, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 511, 511, nil, 511, 511, 511, 511, 511, + nil, nil, nil, nil, nil, nil, nil, 278, 278, nil, + nil, 278, nil, nil, nil, nil, nil, nil, nil, nil, + 278, 278, nil, 278, 278, 278, 278, 278, 278, 278, + nil, nil, 278, 278, 511, nil, nil, 278, 278, 278, + 278, 511, nil, nil, nil, nil, 511, 511, nil, nil, + nil, nil, nil, nil, 278, 278, nil, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 511, 511, + 278, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 511, nil, nil, nil, nil, 511, nil, nil, + 278, nil, nil, nil, 511, nil, nil, nil, 511, 2, + 2, 2, 2, 2, 2, nil, nil, nil, 2, 2, + nil, nil, nil, 2, nil, 2, 2, 2, 2, 2, + 2, 2, nil, nil, nil, nil, nil, 2, 2, 2, + 2, 2, 2, 2, nil, nil, 2, nil, nil, nil, + nil, 448, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, nil, 2, 2, 2, nil, 2, + 2, nil, 2, 2, 2, 448, 448, 448, 448, 448, + 448, 448, 448, 448, 448, 448, nil, 448, 448, nil, + nil, 448, 448, nil, 2, nil, nil, 2, nil, nil, + 2, 2, nil, nil, 2, nil, 2, 448, nil, 448, + 2, 448, 448, 448, 448, 448, 448, 448, 2, 448, + nil, nil, nil, 2, 2, 2, 2, 2, 2, nil, + nil, nil, 2, 2, nil, 448, nil, 448, nil, nil, + 2, nil, nil, 2, 2, 2, nil, 2, 2, 36, + 36, 36, 36, 36, 36, nil, nil, nil, 36, 36, + nil, nil, nil, 36, nil, 36, 36, 36, 36, 36, + 36, 36, nil, nil, nil, nil, nil, 36, 36, 36, + 36, 36, 36, 36, nil, nil, 36, nil, nil, nil, + nil, 454, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, nil, 36, 36, 36, nil, 36, + 36, nil, 36, 36, 36, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, nil, 454, 454, nil, + nil, 454, 454, nil, 36, nil, nil, 36, nil, nil, + 36, 36, nil, nil, 36, nil, 36, 454, nil, 454, + 36, 454, 454, 454, 454, 454, 454, 454, 36, 454, + nil, nil, nil, 36, 36, 36, 36, 36, 36, nil, + nil, nil, 36, 36, nil, 454, nil, nil, nil, nil, + 36, nil, nil, 36, 36, 36, nil, 36, 36, 221, + 221, 221, 221, 221, 221, nil, nil, nil, 221, 221, + nil, nil, nil, 221, nil, 221, 221, 221, 221, 221, + 221, 221, nil, nil, nil, nil, nil, 221, 221, 221, + 221, 221, 221, 221, nil, nil, 221, nil, nil, nil, + nil, nil, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, nil, 221, 221, 221, nil, 221, + 221, nil, 221, 221, 221, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, nil, 24, 24, nil, + nil, 24, 24, nil, 221, nil, nil, 221, nil, nil, + 221, 221, nil, nil, 221, nil, 221, 24, nil, 24, + 221, 24, 24, 24, 24, 24, 24, 24, 221, 24, + nil, nil, nil, 221, 221, 221, 221, 221, 221, nil, + nil, nil, 221, 221, nil, 24, nil, nil, nil, nil, + 221, nil, nil, 221, 221, 221, nil, 221, 221, 246, + 246, 246, 246, 246, 246, nil, nil, nil, 246, 246, + nil, nil, nil, 246, nil, 246, 246, 246, 246, 246, + 246, 246, nil, nil, nil, nil, nil, 246, 246, 246, + 246, 246, 246, 246, nil, nil, 246, nil, nil, nil, + nil, nil, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, nil, 246, 246, 246, nil, 246, + 246, nil, 246, 246, 246, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, nil, 294, 294, nil, + nil, 294, 294, nil, 246, nil, nil, 246, nil, nil, + 246, 246, nil, nil, 246, nil, 246, 294, nil, 294, + 246, 294, 294, 294, 294, 294, 294, 294, 246, 294, + nil, nil, nil, 246, 246, 246, 246, 246, 246, nil, + nil, nil, 246, 246, nil, 294, nil, nil, nil, nil, + 246, nil, nil, 246, 246, 246, nil, 246, 246, 315, + 315, 315, 315, 315, 315, nil, nil, nil, 315, 315, + nil, nil, nil, 315, nil, 315, 315, 315, 315, 315, + 315, 315, nil, nil, nil, nil, nil, 315, 315, 315, + 315, 315, 315, 315, nil, nil, 315, nil, nil, nil, + nil, nil, 315, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 315, nil, 315, 315, 315, nil, 315, + 315, nil, 315, 315, 315, 507, 507, 507, 507, 507, + 507, 507, 507, 507, 507, 507, nil, 507, 507, nil, + nil, 507, 507, nil, 315, nil, nil, 315, nil, nil, + 315, 315, nil, nil, 315, nil, 315, 507, nil, 507, + 315, 507, 507, 507, 507, 507, 507, 507, 315, 507, + nil, nil, nil, 315, 315, 315, 315, 315, 315, nil, + nil, nil, 315, 315, 507, 507, nil, nil, nil, nil, + 315, nil, nil, 315, 315, 315, nil, 315, 315, 320, + 320, 320, 320, 320, 320, nil, nil, nil, 320, 320, + nil, nil, nil, 320, nil, 320, 320, 320, 320, 320, + 320, 320, nil, nil, nil, nil, nil, 320, 320, 320, + 320, 320, 320, 320, nil, nil, 320, nil, nil, nil, + nil, nil, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, nil, 320, 320, 320, nil, 320, + 320, nil, 320, 320, 320, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, nil, 558, 558, nil, + nil, 558, 558, nil, 320, nil, nil, 320, nil, nil, + 320, 320, nil, nil, 320, nil, 320, 558, nil, 558, + 320, 558, 558, 558, 558, 558, 558, 558, 320, 558, + nil, nil, nil, 320, 320, 320, 320, 320, 320, nil, + nil, nil, 320, 320, nil, 558, nil, nil, nil, nil, + 320, nil, nil, 320, 320, 320, nil, 320, 320, 346, + 346, 346, 346, 346, 346, nil, nil, nil, 346, 346, + nil, nil, nil, 346, nil, 346, 346, 346, 346, 346, + 346, 346, nil, nil, nil, nil, nil, 346, 346, 346, + 346, 346, 346, 346, nil, nil, 346, nil, nil, nil, + nil, nil, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, nil, 346, 346, 346, nil, 346, + 346, nil, 346, 346, 346, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, nil, 812, 812, nil, + nil, 812, 812, nil, 346, nil, nil, 346, nil, nil, + 346, 346, nil, nil, 346, nil, 346, 812, nil, 812, + 346, 812, 812, 812, 812, 812, 812, 812, 346, 812, + nil, nil, nil, 346, 346, 346, 346, 346, 346, nil, + nil, nil, 346, 346, nil, 812, nil, nil, nil, nil, + 346, nil, nil, 346, 346, 346, nil, 346, 346, 356, + 356, 356, 356, 356, 356, nil, nil, nil, 356, 356, + nil, nil, nil, 356, nil, 356, 356, 356, 356, 356, + 356, 356, nil, nil, nil, nil, nil, 356, 356, 356, + 356, 356, 356, 356, nil, nil, 356, nil, nil, nil, + nil, nil, 356, 356, 356, 356, 356, 356, 356, 356, + 356, 356, 356, 356, nil, 356, 356, 356, nil, 356, + 356, nil, 356, 356, 356, 921, 921, 921, 921, 921, + 921, 921, 921, 921, 921, 921, nil, 921, 921, nil, + nil, 921, 921, nil, 356, nil, nil, 356, nil, nil, + 356, 356, nil, nil, 356, nil, 356, 921, nil, 921, + 356, 921, 921, 921, 921, 921, 921, 921, 356, 921, + nil, nil, nil, 356, 356, 356, 356, 356, 356, nil, + nil, nil, 356, 356, nil, 921, nil, nil, nil, nil, + 356, nil, nil, 356, 356, 356, nil, 356, 356, 357, + 357, 357, 357, 357, 357, nil, nil, nil, 357, 357, + nil, nil, nil, 357, nil, 357, 357, 357, 357, 357, + 357, 357, nil, nil, nil, nil, nil, 357, 357, 357, + 357, 357, 357, 357, nil, nil, 357, nil, nil, nil, + nil, nil, 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, nil, 357, 357, 357, nil, 357, + 357, nil, 357, 357, 357, 486, 486, 486, 486, 486, + 486, 486, 486, 486, 486, 486, nil, 486, 486, nil, + nil, 486, 486, nil, 357, nil, nil, 357, nil, nil, + 357, 357, nil, nil, 357, nil, 357, 486, nil, 486, + 357, 486, 486, 486, 486, 486, 486, 486, 357, 486, + nil, nil, nil, 357, 357, 357, 357, 357, 357, nil, + nil, nil, 357, 357, nil, nil, nil, nil, nil, nil, + 357, nil, nil, 357, 357, 357, nil, 357, 357, 572, + 572, 572, 572, 572, 572, nil, nil, nil, 572, 572, + nil, nil, nil, 572, nil, 572, 572, 572, 572, 572, + 572, 572, nil, nil, nil, nil, nil, 572, 572, 572, + 572, 572, 572, 572, nil, nil, 572, nil, nil, nil, + nil, nil, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, nil, 572, 572, 572, nil, 572, + 572, nil, 572, 572, 572, 487, 487, 487, 487, 487, + 487, 487, 487, 487, 487, 487, nil, 487, 487, nil, + nil, 487, 487, nil, 572, nil, nil, 572, nil, nil, + 572, 572, nil, nil, 572, nil, 572, 487, nil, 487, + 572, 487, 487, 487, 487, 487, 487, 487, 572, 487, + nil, nil, nil, 572, 572, 572, 572, 572, 572, nil, + nil, nil, 572, 572, nil, nil, nil, nil, nil, nil, + 572, nil, nil, 572, 572, 572, nil, 572, 572, 575, + 575, 575, 575, 575, 575, nil, nil, nil, 575, 575, + nil, nil, nil, 575, nil, 575, 575, 575, 575, 575, + 575, 575, nil, nil, nil, nil, nil, 575, 575, 575, + 575, 575, 575, 575, nil, nil, 575, nil, nil, nil, + nil, nil, 575, 575, 575, 575, 575, 575, 575, 575, + 575, 575, 575, 575, nil, 575, 575, 575, nil, 575, + 575, nil, 575, 575, 575, 497, 497, 497, 497, 497, + 497, 497, nil, nil, 497, 497, nil, nil, nil, nil, + nil, 497, 497, nil, 575, nil, nil, 575, nil, nil, + 575, 575, nil, nil, 575, nil, 575, 497, nil, 497, + 575, 497, 497, 497, 497, 497, 497, 497, 575, 497, + nil, nil, nil, 575, 575, 575, 575, 575, 575, nil, + nil, nil, 575, 575, nil, nil, nil, nil, nil, nil, + 575, nil, nil, 575, 575, 575, nil, 575, 575, 598, + 598, 598, 598, 598, 598, nil, nil, nil, 598, 598, + nil, nil, nil, 598, nil, 598, 598, 598, 598, 598, + 598, 598, nil, nil, nil, nil, nil, 598, 598, 598, + 598, 598, 598, 598, nil, nil, 598, nil, nil, nil, + nil, nil, 598, 598, 598, 598, 598, 598, 598, 598, + 598, 598, 598, 598, nil, 598, 598, 598, nil, 598, + 598, nil, 598, 598, 598, 498, 498, 498, 498, 498, + 498, 498, nil, nil, 498, 498, nil, nil, nil, nil, + nil, 498, 498, nil, 598, nil, nil, 598, nil, nil, + 598, 598, nil, nil, 598, nil, 598, 498, nil, 498, + 598, 498, 498, 498, 498, 498, 498, 498, 598, 498, + nil, nil, nil, 598, 598, 598, 598, 598, 598, nil, + nil, nil, 598, 598, nil, nil, nil, nil, nil, nil, + 598, nil, nil, 598, 598, 598, nil, 598, 598, 660, + 660, 660, 660, 660, 660, nil, nil, nil, 660, 660, + nil, nil, nil, 660, nil, 660, 660, 660, 660, 660, + 660, 660, nil, nil, nil, nil, nil, 660, 660, 660, + 660, 660, 660, 660, nil, nil, 660, nil, nil, nil, + nil, nil, 660, 660, 660, 660, 660, 660, 660, 660, + 660, 660, 660, 660, nil, 660, 660, 660, nil, 660, + 660, nil, 660, 660, 660, 499, 499, 499, 499, 499, + 499, 499, nil, nil, 499, 499, nil, nil, nil, nil, + nil, 499, 499, nil, 660, nil, nil, 660, nil, nil, + 660, 660, nil, nil, 660, nil, 660, 499, nil, 499, + 660, 499, 499, 499, 499, 499, 499, 499, 660, 499, + nil, nil, nil, 660, 660, 660, 660, 660, 660, nil, + nil, nil, 660, 660, nil, nil, nil, nil, nil, nil, + 660, nil, nil, 660, 660, 660, nil, 660, 660, 758, + 758, 758, 758, 758, 758, nil, nil, nil, 758, 758, + nil, nil, nil, 758, nil, 758, 758, 758, 758, 758, + 758, 758, nil, nil, nil, nil, nil, 758, 758, 758, + 758, 758, 758, 758, nil, nil, 758, nil, nil, nil, + nil, nil, 758, 758, 758, 758, 758, 758, 758, 758, + 758, 758, 758, 758, nil, 758, 758, 758, nil, 758, + 758, nil, 758, 758, 758, 500, 500, 500, 500, 500, + 500, 500, nil, nil, 500, 500, nil, nil, nil, nil, + nil, 500, 500, nil, 758, nil, nil, 758, nil, nil, + 758, 758, nil, nil, 758, nil, 758, 500, nil, 500, + 758, 500, 500, 500, 500, 500, 500, 500, 758, 500, + nil, nil, nil, 758, 758, 758, 758, 758, 758, nil, + nil, nil, 758, 758, nil, nil, nil, nil, nil, nil, + 758, nil, nil, 758, 758, 758, nil, 758, 758, 763, + 763, 763, 763, 763, 763, nil, nil, nil, 763, 763, + nil, nil, nil, 763, nil, 763, 763, 763, 763, 763, + 763, 763, nil, nil, nil, nil, nil, 763, 763, 763, + 763, 763, 763, 763, nil, nil, 763, nil, nil, nil, + nil, nil, 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, nil, 763, 763, 763, nil, 763, + 763, nil, 763, 763, 763, 501, 501, 501, 501, 501, + 501, 501, nil, nil, 501, 501, nil, nil, nil, nil, + nil, 501, 501, nil, 763, nil, nil, 763, nil, nil, + 763, 763, nil, nil, 763, nil, 763, 501, nil, 501, + 763, 501, 501, 501, 501, 501, 501, 501, 763, 501, + nil, nil, nil, 763, 763, 763, 763, 763, 763, nil, + nil, nil, 763, 763, nil, nil, nil, nil, nil, nil, + 763, nil, nil, 763, 763, 763, nil, 763, 763, 767, + 767, 767, 767, 767, 767, nil, nil, nil, 767, 767, + nil, nil, nil, 767, nil, 767, 767, 767, 767, 767, + 767, 767, nil, nil, nil, nil, nil, 767, 767, 767, + 767, 767, 767, 767, nil, nil, 767, nil, nil, nil, + nil, nil, 767, 767, 767, 767, 767, 767, 767, 767, + 767, 767, 767, 767, nil, 767, 767, 767, nil, 767, + 767, nil, 767, 767, 767, 502, 502, 502, 502, 502, + 502, 502, nil, nil, 502, 502, nil, nil, nil, nil, + nil, 502, 502, nil, 767, nil, nil, 767, nil, nil, + 767, 767, nil, nil, 767, nil, 767, 502, nil, 502, + 767, 502, 502, 502, 502, 502, 502, 502, 767, 502, + nil, nil, nil, 767, 767, 767, 767, 767, 767, nil, + nil, nil, 767, 767, nil, nil, nil, nil, nil, nil, + 767, nil, nil, 767, 767, 767, nil, 767, 767, 797, + 797, 797, 797, 797, 797, nil, nil, nil, 797, 797, + nil, nil, nil, 797, nil, 797, 797, 797, 797, 797, + 797, 797, nil, nil, nil, nil, nil, 797, 797, 797, + 797, 797, 797, 797, nil, nil, 797, nil, nil, nil, + nil, nil, 797, 797, 797, 797, 797, 797, 797, 797, + 797, 797, 797, 797, nil, 797, 797, 797, nil, 797, + 797, nil, 797, 797, 797, 505, 505, 505, 505, 505, + 505, 505, nil, nil, 505, 505, nil, nil, nil, nil, + nil, 505, 505, nil, 797, nil, nil, 797, nil, nil, + 797, 797, nil, nil, 797, nil, 797, 505, nil, 505, + 797, 505, 505, 505, 505, 505, 505, 505, 797, 505, + nil, nil, nil, 797, 797, 797, 797, 797, 797, nil, + nil, nil, 797, 797, nil, nil, nil, nil, nil, nil, + 797, nil, nil, 797, 797, 797, nil, 797, 797, 836, + 836, 836, 836, 836, 836, nil, nil, nil, 836, 836, + nil, nil, nil, 836, nil, 836, 836, 836, 836, 836, + 836, 836, nil, nil, nil, nil, nil, 836, 836, 836, + 836, 836, 836, 836, nil, nil, 836, nil, nil, nil, + nil, nil, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, nil, 836, 836, 836, nil, 836, + 836, nil, 836, 836, 836, 506, 506, 506, 506, 506, + 506, 506, 506, nil, 506, 506, nil, nil, nil, nil, + nil, 506, 506, nil, 836, nil, nil, 836, nil, nil, + 836, 836, nil, nil, 836, nil, 836, 506, nil, 506, + 836, 506, 506, 506, 506, 506, 506, 506, 836, 506, + nil, nil, nil, 836, 836, 836, 836, 836, 836, nil, + nil, nil, 836, 836, nil, nil, nil, nil, nil, nil, + 836, nil, nil, 836, 836, 836, nil, 836, 836, 854, + 854, 854, 854, 854, 854, nil, nil, nil, 854, 854, + nil, nil, nil, 854, nil, 854, 854, 854, 854, 854, + 854, 854, nil, nil, nil, nil, nil, 854, 854, 854, + 854, 854, 854, 854, nil, nil, 854, nil, nil, nil, + nil, nil, 854, 854, 854, 854, 854, 854, 854, 854, + 854, 854, 854, 854, nil, 854, 854, 854, nil, 854, + 854, nil, 854, 854, 854, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 854, nil, nil, 854, nil, nil, + 854, 854, nil, nil, 854, nil, 854, nil, nil, nil, + 854, nil, nil, nil, nil, nil, nil, nil, 854, nil, + nil, nil, nil, 854, 854, 854, 854, 854, 854, nil, + nil, nil, 854, 854, nil, nil, nil, nil, nil, nil, + 854, nil, nil, 854, 854, 854, nil, 854, 854, 866, + 866, 866, 866, 866, 866, nil, nil, nil, 866, 866, + nil, nil, nil, 866, nil, 866, 866, 866, 866, 866, + 866, 866, nil, nil, nil, nil, nil, 866, 866, 866, + 866, 866, 866, 866, nil, nil, 866, nil, nil, nil, + nil, nil, 866, 866, 866, 866, 866, 866, 866, 866, + 866, 866, 866, 866, nil, 866, 866, 866, nil, 866, + 866, nil, 866, 866, 866, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 866, nil, nil, 866, nil, nil, + 866, 866, nil, nil, 866, nil, 866, nil, nil, nil, + 866, nil, nil, nil, nil, nil, nil, nil, 866, nil, + nil, nil, nil, 866, 866, 866, 866, 866, 866, nil, + nil, nil, 866, 866, nil, nil, nil, nil, nil, nil, + 866, nil, nil, 866, 866, 866, nil, 866, 866, 886, + 886, 886, 886, 886, 886, nil, nil, nil, 886, 886, + nil, nil, nil, 886, nil, 886, 886, 886, 886, 886, + 886, 886, nil, nil, nil, nil, nil, 886, 886, 886, + 886, 886, 886, 886, nil, nil, 886, nil, nil, nil, + nil, nil, 886, 886, 886, 886, 886, 886, 886, 886, + 886, 886, 886, 886, nil, 886, 886, 886, nil, 886, + 886, nil, 886, 886, 886, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 886, nil, nil, 886, nil, nil, + 886, 886, nil, nil, 886, nil, 886, nil, nil, nil, + 886, nil, nil, nil, nil, nil, nil, nil, 886, nil, + nil, nil, nil, 886, 886, 886, 886, 886, 886, nil, + nil, nil, 886, 886, nil, nil, nil, nil, nil, nil, + 886, nil, nil, 886, 886, 886, nil, 886, 886, 887, + 887, 887, 887, 887, 887, nil, nil, nil, 887, 887, + nil, nil, nil, 887, nil, 887, 887, 887, 887, 887, + 887, 887, nil, nil, nil, nil, nil, 887, 887, 887, + 887, 887, 887, 887, nil, nil, 887, nil, nil, nil, + nil, nil, 887, 887, 887, 887, 887, 887, 887, 887, + 887, 887, 887, 887, nil, 887, 887, 887, nil, 887, + 887, nil, 887, 887, 887, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 887, nil, nil, 887, nil, nil, + 887, 887, nil, nil, 887, nil, 887, nil, nil, nil, + 887, nil, nil, nil, nil, nil, nil, nil, 887, nil, + nil, nil, nil, 887, 887, 887, 887, 887, 887, nil, + nil, nil, 887, 887, nil, nil, nil, nil, nil, nil, + 887, nil, nil, 887, 887, 887, nil, 887, 887, 937, + 937, 937, 937, 937, 937, nil, nil, nil, 937, 937, + nil, nil, nil, 937, nil, 937, 937, 937, 937, 937, + 937, 937, nil, nil, nil, nil, nil, 937, 937, 937, + 937, 937, 937, 937, nil, nil, 937, nil, nil, nil, + nil, nil, 937, 937, 937, 937, 937, 937, 937, 937, + 937, 937, 937, 937, nil, 937, 937, 937, nil, 937, + 937, nil, 937, 937, 937, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 937, nil, nil, 937, nil, nil, + 937, 937, nil, nil, 937, nil, 937, nil, nil, nil, + 937, nil, nil, nil, nil, nil, nil, nil, 937, nil, + nil, nil, nil, 937, 937, 937, 937, 937, 937, nil, + nil, nil, 937, 937, nil, nil, nil, nil, nil, nil, + 937, nil, nil, 937, 937, 937, nil, 937, 937, 938, + 938, 938, 938, 938, 938, nil, nil, nil, 938, 938, + nil, nil, nil, 938, nil, 938, 938, 938, 938, 938, + 938, 938, nil, nil, nil, nil, nil, 938, 938, 938, + 938, 938, 938, 938, nil, nil, 938, nil, nil, nil, + nil, nil, 938, 938, 938, 938, 938, 938, 938, 938, + 938, 938, 938, 938, nil, 938, 938, 938, nil, 938, + 938, nil, 938, 938, 938, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 938, nil, nil, 938, nil, nil, + 938, 938, nil, nil, 938, nil, 938, nil, nil, nil, + 938, nil, nil, nil, nil, nil, nil, nil, 938, nil, + nil, nil, nil, 938, 938, 938, 938, 938, 938, nil, + nil, nil, 938, 938, nil, nil, nil, nil, nil, nil, + 938, nil, nil, 938, 938, 938, nil, 938, 938, 950, + 950, 950, 950, 950, 950, nil, nil, nil, 950, 950, + nil, nil, nil, 950, nil, 950, 950, 950, 950, 950, + 950, 950, nil, nil, nil, nil, nil, 950, 950, 950, + 950, 950, 950, 950, nil, nil, 950, nil, nil, nil, + nil, nil, 950, 950, 950, 950, 950, 950, 950, 950, + 950, 950, 950, 950, nil, 950, 950, 950, nil, 950, + 950, nil, 950, 950, 950, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 950, nil, nil, 950, nil, nil, + 950, 950, nil, nil, 950, nil, 950, nil, nil, nil, + 950, nil, nil, nil, nil, nil, nil, nil, 950, nil, + nil, nil, nil, 950, 950, 950, 950, 950, 950, nil, + nil, nil, 950, 950, nil, nil, nil, nil, nil, nil, + 950, nil, nil, 950, 950, 950, nil, 950, 950, 954, + 954, 954, 954, 954, 954, nil, nil, nil, 954, 954, + nil, nil, nil, 954, nil, 954, 954, 954, 954, 954, + 954, 954, nil, nil, nil, nil, nil, 954, 954, 954, + 954, 954, 954, 954, nil, nil, 954, nil, nil, nil, + nil, nil, 954, 954, 954, 954, 954, 954, 954, 954, + 954, 954, 954, 954, nil, 954, 954, 954, nil, 954, + 954, nil, 954, 954, 954, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 954, nil, nil, 954, nil, nil, + 954, 954, nil, nil, 954, nil, 954, nil, nil, nil, + 954, nil, nil, nil, nil, nil, nil, nil, 954, nil, + nil, nil, nil, 954, 954, 954, 954, 954, 954, nil, + nil, nil, 954, 954, nil, nil, nil, nil, nil, nil, + 954, nil, nil, 954, 954, 954, nil, 954, 954, 995, + 995, 995, 995, 995, 995, nil, nil, nil, 995, 995, + nil, nil, nil, 995, nil, 995, 995, 995, 995, 995, + 995, 995, nil, nil, nil, nil, nil, 995, 995, 995, + 995, 995, 995, 995, nil, nil, 995, nil, nil, nil, + nil, nil, 995, 995, 995, 995, 995, 995, 995, 995, + 995, 995, 995, 995, nil, 995, 995, 995, nil, 995, + 995, nil, 995, 995, 995, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 995, nil, nil, 995, nil, nil, + 995, 995, nil, nil, 995, nil, 995, nil, nil, nil, + 995, nil, nil, nil, nil, nil, nil, nil, 995, nil, + nil, nil, nil, 995, 995, 995, 995, 995, 995, nil, + nil, nil, 995, 995, nil, nil, nil, nil, nil, nil, + 995, nil, nil, 995, 995, 995, nil, 995, 995, 1002, + 1002, 1002, 1002, 1002, 1002, nil, nil, nil, 1002, 1002, + nil, nil, nil, 1002, nil, 1002, 1002, 1002, 1002, 1002, + 1002, 1002, nil, nil, nil, nil, nil, 1002, 1002, 1002, + 1002, 1002, 1002, 1002, nil, nil, 1002, nil, nil, nil, + nil, nil, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, + 1002, 1002, 1002, 1002, nil, 1002, 1002, 1002, nil, 1002, + 1002, nil, 1002, 1002, 1002, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1002, nil, nil, 1002, nil, nil, + 1002, 1002, nil, nil, 1002, nil, 1002, nil, nil, nil, + 1002, nil, nil, nil, nil, nil, nil, nil, 1002, nil, + nil, nil, nil, 1002, 1002, 1002, 1002, 1002, 1002, nil, + nil, nil, 1002, 1002, nil, nil, nil, nil, nil, nil, + 1002, nil, nil, 1002, 1002, 1002, nil, 1002, 1002, 1007, + 1007, 1007, 1007, 1007, 1007, nil, nil, nil, 1007, 1007, + nil, nil, nil, 1007, nil, 1007, 1007, 1007, 1007, 1007, + 1007, 1007, nil, nil, nil, nil, nil, 1007, 1007, 1007, + 1007, 1007, 1007, 1007, nil, nil, 1007, nil, nil, nil, + nil, nil, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, + 1007, 1007, 1007, 1007, nil, 1007, 1007, 1007, nil, 1007, + 1007, nil, 1007, 1007, 1007, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1007, nil, nil, 1007, nil, nil, + 1007, 1007, nil, nil, 1007, nil, 1007, nil, nil, nil, + 1007, nil, nil, nil, nil, nil, nil, nil, 1007, nil, + nil, nil, nil, 1007, 1007, 1007, 1007, 1007, 1007, nil, + nil, nil, 1007, 1007, nil, nil, nil, nil, nil, nil, + 1007, nil, nil, 1007, 1007, 1007, nil, 1007, 1007, 8, + 8, 8, 8, 8, nil, nil, nil, 8, 8, nil, + nil, nil, 8, nil, 8, 8, 8, 8, 8, 8, + 8, nil, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, 8, nil, nil, 8, nil, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, nil, 8, 8, 8, nil, 8, 8, + nil, 8, 8, 8, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 8, nil, nil, 8, nil, nil, 8, + 8, nil, nil, 8, nil, 8, nil, nil, nil, 8, + nil, nil, nil, nil, nil, nil, nil, 8, nil, nil, + nil, nil, 8, 8, 8, 8, 8, 8, nil, nil, + nil, 8, 8, nil, nil, nil, nil, nil, nil, 8, + nil, nil, 8, 8, 8, nil, 8, 8, 23, 23, + 23, nil, 23, nil, nil, nil, 23, 23, nil, nil, + nil, 23, nil, 23, 23, 23, 23, 23, 23, 23, + nil, nil, nil, nil, nil, 23, 23, 23, 23, 23, + 23, 23, nil, nil, 23, nil, nil, nil, nil, nil, + nil, 23, nil, nil, 23, 23, 23, 23, 23, 23, + 23, 23, nil, 23, 23, 23, nil, 23, 23, nil, + 23, 23, 23, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, 23, nil, nil, 23, 23, + nil, nil, 23, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 23, 23, 23, 23, 23, 23, nil, nil, nil, + 23, 23, nil, nil, nil, nil, nil, nil, 23, nil, + nil, 23, 23, 23, nil, 23, 23, 32, 32, 32, + nil, 32, nil, nil, nil, 32, 32, nil, nil, nil, + 32, nil, 32, 32, 32, 32, 32, 32, 32, nil, + nil, nil, nil, nil, 32, 32, 32, 32, 32, 32, + 32, nil, nil, 32, nil, nil, nil, nil, nil, nil, + 32, nil, nil, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, nil, 32, 32, nil, 32, + 32, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 32, nil, nil, 32, nil, nil, 32, 32, nil, + nil, 32, nil, 32, nil, 32, nil, 32, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + 32, 32, 32, 32, 32, 32, nil, nil, nil, 32, + 32, nil, nil, nil, nil, nil, nil, 32, nil, 32, + 32, 32, 32, nil, 32, 32, 33, 33, 33, nil, + 33, nil, nil, nil, 33, 33, nil, nil, nil, 33, + nil, 33, 33, 33, 33, 33, 33, 33, nil, nil, + nil, nil, nil, 33, 33, 33, 33, 33, 33, 33, + nil, nil, 33, nil, nil, nil, nil, nil, nil, 33, + nil, nil, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, nil, 33, 33, nil, 33, 33, + 33, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 33, nil, nil, 33, nil, nil, 33, 33, nil, nil, + 33, nil, 33, nil, 33, nil, 33, nil, nil, nil, + nil, nil, nil, nil, 33, nil, nil, nil, nil, 33, + 33, 33, 33, 33, 33, nil, nil, nil, 33, 33, + nil, nil, nil, nil, nil, nil, 33, nil, 33, 33, + 33, 33, nil, 33, 33, 34, 34, 34, nil, 34, + nil, nil, nil, 34, 34, nil, nil, nil, 34, nil, + 34, 34, 34, 34, 34, 34, 34, nil, nil, nil, + nil, nil, 34, 34, 34, 34, 34, 34, 34, nil, + nil, 34, nil, nil, nil, nil, nil, nil, 34, nil, + nil, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, nil, 34, 34, nil, 34, 34, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, 34, nil, nil, 34, 34, nil, nil, 34, + nil, 34, nil, 34, nil, 34, nil, nil, nil, nil, + nil, nil, nil, 34, nil, nil, nil, nil, 34, 34, + 34, 34, 34, 34, nil, nil, nil, 34, 34, nil, + nil, nil, nil, nil, nil, 34, nil, 34, 34, 34, + 34, nil, 34, 34, 37, 37, 37, nil, 37, nil, + nil, nil, 37, 37, nil, nil, nil, 37, nil, 37, + 37, 37, 37, 37, 37, 37, nil, nil, nil, nil, + nil, 37, 37, 37, 37, 37, 37, 37, nil, nil, + 37, nil, nil, nil, nil, nil, nil, 37, nil, nil, + 37, 37, 37, 37, 37, 37, 37, 37, nil, 37, + 37, 37, nil, 37, 37, nil, nil, nil, 37, nil, + nil, nil, nil, nil, 968, nil, 968, 968, 968, 968, + 968, nil, nil, nil, nil, nil, nil, nil, 37, nil, + 968, 37, nil, nil, 37, 37, nil, nil, 37, nil, + 37, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 968, nil, nil, nil, nil, 37, 37, 37, + 37, 37, 37, 968, 968, nil, 37, 37, nil, nil, + nil, nil, nil, nil, 37, nil, nil, 37, 37, 37, + nil, 37, 37, 38, 38, 38, nil, 38, nil, nil, + nil, 38, 38, nil, nil, nil, 38, 968, 38, 38, + 38, 38, 38, 38, 38, nil, nil, nil, nil, nil, + 38, 38, 38, 38, 38, 38, 38, nil, nil, 38, + nil, nil, nil, nil, nil, nil, 38, nil, nil, 38, + 38, 38, 38, 38, 38, 38, 38, nil, 38, 38, + 38, nil, 38, 38, nil, nil, nil, 38, nil, nil, + nil, nil, nil, 970, nil, 970, 970, 970, 970, 970, + nil, nil, nil, nil, nil, nil, nil, 38, nil, 970, + 38, nil, nil, 38, 38, nil, nil, 38, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 970, nil, nil, nil, nil, 38, 38, 38, 38, + 38, 38, 970, 970, nil, 38, 38, nil, nil, nil, + 38, nil, nil, 38, nil, nil, 38, 38, 38, nil, + 38, 38, 45, 45, 45, nil, 45, nil, nil, nil, + 45, 45, nil, nil, nil, 45, 970, 45, 45, 45, + 45, 45, 45, 45, nil, nil, nil, nil, nil, 45, + 45, 45, 45, 45, 45, 45, nil, nil, 45, nil, + nil, nil, nil, nil, nil, 45, nil, nil, 45, 45, + 45, 45, 45, 45, 45, 45, nil, 45, 45, 45, + nil, 45, 45, nil, 45, 45, 45, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 45, nil, nil, 45, + nil, nil, 45, 45, nil, nil, 45, nil, nil, nil, + nil, nil, 45, nil, nil, nil, nil, nil, nil, nil, + 45, nil, nil, nil, nil, 45, 45, 45, 45, 45, + 45, nil, nil, nil, 45, 45, nil, nil, nil, nil, + nil, nil, 45, nil, nil, 45, 45, 45, nil, 45, + 45, 46, 46, 46, nil, 46, nil, nil, nil, 46, + 46, nil, nil, nil, 46, nil, 46, 46, 46, 46, + 46, 46, 46, nil, nil, nil, nil, nil, 46, 46, + 46, 46, 46, 46, 46, nil, nil, 46, nil, nil, + nil, nil, nil, nil, 46, nil, nil, 46, 46, 46, + 46, 46, 46, 46, 46, nil, 46, 46, 46, nil, + 46, 46, nil, 46, 46, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 46, nil, nil, 46, nil, + nil, 46, 46, nil, nil, 46, nil, nil, nil, nil, + nil, 46, nil, nil, nil, nil, nil, nil, nil, 46, + nil, nil, nil, nil, 46, 46, 46, 46, 46, 46, + nil, nil, nil, 46, 46, nil, nil, nil, nil, nil, + nil, 46, nil, nil, 46, 46, 46, nil, 46, 46, + 48, 48, 48, nil, 48, nil, nil, nil, 48, 48, + nil, nil, nil, 48, nil, 48, 48, 48, 48, 48, + 48, 48, nil, nil, nil, nil, nil, 48, 48, 48, + 48, 48, 48, 48, nil, nil, 48, nil, nil, nil, + nil, nil, nil, 48, nil, nil, 48, 48, 48, 48, + 48, 48, 48, 48, nil, 48, 48, 48, nil, 48, + 48, nil, 48, 48, 48, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 48, nil, nil, 48, nil, nil, + 48, 48, nil, nil, 48, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, 48, 48, 48, 48, 48, 48, nil, + nil, nil, 48, 48, nil, nil, nil, nil, nil, nil, + 48, nil, nil, 48, 48, 48, nil, 48, 48, 62, + 62, 62, 62, 62, nil, nil, nil, 62, 62, nil, + nil, nil, 62, nil, 62, 62, 62, 62, 62, 62, + 62, nil, nil, nil, nil, nil, 62, 62, 62, 62, + 62, 62, 62, nil, nil, 62, nil, nil, nil, nil, + nil, 62, 62, nil, 62, 62, 62, 62, 62, 62, + 62, 62, 62, nil, 62, 62, 62, nil, 62, 62, + nil, 62, 62, 62, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 62, nil, nil, 62, nil, nil, 62, + 62, nil, nil, 62, nil, 62, nil, nil, nil, 62, + nil, nil, nil, nil, nil, nil, nil, 62, nil, nil, + nil, nil, 62, 62, 62, 62, 62, 62, nil, nil, + nil, 62, 62, nil, nil, nil, nil, nil, nil, 62, + nil, nil, 62, 62, 62, nil, 62, 62, 67, 67, + 67, nil, 67, nil, nil, nil, 67, 67, nil, nil, + nil, 67, nil, 67, 67, 67, 67, 67, 67, 67, + nil, nil, nil, nil, nil, 67, 67, 67, 67, 67, + 67, 67, nil, nil, 67, nil, nil, nil, nil, nil, + nil, 67, nil, nil, 67, 67, 67, 67, 67, 67, + 67, 67, nil, 67, 67, 67, nil, 67, 67, nil, + 67, 67, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, 67, nil, nil, 67, 67, + nil, nil, 67, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, 67, 67, 67, 67, 67, 67, nil, nil, nil, + 67, 67, nil, nil, nil, nil, nil, nil, 67, nil, + nil, 67, 67, 67, nil, 67, 67, 68, 68, 68, + nil, 68, nil, nil, nil, 68, 68, nil, nil, nil, + 68, nil, 68, 68, 68, 68, 68, 68, 68, nil, + nil, nil, nil, nil, 68, 68, 68, 68, 68, 68, + 68, nil, nil, 68, nil, nil, nil, nil, nil, nil, + 68, nil, nil, 68, 68, 68, 68, 68, 68, 68, + 68, nil, 68, 68, 68, nil, 68, 68, nil, 68, + 68, 68, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 68, nil, nil, 68, nil, nil, 68, 68, nil, + nil, 68, nil, nil, nil, nil, nil, 68, nil, nil, + nil, nil, nil, nil, nil, 68, nil, nil, nil, nil, + 68, 68, 68, 68, 68, 68, nil, nil, nil, 68, + 68, nil, nil, nil, nil, nil, nil, 68, nil, nil, + 68, 68, 68, nil, 68, 68, 71, 71, 71, nil, + 71, nil, nil, nil, 71, 71, nil, nil, nil, 71, + nil, 71, 71, 71, 71, 71, 71, 71, nil, nil, + nil, nil, nil, 71, 71, 71, 71, 71, 71, 71, + nil, nil, 71, nil, nil, nil, nil, nil, nil, 71, + nil, nil, 71, 71, 71, 71, 71, 71, 71, 71, + nil, 71, 71, 71, nil, 71, 71, nil, 71, 71, + 71, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 71, nil, nil, 71, nil, nil, 71, 71, nil, nil, + 71, nil, nil, nil, nil, nil, 71, nil, nil, nil, + nil, nil, nil, nil, 71, nil, nil, nil, nil, 71, + 71, 71, 71, 71, 71, nil, nil, nil, 71, 71, + 71, nil, nil, nil, nil, 71, 71, nil, nil, 71, + 71, 71, nil, 71, 71, 72, 72, 72, nil, 72, + nil, nil, nil, 72, 72, nil, nil, nil, 72, nil, + 72, 72, 72, 72, 72, 72, 72, nil, nil, nil, + nil, nil, 72, 72, 72, 72, 72, 72, 72, nil, + nil, 72, nil, nil, nil, nil, nil, nil, 72, nil, + nil, 72, 72, 72, 72, 72, 72, 72, 72, nil, + 72, 72, 72, nil, 72, 72, nil, nil, nil, 72, + nil, nil, nil, nil, nil, 986, nil, 986, 986, 986, + 986, 986, nil, nil, nil, nil, nil, nil, nil, 72, + nil, 986, 72, nil, nil, 72, 72, nil, nil, 72, + nil, 72, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 986, nil, nil, nil, nil, 72, 72, + 72, 72, 72, 72, 986, 986, nil, 72, 72, nil, + nil, nil, nil, nil, nil, 72, nil, nil, 72, 72, + 72, nil, 72, 72, 73, 73, 73, nil, 73, nil, + nil, nil, 73, 73, nil, nil, nil, 73, 986, 73, + 73, 73, 73, 73, 73, 73, nil, nil, nil, nil, + nil, 73, 73, 73, 73, 73, 73, 73, nil, nil, + 73, nil, nil, nil, nil, nil, nil, 73, nil, nil, + 73, 73, 73, 73, 73, 73, 73, 73, nil, 73, + 73, 73, nil, 73, 73, nil, nil, nil, 73, nil, + nil, nil, nil, nil, 1048, nil, 1048, 1048, 1048, 1048, + 1048, nil, nil, nil, nil, 73, nil, nil, 73, nil, + 1048, 73, nil, nil, 73, 73, nil, nil, 73, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1048, nil, nil, nil, nil, 73, 73, 73, + 73, 73, 73, 1048, 1048, nil, 73, 73, nil, nil, + nil, nil, nil, nil, 73, nil, nil, 73, 73, 73, + nil, 73, 73, 74, 74, 74, nil, 74, nil, nil, + nil, 74, 74, nil, nil, nil, 74, 1048, 74, 74, + 74, 74, 74, 74, 74, nil, nil, nil, nil, nil, + 74, 74, 74, 74, 74, 74, 74, nil, nil, 74, + nil, nil, nil, nil, nil, nil, 74, nil, nil, 74, + 74, 74, 74, 74, 74, 74, 74, nil, 74, 74, + 74, nil, 74, 74, nil, nil, nil, 74, nil, nil, + nil, nil, nil, 1057, nil, 1057, 1057, 1057, 1057, 1057, + nil, nil, nil, nil, nil, nil, nil, 74, nil, 1057, + 74, nil, nil, 74, 74, nil, nil, 74, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1057, nil, nil, nil, nil, 74, 74, 74, 74, + 74, 74, 1057, 1057, nil, 74, 74, nil, nil, nil, + nil, nil, nil, 74, nil, nil, 74, 74, 74, nil, + 74, 74, 128, 128, 128, 128, 128, nil, nil, nil, + 128, 128, nil, nil, nil, 128, 1057, 128, 128, 128, + 128, 128, 128, 128, nil, nil, nil, nil, nil, 128, + 128, 128, 128, 128, 128, 128, nil, nil, 128, nil, + nil, nil, nil, nil, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, nil, 128, 128, 128, + nil, 128, 128, nil, 128, 128, 128, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 128, nil, nil, 128, + nil, nil, 128, 128, nil, nil, 128, nil, 128, nil, + nil, nil, 128, nil, nil, nil, nil, nil, nil, nil, + 128, nil, nil, nil, nil, 128, 128, 128, 128, 128, + 128, nil, nil, nil, 128, 128, nil, nil, nil, nil, + nil, 128, 128, nil, nil, 128, 128, 128, nil, 128, + 128, 133, 133, 133, nil, 133, nil, nil, nil, 133, + 133, nil, nil, nil, 133, nil, 133, 133, 133, 133, + 133, 133, 133, nil, nil, nil, nil, nil, 133, 133, + 133, 133, 133, 133, 133, nil, nil, 133, nil, nil, + nil, nil, nil, nil, 133, nil, nil, 133, 133, 133, + 133, 133, 133, 133, 133, nil, 133, 133, 133, nil, + 133, 133, nil, 133, 133, 133, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 133, nil, nil, 133, nil, + nil, 133, 133, nil, nil, 133, nil, nil, nil, nil, + nil, 133, nil, nil, nil, nil, nil, nil, nil, 133, + nil, nil, nil, nil, 133, 133, 133, 133, 133, 133, + nil, nil, nil, 133, 133, nil, nil, nil, nil, nil, + nil, 133, nil, nil, 133, 133, 133, nil, 133, 133, + 134, 134, 134, nil, 134, nil, nil, nil, 134, 134, + nil, nil, nil, 134, nil, 134, 134, 134, 134, 134, + 134, 134, nil, nil, nil, nil, nil, 134, 134, 134, + 134, 134, 134, 134, nil, nil, 134, nil, nil, nil, + nil, nil, nil, 134, nil, nil, 134, 134, 134, 134, + 134, 134, 134, 134, nil, 134, 134, 134, nil, 134, + 134, nil, 134, 134, 134, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 134, nil, nil, 134, nil, nil, + 134, 134, nil, nil, 134, nil, nil, nil, nil, nil, + 134, nil, nil, nil, nil, nil, nil, nil, 134, nil, + nil, nil, nil, 134, 134, 134, 134, 134, 134, nil, + nil, nil, 134, 134, nil, nil, nil, nil, nil, nil, + 134, nil, nil, 134, 134, 134, nil, 134, 134, 135, + 135, 135, nil, 135, nil, nil, nil, 135, 135, nil, + nil, nil, 135, nil, 135, 135, 135, 135, 135, 135, + 135, nil, nil, nil, nil, nil, 135, 135, 135, 135, + 135, 135, 135, nil, nil, 135, nil, nil, nil, nil, + nil, nil, 135, nil, nil, 135, 135, 135, 135, 135, + 135, 135, 135, nil, 135, 135, 135, nil, 135, 135, + nil, 135, 135, 135, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 135, nil, nil, 135, nil, nil, 135, + 135, nil, nil, 135, nil, nil, nil, nil, nil, 135, + nil, nil, nil, nil, nil, nil, nil, 135, nil, nil, + nil, nil, 135, 135, 135, 135, 135, 135, nil, nil, + nil, 135, 135, nil, nil, nil, nil, nil, nil, 135, + nil, nil, 135, 135, 135, nil, 135, 135, 136, 136, + 136, nil, 136, nil, nil, nil, 136, 136, nil, nil, + nil, 136, nil, 136, 136, 136, 136, 136, 136, 136, + nil, nil, nil, nil, nil, 136, 136, 136, 136, 136, + 136, 136, nil, nil, 136, nil, nil, nil, nil, nil, + nil, 136, nil, nil, 136, 136, 136, 136, 136, 136, + 136, 136, nil, 136, 136, 136, nil, 136, 136, nil, + 136, 136, 136, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 136, nil, nil, 136, nil, nil, 136, 136, + nil, nil, 136, nil, nil, nil, nil, nil, 136, nil, + nil, nil, nil, nil, nil, nil, 136, nil, nil, nil, + nil, 136, 136, 136, 136, 136, 136, nil, nil, nil, + 136, 136, nil, nil, nil, nil, nil, nil, 136, nil, + nil, 136, 136, 136, nil, 136, 136, 137, 137, 137, + 137, 137, nil, nil, nil, 137, 137, nil, nil, nil, + 137, nil, 137, 137, 137, 137, 137, 137, 137, nil, + nil, nil, nil, nil, 137, 137, 137, 137, 137, 137, + 137, nil, nil, 137, nil, nil, nil, nil, nil, 137, + 137, nil, 137, 137, 137, 137, 137, 137, 137, 137, + 137, nil, 137, 137, 137, nil, 137, 137, nil, 137, + 137, 137, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 137, nil, nil, 137, nil, nil, 137, 137, nil, + nil, 137, nil, 137, nil, nil, nil, 137, nil, nil, + nil, nil, nil, nil, nil, 137, nil, nil, nil, nil, + 137, 137, 137, 137, 137, 137, nil, nil, nil, 137, + 137, nil, nil, nil, nil, nil, nil, 137, nil, nil, + 137, 137, 137, nil, 137, 137, 222, 222, 222, nil, + 222, nil, nil, nil, 222, 222, nil, nil, nil, 222, + nil, 222, 222, 222, 222, 222, 222, 222, nil, nil, + nil, nil, nil, 222, 222, 222, 222, 222, 222, 222, + nil, nil, 222, nil, nil, nil, nil, nil, nil, 222, + nil, nil, 222, 222, 222, 222, 222, 222, 222, 222, + nil, 222, 222, 222, nil, 222, 222, nil, 222, 222, + 222, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 222, nil, nil, 222, nil, nil, 222, 222, nil, nil, + 222, nil, 222, nil, nil, nil, 222, nil, nil, nil, + nil, nil, nil, nil, 222, nil, nil, nil, nil, 222, + 222, 222, 222, 222, 222, nil, nil, nil, 222, 222, + nil, nil, nil, nil, nil, nil, 222, nil, nil, 222, + 222, 222, nil, 222, 222, 223, 223, 223, nil, 223, + nil, nil, nil, 223, 223, nil, nil, nil, 223, nil, + 223, 223, 223, 223, 223, 223, 223, nil, nil, nil, + nil, nil, 223, 223, 223, 223, 223, 223, 223, nil, + nil, 223, nil, nil, nil, nil, nil, nil, 223, nil, + nil, 223, 223, 223, 223, 223, 223, 223, 223, nil, + 223, 223, 223, nil, 223, 223, nil, 223, 223, 223, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 223, + nil, nil, 223, nil, nil, 223, 223, nil, nil, 223, + nil, 223, nil, nil, nil, 223, nil, nil, nil, nil, + nil, nil, nil, 223, nil, nil, nil, nil, 223, 223, + 223, 223, 223, 223, nil, nil, nil, 223, 223, nil, + nil, nil, nil, nil, nil, 223, nil, nil, 223, 223, + 223, nil, 223, 223, 224, 224, 224, nil, 224, nil, + nil, nil, 224, 224, nil, nil, nil, 224, nil, 224, + 224, 224, 224, 224, 224, 224, nil, nil, nil, nil, + nil, 224, 224, 224, 224, 224, 224, 224, nil, nil, + 224, nil, nil, nil, nil, nil, nil, 224, nil, nil, + 224, 224, 224, 224, 224, 224, 224, 224, nil, 224, + 224, 224, nil, 224, 224, nil, 224, 224, 224, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 224, nil, + nil, 224, nil, nil, 224, 224, nil, nil, 224, nil, + nil, nil, nil, nil, 224, nil, nil, nil, nil, nil, + nil, nil, 224, nil, nil, nil, nil, 224, 224, 224, + 224, 224, 224, nil, nil, nil, 224, 224, nil, nil, + nil, nil, nil, nil, 224, nil, nil, 224, 224, 224, + nil, 224, 224, 225, 225, 225, nil, 225, nil, nil, + nil, 225, 225, nil, nil, nil, 225, nil, 225, 225, + 225, 225, 225, 225, 225, nil, nil, nil, nil, nil, + 225, 225, 225, 225, 225, 225, 225, nil, nil, 225, + nil, nil, nil, nil, nil, nil, 225, nil, nil, 225, + 225, 225, 225, 225, 225, 225, 225, nil, 225, 225, + 225, nil, 225, 225, nil, 225, 225, 225, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 225, nil, nil, + 225, nil, nil, 225, 225, nil, nil, 225, nil, nil, + nil, nil, nil, 225, nil, nil, nil, nil, nil, nil, + nil, 225, nil, nil, nil, nil, 225, 225, 225, 225, + 225, 225, nil, nil, nil, 225, 225, nil, nil, nil, + nil, nil, nil, 225, nil, nil, 225, 225, 225, nil, + 225, 225, 226, 226, 226, nil, 226, nil, nil, nil, + 226, 226, nil, nil, nil, 226, nil, 226, 226, 226, + 226, 226, 226, 226, nil, nil, nil, nil, nil, 226, + 226, 226, 226, 226, 226, 226, nil, nil, 226, nil, + nil, nil, nil, nil, nil, 226, nil, nil, 226, 226, + 226, 226, 226, 226, 226, 226, nil, 226, 226, 226, + nil, 226, 226, nil, 226, 226, 226, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 226, nil, nil, 226, + nil, nil, 226, 226, nil, nil, 226, nil, nil, nil, + nil, nil, 226, nil, nil, nil, nil, nil, nil, nil, + 226, nil, nil, nil, nil, 226, 226, 226, 226, 226, + 226, nil, nil, nil, 226, 226, nil, nil, nil, nil, + nil, nil, 226, nil, nil, 226, 226, 226, nil, 226, + 226, 227, 227, 227, nil, 227, nil, nil, nil, 227, + 227, nil, nil, nil, 227, nil, 227, 227, 227, 227, + 227, 227, 227, nil, nil, nil, nil, nil, 227, 227, + 227, 227, 227, 227, 227, nil, nil, 227, nil, nil, + nil, nil, nil, nil, 227, nil, nil, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, nil, + 227, 227, nil, 227, 227, 227, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 227, nil, nil, 227, nil, + nil, 227, 227, nil, nil, 227, nil, 227, nil, 227, + nil, 227, nil, nil, nil, nil, nil, nil, nil, 227, + nil, nil, nil, nil, 227, 227, 227, 227, 227, 227, + nil, nil, nil, 227, 227, nil, nil, nil, nil, nil, + nil, 227, nil, 227, 227, 227, 227, nil, 227, 227, + 232, 232, 232, nil, 232, nil, nil, nil, 232, 232, + nil, nil, nil, 232, nil, 232, 232, 232, 232, 232, + 232, 232, nil, nil, nil, nil, nil, 232, 232, 232, + 232, 232, 232, 232, nil, nil, 232, nil, nil, nil, + nil, nil, nil, 232, nil, nil, 232, 232, 232, 232, + 232, 232, 232, 232, nil, 232, 232, 232, nil, 232, + 232, nil, 232, 232, 232, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 232, nil, nil, 232, nil, nil, + 232, 232, nil, nil, 232, nil, nil, nil, nil, nil, + 232, nil, nil, nil, nil, nil, nil, nil, 232, nil, + nil, nil, nil, 232, 232, 232, 232, 232, 232, nil, + nil, nil, 232, 232, nil, nil, nil, nil, nil, nil, + 232, nil, nil, 232, 232, 232, nil, 232, 232, 233, + 233, 233, nil, 233, nil, nil, nil, 233, 233, nil, + nil, nil, 233, nil, 233, 233, 233, 233, 233, 233, + 233, nil, nil, nil, nil, nil, 233, 233, 233, 233, + 233, 233, 233, nil, nil, 233, nil, nil, nil, nil, + nil, nil, 233, nil, nil, 233, 233, 233, 233, 233, + 233, 233, 233, nil, 233, 233, 233, nil, 233, 233, + nil, 233, 233, 233, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 233, nil, nil, 233, nil, nil, 233, + 233, nil, nil, 233, nil, nil, nil, nil, nil, 233, + nil, nil, nil, nil, nil, nil, nil, 233, nil, nil, + nil, nil, 233, 233, 233, 233, 233, 233, nil, nil, + nil, 233, 233, nil, nil, nil, nil, nil, nil, 233, + nil, nil, 233, 233, 233, nil, 233, 233, 234, 234, + 234, nil, 234, nil, nil, nil, 234, 234, nil, nil, + nil, 234, nil, 234, 234, 234, 234, 234, 234, 234, + nil, nil, nil, nil, nil, 234, 234, 234, 234, 234, + 234, 234, nil, nil, 234, nil, nil, nil, nil, nil, + nil, 234, nil, nil, 234, 234, 234, 234, 234, 234, + 234, 234, nil, 234, 234, 234, nil, 234, 234, nil, + 234, 234, 234, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 234, nil, nil, 234, nil, nil, 234, 234, + nil, nil, 234, nil, nil, nil, nil, nil, 234, nil, + nil, nil, nil, nil, nil, nil, 234, nil, nil, nil, + nil, 234, 234, 234, 234, 234, 234, nil, nil, nil, + 234, 234, 234, nil, nil, nil, nil, nil, 234, nil, + nil, 234, 234, 234, nil, 234, 234, 245, 245, 245, + nil, 245, nil, nil, nil, 245, 245, nil, nil, nil, + 245, nil, 245, 245, 245, 245, 245, 245, 245, nil, + nil, nil, nil, nil, 245, 245, 245, 245, 245, 245, + 245, nil, nil, 245, nil, nil, nil, nil, nil, nil, + 245, nil, nil, 245, 245, 245, 245, 245, 245, 245, + 245, nil, 245, 245, 245, nil, 245, 245, nil, 245, + 245, 245, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, 245, nil, nil, 245, 245, nil, + nil, 245, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 245, 245, 245, 245, 245, 245, nil, nil, nil, 245, + 245, nil, nil, nil, nil, nil, nil, 245, nil, nil, + 245, 245, 245, nil, 245, 245, 248, 248, 248, nil, + 248, nil, nil, nil, 248, 248, nil, nil, nil, 248, + nil, 248, 248, 248, 248, 248, 248, 248, nil, nil, + nil, nil, nil, 248, 248, 248, 248, 248, 248, 248, + nil, nil, 248, nil, nil, nil, nil, nil, nil, 248, + nil, nil, 248, 248, 248, 248, 248, 248, 248, 248, + nil, 248, 248, 248, nil, 248, 248, nil, 248, 248, + 248, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 248, nil, nil, 248, nil, nil, 248, 248, nil, nil, + 248, nil, nil, nil, nil, nil, 248, nil, nil, nil, + nil, nil, nil, nil, 248, nil, nil, nil, nil, 248, + 248, 248, 248, 248, 248, nil, nil, nil, 248, 248, + nil, nil, nil, nil, nil, nil, 248, nil, nil, 248, + 248, 248, nil, 248, 248, 249, 249, 249, nil, 249, + nil, nil, nil, 249, 249, nil, nil, nil, 249, nil, + 249, 249, 249, 249, 249, 249, 249, nil, nil, nil, + nil, nil, 249, 249, 249, 249, 249, 249, 249, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 249, nil, + nil, 249, 249, 249, 249, 249, 249, 249, 249, nil, + 249, 249, 249, nil, 249, 249, nil, 249, 249, 249, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, 249, nil, nil, 249, 249, nil, nil, 249, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 249, 249, + 249, 249, 249, 249, nil, nil, nil, 249, 249, nil, + nil, nil, nil, nil, nil, 249, nil, nil, 249, 249, + 249, nil, 249, 249, 250, 250, 250, nil, 250, nil, + nil, nil, 250, 250, nil, nil, nil, 250, nil, 250, + 250, 250, 250, 250, 250, 250, nil, nil, nil, nil, + nil, 250, 250, 250, 250, 250, 250, 250, nil, nil, + 250, nil, nil, nil, nil, nil, nil, 250, nil, nil, + 250, 250, 250, 250, 250, 250, 250, 250, nil, 250, + 250, 250, nil, 250, 250, nil, 250, 250, 250, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 250, nil, + nil, 250, nil, nil, 250, 250, nil, nil, 250, nil, + nil, nil, nil, nil, 250, nil, nil, nil, nil, nil, + nil, nil, 250, nil, nil, nil, nil, 250, 250, 250, + 250, 250, 250, nil, nil, nil, 250, 250, nil, nil, + nil, nil, nil, nil, 250, nil, nil, 250, 250, 250, + nil, 250, 250, 251, 251, 251, nil, 251, nil, nil, + nil, 251, 251, nil, nil, nil, 251, nil, 251, 251, + 251, 251, 251, 251, 251, nil, nil, nil, nil, nil, + 251, 251, 251, 251, 251, 251, 251, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 251, nil, nil, 251, + 251, 251, 251, 251, 251, 251, 251, nil, 251, 251, + 251, nil, 251, 251, nil, 251, 251, 251, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 251, nil, nil, + 251, nil, nil, 251, 251, nil, nil, 251, nil, nil, + nil, nil, nil, 251, nil, nil, nil, nil, nil, nil, + nil, 251, nil, nil, nil, nil, 251, 251, 251, 251, + 251, 251, nil, nil, nil, 251, 251, nil, nil, nil, + nil, nil, nil, 251, nil, nil, 251, 251, 251, nil, + 251, 251, 252, 252, 252, nil, 252, nil, nil, nil, + 252, 252, nil, nil, nil, 252, nil, 252, 252, 252, + 252, 252, 252, 252, nil, nil, nil, nil, nil, 252, + 252, 252, 252, 252, 252, 252, nil, nil, 252, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 252, 252, + 252, 252, 252, 252, 252, 252, nil, 252, 252, 252, + nil, 252, 252, nil, 252, 252, 252, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 252, + nil, nil, 252, 252, nil, nil, 252, nil, nil, nil, + nil, nil, 252, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, nil, nil, 252, 252, 252, 252, 252, + 252, nil, nil, nil, 252, 252, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 252, 252, 252, nil, 252, + 252, 253, 253, 253, nil, 253, nil, nil, nil, 253, + 253, nil, nil, nil, 253, nil, 253, 253, 253, 253, + 253, 253, 253, nil, nil, nil, nil, nil, 253, 253, + 253, 253, 253, 253, 253, nil, nil, 253, nil, nil, + nil, nil, nil, nil, 253, nil, nil, 253, 253, 253, + 253, 253, 253, 253, 253, nil, 253, 253, 253, nil, + 253, 253, nil, 253, 253, 253, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 253, nil, nil, 253, nil, + nil, 253, 253, nil, nil, 253, nil, nil, nil, nil, + nil, 253, nil, nil, nil, nil, nil, nil, nil, 253, + nil, nil, nil, nil, 253, 253, 253, 253, 253, 253, + nil, nil, nil, 253, 253, nil, nil, nil, nil, nil, + nil, 253, nil, nil, 253, 253, 253, nil, 253, 253, + 254, 254, 254, nil, 254, nil, nil, nil, 254, 254, + nil, nil, nil, 254, nil, 254, 254, 254, 254, 254, + 254, 254, nil, nil, nil, nil, nil, 254, 254, 254, + 254, 254, 254, 254, nil, nil, 254, nil, nil, nil, + nil, nil, nil, 254, nil, nil, 254, 254, 254, 254, + 254, 254, 254, 254, nil, 254, 254, 254, nil, 254, + 254, nil, 254, 254, 254, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 254, nil, nil, 254, nil, nil, + 254, 254, nil, nil, 254, nil, nil, nil, nil, nil, + 254, nil, nil, nil, nil, nil, nil, nil, 254, nil, + nil, nil, nil, 254, 254, 254, 254, 254, 254, nil, + nil, nil, 254, 254, nil, nil, nil, nil, nil, nil, + 254, nil, nil, 254, 254, 254, nil, 254, 254, 255, + 255, 255, nil, 255, nil, nil, nil, 255, 255, nil, + nil, nil, 255, nil, 255, 255, 255, 255, 255, 255, + 255, nil, nil, nil, nil, nil, 255, 255, 255, 255, + 255, 255, 255, nil, nil, 255, nil, nil, nil, nil, + nil, nil, 255, nil, nil, 255, 255, 255, 255, 255, + 255, 255, 255, nil, 255, 255, 255, nil, 255, 255, + nil, 255, 255, 255, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 255, nil, nil, 255, nil, nil, 255, + 255, nil, nil, 255, nil, nil, nil, nil, nil, 255, + nil, nil, nil, nil, nil, nil, nil, 255, nil, nil, + nil, nil, 255, 255, 255, 255, 255, 255, nil, nil, + nil, 255, 255, nil, nil, nil, nil, nil, nil, 255, + nil, nil, 255, 255, 255, nil, 255, 255, 256, 256, + 256, nil, 256, nil, nil, nil, 256, 256, nil, nil, + nil, 256, nil, 256, 256, 256, 256, 256, 256, 256, + nil, nil, nil, nil, nil, 256, 256, 256, 256, 256, + 256, 256, nil, nil, 256, nil, nil, nil, nil, nil, + nil, 256, nil, nil, 256, 256, 256, 256, 256, 256, + 256, 256, nil, 256, 256, 256, nil, 256, 256, nil, + 256, 256, 256, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 256, nil, nil, 256, nil, nil, 256, 256, + nil, nil, 256, nil, nil, nil, nil, nil, 256, nil, + nil, nil, nil, nil, nil, nil, 256, nil, nil, nil, + nil, 256, 256, 256, 256, 256, 256, nil, nil, nil, + 256, 256, nil, nil, nil, nil, nil, nil, 256, nil, + nil, 256, 256, 256, nil, 256, 256, 257, 257, 257, + nil, 257, nil, nil, nil, 257, 257, nil, nil, nil, + 257, nil, 257, 257, 257, 257, 257, 257, 257, nil, + nil, nil, nil, nil, 257, 257, 257, 257, 257, 257, + 257, nil, nil, 257, nil, nil, nil, nil, nil, nil, + 257, nil, nil, 257, 257, 257, 257, 257, 257, 257, + 257, nil, 257, 257, 257, nil, 257, 257, nil, 257, + 257, 257, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, 257, nil, nil, 257, 257, nil, + nil, 257, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 257, 257, 257, 257, 257, 257, nil, nil, nil, 257, + 257, nil, nil, nil, nil, nil, nil, 257, nil, nil, + 257, 257, 257, nil, 257, 257, 258, 258, 258, nil, + 258, nil, nil, nil, 258, 258, nil, nil, nil, 258, + nil, 258, 258, 258, 258, 258, 258, 258, nil, nil, + nil, nil, nil, 258, 258, 258, 258, 258, 258, 258, + nil, nil, 258, nil, nil, nil, nil, nil, nil, 258, + nil, nil, 258, 258, 258, 258, 258, 258, 258, 258, + nil, 258, 258, 258, nil, 258, 258, nil, 258, 258, + 258, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 258, nil, nil, 258, nil, nil, 258, 258, nil, nil, + 258, nil, nil, nil, nil, nil, 258, nil, nil, nil, + nil, nil, nil, nil, 258, nil, nil, nil, nil, 258, + 258, 258, 258, 258, 258, nil, nil, nil, 258, 258, + nil, nil, nil, nil, nil, nil, 258, nil, nil, 258, + 258, 258, nil, 258, 258, 259, 259, 259, nil, 259, + nil, nil, nil, 259, 259, nil, nil, nil, 259, nil, + 259, 259, 259, 259, 259, 259, 259, nil, nil, nil, + nil, nil, 259, 259, 259, 259, 259, 259, 259, nil, + nil, 259, nil, nil, nil, nil, nil, nil, 259, nil, + nil, 259, 259, 259, 259, 259, 259, 259, 259, nil, + 259, 259, 259, nil, 259, 259, nil, 259, 259, 259, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 259, + nil, nil, 259, nil, nil, 259, 259, nil, nil, 259, + nil, nil, nil, nil, nil, 259, nil, nil, nil, nil, + nil, nil, nil, 259, nil, nil, nil, nil, 259, 259, + 259, 259, 259, 259, nil, nil, nil, 259, 259, nil, + nil, nil, nil, nil, nil, 259, nil, nil, 259, 259, + 259, nil, 259, 259, 260, 260, 260, nil, 260, nil, + nil, nil, 260, 260, nil, nil, nil, 260, nil, 260, + 260, 260, 260, 260, 260, 260, nil, nil, nil, nil, + nil, 260, 260, 260, 260, 260, 260, 260, nil, nil, + 260, nil, nil, nil, nil, nil, nil, 260, nil, nil, + 260, 260, 260, 260, 260, 260, 260, 260, nil, 260, + 260, 260, nil, 260, 260, nil, 260, 260, 260, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 260, nil, + nil, 260, nil, nil, 260, 260, nil, nil, 260, nil, + nil, nil, nil, nil, 260, nil, nil, nil, nil, nil, + nil, nil, 260, nil, nil, nil, nil, 260, 260, 260, + 260, 260, 260, nil, nil, nil, 260, 260, nil, nil, + nil, nil, nil, nil, 260, nil, nil, 260, 260, 260, + nil, 260, 260, 261, 261, 261, nil, 261, nil, nil, + nil, 261, 261, nil, nil, nil, 261, nil, 261, 261, + 261, 261, 261, 261, 261, nil, nil, nil, nil, nil, + 261, 261, 261, 261, 261, 261, 261, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 261, nil, nil, 261, + 261, 261, 261, 261, 261, 261, 261, nil, 261, 261, + 261, nil, 261, 261, nil, 261, 261, 261, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 261, nil, nil, + 261, nil, nil, 261, 261, nil, nil, 261, nil, nil, + nil, nil, nil, 261, nil, nil, nil, nil, nil, nil, + nil, 261, nil, nil, nil, nil, 261, 261, 261, 261, + 261, 261, nil, nil, nil, 261, 261, nil, nil, nil, + nil, nil, nil, 261, nil, nil, 261, 261, 261, nil, + 261, 261, 262, 262, 262, nil, 262, nil, nil, nil, + 262, 262, nil, nil, nil, 262, nil, 262, 262, 262, + 262, 262, 262, 262, nil, nil, nil, nil, nil, 262, + 262, 262, 262, 262, 262, 262, nil, nil, 262, nil, + nil, nil, nil, nil, nil, 262, nil, nil, 262, 262, + 262, 262, 262, 262, 262, 262, nil, 262, 262, 262, + nil, 262, 262, nil, 262, 262, 262, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 262, nil, nil, 262, + nil, nil, 262, 262, nil, nil, 262, nil, nil, nil, + nil, nil, 262, nil, nil, nil, nil, nil, nil, nil, + 262, nil, nil, nil, nil, 262, 262, 262, 262, 262, + 262, nil, nil, nil, 262, 262, nil, nil, nil, nil, + nil, nil, 262, nil, nil, 262, 262, 262, nil, 262, + 262, 263, 263, 263, nil, 263, nil, nil, nil, 263, + 263, nil, nil, nil, 263, nil, 263, 263, 263, 263, + 263, 263, 263, nil, nil, nil, nil, nil, 263, 263, + 263, 263, 263, 263, 263, nil, nil, 263, nil, nil, + nil, nil, nil, nil, 263, nil, nil, 263, 263, 263, + 263, 263, 263, 263, 263, nil, 263, 263, 263, nil, + 263, 263, nil, 263, 263, 263, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 263, nil, nil, 263, nil, + nil, 263, 263, nil, nil, 263, nil, nil, nil, nil, + nil, 263, nil, nil, nil, nil, nil, nil, nil, 263, + nil, nil, nil, nil, 263, 263, 263, 263, 263, 263, + nil, nil, nil, 263, 263, nil, nil, nil, nil, nil, + nil, 263, nil, nil, 263, 263, 263, nil, 263, 263, + 264, 264, 264, nil, 264, nil, nil, nil, 264, 264, + nil, nil, nil, 264, nil, 264, 264, 264, 264, 264, + 264, 264, nil, nil, nil, nil, nil, 264, 264, 264, + 264, 264, 264, 264, nil, nil, 264, nil, nil, nil, + nil, nil, nil, 264, nil, nil, 264, 264, 264, 264, + 264, 264, 264, 264, nil, 264, 264, 264, nil, 264, + 264, nil, 264, 264, 264, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 264, nil, nil, 264, nil, nil, + 264, 264, nil, nil, 264, nil, nil, nil, nil, nil, + 264, nil, nil, nil, nil, nil, nil, nil, 264, nil, + nil, nil, nil, 264, 264, 264, 264, 264, 264, nil, + nil, nil, 264, 264, nil, nil, nil, nil, nil, nil, + 264, nil, nil, 264, 264, 264, nil, 264, 264, 265, + 265, 265, nil, 265, nil, nil, nil, 265, 265, nil, + nil, nil, 265, nil, 265, 265, 265, 265, 265, 265, + 265, nil, nil, nil, nil, nil, 265, 265, 265, 265, + 265, 265, 265, nil, nil, 265, nil, nil, nil, nil, + nil, nil, 265, nil, nil, 265, 265, 265, 265, 265, + 265, 265, 265, nil, 265, 265, 265, nil, 265, 265, + nil, 265, 265, 265, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 265, nil, nil, 265, nil, nil, 265, + 265, nil, nil, 265, nil, nil, nil, nil, nil, 265, + nil, nil, nil, nil, nil, nil, nil, 265, nil, nil, + nil, nil, 265, 265, 265, 265, 265, 265, nil, nil, + nil, 265, 265, nil, nil, nil, nil, nil, nil, 265, + nil, nil, 265, 265, 265, nil, 265, 265, 266, 266, + 266, nil, 266, nil, nil, nil, 266, 266, nil, nil, + nil, 266, nil, 266, 266, 266, 266, 266, 266, 266, + nil, nil, nil, nil, nil, 266, 266, 266, 266, 266, + 266, 266, nil, nil, 266, nil, nil, nil, nil, nil, + nil, 266, nil, nil, 266, 266, 266, 266, 266, 266, + 266, 266, nil, 266, 266, 266, nil, 266, 266, nil, + 266, 266, 266, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 266, nil, nil, 266, nil, nil, 266, 266, + nil, nil, 266, nil, nil, nil, nil, nil, 266, nil, + nil, nil, nil, nil, nil, nil, 266, nil, nil, nil, + nil, 266, 266, 266, 266, 266, 266, nil, nil, nil, + 266, 266, nil, nil, nil, nil, nil, nil, 266, nil, + nil, 266, 266, 266, nil, 266, 266, 267, 267, 267, + nil, 267, nil, nil, nil, 267, 267, nil, nil, nil, + 267, nil, 267, 267, 267, 267, 267, 267, 267, nil, + nil, nil, nil, nil, 267, 267, 267, 267, 267, 267, + 267, nil, nil, 267, nil, nil, nil, nil, nil, nil, + 267, nil, nil, 267, 267, 267, 267, 267, 267, 267, + 267, nil, 267, 267, 267, nil, 267, 267, nil, 267, + 267, 267, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 267, nil, nil, 267, nil, nil, 267, 267, nil, + nil, 267, nil, nil, nil, nil, nil, 267, nil, nil, + nil, nil, nil, nil, nil, 267, nil, nil, nil, nil, + 267, 267, 267, 267, 267, 267, nil, nil, nil, 267, + 267, nil, nil, nil, nil, nil, nil, 267, nil, nil, + 267, 267, 267, nil, 267, 267, 268, 268, 268, nil, + 268, nil, nil, nil, 268, 268, nil, nil, nil, 268, + nil, 268, 268, 268, 268, 268, 268, 268, nil, nil, + nil, nil, nil, 268, 268, 268, 268, 268, 268, 268, + nil, nil, 268, nil, nil, nil, nil, nil, nil, 268, + nil, nil, 268, 268, 268, 268, 268, 268, 268, 268, + nil, 268, 268, 268, nil, 268, 268, nil, 268, 268, + 268, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 268, nil, nil, 268, nil, nil, 268, 268, nil, nil, + 268, nil, nil, nil, nil, nil, 268, nil, nil, nil, + nil, nil, nil, nil, 268, nil, nil, nil, nil, 268, + 268, 268, 268, 268, 268, nil, nil, nil, 268, 268, + nil, nil, nil, nil, nil, nil, 268, nil, nil, 268, + 268, 268, nil, 268, 268, 269, 269, 269, nil, 269, + nil, nil, nil, 269, 269, nil, nil, nil, 269, nil, + 269, 269, 269, 269, 269, 269, 269, nil, nil, nil, + nil, nil, 269, 269, 269, 269, 269, 269, 269, nil, + nil, 269, nil, nil, nil, nil, nil, nil, 269, nil, + nil, 269, 269, 269, 269, 269, 269, 269, 269, nil, + 269, 269, 269, nil, 269, 269, nil, 269, 269, 269, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 269, + nil, nil, 269, nil, nil, 269, 269, nil, nil, 269, + nil, nil, nil, nil, nil, 269, nil, nil, nil, nil, + nil, nil, nil, 269, nil, nil, nil, nil, 269, 269, + 269, 269, 269, 269, nil, nil, nil, 269, 269, nil, + nil, nil, nil, nil, nil, 269, nil, nil, 269, 269, + 269, nil, 269, 269, 274, 274, 274, nil, 274, nil, + nil, nil, 274, 274, nil, nil, nil, 274, nil, 274, + 274, 274, 274, 274, 274, 274, nil, nil, nil, nil, + nil, 274, 274, 274, 274, 274, 274, 274, nil, nil, + 274, nil, nil, nil, nil, nil, nil, 274, nil, nil, + 274, 274, 274, 274, 274, 274, 274, 274, nil, 274, + 274, 274, nil, 274, 274, nil, 274, 274, 274, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 274, nil, + nil, 274, nil, nil, 274, 274, nil, nil, 274, nil, + nil, nil, nil, nil, 274, nil, nil, nil, nil, nil, + nil, nil, 274, nil, nil, nil, nil, 274, 274, 274, + 274, 274, 274, nil, nil, nil, 274, 274, nil, nil, + nil, nil, nil, nil, 274, nil, nil, 274, 274, 274, + nil, 274, 274, 282, 282, 282, nil, 282, nil, nil, + nil, 282, 282, nil, nil, nil, 282, nil, 282, 282, + 282, 282, 282, 282, 282, nil, nil, nil, nil, nil, + 282, 282, 282, 282, 282, 282, 282, nil, nil, 282, + nil, nil, nil, nil, nil, nil, 282, nil, nil, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, nil, 282, 282, nil, 282, 282, 282, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 282, nil, nil, + 282, nil, nil, 282, 282, nil, nil, 282, nil, 282, + nil, 282, nil, 282, nil, nil, nil, nil, nil, nil, + nil, 282, nil, nil, nil, nil, 282, 282, 282, 282, + 282, 282, nil, nil, nil, 282, 282, nil, nil, nil, + nil, nil, nil, 282, nil, 282, 282, 282, 282, nil, + 282, 282, 283, 283, 283, nil, 283, nil, nil, nil, + 283, 283, nil, nil, nil, 283, nil, 283, 283, 283, + 283, 283, 283, 283, nil, nil, nil, nil, nil, 283, + 283, 283, 283, 283, 283, 283, nil, nil, 283, nil, + nil, nil, nil, nil, nil, 283, nil, nil, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + nil, 283, 283, nil, 283, 283, 283, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 283, nil, nil, 283, + nil, nil, 283, 283, nil, nil, 283, nil, 283, nil, + 283, nil, 283, nil, nil, nil, nil, nil, nil, nil, + 283, nil, nil, nil, nil, 283, 283, 283, 283, 283, + 283, nil, nil, nil, 283, 283, nil, nil, nil, nil, + nil, nil, 283, nil, 283, 283, 283, 283, nil, 283, + 283, 292, 292, 292, nil, 292, nil, nil, nil, 292, + 292, nil, nil, nil, 292, nil, 292, 292, 292, 292, + 292, 292, 292, nil, nil, nil, nil, nil, 292, 292, + 292, 292, 292, 292, 292, nil, nil, 292, nil, nil, + nil, nil, nil, nil, 292, nil, nil, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, nil, + 292, 292, nil, 292, 292, 292, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 292, nil, nil, 292, nil, + nil, 292, 292, nil, nil, 292, nil, 292, nil, 292, + nil, 292, nil, nil, nil, nil, nil, nil, nil, 292, + nil, nil, nil, nil, 292, 292, 292, 292, 292, 292, + nil, nil, nil, 292, 292, 292, nil, nil, nil, nil, + nil, 292, nil, 292, 292, 292, 292, nil, 292, 292, + 299, 299, 299, nil, 299, nil, nil, nil, 299, 299, + nil, nil, nil, 299, nil, 299, 299, 299, 299, 299, + 299, 299, nil, nil, nil, nil, nil, 299, 299, 299, + 299, 299, 299, 299, nil, nil, 299, nil, nil, nil, + nil, nil, nil, 299, nil, nil, 299, 299, 299, 299, + 299, 299, 299, 299, nil, 299, 299, 299, nil, 299, + 299, nil, 299, 299, 299, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 299, nil, nil, 299, nil, nil, + 299, 299, nil, nil, 299, nil, nil, nil, nil, nil, + 299, nil, nil, nil, nil, nil, nil, nil, 299, nil, + nil, nil, nil, 299, 299, 299, 299, 299, 299, nil, + nil, nil, 299, 299, nil, nil, nil, nil, nil, nil, + 299, nil, nil, 299, 299, 299, nil, 299, 299, 301, + 301, 301, nil, 301, nil, nil, nil, 301, 301, nil, + nil, nil, 301, nil, 301, 301, 301, 301, 301, 301, + 301, nil, nil, nil, nil, nil, 301, 301, 301, 301, + 301, 301, 301, nil, nil, 301, nil, nil, nil, nil, + nil, nil, 301, nil, nil, 301, 301, 301, 301, 301, + 301, 301, 301, nil, 301, 301, 301, nil, 301, 301, + nil, 301, 301, 301, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 301, nil, nil, 301, nil, nil, 301, + 301, nil, nil, 301, nil, nil, nil, nil, nil, 301, + nil, nil, nil, nil, nil, nil, nil, 301, nil, nil, + nil, nil, 301, 301, 301, 301, 301, 301, nil, nil, + nil, 301, 301, nil, nil, nil, nil, nil, nil, 301, + nil, nil, 301, 301, 301, nil, 301, 301, 304, 304, + 304, nil, 304, nil, nil, nil, 304, 304, nil, nil, + nil, 304, nil, 304, 304, 304, 304, 304, 304, 304, + nil, nil, nil, nil, nil, 304, 304, 304, 304, 304, + 304, 304, nil, nil, 304, nil, nil, nil, nil, nil, + nil, 304, nil, nil, 304, 304, 304, 304, 304, 304, + 304, 304, nil, 304, 304, 304, nil, 304, 304, nil, + 304, 304, 304, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 304, nil, nil, 304, nil, nil, 304, 304, + nil, nil, 304, nil, nil, nil, nil, nil, 304, nil, + nil, nil, nil, nil, nil, nil, 304, nil, nil, nil, + nil, 304, 304, 304, 304, 304, 304, nil, nil, nil, + 304, 304, nil, nil, nil, nil, nil, nil, 304, nil, + nil, 304, 304, 304, nil, 304, 304, 305, 305, 305, + nil, 305, nil, nil, nil, 305, 305, nil, nil, nil, + 305, nil, 305, 305, 305, 305, 305, 305, 305, nil, + nil, nil, nil, nil, 305, 305, 305, 305, 305, 305, + 305, nil, nil, 305, nil, nil, nil, nil, nil, nil, + 305, nil, nil, 305, 305, 305, 305, 305, 305, 305, + 305, nil, 305, 305, 305, nil, 305, 305, nil, 305, + 305, 305, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 305, nil, nil, 305, nil, nil, 305, 305, nil, + nil, 305, nil, nil, nil, nil, nil, 305, nil, nil, + nil, nil, nil, nil, nil, 305, nil, nil, nil, nil, + 305, 305, 305, 305, 305, 305, nil, nil, nil, 305, + 305, nil, nil, nil, nil, nil, nil, 305, nil, nil, + 305, 305, 305, nil, 305, 305, 311, 311, 311, 311, + 311, nil, nil, nil, 311, 311, nil, nil, nil, 311, + nil, 311, 311, 311, 311, 311, 311, 311, nil, nil, + nil, nil, nil, 311, 311, 311, 311, 311, 311, 311, + nil, nil, 311, nil, nil, nil, nil, nil, 311, 311, + nil, 311, 311, 311, 311, 311, 311, 311, 311, 311, + nil, 311, 311, 311, nil, 311, 311, nil, 311, 311, + 311, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 311, nil, nil, 311, nil, nil, 311, 311, nil, nil, + 311, nil, 311, nil, nil, nil, 311, nil, nil, nil, + nil, nil, nil, nil, 311, nil, nil, nil, nil, 311, + 311, 311, 311, 311, 311, nil, nil, nil, 311, 311, + nil, nil, nil, nil, nil, nil, 311, nil, nil, 311, + 311, 311, nil, 311, 311, 319, 319, 319, nil, 319, + nil, nil, nil, 319, 319, nil, nil, nil, 319, nil, + 319, 319, 319, 319, 319, 319, 319, nil, nil, nil, + nil, nil, 319, 319, 319, 319, 319, 319, 319, nil, + nil, 319, nil, nil, nil, nil, nil, nil, 319, nil, + nil, 319, 319, 319, 319, 319, 319, 319, 319, nil, + 319, 319, 319, nil, 319, 319, nil, nil, nil, 319, + nil, nil, nil, nil, nil, 1059, nil, 1059, 1059, 1059, + 1059, 1059, nil, nil, nil, nil, nil, nil, nil, 319, + nil, 1059, 319, nil, nil, 319, 319, nil, nil, 319, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1059, nil, nil, nil, nil, 319, 319, + 319, 319, 319, 319, 1059, 1059, nil, 319, 319, nil, + nil, nil, 319, nil, nil, 319, nil, nil, 319, 319, + 319, nil, 319, 319, 336, 336, 336, nil, 336, nil, + nil, nil, 336, 336, nil, nil, nil, 336, 1059, 336, + 336, 336, 336, 336, 336, 336, nil, nil, nil, nil, + nil, 336, 336, 336, 336, 336, 336, 336, nil, nil, + 336, nil, nil, nil, nil, nil, nil, 336, nil, nil, + 336, 336, 336, 336, 336, 336, 336, 336, nil, 336, + 336, 336, nil, 336, 336, nil, nil, nil, 336, nil, + nil, nil, nil, nil, 1061, nil, 1061, 1061, 1061, 1061, + 1061, nil, nil, nil, nil, nil, nil, nil, 336, nil, + 1061, 336, nil, nil, 336, 336, nil, nil, 336, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1061, nil, nil, nil, nil, 336, 336, 336, + 336, 336, 336, 1061, 1061, nil, 336, 336, nil, nil, + nil, nil, nil, nil, 336, nil, nil, 336, 336, 336, + nil, 336, 336, 343, 343, 343, nil, 343, nil, nil, + nil, 343, 343, nil, nil, nil, 343, 1061, 343, 343, + 343, 343, 343, 343, 343, nil, nil, nil, nil, nil, + 343, 343, 343, 343, 343, 343, 343, nil, nil, 343, + nil, nil, nil, nil, nil, nil, 343, nil, nil, 343, + 343, 343, 343, 343, 343, 343, 343, nil, 343, 343, + 343, nil, 343, 343, nil, 343, 343, 343, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 343, nil, nil, + 343, nil, nil, 343, 343, nil, nil, 343, nil, nil, + nil, nil, nil, 343, nil, nil, nil, nil, nil, nil, + nil, 343, nil, nil, nil, nil, 343, 343, 343, 343, + 343, 343, nil, nil, nil, 343, 343, nil, nil, nil, + nil, nil, nil, 343, nil, nil, 343, 343, 343, nil, + 343, 343, 345, 345, 345, nil, 345, nil, nil, nil, + 345, 345, nil, nil, nil, 345, nil, 345, 345, 345, + 345, 345, 345, 345, nil, nil, nil, nil, nil, 345, + 345, 345, 345, 345, 345, 345, nil, nil, 345, nil, + nil, nil, nil, nil, nil, 345, nil, nil, 345, 345, + 345, 345, 345, 345, 345, 345, nil, 345, 345, 345, + nil, 345, 345, nil, 345, 345, 345, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 345, nil, nil, 345, + 345, nil, 345, 345, nil, nil, 345, nil, nil, nil, + nil, nil, 345, nil, nil, nil, nil, nil, nil, nil, + 345, nil, nil, nil, nil, 345, 345, 345, 345, 345, + 345, nil, nil, nil, 345, 345, nil, nil, nil, nil, + nil, nil, 345, nil, nil, 345, 345, 345, nil, 345, + 345, 349, 349, 349, nil, 349, nil, nil, nil, 349, + 349, nil, nil, nil, 349, nil, 349, 349, 349, 349, + 349, 349, 349, nil, nil, nil, nil, nil, 349, 349, + 349, 349, 349, 349, 349, nil, nil, 349, nil, nil, + nil, nil, nil, nil, 349, nil, nil, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, 349, nil, + 349, 349, nil, 349, 349, 349, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 349, nil, nil, 349, nil, + nil, 349, 349, nil, nil, 349, nil, 349, nil, nil, + nil, 349, nil, nil, nil, nil, nil, nil, nil, 349, + nil, nil, nil, nil, 349, 349, 349, 349, 349, 349, + nil, nil, nil, 349, 349, nil, nil, nil, nil, nil, + nil, 349, nil, 349, 349, 349, 349, nil, 349, 349, + 350, 350, 350, nil, 350, nil, nil, nil, 350, 350, + nil, nil, nil, 350, nil, 350, 350, 350, 350, 350, + 350, 350, nil, nil, nil, nil, nil, 350, 350, 350, + 350, 350, 350, 350, nil, nil, 350, nil, nil, nil, + nil, nil, nil, 350, nil, nil, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, nil, 350, + 350, nil, 350, 350, 350, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 350, nil, nil, 350, nil, nil, + 350, 350, nil, nil, 350, nil, nil, nil, nil, nil, + 350, nil, nil, nil, nil, nil, nil, nil, 350, nil, + nil, nil, nil, 350, 350, 350, 350, 350, 350, nil, + nil, nil, 350, 350, nil, nil, nil, nil, nil, nil, + 350, nil, 350, 350, 350, 350, nil, 350, 350, 355, + 355, 355, nil, 355, nil, nil, nil, 355, 355, nil, + nil, nil, 355, nil, 355, 355, 355, 355, 355, 355, + 355, nil, nil, nil, nil, nil, 355, 355, 355, 355, + 355, 355, 355, nil, nil, 355, nil, nil, nil, nil, + nil, nil, 355, nil, nil, 355, 355, 355, 355, 355, + 355, 355, 355, nil, 355, 355, 355, nil, 355, 355, + nil, 355, 355, 355, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 355, nil, nil, 355, nil, nil, 355, + 355, nil, nil, 355, nil, nil, nil, nil, nil, 355, + nil, nil, nil, nil, nil, nil, nil, 355, nil, nil, + nil, nil, 355, 355, 355, 355, 355, 355, nil, nil, + nil, 355, 355, nil, nil, nil, nil, nil, nil, 355, + nil, nil, 355, 355, 355, nil, 355, 355, 376, 376, + 376, nil, 376, nil, nil, nil, 376, 376, nil, nil, + nil, 376, nil, 376, 376, 376, 376, 376, 376, 376, + nil, nil, nil, nil, nil, 376, 376, 376, 376, 376, + 376, 376, nil, nil, 376, nil, nil, nil, nil, nil, + nil, 376, nil, nil, 376, 376, 376, 376, 376, 376, + 376, 376, nil, 376, 376, 376, nil, 376, 376, nil, + 376, 376, 376, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 376, nil, nil, 376, nil, nil, 376, 376, + nil, nil, 376, nil, nil, nil, nil, nil, 376, nil, + nil, nil, nil, nil, nil, nil, 376, nil, nil, nil, + nil, 376, 376, 376, 376, 376, 376, nil, nil, nil, + 376, 376, nil, nil, nil, nil, nil, nil, 376, nil, + nil, 376, 376, 376, nil, 376, 376, 437, 437, 437, + nil, 437, nil, nil, nil, 437, 437, nil, nil, nil, + 437, nil, 437, 437, 437, 437, 437, 437, 437, nil, + nil, nil, nil, nil, 437, 437, 437, 437, 437, 437, + 437, nil, nil, 437, nil, nil, nil, nil, nil, nil, + 437, nil, nil, 437, 437, 437, 437, 437, 437, 437, + 437, nil, 437, 437, 437, nil, 437, 437, nil, 437, + 437, 437, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 437, nil, nil, 437, nil, nil, 437, 437, nil, + nil, 437, nil, nil, nil, nil, nil, 437, nil, nil, + nil, nil, nil, nil, nil, 437, nil, nil, nil, nil, + 437, 437, 437, 437, 437, 437, nil, nil, nil, 437, + 437, nil, nil, nil, nil, nil, nil, 437, nil, nil, + 437, 437, 437, nil, 437, 437, 481, 481, 481, nil, + 481, nil, nil, nil, 481, 481, nil, nil, nil, 481, + nil, 481, 481, 481, 481, 481, 481, 481, nil, nil, + nil, nil, nil, 481, 481, 481, 481, 481, 481, 481, + nil, nil, 481, nil, nil, nil, nil, nil, nil, 481, + nil, nil, 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, nil, 481, 481, nil, 481, 481, + 481, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 481, nil, nil, 481, nil, nil, 481, 481, nil, nil, + 481, nil, 481, nil, 481, nil, 481, nil, nil, nil, + nil, nil, nil, nil, 481, nil, nil, nil, nil, 481, + 481, 481, 481, 481, 481, nil, nil, nil, 481, 481, + nil, nil, nil, nil, nil, nil, 481, nil, 481, 481, + 481, 481, nil, 481, 481, 483, 483, 483, nil, 483, + nil, nil, nil, 483, 483, nil, nil, nil, 483, nil, + 483, 483, 483, 483, 483, 483, 483, nil, nil, nil, + nil, nil, 483, 483, 483, 483, 483, 483, 483, nil, + nil, 483, nil, nil, nil, nil, nil, nil, 483, nil, + nil, 483, 483, 483, 483, 483, 483, 483, 483, nil, + 483, 483, 483, nil, 483, 483, nil, 483, 483, 483, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 483, + nil, nil, 483, nil, nil, 483, 483, nil, nil, 483, + nil, nil, nil, nil, nil, 483, nil, nil, nil, nil, + nil, nil, nil, 483, nil, nil, nil, nil, 483, 483, + 483, 483, 483, 483, nil, nil, nil, 483, 483, nil, + nil, nil, nil, nil, nil, 483, nil, nil, 483, 483, + 483, nil, 483, 483, 484, 484, 484, nil, 484, nil, + nil, nil, 484, 484, nil, nil, nil, 484, nil, 484, + 484, 484, 484, 484, 484, 484, nil, nil, nil, nil, + nil, 484, 484, 484, 484, 484, 484, 484, nil, nil, + 484, nil, nil, nil, nil, nil, nil, 484, nil, nil, + 484, 484, 484, 484, 484, 484, 484, 484, nil, 484, + 484, 484, nil, 484, 484, nil, 484, 484, 484, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 484, nil, + nil, 484, nil, nil, 484, 484, nil, nil, 484, nil, + nil, nil, nil, nil, 484, nil, nil, nil, nil, nil, + nil, nil, 484, nil, nil, nil, nil, 484, 484, 484, + 484, 484, 484, nil, nil, nil, 484, 484, nil, nil, + nil, nil, nil, nil, 484, nil, nil, 484, 484, 484, + nil, 484, 484, 485, 485, 485, nil, 485, nil, nil, + nil, 485, 485, nil, nil, nil, 485, nil, 485, 485, + 485, 485, 485, 485, 485, nil, nil, nil, nil, nil, + 485, 485, 485, 485, 485, 485, 485, nil, nil, 485, + nil, nil, nil, nil, nil, nil, 485, nil, nil, 485, + 485, 485, 485, 485, 485, 485, 485, nil, 485, 485, + 485, nil, 485, 485, nil, 485, 485, 485, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 485, nil, nil, + 485, nil, nil, 485, 485, nil, nil, 485, nil, nil, + nil, nil, nil, 485, nil, nil, nil, nil, nil, nil, + nil, 485, nil, nil, nil, nil, 485, 485, 485, 485, + 485, 485, nil, nil, nil, 485, 485, nil, nil, nil, + nil, nil, nil, 485, nil, nil, 485, 485, 485, nil, + 485, 485, 523, 523, 523, nil, 523, nil, nil, nil, + 523, 523, nil, nil, nil, 523, nil, 523, 523, 523, + 523, 523, 523, 523, nil, nil, nil, nil, nil, 523, + 523, 523, 523, 523, 523, 523, nil, nil, 523, nil, + nil, nil, nil, nil, nil, 523, nil, nil, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, + nil, 523, 523, nil, 523, 523, 523, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 523, nil, nil, 523, + nil, nil, 523, 523, nil, nil, 523, nil, 523, nil, + 523, nil, 523, nil, nil, nil, nil, nil, nil, nil, + 523, nil, nil, nil, nil, 523, 523, 523, 523, 523, + 523, nil, nil, nil, 523, 523, nil, nil, nil, nil, + nil, nil, 523, nil, 523, 523, 523, 523, nil, 523, + 523, 526, 526, 526, nil, 526, nil, nil, nil, 526, + 526, nil, nil, nil, 526, nil, 526, 526, 526, 526, + 526, 526, 526, nil, nil, nil, nil, nil, 526, 526, + 526, 526, 526, 526, 526, nil, nil, 526, nil, nil, + nil, nil, nil, nil, 526, nil, nil, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, nil, + 526, 526, nil, 526, 526, 526, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 526, nil, nil, 526, nil, + nil, 526, 526, nil, nil, 526, nil, nil, nil, 526, + nil, 526, nil, nil, nil, nil, nil, nil, nil, 526, + nil, nil, nil, nil, 526, 526, 526, 526, 526, 526, + nil, nil, nil, 526, 526, nil, nil, nil, nil, nil, + nil, 526, nil, 526, 526, 526, 526, nil, 526, 526, + 528, 528, 528, nil, 528, nil, nil, nil, 528, 528, + nil, nil, nil, 528, nil, 528, 528, 528, 528, 528, + 528, 528, nil, nil, nil, nil, nil, 528, 528, 528, + 528, 528, 528, 528, nil, nil, 528, nil, nil, nil, + nil, nil, nil, 528, nil, nil, 528, 528, 528, 528, + 528, 528, 528, 528, nil, 528, 528, 528, nil, 528, + 528, nil, 528, 528, 528, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 528, nil, nil, 528, nil, nil, + 528, 528, nil, nil, 528, nil, nil, nil, nil, nil, + 528, nil, nil, nil, nil, nil, nil, nil, 528, nil, + nil, nil, nil, 528, 528, 528, 528, 528, 528, nil, + nil, nil, 528, 528, nil, nil, nil, nil, nil, nil, + 528, nil, nil, 528, 528, 528, nil, 528, 528, 534, + 534, 534, 534, 534, nil, nil, nil, 534, 534, nil, + nil, nil, 534, nil, 534, 534, 534, 534, 534, 534, + 534, nil, nil, nil, nil, nil, 534, 534, 534, 534, + 534, 534, 534, nil, nil, 534, nil, nil, nil, nil, + nil, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, nil, 534, 534, 534, nil, 534, 534, + nil, 534, 534, 534, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 534, nil, nil, 534, nil, nil, 534, + 534, nil, nil, 534, nil, 534, nil, nil, nil, 534, + nil, nil, nil, nil, nil, nil, nil, 534, nil, nil, + nil, nil, 534, 534, 534, 534, 534, 534, nil, nil, + nil, 534, 534, nil, nil, nil, nil, nil, 534, 534, + nil, nil, 534, 534, 534, nil, 534, 534, 542, 542, + 542, nil, 542, nil, nil, nil, 542, 542, nil, nil, + nil, 542, nil, 542, 542, 542, 542, 542, 542, 542, + nil, nil, nil, nil, nil, 542, 542, 542, 542, 542, + 542, 542, nil, nil, 542, nil, nil, nil, nil, nil, + nil, 542, nil, nil, 542, 542, 542, 542, 542, 542, + 542, 542, nil, 542, 542, 542, nil, 542, 542, nil, + nil, nil, 542, nil, nil, nil, nil, nil, 1082, nil, + 1082, 1082, 1082, 1082, 1082, nil, nil, nil, nil, nil, + nil, nil, 542, nil, 1082, 542, nil, nil, 542, 542, + nil, nil, 542, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1082, nil, nil, nil, + nil, 542, 542, 542, 542, 542, 542, 1082, 1082, nil, + 542, 542, nil, nil, nil, nil, nil, nil, 542, nil, + nil, 542, 542, 542, nil, 542, 542, 544, 544, 544, + nil, 544, nil, nil, nil, 544, 544, nil, nil, nil, + 544, 1082, 544, 544, 544, 544, 544, 544, 544, nil, + nil, nil, nil, nil, 544, 544, 544, 544, 544, 544, + 544, nil, nil, 544, nil, nil, nil, nil, nil, nil, + 544, nil, nil, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, nil, 544, 544, nil, 544, + 544, 544, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 544, nil, nil, 544, nil, nil, 544, 544, nil, + nil, 544, nil, 544, nil, 544, nil, 544, nil, nil, + nil, nil, nil, nil, nil, 544, nil, nil, nil, nil, + 544, 544, 544, 544, 544, 544, nil, nil, nil, 544, + 544, nil, nil, nil, nil, nil, nil, 544, nil, 544, + 544, 544, 544, nil, 544, 544, 550, 550, 550, nil, + 550, nil, nil, nil, 550, 550, nil, nil, nil, 550, + nil, 550, 550, 550, 550, 550, 550, 550, nil, nil, + nil, nil, nil, 550, 550, 550, 550, 550, 550, 550, + nil, nil, 550, nil, nil, nil, nil, nil, nil, 550, + nil, nil, 550, 550, 550, 550, 550, 550, 550, 550, + nil, 550, 550, 550, nil, 550, 550, nil, nil, nil, + 550, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 550, nil, nil, 550, nil, nil, 550, 550, nil, nil, + 550, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 550, + 550, 550, 550, 550, 550, nil, nil, nil, 550, 550, + nil, nil, nil, nil, nil, nil, 550, nil, nil, 550, + 550, 550, nil, 550, 550, 553, 553, 553, nil, 553, + nil, nil, nil, 553, 553, nil, nil, nil, 553, nil, + 553, 553, 553, 553, 553, 553, 553, nil, nil, nil, + nil, nil, 553, 553, 553, 553, 553, 553, 553, nil, + nil, 553, nil, nil, nil, nil, nil, nil, 553, nil, + nil, 553, 553, 553, 553, 553, 553, 553, 553, nil, + 553, 553, 553, nil, 553, 553, nil, 553, 553, 553, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 553, + nil, nil, 553, nil, nil, 553, 553, nil, nil, 553, + nil, nil, nil, nil, nil, 553, nil, nil, nil, nil, + nil, nil, nil, 553, nil, nil, nil, nil, 553, 553, + 553, 553, 553, 553, nil, nil, nil, 553, 553, nil, + nil, nil, nil, nil, nil, 553, nil, nil, 553, 553, + 553, nil, 553, 553, 554, 554, 554, nil, 554, nil, + nil, nil, 554, 554, nil, nil, nil, 554, nil, 554, + 554, 554, 554, 554, 554, 554, nil, nil, nil, nil, + nil, 554, 554, 554, 554, 554, 554, 554, nil, nil, + 554, nil, nil, nil, nil, nil, nil, 554, nil, nil, + 554, 554, 554, 554, 554, 554, 554, 554, nil, 554, + 554, 554, nil, 554, 554, nil, 554, 554, 554, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 554, nil, + nil, 554, nil, nil, 554, 554, nil, nil, 554, nil, + nil, nil, nil, nil, 554, nil, nil, nil, nil, nil, + nil, nil, 554, nil, nil, nil, nil, 554, 554, 554, + 554, 554, 554, nil, nil, nil, 554, 554, nil, nil, + nil, nil, nil, nil, 554, nil, nil, 554, 554, 554, + nil, 554, 554, 559, 559, 559, nil, 559, nil, nil, + nil, 559, 559, nil, nil, nil, 559, nil, 559, 559, + 559, 559, 559, 559, 559, nil, nil, nil, nil, nil, + 559, 559, 559, 559, 559, 559, 559, nil, nil, 559, + nil, nil, nil, nil, nil, nil, 559, nil, nil, 559, + 559, 559, 559, 559, 559, 559, 559, nil, 559, 559, + 559, nil, 559, 559, nil, 559, 559, 559, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 559, nil, nil, + 559, nil, nil, 559, 559, nil, nil, 559, nil, nil, + nil, nil, nil, 559, nil, nil, nil, nil, nil, nil, + nil, 559, nil, nil, nil, nil, 559, 559, 559, 559, + 559, 559, nil, nil, nil, 559, 559, nil, nil, nil, + nil, nil, nil, 559, nil, nil, 559, 559, 559, nil, + 559, 559, 583, 583, 583, nil, 583, nil, nil, nil, + 583, 583, nil, nil, nil, 583, nil, 583, 583, 583, + 583, 583, 583, 583, nil, nil, nil, nil, nil, 583, + 583, 583, 583, 583, 583, 583, nil, nil, 583, nil, + nil, nil, nil, nil, nil, 583, nil, nil, 583, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, + nil, 583, 583, nil, 583, 583, 583, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 583, nil, nil, 583, + nil, nil, 583, 583, nil, nil, 583, nil, 583, nil, + 583, nil, 583, nil, nil, nil, nil, nil, nil, nil, + 583, nil, nil, nil, nil, 583, 583, 583, 583, 583, + 583, nil, nil, nil, 583, 583, nil, nil, nil, nil, + nil, nil, 583, nil, 583, 583, 583, 583, nil, 583, + 583, 593, 593, 593, nil, 593, nil, nil, nil, 593, + 593, nil, nil, nil, 593, nil, 593, 593, 593, 593, + 593, 593, 593, nil, nil, nil, nil, nil, 593, 593, + 593, 593, 593, 593, 593, nil, nil, 593, nil, nil, + nil, nil, nil, nil, 593, nil, nil, 593, 593, 593, + 593, 593, 593, 593, 593, 593, 593, 593, 593, nil, + 593, 593, nil, 593, 593, 593, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 593, nil, nil, 593, nil, + nil, 593, 593, nil, nil, 593, nil, 593, nil, 593, + nil, 593, nil, nil, nil, nil, nil, nil, nil, 593, + nil, nil, nil, nil, 593, 593, 593, 593, 593, 593, + nil, nil, nil, 593, 593, nil, nil, nil, nil, nil, + nil, 593, nil, 593, 593, 593, 593, nil, 593, 593, + 603, 603, 603, nil, 603, nil, nil, nil, 603, 603, + nil, nil, nil, 603, nil, 603, 603, 603, 603, 603, + 603, 603, nil, nil, nil, nil, nil, 603, 603, 603, + 603, 603, 603, 603, nil, nil, 603, nil, nil, nil, + nil, nil, nil, 603, nil, nil, 603, 603, 603, 603, + 603, 603, 603, 603, nil, 603, 603, 603, nil, 603, + 603, nil, 603, 603, 603, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 603, nil, nil, 603, nil, nil, + 603, 603, nil, nil, 603, nil, nil, nil, nil, nil, + 603, nil, nil, nil, nil, nil, nil, nil, 603, nil, + nil, nil, nil, 603, 603, 603, 603, 603, 603, nil, + nil, nil, 603, 603, nil, nil, nil, nil, nil, nil, + 603, nil, nil, 603, 603, 603, nil, 603, 603, 625, + 625, 625, nil, 625, nil, nil, nil, 625, 625, nil, + nil, nil, 625, nil, 625, 625, 625, 625, 625, 625, + 625, nil, nil, nil, nil, nil, 625, 625, 625, 625, + 625, 625, 625, nil, nil, 625, nil, nil, nil, nil, + nil, nil, 625, nil, nil, 625, 625, 625, 625, 625, + 625, 625, 625, nil, 625, 625, 625, nil, 625, 625, + nil, 625, 625, 625, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 625, nil, nil, 625, nil, nil, 625, + 625, nil, nil, 625, nil, nil, nil, nil, nil, 625, + nil, nil, nil, nil, nil, nil, nil, 625, nil, nil, + nil, nil, 625, 625, 625, 625, 625, 625, nil, nil, + nil, 625, 625, nil, nil, nil, nil, nil, nil, 625, + nil, nil, 625, 625, 625, nil, 625, 625, 665, 665, + 665, nil, 665, nil, nil, nil, 665, 665, nil, nil, + nil, 665, nil, 665, 665, 665, 665, 665, 665, 665, + nil, nil, nil, nil, nil, 665, 665, 665, 665, 665, + 665, 665, nil, nil, 665, nil, nil, nil, nil, nil, + nil, 665, nil, nil, 665, 665, 665, 665, 665, 665, + 665, 665, nil, 665, 665, 665, nil, 665, 665, nil, + 665, 665, 665, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 665, nil, nil, 665, nil, nil, 665, 665, + nil, nil, 665, nil, 665, nil, nil, nil, 665, nil, + nil, nil, nil, nil, nil, nil, 665, nil, nil, nil, + nil, 665, 665, 665, 665, 665, 665, nil, nil, nil, + 665, 665, nil, nil, nil, nil, nil, nil, 665, nil, + nil, 665, 665, 665, nil, 665, 665, 666, 666, 666, + nil, 666, nil, nil, nil, 666, 666, nil, nil, nil, + 666, nil, 666, 666, 666, 666, 666, 666, 666, nil, + nil, nil, nil, nil, 666, 666, 666, 666, 666, 666, + 666, nil, nil, 666, nil, nil, nil, nil, nil, nil, + 666, nil, nil, 666, 666, 666, 666, 666, 666, 666, + 666, nil, 666, 666, 666, nil, 666, 666, nil, 666, + 666, 666, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 666, nil, nil, 666, nil, nil, 666, 666, nil, + nil, 666, nil, nil, nil, nil, nil, 666, nil, nil, + nil, nil, nil, nil, nil, 666, nil, nil, nil, nil, + 666, 666, 666, 666, 666, 666, nil, nil, nil, 666, + 666, nil, nil, nil, nil, nil, nil, 666, nil, nil, + 666, 666, 666, nil, 666, 666, 667, 667, 667, nil, + 667, nil, nil, nil, 667, 667, nil, nil, nil, 667, + nil, 667, 667, 667, 667, 667, 667, 667, nil, nil, + nil, nil, nil, 667, 667, 667, 667, 667, 667, 667, + nil, nil, 667, nil, nil, nil, nil, nil, nil, 667, + nil, nil, 667, 667, 667, 667, 667, 667, 667, 667, + 667, 667, 667, 667, nil, 667, 667, nil, 667, 667, + 667, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 667, nil, nil, 667, nil, nil, 667, 667, nil, nil, + 667, nil, 667, nil, 667, nil, 667, nil, nil, nil, + nil, nil, nil, nil, 667, nil, nil, nil, nil, 667, + 667, 667, 667, 667, 667, nil, nil, nil, 667, 667, + nil, nil, nil, nil, nil, nil, 667, nil, 667, 667, + 667, 667, nil, 667, 667, 670, 670, 670, nil, 670, + nil, nil, nil, 670, 670, nil, nil, nil, 670, nil, + 670, 670, 670, 670, 670, 670, 670, nil, nil, nil, + nil, nil, 670, 670, 670, 670, 670, 670, 670, nil, + nil, 670, nil, nil, nil, nil, nil, nil, 670, nil, + nil, 670, 670, 670, 670, 670, 670, 670, 670, nil, + 670, 670, 670, nil, 670, 670, nil, 670, 670, 670, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 670, + nil, nil, 670, nil, nil, 670, 670, nil, nil, 670, + nil, nil, nil, nil, nil, 670, nil, nil, nil, nil, + nil, nil, nil, 670, nil, nil, nil, nil, 670, 670, + 670, 670, 670, 670, nil, nil, nil, 670, 670, nil, + nil, nil, nil, nil, nil, 670, nil, nil, 670, 670, + 670, nil, 670, 670, 673, 673, 673, nil, 673, nil, + nil, nil, 673, 673, nil, nil, nil, 673, nil, 673, + 673, 673, 673, 673, 673, 673, nil, nil, nil, nil, + nil, 673, 673, 673, 673, 673, 673, 673, nil, nil, + 673, nil, nil, nil, nil, nil, nil, 673, nil, nil, + 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, + 673, 673, nil, 673, 673, nil, 673, 673, 673, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 673, nil, + nil, 673, nil, nil, 673, 673, nil, nil, 673, nil, + 673, nil, 673, nil, 673, nil, nil, nil, nil, nil, + nil, nil, 673, nil, nil, nil, nil, 673, 673, 673, + 673, 673, 673, nil, nil, nil, 673, 673, nil, nil, + nil, nil, nil, nil, 673, nil, 673, 673, 673, 673, + nil, 673, 673, 674, 674, 674, nil, 674, nil, nil, + nil, 674, 674, nil, nil, nil, 674, nil, 674, 674, + 674, 674, 674, 674, 674, nil, nil, nil, nil, nil, + 674, 674, 674, 674, 674, 674, 674, nil, nil, 674, + nil, nil, nil, nil, nil, nil, 674, nil, nil, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, nil, 674, 674, nil, 674, 674, 674, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 674, nil, nil, + 674, nil, nil, 674, 674, nil, nil, 674, nil, nil, + nil, 674, nil, 674, nil, nil, nil, nil, nil, nil, + nil, 674, nil, nil, nil, nil, 674, 674, 674, 674, + 674, 674, nil, nil, nil, 674, 674, nil, nil, nil, + nil, nil, nil, 674, nil, 674, 674, 674, 674, nil, + 674, 674, 675, 675, 675, nil, 675, nil, nil, nil, + 675, 675, nil, nil, nil, 675, nil, 675, 675, 675, + 675, 675, 675, 675, nil, nil, nil, nil, nil, 675, + 675, 675, 675, 675, 675, 675, nil, nil, 675, nil, + nil, nil, nil, nil, nil, 675, nil, nil, 675, 675, + 675, 675, 675, 675, 675, 675, nil, 675, 675, 675, + nil, 675, 675, nil, 675, 675, 675, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 675, nil, nil, 675, + nil, nil, 675, 675, nil, nil, 675, nil, nil, nil, + nil, nil, 675, nil, nil, nil, nil, nil, nil, nil, + 675, nil, nil, nil, nil, 675, 675, 675, 675, 675, + 675, nil, nil, nil, 675, 675, nil, nil, nil, nil, + nil, nil, 675, nil, nil, 675, 675, 675, nil, 675, + 675, 676, 676, 676, nil, 676, nil, nil, nil, 676, + 676, nil, nil, nil, 676, nil, 676, 676, 676, 676, + 676, 676, 676, nil, nil, nil, nil, nil, 676, 676, + 676, 676, 676, 676, 676, nil, nil, 676, nil, nil, + nil, nil, nil, nil, 676, nil, nil, 676, 676, 676, + 676, 676, 676, 676, 676, nil, 676, 676, 676, nil, + 676, 676, nil, 676, 676, 676, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 676, nil, nil, 676, nil, + nil, 676, 676, nil, nil, 676, nil, nil, nil, nil, + nil, 676, nil, nil, nil, nil, nil, nil, nil, 676, + nil, nil, nil, nil, 676, 676, 676, 676, 676, 676, + nil, nil, nil, 676, 676, nil, nil, nil, nil, nil, + nil, 676, nil, nil, 676, 676, 676, nil, 676, 676, + 681, 681, 681, nil, 681, nil, nil, nil, 681, 681, + nil, nil, nil, 681, nil, 681, 681, 681, 681, 681, + 681, 681, nil, nil, nil, nil, nil, 681, 681, 681, + 681, 681, 681, 681, nil, nil, 681, nil, nil, nil, + nil, nil, nil, 681, nil, nil, 681, 681, 681, 681, + 681, 681, 681, 681, nil, 681, 681, 681, nil, 681, + 681, nil, 681, 681, 681, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 681, nil, nil, 681, nil, nil, + 681, 681, nil, nil, 681, nil, nil, nil, nil, nil, + 681, nil, nil, nil, nil, nil, nil, nil, 681, nil, + nil, nil, nil, 681, 681, 681, 681, 681, 681, nil, + nil, nil, 681, 681, nil, nil, nil, nil, nil, nil, + 681, nil, nil, 681, 681, 681, nil, 681, 681, 682, + 682, 682, nil, 682, nil, nil, nil, 682, 682, nil, + nil, nil, 682, nil, 682, 682, 682, 682, 682, 682, + 682, nil, nil, nil, nil, nil, 682, 682, 682, 682, + 682, 682, 682, nil, nil, 682, nil, nil, nil, nil, + nil, nil, 682, nil, nil, 682, 682, 682, 682, 682, + 682, 682, 682, nil, 682, 682, 682, nil, 682, 682, + nil, 682, 682, 682, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 682, nil, nil, 682, nil, nil, 682, + 682, nil, nil, 682, nil, nil, nil, nil, nil, 682, + nil, nil, nil, nil, nil, nil, nil, 682, nil, nil, + nil, nil, 682, 682, 682, 682, 682, 682, nil, nil, + nil, 682, 682, nil, nil, nil, nil, nil, nil, 682, + nil, nil, 682, 682, 682, nil, 682, 682, 706, 706, + 706, nil, 706, nil, nil, nil, 706, 706, nil, nil, + nil, 706, nil, 706, 706, 706, 706, 706, 706, 706, + nil, nil, nil, nil, nil, 706, 706, 706, 706, 706, + 706, 706, nil, nil, 706, nil, nil, nil, nil, nil, + nil, 706, nil, nil, 706, 706, 706, 706, 706, 706, + 706, 706, nil, 706, 706, 706, nil, 706, 706, nil, + 706, 706, 706, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 706, nil, nil, 706, nil, nil, 706, 706, + nil, nil, 706, nil, nil, nil, nil, nil, 706, nil, + nil, nil, nil, nil, nil, nil, 706, nil, nil, nil, + nil, 706, 706, 706, 706, 706, 706, nil, nil, nil, + 706, 706, nil, nil, nil, nil, nil, nil, 706, nil, + nil, 706, 706, 706, nil, 706, 706, 709, 709, 709, + nil, 709, nil, nil, nil, 709, 709, nil, nil, nil, + 709, nil, 709, 709, 709, 709, 709, 709, 709, nil, + nil, nil, nil, nil, 709, 709, 709, 709, 709, 709, + 709, nil, nil, 709, nil, nil, nil, nil, nil, nil, + 709, nil, nil, 709, 709, 709, 709, 709, 709, 709, + 709, nil, 709, 709, 709, nil, 709, 709, nil, 709, + 709, 709, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 709, nil, nil, 709, nil, nil, 709, 709, nil, + nil, 709, nil, nil, nil, nil, nil, 709, nil, nil, + nil, nil, nil, nil, nil, 709, nil, nil, nil, nil, + 709, 709, 709, 709, 709, 709, nil, nil, nil, 709, + 709, nil, nil, nil, nil, nil, nil, 709, nil, nil, + 709, 709, 709, nil, 709, 709, 713, 713, 713, nil, + 713, nil, nil, nil, 713, 713, nil, nil, nil, 713, + nil, 713, 713, 713, 713, 713, 713, 713, nil, nil, + nil, nil, nil, 713, 713, 713, 713, 713, 713, 713, + nil, nil, 713, nil, nil, nil, nil, nil, nil, 713, + nil, nil, 713, 713, 713, 713, 713, 713, 713, 713, + nil, 713, 713, 713, nil, 713, 713, nil, nil, nil, + 713, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 713, nil, nil, 713, nil, nil, 713, 713, nil, nil, + 713, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 713, + 713, 713, 713, 713, 713, nil, nil, nil, 713, 713, + nil, nil, nil, nil, nil, nil, 713, nil, nil, 713, + 713, 713, nil, 713, 713, 724, 724, 724, nil, 724, + nil, nil, nil, 724, 724, nil, nil, nil, 724, nil, + 724, 724, 724, 724, 724, 724, 724, nil, nil, nil, + nil, nil, 724, 724, 724, 724, 724, 724, 724, nil, + nil, 724, nil, nil, nil, nil, nil, nil, 724, nil, + nil, 724, 724, 724, 724, 724, 724, 724, 724, nil, + 724, 724, 724, nil, 724, 724, nil, nil, nil, 724, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 724, + nil, nil, 724, nil, nil, 724, 724, nil, nil, 724, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 724, 724, + 724, 724, 724, 724, nil, nil, nil, 724, 724, nil, + nil, nil, nil, nil, nil, 724, nil, nil, 724, 724, + 724, nil, 724, 724, 730, 730, 730, nil, 730, nil, + nil, nil, 730, 730, nil, nil, nil, 730, nil, 730, + 730, 730, 730, 730, 730, 730, nil, nil, nil, nil, + nil, 730, 730, 730, 730, 730, 730, 730, nil, nil, + 730, nil, nil, nil, nil, nil, nil, 730, nil, nil, + 730, 730, 730, 730, 730, 730, 730, 730, nil, 730, + 730, 730, nil, 730, 730, nil, 730, 730, 730, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 730, nil, + nil, 730, nil, nil, 730, 730, nil, nil, 730, nil, + 730, nil, nil, nil, 730, nil, nil, nil, nil, nil, + nil, nil, 730, nil, nil, nil, nil, 730, 730, 730, + 730, 730, 730, nil, nil, nil, 730, 730, nil, nil, + nil, nil, nil, nil, 730, nil, nil, 730, 730, 730, + nil, 730, 730, 735, 735, 735, nil, 735, nil, nil, + nil, 735, 735, nil, nil, nil, 735, nil, 735, 735, + 735, 735, 735, 735, 735, nil, nil, nil, nil, nil, + 735, 735, 735, 735, 735, 735, 735, nil, nil, 735, + nil, nil, nil, nil, nil, nil, 735, nil, nil, 735, + 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, + 735, nil, 735, 735, nil, 735, 735, 735, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 735, nil, nil, + 735, nil, nil, 735, 735, nil, nil, 735, nil, 735, + nil, nil, nil, 735, nil, nil, nil, nil, nil, nil, + nil, 735, nil, nil, nil, nil, 735, 735, 735, 735, + 735, 735, nil, nil, nil, 735, 735, nil, nil, nil, + nil, nil, nil, 735, nil, 735, 735, 735, 735, nil, + 735, 735, 738, 738, 738, nil, 738, nil, nil, nil, + 738, 738, nil, nil, nil, 738, nil, 738, 738, 738, + 738, 738, 738, 738, nil, nil, nil, nil, nil, 738, + 738, 738, 738, 738, 738, 738, nil, nil, 738, nil, + nil, nil, nil, nil, nil, 738, nil, nil, 738, 738, + 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, + nil, 738, 738, nil, 738, 738, 738, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 738, nil, nil, 738, + nil, nil, 738, 738, nil, nil, 738, nil, nil, nil, + nil, nil, 738, nil, nil, nil, nil, nil, nil, nil, + 738, nil, nil, nil, nil, 738, 738, 738, 738, 738, + 738, nil, nil, nil, 738, 738, nil, nil, nil, nil, + nil, nil, 738, nil, 738, 738, 738, 738, nil, 738, + 738, 752, 752, 752, nil, 752, nil, nil, nil, 752, + 752, nil, nil, nil, 752, nil, 752, 752, 752, 752, + 752, 752, 752, nil, nil, nil, nil, nil, 752, 752, + 752, 752, 752, 752, 752, nil, nil, 752, nil, nil, + nil, nil, nil, nil, 752, nil, nil, 752, 752, 752, + 752, 752, 752, 752, 752, nil, 752, 752, 752, nil, + 752, 752, nil, 752, 752, 752, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 752, nil, nil, 752, nil, + nil, 752, 752, nil, nil, 752, nil, 752, nil, nil, + nil, 752, nil, nil, nil, nil, nil, nil, nil, 752, + nil, nil, nil, nil, 752, 752, 752, 752, 752, 752, + nil, nil, nil, 752, 752, nil, nil, nil, nil, nil, + nil, 752, nil, nil, 752, 752, 752, nil, 752, 752, + 764, 764, 764, nil, 764, nil, nil, nil, 764, 764, + nil, nil, nil, 764, nil, 764, 764, 764, 764, 764, + 764, 764, nil, nil, nil, nil, nil, 764, 764, 764, + 764, 764, 764, 764, nil, nil, 764, nil, nil, nil, + nil, nil, nil, 764, nil, nil, 764, 764, 764, 764, + 764, 764, 764, 764, nil, 764, 764, 764, nil, 764, + 764, nil, 764, 764, 764, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 764, nil, nil, 764, nil, nil, + 764, 764, nil, nil, 764, nil, nil, nil, nil, nil, + 764, nil, nil, nil, nil, nil, nil, nil, 764, nil, + nil, nil, nil, 764, 764, 764, 764, 764, 764, nil, + nil, nil, 764, 764, nil, nil, nil, nil, nil, nil, + 764, nil, nil, 764, 764, 764, nil, 764, 764, 784, + 784, 784, nil, 784, nil, nil, nil, 784, 784, nil, + nil, nil, 784, nil, 784, 784, 784, 784, 784, 784, + 784, nil, nil, nil, nil, nil, 784, 784, 784, 784, + 784, 784, 784, nil, nil, 784, nil, nil, nil, nil, + nil, nil, 784, nil, nil, 784, 784, 784, 784, 784, + 784, 784, 784, nil, 784, 784, 784, nil, 784, 784, + nil, 784, 784, 784, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 784, nil, nil, 784, nil, nil, 784, + 784, nil, nil, 784, nil, nil, nil, nil, nil, 784, + nil, nil, nil, nil, nil, nil, nil, 784, nil, nil, + nil, nil, 784, 784, 784, 784, 784, 784, nil, nil, + nil, 784, 784, nil, nil, nil, nil, nil, nil, 784, + nil, nil, 784, 784, 784, nil, 784, 784, 806, 806, + 806, nil, 806, nil, nil, nil, 806, 806, nil, nil, + nil, 806, nil, 806, 806, 806, 806, 806, 806, 806, + nil, nil, nil, nil, nil, 806, 806, 806, 806, 806, + 806, 806, nil, nil, 806, nil, nil, nil, nil, nil, + nil, 806, nil, nil, 806, 806, 806, 806, 806, 806, + 806, 806, nil, 806, 806, 806, nil, 806, 806, nil, + 806, 806, 806, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 806, nil, nil, 806, nil, nil, 806, 806, + nil, nil, 806, nil, nil, nil, nil, nil, 806, nil, + nil, nil, nil, nil, nil, nil, 806, nil, nil, nil, + nil, 806, 806, 806, 806, 806, 806, nil, nil, nil, + 806, 806, nil, nil, nil, nil, nil, nil, 806, nil, + nil, 806, 806, 806, nil, 806, 806, 813, 813, 813, + nil, 813, nil, nil, nil, 813, 813, nil, nil, nil, + 813, nil, 813, 813, 813, 813, 813, 813, 813, nil, + nil, nil, nil, nil, 813, 813, 813, 813, 813, 813, + 813, nil, nil, 813, nil, nil, nil, nil, nil, nil, + 813, nil, nil, 813, 813, 813, 813, 813, 813, 813, + 813, nil, 813, 813, 813, nil, 813, 813, nil, 813, + 813, 813, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 813, nil, nil, 813, nil, nil, 813, 813, nil, + nil, 813, nil, nil, nil, nil, nil, 813, nil, nil, + nil, nil, nil, nil, nil, 813, nil, nil, nil, nil, + 813, 813, 813, 813, 813, 813, nil, nil, nil, 813, + 813, nil, nil, nil, nil, nil, nil, 813, nil, nil, + 813, 813, 813, nil, 813, 813, 826, 826, 826, nil, + 826, nil, nil, nil, 826, 826, nil, nil, nil, 826, + nil, 826, 826, 826, 826, 826, 826, 826, nil, nil, + nil, nil, nil, 826, 826, 826, 826, 826, 826, 826, + nil, nil, 826, nil, nil, nil, nil, nil, nil, 826, + nil, nil, 826, 826, 826, 826, 826, 826, 826, 826, + nil, 826, 826, 826, nil, 826, 826, nil, 826, 826, + 826, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 826, nil, nil, 826, nil, nil, 826, 826, nil, nil, + 826, nil, nil, nil, nil, nil, 826, nil, nil, nil, + nil, nil, nil, nil, 826, nil, nil, nil, nil, 826, + 826, 826, 826, 826, 826, nil, nil, nil, 826, 826, + nil, nil, nil, nil, nil, nil, 826, nil, nil, 826, + 826, 826, nil, 826, 826, 827, 827, 827, nil, 827, + nil, nil, nil, 827, 827, nil, nil, nil, 827, nil, + 827, 827, 827, 827, 827, 827, 827, nil, nil, nil, + nil, nil, 827, 827, 827, 827, 827, 827, 827, nil, + nil, 827, nil, nil, nil, nil, nil, nil, 827, nil, + nil, 827, 827, 827, 827, 827, 827, 827, 827, nil, + 827, 827, 827, nil, 827, 827, nil, 827, 827, 827, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 827, + nil, nil, 827, nil, nil, 827, 827, nil, nil, 827, + nil, nil, nil, nil, nil, 827, nil, nil, nil, nil, + nil, nil, nil, 827, nil, nil, nil, nil, 827, 827, + 827, 827, 827, 827, nil, nil, nil, 827, 827, nil, + nil, nil, nil, nil, nil, 827, nil, nil, 827, 827, + 827, nil, 827, 827, 828, 828, 828, nil, 828, nil, + nil, nil, 828, 828, nil, nil, nil, 828, nil, 828, + 828, 828, 828, 828, 828, 828, nil, nil, nil, nil, + nil, 828, 828, 828, 828, 828, 828, 828, nil, nil, + 828, nil, nil, nil, nil, nil, nil, 828, nil, nil, + 828, 828, 828, 828, 828, 828, 828, 828, nil, 828, + 828, 828, nil, 828, 828, nil, 828, 828, 828, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 828, nil, + nil, 828, nil, nil, 828, 828, nil, nil, 828, nil, + nil, nil, nil, nil, 828, nil, nil, nil, nil, nil, + nil, nil, 828, nil, nil, nil, nil, 828, 828, 828, + 828, 828, 828, nil, nil, nil, 828, 828, nil, nil, + nil, nil, nil, nil, 828, nil, nil, 828, 828, 828, + nil, 828, 828, 829, 829, 829, nil, 829, nil, nil, + nil, 829, 829, nil, nil, nil, 829, nil, 829, 829, + 829, 829, 829, 829, 829, nil, nil, nil, nil, nil, + 829, 829, 829, 829, 829, 829, 829, nil, nil, 829, + nil, nil, nil, nil, nil, nil, 829, nil, nil, 829, + 829, 829, 829, 829, 829, 829, 829, nil, 829, 829, + 829, nil, 829, 829, nil, 829, 829, 829, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 829, nil, nil, + 829, nil, nil, 829, 829, nil, nil, 829, nil, nil, + nil, nil, nil, 829, nil, nil, nil, nil, nil, nil, + nil, 829, nil, nil, nil, nil, 829, 829, 829, 829, + 829, 829, nil, nil, nil, 829, 829, nil, nil, nil, + nil, nil, nil, 829, nil, nil, 829, 829, 829, nil, + 829, 829, 831, 831, 831, nil, 831, nil, nil, nil, + 831, 831, nil, nil, nil, 831, nil, 831, 831, 831, + 831, 831, 831, 831, nil, nil, nil, nil, nil, 831, + 831, 831, 831, 831, 831, 831, nil, nil, 831, nil, + nil, nil, nil, nil, nil, 831, nil, nil, 831, 831, + 831, 831, 831, 831, 831, 831, nil, 831, 831, 831, + nil, 831, 831, nil, 831, 831, 831, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 831, nil, nil, 831, + nil, nil, 831, 831, nil, nil, 831, nil, nil, nil, + nil, nil, 831, nil, nil, nil, nil, nil, nil, nil, + 831, nil, nil, nil, nil, 831, 831, 831, 831, 831, + 831, nil, nil, nil, 831, 831, nil, nil, nil, nil, + nil, nil, 831, nil, nil, 831, 831, 831, nil, 831, + 831, 864, 864, 864, nil, 864, nil, nil, nil, 864, + 864, nil, nil, nil, 864, nil, 864, 864, 864, 864, + 864, 864, 864, nil, nil, nil, nil, nil, 864, 864, + 864, 864, 864, 864, 864, nil, nil, 864, nil, nil, + nil, nil, nil, nil, 864, nil, nil, 864, 864, 864, + 864, 864, 864, 864, 864, nil, 864, 864, 864, nil, + 864, 864, nil, 864, 864, 864, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 864, nil, nil, 864, nil, + nil, 864, 864, nil, nil, 864, nil, nil, nil, nil, + nil, 864, nil, nil, nil, nil, nil, nil, nil, 864, + nil, nil, nil, nil, 864, 864, 864, 864, 864, 864, + nil, nil, nil, 864, 864, nil, nil, nil, nil, nil, + nil, 864, nil, nil, 864, 864, 864, nil, 864, 864, + 871, 871, 871, nil, 871, nil, nil, nil, 871, 871, + nil, nil, nil, 871, nil, 871, 871, 871, 871, 871, + 871, 871, nil, nil, nil, nil, nil, 871, 871, 871, + 871, 871, 871, 871, nil, nil, 871, nil, nil, nil, + nil, nil, nil, 871, nil, nil, 871, 871, 871, 871, + 871, 871, 871, 871, nil, 871, 871, 871, nil, 871, + 871, nil, 871, 871, 871, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 871, nil, nil, 871, nil, nil, + 871, 871, nil, nil, 871, nil, nil, nil, nil, nil, + 871, nil, nil, nil, nil, nil, nil, nil, 871, nil, + nil, nil, nil, 871, 871, 871, 871, 871, 871, nil, + nil, nil, 871, 871, nil, nil, nil, nil, nil, nil, + 871, nil, nil, 871, 871, 871, nil, 871, 871, 919, + 919, 919, nil, 919, nil, nil, nil, 919, 919, nil, + nil, nil, 919, nil, 919, 919, 919, 919, 919, 919, + 919, nil, nil, nil, nil, nil, 919, 919, 919, 919, + 919, 919, 919, nil, nil, 919, nil, nil, nil, nil, + nil, nil, 919, nil, nil, 919, 919, 919, 919, 919, + 919, 919, 919, 919, 919, 919, 919, nil, 919, 919, + nil, 919, 919, 919, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 919, nil, nil, 919, nil, nil, 919, + 919, nil, nil, 919, nil, nil, nil, 919, nil, 919, + nil, nil, nil, nil, nil, nil, nil, 919, nil, nil, + nil, nil, 919, 919, 919, 919, 919, 919, nil, nil, + nil, 919, 919, nil, nil, nil, nil, nil, nil, 919, + nil, 919, 919, 919, 919, nil, 919, 919, 920, 920, + 920, nil, 920, nil, nil, nil, 920, 920, nil, nil, + nil, 920, nil, 920, 920, 920, 920, 920, 920, 920, + nil, nil, nil, nil, nil, 920, 920, 920, 920, 920, + 920, 920, nil, nil, 920, nil, nil, nil, nil, nil, + nil, 920, nil, nil, 920, 920, 920, 920, 920, 920, + 920, 920, nil, 920, 920, 920, nil, 920, 920, nil, + 920, 920, 920, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 920, nil, nil, 920, nil, nil, 920, 920, + nil, nil, 920, nil, nil, nil, nil, nil, 920, nil, + nil, nil, nil, nil, nil, nil, 920, nil, nil, nil, + nil, 920, 920, 920, 920, 920, 920, nil, nil, nil, + 920, 920, nil, nil, nil, nil, nil, nil, 920, nil, + nil, 920, 920, 920, nil, 920, 920, 932, 932, 932, + nil, 932, nil, nil, nil, 932, 932, nil, nil, nil, + 932, nil, 932, 932, 932, 932, 932, 932, 932, nil, + nil, nil, nil, nil, 932, 932, 932, 932, 932, 932, + 932, nil, nil, 932, nil, nil, nil, nil, nil, nil, + 932, nil, nil, 932, 932, 932, 932, 932, 932, 932, + 932, nil, 932, 932, 932, nil, 932, 932, nil, nil, + nil, 932, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 932, nil, nil, 932, nil, nil, 932, 932, nil, + nil, 932, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 932, 932, 932, 932, 932, 932, nil, nil, nil, 932, + 932, nil, nil, nil, nil, nil, nil, 932, nil, nil, + 932, 932, 932, nil, 932, 932, 941, 941, 941, nil, + 941, nil, nil, nil, 941, 941, nil, nil, nil, 941, + nil, 941, 941, 941, 941, 941, 941, 941, nil, nil, + nil, nil, nil, 941, 941, 941, 941, 941, 941, 941, + nil, nil, 941, nil, nil, nil, nil, nil, nil, 941, + nil, nil, 941, 941, 941, 941, 941, 941, 941, 941, + nil, 941, 941, 941, nil, 941, 941, nil, nil, nil, + 941, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 941, nil, nil, 941, nil, nil, 941, 941, nil, nil, + 941, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 941, + 941, 941, 941, 941, 941, nil, nil, nil, 941, 941, + nil, nil, nil, nil, nil, nil, 941, nil, nil, 941, + 941, 941, nil, 941, 941, 949, 949, 949, nil, 949, + nil, nil, nil, 949, 949, nil, nil, nil, 949, nil, + 949, 949, 949, 949, 949, 949, 949, nil, nil, nil, + nil, nil, 949, 949, 949, 949, 949, 949, 949, nil, + nil, 949, nil, nil, nil, nil, nil, nil, 949, nil, + nil, 949, 949, 949, 949, 949, 949, 949, 949, nil, + 949, 949, 949, nil, 949, 949, nil, 949, 949, 949, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 949, + nil, nil, 949, nil, nil, 949, 949, nil, nil, 949, + nil, 949, nil, nil, nil, 949, nil, nil, nil, nil, + nil, nil, nil, 949, nil, nil, nil, nil, 949, 949, + 949, 949, 949, 949, nil, nil, nil, 949, 949, nil, + nil, nil, nil, nil, nil, 949, nil, nil, 949, 949, + 949, nil, 949, 949, 990, 990, 990, nil, 990, nil, + nil, nil, 990, 990, nil, nil, nil, 990, nil, 990, + 990, 990, 990, 990, 990, 990, nil, nil, nil, nil, + nil, 990, 990, 990, 990, 990, 990, 990, nil, nil, + 990, nil, nil, nil, nil, nil, nil, 990, nil, nil, + 990, 990, 990, 990, 990, 990, 990, 990, nil, 990, + 990, 990, nil, 990, 990, nil, nil, nil, 990, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 990, nil, + nil, 990, nil, nil, 990, 990, nil, nil, 990, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 990, 990, 990, + 990, 990, 990, nil, nil, nil, 990, 990, nil, nil, + nil, nil, nil, nil, 990, nil, nil, 990, 990, 990, + nil, 990, 990, 1004, 1004, 1004, nil, 1004, nil, nil, + nil, 1004, 1004, nil, nil, nil, 1004, nil, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, nil, nil, nil, nil, nil, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, nil, nil, 1004, + nil, nil, nil, nil, nil, nil, 1004, nil, nil, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, nil, 1004, 1004, + 1004, nil, 1004, 1004, nil, 1004, 1004, 1004, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1004, nil, nil, + 1004, nil, nil, 1004, 1004, nil, nil, 1004, nil, nil, + nil, nil, nil, 1004, nil, nil, nil, nil, nil, nil, + nil, 1004, nil, nil, nil, nil, 1004, 1004, 1004, 1004, + 1004, 1004, nil, nil, nil, 1004, 1004, nil, nil, nil, + nil, nil, nil, 1004, nil, nil, 1004, 1004, 1004, nil, + 1004, 1004, 1035, 1035, 1035, nil, 1035, nil, nil, nil, + 1035, 1035, nil, nil, nil, 1035, nil, 1035, 1035, 1035, + 1035, 1035, 1035, 1035, nil, nil, nil, nil, nil, 1035, + 1035, 1035, 1035, 1035, 1035, 1035, nil, nil, 1035, nil, + nil, nil, nil, nil, nil, 1035, nil, nil, 1035, 1035, + 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, + nil, 1035, 1035, nil, 1035, 1035, 1035, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1035, nil, nil, 1035, + nil, nil, 1035, 1035, nil, nil, 1035, nil, 1035, nil, + 1035, nil, 1035, nil, nil, nil, nil, nil, nil, nil, + 1035, nil, nil, nil, nil, 1035, 1035, 1035, 1035, 1035, + 1035, nil, nil, nil, 1035, 1035, nil, nil, nil, nil, + nil, nil, 1035, nil, 1035, 1035, 1035, 1035, nil, 1035, + 1035, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, nil, nil, nil, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, nil, nil, + nil, nil, nil, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, nil, 11, nil, nil, nil, nil, nil, + nil, nil, nil, 11, 11, nil, 11, 11, 11, 11, + 11, 11, 11, nil, nil, 11, 11, nil, nil, nil, + 11, 11, 11, 11, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 11, 11, nil, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, nil, nil, 11, 11, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 11, nil, nil, nil, nil, nil, + nil, nil, nil, 11, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, nil, nil, + nil, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, nil, nil, nil, nil, nil, 12, 12, 12, 12, + 12, 12, 12, 12, 12, nil, nil, 12, nil, nil, + nil, nil, nil, nil, nil, nil, 12, 12, nil, 12, + 12, 12, 12, 12, 12, 12, nil, nil, 12, 12, + nil, nil, nil, 12, 12, 12, 12, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 12, 12, nil, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, nil, nil, 12, 12, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 12, nil, nil, + nil, nil, nil, nil, nil, nil, 12, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, nil, nil, nil, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, nil, nil, nil, nil, nil, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, nil, 75, nil, nil, nil, nil, nil, nil, 75, + 75, nil, 75, 75, 75, 75, 75, 75, 75, nil, + nil, 75, 75, nil, nil, nil, 75, 75, 75, 75, + nil, nil, nil, nil, nil, 75, nil, nil, nil, nil, + nil, nil, nil, 75, 75, nil, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, nil, nil, 75, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 75, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, nil, nil, nil, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, nil, nil, nil, + nil, nil, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, nil, 105, nil, nil, nil, nil, + nil, nil, 105, 105, nil, 105, 105, 105, 105, 105, + 105, 105, nil, nil, 105, 105, nil, nil, nil, 105, + 105, 105, 105, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 105, 105, nil, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + nil, nil, 105, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 105, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, nil, nil, nil, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + nil, nil, nil, nil, nil, 428, 428, 428, 428, 428, + 428, 428, 428, 428, nil, nil, 428, nil, nil, nil, + nil, nil, nil, nil, nil, 428, 428, nil, 428, 428, + 428, 428, 428, 428, 428, nil, nil, 428, 428, nil, + nil, nil, 428, 428, 428, 428, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 428, + 428, nil, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, nil, nil, 428, 428, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 428, nil, nil, nil, + nil, nil, nil, nil, nil, 428, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, + nil, nil, nil, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, nil, nil, nil, nil, nil, 662, 662, + 662, 662, 662, 662, 662, 662, 662, nil, nil, 662, + nil, nil, nil, nil, nil, nil, nil, nil, 662, 662, + nil, 662, 662, 662, 662, 662, 662, 662, nil, nil, + 662, 662, nil, nil, nil, 662, 662, 662, 662, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 662, 662, nil, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, nil, nil, 662, 662, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 662, + nil, nil, nil, nil, nil, nil, nil, nil, 662, 770, + 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, + 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, + 770, 770, 770, nil, nil, nil, 770, 770, 770, 770, + 770, 770, 770, 770, 770, 770, nil, nil, nil, nil, + nil, 770, 770, 770, 770, 770, 770, 770, 770, 770, + nil, nil, 770, nil, nil, nil, nil, nil, nil, nil, + nil, 770, 770, nil, 770, 770, 770, 770, 770, 770, + 770, nil, nil, 770, 770, nil, nil, nil, 770, 770, + 770, 770, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 770, 770, nil, 770, 770, + 770, 770, 770, 770, 770, 770, 770, 770, 770, nil, + nil, 770, nil, nil, nil, nil, 228, 228, nil, nil, + 228, nil, nil, nil, nil, nil, nil, nil, nil, 228, + 228, 770, 228, 228, 228, 228, 228, 228, 228, nil, + nil, 228, 228, nil, nil, nil, 228, 228, 228, 228, + nil, nil, nil, nil, nil, 228, nil, nil, nil, nil, + nil, nil, nil, 228, 228, nil, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, nil, nil, 228, + nil, nil, nil, nil, 229, 229, nil, nil, 229, nil, + nil, nil, nil, nil, nil, nil, nil, 229, 229, 228, + 229, 229, 229, 229, 229, 229, 229, nil, nil, 229, + 229, nil, nil, nil, 229, 229, 229, 229, nil, nil, + nil, nil, nil, 229, nil, nil, nil, nil, nil, nil, + nil, 229, 229, nil, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, nil, nil, 229, nil, nil, + nil, nil, 479, 479, nil, nil, 479, nil, nil, nil, + nil, nil, nil, nil, nil, 479, 479, 229, 479, 479, + 479, 479, 479, 479, 479, nil, nil, 479, 479, nil, + nil, nil, 479, 479, 479, 479, nil, nil, nil, nil, + nil, 479, nil, nil, nil, nil, nil, nil, nil, 479, + 479, nil, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 479, nil, nil, 479, nil, nil, nil, nil, + 480, 480, nil, nil, 480, nil, nil, nil, nil, nil, + nil, nil, nil, 480, 480, 479, 480, 480, 480, 480, + 480, 480, 480, nil, nil, 480, 480, nil, nil, nil, + 480, 480, 480, 480, nil, nil, nil, nil, nil, 480, + nil, nil, nil, nil, nil, nil, nil, 480, 480, nil, + 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, + 480, nil, nil, 480, nil, nil, nil, nil, 545, 545, + nil, nil, 545, nil, nil, nil, nil, nil, nil, nil, + nil, 545, 545, 480, 545, 545, 545, 545, 545, 545, + 545, nil, nil, 545, 545, nil, nil, nil, 545, 545, + 545, 545, nil, nil, nil, nil, nil, 545, nil, nil, + nil, nil, nil, nil, nil, 545, 545, nil, 545, 545, + 545, 545, 545, 545, 545, 545, 545, 545, 545, nil, + nil, 545, nil, nil, nil, nil, 546, 546, nil, nil, + 546, nil, nil, nil, nil, nil, nil, nil, nil, 546, + 546, 545, 546, 546, 546, 546, 546, 546, 546, nil, + nil, 546, 546, nil, nil, nil, 546, 546, 546, 546, + nil, nil, nil, nil, nil, 546, nil, nil, nil, nil, + nil, nil, nil, 546, 546, nil, 546, 546, 546, 546, + 546, 546, 546, 546, 546, 546, 546, nil, nil, 546, + nil, nil, nil, nil, 555, 555, nil, nil, 555, nil, + nil, nil, nil, nil, nil, nil, nil, 555, 555, 546, + 555, 555, 555, 555, 555, 555, 555, nil, nil, 555, + 555, nil, nil, nil, 555, 555, 555, 555, nil, nil, + nil, nil, nil, 555, nil, nil, nil, nil, nil, nil, + nil, 555, 555, nil, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, 555, nil, nil, 555, nil, nil, + nil, nil, 556, 556, nil, nil, 556, nil, nil, nil, + nil, nil, nil, nil, nil, 556, 556, 555, 556, 556, + 556, 556, 556, 556, 556, nil, nil, 556, 556, nil, + nil, nil, 556, 556, 556, 556, nil, nil, nil, nil, + nil, 556, nil, nil, nil, nil, nil, nil, nil, 556, + 556, nil, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 556, nil, nil, 556, nil, nil, nil, nil, + 584, 584, nil, nil, 584, nil, nil, nil, nil, nil, + nil, nil, nil, 584, 584, 556, 584, 584, 584, 584, + 584, 584, 584, nil, nil, 584, 584, nil, nil, nil, + 584, 584, 584, 584, nil, nil, nil, nil, nil, 584, + nil, nil, nil, nil, nil, nil, nil, 584, 584, nil, + 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, + 584, nil, nil, 584, nil, nil, nil, nil, 585, 585, + nil, nil, 585, nil, nil, nil, nil, nil, nil, nil, + nil, 585, 585, 584, 585, 585, 585, 585, 585, 585, + 585, nil, nil, 585, 585, nil, nil, nil, 585, 585, + 585, 585, nil, nil, nil, nil, nil, 585, nil, nil, + nil, nil, nil, nil, nil, 585, 585, nil, 585, 585, + 585, 585, 585, 585, 585, 585, 585, 585, 585, nil, + nil, 585, nil, nil, nil, nil, 591, 591, nil, nil, + 591, nil, nil, nil, nil, nil, nil, nil, nil, 591, + 591, 585, 591, 591, 591, 591, 591, 591, 591, nil, + nil, 591, 591, nil, nil, nil, 591, 591, 591, 591, + nil, nil, nil, nil, nil, 591, nil, nil, nil, nil, + nil, nil, nil, 591, 591, nil, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 591, nil, nil, 591, + nil, nil, nil, nil, 592, 592, nil, nil, 592, nil, + nil, nil, nil, nil, nil, nil, nil, 592, 592, 591, + 592, 592, 592, 592, 592, 592, 592, nil, nil, 592, + 592, nil, nil, nil, 592, 592, 592, 592, nil, nil, + nil, nil, nil, 592, nil, nil, nil, nil, nil, nil, + nil, 592, 592, nil, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, nil, nil, 592, nil, nil, + nil, nil, 668, 668, nil, nil, 668, nil, nil, nil, + nil, nil, nil, nil, nil, 668, 668, 592, 668, 668, + 668, 668, 668, 668, 668, nil, nil, 668, 668, nil, + nil, nil, 668, 668, 668, 668, nil, nil, nil, nil, + nil, 668, nil, nil, nil, nil, nil, nil, nil, 668, + 668, nil, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 668, 668, nil, nil, 668, nil, nil, nil, nil, + 669, 669, nil, nil, 669, nil, nil, nil, nil, nil, + nil, nil, nil, 669, 669, 668, 669, 669, 669, 669, + 669, 669, 669, nil, nil, 669, 669, nil, nil, nil, + 669, 669, 669, 669, nil, nil, nil, nil, nil, 669, + nil, nil, nil, nil, nil, nil, nil, 669, 669, nil, + 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, + 669, nil, 981, 669, 981, 981, 981, 981, 981, 984, + nil, 984, 984, 984, 984, 984, nil, nil, 981, nil, + nil, nil, nil, 669, nil, 984, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 981, nil, nil, nil, nil, nil, nil, 984, nil, 981, + 981, 981, 981, nil, nil, nil, 984, 984, 984, 984, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1031, 1031, nil, + nil, 1031, nil, nil, nil, 981, nil, nil, nil, nil, + 1031, 1031, 984, 1031, 1031, 1031, 1031, 1031, 1031, 1031, + nil, nil, 1031, 1031, nil, nil, nil, 1031, 1031, 1031, + 1031, nil, nil, nil, nil, nil, 1031, nil, nil, nil, + nil, nil, nil, nil, 1031, 1031, nil, 1031, 1031, 1031, + 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, nil, nil, + 1031, nil, nil, nil, nil, 1036, 1036, nil, nil, 1036, + nil, nil, nil, nil, nil, nil, nil, nil, 1036, 1036, + 1031, 1036, 1036, 1036, 1036, 1036, 1036, 1036, nil, nil, + 1036, 1036, nil, nil, nil, 1036, 1036, 1036, 1036, nil, + nil, nil, nil, nil, 1036, nil, nil, nil, nil, nil, + nil, nil, 1036, 1036, nil, 1036, 1036, 1036, 1036, 1036, + 1036, 1036, 1036, 1036, 1036, 1036, nil, nil, 1036, nil, + nil, nil, nil, 1037, 1037, nil, nil, 1037, nil, nil, + nil, nil, nil, nil, nil, nil, 1037, 1037, 1036, 1037, + 1037, 1037, 1037, 1037, 1037, 1037, nil, nil, 1037, 1037, + nil, nil, nil, 1037, 1037, 1037, 1037, nil, nil, nil, + nil, nil, 1037, nil, nil, nil, nil, nil, nil, nil, + 1037, 1037, nil, 1037, 1037, 1037, 1037, 1037, 1037, 1037, + 1037, 1037, 1037, 1037, nil, 1055, 1037, 1055, 1055, 1055, + 1055, 1055, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1055, nil, nil, nil, nil, 1037, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1055, nil, nil, nil, nil, nil, nil, + nil, nil, 1055, 1055, 1055, 1055, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1055 ] + +racc_action_pointer = [ + nil, 34, 2018, 60, nil, 201, nil, nil, 6077, 763, + nil, 23869, 24002, -12, nil, -30, 60, -17, 152, 279, + 112, nil, -60, 6216, 2298, 236, nil, -40, nil, 0, + 1084, 1216, 6355, 6494, 6633, nil, 2158, 6772, 6911, nil, + 144, 208, 304, 268, 159, 7050, 7189, 489, 7328, 203, + 305, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1348, nil, 7467, nil, nil, 73, nil, 7606, 7745, nil, + nil, 7884, 8023, 8162, 8301, 24135, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -65, nil, nil, nil, nil, nil, nil, 223, + 255, 278, 284, nil, nil, 24268, nil, nil, nil, nil, + nil, nil, 0, nil, nil, 139, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 8440, nil, + nil, nil, nil, 8579, 8718, 8857, 8996, 9135, 312, nil, + 605, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 306, + nil, 2298, 9274, 9413, 9552, 9691, 9830, 9969, 24735, 24803, + nil, nil, 10108, 10247, 10386, nil, nil, 356, -55, -52, + 405, 162, 341, 408, nil, 10525, 2438, 431, 10664, 10803, + 10942, 11081, 11220, 11359, 11498, 11637, 11776, 11915, 12054, 12193, + 12332, 12471, 12610, 12749, 12888, 13027, 13166, 13305, 13444, 13583, + nil, nil, nil, nil, 13722, nil, nil, nil, 1876, nil, + nil, 426, 13861, 14000, nil, nil, nil, nil, nil, nil, + nil, nil, 14139, nil, 2438, nil, 402, 406, nil, 14278, + 460, 14417, nil, nil, 14556, 14695, nil, nil, 460, nil, + nil, 14834, 925, nil, 419, 2578, 461, 499, 474, 14973, + 2718, 371, 411, 458, 551, 510, nil, 548, 516, 206, + nil, nil, nil, 567, 254, 536, 15112, nil, 308, 618, + 514, nil, 620, 15251, nil, 15390, 2858, 1166, 587, 15529, + 15668, nil, 11, -10, -1, 15807, 2998, 3138, 476, 699, + 585, -19, -14, 589, 670, -7, 702, nil, nil, 311, + 342, 308, nil, 625, nil, 620, 15946, nil, nil, nil, + 112, 118, 120, 239, 344, 373, 377, 455, 459, nil, + 461, nil, nil, 645, nil, -59, nil, 370, nil, 538, + nil, 605, 378, nil, 607, 397, nil, 609, -37, nil, + 610, -27, nil, 443, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 24401, nil, + nil, nil, nil, 624, nil, nil, 612, 16085, 618, nil, + nil, 618, nil, 752, 182, nil, nil, nil, 2018, nil, + nil, nil, nil, nil, 2158, 637, nil, nil, 641, 642, + 430, 547, 1480, nil, nil, nil, 271, 403, 683, nil, + nil, 1612, 1744, nil, nil, nil, -33, nil, 686, 24871, + 24939, 16224, 187, 16363, 16502, 16641, 3138, 3278, 364, 490, + 714, 724, 726, 729, 976, 1430, 1562, 3418, 3558, 3698, + 3838, 3978, 4118, 844, 1039, 4258, 4398, 2578, 1166, 806, + nil, 1876, nil, nil, nil, nil, 690, nil, nil, nil, + 691, nil, nil, 16780, nil, nil, 16919, nil, 17058, nil, + 265, nil, nil, nil, 17197, 1178, 706, 698, 699, nil, + nil, 703, 17336, 708, 17475, 25007, 25075, 753, 745, nil, + 17614, 707, nil, 17753, 17892, 25143, 25211, 1298, 2718, 18031, + 832, 831, 734, nil, nil, -80, -68, 735, 749, nil, + 340, 776, 3278, 853, nil, 3418, 30, 859, 860, 861, + 870, nil, nil, 18170, 25279, 25347, 5, nil, nil, 763, + nil, 25415, 25483, 18309, nil, nil, nil, 587, 3558, 809, + nil, nil, nil, 18448, nil, 744, nil, 772, 773, nil, + 774, 777, 780, nil, nil, nil, nil, nil, nil, nil, + nil, 766, 685, nil, nil, 18587, nil, nil, nil, 862, + nil, nil, nil, 882, nil, nil, 886, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 198, nil, + nil, 200, nil, nil, nil, 816, nil, nil, 826, nil, + 3698, nil, 24534, nil, 831, 18726, 18865, 19004, 25551, 25619, + 19143, 585, 876, 19282, 19421, 19560, 19699, 880, nil, nil, + nil, 19838, 19977, 882, nil, nil, nil, 189, 216, 542, + 681, 854, 868, nil, 116, 970, 163, nil, nil, 886, + nil, 992, nil, 876, nil, 921, 20116, nil, nil, 20255, + nil, nil, -123, 20394, 881, nil, 885, -9, 28, 937, + 33, 773, 951, 913, 20533, nil, 978, 156, 221, nil, + 20672, nil, nil, nil, nil, 20811, nil, nil, 20950, nil, + nil, nil, 618, nil, 1048, nil, nil, nil, nil, nil, + 1057, nil, 21089, 942, 20, 29, 163, 165, 3838, 550, + 781, nil, 944, 3978, 21228, 535, 1064, 4118, 874, 1048, + 24667, 165, 27, 959, 234, nil, nil, 578, 1147, nil, + 1279, nil, 471, nil, 21367, nil, 949, nil, 957, 959, + 881, 964, nil, nil, nil, nil, 936, 4258, nil, nil, + nil, nil, nil, 981, nil, 966, 21506, 981, 222, 274, + 813, 945, 2858, 21645, nil, 979, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 21784, 21923, 22062, 22201, + 317, 22340, nil, nil, 1411, nil, 4398, nil, nil, 999, + nil, 119, nil, nil, nil, nil, 984, 160, nil, nil, + nil, nil, nil, nil, 4538, nil, 985, 1028, nil, nil, + 447, 1108, nil, nil, 22479, nil, 4678, 1109, nil, nil, + nil, 22618, 42, 41, 1110, nil, 1113, 551, nil, nil, + 1120, 1007, 580, nil, nil, nil, 4818, 4958, 1004, 1010, + 1010, nil, nil, nil, 1011, 1012, nil, 1021, 1036, nil, + 1041, nil, nil, 1045, 980, 819, nil, nil, nil, nil, + nil, nil, nil, 1035, nil, 1047, 320, nil, nil, 22757, + 22896, 2998, 1048, 1051, nil, 1055, 1057, 1065, nil, 1090, + 1086, 1083, 23035, nil, nil, nil, nil, 5098, 5238, nil, + 6, 23174, nil, nil, nil, 10, nil, nil, nil, 23313, + 5378, nil, nil, nil, 5518, nil, nil, nil, 1141, 1121, + 1231, 1010, nil, nil, 1543, nil, 1675, nil, 6793, nil, + 6932, nil, nil, nil, nil, 1115, 1122, nil, 325, nil, + nil, 25681, nil, nil, 25688, nil, 8044, nil, nil, 1145, + 23452, 884, 1206, nil, 1260, 5658, 19, 38, 898, 1219, + 69, nil, 5798, nil, 23591, 355, 1267, 5938, nil, nil, + 451, nil, nil, nil, 1149, 1150, 1151, 1153, 1077, 1184, + 1168, nil, nil, 1169, 1173, 1174, 1176, nil, 1179, nil, + 913, 25756, nil, nil, 1302, 23730, 25824, 25892, 106, 691, + nil, nil, nil, nil, nil, 1303, nil, 1209, 8183, nil, + nil, nil, nil, 1185, nil, 25954, nil, 8322, nil, 14994, + nil, 15133, nil, nil, 1226, 1228, nil, 1200, 128, 131, + 171, 174, nil, nil, nil, 1199, 1202, 1208, 1209, 1210, + 162, nil, 17357, nil, nil, nil, nil, 1211, nil ] + +racc_action_default = [ + -1, -645, -644, -645, -2, -631, -4, -5, -645, -8, + -9, -645, -645, -645, -36, -645, -645, -40, -645, -645, + -291, -51, -633, -645, -56, -61, -62, -63, -67, -268, + -268, -268, -306, -336, -337, -79, -644, -83, -91, -93, + -645, -532, -533, -645, -645, -645, -645, -227, -645, -633, + -241, -282, -283, -284, -285, -286, -287, -288, -289, -290, + -617, -293, -295, -302, -304, -314, -316, -645, -645, -58, + -58, -631, -645, -645, -645, -645, -338, -339, -341, -342, + -343, -344, -345, -346, -347, -348, -349, -350, -359, -414, + -462, -463, -464, -465, -466, -644, -469, -644, -644, -644, + -644, -644, -644, -505, -506, -644, -508, -514, -516, -517, + -518, -519, -615, -521, -522, -616, -524, -525, -526, -527, + -528, -529, -530, -531, -536, -537, 1089, -3, -632, -640, + -641, -642, -7, -645, -645, -645, -645, -645, -645, -24, + -645, -122, -123, -124, -125, -126, -127, -128, -132, -133, + -134, -135, -136, -137, -138, -139, -140, -141, -142, -143, + -144, -145, -146, -147, -148, -149, -150, -151, -152, -153, + -154, -155, -156, -157, -158, -159, -160, -161, -162, -163, + -164, -165, -166, -167, -168, -169, -170, -171, -172, -173, + -174, -175, -176, -177, -178, -179, -180, -181, -182, -183, + -184, -185, -186, -187, -188, -189, -190, -191, -192, -193, + -194, -195, -196, -197, -198, -199, -200, -201, -202, -29, + -129, -644, -645, -645, -645, -645, -645, -644, -645, -645, + -627, -628, -645, -645, -633, -634, -55, -645, -532, -533, + -645, -291, -645, -645, -233, -645, -644, -645, -645, -645, + -645, -645, -645, -645, -645, -645, -645, -645, -645, -645, + -645, -645, -645, -645, -645, -645, -645, -645, -645, -645, + -242, -243, -244, -245, -645, -352, -442, -422, -645, -629, + -630, -68, -644, -645, -313, -351, -426, -435, -437, -74, + -432, -75, -633, -76, -248, -263, -644, -644, -267, -645, + -273, -645, -644, -609, -645, -645, -77, -78, -631, -17, + -18, -645, -21, -22, -81, -644, -633, -645, -84, -87, + -644, -99, -100, -645, -645, -107, -306, -309, -633, -645, + -336, -337, -340, -433, -645, -89, -645, -95, -301, -515, + -645, -221, -222, -645, -234, -645, -644, -297, -633, -644, + -644, -315, -57, -645, -645, -645, -644, -644, -631, -645, + -632, -532, -533, -645, -645, -291, -645, -369, -370, -117, + -118, -645, -120, -645, -291, -644, -645, -532, -533, -329, + -122, -123, -162, -163, -164, -180, -185, -192, -195, -331, + -645, -604, -605, -564, -467, -645, -490, -645, -492, -645, + -494, -645, -645, -474, -645, -645, -480, -645, -645, -486, + -645, -645, -488, -645, -507, -509, -510, -511, -512, -6, + -643, -30, -31, -32, -33, -34, -10, -11, -645, -26, + -27, -28, -130, -645, -37, -39, -278, -645, -645, -277, + -38, -645, -41, -645, -291, -49, -50, -203, -253, -273, + -52, -53, -42, -204, -253, -633, -258, -259, -644, -644, + -618, -619, -268, -430, -620, -621, -619, -618, -268, -429, + -431, -620, -621, -48, -211, -54, -633, -312, -645, -645, + -645, -644, -301, -645, -645, -645, -212, -213, -214, -215, + -216, -217, -218, -219, -223, -224, -225, -226, -228, -229, + -230, -231, -232, -235, -236, -237, -238, -633, -246, -645, + -443, -268, -618, -619, -65, -69, -633, -269, -439, -442, + -633, -308, -264, -645, -272, -265, -645, -270, -645, -274, + -645, -612, -614, -16, -632, -20, -645, -633, -80, -299, + -96, -85, -645, -633, -644, -645, -645, -106, -645, -515, + -645, -92, -97, -645, -645, -645, -645, -247, -239, -645, + -454, -645, -633, -296, -249, -637, -637, -633, -645, -607, + -637, -645, -644, -360, -361, -644, -645, -645, -645, -645, + -645, -355, -449, -644, -645, -645, -301, -58, -117, -118, + -119, -645, -645, -644, -324, -538, -540, -326, -644, -542, + -333, -625, -626, -645, -415, -564, -418, -603, -603, -547, + -549, -549, -549, -563, -565, -566, -567, -568, -569, -570, + -571, -572, -645, -574, -576, -578, -583, -585, -586, -588, + -593, -595, -596, -598, -599, -600, -645, -468, -491, -496, + -497, -499, -470, -493, -471, -495, -472, -473, -645, -476, + -478, -645, -479, -482, -483, -645, -484, -485, -645, -513, + -644, -25, -645, -35, -281, -645, -645, -644, -645, -645, + -645, -434, -645, -260, -262, -645, -645, -70, -256, -257, + -427, -645, -645, -72, -428, -311, -635, -618, -619, -618, + -619, -633, -645, -421, -644, -64, -423, -439, -255, -645, + -440, -645, -307, -644, -271, -275, -645, -610, -611, -645, + -19, -23, -82, -645, -88, -94, -633, -618, -619, -644, + -622, -105, -645, -90, -645, -210, -220, -633, -644, -353, + -644, -294, -358, -298, -250, -639, -638, -252, -639, -303, + -305, -608, -644, -362, -644, -59, -363, -364, -319, -320, + -645, -322, -645, -633, -618, -619, -622, -300, -644, -117, + -118, -121, -633, -644, -645, -645, -645, -644, -564, -564, + -645, -633, -645, -633, -645, -545, -546, -645, -645, -556, + -645, -559, -645, -561, -645, -371, -645, -373, -375, -378, + -381, -633, -577, -587, -597, -601, -645, -644, -475, -477, + -481, -487, -489, -645, -131, -279, -645, -633, -618, -619, + -619, -618, -254, -645, -636, -644, -44, -206, -45, -207, + -71, -46, -209, -47, -208, -73, -645, -645, -645, -645, + -434, -645, -403, -404, -633, -406, -644, -425, -424, -645, + -436, -644, -438, -266, -276, -613, -86, -434, -98, -310, + -13, -15, -354, -356, -644, -461, -455, -644, -456, -457, + -637, -645, -357, -365, -645, -367, -644, -645, -60, -321, + -445, -645, -645, -434, -645, -434, -645, -645, -327, -330, + -645, -633, -645, -334, -606, -416, -644, -644, -408, -633, + -603, -584, -602, -548, -549, -549, -575, -549, -549, -594, + -549, -572, -589, -633, -645, -645, -380, -573, -498, -501, + -502, -503, -504, -645, -12, -280, -434, -43, -205, -261, + -645, -240, -603, -603, -385, -644, -644, -644, -402, -645, + -633, -572, -580, -581, -591, -444, -66, -644, -644, -460, + -645, -645, -459, -251, -317, -645, -368, -318, -446, -645, + -644, -323, -325, -539, -644, -332, -541, -543, -542, -645, + -645, -645, -417, -544, -645, -552, -645, -554, -645, -557, + -645, -560, -562, -372, -374, -376, -379, -500, -645, -383, + -384, -393, -387, -395, -645, -398, -645, -400, -405, -645, + -645, -579, -645, -441, -644, -644, -532, -533, -645, -645, + -291, -458, -644, -447, -645, -644, -645, -644, -419, -420, + -633, -410, -412, -413, -549, -549, -549, -549, -645, -645, + -603, -582, -386, -644, -644, -644, -644, -592, -644, -407, + -590, -645, -301, -14, -454, -644, -645, -645, -301, -644, + -448, -450, -451, -452, -328, -645, -409, -645, -645, -550, + -553, -555, -558, -377, -382, -645, -390, -645, -392, -645, + -396, -645, -399, -401, -300, -622, -453, -633, -618, -619, + -622, -300, -366, -335, -411, -549, -644, -644, -644, -644, + -434, -551, -645, -388, -391, -394, -397, -644, -389 ] + +racc_goto_table = [ + 6, 131, 236, 233, 296, 296, 296, 277, 4, 295, + 295, 295, 144, 144, 462, 468, 228, 353, 354, 455, + 389, 358, 561, 318, 279, 580, 621, 139, 220, 9, + 345, 147, 147, 332, 332, 9, 452, 351, 297, 297, + 297, 525, 473, 439, 440, 286, 290, 572, 575, 515, + 415, 317, 352, 352, 426, 606, 352, 356, 357, 728, + 707, 281, 289, 291, 511, 127, 613, 131, 332, 332, + 332, 335, 704, 767, 516, 704, 144, 128, 851, 861, + 889, 671, 590, 421, 422, 423, 424, 339, 791, 347, + 867, 775, 776, 396, 926, 398, 400, 403, 406, 409, + 412, 899, 314, 396, 896, 551, 144, 509, 734, 737, + 836, 785, 316, 741, 974, 132, 1027, 1, 352, 352, + 352, 352, 699, 375, 379, 2, 446, 395, 1011, 446, + 976, 359, 138, 648, 1013, 446, 651, 413, 660, 850, + 895, 929, 897, 938, 710, 536, 219, 368, 293, 306, + 307, 435, 428, 745, 868, 9, 278, 697, 662, 343, + 567, 696, 391, 453, 425, 568, 366, 594, 390, 474, + 600, 346, 348, 562, 349, 350, 763, 765, 954, 598, + 599, 770, 958, 975, 643, 928, 645, 1027, 890, 649, + 930, 1010, 649, 739, 438, 438, 927, 604, 885, 393, + 772, 434, 445, 525, 295, 445, 518, 519, 707, 450, + 451, 445, 841, 872, 1074, 694, 1041, 752, 475, 476, + 1013, 857, 704, 704, 940, 456, 394, 397, 399, 974, + 472, 402, 405, 408, 479, 419, 433, 989, 621, 411, + 908, 1023, 796, 1053, 463, 750, 797, 414, 923, 764, + 894, 891, 903, 1021, 603, 296, nil, 937, nil, 295, + 295, 317, nil, nil, 296, 462, 468, 773, nil, 295, + nil, nil, 707, 691, 766, 785, nil, nil, 613, 906, + 456, nil, nil, nil, nil, 899, nil, nil, nil, 297, + nil, nil, nil, 19, 524, 524, 896, nil, 297, 19, + 396, 839, 761, nil, 131, 576, nil, 896, nil, 548, + nil, 714, nil, nil, 237, 332, nil, 830, nil, 723, + 545, 565, 552, 237, 237, 237, 1014, 19, 323, 323, + 317, 719, 332, nil, 530, 317, 716, 555, 535, nil, + 352, 719, 847, 1024, 1033, 286, 1025, 564, 569, 290, + 701, 1042, 541, 19, 131, 566, 570, nil, 237, 237, + 584, 597, 237, 363, 373, 373, nil, nil, 533, nil, + 719, 577, 578, 596, 963, 753, 1072, 549, 719, 873, + 534, 314, nil, nil, nil, 762, 314, 896, 875, nil, + nil, 537, 1020, 785, 785, 923, 543, nil, 923, 517, + 923, 621, 621, 943, nil, nil, 979, 980, 520, nil, + nil, 621, nil, 621, nil, nil, nil, 1076, 579, 19, + 474, nil, 453, nil, 237, 237, 237, 237, 19, 144, + 881, 882, 1007, 916, nil, 799, 672, nil, 799, 876, + 668, 613, 613, 880, 661, 820, nil, 843, 147, nil, + nil, 825, 711, 707, 462, 468, 524, 524, 295, 807, + 678, nil, nil, nil, nil, nil, nil, 931, 704, 923, + nil, 923, nil, 923, nil, 923, nil, nil, 679, 456, + nil, 472, 846, nil, 684, 816, 818, nil, 692, nil, + 725, 821, 823, nil, 677, 463, 923, nil, nil, nil, + 683, nil, nil, nil, 1054, nil, nil, 785, 785, 678, + nil, nil, 19, 237, 443, 237, 237, 443, 237, nil, + nil, 295, nil, 443, 237, 237, nil, 679, 552, 703, + nil, nil, nil, 1066, nil, nil, 552, 19, 332, nil, + nil, nil, 456, 695, 727, nil, 332, 472, 672, nil, + nil, 858, nil, nil, nil, nil, nil, 472, nil, 843, + 295, 463, nil, 960, nil, nil, 950, nil, nil, 446, + 295, 463, 746, 237, 237, 758, nil, nil, 446, 446, + nil, 456, nil, 237, 446, 446, 472, 742, 771, nil, + 744, 456, 472, nil, nil, nil, nil, 621, nil, nil, + 463, nil, 19, nil, nil, nil, 19, nil, 463, nil, + 323, 19, 817, 819, 931, nil, 731, 931, 822, 824, + nil, nil, nil, 917, nil, nil, nil, 323, nil, nil, + 1006, nil, 748, 749, 995, 751, nil, 19, nil, 1002, + nil, nil, nil, nil, 295, 445, 237, 19, 19, nil, + nil, nil, nil, nil, 445, 445, nil, nil, 6, nil, + 445, 445, nil, 144, nil, 456, 803, 237, 838, nil, + 472, 1043, 672, nil, nil, nil, nil, 837, 804, 815, + nil, nil, 147, 1045, 463, nil, nil, 9, 931, nil, + nil, nil, 832, 1080, nil, nil, nil, 672, nil, 552, + 892, 524, 438, 892, nil, nil, nil, nil, nil, 332, + 848, nil, nil, nil, 877, 883, 446, 678, nil, nil, + 332, nil, nil, nil, nil, nil, 855, nil, 859, nil, + nil, nil, nil, nil, 672, 679, nil, nil, 684, nil, + 865, 860, 865, 672, 983, 985, 987, nil, nil, 352, + 918, nil, nil, nil, 888, nil, nil, nil, nil, nil, + 924, 878, nil, 817, 819, 824, 822, nil, nil, nil, + nil, 144, 237, 874, nil, nil, nil, nil, 477, nil, + nil, 779, 781, 783, nil, nil, nil, nil, 672, nil, + nil, nil, 445, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 869, nil, nil, nil, nil, + nil, nil, 913, 524, 945, 888, nil, nil, nil, nil, + nil, 879, 719, nil, nil, 19, nil, 1067, nil, nil, + nil, nil, nil, 323, nil, 237, 521, nil, nil, 832, + nil, 323, 1056, 1058, 1060, 1062, nil, 1063, nil, 352, + 237, 935, nil, nil, nil, 942, nil, 918, nil, nil, + 538, nil, nil, 19, nil, nil, 19, nil, nil, 939, + nil, nil, nil, 953, 237, nil, nil, nil, 957, nil, + nil, 946, nil, nil, 237, nil, nil, nil, nil, 19, + nil, nil, 563, nil, 237, 1083, 1084, 1085, 1086, nil, + nil, 959, nil, nil, 892, nil, 1088, 924, nil, 29, + 924, 888, 924, nil, nil, 29, 944, nil, nil, nil, + nil, nil, 947, 982, 982, 982, nil, nil, 332, 951, + 29, 952, nil, nil, nil, 955, nil, 332, nil, 29, + 29, 29, nil, 29, nil, 932, nil, nil, nil, nil, + nil, 19, 993, 994, nil, nil, nil, 443, 237, nil, + nil, nil, nil, nil, nil, 1005, 443, 443, nil, 29, + nil, nil, 443, 443, 29, 29, nil, nil, 29, nil, + nil, 924, nil, 924, nil, 924, 332, 924, nil, nil, + nil, 1046, 855, nil, nil, 1036, nil, nil, nil, nil, + nil, nil, nil, 865, 323, nil, nil, nil, 924, nil, + 1034, nil, 295, nil, nil, 323, nil, 1039, nil, nil, + 685, 982, 982, 982, 982, nil, 982, nil, nil, nil, + nil, nil, 472, 456, nil, 29, nil, 865, 472, nil, + 29, 29, 29, 29, 29, nil, nil, nil, 672, 19, + nil, nil, 463, nil, 19, 237, nil, nil, 19, nil, + 698, 1044, nil, nil, 702, 965, 967, nil, 969, 971, + 898, 972, 900, nil, 982, 982, 982, 982, nil, nil, + nil, 712, nil, nil, nil, 982, nil, 715, 19, 932, + nil, nil, 932, nil, nil, 932, nil, 932, nil, nil, + 1073, nil, nil, nil, 443, nil, 733, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 925, nil, nil, 19, 29, 29, + 29, 29, 29, 29, 29, nil, nil, nil, nil, 29, + 29, 29, nil, nil, nil, 19, nil, nil, nil, nil, + nil, nil, nil, 29, nil, 237, nil, 19, nil, nil, + nil, nil, nil, nil, nil, nil, 932, nil, 932, nil, + 932, nil, 932, nil, 32, nil, nil, 19, 19, nil, + 32, nil, nil, nil, nil, 1049, 1050, 1051, 1052, 29, + 29, nil, nil, 932, nil, 32, nil, nil, nil, 29, + nil, nil, nil, nil, 32, 32, 32, nil, 32, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 29, nil, + nil, nil, 29, 991, nil, nil, nil, 29, 19, 19, + nil, nil, 998, nil, 32, nil, nil, nil, nil, 32, + 32, 19, nil, 32, nil, 19, 1081, nil, nil, nil, + nil, nil, nil, 29, 1015, nil, 1016, nil, 1017, nil, + nil, nil, 29, 29, 29, nil, nil, nil, nil, nil, + nil, 849, nil, nil, 1026, nil, 1028, nil, nil, nil, + nil, 1030, nil, 29, nil, nil, 19, nil, nil, nil, + nil, nil, nil, 19, nil, nil, nil, nil, 19, nil, + 32, nil, nil, nil, nil, 32, 32, 32, 32, 32, + nil, nil, nil, nil, nil, 884, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 237, nil, nil, nil, + nil, nil, nil, nil, nil, 907, nil, nil, 1075, nil, + nil, nil, nil, nil, nil, 1077, nil, 1078, nil, 1079, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1087, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 29, nil, + nil, nil, nil, 32, 32, 32, 32, 32, 32, 32, + nil, nil, nil, nil, 32, 32, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 32, nil, + nil, nil, nil, nil, nil, 956, nil, nil, nil, nil, + nil, nil, nil, 962, nil, nil, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, 973, nil, nil, + nil, 29, nil, nil, 32, 32, nil, nil, nil, nil, + nil, nil, nil, nil, 32, nil, 29, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 29, + nil, nil, 29, 32, nil, nil, nil, 32, nil, nil, + 29, nil, 32, nil, nil, nil, nil, nil, nil, nil, + 29, nil, nil, nil, nil, 29, nil, nil, nil, nil, + 29, nil, nil, nil, nil, nil, nil, nil, 32, nil, + nil, nil, nil, nil, nil, nil, nil, 32, 32, 32, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 32, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 436, + 449, nil, nil, nil, nil, nil, nil, 29, nil, nil, + nil, nil, nil, 29, 29, nil, nil, nil, nil, nil, + nil, nil, 29, 29, nil, nil, nil, nil, 29, 29, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 527, nil, 529, nil, + nil, 531, 532, 16, nil, nil, nil, nil, nil, 16, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 29, nil, nil, nil, nil, + 29, 29, nil, nil, 29, nil, nil, 16, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 571, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 16, 29, nil, 32, nil, nil, nil, + nil, nil, nil, 367, nil, nil, 32, nil, nil, nil, + 29, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 29, 32, nil, nil, 32, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, 29, nil, nil, nil, 32, nil, nil, nil, 16, + 32, 29, nil, 29, 664, 32, nil, nil, 16, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 29, 29, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, nil, 32, 32, + nil, nil, nil, nil, 29, 29, nil, 32, 32, nil, + nil, nil, nil, 32, 32, nil, nil, 29, nil, nil, + 705, 29, 16, 571, 441, 708, nil, 441, nil, nil, + nil, nil, nil, 441, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 16, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, nil, nil, 29, + nil, nil, nil, nil, 29, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 32, nil, nil, nil, nil, 32, 32, nil, nil, 32, + nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 16, nil, nil, 244, 16, nil, nil, nil, + nil, 16, 792, nil, 294, 294, 294, nil, nil, 32, + nil, nil, nil, nil, nil, nil, nil, 341, 342, nil, + 344, nil, nil, nil, nil, 32, nil, 16, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 16, 16, nil, + nil, nil, 805, nil, nil, nil, nil, nil, 32, nil, + 705, 571, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, 32, nil, + nil, nil, nil, 844, nil, nil, 845, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 32, 32, + nil, nil, nil, nil, nil, nil, nil, 856, nil, nil, + nil, nil, 705, nil, nil, 571, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 870, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 32, + 32, nil, 18, nil, nil, nil, nil, nil, 18, nil, + nil, 902, 32, nil, nil, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 915, nil, nil, 18, nil, nil, nil, + nil, nil, nil, nil, 294, 448, nil, nil, 454, 294, + nil, nil, nil, nil, 454, nil, nil, 32, nil, nil, + nil, nil, 18, nil, 32, 16, nil, 244, nil, 32, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, nil, nil, nil, nil, 508, 32, 948, nil, + nil, nil, nil, 16, 294, 294, 16, nil, nil, nil, + nil, nil, nil, nil, 294, nil, nil, nil, nil, nil, + nil, 294, nil, 294, nil, nil, 294, 294, 18, 16, + nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, + nil, nil, nil, nil, nil, nil, 571, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 557, nil, 558, nil, nil, + nil, 294, 294, nil, nil, nil, 1003, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 16, nil, nil, nil, nil, nil, 441, nil, nil, + nil, nil, nil, nil, nil, nil, 441, 441, nil, nil, + nil, nil, 441, 441, nil, nil, nil, nil, nil, nil, + nil, 18, nil, 18, nil, nil, 18, nil, nil, nil, + nil, 1040, 18, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 18, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 294, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 16, + nil, nil, nil, nil, 16, nil, nil, nil, 16, nil, + nil, nil, nil, 294, nil, 454, 454, 454, nil, nil, + nil, 18, nil, nil, nil, 18, nil, nil, nil, nil, + 18, nil, nil, nil, 20, nil, nil, nil, 16, nil, + 20, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 441, 294, 18, nil, 294, nil, + 294, nil, nil, nil, nil, nil, 18, 18, 20, 325, + 325, nil, nil, nil, nil, nil, 294, 16, nil, nil, + nil, nil, nil, nil, nil, 454, 726, nil, nil, nil, + nil, nil, nil, nil, 20, 16, nil, nil, nil, nil, + nil, nil, nil, nil, 365, 374, 374, 16, nil, nil, + nil, nil, nil, nil, nil, 294, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 294, nil, 16, 16, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 294, nil, nil, + 20, nil, nil, nil, nil, nil, nil, nil, nil, 20, + nil, nil, nil, nil, nil, nil, nil, nil, 16, 16, + nil, nil, 1001, nil, nil, nil, nil, nil, nil, nil, + nil, 16, nil, nil, nil, 16, nil, 294, 454, 294, + nil, nil, 812, nil, nil, 294, 294, 454, 454, nil, + nil, nil, nil, 454, 454, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 16, nil, 294, nil, + nil, 294, nil, 16, 18, nil, nil, nil, 16, nil, + nil, nil, nil, 20, nil, 444, nil, nil, 444, nil, + nil, nil, 294, nil, 444, nil, nil, 294, nil, nil, + 294, nil, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, 18, nil, 294, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 18, nil, + nil, nil, nil, nil, nil, nil, 294, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 294, nil, + nil, nil, nil, 20, nil, 454, nil, 20, nil, nil, + nil, 325, 20, nil, nil, nil, nil, nil, 454, 454, + 454, 454, nil, 921, nil, 41, nil, nil, 325, nil, + 18, 41, nil, nil, nil, nil, 18, nil, 20, nil, + nil, nil, nil, nil, 42, 18, 18, nil, 20, 20, + 42, 18, 18, nil, nil, nil, nil, nil, nil, 41, + 321, 321, nil, 294, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, 322, + 322, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 361, 377, 377, 377, nil, + nil, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, 294, 454, nil, 362, 378, 378, 378, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 18, nil, + nil, nil, nil, 18, nil, nil, nil, 18, nil, nil, + nil, 294, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, 18, nil, nil, + 42, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, nil, 18, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 294, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 18, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 18, nil, 20, 294, nil, nil, + nil, nil, nil, nil, 325, nil, 18, nil, nil, nil, + nil, nil, 325, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 18, 18, nil, nil, + nil, nil, nil, 42, 20, nil, nil, 20, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + 20, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 18, 18, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, nil, 18, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, 41, nil, + nil, nil, 321, 41, nil, nil, nil, nil, nil, nil, + nil, nil, 20, 42, nil, nil, nil, 42, 444, 321, + nil, 322, 42, nil, nil, 18, nil, 444, 444, 41, + nil, nil, 18, 444, 444, nil, nil, 18, 322, 41, + 41, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, 42, + nil, nil, nil, nil, nil, 325, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 325, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 20, nil, nil, nil, nil, 20, nil, nil, nil, 20, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 912, 20, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 444, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 20, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, 20, nil, + nil, nil, nil, nil, nil, 321, nil, nil, nil, nil, + nil, nil, nil, 321, nil, nil, 42, nil, 20, 20, + nil, nil, nil, nil, 322, nil, nil, nil, nil, nil, + nil, nil, 322, nil, nil, 41, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 42, nil, nil, 42, nil, nil, + nil, 41, nil, nil, 374, nil, nil, nil, nil, 20, + 20, nil, nil, 1000, nil, nil, nil, nil, nil, nil, + 42, nil, 20, nil, nil, nil, 20, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 374, 41, nil, nil, nil, 20, nil, nil, + nil, nil, nil, nil, 20, nil, nil, nil, nil, 20, + nil, nil, 42, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 321, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 321, nil, nil, + nil, nil, nil, nil, nil, 322, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 322, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, 41, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, nil, 42, nil, nil, nil, 42, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, 41, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, 42, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 377, nil, nil, nil, nil, + 41, 41, nil, nil, 996, nil, nil, nil, nil, nil, + nil, nil, nil, 41, 378, nil, nil, 41, nil, 42, + 42, nil, nil, 997, nil, nil, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 377, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + 41, nil, 378, nil, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, 42, nil, nil, nil, nil, 42 ] + +racc_goto_check = [ + 6, 118, 27, 40, 82, 82, 82, 168, 2, 46, + 46, 46, 71, 71, 50, 50, 38, 24, 24, 36, + 70, 24, 12, 63, 38, 113, 206, 22, 22, 9, + 40, 73, 73, 78, 78, 9, 33, 102, 84, 84, + 84, 87, 33, 29, 29, 85, 85, 106, 106, 52, + 70, 14, 31, 31, 10, 167, 31, 42, 42, 15, + 217, 51, 51, 51, 50, 5, 201, 118, 78, 78, + 78, 64, 88, 121, 36, 88, 71, 8, 17, 107, + 159, 37, 68, 24, 24, 24, 24, 76, 144, 9, + 109, 150, 150, 6, 155, 6, 6, 6, 6, 6, + 6, 212, 59, 6, 207, 65, 71, 169, 83, 83, + 157, 143, 60, 83, 142, 7, 213, 1, 31, 31, + 31, 31, 53, 69, 69, 3, 25, 185, 161, 25, + 145, 5, 11, 189, 162, 25, 189, 185, 13, 16, + 156, 159, 156, 18, 20, 21, 23, 26, 58, 58, + 58, 30, 32, 43, 45, 9, 49, 55, 74, 79, + 81, 86, 98, 75, 9, 101, 115, 117, 122, 75, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 146, 190, 147, 190, 213, 149, 190, + 153, 160, 190, 37, 82, 82, 156, 163, 164, 165, + 166, 27, 27, 87, 46, 27, 171, 172, 217, 31, + 31, 27, 174, 175, 161, 177, 178, 179, 31, 31, + 162, 180, 88, 88, 181, 6, 184, 186, 187, 142, + 71, 188, 191, 192, 38, 7, 14, 159, 206, 193, + 194, 155, 195, 145, 85, 113, 196, 199, 149, 200, + 205, 209, 144, 210, 216, 82, nil, 157, nil, 46, + 46, 14, nil, nil, 82, 50, 50, 167, nil, 46, + nil, nil, 217, 36, 12, 143, nil, nil, 201, 143, + 6, nil, nil, nil, nil, 212, nil, nil, nil, 84, + nil, nil, nil, 35, 6, 6, 207, nil, 84, 35, + 6, 53, 68, nil, 118, 24, nil, 207, nil, 40, + nil, 65, nil, nil, 35, 78, nil, 37, nil, 65, + 38, 82, 63, 35, 35, 35, 156, 35, 35, 35, + 14, 50, 78, nil, 185, 14, 36, 38, 9, nil, + 31, 50, 37, 156, 17, 85, 156, 6, 6, 85, + 169, 109, 64, 35, 118, 84, 84, nil, 35, 35, + 38, 31, 35, 35, 35, 35, nil, nil, 5, nil, + 50, 14, 14, 6, 150, 36, 107, 76, 50, 37, + 8, 59, nil, nil, nil, 36, 59, 207, 37, nil, + nil, 60, 149, 143, 143, 149, 60, nil, 149, 58, + 149, 206, 206, 83, nil, nil, 150, 150, 58, nil, + nil, 206, nil, 206, nil, nil, nil, 156, 5, 35, + 75, nil, 75, nil, 35, 35, 35, 35, 35, 71, + 167, 167, 121, 37, nil, 190, 40, nil, 190, 12, + 38, 201, 201, 12, 22, 52, nil, 87, 73, nil, + nil, 52, 10, 217, 50, 50, 6, 6, 46, 36, + 6, nil, nil, nil, nil, nil, nil, 206, 88, 149, + nil, 149, nil, 149, nil, 149, nil, nil, 85, 6, + nil, 71, 65, nil, 85, 33, 33, nil, 40, nil, + 75, 33, 33, nil, 51, 85, 149, nil, nil, nil, + 51, nil, nil, nil, 150, nil, nil, 143, 143, 6, + nil, nil, 35, 35, 35, 35, 35, 35, 35, nil, + nil, 46, nil, 35, 35, 35, nil, 85, 63, 84, + nil, nil, nil, 15, nil, nil, 63, 35, 78, nil, + nil, nil, 6, 51, 31, nil, 78, 71, 40, nil, + nil, 29, nil, nil, nil, nil, nil, 71, nil, 87, + 46, 85, nil, 12, nil, nil, 106, nil, nil, 25, + 46, 85, 118, 35, 35, 42, nil, nil, 25, 25, + nil, 6, nil, 35, 25, 25, 71, 14, 31, nil, + 14, 6, 71, nil, nil, nil, nil, 206, nil, nil, + 85, nil, 35, nil, nil, nil, 35, nil, 85, nil, + 35, 35, 75, 75, 206, nil, 100, 206, 75, 75, + nil, nil, nil, 33, nil, nil, nil, 35, nil, nil, + 12, nil, 100, 100, 106, 100, nil, 35, nil, 106, + nil, nil, nil, nil, 46, 27, 35, 35, 35, nil, + nil, nil, nil, nil, 27, 27, nil, nil, 6, nil, + 27, 27, nil, 71, nil, 6, 2, 35, 102, nil, + 71, 113, 40, nil, nil, nil, nil, 168, 22, 84, + nil, nil, 73, 12, 85, nil, nil, 9, 206, nil, + nil, nil, 6, 37, nil, nil, nil, 40, nil, 63, + 151, 6, 82, 151, nil, nil, nil, nil, nil, 78, + 63, nil, nil, nil, 24, 70, 25, 6, nil, nil, + 78, nil, nil, nil, nil, nil, 6, nil, 6, nil, + nil, nil, nil, nil, 40, 85, nil, nil, 85, nil, + 6, 84, 6, 40, 152, 152, 152, nil, nil, 31, + 75, nil, nil, nil, 40, nil, nil, nil, nil, nil, + 151, 118, nil, 75, 75, 75, 75, nil, nil, nil, + nil, 71, 35, 14, nil, nil, nil, nil, 61, nil, + nil, 204, 204, 204, nil, nil, nil, nil, 40, nil, + nil, nil, 27, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 100, nil, nil, nil, nil, + nil, nil, 14, 6, 24, 40, nil, nil, nil, nil, + nil, 100, 50, nil, nil, 35, nil, 36, nil, nil, + nil, nil, nil, 35, nil, 35, 61, nil, nil, 6, + nil, 35, 152, 152, 152, 152, nil, 152, nil, 31, + 35, 14, nil, nil, nil, 6, nil, 75, nil, nil, + 61, nil, nil, 35, nil, nil, 35, nil, nil, 14, + nil, nil, nil, 118, 35, nil, nil, nil, 118, nil, + nil, 14, nil, nil, 35, nil, nil, nil, nil, 35, + nil, nil, 61, nil, 35, 152, 152, 152, 152, nil, + nil, 14, nil, nil, 151, nil, 152, 151, nil, 54, + 151, 40, 151, nil, nil, 54, 100, nil, nil, nil, + nil, nil, 100, 6, 6, 6, nil, nil, 78, 100, + 54, 100, nil, nil, nil, 100, nil, 78, nil, 54, + 54, 54, nil, 54, nil, 208, nil, nil, nil, nil, + nil, 35, 14, 14, nil, nil, nil, 35, 35, nil, + nil, nil, nil, nil, nil, 14, 35, 35, nil, 54, + nil, nil, 35, 35, 54, 54, nil, nil, 54, nil, + nil, 151, nil, 151, nil, 151, 78, 151, nil, nil, + nil, 40, 6, nil, nil, 38, nil, nil, nil, nil, + nil, nil, nil, 6, 35, nil, nil, nil, 151, nil, + 14, nil, 46, nil, nil, 35, nil, 14, nil, nil, + 61, 6, 6, 6, 6, nil, 6, nil, nil, nil, + nil, nil, 71, 6, nil, 54, nil, 6, 71, nil, + 54, 54, 54, 54, 54, nil, nil, nil, 40, 35, + nil, nil, 85, nil, 35, 35, nil, nil, 35, nil, + 61, 100, nil, nil, 61, 204, 204, nil, 204, 204, + 154, 204, 154, nil, 6, 6, 6, 6, nil, nil, + nil, 61, nil, nil, nil, 6, nil, 61, 35, 208, + nil, nil, 208, nil, nil, 208, nil, 208, nil, nil, + 100, nil, nil, nil, 35, nil, 61, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 154, nil, nil, 35, 54, 54, + 54, 54, 54, 54, 54, nil, nil, nil, nil, 54, + 54, 54, nil, nil, nil, 35, nil, nil, nil, nil, + nil, nil, nil, 54, nil, 35, nil, 35, nil, nil, + nil, nil, nil, nil, nil, nil, 208, nil, 208, nil, + 208, nil, 208, nil, 57, nil, nil, 35, 35, nil, + 57, nil, nil, nil, nil, 204, 204, 204, 204, 54, + 54, nil, nil, 208, nil, 57, nil, nil, nil, 54, + nil, nil, nil, nil, 57, 57, 57, nil, 57, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 54, nil, + nil, nil, 54, 35, nil, nil, nil, 54, 35, 35, + nil, nil, 35, nil, 57, nil, nil, nil, nil, 57, + 57, 35, nil, 57, nil, 35, 204, nil, nil, nil, + nil, nil, nil, 54, 154, nil, 154, nil, 154, nil, + nil, nil, 54, 54, 54, nil, nil, nil, nil, nil, + nil, 61, nil, nil, 154, nil, 154, nil, nil, nil, + nil, 35, nil, 54, nil, nil, 35, nil, nil, nil, + nil, nil, nil, 35, nil, nil, nil, nil, 35, nil, + 57, nil, nil, nil, nil, 57, 57, 57, 57, 57, + nil, nil, nil, nil, nil, 61, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 35, nil, nil, nil, + nil, nil, nil, nil, nil, 61, nil, nil, 154, nil, + nil, nil, nil, nil, nil, 154, nil, 154, nil, 154, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 154, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 54, nil, + nil, nil, nil, 57, 57, 57, 57, 57, 57, 57, + nil, nil, nil, nil, 57, 57, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 57, nil, + nil, nil, nil, nil, nil, 61, nil, nil, nil, nil, + nil, nil, nil, 61, nil, nil, nil, nil, nil, nil, + nil, 54, nil, nil, nil, nil, nil, 61, nil, nil, + nil, 54, nil, nil, 57, 57, nil, nil, nil, nil, + nil, nil, nil, nil, 57, nil, 54, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 54, 57, nil, nil, nil, 57, nil, nil, + 54, nil, 57, nil, nil, nil, nil, nil, nil, nil, + 54, nil, nil, nil, nil, 54, nil, nil, nil, nil, + 54, nil, nil, nil, nil, nil, nil, nil, 57, nil, + nil, nil, nil, nil, nil, nil, nil, 57, 57, 57, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 57, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 80, + 80, nil, nil, nil, nil, nil, nil, 54, nil, nil, + nil, nil, nil, 54, 54, nil, nil, nil, nil, nil, + nil, nil, 54, 54, nil, nil, nil, nil, 54, 54, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 80, nil, 80, nil, + nil, 80, 80, 28, nil, nil, nil, nil, nil, 28, + nil, nil, nil, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 54, nil, nil, nil, nil, + 54, 54, nil, nil, 54, nil, nil, 28, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 80, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 28, 54, nil, 57, nil, nil, nil, + nil, nil, nil, 28, nil, nil, 57, nil, nil, nil, + 54, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 57, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 54, 57, nil, nil, 57, nil, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, nil, + nil, 54, nil, nil, nil, 57, nil, nil, nil, 28, + 57, 54, nil, 54, 80, 57, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 54, 54, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, nil, nil, nil, nil, nil, 57, 57, + nil, nil, nil, nil, 54, 54, nil, 57, 57, nil, + nil, nil, nil, 57, 57, nil, nil, 54, nil, nil, + 80, 54, 28, 80, 28, 80, nil, 28, nil, nil, + nil, nil, nil, 28, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 28, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, nil, nil, nil, nil, 54, + nil, nil, nil, nil, 54, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 57, nil, nil, nil, nil, 57, 57, nil, nil, 57, + nil, nil, 54, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 28, nil, nil, 41, 28, nil, nil, nil, + nil, 28, 80, nil, 41, 41, 41, nil, nil, 57, + nil, nil, nil, nil, nil, nil, nil, 41, 41, nil, + 41, nil, nil, nil, nil, 57, nil, 28, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 28, 28, nil, + nil, nil, 80, nil, nil, nil, nil, nil, 57, nil, + 80, 80, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 57, nil, 57, nil, + nil, nil, nil, 80, nil, nil, 80, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 57, 57, + nil, nil, nil, nil, nil, nil, nil, 80, nil, nil, + nil, nil, 80, nil, nil, 80, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 80, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 57, + 57, nil, 34, nil, nil, nil, nil, nil, 34, nil, + nil, 80, 57, nil, nil, nil, 57, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 80, nil, nil, 34, nil, nil, nil, + nil, nil, nil, nil, 41, 41, nil, nil, 41, 41, + nil, nil, nil, nil, 41, nil, nil, 57, nil, nil, + nil, nil, 34, nil, 57, 28, nil, 41, nil, 57, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, nil, nil, nil, nil, 41, 57, 80, nil, + nil, nil, nil, 28, 41, 41, 28, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, 41, nil, 41, nil, nil, 41, 41, 34, 28, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + nil, nil, nil, nil, nil, nil, 80, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 41, nil, nil, + nil, 41, 41, nil, nil, nil, 80, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 28, nil, nil, nil, nil, nil, 28, nil, nil, + nil, nil, nil, nil, nil, nil, 28, 28, nil, nil, + nil, nil, 28, 28, nil, nil, nil, nil, nil, nil, + nil, 34, nil, 34, nil, nil, 34, nil, nil, nil, + nil, 80, 34, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 34, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 28, + nil, nil, nil, nil, 28, nil, nil, nil, 28, nil, + nil, nil, nil, 41, nil, 41, 41, 41, nil, nil, + nil, 34, nil, nil, nil, 34, nil, nil, nil, nil, + 34, nil, nil, nil, 39, nil, nil, nil, 28, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 28, 41, 34, nil, 41, nil, + 41, nil, nil, nil, nil, nil, 34, 34, 39, 39, + 39, nil, nil, nil, nil, nil, 41, 28, nil, nil, + nil, nil, nil, nil, nil, 41, 41, nil, nil, nil, + nil, nil, nil, nil, 39, 28, nil, nil, nil, nil, + nil, nil, nil, nil, 39, 39, 39, 28, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 28, 28, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, nil, nil, nil, 28, 28, + nil, nil, 28, nil, nil, nil, nil, nil, nil, nil, + nil, 28, nil, nil, nil, 28, nil, 41, 41, 41, + nil, nil, 41, nil, nil, 41, 41, 41, 41, nil, + nil, nil, nil, 41, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 28, nil, 41, nil, + nil, 41, nil, 28, 34, nil, nil, nil, 28, nil, + nil, nil, nil, 39, nil, 39, nil, nil, 39, nil, + nil, nil, 41, nil, 39, nil, nil, 41, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, 34, nil, 41, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 34, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, 39, nil, 41, nil, 39, nil, nil, + nil, 39, 39, nil, nil, nil, nil, nil, 41, 41, + 41, 41, nil, 41, nil, 66, nil, nil, 39, nil, + 34, 66, nil, nil, nil, nil, 34, nil, 39, nil, + nil, nil, nil, nil, 67, 34, 34, nil, 39, 39, + 67, 34, 34, nil, nil, nil, nil, nil, nil, 66, + 66, 66, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, 67, + 67, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, 66, 66, 66, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, 41, 41, nil, 67, 67, 67, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 34, nil, + nil, nil, nil, 34, nil, nil, nil, 34, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, nil, + 66, nil, nil, nil, nil, nil, nil, 34, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, 34, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 34, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 34, nil, 39, 41, nil, nil, + nil, nil, nil, nil, 39, nil, 34, nil, nil, nil, + nil, nil, 39, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 34, 34, nil, nil, + nil, nil, nil, 67, 39, nil, nil, 39, nil, 66, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 34, 34, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, nil, 34, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, 66, nil, + nil, nil, 66, 66, nil, nil, nil, nil, nil, nil, + nil, nil, 39, 67, nil, nil, nil, 67, 39, 66, + nil, 67, 67, nil, nil, 34, nil, 39, 39, 66, + nil, nil, 34, 39, 39, nil, nil, 34, 67, 66, + 66, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, 67, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 39, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 39, nil, nil, nil, nil, 39, nil, nil, nil, 39, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 39, 39, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 39, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, 39, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, nil, nil, 66, nil, nil, 67, nil, 39, 39, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, 66, nil, nil, 66, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, 67, nil, nil, + nil, 66, nil, nil, 39, nil, nil, nil, nil, 39, + 39, nil, nil, 39, nil, nil, nil, nil, nil, nil, + 67, nil, 39, nil, nil, nil, 39, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, 66, nil, nil, nil, 39, nil, nil, + nil, nil, nil, nil, 39, nil, nil, nil, nil, 39, + nil, nil, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 66, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, nil, nil, nil, 67, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, 66, nil, nil, nil, + 66, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, 67, nil, nil, nil, 67, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 66, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 66, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 66, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, 66, + 66, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, 67, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + 66, 66, nil, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, 66, 67, nil, nil, 66, nil, 67, + 67, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 66, nil, nil, nil, nil, 66, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + 66, nil, 67, nil, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, 67 ] + +racc_goto_pointer = [ + nil, 117, 6, 125, nil, 60, -2, 107, 72, 27, + -84, 122, -324, -289, 15, -501, -589, -650, -707, nil, + -390, -168, 16, 134, -50, -97, 75, -21, 1641, -179, + -71, -15, 13, -190, 2110, 291, -208, -374, -3, 2432, + -19, 1932, -12, -423, nil, -591, -23, nil, nil, 129, + -214, 32, -232, -396, 907, -357, nil, 1172, 116, 66, + 76, 544, nil, -14, 33, -231, 2763, 2782, -289, 50, + -55, 1, nil, 20, -274, -63, 43, nil, -4, 112, + 1337, -189, -28, -457, 6, 16, -350, -256, -451, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 87, nil, + 55, -185, -28, nil, nil, nil, -306, -663, nil, -654, + nil, nil, nil, -334, nil, 94, nil, -208, -4, nil, + nil, -526, 93, -220, 110, 110, -174, 111, 111, -418, + -420, -700, -200, -209, -419, -701, nil, nil, nil, nil, + nil, nil, -790, -511, -534, -775, -721, -649, nil, -586, + -516, -74, -181, -644, 290, -740, -638, -584, nil, -693, + -770, -833, -827, -196, -574, 110, -404, -338, -18, -169, + nil, -81, -81, nil, -488, -539, nil, -295, -789, -365, + -509, -633, nil, nil, 134, 32, 130, 130, 132, -269, + -213, 132, 132, 137, -556, -398, -395, nil, nil, 142, + -346, -327, nil, nil, 171, -528, -367, -674, 111, -523, + -725, nil, -679, -868, nil, nil, -138, -466 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 309, 7, 360, 312, + nil, nil, nil, nil, 560, nil, nil, nil, nil, 308, + 310, nil, nil, nil, nil, 14, 15, 21, 242, nil, + nil, 17, nil, 442, 243, 340, nil, nil, 592, 241, + 478, 24, nil, nil, 355, nil, 25, 26, 27, nil, + 722, nil, nil, nil, 329, nil, 28, 326, 457, 35, + nil, nil, 37, 40, 39, nil, 238, 239, 372, nil, + 146, 465, 145, 91, nil, 447, 107, 47, 50, 274, + 300, nil, 458, nil, 459, 470, 680, 522, 298, 283, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, + nil, nil, 284, 65, 66, 67, nil, nil, 68, 863, + 69, 70, 71, nil, 72, nil, 73, nil, 573, 74, + 75, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 288, 276, 730, 854, + 582, 864, 787, 620, nil, 788, 789, 1022, 922, 608, + nil, 609, nil, nil, 610, nil, 612, nil, 833, nil, + nil, nil, 618, nil, nil, nil, nil, nil, nil, nil, + 469, nil, nil, 700, nil, nil, 510, nil, nil, nil, + nil, nil, 90, 92, 94, nil, nil, nil, nil, nil, + 638, nil, nil, nil, nil, nil, nil, 103, 104, nil, + nil, 893, 769, 607, nil, 611, 901, 623, 625, 626, + 933, 629, 630, 934, 633, 636, nil, 303 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 3, 151, :_reduce_6, + 2, 151, :_reduce_none, + 1, 154, :_reduce_none, + 0, 158, :_reduce_9, + 3, 154, :_reduce_10, + 0, 160, :_reduce_11, + 4, 157, :_reduce_12, + 0, 165, :_reduce_13, + 6, 159, :_reduce_14, + 3, 159, :_reduce_15, + 2, 161, :_reduce_16, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 3, 166, :_reduce_19, + 2, 166, :_reduce_20, + 1, 167, :_reduce_none, + 0, 168, :_reduce_22, + 3, 167, :_reduce_23, + 0, 179, :_reduce_24, + 4, 156, :_reduce_25, + 3, 156, :_reduce_26, + 3, 156, :_reduce_27, + 3, 156, :_reduce_28, + 2, 156, :_reduce_29, + 3, 156, :_reduce_30, + 3, 156, :_reduce_31, + 3, 156, :_reduce_32, + 3, 156, :_reduce_33, + 3, 156, :_reduce_34, + 4, 156, :_reduce_35, + 1, 156, :_reduce_none, + 3, 156, :_reduce_37, + 3, 156, :_reduce_38, + 3, 156, :_reduce_39, + 1, 156, :_reduce_none, + 3, 172, :_reduce_41, + 3, 172, :_reduce_42, + 6, 172, :_reduce_43, + 5, 172, :_reduce_44, + 5, 172, :_reduce_45, + 5, 172, :_reduce_46, + 5, 172, :_reduce_47, + 3, 172, :_reduce_48, + 1, 180, :_reduce_49, + 1, 180, :_reduce_none, + 1, 178, :_reduce_none, + 3, 178, :_reduce_52, + 3, 178, :_reduce_53, + 3, 178, :_reduce_54, + 2, 178, :_reduce_55, + 1, 178, :_reduce_none, + 1, 171, :_reduce_57, + 0, 191, :_reduce_58, + 0, 192, :_reduce_59, + 4, 189, :_reduce_60, + 1, 174, :_reduce_none, + 1, 174, :_reduce_none, + 1, 194, :_reduce_none, + 4, 194, :_reduce_64, + 0, 202, :_reduce_65, + 4, 199, :_reduce_66, + 1, 201, :_reduce_67, + 2, 193, :_reduce_68, + 3, 193, :_reduce_69, + 4, 193, :_reduce_70, + 5, 193, :_reduce_71, + 4, 193, :_reduce_72, + 5, 193, :_reduce_73, + 2, 193, :_reduce_74, + 2, 193, :_reduce_75, + 2, 193, :_reduce_76, + 2, 193, :_reduce_77, + 2, 193, :_reduce_78, + 1, 173, :_reduce_none, + 3, 173, :_reduce_80, + 1, 207, :_reduce_none, + 3, 207, :_reduce_82, + 1, 206, :_reduce_83, + 2, 206, :_reduce_84, + 3, 206, :_reduce_85, + 5, 206, :_reduce_86, + 2, 206, :_reduce_87, + 4, 206, :_reduce_88, + 2, 206, :_reduce_89, + 4, 206, :_reduce_90, + 1, 206, :_reduce_91, + 3, 206, :_reduce_92, + 1, 210, :_reduce_none, + 3, 210, :_reduce_94, + 2, 209, :_reduce_95, + 3, 209, :_reduce_96, + 1, 212, :_reduce_97, + 3, 212, :_reduce_98, + 1, 211, :_reduce_99, + 1, 211, :_reduce_100, + 4, 211, :_reduce_101, + 3, 211, :_reduce_102, + 3, 211, :_reduce_103, + 3, 211, :_reduce_104, + 3, 211, :_reduce_105, + 2, 211, :_reduce_106, + 1, 211, :_reduce_107, + 1, 175, :_reduce_108, + 1, 175, :_reduce_109, + 4, 175, :_reduce_110, + 3, 175, :_reduce_111, + 3, 175, :_reduce_112, + 3, 175, :_reduce_113, + 3, 175, :_reduce_114, + 2, 175, :_reduce_115, + 1, 175, :_reduce_116, + 1, 215, :_reduce_117, + 1, 215, :_reduce_none, + 2, 216, :_reduce_119, + 1, 216, :_reduce_120, + 3, 216, :_reduce_121, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_125, + 1, 217, :_reduce_none, + 1, 169, :_reduce_127, + 1, 169, :_reduce_none, + 1, 170, :_reduce_129, + 0, 221, :_reduce_130, + 4, 170, :_reduce_131, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 3, 188, :_reduce_203, + 3, 188, :_reduce_204, + 6, 188, :_reduce_205, + 5, 188, :_reduce_206, + 5, 188, :_reduce_207, + 5, 188, :_reduce_208, + 5, 188, :_reduce_209, + 4, 188, :_reduce_210, + 3, 188, :_reduce_211, + 3, 188, :_reduce_212, + 3, 188, :_reduce_213, + 3, 188, :_reduce_214, + 3, 188, :_reduce_215, + 3, 188, :_reduce_216, + 3, 188, :_reduce_217, + 3, 188, :_reduce_218, + 3, 188, :_reduce_219, + 4, 188, :_reduce_220, + 2, 188, :_reduce_221, + 2, 188, :_reduce_222, + 3, 188, :_reduce_223, + 3, 188, :_reduce_224, + 3, 188, :_reduce_225, + 3, 188, :_reduce_226, + 1, 188, :_reduce_none, + 3, 188, :_reduce_228, + 3, 188, :_reduce_229, + 3, 188, :_reduce_230, + 3, 188, :_reduce_231, + 3, 188, :_reduce_232, + 2, 188, :_reduce_233, + 2, 188, :_reduce_234, + 3, 188, :_reduce_235, + 3, 188, :_reduce_236, + 3, 188, :_reduce_237, + 3, 188, :_reduce_238, + 3, 188, :_reduce_239, + 6, 188, :_reduce_240, + 1, 188, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 3, 224, :_reduce_246, + 3, 224, :_reduce_247, + 1, 227, :_reduce_248, + 1, 228, :_reduce_none, + 2, 228, :_reduce_250, + 4, 228, :_reduce_251, + 2, 228, :_reduce_252, + 1, 222, :_reduce_none, + 3, 222, :_reduce_254, + 3, 232, :_reduce_255, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 2, 183, :_reduce_260, + 4, 183, :_reduce_261, + 2, 183, :_reduce_262, + 1, 205, :_reduce_263, + 2, 205, :_reduce_264, + 2, 205, :_reduce_265, + 4, 205, :_reduce_266, + 1, 205, :_reduce_267, + 0, 236, :_reduce_268, + 2, 198, :_reduce_269, + 2, 235, :_reduce_270, + 2, 234, :_reduce_271, + 1, 234, :_reduce_none, + 1, 229, :_reduce_273, + 2, 229, :_reduce_274, + 3, 229, :_reduce_275, + 4, 229, :_reduce_276, + 1, 177, :_reduce_277, + 1, 177, :_reduce_278, + 3, 176, :_reduce_279, + 4, 176, :_reduce_280, + 2, 176, :_reduce_281, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_292, + 0, 271, :_reduce_293, + 4, 225, :_reduce_294, + 0, 272, :_reduce_295, + 3, 225, :_reduce_296, + 0, 273, :_reduce_297, + 4, 225, :_reduce_298, + 3, 225, :_reduce_299, + 3, 225, :_reduce_300, + 2, 225, :_reduce_301, + 0, 274, :_reduce_302, + 4, 225, :_reduce_303, + 0, 275, :_reduce_304, + 4, 225, :_reduce_305, + 1, 225, :_reduce_306, + 4, 225, :_reduce_307, + 3, 225, :_reduce_308, + 1, 225, :_reduce_309, + 5, 225, :_reduce_310, + 4, 225, :_reduce_311, + 3, 225, :_reduce_312, + 2, 225, :_reduce_313, + 1, 225, :_reduce_none, + 2, 225, :_reduce_315, + 1, 225, :_reduce_316, + 6, 225, :_reduce_317, + 6, 225, :_reduce_318, + 4, 225, :_reduce_319, + 4, 225, :_reduce_320, + 5, 225, :_reduce_321, + 4, 225, :_reduce_322, + 6, 225, :_reduce_323, + 0, 276, :_reduce_324, + 6, 225, :_reduce_325, + 0, 277, :_reduce_326, + 0, 278, :_reduce_327, + 8, 225, :_reduce_328, + 0, 279, :_reduce_329, + 5, 225, :_reduce_330, + 0, 280, :_reduce_331, + 6, 225, :_reduce_332, + 0, 281, :_reduce_333, + 0, 282, :_reduce_334, + 9, 225, :_reduce_335, + 1, 225, :_reduce_336, + 1, 225, :_reduce_337, + 1, 225, :_reduce_338, + 1, 225, :_reduce_339, + 1, 182, :_reduce_340, + 1, 246, :_reduce_none, + 1, 252, :_reduce_none, + 1, 255, :_reduce_none, + 1, 257, :_reduce_none, + 1, 258, :_reduce_none, + 1, 259, :_reduce_none, + 1, 261, :_reduce_none, + 1, 263, :_reduce_348, + 1, 266, :_reduce_349, + 1, 267, :_reduce_350, + 1, 283, :_reduce_none, + 1, 284, :_reduce_none, + 1, 285, :_reduce_none, + 1, 286, :_reduce_none, + 1, 287, :_reduce_none, + 1, 163, :_reduce_none, + 1, 288, :_reduce_none, + 1, 247, :_reduce_none, + 1, 204, :_reduce_none, + 1, 253, :_reduce_none, + 1, 253, :_reduce_none, + 2, 253, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 254, :_reduce_none, + 5, 254, :_reduce_366, + 1, 256, :_reduce_none, + 2, 256, :_reduce_368, + 1, 262, :_reduce_none, + 1, 262, :_reduce_370, + 1, 289, :_reduce_none, + 3, 289, :_reduce_372, + 1, 292, :_reduce_373, + 3, 292, :_reduce_374, + 1, 291, :_reduce_375, + 3, 291, :_reduce_376, + 5, 291, :_reduce_377, + 1, 291, :_reduce_378, + 3, 291, :_reduce_379, + 2, 293, :_reduce_380, + 1, 293, :_reduce_381, + 4, 294, :_reduce_382, + 2, 294, :_reduce_383, + 2, 294, :_reduce_384, + 1, 294, :_reduce_385, + 2, 299, :_reduce_386, + 1, 299, :_reduce_none, + 6, 300, :_reduce_388, + 8, 300, :_reduce_389, + 4, 300, :_reduce_390, + 6, 300, :_reduce_391, + 4, 300, :_reduce_392, + 2, 300, :_reduce_393, + 6, 300, :_reduce_394, + 2, 300, :_reduce_395, + 4, 300, :_reduce_396, + 6, 300, :_reduce_397, + 2, 300, :_reduce_398, + 4, 300, :_reduce_399, + 2, 300, :_reduce_400, + 4, 300, :_reduce_401, + 1, 300, :_reduce_402, + 1, 304, :_reduce_403, + 1, 304, :_reduce_404, + 3, 305, :_reduce_405, + 1, 305, :_reduce_406, + 4, 305, :_reduce_407, + 1, 306, :_reduce_none, + 4, 306, :_reduce_409, + 1, 307, :_reduce_410, + 3, 307, :_reduce_411, + 1, 308, :_reduce_412, + 1, 308, :_reduce_none, + 0, 312, :_reduce_414, + 0, 313, :_reduce_415, + 5, 251, :_reduce_416, + 4, 310, :_reduce_417, + 1, 310, :_reduce_418, + 3, 311, :_reduce_419, + 3, 311, :_reduce_420, + 3, 315, :_reduce_421, + 2, 195, :_reduce_422, + 4, 195, :_reduce_423, + 5, 195, :_reduce_424, + 5, 195, :_reduce_425, + 2, 250, :_reduce_426, + 4, 250, :_reduce_427, + 4, 250, :_reduce_428, + 3, 250, :_reduce_429, + 3, 250, :_reduce_430, + 3, 250, :_reduce_431, + 2, 250, :_reduce_432, + 1, 250, :_reduce_433, + 4, 250, :_reduce_434, + 0, 318, :_reduce_435, + 4, 249, :_reduce_436, + 0, 319, :_reduce_437, + 4, 249, :_reduce_438, + 0, 320, :_reduce_439, + 0, 321, :_reduce_440, + 4, 200, :_reduce_441, + 0, 323, :_reduce_442, + 0, 324, :_reduce_443, + 4, 316, :_reduce_444, + 1, 322, :_reduce_445, + 2, 322, :_reduce_446, + 3, 322, :_reduce_447, + 4, 322, :_reduce_448, + 0, 326, :_reduce_449, + 6, 260, :_reduce_450, + 1, 325, :_reduce_none, + 1, 325, :_reduce_none, + 6, 162, :_reduce_453, + 0, 162, :_reduce_454, + 1, 327, :_reduce_455, + 1, 327, :_reduce_none, + 1, 327, :_reduce_none, + 2, 328, :_reduce_458, + 1, 328, :_reduce_none, + 2, 164, :_reduce_460, + 1, 164, :_reduce_none, + 1, 237, :_reduce_462, + 1, 237, :_reduce_none, + 1, 238, :_reduce_464, + 1, 330, :_reduce_465, + 1, 330, :_reduce_none, + 2, 330, :_reduce_467, + 3, 331, :_reduce_468, + 1, 331, :_reduce_469, + 3, 239, :_reduce_470, + 3, 240, :_reduce_471, + 3, 241, :_reduce_472, + 3, 241, :_reduce_473, + 1, 335, :_reduce_474, + 3, 335, :_reduce_475, + 1, 336, :_reduce_none, + 2, 336, :_reduce_477, + 3, 243, :_reduce_478, + 3, 243, :_reduce_479, + 1, 338, :_reduce_480, + 3, 338, :_reduce_481, + 3, 242, :_reduce_482, + 3, 242, :_reduce_483, + 3, 244, :_reduce_484, + 3, 244, :_reduce_485, + 1, 339, :_reduce_486, + 3, 339, :_reduce_487, + 1, 340, :_reduce_488, + 3, 340, :_reduce_489, + 1, 332, :_reduce_490, + 2, 332, :_reduce_491, + 1, 333, :_reduce_492, + 2, 333, :_reduce_493, + 1, 334, :_reduce_494, + 2, 334, :_reduce_495, + 1, 337, :_reduce_496, + 0, 342, :_reduce_497, + 3, 337, :_reduce_498, + 0, 343, :_reduce_499, + 4, 337, :_reduce_500, + 1, 341, :_reduce_501, + 1, 341, :_reduce_502, + 1, 341, :_reduce_503, + 1, 341, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 2, 344, :_reduce_507, + 1, 344, :_reduce_508, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 3, 345, :_reduce_513, + 1, 329, :_reduce_none, + 2, 329, :_reduce_515, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 214, :_reduce_525, + 1, 214, :_reduce_526, + 1, 214, :_reduce_527, + 1, 214, :_reduce_528, + 1, 214, :_reduce_529, + 1, 214, :_reduce_530, + 1, 214, :_reduce_531, + 1, 245, :_reduce_532, + 1, 245, :_reduce_533, + 1, 181, :_reduce_534, + 1, 181, :_reduce_535, + 1, 186, :_reduce_536, + 1, 186, :_reduce_537, + 0, 347, :_reduce_538, + 4, 264, :_reduce_539, + 1, 264, :_reduce_540, + 3, 268, :_reduce_541, + 0, 349, :_reduce_542, + 3, 268, :_reduce_543, + 4, 348, :_reduce_544, + 2, 348, :_reduce_545, + 2, 348, :_reduce_546, + 1, 348, :_reduce_none, + 2, 351, :_reduce_548, + 0, 351, :_reduce_549, + 6, 314, :_reduce_550, + 8, 314, :_reduce_551, + 4, 314, :_reduce_552, + 6, 314, :_reduce_553, + 4, 314, :_reduce_554, + 6, 314, :_reduce_555, + 2, 314, :_reduce_556, + 4, 314, :_reduce_557, + 6, 314, :_reduce_558, + 2, 314, :_reduce_559, + 4, 314, :_reduce_560, + 2, 314, :_reduce_561, + 4, 314, :_reduce_562, + 1, 314, :_reduce_563, + 0, 314, :_reduce_564, + 1, 309, :_reduce_565, + 1, 309, :_reduce_566, + 1, 309, :_reduce_567, + 1, 309, :_reduce_568, + 1, 290, :_reduce_none, + 1, 290, :_reduce_570, + 1, 353, :_reduce_none, + 1, 354, :_reduce_none, + 3, 354, :_reduce_573, + 1, 301, :_reduce_574, + 3, 301, :_reduce_575, + 1, 355, :_reduce_none, + 2, 356, :_reduce_577, + 1, 356, :_reduce_578, + 2, 357, :_reduce_579, + 1, 357, :_reduce_580, + 1, 295, :_reduce_none, + 3, 295, :_reduce_582, + 1, 350, :_reduce_none, + 3, 350, :_reduce_584, + 1, 358, :_reduce_none, + 1, 358, :_reduce_none, + 2, 296, :_reduce_587, + 1, 296, :_reduce_588, + 3, 359, :_reduce_589, + 3, 360, :_reduce_590, + 1, 302, :_reduce_591, + 3, 302, :_reduce_592, + 1, 352, :_reduce_593, + 3, 352, :_reduce_594, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 2, 303, :_reduce_597, + 1, 303, :_reduce_598, + 1, 362, :_reduce_none, + 1, 362, :_reduce_none, + 2, 298, :_reduce_601, + 2, 297, :_reduce_602, + 0, 297, :_reduce_603, + 1, 269, :_reduce_none, + 0, 363, :_reduce_605, + 4, 269, :_reduce_606, + 1, 248, :_reduce_607, + 2, 248, :_reduce_none, + 1, 231, :_reduce_none, + 3, 231, :_reduce_610, + 3, 364, :_reduce_611, + 2, 364, :_reduce_612, + 4, 364, :_reduce_613, + 2, 364, :_reduce_614, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 317, :_reduce_none, + 1, 317, :_reduce_none, + 1, 317, :_reduce_none, + 1, 270, :_reduce_none, + 1, 270, :_reduce_none, + 1, 185, :_reduce_none, + 1, 185, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 187, :_reduce_none, + 1, 187, :_reduce_none, + 2, 208, :_reduce_635, + 2, 184, :_reduce_636, + 0, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 265, :_reduce_640, + 1, 265, :_reduce_none, + 1, 155, :_reduce_none, + 2, 155, :_reduce_643, + 0, 153, :_reduce_644 ] + +racc_reduce_n = 645 + +racc_shift_n = 1089 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLONELY => 142, + :tLOWEST => 143, + :tEQL => 144, + :tBDOT2 => 145, + :tBDOT3 => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLONELY", + "tLOWEST", + "tEQL", + "tBDOT2", + "tBDOT3", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "@3", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@4", + "stmts", + "stmt_or_begin", + "@5", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@6", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@7", + "@8", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@9", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@10", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@11", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "dot_or_colon", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "@23", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@24", + "@25", + "f_args", + "do_block", + "do_body", + "operation3", + "@26", + "@27", + "@28", + "@29", + "case_args", + "@30", + "@31", + "cases", + "@32", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "@34", + "ssym", + "dsym", + "sym", + "@35", + "args_tail", + "@36", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@37", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_12(val, _values, result) + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_13(val, _values, result) + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + + result +end + +def _reduce_14(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_15(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_16(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 17 omitted + +# reduce 18 omitted + +def _reduce_19(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_20(val, _values, result) + result = val[1] + debug 12 + + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_23(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_24(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_25(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_27(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_28(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_29(val, _values, result) + result = val[1] + + result +end + +def _reduce_30(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_31(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_33(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_34(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_35(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_38(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_49(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +# reduce 50 omitted + +# reduce 51 omitted + +def _reduce_52(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_53(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_54(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_55(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_58(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_59(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_60(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 61 omitted + +# reduce 62 omitted + +# reduce 63 omitted + +def _reduce_64(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_65(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_66(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_67(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_68(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_69(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_70(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_71(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_72(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_73(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_74(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_75(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_76(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_77(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_78(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 79 omitted + +def _reduce_80(val, _values, result) + result = val[1] + + result +end + +# reduce 81 omitted + +def _reduce_82(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_83(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_84(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_85(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_86(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_87(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_88(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_89(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_90(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_91(val, _values, result) + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_92(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 93 omitted + +def _reduce_94(val, _values, result) + result = val[1] + + result +end + +def _reduce_95(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_96(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_97(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_98(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_99(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_100(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_101(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_102(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_103(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_104(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_105(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_106(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_107(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_108(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_109(val, _values, result) + var, = val + + result = self.assignable var + + debug 16 + + result +end + +def _reduce_110(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_111(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_112(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_113(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_114(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_115(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_116(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_117(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 118 omitted + +def _reduce_119(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_120(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_121(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +def _reduce_125(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 126 omitted + +def _reduce_127(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 128 omitted + +def _reduce_129(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_130(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_131(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +def _reduce_203(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_204(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_205(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_206(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_207(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_208(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_209(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_210(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_211(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_212(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_213(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_214(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_215(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_220(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_221(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_222(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_223(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 227 omitted + +def _reduce_228(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_231(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_232(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_233(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_234(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_235(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_236(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_238(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_239(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_240(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +# reduce 241 omitted + +# reduce 242 omitted + +# reduce 243 omitted + +# reduce 244 omitted + +# reduce 245 omitted + +def _reduce_246(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_247(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_248(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 249 omitted + +def _reduce_250(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_251(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_252(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 253 omitted + +def _reduce_254(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_255(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +# reduce 256 omitted + +# reduce 257 omitted + +# reduce 258 omitted + +# reduce 259 omitted + +def _reduce_260(val, _values, result) + result = args val + + result +end + +def _reduce_261(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_262(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_263(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_264(val, _values, result) + result = call_args val + + result +end + +def _reduce_265(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_266(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_267(val, _values, result) + result = call_args val + + result +end + +def _reduce_268(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_269(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_270(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_271(val, _values, result) + result = val[1] + + result +end + +# reduce 272 omitted + +def _reduce_273(val, _values, result) + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + + result +end + +def _reduce_274(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_275(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_276(val, _values, result) + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_277(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_278(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_279(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_280(val, _values, result) + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_281(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 282 omitted + +# reduce 283 omitted + +# reduce 284 omitted + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +# reduce 290 omitted + +# reduce 291 omitted + +def _reduce_292(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_293(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_294(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_295(val, _values, result) + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + + result +end + +def _reduce_296(val, _values, result) + _, line, _ = val + result = s(:begin).line line + + result +end + +def _reduce_297(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_298(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_299(val, _values, result) + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + + result +end + +def _reduce_300(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_301(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_302(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_303(val, _values, result) + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_304(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_305(val, _values, result) + result = new_hash val + + result +end + +def _reduce_306(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_307(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_308(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_309(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_310(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_311(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_312(val, _values, result) + debug 20 + + result +end + +def _reduce_313(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 314 omitted + +def _reduce_315(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_316(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_317(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_318(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_319(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_320(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_321(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_322(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_323(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_324(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_325(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_326(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_327(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_328(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_329(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_330(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_331(val, _values, result) + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result +end + +def _reduce_332(val, _values, result) + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_333(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_334(val, _values, result) + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + + result +end + +def _reduce_335(val, _values, result) + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_336(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_337(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_338(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_339(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_340(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 341 omitted + +# reduce 342 omitted + +# reduce 343 omitted + +# reduce 344 omitted + +# reduce 345 omitted + +# reduce 346 omitted + +# reduce 347 omitted + +def _reduce_348(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_349(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_350(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +# reduce 351 omitted + +# reduce 352 omitted + +# reduce 353 omitted + +# reduce 354 omitted + +# reduce 355 omitted + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +# reduce 360 omitted + +# reduce 361 omitted + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +def _reduce_366(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 367 omitted + +def _reduce_368(val, _values, result) + result = val[1] + + result +end + +# reduce 369 omitted + +def _reduce_370(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +# reduce 371 omitted + +def _reduce_372(val, _values, result) + result = val[1] + + result +end + +def _reduce_373(val, _values, result) + sym, = val + + result = s(:array, sym).line lexer.lineno + + result +end + +def _reduce_374(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_375(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_376(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_377(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_378(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_379(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_380(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_381(val, _values, result) + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + + result +end + +def _reduce_382(val, _values, result) + result = call_args val + + result +end + +def _reduce_383(val, _values, result) + result = call_args val + + result +end + +def _reduce_384(val, _values, result) + result = call_args val + + result +end + +def _reduce_385(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_386(val, _values, result) + result = args val + + result +end + +# reduce 387 omitted + +def _reduce_388(val, _values, result) + result = args val + + result +end + +def _reduce_389(val, _values, result) + result = args val + + result +end + +def _reduce_390(val, _values, result) + result = args val + + result +end + +def _reduce_391(val, _values, result) + result = args val + + result +end + +def _reduce_392(val, _values, result) + result = args val + + result +end + +def _reduce_393(val, _values, result) + result = args(val) << nil + + result +end + +def _reduce_394(val, _values, result) + result = args val + + result +end + +def _reduce_395(val, _values, result) + result = args val + + result +end + +def _reduce_396(val, _values, result) + result = args val + + result +end + +def _reduce_397(val, _values, result) + result = args val + + result +end + +def _reduce_398(val, _values, result) + result = args val + + result +end + +def _reduce_399(val, _values, result) + result = args val + + result +end + +def _reduce_400(val, _values, result) + result = args val + + result +end + +def _reduce_401(val, _values, result) + result = args val + + result +end + +def _reduce_402(val, _values, result) + result = args val + + result +end + +def _reduce_403(val, _values, result) + result = 0 + result +end + +def _reduce_404(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_405(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +def _reduce_406(val, _values, result) + result = s(:args).line lexer.lineno + + result +end + +def _reduce_407(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +# reduce 408 omitted + +def _reduce_409(val, _values, result) + result = args val + + result +end + +def _reduce_410(val, _values, result) + result = args val + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +def _reduce_412(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 413 omitted + +def _reduce_414(val, _values, result) + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_415(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_416(val, _values, result) + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_417(val, _values, result) + result = args val + + result +end + +def _reduce_418(val, _values, result) + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_419(val, _values, result) + result = val[1] + + result +end + +def _reduce_420(val, _values, result) + result = val[1] + + result +end + +def _reduce_421(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_422(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_423(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_424(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_425(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_426(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_427(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_428(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_429(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_430(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_431(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_432(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_433(val, _values, result) + result = s(:zsuper).line lexer.lineno + + result +end + +def _reduce_434(val, _values, result) + result = new_aref val + + result +end + +def _reduce_435(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_436(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_437(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_438(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_439(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_440(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_441(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_442(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_443(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_444(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_445(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_446(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_447(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_448(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_449(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_450(val, _values, result) + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + + result +end + +# reduce 451 omitted + +# reduce 452 omitted + +def _reduce_453(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_454(val, _values, result) + result = nil + + result +end + +def _reduce_455(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 456 omitted + +# reduce 457 omitted + +def _reduce_458(val, _values, result) + result = val[1] + + result +end + +# reduce 459 omitted + +def _reduce_460(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 461 omitted + +def _reduce_462(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 463 omitted + +def _reduce_464(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_465(val, _values, result) + debug 37 + + result +end + +# reduce 466 omitted + +def _reduce_467(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_468(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_469(val, _values, result) + result = new_string val + + result +end + +def _reduce_470(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_471(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_472(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_473(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_474(val, _values, result) + result = new_word_list + + result +end + +def _reduce_475(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 476 omitted + +def _reduce_477(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_478(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_479(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_480(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_481(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_482(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_483(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_484(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_485(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_486(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_487(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_488(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_489(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_490(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_491(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_492(val, _values, result) + result = nil + + result +end + +def _reduce_493(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_494(val, _values, result) + result = nil + + result +end + +def _reduce_495(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_496(val, _values, result) + result = new_string val + + result +end + +def _reduce_497(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_498(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_499(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_500(val, _values, result) + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_501(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_502(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_503(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 504 omitted + +# reduce 505 omitted + +# reduce 506 omitted + +def _reduce_507(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_508(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 509 omitted + +# reduce 510 omitted + +# reduce 511 omitted + +# reduce 512 omitted + +def _reduce_513(val, _values, result) + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + + result +end + +# reduce 514 omitted + +def _reduce_515(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 516 omitted + +# reduce 517 omitted + +# reduce 518 omitted + +# reduce 519 omitted + +# reduce 520 omitted + +# reduce 521 omitted + +# reduce 522 omitted + +# reduce 523 omitted + +# reduce 524 omitted + +def _reduce_525(val, _values, result) + result = s(:nil).line lexer.lineno + result +end + +def _reduce_526(val, _values, result) + result = s(:self).line lexer.lineno + result +end + +def _reduce_527(val, _values, result) + result = s(:true).line lexer.lineno + result +end + +def _reduce_528(val, _values, result) + result = s(:false).line lexer.lineno + result +end + +def _reduce_529(val, _values, result) + result = s(:str, self.file).line lexer.lineno + result +end + +def _reduce_530(val, _values, result) + result = s(:lit, lexer.lineno).line lexer.lineno + result +end + +def _reduce_531(val, _values, result) + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_532(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + + result +end + +def _reduce_533(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_534(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_535(val, _values, result) + result = self.assignable val[0] + debug 40 + + result +end + +def _reduce_536(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_537(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_538(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_539(val, _values, result) + result = val[2] + + result +end + +def _reduce_540(val, _values, result) + result = nil + + result +end + +def _reduce_541(val, _values, result) + result = end_args val + + result +end + +def _reduce_542(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_543(val, _values, result) + result = end_args val + + result +end + +def _reduce_544(val, _values, result) + result = args val + + result +end + +def _reduce_545(val, _values, result) + result = args val + + result +end + +def _reduce_546(val, _values, result) + result = args val + + result +end + +# reduce 547 omitted + +def _reduce_548(val, _values, result) + result = val[1] + + result +end + +def _reduce_549(val, _values, result) + result = nil + + result +end + +def _reduce_550(val, _values, result) + result = args val + + result +end + +def _reduce_551(val, _values, result) + result = args val + + result +end + +def _reduce_552(val, _values, result) + result = args val + + result +end + +def _reduce_553(val, _values, result) + result = args val + + result +end + +def _reduce_554(val, _values, result) + result = args val + + result +end + +def _reduce_555(val, _values, result) + result = args val + + result +end + +def _reduce_556(val, _values, result) + result = args val + + result +end + +def _reduce_557(val, _values, result) + result = args val + + result +end + +def _reduce_558(val, _values, result) + result = args val + + result +end + +def _reduce_559(val, _values, result) + result = args val + + result +end + +def _reduce_560(val, _values, result) + result = args val + + result +end + +def _reduce_561(val, _values, result) + result = args val + + result +end + +def _reduce_562(val, _values, result) + result = args val + + result +end + +def _reduce_563(val, _values, result) + result = args val + + result +end + +def _reduce_564(val, _values, result) + result = args val + # result.line lexer.lineno + + result +end + +def _reduce_565(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_566(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_567(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_568(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 571 omitted + +# reduce 572 omitted + +def _reduce_573(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_574(val, _values, result) + result = new_arg val + + result +end + +def _reduce_575(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +# reduce 576 omitted + +def _reduce_577(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_578(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_579(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_580(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 581 omitted + +def _reduce_582(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 583 omitted + +def _reduce_584(val, _values, result) + result = args val + + result +end + +# reduce 585 omitted + +# reduce 586 omitted + +def _reduce_587(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_588(val, _values, result) + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + + result +end + +def _reduce_589(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + + result +end + +def _reduce_590(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + + result +end + +def _reduce_591(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_592(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_593(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_594(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 595 omitted + +# reduce 596 omitted + +def _reduce_597(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_598(val, _values, result) + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + + result +end + +# reduce 599 omitted + +# reduce 600 omitted + +def _reduce_601(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_602(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_603(val, _values, result) + result = nil + + result +end + +# reduce 604 omitted + +def _reduce_605(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_606(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_607(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 608 omitted + +# reduce 609 omitted + +def _reduce_610(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_611(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_612(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_613(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_614(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 615 omitted + +# reduce 616 omitted + +# reduce 617 omitted + +# reduce 618 omitted + +# reduce 619 omitted + +# reduce 620 omitted + +# reduce 621 omitted + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +# reduce 626 omitted + +# reduce 627 omitted + +# reduce 628 omitted + +# reduce 629 omitted + +# reduce 630 omitted + +# reduce 631 omitted + +# reduce 632 omitted + +# reduce 633 omitted + +# reduce 634 omitted + +def _reduce_635(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_636(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 637 omitted + +# reduce 638 omitted + +# reduce 639 omitted + +def _reduce_640(val, _values, result) + yyerrok + result +end + +# reduce 641 omitted + +# reduce 642 omitted + +def _reduce_643(val, _values, result) + yyerrok + result +end + +def _reduce_644(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby23Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby23_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby23_parser.y new file mode 100644 index 000000000..e94218ac7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby23_parser.y @@ -0,0 +1,2737 @@ +# -*- racc -*- + +class Ruby23Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + compstmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + + f_opt: f_arg_asgn tEQL arg_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + + f_block_opt: f_arg_asgn tEQL primary_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby24_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby24_parser.rb new file mode 100644 index 000000000..8f5adfbf1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby24_parser.rb @@ -0,0 +1,11212 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby24Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -521, 639, 574, 224, 225, -109, -95, -521, -521, -521, + -110, 574, -521, -521, -521, -103, -521, -117, 574, 224, + 225, -81, 574, 655, -521, 285, -521, -521, -521, -116, + 234, -109, -535, 658, 3, -536, -521, -521, 230, -521, + -521, -521, -521, -521, -112, 280, 737, 224, 225, 736, + -110, 95, -105, -114, 574, 889, 748, -104, 737, 96, + 126, 739, 641, 640, 637, -111, 235, -521, -521, -521, + -521, -521, -521, -521, -521, -521, -521, -521, -521, -521, + -521, -117, -103, -521, -521, -521, 654, -521, -521, -109, + 282, -521, -110, 235, -521, -521, 657, -521, 285, -521, + 221, -521, 231, -521, -521, -521, -521, -521, -521, -521, + -100, -521, 287, -521, 222, -101, 130, -103, -116, -105, + -103, 129, -108, -619, -104, 130, -521, -521, -521, -521, + 129, -521, 130, -521, -107, -103, 130, 129, -521, -524, + -112, 129, -521, -114, -521, -109, -524, -524, -524, -103, + -109, -524, -524, -524, -105, -524, 130, -105, -105, -104, + 888, 129, -104, -524, -110, -524, -524, -524, 130, -110, + -102, 951, -105, 129, -111, -524, -524, -104, -524, -524, + -524, -524, -524, -113, -102, 287, -115, -113, 285, -115, + -521, 837, 224, 225, 837, -117, -524, -521, -531, 232, + -117, 224, 225, -524, 223, -531, -524, -524, -524, -524, + -524, -524, -524, -524, -524, -524, -524, -524, -524, -524, + 108, 109, -524, -524, -524, 836, -524, -524, 836, 854, + -524, 285, -116, -524, -524, 855, -524, -116, -524, 226, + -524, -108, -524, -524, -524, -524, -524, -524, -524, 483, + -524, -102, -524, -619, -112, -620, -117, -114, 639, -112, + 639, -619, -114, 275, -620, -524, -524, -524, -524, 232, + -524, -301, -524, 337, 553, 287, 828, -524, -301, -301, + -301, -524, 235, -524, -301, -301, -102, -301, -111, -102, + 624, 235, -104, -111, -106, -535, 282, -113, 110, 111, + -115, 627, -113, 829, -102, -115, -117, -301, -301, 676, + -301, -301, -301, -301, -301, 108, 109, -530, 287, 641, + 640, 641, 640, 338, -530, 639, -117, 130, 799, 235, + 801, -116, 129, -112, 635, 634, -616, -100, -301, -301, + -301, -301, -301, -301, -301, -301, -301, -301, -301, -301, + -301, -301, -109, 401, -301, -301, -301, 230, 682, 588, + -114, 677, -301, 589, 229, -301, -112, -617, 628, 868, + -301, 581, -301, 227, -301, -301, -301, -301, -301, -301, + -301, 624, -301, -341, -301, 404, 641, 640, 637, -521, + -341, -536, 627, 110, 111, 553, -521, -301, -301, -341, + -106, -616, -301, -623, 922, -521, 710, 815, 407, -301, + -623, -623, -623, -301, 410, -115, -623, -623, -114, -623, + -524, 231, -532, -616, 427, 635, 634, -524, -623, -532, + 639, 255, -617, -101, 230, 432, -524, -107, 639, -623, + -623, 480, -623, -623, -623, -623, -623, -341, -110, -533, + 481, -529, -116, -521, -617, -526, -533, 639, -529, 628, + 482, -111, -526, 252, -111, -533, 737, 254, 253, 739, + -623, -623, -623, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -623, -623, -524, 484, -623, -623, -623, -534, + 683, 641, 640, 642, -623, 485, -534, -623, 231, 641, + 640, 647, -623, 639, -623, -534, -623, -623, -623, -623, + -623, -623, -623, -533, -623, -623, -623, 676, 641, 640, + 652, 234, 619, 514, 616, 615, 614, 624, 617, -623, + -623, 523, -104, -527, -623, 526, 230, -528, 627, 601, + -527, -623, -623, 546, -528, -623, 602, -113, 528, -623, + -623, -623, 544, -534, -623, -623, -623, 255, -623, -103, + 622, 272, 273, -80, 641, 640, 659, -623, -623, -623, + -623, 635, 634, 737, -112, -623, 739, 235, -623, -623, + 1049, -623, -623, -623, -623, -623, 130, 235, -292, 252, + 539, 129, 230, 254, 253, -292, 271, 270, 639, 556, + 231, 644, 130, 540, -292, 628, 547, 129, 481, -623, + -623, -623, -623, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -623, 224, 225, -623, -623, -623, -623, 830, + -623, 864, 868, -623, 677, -623, -623, -623, 292, -623, + -619, -623, 235, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -292, -623, -623, -623, 231, 282, 429, 641, + 640, 130, -623, 431, 430, 550, 129, 230, -623, -623, + -623, -623, 815, -623, 585, -623, -105, 130, 635, 634, + -623, -301, 129, 583, -623, 554, -113, 255, -301, -301, + -301, -114, -623, -301, -301, -301, 619, -301, 616, 615, + 614, 624, 617, 230, 864, 868, 130, -301, -301, -301, + 591, 129, 627, 235, -102, 581, 420, -301, -301, 593, + -301, -301, -301, -301, -301, 586, 587, 595, 646, -111, + 650, 231, 653, 656, 622, 605, 619, 663, 616, 615, + 614, -274, 617, 632, 631, 635, 634, 665, -301, -301, + -301, -301, -301, -301, -301, -301, -301, -301, -301, -301, + -301, -301, 666, 670, -301, -301, -301, 231, 831, -301, + 235, 674, -301, 675, 787, -301, -301, 282, -301, 628, + -301, 687, -301, 791, -301, -301, -301, -301, -301, -301, + -301, 255, -301, 255, -301, 619, 255, 616, 615, 614, + 624, 617, 133, 134, 135, 136, 137, -301, -301, -301, + -301, 627, -301, -301, -301, 255, 694, 235, 235, -301, + -301, -301, -301, -301, 427, -115, -301, -301, 235, -301, + 230, -302, -95, 622, 714, 235, 559, 669, -302, 725, + 730, -302, 632, 631, 635, 634, 667, -302, -302, -301, + -301, -301, -301, -301, -301, -301, -301, -302, -301, -301, + 733, 235, 235, -620, 741, 528, -301, -301, 744, 733, + 619, -620, 616, 615, 614, -301, 617, 733, 628, 581, + -301, -301, -301, -301, -301, -301, -301, -301, -301, -301, + -301, -301, -301, -301, 231, -302, -301, -301, -301, 733, + 682, 769, 775, 778, -301, -302, 779, -301, 787, 781, + 783, 255, -301, 785, -301, -301, -301, -301, -301, -301, + -301, -301, -301, -301, -301, 619, -301, 616, 615, 614, + 624, 617, 619, 794, 616, 615, 614, 795, 617, -301, + -301, 627, -301, 252, -301, -623, 796, 254, 253, 250, + 251, -301, -623, -623, -623, -301, 802, -115, -623, -623, + 803, -623, 230, 622, 133, 134, 135, 136, 137, 1033, + -623, -275, 632, 631, 635, 634, 230, 816, 593, 514, + 514, -623, -623, 1039, -623, -623, -623, -623, -623, 911, + 912, 230, 1037, 913, 124, 125, 235, 833, 1033, 275, + 619, 842, 616, 615, 614, 844, 617, 593, 628, 526, + 528, 725, -623, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -623, -623, -623, -623, 231, 235, -623, -623, + -623, 619, 683, 616, 615, 614, -623, 617, 787, -623, + 231, 282, 282, 255, -623, 725, -623, 791, -623, -623, + -623, -623, -623, -623, -623, 231, -623, -623, -623, 265, + 266, 1014, 255, 616, 615, 614, 868, 617, 733, 787, + 235, -623, -623, 235, -623, 252, -623, 258, 791, 254, + 253, 250, 251, -623, -434, 733, 235, -623, 906, -113, + 907, -434, -434, -434, 235, 916, -434, -434, -434, 619, + -434, 616, 615, 614, 624, 617, 255, -276, 235, -434, + -434, -434, 921, 938, 725, 627, -274, 943, 733, 733, + -434, -434, 733, -434, -434, -434, -434, -434, 619, 733, + 616, 615, 614, 733, 617, 235, 963, 622, 252, 235, + 778, 966, 254, 253, 250, 251, 632, 631, 635, 634, + 968, -434, -434, -434, -434, -434, -434, -434, -434, -434, + -434, -434, -434, -434, -434, 970, 787, -434, -434, -434, + 972, 972, -434, 235, 282, -434, 979, -277, -434, -434, + 980, -434, 628, -434, 778, -434, 983, -434, -434, -434, + -434, -434, -434, -434, 986, -434, -434, -434, 619, 988, + 616, 615, 614, 624, 617, 133, 134, 135, 136, 137, + -434, -434, 990, -434, 627, -434, -310, 133, 134, 135, + 136, 137, -434, -310, -310, -310, -434, 235, -310, -310, + -310, 992, -310, 255, 769, 619, 622, 616, 615, 614, + 1010, 617, -310, -310, 1011, 632, 631, 635, 634, 265, + 266, 1020, -310, -310, 1021, -310, -310, -310, -310, -310, + 1014, 1031, 616, 615, 614, 252, 617, 258, 1034, 254, + 253, 250, 251, 787, 854, 256, 1040, 257, 733, 1050, + 972, 628, 972, -310, -310, -310, -310, -310, -310, -310, + -310, -310, -310, -310, -310, -310, -310, 972, 778, -310, + -310, -310, 1057, 1059, -310, 1061, 292, -310, 1063, 1063, + -310, -310, 730, -310, 733, -310, 1021, -310, -620, -310, + -310, -310, -310, -310, -310, -310, -619, -310, 235, -310, + 619, 972, 616, 615, 614, 624, 617, 1084, 1063, 1063, + 1063, 1063, -310, -310, nil, -310, 627, -310, -293, nil, + nil, nil, nil, nil, -310, -293, -293, -293, -310, nil, + -293, -293, -293, nil, -293, 255, nil, nil, 622, nil, + nil, nil, nil, nil, -293, -293, -293, 632, 631, 635, + 634, 265, 266, nil, -293, -293, nil, -293, -293, -293, + -293, -293, nil, nil, nil, nil, nil, 252, nil, 258, + nil, 254, 253, 250, 251, nil, nil, 256, nil, 257, + nil, nil, nil, 628, nil, -293, -293, -293, -293, -293, + -293, -293, -293, -293, -293, -293, -293, -293, -293, nil, + nil, -293, -293, -293, nil, nil, -293, nil, nil, -293, + nil, nil, -293, -293, nil, -293, nil, -293, nil, -293, + nil, -293, -293, -293, -293, -293, -293, -293, nil, -293, + nil, -293, 619, nil, 616, 615, 614, 624, 617, nil, + nil, nil, nil, nil, -293, -293, -293, -293, 627, -293, + -645, -293, nil, nil, nil, nil, -293, -645, -645, -645, + -293, nil, -645, -645, -645, nil, -645, 255, nil, nil, + 622, nil, nil, nil, nil, -645, -645, -645, nil, 632, + 631, 635, 634, 265, 266, nil, -645, -645, nil, -645, + -645, -645, -645, -645, nil, nil, nil, nil, nil, 252, + nil, 258, nil, 254, 253, 250, 251, 235, nil, nil, + nil, nil, nil, nil, nil, 628, nil, -645, -645, -645, + -645, -645, -645, -645, -645, -645, -645, -645, -645, -645, + -645, nil, nil, -645, -645, -645, nil, nil, -645, nil, + 282, -645, nil, nil, -645, -645, nil, -645, nil, -645, + nil, -645, nil, -645, -645, -645, -645, -645, -645, -645, + nil, -645, -645, -645, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, -645, -645, nil, -645, + 627, -645, -624, nil, nil, nil, nil, nil, -645, -624, + -624, -624, -645, nil, -624, -624, -624, nil, -624, 255, + nil, nil, 622, nil, nil, nil, nil, -624, -624, -624, + -624, 632, 631, 635, 634, 265, 266, nil, -624, -624, + nil, -624, -624, -624, -624, -624, nil, nil, nil, nil, + nil, 252, nil, nil, nil, 254, 253, 250, 251, nil, + nil, nil, nil, nil, nil, nil, nil, 628, nil, -624, + -624, -624, -624, -624, -624, -624, -624, -624, -624, -624, + -624, -624, -624, nil, nil, -624, -624, -624, nil, nil, + -624, nil, nil, -624, nil, nil, -624, -624, nil, -624, + nil, -624, nil, -624, nil, -624, -624, -624, -624, -624, + -624, -624, nil, -624, -624, -624, 619, nil, 616, 615, + 614, 624, 617, nil, nil, nil, nil, nil, -624, -624, + -624, -624, 627, -624, -625, -624, nil, nil, nil, nil, + -624, -625, -625, -625, -624, nil, -625, -625, -625, nil, + -625, nil, nil, nil, 622, nil, nil, nil, nil, -625, + -625, -625, -625, nil, nil, 635, 634, nil, nil, nil, + -625, -625, nil, -625, -625, -625, -625, -625, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 628, + nil, -625, -625, -625, -625, -625, -625, -625, -625, -625, + -625, -625, -625, -625, -625, nil, nil, -625, -625, -625, + nil, nil, -625, nil, nil, -625, nil, nil, -625, -625, + nil, -625, nil, -625, nil, -625, nil, -625, -625, -625, + -625, -625, -625, -625, nil, -625, -625, -625, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + -625, -625, -625, -625, nil, -625, -645, -625, nil, nil, + nil, nil, -625, -645, -645, -645, -625, nil, -645, -645, + -645, nil, -645, nil, nil, nil, nil, nil, nil, nil, + nil, -645, -645, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -645, -645, nil, -645, -645, -645, -645, -645, + nil, nil, nil, nil, nil, nil, nil, 512, 464, nil, + nil, 513, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, nil, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, -645, nil, nil, 175, 176, 161, + 162, -645, nil, nil, nil, nil, 282, -645, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, -645, -645, + 177, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -645, nil, nil, nil, nil, -645, nil, nil, + 170, nil, nil, nil, -645, nil, nil, nil, -645, 8, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, 671, 11, 49, 10, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, -249, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, 671, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, 235, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, -646, -646, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, -646, -646, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 8, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 10, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, nil, nil, 263, 264, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, nil, 263, 264, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, 10, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 304, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 301, nil, 299, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 302, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 305, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 301, nil, 299, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, nil, nil, 324, nil, + 627, 320, nil, nil, 62, 63, nil, nil, 64, nil, + 319, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 328, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 334, nil, nil, + nil, nil, nil, 619, nil, 616, 615, 614, 624, 617, + nil, nil, nil, nil, nil, nil, nil, 324, nil, 627, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 622, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, 635, 634, nil, 96, 106, nil, nil, nil, + 336, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, 628, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, nil, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + 130, nil, nil, nil, nil, 129, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, 619, nil, 616, 615, 614, + 624, 617, nil, nil, nil, nil, nil, nil, nil, 364, + nil, 627, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 635, 634, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 628, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 369, 60, 114, 113, 370, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, 376, nil, nil, 371, nil, + 627, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 328, nil, nil, 122, + 121, 123, 369, 60, 114, 113, 370, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 334, nil, nil, + nil, nil, nil, 619, nil, 616, 615, 614, 624, 617, + nil, nil, nil, nil, nil, nil, nil, 371, nil, 627, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 622, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, 635, 634, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, 12, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, 628, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 49, 10, 13, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 43, nil, nil, 36, + nil, nil, 62, 63, nil, nil, 64, nil, 38, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, 420, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + 12, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 49, nil, 13, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 43, nil, nil, 36, nil, nil, 62, 63, nil, + nil, 64, nil, 38, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 437, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 437, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, 235, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 304, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, 301, + nil, 299, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 302, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 305, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 301, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, 235, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, 12, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 49, + nil, 13, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, 36, nil, nil, 62, 63, nil, nil, + 64, nil, 38, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, 619, nil, 616, 615, 614, + 624, 617, nil, nil, nil, nil, nil, nil, nil, 324, + nil, 627, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 635, 634, nil, 96, 106, nil, + nil, nil, 542, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 628, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, nil, nil, 324, nil, + 627, 320, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + 559, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 304, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 302, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 305, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 707, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, 313, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, 420, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 328, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 334, nil, nil, nil, nil, nil, 619, nil, + 616, 615, 614, 624, 617, nil, nil, nil, nil, nil, + nil, nil, 324, nil, 627, 320, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 622, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, 635, 634, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, 628, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 304, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 301, nil, 299, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 302, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 305, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 328, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 334, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 324, nil, nil, 320, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 301, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, 807, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, nil, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 304, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, 707, + nil, 299, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 302, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 305, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 324, + nil, nil, 320, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 324, nil, + nil, 320, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, 437, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 707, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, 873, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, 304, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, 299, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 302, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + 305, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 328, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 334, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 994, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1001, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + 1006, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 328, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 334, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 994, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 188, 199, 189, 212, 185, 205, 195, 194, 215, 216, + 210, 193, 192, 187, 213, 217, 218, 197, 186, 200, + 204, 206, 198, 191, nil, nil, nil, 207, 214, 209, + 208, 201, 211, 196, 184, 203, 202, nil, nil, nil, + nil, nil, 183, 190, 181, 182, 178, 179, 180, 141, + 143, 140, nil, 142, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, nil, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, 105, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 106, nil, nil, nil, nil, nil, nil, + nil, nil, 170, 188, 199, 189, 212, 185, 205, 195, + 194, 215, 216, 210, 193, 192, 187, 213, 217, 218, + 197, 186, 200, 204, 206, 198, 191, nil, nil, nil, + 207, 214, 209, 208, 201, 211, 196, 184, 203, 202, + nil, nil, nil, nil, nil, 183, 190, 181, 182, 178, + 179, 180, 141, 143, nil, nil, 142, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, nil, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, nil, 177, 105, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 106, nil, nil, nil, + nil, nil, nil, nil, nil, 170, 188, 199, 189, 212, + 185, 205, 195, 194, 215, 216, 210, 193, 192, 187, + 213, 217, 218, 197, 186, 200, 204, 206, 198, 191, + nil, nil, nil, 207, 214, 209, 387, 386, 388, 385, + 184, 203, 202, nil, nil, nil, nil, nil, 183, 190, + 181, 182, 382, 383, 384, 380, 143, 114, 113, 381, + nil, 116, nil, nil, nil, nil, nil, nil, 173, 174, + nil, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 392, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 188, + 199, 189, 212, 185, 205, 195, 194, 215, 216, 210, + 193, 192, 187, 213, 217, 218, 197, 186, 200, 204, + 206, 198, 191, nil, nil, nil, 207, 214, 209, 208, + 201, 211, 196, 184, 203, 202, nil, nil, nil, nil, + nil, 183, 190, 181, 182, 178, 179, 180, 141, 143, + 417, 416, 142, nil, 418, nil, nil, nil, nil, nil, + nil, 173, 174, nil, 169, 151, 152, 153, 160, 157, + 159, nil, nil, 154, 155, nil, nil, nil, 175, 176, + 161, 162, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 166, 165, nil, 150, 172, + 168, 167, 163, 164, 158, 156, 148, 171, 149, nil, + nil, 177, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 188, 199, 189, 212, 185, 205, 195, 194, + 215, 216, 210, 193, 192, 187, 213, 217, 218, 197, + 186, 200, 204, 206, 198, 191, nil, nil, nil, 207, + 214, 209, 208, 201, 211, 196, 184, 203, 202, nil, + nil, nil, nil, nil, 183, 190, 181, 182, 178, 179, + 180, 141, 143, nil, nil, 142, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, nil, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, 105, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 106, nil, nil, nil, nil, + nil, nil, nil, nil, 170, 188, 199, 189, 212, 185, + 205, 195, 194, 215, 216, 210, 193, 192, 187, 213, + 217, 218, 197, 186, 200, 204, 206, 198, 191, nil, + nil, nil, 207, 214, 209, 208, 201, 211, 196, 184, + 203, 202, nil, nil, nil, nil, nil, 183, 190, 181, + 182, 178, 179, 180, 141, 143, nil, nil, 142, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, nil, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, 105, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 106, nil, + nil, nil, nil, nil, nil, nil, nil, 170, 188, 199, + 189, 212, 185, 205, 195, 194, 215, 216, 210, 193, + 192, 187, 213, 217, 218, 197, 186, 200, 204, 206, + 198, 191, nil, nil, nil, 207, 214, 209, 208, 201, + 211, 196, 184, 203, 202, nil, nil, nil, nil, nil, + 183, 190, 181, 182, 178, 179, 180, 141, 143, nil, + nil, 142, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, nil, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 460, 464, nil, nil, 461, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 467, 471, nil, nil, 466, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 688, 464, nil, nil, 689, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 690, + 471, nil, nil, 691, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 718, 464, nil, + nil, 719, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 282, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 721, 471, nil, nil, 722, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 688, 464, nil, nil, 689, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 690, 471, nil, nil, 691, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 755, + 464, nil, nil, 756, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 757, 471, nil, + nil, 758, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 282, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 760, 471, nil, nil, 761, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 512, 464, nil, nil, 513, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 809, 464, nil, nil, 810, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 812, + 471, nil, nil, 811, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, 619, 177, 616, 615, 614, 624, 617, 619, nil, + 616, 615, 614, 624, 617, nil, nil, 627, nil, nil, + nil, nil, 170, nil, 627, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 622, + nil, nil, nil, nil, nil, nil, 622, nil, 632, 631, + 635, 634, nil, nil, nil, 632, 631, 635, 634, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1067, 471, nil, nil, + 1066, nil, nil, nil, 628, nil, nil, nil, nil, 173, + 174, 628, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, 282, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + nil, nil, nil, nil, 1070, 464, nil, nil, 1071, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, 170, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, 282, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, nil, nil, + nil, nil, 1072, 471, nil, nil, 1073, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, 170, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, 282, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, 619, 177, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 627, nil, nil, nil, nil, 170, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, nil, nil, nil, + nil, 632, 631, 635, 634, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 628 ] + +racc_action_check = [ + 112, 395, 353, 476, 476, 361, 713, 112, 112, 112, + 362, 354, 112, 112, 112, 718, 112, 365, 942, 17, + 17, 713, 947, 408, 112, 29, 112, 112, 112, 586, + 22, 998, 238, 411, 1, 239, 112, 112, 27, 112, + 112, 112, 112, 112, 755, 27, 565, 352, 352, 565, + 999, 92, 719, 756, 874, 773, 576, 721, 566, 92, + 3, 566, 395, 395, 395, 875, 22, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 1002, 718, 112, 112, 112, 408, 112, 112, 238, + 29, 112, 239, 476, 112, 112, 411, 112, 65, 112, + 13, 112, 27, 112, 112, 112, 112, 112, 112, 112, + 361, 112, 29, 112, 15, 362, 353, 718, 1040, 719, + 718, 353, 365, 721, 721, 354, 112, 112, 112, 112, + 354, 112, 942, 112, 586, 718, 947, 942, 112, 115, + 1070, 947, 112, 1071, 112, 998, 115, 115, 115, 755, + 998, 115, 115, 115, 719, 115, 576, 719, 756, 721, + 773, 576, 721, 115, 999, 115, 115, 115, 874, 999, + 875, 874, 719, 874, 1082, 115, 115, 721, 115, 115, + 115, 115, 115, 1072, 849, 65, 1073, 757, 697, 758, + 380, 695, 728, 728, 843, 1002, 381, 380, 382, 20, + 1002, 772, 772, 381, 16, 382, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 44, 44, 115, 115, 115, 695, 115, 115, 843, 729, + 115, 329, 1040, 115, 115, 729, 115, 1040, 115, 18, + 115, 20, 115, 115, 115, 115, 115, 115, 115, 241, + 115, 849, 115, 757, 1070, 758, 20, 1071, 648, 1070, + 651, 1072, 1071, 25, 1073, 115, 115, 115, 115, 444, + 115, 466, 115, 40, 482, 697, 688, 115, 466, 466, + 466, 115, 728, 115, 466, 466, 849, 466, 1082, 849, + 775, 772, 757, 1082, 758, 41, 329, 1072, 44, 44, + 1073, 775, 1072, 689, 849, 1073, 241, 466, 466, 809, + 466, 466, 466, 466, 466, 334, 334, 383, 329, 648, + 648, 651, 651, 43, 383, 530, 444, 5, 648, 49, + 651, 482, 5, 688, 775, 775, 369, 41, 466, 466, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 41, 99, 466, 466, 466, 19, 466, 371, + 689, 810, 466, 371, 19, 466, 809, 370, 775, 1007, + 466, 1007, 466, 19, 466, 466, 466, 466, 466, 466, + 466, 980, 466, 50, 466, 100, 530, 530, 530, 369, + 50, 42, 980, 334, 334, 338, 369, 466, 466, 50, + 466, 369, 466, 467, 832, 369, 530, 918, 101, 466, + 467, 467, 467, 466, 102, 466, 467, 467, 810, 467, + 370, 19, 384, 369, 138, 980, 980, 370, 467, 384, + 397, 488, 370, 42, 237, 219, 370, 338, 402, 467, + 467, 237, 467, 467, 467, 467, 467, 50, 42, 321, + 237, 385, 338, 369, 370, 386, 321, 405, 385, 980, + 240, 832, 386, 488, 918, 321, 570, 488, 488, 570, + 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, + 467, 467, 467, 467, 370, 242, 467, 467, 467, 322, + 467, 397, 397, 397, 467, 243, 322, 467, 237, 402, + 402, 402, 467, 413, 467, 322, 467, 467, 467, 467, + 467, 467, 467, 321, 467, 467, 467, 460, 405, 405, + 405, 247, 783, 281, 783, 783, 783, 783, 783, 467, + 467, 296, 467, 387, 467, 297, 323, 388, 783, 390, + 387, 467, 690, 323, 388, 467, 390, 467, 300, 690, + 690, 690, 323, 322, 690, 690, 690, 489, 690, 460, + 783, 47, 47, 314, 413, 413, 413, 690, 690, 690, + 690, 783, 783, 862, 460, 760, 862, 1012, 690, 690, + 1012, 690, 690, 690, 690, 690, 308, 316, 325, 489, + 317, 308, 340, 489, 489, 325, 47, 47, 399, 340, + 323, 399, 358, 318, 325, 783, 324, 358, 340, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 690, 690, 597, 597, 690, 690, 690, 760, 690, + 690, 743, 743, 690, 461, 760, 690, 690, 327, 690, + 760, 690, 328, 690, 760, 690, 690, 690, 690, 690, + 690, 690, 325, 690, 690, 690, 340, 333, 140, 399, + 399, 766, 760, 140, 140, 335, 766, 363, 690, 690, + 690, 690, 672, 690, 363, 690, 461, 879, 778, 778, + 690, 691, 879, 363, 690, 339, 690, 342, 691, 691, + 691, 461, 760, 691, 691, 691, 393, 691, 393, 393, + 393, 393, 393, 373, 1041, 1041, 884, 691, 691, 691, + 373, 884, 393, 348, 672, 359, 360, 691, 691, 373, + 691, 691, 691, 691, 691, 364, 366, 375, 401, 672, + 404, 363, 407, 410, 393, 393, 622, 433, 622, 622, + 622, 436, 622, 393, 393, 393, 393, 438, 691, 691, + 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, + 691, 691, 441, 445, 691, 691, 691, 373, 691, 691, + 455, 458, 691, 459, 622, 691, 691, 468, 691, 393, + 691, 478, 691, 622, 691, 691, 691, 691, 691, 691, + 691, 490, 691, 491, 691, 605, 492, 605, 605, 605, + 605, 605, 9, 9, 9, 9, 9, 691, 691, 691, + 691, 605, 691, 811, 691, 493, 509, 516, 520, 691, + 811, 811, 811, 691, 536, 691, 811, 811, 537, 811, + 443, 547, 538, 605, 541, 543, 548, 443, 547, 551, + 560, 589, 605, 605, 605, 605, 443, 547, 589, 811, + 811, 722, 811, 811, 811, 811, 811, 589, 722, 761, + 561, 562, 567, 722, 568, 571, 761, 722, 573, 577, + 907, 761, 907, 907, 907, 761, 907, 578, 605, 579, + 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 443, 547, 811, 811, 811, 580, + 811, 599, 607, 608, 811, 589, 610, 811, 907, 611, + 612, 503, 811, 621, 811, 722, 811, 811, 811, 811, + 811, 811, 811, 761, 811, 769, 811, 769, 769, 769, + 769, 769, 791, 629, 791, 791, 791, 633, 791, 811, + 811, 769, 811, 503, 811, 812, 636, 503, 503, 503, + 503, 811, 812, 812, 812, 811, 655, 811, 812, 812, + 658, 812, 993, 769, 312, 312, 312, 312, 312, 993, + 812, 664, 769, 769, 769, 769, 1000, 673, 993, 678, + 684, 812, 812, 1000, 812, 812, 812, 812, 812, 797, + 797, 1032, 1000, 797, 797, 797, 692, 693, 1032, 696, + 787, 700, 787, 787, 787, 702, 787, 1032, 769, 704, + 706, 715, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 993, 717, 812, 812, + 812, 906, 812, 906, 906, 906, 812, 906, 787, 812, + 1000, 720, 723, 494, 812, 724, 812, 787, 812, 812, + 812, 812, 812, 812, 812, 1032, 812, 812, 812, 494, + 494, 963, 727, 963, 963, 963, 745, 963, 751, 906, + 754, 812, 812, 763, 812, 494, 812, 494, 906, 494, + 494, 494, 494, 812, 30, 767, 774, 812, 789, 812, + 790, 30, 30, 30, 792, 804, 30, 30, 30, 770, + 30, 770, 770, 770, 770, 770, 504, 806, 808, 30, + 30, 30, 817, 841, 848, 770, 858, 859, 863, 869, + 30, 30, 876, 30, 30, 30, 30, 30, 1020, 878, + 1020, 1020, 1020, 882, 1020, 883, 890, 770, 504, 891, + 892, 896, 504, 504, 504, 504, 770, 770, 770, 770, + 897, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 899, 1020, 30, 30, 30, + 900, 902, 30, 905, 30, 30, 915, 917, 30, 30, + 924, 30, 770, 30, 925, 30, 927, 30, 30, 30, + 30, 30, 30, 30, 928, 30, 30, 30, 779, 929, + 779, 779, 779, 779, 779, 347, 347, 347, 347, 347, + 30, 30, 931, 30, 779, 30, 31, 535, 535, 535, + 535, 535, 30, 31, 31, 31, 30, 932, 31, 31, + 31, 933, 31, 508, 960, 1021, 779, 1021, 1021, 1021, + 961, 1021, 31, 31, 962, 779, 779, 779, 779, 508, + 508, 977, 31, 31, 978, 31, 31, 31, 31, 31, + 1049, 991, 1049, 1049, 1049, 508, 1049, 508, 994, 508, + 508, 508, 508, 1021, 996, 508, 1001, 508, 1008, 1016, + 1017, 779, 1018, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 1019, 1022, 31, + 31, 31, 1025, 1026, 31, 1027, 31, 31, 1028, 1030, + 31, 31, 1036, 31, 1047, 31, 1055, 31, 1066, 31, + 31, 31, 31, 31, 31, 31, 1067, 31, 1069, 31, + 781, 1077, 781, 781, 781, 781, 781, 1078, 1079, 1080, + 1081, 1089, 31, 31, nil, 31, 781, 31, 60, nil, + nil, nil, nil, nil, 31, 60, 60, 60, 31, nil, + 60, 60, 60, nil, 60, 557, nil, nil, 781, nil, + nil, nil, nil, nil, 60, 60, 60, 781, 781, 781, + 781, 557, 557, nil, 60, 60, nil, 60, 60, 60, + 60, 60, nil, nil, nil, nil, nil, 557, nil, 557, + nil, 557, 557, 557, 557, nil, nil, 557, nil, 557, + nil, nil, nil, 781, nil, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, nil, + nil, 60, 60, 60, nil, nil, 60, nil, nil, 60, + nil, nil, 60, 60, nil, 60, nil, 60, nil, 60, + nil, 60, 60, 60, 60, 60, 60, 60, nil, 60, + nil, 60, 836, nil, 836, 836, 836, 836, 836, nil, + nil, nil, nil, nil, 60, 60, 60, 60, 836, 60, + 462, 60, nil, nil, nil, nil, 60, 462, 462, 462, + 60, nil, 462, 462, 462, nil, 462, 495, nil, nil, + 836, nil, nil, nil, nil, 462, 462, 462, nil, 836, + 836, 836, 836, 495, 495, nil, 462, 462, nil, 462, + 462, 462, 462, 462, nil, nil, nil, nil, nil, 495, + nil, 495, nil, 495, 495, 495, 495, 836, nil, nil, + nil, nil, nil, nil, nil, 836, nil, 462, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, + 462, nil, nil, 462, 462, 462, nil, nil, 462, nil, + 462, 462, nil, nil, 462, 462, nil, 462, nil, 462, + nil, 462, nil, 462, 462, 462, 462, 462, 462, 462, + nil, 462, 462, 462, 966, nil, 966, 966, 966, 966, + 966, nil, nil, nil, nil, nil, 462, 462, nil, 462, + 966, 462, 471, nil, nil, nil, nil, nil, 462, 471, + 471, 471, 462, nil, 471, 471, 471, nil, 471, 496, + nil, nil, 966, nil, nil, nil, nil, 471, 471, 471, + 471, 966, 966, 966, 966, 496, 496, nil, 471, 471, + nil, 471, 471, 471, 471, 471, nil, nil, nil, nil, + nil, 496, nil, nil, nil, 496, 496, 496, 496, nil, + nil, nil, nil, nil, nil, nil, nil, 966, nil, 471, + 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 471, nil, nil, 471, 471, 471, nil, nil, + 471, nil, nil, 471, nil, nil, 471, 471, nil, 471, + nil, 471, nil, 471, nil, 471, 471, 471, 471, 471, + 471, 471, nil, 471, 471, 471, 968, nil, 968, 968, + 968, 968, 968, nil, nil, nil, nil, nil, 471, 471, + 471, 471, 968, 471, 472, 471, nil, nil, nil, nil, + 471, 472, 472, 472, 471, nil, 472, 472, 472, nil, + 472, nil, nil, nil, 968, nil, nil, nil, nil, 472, + 472, 472, 472, nil, nil, 968, 968, nil, nil, nil, + 472, 472, nil, 472, 472, 472, 472, 472, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 968, + nil, 472, 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, nil, nil, 472, 472, 472, + nil, nil, 472, nil, nil, 472, nil, nil, 472, 472, + nil, 472, nil, 472, nil, 472, nil, 472, 472, 472, + 472, 472, 472, 472, nil, 472, 472, 472, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 472, 472, 472, 472, nil, 472, 511, 472, nil, nil, + nil, nil, 472, 511, 511, 511, 472, nil, 511, 511, + 511, nil, 511, nil, nil, nil, nil, nil, nil, nil, + nil, 511, 511, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 511, 511, nil, 511, 511, 511, 511, 511, + nil, nil, nil, nil, nil, nil, nil, 278, 278, nil, + nil, 278, nil, nil, nil, nil, nil, nil, nil, nil, + 278, 278, nil, 278, 278, 278, 278, 278, 278, 278, + nil, nil, 278, 278, 511, nil, nil, 278, 278, 278, + 278, 511, nil, nil, nil, nil, 511, 511, nil, nil, + nil, nil, nil, nil, 278, 278, nil, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 511, 511, + 278, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 511, nil, nil, nil, nil, 511, nil, nil, + 278, nil, nil, nil, 511, nil, nil, nil, 511, 2, + 2, 2, 2, 2, 2, nil, nil, nil, 2, 2, + nil, nil, nil, 2, nil, 2, 2, 2, 2, 2, + 2, 2, nil, nil, nil, nil, nil, 2, 2, 2, + 2, 2, 2, 2, nil, nil, 2, nil, nil, nil, + nil, 448, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, nil, 2, 2, 2, nil, 2, + 2, nil, 2, 2, 2, 448, 448, 448, 448, 448, + 448, 448, 448, 448, 448, 448, nil, 448, 448, nil, + nil, 448, 448, nil, 2, nil, nil, 2, nil, nil, + 2, 2, nil, nil, 2, nil, 2, 448, nil, 448, + 2, 448, 448, 448, 448, 448, 448, 448, 2, 448, + nil, nil, nil, 2, 2, 2, 2, 2, 2, nil, + nil, nil, 2, 2, nil, 448, nil, 448, nil, nil, + 2, nil, nil, 2, 2, 2, nil, 2, 2, 36, + 36, 36, 36, 36, 36, nil, nil, nil, 36, 36, + nil, nil, nil, 36, nil, 36, 36, 36, 36, 36, + 36, 36, nil, nil, nil, nil, nil, 36, 36, 36, + 36, 36, 36, 36, nil, nil, 36, nil, nil, nil, + nil, 454, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, nil, 36, 36, 36, nil, 36, + 36, nil, 36, 36, 36, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, nil, 454, 454, nil, + nil, 454, 454, nil, 36, nil, nil, 36, nil, nil, + 36, 36, nil, nil, 36, nil, 36, 454, nil, 454, + 36, 454, 454, 454, 454, 454, 454, 454, 36, 454, + nil, nil, nil, 36, 36, 36, 36, 36, 36, nil, + nil, nil, 36, 36, nil, 454, nil, nil, nil, nil, + 36, nil, nil, 36, 36, 36, nil, 36, 36, 221, + 221, 221, 221, 221, 221, nil, nil, nil, 221, 221, + nil, nil, nil, 221, nil, 221, 221, 221, 221, 221, + 221, 221, nil, nil, nil, nil, nil, 221, 221, 221, + 221, 221, 221, 221, nil, nil, 221, nil, nil, nil, + nil, nil, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, nil, 221, 221, 221, nil, 221, + 221, nil, 221, 221, 221, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, nil, 24, 24, nil, + nil, 24, 24, nil, 221, nil, nil, 221, nil, nil, + 221, 221, nil, nil, 221, nil, 221, 24, nil, 24, + 221, 24, 24, 24, 24, 24, 24, 24, 221, 24, + nil, nil, nil, 221, 221, 221, 221, 221, 221, nil, + nil, nil, 221, 221, nil, 24, nil, nil, nil, nil, + 221, nil, nil, 221, 221, 221, nil, 221, 221, 246, + 246, 246, 246, 246, 246, nil, nil, nil, 246, 246, + nil, nil, nil, 246, nil, 246, 246, 246, 246, 246, + 246, 246, nil, nil, nil, nil, nil, 246, 246, 246, + 246, 246, 246, 246, nil, nil, 246, nil, nil, nil, + nil, nil, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, nil, 246, 246, 246, nil, 246, + 246, nil, 246, 246, 246, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, nil, 294, 294, nil, + nil, 294, 294, nil, 246, nil, nil, 246, nil, nil, + 246, 246, nil, nil, 246, nil, 246, 294, nil, 294, + 246, 294, 294, 294, 294, 294, 294, 294, 246, 294, + nil, nil, nil, 246, 246, 246, 246, 246, 246, nil, + nil, nil, 246, 246, nil, 294, nil, nil, nil, nil, + 246, nil, nil, 246, 246, 246, nil, 246, 246, 315, + 315, 315, 315, 315, 315, nil, nil, nil, 315, 315, + nil, nil, nil, 315, nil, 315, 315, 315, 315, 315, + 315, 315, nil, nil, nil, nil, nil, 315, 315, 315, + 315, 315, 315, 315, nil, nil, 315, nil, nil, nil, + nil, nil, 315, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 315, nil, 315, 315, 315, nil, 315, + 315, nil, 315, 315, 315, 507, 507, 507, 507, 507, + 507, 507, 507, 507, 507, 507, nil, 507, 507, nil, + nil, 507, 507, nil, 315, nil, nil, 315, nil, nil, + 315, 315, nil, nil, 315, nil, 315, 507, nil, 507, + 315, 507, 507, 507, 507, 507, 507, 507, 315, 507, + nil, nil, nil, 315, 315, 315, 315, 315, 315, nil, + nil, nil, 315, 315, 507, 507, nil, nil, nil, nil, + 315, nil, nil, 315, 315, 315, nil, 315, 315, 320, + 320, 320, 320, 320, 320, nil, nil, nil, 320, 320, + nil, nil, nil, 320, nil, 320, 320, 320, 320, 320, + 320, 320, nil, nil, nil, nil, nil, 320, 320, 320, + 320, 320, 320, 320, nil, nil, 320, nil, nil, nil, + nil, nil, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, nil, 320, 320, 320, nil, 320, + 320, nil, 320, 320, 320, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, nil, 558, 558, nil, + nil, 558, 558, nil, 320, nil, nil, 320, nil, nil, + 320, 320, nil, nil, 320, nil, 320, 558, nil, 558, + 320, 558, 558, 558, 558, 558, 558, 558, 320, 558, + nil, nil, nil, 320, 320, 320, 320, 320, 320, nil, + nil, nil, 320, 320, nil, 558, nil, nil, nil, nil, + 320, nil, nil, 320, 320, 320, nil, 320, 320, 346, + 346, 346, 346, 346, 346, nil, nil, nil, 346, 346, + nil, nil, nil, 346, nil, 346, 346, 346, 346, 346, + 346, 346, nil, nil, nil, nil, nil, 346, 346, 346, + 346, 346, 346, 346, nil, nil, 346, nil, nil, nil, + nil, nil, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, nil, 346, 346, 346, nil, 346, + 346, nil, 346, 346, 346, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, nil, 814, 814, nil, + nil, 814, 814, nil, 346, nil, nil, 346, nil, nil, + 346, 346, nil, nil, 346, nil, 346, 814, nil, 814, + 346, 814, 814, 814, 814, 814, 814, 814, 346, 814, + nil, nil, nil, 346, 346, 346, 346, 346, 346, nil, + nil, nil, 346, 346, nil, 814, nil, nil, nil, nil, + 346, nil, nil, 346, 346, 346, nil, 346, 346, 356, + 356, 356, 356, 356, 356, nil, nil, nil, 356, 356, + nil, nil, nil, 356, nil, 356, 356, 356, 356, 356, + 356, 356, nil, nil, nil, nil, nil, 356, 356, 356, + 356, 356, 356, 356, nil, nil, 356, nil, nil, nil, + nil, nil, 356, 356, 356, 356, 356, 356, 356, 356, + 356, 356, 356, 356, nil, 356, 356, 356, nil, 356, + 356, nil, 356, 356, 356, 923, 923, 923, 923, 923, + 923, 923, 923, 923, 923, 923, nil, 923, 923, nil, + nil, 923, 923, nil, 356, nil, nil, 356, nil, nil, + 356, 356, nil, nil, 356, nil, 356, 923, nil, 923, + 356, 923, 923, 923, 923, 923, 923, 923, 356, 923, + nil, nil, nil, 356, 356, 356, 356, 356, 356, nil, + nil, nil, 356, 356, nil, 923, nil, nil, nil, nil, + 356, nil, nil, 356, 356, 356, nil, 356, 356, 357, + 357, 357, 357, 357, 357, nil, nil, nil, 357, 357, + nil, nil, nil, 357, nil, 357, 357, 357, 357, 357, + 357, 357, nil, nil, nil, nil, nil, 357, 357, 357, + 357, 357, 357, 357, nil, nil, 357, nil, nil, nil, + nil, nil, 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, nil, 357, 357, 357, nil, 357, + 357, nil, 357, 357, 357, 486, 486, 486, 486, 486, + 486, 486, 486, 486, 486, 486, nil, 486, 486, nil, + nil, 486, 486, nil, 357, nil, nil, 357, nil, nil, + 357, 357, nil, nil, 357, nil, 357, 486, nil, 486, + 357, 486, 486, 486, 486, 486, 486, 486, 357, 486, + nil, nil, nil, 357, 357, 357, 357, 357, 357, nil, + nil, nil, 357, 357, nil, nil, nil, nil, nil, nil, + 357, nil, nil, 357, 357, 357, nil, 357, 357, 572, + 572, 572, 572, 572, 572, nil, nil, nil, 572, 572, + nil, nil, nil, 572, nil, 572, 572, 572, 572, 572, + 572, 572, nil, nil, nil, nil, nil, 572, 572, 572, + 572, 572, 572, 572, nil, nil, 572, nil, nil, nil, + nil, nil, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, nil, 572, 572, 572, nil, 572, + 572, nil, 572, 572, 572, 487, 487, 487, 487, 487, + 487, 487, 487, 487, 487, 487, nil, 487, 487, nil, + nil, 487, 487, nil, 572, nil, nil, 572, nil, nil, + 572, 572, nil, nil, 572, nil, 572, 487, nil, 487, + 572, 487, 487, 487, 487, 487, 487, 487, 572, 487, + nil, nil, nil, 572, 572, 572, 572, 572, 572, nil, + nil, nil, 572, 572, nil, nil, nil, nil, nil, nil, + 572, nil, nil, 572, 572, 572, nil, 572, 572, 575, + 575, 575, 575, 575, 575, nil, nil, nil, 575, 575, + nil, nil, nil, 575, nil, 575, 575, 575, 575, 575, + 575, 575, nil, nil, nil, nil, nil, 575, 575, 575, + 575, 575, 575, 575, nil, nil, 575, nil, nil, nil, + nil, nil, 575, 575, 575, 575, 575, 575, 575, 575, + 575, 575, 575, 575, nil, 575, 575, 575, nil, 575, + 575, nil, 575, 575, 575, 497, 497, 497, 497, 497, + 497, 497, nil, nil, 497, 497, nil, nil, nil, nil, + nil, 497, 497, nil, 575, nil, nil, 575, nil, nil, + 575, 575, nil, nil, 575, nil, 575, 497, nil, 497, + 575, 497, 497, 497, 497, 497, 497, 497, 575, 497, + nil, nil, nil, 575, 575, 575, 575, 575, 575, nil, + nil, nil, 575, 575, nil, nil, nil, nil, nil, nil, + 575, nil, nil, 575, 575, 575, nil, 575, 575, 598, + 598, 598, 598, 598, 598, nil, nil, nil, 598, 598, + nil, nil, nil, 598, nil, 598, 598, 598, 598, 598, + 598, 598, nil, nil, nil, nil, nil, 598, 598, 598, + 598, 598, 598, 598, nil, nil, 598, nil, nil, nil, + nil, nil, 598, 598, 598, 598, 598, 598, 598, 598, + 598, 598, 598, 598, nil, 598, 598, 598, nil, 598, + 598, nil, 598, 598, 598, 498, 498, 498, 498, 498, + 498, 498, nil, nil, 498, 498, nil, nil, nil, nil, + nil, 498, 498, nil, 598, nil, nil, 598, nil, nil, + 598, 598, nil, nil, 598, nil, 598, 498, nil, 498, + 598, 498, 498, 498, 498, 498, 498, 498, 598, 498, + nil, nil, nil, 598, 598, 598, 598, 598, 598, nil, + nil, nil, 598, 598, nil, nil, nil, nil, nil, nil, + 598, nil, nil, 598, 598, 598, nil, 598, 598, 660, + 660, 660, 660, 660, 660, nil, nil, nil, 660, 660, + nil, nil, nil, 660, nil, 660, 660, 660, 660, 660, + 660, 660, nil, nil, nil, nil, nil, 660, 660, 660, + 660, 660, 660, 660, nil, nil, 660, nil, nil, nil, + nil, nil, 660, 660, 660, 660, 660, 660, 660, 660, + 660, 660, 660, 660, nil, 660, 660, 660, nil, 660, + 660, nil, 660, 660, 660, 499, 499, 499, 499, 499, + 499, 499, nil, nil, 499, 499, nil, nil, nil, nil, + nil, 499, 499, nil, 660, nil, nil, 660, nil, nil, + 660, 660, nil, nil, 660, nil, 660, 499, nil, 499, + 660, 499, 499, 499, 499, 499, 499, 499, 660, 499, + nil, nil, nil, 660, 660, 660, 660, 660, 660, nil, + nil, nil, 660, 660, nil, nil, nil, nil, nil, nil, + 660, nil, nil, 660, 660, 660, nil, 660, 660, 759, + 759, 759, 759, 759, 759, nil, nil, nil, 759, 759, + nil, nil, nil, 759, nil, 759, 759, 759, 759, 759, + 759, 759, nil, nil, nil, nil, nil, 759, 759, 759, + 759, 759, 759, 759, nil, nil, 759, nil, nil, nil, + nil, nil, 759, 759, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 759, nil, 759, 759, 759, nil, 759, + 759, nil, 759, 759, 759, 500, 500, 500, 500, 500, + 500, 500, nil, nil, 500, 500, nil, nil, nil, nil, + nil, 500, 500, nil, 759, nil, nil, 759, nil, nil, + 759, 759, nil, nil, 759, nil, 759, 500, nil, 500, + 759, 500, 500, 500, 500, 500, 500, 500, 759, 500, + nil, nil, nil, 759, 759, 759, 759, 759, 759, nil, + nil, nil, 759, 759, nil, nil, nil, nil, nil, nil, + 759, nil, nil, 759, 759, 759, nil, 759, 759, 764, + 764, 764, 764, 764, 764, nil, nil, nil, 764, 764, + nil, nil, nil, 764, nil, 764, 764, 764, 764, 764, + 764, 764, nil, nil, nil, nil, nil, 764, 764, 764, + 764, 764, 764, 764, nil, nil, 764, nil, nil, nil, + nil, nil, 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, nil, 764, 764, 764, nil, 764, + 764, nil, 764, 764, 764, 501, 501, 501, 501, 501, + 501, 501, nil, nil, 501, 501, nil, nil, nil, nil, + nil, 501, 501, nil, 764, nil, nil, 764, nil, nil, + 764, 764, nil, nil, 764, nil, 764, 501, nil, 501, + 764, 501, 501, 501, 501, 501, 501, 501, 764, 501, + nil, nil, nil, 764, 764, 764, 764, 764, 764, nil, + nil, nil, 764, 764, nil, nil, nil, nil, nil, nil, + 764, nil, nil, 764, 764, 764, nil, 764, 764, 768, + 768, 768, 768, 768, 768, nil, nil, nil, 768, 768, + nil, nil, nil, 768, nil, 768, 768, 768, 768, 768, + 768, 768, nil, nil, nil, nil, nil, 768, 768, 768, + 768, 768, 768, 768, nil, nil, 768, nil, nil, nil, + nil, nil, 768, 768, 768, 768, 768, 768, 768, 768, + 768, 768, 768, 768, nil, 768, 768, 768, nil, 768, + 768, nil, 768, 768, 768, 502, 502, 502, 502, 502, + 502, 502, nil, nil, 502, 502, nil, nil, nil, nil, + nil, 502, 502, nil, 768, nil, nil, 768, nil, nil, + 768, 768, nil, nil, 768, nil, 768, 502, nil, 502, + 768, 502, 502, 502, 502, 502, 502, 502, 768, 502, + nil, nil, nil, 768, 768, 768, 768, 768, 768, nil, + nil, nil, 768, 768, nil, nil, nil, nil, nil, nil, + 768, nil, nil, 768, 768, 768, nil, 768, 768, 798, + 798, 798, 798, 798, 798, nil, nil, nil, 798, 798, + nil, nil, nil, 798, nil, 798, 798, 798, 798, 798, + 798, 798, nil, nil, nil, nil, nil, 798, 798, 798, + 798, 798, 798, 798, nil, nil, 798, nil, nil, nil, + nil, nil, 798, 798, 798, 798, 798, 798, 798, 798, + 798, 798, 798, 798, nil, 798, 798, 798, nil, 798, + 798, nil, 798, 798, 798, 505, 505, 505, 505, 505, + 505, 505, nil, nil, 505, 505, nil, nil, nil, nil, + nil, 505, 505, nil, 798, nil, nil, 798, nil, nil, + 798, 798, nil, nil, 798, nil, 798, 505, nil, 505, + 798, 505, 505, 505, 505, 505, 505, 505, 798, 505, + nil, nil, nil, 798, 798, 798, 798, 798, 798, nil, + nil, nil, 798, 798, nil, nil, nil, nil, nil, nil, + 798, nil, nil, 798, 798, 798, nil, 798, 798, 838, + 838, 838, 838, 838, 838, nil, nil, nil, 838, 838, + nil, nil, nil, 838, nil, 838, 838, 838, 838, 838, + 838, 838, nil, nil, nil, nil, nil, 838, 838, 838, + 838, 838, 838, 838, nil, nil, 838, nil, nil, nil, + nil, nil, 838, 838, 838, 838, 838, 838, 838, 838, + 838, 838, 838, 838, nil, 838, 838, 838, nil, 838, + 838, nil, 838, 838, 838, 506, 506, 506, 506, 506, + 506, 506, 506, nil, 506, 506, nil, nil, nil, nil, + nil, 506, 506, nil, 838, nil, nil, 838, nil, nil, + 838, 838, nil, nil, 838, nil, 838, 506, nil, 506, + 838, 506, 506, 506, 506, 506, 506, 506, 838, 506, + nil, nil, nil, 838, 838, 838, 838, 838, 838, nil, + nil, nil, 838, 838, nil, nil, nil, nil, nil, nil, + 838, nil, nil, 838, 838, 838, nil, 838, 838, 856, + 856, 856, 856, 856, 856, nil, nil, nil, 856, 856, + nil, nil, nil, 856, nil, 856, 856, 856, 856, 856, + 856, 856, nil, nil, nil, nil, nil, 856, 856, 856, + 856, 856, 856, 856, nil, nil, 856, nil, nil, nil, + nil, nil, 856, 856, 856, 856, 856, 856, 856, 856, + 856, 856, 856, 856, nil, 856, 856, 856, nil, 856, + 856, nil, 856, 856, 856, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 856, nil, nil, 856, nil, nil, + 856, 856, nil, nil, 856, nil, 856, nil, nil, nil, + 856, nil, nil, nil, nil, nil, nil, nil, 856, nil, + nil, nil, nil, 856, 856, 856, 856, 856, 856, nil, + nil, nil, 856, 856, nil, nil, nil, nil, nil, nil, + 856, nil, nil, 856, 856, 856, nil, 856, 856, 868, + 868, 868, 868, 868, 868, nil, nil, nil, 868, 868, + nil, nil, nil, 868, nil, 868, 868, 868, 868, 868, + 868, 868, nil, nil, nil, nil, nil, 868, 868, 868, + 868, 868, 868, 868, nil, nil, 868, nil, nil, nil, + nil, nil, 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, nil, 868, 868, 868, nil, 868, + 868, nil, 868, 868, 868, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 868, nil, nil, 868, nil, nil, + 868, 868, nil, nil, 868, nil, 868, nil, nil, nil, + 868, nil, nil, nil, nil, nil, nil, nil, 868, nil, + nil, nil, nil, 868, 868, 868, 868, 868, 868, nil, + nil, nil, 868, 868, nil, nil, nil, nil, nil, nil, + 868, nil, nil, 868, 868, 868, nil, 868, 868, 888, + 888, 888, 888, 888, 888, nil, nil, nil, 888, 888, + nil, nil, nil, 888, nil, 888, 888, 888, 888, 888, + 888, 888, nil, nil, nil, nil, nil, 888, 888, 888, + 888, 888, 888, 888, nil, nil, 888, nil, nil, nil, + nil, nil, 888, 888, 888, 888, 888, 888, 888, 888, + 888, 888, 888, 888, nil, 888, 888, 888, nil, 888, + 888, nil, 888, 888, 888, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 888, nil, nil, 888, nil, nil, + 888, 888, nil, nil, 888, nil, 888, nil, nil, nil, + 888, nil, nil, nil, nil, nil, nil, nil, 888, nil, + nil, nil, nil, 888, 888, 888, 888, 888, 888, nil, + nil, nil, 888, 888, nil, nil, nil, nil, nil, nil, + 888, nil, nil, 888, 888, 888, nil, 888, 888, 889, + 889, 889, 889, 889, 889, nil, nil, nil, 889, 889, + nil, nil, nil, 889, nil, 889, 889, 889, 889, 889, + 889, 889, nil, nil, nil, nil, nil, 889, 889, 889, + 889, 889, 889, 889, nil, nil, 889, nil, nil, nil, + nil, nil, 889, 889, 889, 889, 889, 889, 889, 889, + 889, 889, 889, 889, nil, 889, 889, 889, nil, 889, + 889, nil, 889, 889, 889, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 889, nil, nil, 889, nil, nil, + 889, 889, nil, nil, 889, nil, 889, nil, nil, nil, + 889, nil, nil, nil, nil, nil, nil, nil, 889, nil, + nil, nil, nil, 889, 889, 889, 889, 889, 889, nil, + nil, nil, 889, 889, nil, nil, nil, nil, nil, nil, + 889, nil, nil, 889, 889, 889, nil, 889, 889, 939, + 939, 939, 939, 939, 939, nil, nil, nil, 939, 939, + nil, nil, nil, 939, nil, 939, 939, 939, 939, 939, + 939, 939, nil, nil, nil, nil, nil, 939, 939, 939, + 939, 939, 939, 939, nil, nil, 939, nil, nil, nil, + nil, nil, 939, 939, 939, 939, 939, 939, 939, 939, + 939, 939, 939, 939, nil, 939, 939, 939, nil, 939, + 939, nil, 939, 939, 939, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 939, nil, nil, 939, nil, nil, + 939, 939, nil, nil, 939, nil, 939, nil, nil, nil, + 939, nil, nil, nil, nil, nil, nil, nil, 939, nil, + nil, nil, nil, 939, 939, 939, 939, 939, 939, nil, + nil, nil, 939, 939, nil, nil, nil, nil, nil, nil, + 939, nil, nil, 939, 939, 939, nil, 939, 939, 940, + 940, 940, 940, 940, 940, nil, nil, nil, 940, 940, + nil, nil, nil, 940, nil, 940, 940, 940, 940, 940, + 940, 940, nil, nil, nil, nil, nil, 940, 940, 940, + 940, 940, 940, 940, nil, nil, 940, nil, nil, nil, + nil, nil, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, nil, 940, 940, 940, nil, 940, + 940, nil, 940, 940, 940, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 940, nil, nil, 940, nil, nil, + 940, 940, nil, nil, 940, nil, 940, nil, nil, nil, + 940, nil, nil, nil, nil, nil, nil, nil, 940, nil, + nil, nil, nil, 940, 940, 940, 940, 940, 940, nil, + nil, nil, 940, 940, nil, nil, nil, nil, nil, nil, + 940, nil, nil, 940, 940, 940, nil, 940, 940, 952, + 952, 952, 952, 952, 952, nil, nil, nil, 952, 952, + nil, nil, nil, 952, nil, 952, 952, 952, 952, 952, + 952, 952, nil, nil, nil, nil, nil, 952, 952, 952, + 952, 952, 952, 952, nil, nil, 952, nil, nil, nil, + nil, nil, 952, 952, 952, 952, 952, 952, 952, 952, + 952, 952, 952, 952, nil, 952, 952, 952, nil, 952, + 952, nil, 952, 952, 952, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 952, nil, nil, 952, nil, nil, + 952, 952, nil, nil, 952, nil, 952, nil, nil, nil, + 952, nil, nil, nil, nil, nil, nil, nil, 952, nil, + nil, nil, nil, 952, 952, 952, 952, 952, 952, nil, + nil, nil, 952, 952, nil, nil, nil, nil, nil, nil, + 952, nil, nil, 952, 952, 952, nil, 952, 952, 956, + 956, 956, 956, 956, 956, nil, nil, nil, 956, 956, + nil, nil, nil, 956, nil, 956, 956, 956, 956, 956, + 956, 956, nil, nil, nil, nil, nil, 956, 956, 956, + 956, 956, 956, 956, nil, nil, 956, nil, nil, nil, + nil, nil, 956, 956, 956, 956, 956, 956, 956, 956, + 956, 956, 956, 956, nil, 956, 956, 956, nil, 956, + 956, nil, 956, 956, 956, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 956, nil, nil, 956, nil, nil, + 956, 956, nil, nil, 956, nil, 956, nil, nil, nil, + 956, nil, nil, nil, nil, nil, nil, nil, 956, nil, + nil, nil, nil, 956, 956, 956, 956, 956, 956, nil, + nil, nil, 956, 956, nil, nil, nil, nil, nil, nil, + 956, nil, nil, 956, 956, 956, nil, 956, 956, 997, + 997, 997, 997, 997, 997, nil, nil, nil, 997, 997, + nil, nil, nil, 997, nil, 997, 997, 997, 997, 997, + 997, 997, nil, nil, nil, nil, nil, 997, 997, 997, + 997, 997, 997, 997, nil, nil, 997, nil, nil, nil, + nil, nil, 997, 997, 997, 997, 997, 997, 997, 997, + 997, 997, 997, 997, nil, 997, 997, 997, nil, 997, + 997, nil, 997, 997, 997, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 997, nil, nil, 997, nil, nil, + 997, 997, nil, nil, 997, nil, 997, nil, nil, nil, + 997, nil, nil, nil, nil, nil, nil, nil, 997, nil, + nil, nil, nil, 997, 997, 997, 997, 997, 997, nil, + nil, nil, 997, 997, nil, nil, nil, nil, nil, nil, + 997, nil, nil, 997, 997, 997, nil, 997, 997, 1004, + 1004, 1004, 1004, 1004, 1004, nil, nil, nil, 1004, 1004, + nil, nil, nil, 1004, nil, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, nil, nil, nil, nil, nil, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, nil, nil, 1004, nil, nil, nil, + nil, nil, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, nil, 1004, 1004, 1004, nil, 1004, + 1004, nil, 1004, 1004, 1004, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1004, nil, nil, 1004, nil, nil, + 1004, 1004, nil, nil, 1004, nil, 1004, nil, nil, nil, + 1004, nil, nil, nil, nil, nil, nil, nil, 1004, nil, + nil, nil, nil, 1004, 1004, 1004, 1004, 1004, 1004, nil, + nil, nil, 1004, 1004, nil, nil, nil, nil, nil, nil, + 1004, nil, nil, 1004, 1004, 1004, nil, 1004, 1004, 1009, + 1009, 1009, 1009, 1009, 1009, nil, nil, nil, 1009, 1009, + nil, nil, nil, 1009, nil, 1009, 1009, 1009, 1009, 1009, + 1009, 1009, nil, nil, nil, nil, nil, 1009, 1009, 1009, + 1009, 1009, 1009, 1009, nil, nil, 1009, nil, nil, nil, + nil, nil, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, + 1009, 1009, 1009, 1009, nil, 1009, 1009, 1009, nil, 1009, + 1009, nil, 1009, 1009, 1009, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1009, nil, nil, 1009, nil, nil, + 1009, 1009, nil, nil, 1009, nil, 1009, nil, nil, nil, + 1009, nil, nil, nil, nil, nil, nil, nil, 1009, nil, + nil, nil, nil, 1009, 1009, 1009, 1009, 1009, 1009, nil, + nil, nil, 1009, 1009, nil, nil, nil, nil, nil, nil, + 1009, nil, nil, 1009, 1009, 1009, nil, 1009, 1009, 8, + 8, 8, 8, 8, nil, nil, nil, 8, 8, nil, + nil, nil, 8, nil, 8, 8, 8, 8, 8, 8, + 8, nil, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, 8, nil, nil, 8, nil, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, nil, 8, 8, 8, nil, 8, 8, + nil, 8, 8, 8, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 8, nil, nil, 8, nil, nil, 8, + 8, nil, nil, 8, nil, 8, nil, nil, nil, 8, + nil, nil, nil, nil, nil, nil, nil, 8, nil, nil, + nil, nil, 8, 8, 8, 8, 8, 8, nil, nil, + nil, 8, 8, nil, nil, nil, nil, nil, nil, 8, + nil, nil, 8, 8, 8, nil, 8, 8, 23, 23, + 23, nil, 23, nil, nil, nil, 23, 23, nil, nil, + nil, 23, nil, 23, 23, 23, 23, 23, 23, 23, + nil, nil, nil, nil, nil, 23, 23, 23, 23, 23, + 23, 23, nil, nil, 23, nil, nil, nil, nil, nil, + nil, 23, nil, nil, 23, 23, 23, 23, 23, 23, + 23, 23, nil, 23, 23, 23, nil, 23, 23, nil, + 23, 23, 23, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, 23, nil, nil, 23, 23, + nil, nil, 23, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 23, 23, 23, 23, 23, 23, nil, nil, nil, + 23, 23, nil, nil, nil, nil, nil, nil, 23, nil, + nil, 23, 23, 23, nil, 23, 23, 32, 32, 32, + nil, 32, nil, nil, nil, 32, 32, nil, nil, nil, + 32, nil, 32, 32, 32, 32, 32, 32, 32, nil, + nil, nil, nil, nil, 32, 32, 32, 32, 32, 32, + 32, nil, nil, 32, nil, nil, nil, nil, nil, nil, + 32, nil, nil, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, nil, 32, 32, nil, 32, + 32, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 32, nil, nil, 32, nil, nil, 32, 32, nil, + nil, 32, nil, 32, nil, 32, nil, 32, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + 32, 32, 32, 32, 32, 32, nil, nil, nil, 32, + 32, nil, nil, nil, nil, nil, nil, 32, nil, 32, + 32, 32, 32, nil, 32, 32, 33, 33, 33, nil, + 33, nil, nil, nil, 33, 33, nil, nil, nil, 33, + nil, 33, 33, 33, 33, 33, 33, 33, nil, nil, + nil, nil, nil, 33, 33, 33, 33, 33, 33, 33, + nil, nil, 33, nil, nil, nil, nil, nil, nil, 33, + nil, nil, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, nil, 33, 33, nil, 33, 33, + 33, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 33, nil, nil, 33, nil, nil, 33, 33, nil, nil, + 33, nil, 33, nil, 33, nil, 33, nil, nil, nil, + nil, nil, nil, nil, 33, nil, nil, nil, nil, 33, + 33, 33, 33, 33, 33, nil, nil, nil, 33, 33, + nil, nil, nil, nil, nil, nil, 33, nil, 33, 33, + 33, 33, nil, 33, 33, 34, 34, 34, nil, 34, + nil, nil, nil, 34, 34, nil, nil, nil, 34, nil, + 34, 34, 34, 34, 34, 34, 34, nil, nil, nil, + nil, nil, 34, 34, 34, 34, 34, 34, 34, nil, + nil, 34, nil, nil, nil, nil, nil, nil, 34, nil, + nil, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, nil, 34, 34, nil, 34, 34, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, 34, nil, nil, 34, 34, nil, nil, 34, + nil, 34, nil, 34, nil, 34, nil, nil, nil, nil, + nil, nil, nil, 34, nil, nil, nil, nil, 34, 34, + 34, 34, 34, 34, nil, nil, nil, 34, 34, nil, + nil, nil, nil, nil, nil, 34, nil, 34, 34, 34, + 34, nil, 34, 34, 37, 37, 37, nil, 37, nil, + nil, nil, 37, 37, nil, nil, nil, 37, nil, 37, + 37, 37, 37, 37, 37, 37, nil, nil, nil, nil, + nil, 37, 37, 37, 37, 37, 37, 37, nil, nil, + 37, nil, nil, nil, nil, nil, nil, 37, nil, nil, + 37, 37, 37, 37, 37, 37, 37, 37, nil, 37, + 37, 37, nil, 37, 37, nil, nil, nil, 37, nil, + nil, nil, nil, nil, 970, nil, 970, 970, 970, 970, + 970, nil, nil, nil, nil, nil, nil, nil, 37, nil, + 970, 37, nil, nil, 37, 37, nil, nil, 37, nil, + 37, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 970, nil, nil, nil, nil, 37, 37, 37, + 37, 37, 37, 970, 970, nil, 37, 37, nil, nil, + nil, nil, nil, nil, 37, nil, nil, 37, 37, 37, + nil, 37, 37, 38, 38, 38, nil, 38, nil, nil, + nil, 38, 38, nil, nil, nil, 38, 970, 38, 38, + 38, 38, 38, 38, 38, nil, nil, nil, nil, nil, + 38, 38, 38, 38, 38, 38, 38, nil, nil, 38, + nil, nil, nil, nil, nil, nil, 38, nil, nil, 38, + 38, 38, 38, 38, 38, 38, 38, nil, 38, 38, + 38, nil, 38, 38, nil, nil, nil, 38, nil, nil, + nil, nil, nil, 972, nil, 972, 972, 972, 972, 972, + nil, nil, nil, nil, nil, nil, nil, 38, nil, 972, + 38, nil, nil, 38, 38, nil, nil, 38, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 972, nil, nil, nil, nil, 38, 38, 38, 38, + 38, 38, 972, 972, nil, 38, 38, nil, nil, nil, + 38, nil, nil, 38, nil, nil, 38, 38, 38, nil, + 38, 38, 45, 45, 45, nil, 45, nil, nil, nil, + 45, 45, nil, nil, nil, 45, 972, 45, 45, 45, + 45, 45, 45, 45, nil, nil, nil, nil, nil, 45, + 45, 45, 45, 45, 45, 45, nil, nil, 45, nil, + nil, nil, nil, nil, nil, 45, nil, nil, 45, 45, + 45, 45, 45, 45, 45, 45, nil, 45, 45, 45, + nil, 45, 45, nil, 45, 45, 45, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 45, nil, nil, 45, + nil, nil, 45, 45, nil, nil, 45, nil, nil, nil, + nil, nil, 45, nil, nil, nil, nil, nil, nil, nil, + 45, nil, nil, nil, nil, 45, 45, 45, 45, 45, + 45, nil, nil, nil, 45, 45, nil, nil, nil, nil, + nil, nil, 45, nil, nil, 45, 45, 45, nil, 45, + 45, 46, 46, 46, nil, 46, nil, nil, nil, 46, + 46, nil, nil, nil, 46, nil, 46, 46, 46, 46, + 46, 46, 46, nil, nil, nil, nil, nil, 46, 46, + 46, 46, 46, 46, 46, nil, nil, 46, nil, nil, + nil, nil, nil, nil, 46, nil, nil, 46, 46, 46, + 46, 46, 46, 46, 46, nil, 46, 46, 46, nil, + 46, 46, nil, 46, 46, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 46, nil, nil, 46, nil, + nil, 46, 46, nil, nil, 46, nil, nil, nil, nil, + nil, 46, nil, nil, nil, nil, nil, nil, nil, 46, + nil, nil, nil, nil, 46, 46, 46, 46, 46, 46, + nil, nil, nil, 46, 46, nil, nil, nil, nil, nil, + nil, 46, nil, nil, 46, 46, 46, nil, 46, 46, + 48, 48, 48, nil, 48, nil, nil, nil, 48, 48, + nil, nil, nil, 48, nil, 48, 48, 48, 48, 48, + 48, 48, nil, nil, nil, nil, nil, 48, 48, 48, + 48, 48, 48, 48, nil, nil, 48, nil, nil, nil, + nil, nil, nil, 48, nil, nil, 48, 48, 48, 48, + 48, 48, 48, 48, nil, 48, 48, 48, nil, 48, + 48, nil, 48, 48, 48, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 48, nil, nil, 48, nil, nil, + 48, 48, nil, nil, 48, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, 48, 48, 48, 48, 48, 48, nil, + nil, nil, 48, 48, nil, nil, nil, nil, nil, nil, + 48, nil, nil, 48, 48, 48, nil, 48, 48, 62, + 62, 62, 62, 62, nil, nil, nil, 62, 62, nil, + nil, nil, 62, nil, 62, 62, 62, 62, 62, 62, + 62, nil, nil, nil, nil, nil, 62, 62, 62, 62, + 62, 62, 62, nil, nil, 62, nil, nil, nil, nil, + nil, 62, 62, nil, 62, 62, 62, 62, 62, 62, + 62, 62, 62, nil, 62, 62, 62, nil, 62, 62, + nil, 62, 62, 62, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 62, nil, nil, 62, nil, nil, 62, + 62, nil, nil, 62, nil, 62, nil, nil, nil, 62, + nil, nil, nil, nil, nil, nil, nil, 62, nil, nil, + nil, nil, 62, 62, 62, 62, 62, 62, nil, nil, + nil, 62, 62, nil, nil, nil, nil, nil, nil, 62, + nil, nil, 62, 62, 62, nil, 62, 62, 67, 67, + 67, nil, 67, nil, nil, nil, 67, 67, nil, nil, + nil, 67, nil, 67, 67, 67, 67, 67, 67, 67, + nil, nil, nil, nil, nil, 67, 67, 67, 67, 67, + 67, 67, nil, nil, 67, nil, nil, nil, nil, nil, + nil, 67, nil, nil, 67, 67, 67, 67, 67, 67, + 67, 67, nil, 67, 67, 67, nil, 67, 67, nil, + 67, 67, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, 67, nil, nil, 67, 67, + nil, nil, 67, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, 67, 67, 67, 67, 67, 67, nil, nil, nil, + 67, 67, nil, nil, nil, nil, nil, nil, 67, nil, + nil, 67, 67, 67, nil, 67, 67, 68, 68, 68, + nil, 68, nil, nil, nil, 68, 68, nil, nil, nil, + 68, nil, 68, 68, 68, 68, 68, 68, 68, nil, + nil, nil, nil, nil, 68, 68, 68, 68, 68, 68, + 68, nil, nil, 68, nil, nil, nil, nil, nil, nil, + 68, nil, nil, 68, 68, 68, 68, 68, 68, 68, + 68, nil, 68, 68, 68, nil, 68, 68, nil, 68, + 68, 68, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 68, nil, nil, 68, nil, nil, 68, 68, nil, + nil, 68, nil, nil, nil, nil, nil, 68, nil, nil, + nil, nil, nil, nil, nil, 68, nil, nil, nil, nil, + 68, 68, 68, 68, 68, 68, nil, nil, nil, 68, + 68, nil, nil, nil, nil, nil, nil, 68, nil, nil, + 68, 68, 68, nil, 68, 68, 71, 71, 71, nil, + 71, nil, nil, nil, 71, 71, nil, nil, nil, 71, + nil, 71, 71, 71, 71, 71, 71, 71, nil, nil, + nil, nil, nil, 71, 71, 71, 71, 71, 71, 71, + nil, nil, 71, nil, nil, nil, nil, nil, nil, 71, + nil, nil, 71, 71, 71, 71, 71, 71, 71, 71, + nil, 71, 71, 71, nil, 71, 71, nil, 71, 71, + 71, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 71, nil, nil, 71, nil, nil, 71, 71, nil, nil, + 71, nil, nil, nil, nil, nil, 71, nil, nil, nil, + nil, nil, nil, nil, 71, nil, nil, nil, nil, 71, + 71, 71, 71, 71, 71, nil, nil, nil, 71, 71, + 71, nil, nil, nil, nil, 71, 71, nil, nil, 71, + 71, 71, nil, 71, 71, 72, 72, 72, nil, 72, + nil, nil, nil, 72, 72, nil, nil, nil, 72, nil, + 72, 72, 72, 72, 72, 72, 72, nil, nil, nil, + nil, nil, 72, 72, 72, 72, 72, 72, 72, nil, + nil, 72, nil, nil, nil, nil, nil, nil, 72, nil, + nil, 72, 72, 72, 72, 72, 72, 72, 72, nil, + 72, 72, 72, nil, 72, 72, nil, nil, nil, 72, + nil, nil, nil, nil, nil, 988, nil, 988, 988, 988, + 988, 988, nil, nil, nil, nil, nil, nil, nil, 72, + nil, 988, 72, nil, nil, 72, 72, nil, nil, 72, + nil, 72, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 988, nil, nil, nil, nil, 72, 72, + 72, 72, 72, 72, 988, 988, nil, 72, 72, nil, + nil, nil, nil, nil, nil, 72, nil, nil, 72, 72, + 72, nil, 72, 72, 73, 73, 73, nil, 73, nil, + nil, nil, 73, 73, nil, nil, nil, 73, 988, 73, + 73, 73, 73, 73, 73, 73, nil, nil, nil, nil, + nil, 73, 73, 73, 73, 73, 73, 73, nil, nil, + 73, nil, nil, nil, nil, nil, nil, 73, nil, nil, + 73, 73, 73, 73, 73, 73, 73, 73, nil, 73, + 73, 73, nil, 73, 73, nil, nil, nil, 73, nil, + nil, nil, nil, nil, 1050, nil, 1050, 1050, 1050, 1050, + 1050, nil, nil, nil, nil, 73, nil, nil, 73, nil, + 1050, 73, nil, nil, 73, 73, nil, nil, 73, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1050, nil, nil, nil, nil, 73, 73, 73, + 73, 73, 73, 1050, 1050, nil, 73, 73, nil, nil, + nil, nil, nil, nil, 73, nil, nil, 73, 73, 73, + nil, 73, 73, 74, 74, 74, nil, 74, nil, nil, + nil, 74, 74, nil, nil, nil, 74, 1050, 74, 74, + 74, 74, 74, 74, 74, nil, nil, nil, nil, nil, + 74, 74, 74, 74, 74, 74, 74, nil, nil, 74, + nil, nil, nil, nil, nil, nil, 74, nil, nil, 74, + 74, 74, 74, 74, 74, 74, 74, nil, 74, 74, + 74, nil, 74, 74, nil, nil, nil, 74, nil, nil, + nil, nil, nil, 1059, nil, 1059, 1059, 1059, 1059, 1059, + nil, nil, nil, nil, nil, nil, nil, 74, nil, 1059, + 74, nil, nil, 74, 74, nil, nil, 74, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1059, nil, nil, nil, nil, 74, 74, 74, 74, + 74, 74, 1059, 1059, nil, 74, 74, nil, nil, nil, + nil, nil, nil, 74, nil, nil, 74, 74, 74, nil, + 74, 74, 128, 128, 128, 128, 128, nil, nil, nil, + 128, 128, nil, nil, nil, 128, 1059, 128, 128, 128, + 128, 128, 128, 128, nil, nil, nil, nil, nil, 128, + 128, 128, 128, 128, 128, 128, nil, nil, 128, nil, + nil, nil, nil, nil, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, nil, 128, 128, 128, + nil, 128, 128, nil, 128, 128, 128, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 128, nil, nil, 128, + nil, nil, 128, 128, nil, nil, 128, nil, 128, nil, + nil, nil, 128, nil, nil, nil, nil, nil, nil, nil, + 128, nil, nil, nil, nil, 128, 128, 128, 128, 128, + 128, nil, nil, nil, 128, 128, nil, nil, nil, nil, + nil, 128, 128, nil, nil, 128, 128, 128, nil, 128, + 128, 133, 133, 133, nil, 133, nil, nil, nil, 133, + 133, nil, nil, nil, 133, nil, 133, 133, 133, 133, + 133, 133, 133, nil, nil, nil, nil, nil, 133, 133, + 133, 133, 133, 133, 133, nil, nil, 133, nil, nil, + nil, nil, nil, nil, 133, nil, nil, 133, 133, 133, + 133, 133, 133, 133, 133, nil, 133, 133, 133, nil, + 133, 133, nil, 133, 133, 133, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 133, nil, nil, 133, nil, + nil, 133, 133, nil, nil, 133, nil, nil, nil, nil, + nil, 133, nil, nil, nil, nil, nil, nil, nil, 133, + nil, nil, nil, nil, 133, 133, 133, 133, 133, 133, + nil, nil, nil, 133, 133, nil, nil, nil, nil, nil, + nil, 133, nil, nil, 133, 133, 133, nil, 133, 133, + 134, 134, 134, nil, 134, nil, nil, nil, 134, 134, + nil, nil, nil, 134, nil, 134, 134, 134, 134, 134, + 134, 134, nil, nil, nil, nil, nil, 134, 134, 134, + 134, 134, 134, 134, nil, nil, 134, nil, nil, nil, + nil, nil, nil, 134, nil, nil, 134, 134, 134, 134, + 134, 134, 134, 134, nil, 134, 134, 134, nil, 134, + 134, nil, 134, 134, 134, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 134, nil, nil, 134, nil, nil, + 134, 134, nil, nil, 134, nil, nil, nil, nil, nil, + 134, nil, nil, nil, nil, nil, nil, nil, 134, nil, + nil, nil, nil, 134, 134, 134, 134, 134, 134, nil, + nil, nil, 134, 134, nil, nil, nil, nil, nil, nil, + 134, nil, nil, 134, 134, 134, nil, 134, 134, 135, + 135, 135, nil, 135, nil, nil, nil, 135, 135, nil, + nil, nil, 135, nil, 135, 135, 135, 135, 135, 135, + 135, nil, nil, nil, nil, nil, 135, 135, 135, 135, + 135, 135, 135, nil, nil, 135, nil, nil, nil, nil, + nil, nil, 135, nil, nil, 135, 135, 135, 135, 135, + 135, 135, 135, nil, 135, 135, 135, nil, 135, 135, + nil, 135, 135, 135, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 135, nil, nil, 135, nil, nil, 135, + 135, nil, nil, 135, nil, nil, nil, nil, nil, 135, + nil, nil, nil, nil, nil, nil, nil, 135, nil, nil, + nil, nil, 135, 135, 135, 135, 135, 135, nil, nil, + nil, 135, 135, nil, nil, nil, nil, nil, nil, 135, + nil, nil, 135, 135, 135, nil, 135, 135, 136, 136, + 136, nil, 136, nil, nil, nil, 136, 136, nil, nil, + nil, 136, nil, 136, 136, 136, 136, 136, 136, 136, + nil, nil, nil, nil, nil, 136, 136, 136, 136, 136, + 136, 136, nil, nil, 136, nil, nil, nil, nil, nil, + nil, 136, nil, nil, 136, 136, 136, 136, 136, 136, + 136, 136, nil, 136, 136, 136, nil, 136, 136, nil, + 136, 136, 136, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 136, nil, nil, 136, nil, nil, 136, 136, + nil, nil, 136, nil, nil, nil, nil, nil, 136, nil, + nil, nil, nil, nil, nil, nil, 136, nil, nil, nil, + nil, 136, 136, 136, 136, 136, 136, nil, nil, nil, + 136, 136, nil, nil, nil, nil, nil, nil, 136, nil, + nil, 136, 136, 136, nil, 136, 136, 137, 137, 137, + 137, 137, nil, nil, nil, 137, 137, nil, nil, nil, + 137, nil, 137, 137, 137, 137, 137, 137, 137, nil, + nil, nil, nil, nil, 137, 137, 137, 137, 137, 137, + 137, nil, nil, 137, nil, nil, nil, nil, nil, 137, + 137, nil, 137, 137, 137, 137, 137, 137, 137, 137, + 137, nil, 137, 137, 137, nil, 137, 137, nil, 137, + 137, 137, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 137, nil, nil, 137, nil, nil, 137, 137, nil, + nil, 137, nil, 137, nil, nil, nil, 137, nil, nil, + nil, nil, nil, nil, nil, 137, nil, nil, nil, nil, + 137, 137, 137, 137, 137, 137, nil, nil, nil, 137, + 137, nil, nil, nil, nil, nil, nil, 137, nil, nil, + 137, 137, 137, nil, 137, 137, 222, 222, 222, nil, + 222, nil, nil, nil, 222, 222, nil, nil, nil, 222, + nil, 222, 222, 222, 222, 222, 222, 222, nil, nil, + nil, nil, nil, 222, 222, 222, 222, 222, 222, 222, + nil, nil, 222, nil, nil, nil, nil, nil, nil, 222, + nil, nil, 222, 222, 222, 222, 222, 222, 222, 222, + nil, 222, 222, 222, nil, 222, 222, nil, 222, 222, + 222, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 222, nil, nil, 222, nil, nil, 222, 222, nil, nil, + 222, nil, 222, nil, nil, nil, 222, nil, nil, nil, + nil, nil, nil, nil, 222, nil, nil, nil, nil, 222, + 222, 222, 222, 222, 222, nil, nil, nil, 222, 222, + nil, nil, nil, nil, nil, nil, 222, nil, nil, 222, + 222, 222, nil, 222, 222, 223, 223, 223, nil, 223, + nil, nil, nil, 223, 223, nil, nil, nil, 223, nil, + 223, 223, 223, 223, 223, 223, 223, nil, nil, nil, + nil, nil, 223, 223, 223, 223, 223, 223, 223, nil, + nil, 223, nil, nil, nil, nil, nil, nil, 223, nil, + nil, 223, 223, 223, 223, 223, 223, 223, 223, nil, + 223, 223, 223, nil, 223, 223, nil, 223, 223, 223, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 223, + nil, nil, 223, nil, nil, 223, 223, nil, nil, 223, + nil, 223, nil, nil, nil, 223, nil, nil, nil, nil, + nil, nil, nil, 223, nil, nil, nil, nil, 223, 223, + 223, 223, 223, 223, nil, nil, nil, 223, 223, nil, + nil, nil, nil, nil, nil, 223, nil, nil, 223, 223, + 223, nil, 223, 223, 224, 224, 224, nil, 224, nil, + nil, nil, 224, 224, nil, nil, nil, 224, nil, 224, + 224, 224, 224, 224, 224, 224, nil, nil, nil, nil, + nil, 224, 224, 224, 224, 224, 224, 224, nil, nil, + 224, nil, nil, nil, nil, nil, nil, 224, nil, nil, + 224, 224, 224, 224, 224, 224, 224, 224, nil, 224, + 224, 224, nil, 224, 224, nil, 224, 224, 224, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 224, nil, + nil, 224, nil, nil, 224, 224, nil, nil, 224, nil, + nil, nil, nil, nil, 224, nil, nil, nil, nil, nil, + nil, nil, 224, nil, nil, nil, nil, 224, 224, 224, + 224, 224, 224, nil, nil, nil, 224, 224, nil, nil, + nil, nil, nil, nil, 224, nil, nil, 224, 224, 224, + nil, 224, 224, 225, 225, 225, nil, 225, nil, nil, + nil, 225, 225, nil, nil, nil, 225, nil, 225, 225, + 225, 225, 225, 225, 225, nil, nil, nil, nil, nil, + 225, 225, 225, 225, 225, 225, 225, nil, nil, 225, + nil, nil, nil, nil, nil, nil, 225, nil, nil, 225, + 225, 225, 225, 225, 225, 225, 225, nil, 225, 225, + 225, nil, 225, 225, nil, 225, 225, 225, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 225, nil, nil, + 225, nil, nil, 225, 225, nil, nil, 225, nil, nil, + nil, nil, nil, 225, nil, nil, nil, nil, nil, nil, + nil, 225, nil, nil, nil, nil, 225, 225, 225, 225, + 225, 225, nil, nil, nil, 225, 225, nil, nil, nil, + nil, nil, nil, 225, nil, nil, 225, 225, 225, nil, + 225, 225, 226, 226, 226, nil, 226, nil, nil, nil, + 226, 226, nil, nil, nil, 226, nil, 226, 226, 226, + 226, 226, 226, 226, nil, nil, nil, nil, nil, 226, + 226, 226, 226, 226, 226, 226, nil, nil, 226, nil, + nil, nil, nil, nil, nil, 226, nil, nil, 226, 226, + 226, 226, 226, 226, 226, 226, nil, 226, 226, 226, + nil, 226, 226, nil, 226, 226, 226, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 226, nil, nil, 226, + nil, nil, 226, 226, nil, nil, 226, nil, nil, nil, + nil, nil, 226, nil, nil, nil, nil, nil, nil, nil, + 226, nil, nil, nil, nil, 226, 226, 226, 226, 226, + 226, nil, nil, nil, 226, 226, nil, nil, nil, nil, + nil, nil, 226, nil, nil, 226, 226, 226, nil, 226, + 226, 227, 227, 227, nil, 227, nil, nil, nil, 227, + 227, nil, nil, nil, 227, nil, 227, 227, 227, 227, + 227, 227, 227, nil, nil, nil, nil, nil, 227, 227, + 227, 227, 227, 227, 227, nil, nil, 227, nil, nil, + nil, nil, nil, nil, 227, nil, nil, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, nil, + 227, 227, nil, 227, 227, 227, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 227, nil, nil, 227, nil, + nil, 227, 227, nil, nil, 227, nil, 227, nil, 227, + nil, 227, nil, nil, nil, nil, nil, nil, nil, 227, + nil, nil, nil, nil, 227, 227, 227, 227, 227, 227, + nil, nil, nil, 227, 227, nil, nil, nil, nil, nil, + nil, 227, nil, 227, 227, 227, 227, nil, 227, 227, + 232, 232, 232, nil, 232, nil, nil, nil, 232, 232, + nil, nil, nil, 232, nil, 232, 232, 232, 232, 232, + 232, 232, nil, nil, nil, nil, nil, 232, 232, 232, + 232, 232, 232, 232, nil, nil, 232, nil, nil, nil, + nil, nil, nil, 232, nil, nil, 232, 232, 232, 232, + 232, 232, 232, 232, nil, 232, 232, 232, nil, 232, + 232, nil, 232, 232, 232, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 232, nil, nil, 232, nil, nil, + 232, 232, nil, nil, 232, nil, nil, nil, nil, nil, + 232, nil, nil, nil, nil, nil, nil, nil, 232, nil, + nil, nil, nil, 232, 232, 232, 232, 232, 232, nil, + nil, nil, 232, 232, nil, nil, nil, nil, nil, nil, + 232, nil, nil, 232, 232, 232, nil, 232, 232, 233, + 233, 233, nil, 233, nil, nil, nil, 233, 233, nil, + nil, nil, 233, nil, 233, 233, 233, 233, 233, 233, + 233, nil, nil, nil, nil, nil, 233, 233, 233, 233, + 233, 233, 233, nil, nil, 233, nil, nil, nil, nil, + nil, nil, 233, nil, nil, 233, 233, 233, 233, 233, + 233, 233, 233, nil, 233, 233, 233, nil, 233, 233, + nil, 233, 233, 233, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 233, nil, nil, 233, nil, nil, 233, + 233, nil, nil, 233, nil, nil, nil, nil, nil, 233, + nil, nil, nil, nil, nil, nil, nil, 233, nil, nil, + nil, nil, 233, 233, 233, 233, 233, 233, nil, nil, + nil, 233, 233, nil, nil, nil, nil, nil, nil, 233, + nil, nil, 233, 233, 233, nil, 233, 233, 234, 234, + 234, nil, 234, nil, nil, nil, 234, 234, nil, nil, + nil, 234, nil, 234, 234, 234, 234, 234, 234, 234, + nil, nil, nil, nil, nil, 234, 234, 234, 234, 234, + 234, 234, nil, nil, 234, nil, nil, nil, nil, nil, + nil, 234, nil, nil, 234, 234, 234, 234, 234, 234, + 234, 234, nil, 234, 234, 234, nil, 234, 234, nil, + 234, 234, 234, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 234, nil, nil, 234, nil, nil, 234, 234, + nil, nil, 234, nil, nil, nil, nil, nil, 234, nil, + nil, nil, nil, nil, nil, nil, 234, nil, nil, nil, + nil, 234, 234, 234, 234, 234, 234, nil, nil, nil, + 234, 234, 234, nil, nil, nil, nil, nil, 234, nil, + nil, 234, 234, 234, nil, 234, 234, 245, 245, 245, + nil, 245, nil, nil, nil, 245, 245, nil, nil, nil, + 245, nil, 245, 245, 245, 245, 245, 245, 245, nil, + nil, nil, nil, nil, 245, 245, 245, 245, 245, 245, + 245, nil, nil, 245, nil, nil, nil, nil, nil, nil, + 245, nil, nil, 245, 245, 245, 245, 245, 245, 245, + 245, nil, 245, 245, 245, nil, 245, 245, nil, 245, + 245, 245, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, 245, nil, nil, 245, 245, nil, + nil, 245, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 245, 245, 245, 245, 245, 245, nil, nil, nil, 245, + 245, nil, nil, nil, nil, nil, nil, 245, nil, nil, + 245, 245, 245, nil, 245, 245, 248, 248, 248, nil, + 248, nil, nil, nil, 248, 248, nil, nil, nil, 248, + nil, 248, 248, 248, 248, 248, 248, 248, nil, nil, + nil, nil, nil, 248, 248, 248, 248, 248, 248, 248, + nil, nil, 248, nil, nil, nil, nil, nil, nil, 248, + nil, nil, 248, 248, 248, 248, 248, 248, 248, 248, + nil, 248, 248, 248, nil, 248, 248, nil, 248, 248, + 248, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 248, nil, nil, 248, nil, nil, 248, 248, nil, nil, + 248, nil, nil, nil, nil, nil, 248, nil, nil, nil, + nil, nil, nil, nil, 248, nil, nil, nil, nil, 248, + 248, 248, 248, 248, 248, nil, nil, nil, 248, 248, + nil, nil, nil, nil, nil, nil, 248, nil, nil, 248, + 248, 248, nil, 248, 248, 249, 249, 249, nil, 249, + nil, nil, nil, 249, 249, nil, nil, nil, 249, nil, + 249, 249, 249, 249, 249, 249, 249, nil, nil, nil, + nil, nil, 249, 249, 249, 249, 249, 249, 249, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 249, nil, + nil, 249, 249, 249, 249, 249, 249, 249, 249, nil, + 249, 249, 249, nil, 249, 249, nil, 249, 249, 249, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, 249, nil, nil, 249, 249, nil, nil, 249, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 249, 249, + 249, 249, 249, 249, nil, nil, nil, 249, 249, nil, + nil, nil, nil, nil, nil, 249, nil, nil, 249, 249, + 249, nil, 249, 249, 250, 250, 250, nil, 250, nil, + nil, nil, 250, 250, nil, nil, nil, 250, nil, 250, + 250, 250, 250, 250, 250, 250, nil, nil, nil, nil, + nil, 250, 250, 250, 250, 250, 250, 250, nil, nil, + 250, nil, nil, nil, nil, nil, nil, 250, nil, nil, + 250, 250, 250, 250, 250, 250, 250, 250, nil, 250, + 250, 250, nil, 250, 250, nil, 250, 250, 250, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 250, nil, + nil, 250, nil, nil, 250, 250, nil, nil, 250, nil, + nil, nil, nil, nil, 250, nil, nil, nil, nil, nil, + nil, nil, 250, nil, nil, nil, nil, 250, 250, 250, + 250, 250, 250, nil, nil, nil, 250, 250, nil, nil, + nil, nil, nil, nil, 250, nil, nil, 250, 250, 250, + nil, 250, 250, 251, 251, 251, nil, 251, nil, nil, + nil, 251, 251, nil, nil, nil, 251, nil, 251, 251, + 251, 251, 251, 251, 251, nil, nil, nil, nil, nil, + 251, 251, 251, 251, 251, 251, 251, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 251, nil, nil, 251, + 251, 251, 251, 251, 251, 251, 251, nil, 251, 251, + 251, nil, 251, 251, nil, 251, 251, 251, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 251, nil, nil, + 251, nil, nil, 251, 251, nil, nil, 251, nil, nil, + nil, nil, nil, 251, nil, nil, nil, nil, nil, nil, + nil, 251, nil, nil, nil, nil, 251, 251, 251, 251, + 251, 251, nil, nil, nil, 251, 251, nil, nil, nil, + nil, nil, nil, 251, nil, nil, 251, 251, 251, nil, + 251, 251, 252, 252, 252, nil, 252, nil, nil, nil, + 252, 252, nil, nil, nil, 252, nil, 252, 252, 252, + 252, 252, 252, 252, nil, nil, nil, nil, nil, 252, + 252, 252, 252, 252, 252, 252, nil, nil, 252, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 252, 252, + 252, 252, 252, 252, 252, 252, nil, 252, 252, 252, + nil, 252, 252, nil, 252, 252, 252, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 252, + nil, nil, 252, 252, nil, nil, 252, nil, nil, nil, + nil, nil, 252, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, nil, nil, 252, 252, 252, 252, 252, + 252, nil, nil, nil, 252, 252, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 252, 252, 252, nil, 252, + 252, 253, 253, 253, nil, 253, nil, nil, nil, 253, + 253, nil, nil, nil, 253, nil, 253, 253, 253, 253, + 253, 253, 253, nil, nil, nil, nil, nil, 253, 253, + 253, 253, 253, 253, 253, nil, nil, 253, nil, nil, + nil, nil, nil, nil, 253, nil, nil, 253, 253, 253, + 253, 253, 253, 253, 253, nil, 253, 253, 253, nil, + 253, 253, nil, 253, 253, 253, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 253, nil, nil, 253, nil, + nil, 253, 253, nil, nil, 253, nil, nil, nil, nil, + nil, 253, nil, nil, nil, nil, nil, nil, nil, 253, + nil, nil, nil, nil, 253, 253, 253, 253, 253, 253, + nil, nil, nil, 253, 253, nil, nil, nil, nil, nil, + nil, 253, nil, nil, 253, 253, 253, nil, 253, 253, + 254, 254, 254, nil, 254, nil, nil, nil, 254, 254, + nil, nil, nil, 254, nil, 254, 254, 254, 254, 254, + 254, 254, nil, nil, nil, nil, nil, 254, 254, 254, + 254, 254, 254, 254, nil, nil, 254, nil, nil, nil, + nil, nil, nil, 254, nil, nil, 254, 254, 254, 254, + 254, 254, 254, 254, nil, 254, 254, 254, nil, 254, + 254, nil, 254, 254, 254, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 254, nil, nil, 254, nil, nil, + 254, 254, nil, nil, 254, nil, nil, nil, nil, nil, + 254, nil, nil, nil, nil, nil, nil, nil, 254, nil, + nil, nil, nil, 254, 254, 254, 254, 254, 254, nil, + nil, nil, 254, 254, nil, nil, nil, nil, nil, nil, + 254, nil, nil, 254, 254, 254, nil, 254, 254, 255, + 255, 255, nil, 255, nil, nil, nil, 255, 255, nil, + nil, nil, 255, nil, 255, 255, 255, 255, 255, 255, + 255, nil, nil, nil, nil, nil, 255, 255, 255, 255, + 255, 255, 255, nil, nil, 255, nil, nil, nil, nil, + nil, nil, 255, nil, nil, 255, 255, 255, 255, 255, + 255, 255, 255, nil, 255, 255, 255, nil, 255, 255, + nil, 255, 255, 255, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 255, nil, nil, 255, nil, nil, 255, + 255, nil, nil, 255, nil, nil, nil, nil, nil, 255, + nil, nil, nil, nil, nil, nil, nil, 255, nil, nil, + nil, nil, 255, 255, 255, 255, 255, 255, nil, nil, + nil, 255, 255, nil, nil, nil, nil, nil, nil, 255, + nil, nil, 255, 255, 255, nil, 255, 255, 256, 256, + 256, nil, 256, nil, nil, nil, 256, 256, nil, nil, + nil, 256, nil, 256, 256, 256, 256, 256, 256, 256, + nil, nil, nil, nil, nil, 256, 256, 256, 256, 256, + 256, 256, nil, nil, 256, nil, nil, nil, nil, nil, + nil, 256, nil, nil, 256, 256, 256, 256, 256, 256, + 256, 256, nil, 256, 256, 256, nil, 256, 256, nil, + 256, 256, 256, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 256, nil, nil, 256, nil, nil, 256, 256, + nil, nil, 256, nil, nil, nil, nil, nil, 256, nil, + nil, nil, nil, nil, nil, nil, 256, nil, nil, nil, + nil, 256, 256, 256, 256, 256, 256, nil, nil, nil, + 256, 256, nil, nil, nil, nil, nil, nil, 256, nil, + nil, 256, 256, 256, nil, 256, 256, 257, 257, 257, + nil, 257, nil, nil, nil, 257, 257, nil, nil, nil, + 257, nil, 257, 257, 257, 257, 257, 257, 257, nil, + nil, nil, nil, nil, 257, 257, 257, 257, 257, 257, + 257, nil, nil, 257, nil, nil, nil, nil, nil, nil, + 257, nil, nil, 257, 257, 257, 257, 257, 257, 257, + 257, nil, 257, 257, 257, nil, 257, 257, nil, 257, + 257, 257, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, 257, nil, nil, 257, 257, nil, + nil, 257, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 257, 257, 257, 257, 257, 257, nil, nil, nil, 257, + 257, nil, nil, nil, nil, nil, nil, 257, nil, nil, + 257, 257, 257, nil, 257, 257, 258, 258, 258, nil, + 258, nil, nil, nil, 258, 258, nil, nil, nil, 258, + nil, 258, 258, 258, 258, 258, 258, 258, nil, nil, + nil, nil, nil, 258, 258, 258, 258, 258, 258, 258, + nil, nil, 258, nil, nil, nil, nil, nil, nil, 258, + nil, nil, 258, 258, 258, 258, 258, 258, 258, 258, + nil, 258, 258, 258, nil, 258, 258, nil, 258, 258, + 258, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 258, nil, nil, 258, nil, nil, 258, 258, nil, nil, + 258, nil, nil, nil, nil, nil, 258, nil, nil, nil, + nil, nil, nil, nil, 258, nil, nil, nil, nil, 258, + 258, 258, 258, 258, 258, nil, nil, nil, 258, 258, + nil, nil, nil, nil, nil, nil, 258, nil, nil, 258, + 258, 258, nil, 258, 258, 259, 259, 259, nil, 259, + nil, nil, nil, 259, 259, nil, nil, nil, 259, nil, + 259, 259, 259, 259, 259, 259, 259, nil, nil, nil, + nil, nil, 259, 259, 259, 259, 259, 259, 259, nil, + nil, 259, nil, nil, nil, nil, nil, nil, 259, nil, + nil, 259, 259, 259, 259, 259, 259, 259, 259, nil, + 259, 259, 259, nil, 259, 259, nil, 259, 259, 259, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 259, + nil, nil, 259, nil, nil, 259, 259, nil, nil, 259, + nil, nil, nil, nil, nil, 259, nil, nil, nil, nil, + nil, nil, nil, 259, nil, nil, nil, nil, 259, 259, + 259, 259, 259, 259, nil, nil, nil, 259, 259, nil, + nil, nil, nil, nil, nil, 259, nil, nil, 259, 259, + 259, nil, 259, 259, 260, 260, 260, nil, 260, nil, + nil, nil, 260, 260, nil, nil, nil, 260, nil, 260, + 260, 260, 260, 260, 260, 260, nil, nil, nil, nil, + nil, 260, 260, 260, 260, 260, 260, 260, nil, nil, + 260, nil, nil, nil, nil, nil, nil, 260, nil, nil, + 260, 260, 260, 260, 260, 260, 260, 260, nil, 260, + 260, 260, nil, 260, 260, nil, 260, 260, 260, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 260, nil, + nil, 260, nil, nil, 260, 260, nil, nil, 260, nil, + nil, nil, nil, nil, 260, nil, nil, nil, nil, nil, + nil, nil, 260, nil, nil, nil, nil, 260, 260, 260, + 260, 260, 260, nil, nil, nil, 260, 260, nil, nil, + nil, nil, nil, nil, 260, nil, nil, 260, 260, 260, + nil, 260, 260, 261, 261, 261, nil, 261, nil, nil, + nil, 261, 261, nil, nil, nil, 261, nil, 261, 261, + 261, 261, 261, 261, 261, nil, nil, nil, nil, nil, + 261, 261, 261, 261, 261, 261, 261, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 261, nil, nil, 261, + 261, 261, 261, 261, 261, 261, 261, nil, 261, 261, + 261, nil, 261, 261, nil, 261, 261, 261, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 261, nil, nil, + 261, nil, nil, 261, 261, nil, nil, 261, nil, nil, + nil, nil, nil, 261, nil, nil, nil, nil, nil, nil, + nil, 261, nil, nil, nil, nil, 261, 261, 261, 261, + 261, 261, nil, nil, nil, 261, 261, nil, nil, nil, + nil, nil, nil, 261, nil, nil, 261, 261, 261, nil, + 261, 261, 262, 262, 262, nil, 262, nil, nil, nil, + 262, 262, nil, nil, nil, 262, nil, 262, 262, 262, + 262, 262, 262, 262, nil, nil, nil, nil, nil, 262, + 262, 262, 262, 262, 262, 262, nil, nil, 262, nil, + nil, nil, nil, nil, nil, 262, nil, nil, 262, 262, + 262, 262, 262, 262, 262, 262, nil, 262, 262, 262, + nil, 262, 262, nil, 262, 262, 262, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 262, nil, nil, 262, + nil, nil, 262, 262, nil, nil, 262, nil, nil, nil, + nil, nil, 262, nil, nil, nil, nil, nil, nil, nil, + 262, nil, nil, nil, nil, 262, 262, 262, 262, 262, + 262, nil, nil, nil, 262, 262, nil, nil, nil, nil, + nil, nil, 262, nil, nil, 262, 262, 262, nil, 262, + 262, 263, 263, 263, nil, 263, nil, nil, nil, 263, + 263, nil, nil, nil, 263, nil, 263, 263, 263, 263, + 263, 263, 263, nil, nil, nil, nil, nil, 263, 263, + 263, 263, 263, 263, 263, nil, nil, 263, nil, nil, + nil, nil, nil, nil, 263, nil, nil, 263, 263, 263, + 263, 263, 263, 263, 263, nil, 263, 263, 263, nil, + 263, 263, nil, 263, 263, 263, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 263, nil, nil, 263, nil, + nil, 263, 263, nil, nil, 263, nil, nil, nil, nil, + nil, 263, nil, nil, nil, nil, nil, nil, nil, 263, + nil, nil, nil, nil, 263, 263, 263, 263, 263, 263, + nil, nil, nil, 263, 263, nil, nil, nil, nil, nil, + nil, 263, nil, nil, 263, 263, 263, nil, 263, 263, + 264, 264, 264, nil, 264, nil, nil, nil, 264, 264, + nil, nil, nil, 264, nil, 264, 264, 264, 264, 264, + 264, 264, nil, nil, nil, nil, nil, 264, 264, 264, + 264, 264, 264, 264, nil, nil, 264, nil, nil, nil, + nil, nil, nil, 264, nil, nil, 264, 264, 264, 264, + 264, 264, 264, 264, nil, 264, 264, 264, nil, 264, + 264, nil, 264, 264, 264, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 264, nil, nil, 264, nil, nil, + 264, 264, nil, nil, 264, nil, nil, nil, nil, nil, + 264, nil, nil, nil, nil, nil, nil, nil, 264, nil, + nil, nil, nil, 264, 264, 264, 264, 264, 264, nil, + nil, nil, 264, 264, nil, nil, nil, nil, nil, nil, + 264, nil, nil, 264, 264, 264, nil, 264, 264, 265, + 265, 265, nil, 265, nil, nil, nil, 265, 265, nil, + nil, nil, 265, nil, 265, 265, 265, 265, 265, 265, + 265, nil, nil, nil, nil, nil, 265, 265, 265, 265, + 265, 265, 265, nil, nil, 265, nil, nil, nil, nil, + nil, nil, 265, nil, nil, 265, 265, 265, 265, 265, + 265, 265, 265, nil, 265, 265, 265, nil, 265, 265, + nil, 265, 265, 265, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 265, nil, nil, 265, nil, nil, 265, + 265, nil, nil, 265, nil, nil, nil, nil, nil, 265, + nil, nil, nil, nil, nil, nil, nil, 265, nil, nil, + nil, nil, 265, 265, 265, 265, 265, 265, nil, nil, + nil, 265, 265, nil, nil, nil, nil, nil, nil, 265, + nil, nil, 265, 265, 265, nil, 265, 265, 266, 266, + 266, nil, 266, nil, nil, nil, 266, 266, nil, nil, + nil, 266, nil, 266, 266, 266, 266, 266, 266, 266, + nil, nil, nil, nil, nil, 266, 266, 266, 266, 266, + 266, 266, nil, nil, 266, nil, nil, nil, nil, nil, + nil, 266, nil, nil, 266, 266, 266, 266, 266, 266, + 266, 266, nil, 266, 266, 266, nil, 266, 266, nil, + 266, 266, 266, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 266, nil, nil, 266, nil, nil, 266, 266, + nil, nil, 266, nil, nil, nil, nil, nil, 266, nil, + nil, nil, nil, nil, nil, nil, 266, nil, nil, nil, + nil, 266, 266, 266, 266, 266, 266, nil, nil, nil, + 266, 266, nil, nil, nil, nil, nil, nil, 266, nil, + nil, 266, 266, 266, nil, 266, 266, 267, 267, 267, + nil, 267, nil, nil, nil, 267, 267, nil, nil, nil, + 267, nil, 267, 267, 267, 267, 267, 267, 267, nil, + nil, nil, nil, nil, 267, 267, 267, 267, 267, 267, + 267, nil, nil, 267, nil, nil, nil, nil, nil, nil, + 267, nil, nil, 267, 267, 267, 267, 267, 267, 267, + 267, nil, 267, 267, 267, nil, 267, 267, nil, 267, + 267, 267, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 267, nil, nil, 267, nil, nil, 267, 267, nil, + nil, 267, nil, nil, nil, nil, nil, 267, nil, nil, + nil, nil, nil, nil, nil, 267, nil, nil, nil, nil, + 267, 267, 267, 267, 267, 267, nil, nil, nil, 267, + 267, nil, nil, nil, nil, nil, nil, 267, nil, nil, + 267, 267, 267, nil, 267, 267, 268, 268, 268, nil, + 268, nil, nil, nil, 268, 268, nil, nil, nil, 268, + nil, 268, 268, 268, 268, 268, 268, 268, nil, nil, + nil, nil, nil, 268, 268, 268, 268, 268, 268, 268, + nil, nil, 268, nil, nil, nil, nil, nil, nil, 268, + nil, nil, 268, 268, 268, 268, 268, 268, 268, 268, + nil, 268, 268, 268, nil, 268, 268, nil, 268, 268, + 268, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 268, nil, nil, 268, nil, nil, 268, 268, nil, nil, + 268, nil, nil, nil, nil, nil, 268, nil, nil, nil, + nil, nil, nil, nil, 268, nil, nil, nil, nil, 268, + 268, 268, 268, 268, 268, nil, nil, nil, 268, 268, + nil, nil, nil, nil, nil, nil, 268, nil, nil, 268, + 268, 268, nil, 268, 268, 269, 269, 269, nil, 269, + nil, nil, nil, 269, 269, nil, nil, nil, 269, nil, + 269, 269, 269, 269, 269, 269, 269, nil, nil, nil, + nil, nil, 269, 269, 269, 269, 269, 269, 269, nil, + nil, 269, nil, nil, nil, nil, nil, nil, 269, nil, + nil, 269, 269, 269, 269, 269, 269, 269, 269, nil, + 269, 269, 269, nil, 269, 269, nil, 269, 269, 269, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 269, + nil, nil, 269, nil, nil, 269, 269, nil, nil, 269, + nil, nil, nil, nil, nil, 269, nil, nil, nil, nil, + nil, nil, nil, 269, nil, nil, nil, nil, 269, 269, + 269, 269, 269, 269, nil, nil, nil, 269, 269, nil, + nil, nil, nil, nil, nil, 269, nil, nil, 269, 269, + 269, nil, 269, 269, 274, 274, 274, nil, 274, nil, + nil, nil, 274, 274, nil, nil, nil, 274, nil, 274, + 274, 274, 274, 274, 274, 274, nil, nil, nil, nil, + nil, 274, 274, 274, 274, 274, 274, 274, nil, nil, + 274, nil, nil, nil, nil, nil, nil, 274, nil, nil, + 274, 274, 274, 274, 274, 274, 274, 274, nil, 274, + 274, 274, nil, 274, 274, nil, 274, 274, 274, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 274, nil, + nil, 274, nil, nil, 274, 274, nil, nil, 274, nil, + nil, nil, nil, nil, 274, nil, nil, nil, nil, nil, + nil, nil, 274, nil, nil, nil, nil, 274, 274, 274, + 274, 274, 274, nil, nil, nil, 274, 274, nil, nil, + nil, nil, nil, nil, 274, nil, nil, 274, 274, 274, + nil, 274, 274, 282, 282, 282, nil, 282, nil, nil, + nil, 282, 282, nil, nil, nil, 282, nil, 282, 282, + 282, 282, 282, 282, 282, nil, nil, nil, nil, nil, + 282, 282, 282, 282, 282, 282, 282, nil, nil, 282, + nil, nil, nil, nil, nil, nil, 282, nil, nil, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, nil, 282, 282, nil, 282, 282, 282, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 282, nil, nil, + 282, nil, nil, 282, 282, nil, nil, 282, nil, 282, + nil, 282, nil, 282, nil, nil, nil, nil, nil, nil, + nil, 282, nil, nil, nil, nil, 282, 282, 282, 282, + 282, 282, nil, nil, nil, 282, 282, nil, nil, nil, + nil, nil, nil, 282, nil, 282, 282, 282, 282, nil, + 282, 282, 283, 283, 283, nil, 283, nil, nil, nil, + 283, 283, nil, nil, nil, 283, nil, 283, 283, 283, + 283, 283, 283, 283, nil, nil, nil, nil, nil, 283, + 283, 283, 283, 283, 283, 283, nil, nil, 283, nil, + nil, nil, nil, nil, nil, 283, nil, nil, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + nil, 283, 283, nil, 283, 283, 283, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 283, nil, nil, 283, + nil, nil, 283, 283, nil, nil, 283, nil, 283, nil, + 283, nil, 283, nil, nil, nil, nil, nil, nil, nil, + 283, nil, nil, nil, nil, 283, 283, 283, 283, 283, + 283, nil, nil, nil, 283, 283, nil, nil, nil, nil, + nil, nil, 283, nil, 283, 283, 283, 283, nil, 283, + 283, 292, 292, 292, nil, 292, nil, nil, nil, 292, + 292, nil, nil, nil, 292, nil, 292, 292, 292, 292, + 292, 292, 292, nil, nil, nil, nil, nil, 292, 292, + 292, 292, 292, 292, 292, nil, nil, 292, nil, nil, + nil, nil, nil, nil, 292, nil, nil, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, nil, + 292, 292, nil, 292, 292, 292, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 292, nil, nil, 292, nil, + nil, 292, 292, nil, nil, 292, nil, 292, nil, 292, + nil, 292, nil, nil, nil, nil, nil, nil, nil, 292, + nil, nil, nil, nil, 292, 292, 292, 292, 292, 292, + nil, nil, nil, 292, 292, 292, nil, nil, nil, nil, + nil, 292, nil, 292, 292, 292, 292, nil, 292, 292, + 299, 299, 299, nil, 299, nil, nil, nil, 299, 299, + nil, nil, nil, 299, nil, 299, 299, 299, 299, 299, + 299, 299, nil, nil, nil, nil, nil, 299, 299, 299, + 299, 299, 299, 299, nil, nil, 299, nil, nil, nil, + nil, nil, nil, 299, nil, nil, 299, 299, 299, 299, + 299, 299, 299, 299, nil, 299, 299, 299, nil, 299, + 299, nil, 299, 299, 299, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 299, nil, nil, 299, nil, nil, + 299, 299, nil, nil, 299, nil, nil, nil, nil, nil, + 299, nil, nil, nil, nil, nil, nil, nil, 299, nil, + nil, nil, nil, 299, 299, 299, 299, 299, 299, nil, + nil, nil, 299, 299, nil, nil, nil, nil, nil, nil, + 299, nil, nil, 299, 299, 299, nil, 299, 299, 301, + 301, 301, nil, 301, nil, nil, nil, 301, 301, nil, + nil, nil, 301, nil, 301, 301, 301, 301, 301, 301, + 301, nil, nil, nil, nil, nil, 301, 301, 301, 301, + 301, 301, 301, nil, nil, 301, nil, nil, nil, nil, + nil, nil, 301, nil, nil, 301, 301, 301, 301, 301, + 301, 301, 301, nil, 301, 301, 301, nil, 301, 301, + nil, 301, 301, 301, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 301, nil, nil, 301, nil, nil, 301, + 301, nil, nil, 301, nil, nil, nil, nil, nil, 301, + nil, nil, nil, nil, nil, nil, nil, 301, nil, nil, + nil, nil, 301, 301, 301, 301, 301, 301, nil, nil, + nil, 301, 301, nil, nil, nil, nil, nil, nil, 301, + nil, nil, 301, 301, 301, nil, 301, 301, 304, 304, + 304, nil, 304, nil, nil, nil, 304, 304, nil, nil, + nil, 304, nil, 304, 304, 304, 304, 304, 304, 304, + nil, nil, nil, nil, nil, 304, 304, 304, 304, 304, + 304, 304, nil, nil, 304, nil, nil, nil, nil, nil, + nil, 304, nil, nil, 304, 304, 304, 304, 304, 304, + 304, 304, nil, 304, 304, 304, nil, 304, 304, nil, + 304, 304, 304, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 304, nil, nil, 304, nil, nil, 304, 304, + nil, nil, 304, nil, nil, nil, nil, nil, 304, nil, + nil, nil, nil, nil, nil, nil, 304, nil, nil, nil, + nil, 304, 304, 304, 304, 304, 304, nil, nil, nil, + 304, 304, nil, nil, nil, nil, nil, nil, 304, nil, + nil, 304, 304, 304, nil, 304, 304, 305, 305, 305, + nil, 305, nil, nil, nil, 305, 305, nil, nil, nil, + 305, nil, 305, 305, 305, 305, 305, 305, 305, nil, + nil, nil, nil, nil, 305, 305, 305, 305, 305, 305, + 305, nil, nil, 305, nil, nil, nil, nil, nil, nil, + 305, nil, nil, 305, 305, 305, 305, 305, 305, 305, + 305, nil, 305, 305, 305, nil, 305, 305, nil, 305, + 305, 305, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 305, nil, nil, 305, nil, nil, 305, 305, nil, + nil, 305, nil, nil, nil, nil, nil, 305, nil, nil, + nil, nil, nil, nil, nil, 305, nil, nil, nil, nil, + 305, 305, 305, 305, 305, 305, nil, nil, nil, 305, + 305, nil, nil, nil, nil, nil, nil, 305, nil, nil, + 305, 305, 305, nil, 305, 305, 311, 311, 311, 311, + 311, nil, nil, nil, 311, 311, nil, nil, nil, 311, + nil, 311, 311, 311, 311, 311, 311, 311, nil, nil, + nil, nil, nil, 311, 311, 311, 311, 311, 311, 311, + nil, nil, 311, nil, nil, nil, nil, nil, 311, 311, + nil, 311, 311, 311, 311, 311, 311, 311, 311, 311, + nil, 311, 311, 311, nil, 311, 311, nil, 311, 311, + 311, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 311, nil, nil, 311, nil, nil, 311, 311, nil, nil, + 311, nil, 311, nil, nil, nil, 311, nil, nil, nil, + nil, nil, nil, nil, 311, nil, nil, nil, nil, 311, + 311, 311, 311, 311, 311, nil, nil, nil, 311, 311, + nil, nil, nil, nil, nil, nil, 311, nil, nil, 311, + 311, 311, nil, 311, 311, 319, 319, 319, nil, 319, + nil, nil, nil, 319, 319, nil, nil, nil, 319, nil, + 319, 319, 319, 319, 319, 319, 319, nil, nil, nil, + nil, nil, 319, 319, 319, 319, 319, 319, 319, nil, + nil, 319, nil, nil, nil, nil, nil, nil, 319, nil, + nil, 319, 319, 319, 319, 319, 319, 319, 319, nil, + 319, 319, 319, nil, 319, 319, nil, nil, nil, 319, + nil, nil, nil, nil, nil, 1061, nil, 1061, 1061, 1061, + 1061, 1061, nil, nil, nil, nil, nil, nil, nil, 319, + nil, 1061, 319, nil, nil, 319, 319, nil, nil, 319, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1061, nil, nil, nil, nil, 319, 319, + 319, 319, 319, 319, 1061, 1061, nil, 319, 319, nil, + nil, nil, 319, nil, nil, 319, nil, nil, 319, 319, + 319, nil, 319, 319, 336, 336, 336, nil, 336, nil, + nil, nil, 336, 336, nil, nil, nil, 336, 1061, 336, + 336, 336, 336, 336, 336, 336, nil, nil, nil, nil, + nil, 336, 336, 336, 336, 336, 336, 336, nil, nil, + 336, nil, nil, nil, nil, nil, nil, 336, nil, nil, + 336, 336, 336, 336, 336, 336, 336, 336, nil, 336, + 336, 336, nil, 336, 336, nil, nil, nil, 336, nil, + nil, nil, nil, nil, 1063, nil, 1063, 1063, 1063, 1063, + 1063, nil, nil, nil, nil, nil, nil, nil, 336, nil, + 1063, 336, nil, nil, 336, 336, nil, nil, 336, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1063, nil, nil, nil, nil, 336, 336, 336, + 336, 336, 336, 1063, 1063, nil, 336, 336, nil, nil, + nil, nil, nil, nil, 336, nil, nil, 336, 336, 336, + nil, 336, 336, 343, 343, 343, nil, 343, nil, nil, + nil, 343, 343, nil, nil, nil, 343, 1063, 343, 343, + 343, 343, 343, 343, 343, nil, nil, nil, nil, nil, + 343, 343, 343, 343, 343, 343, 343, nil, nil, 343, + nil, nil, nil, nil, nil, nil, 343, nil, nil, 343, + 343, 343, 343, 343, 343, 343, 343, nil, 343, 343, + 343, nil, 343, 343, nil, 343, 343, 343, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 343, nil, nil, + 343, nil, nil, 343, 343, nil, nil, 343, nil, nil, + nil, nil, nil, 343, nil, nil, nil, nil, nil, nil, + nil, 343, nil, nil, nil, nil, 343, 343, 343, 343, + 343, 343, nil, nil, nil, 343, 343, nil, nil, nil, + nil, nil, nil, 343, nil, nil, 343, 343, 343, nil, + 343, 343, 345, 345, 345, nil, 345, nil, nil, nil, + 345, 345, nil, nil, nil, 345, nil, 345, 345, 345, + 345, 345, 345, 345, nil, nil, nil, nil, nil, 345, + 345, 345, 345, 345, 345, 345, nil, nil, 345, nil, + nil, nil, nil, nil, nil, 345, nil, nil, 345, 345, + 345, 345, 345, 345, 345, 345, nil, 345, 345, 345, + nil, 345, 345, nil, 345, 345, 345, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 345, nil, nil, 345, + 345, nil, 345, 345, nil, nil, 345, nil, nil, nil, + nil, nil, 345, nil, nil, nil, nil, nil, nil, nil, + 345, nil, nil, nil, nil, 345, 345, 345, 345, 345, + 345, nil, nil, nil, 345, 345, nil, nil, nil, nil, + nil, nil, 345, nil, nil, 345, 345, 345, nil, 345, + 345, 349, 349, 349, nil, 349, nil, nil, nil, 349, + 349, nil, nil, nil, 349, nil, 349, 349, 349, 349, + 349, 349, 349, nil, nil, nil, nil, nil, 349, 349, + 349, 349, 349, 349, 349, nil, nil, 349, nil, nil, + nil, nil, nil, nil, 349, nil, nil, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, 349, nil, + 349, 349, nil, 349, 349, 349, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 349, nil, nil, 349, nil, + nil, 349, 349, nil, nil, 349, nil, 349, nil, nil, + nil, 349, nil, nil, nil, nil, nil, nil, nil, 349, + nil, nil, nil, nil, 349, 349, 349, 349, 349, 349, + nil, nil, nil, 349, 349, nil, nil, nil, nil, nil, + nil, 349, nil, 349, 349, 349, 349, nil, 349, 349, + 350, 350, 350, nil, 350, nil, nil, nil, 350, 350, + nil, nil, nil, 350, nil, 350, 350, 350, 350, 350, + 350, 350, nil, nil, nil, nil, nil, 350, 350, 350, + 350, 350, 350, 350, nil, nil, 350, nil, nil, nil, + nil, nil, nil, 350, nil, nil, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, nil, 350, + 350, nil, 350, 350, 350, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 350, nil, nil, 350, nil, nil, + 350, 350, nil, nil, 350, nil, nil, nil, nil, nil, + 350, nil, nil, nil, nil, nil, nil, nil, 350, nil, + nil, nil, nil, 350, 350, 350, 350, 350, 350, nil, + nil, nil, 350, 350, nil, nil, nil, nil, nil, nil, + 350, nil, 350, 350, 350, 350, nil, 350, 350, 355, + 355, 355, nil, 355, nil, nil, nil, 355, 355, nil, + nil, nil, 355, nil, 355, 355, 355, 355, 355, 355, + 355, nil, nil, nil, nil, nil, 355, 355, 355, 355, + 355, 355, 355, nil, nil, 355, nil, nil, nil, nil, + nil, nil, 355, nil, nil, 355, 355, 355, 355, 355, + 355, 355, 355, nil, 355, 355, 355, nil, 355, 355, + nil, 355, 355, 355, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 355, nil, nil, 355, nil, nil, 355, + 355, nil, nil, 355, nil, nil, nil, nil, nil, 355, + nil, nil, nil, nil, nil, nil, nil, 355, nil, nil, + nil, nil, 355, 355, 355, 355, 355, 355, nil, nil, + nil, 355, 355, nil, nil, nil, nil, nil, nil, 355, + nil, nil, 355, 355, 355, nil, 355, 355, 376, 376, + 376, nil, 376, nil, nil, nil, 376, 376, nil, nil, + nil, 376, nil, 376, 376, 376, 376, 376, 376, 376, + nil, nil, nil, nil, nil, 376, 376, 376, 376, 376, + 376, 376, nil, nil, 376, nil, nil, nil, nil, nil, + nil, 376, nil, nil, 376, 376, 376, 376, 376, 376, + 376, 376, nil, 376, 376, 376, nil, 376, 376, nil, + 376, 376, 376, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 376, nil, nil, 376, nil, nil, 376, 376, + nil, nil, 376, nil, nil, nil, nil, nil, 376, nil, + nil, nil, nil, nil, nil, nil, 376, nil, nil, nil, + nil, 376, 376, 376, 376, 376, 376, nil, nil, nil, + 376, 376, nil, nil, nil, nil, nil, nil, 376, nil, + nil, 376, 376, 376, nil, 376, 376, 437, 437, 437, + nil, 437, nil, nil, nil, 437, 437, nil, nil, nil, + 437, nil, 437, 437, 437, 437, 437, 437, 437, nil, + nil, nil, nil, nil, 437, 437, 437, 437, 437, 437, + 437, nil, nil, 437, nil, nil, nil, nil, nil, nil, + 437, nil, nil, 437, 437, 437, 437, 437, 437, 437, + 437, nil, 437, 437, 437, nil, 437, 437, nil, 437, + 437, 437, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 437, nil, nil, 437, nil, nil, 437, 437, nil, + nil, 437, nil, nil, nil, nil, nil, 437, nil, nil, + nil, nil, nil, nil, nil, 437, nil, nil, nil, nil, + 437, 437, 437, 437, 437, 437, nil, nil, nil, 437, + 437, nil, nil, nil, nil, nil, nil, 437, nil, nil, + 437, 437, 437, nil, 437, 437, 481, 481, 481, nil, + 481, nil, nil, nil, 481, 481, nil, nil, nil, 481, + nil, 481, 481, 481, 481, 481, 481, 481, nil, nil, + nil, nil, nil, 481, 481, 481, 481, 481, 481, 481, + nil, nil, 481, nil, nil, nil, nil, nil, nil, 481, + nil, nil, 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, nil, 481, 481, nil, 481, 481, + 481, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 481, nil, nil, 481, nil, nil, 481, 481, nil, nil, + 481, nil, 481, nil, 481, nil, 481, nil, nil, nil, + nil, nil, nil, nil, 481, nil, nil, nil, nil, 481, + 481, 481, 481, 481, 481, nil, nil, nil, 481, 481, + nil, nil, nil, nil, nil, nil, 481, nil, 481, 481, + 481, 481, nil, 481, 481, 483, 483, 483, nil, 483, + nil, nil, nil, 483, 483, nil, nil, nil, 483, nil, + 483, 483, 483, 483, 483, 483, 483, nil, nil, nil, + nil, nil, 483, 483, 483, 483, 483, 483, 483, nil, + nil, 483, nil, nil, nil, nil, nil, nil, 483, nil, + nil, 483, 483, 483, 483, 483, 483, 483, 483, nil, + 483, 483, 483, nil, 483, 483, nil, 483, 483, 483, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 483, + nil, nil, 483, nil, nil, 483, 483, nil, nil, 483, + nil, nil, nil, nil, nil, 483, nil, nil, nil, nil, + nil, nil, nil, 483, nil, nil, nil, nil, 483, 483, + 483, 483, 483, 483, nil, nil, nil, 483, 483, nil, + nil, nil, nil, nil, nil, 483, nil, nil, 483, 483, + 483, nil, 483, 483, 484, 484, 484, nil, 484, nil, + nil, nil, 484, 484, nil, nil, nil, 484, nil, 484, + 484, 484, 484, 484, 484, 484, nil, nil, nil, nil, + nil, 484, 484, 484, 484, 484, 484, 484, nil, nil, + 484, nil, nil, nil, nil, nil, nil, 484, nil, nil, + 484, 484, 484, 484, 484, 484, 484, 484, nil, 484, + 484, 484, nil, 484, 484, nil, 484, 484, 484, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 484, nil, + nil, 484, nil, nil, 484, 484, nil, nil, 484, nil, + nil, nil, nil, nil, 484, nil, nil, nil, nil, nil, + nil, nil, 484, nil, nil, nil, nil, 484, 484, 484, + 484, 484, 484, nil, nil, nil, 484, 484, nil, nil, + nil, nil, nil, nil, 484, nil, nil, 484, 484, 484, + nil, 484, 484, 485, 485, 485, nil, 485, nil, nil, + nil, 485, 485, nil, nil, nil, 485, nil, 485, 485, + 485, 485, 485, 485, 485, nil, nil, nil, nil, nil, + 485, 485, 485, 485, 485, 485, 485, nil, nil, 485, + nil, nil, nil, nil, nil, nil, 485, nil, nil, 485, + 485, 485, 485, 485, 485, 485, 485, nil, 485, 485, + 485, nil, 485, 485, nil, 485, 485, 485, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 485, nil, nil, + 485, nil, nil, 485, 485, nil, nil, 485, nil, nil, + nil, nil, nil, 485, nil, nil, nil, nil, nil, nil, + nil, 485, nil, nil, nil, nil, 485, 485, 485, 485, + 485, 485, nil, nil, nil, 485, 485, nil, nil, nil, + nil, nil, nil, 485, nil, nil, 485, 485, 485, nil, + 485, 485, 523, 523, 523, nil, 523, nil, nil, nil, + 523, 523, nil, nil, nil, 523, nil, 523, 523, 523, + 523, 523, 523, 523, nil, nil, nil, nil, nil, 523, + 523, 523, 523, 523, 523, 523, nil, nil, 523, nil, + nil, nil, nil, nil, nil, 523, nil, nil, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, + nil, 523, 523, nil, 523, 523, 523, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 523, nil, nil, 523, + nil, nil, 523, 523, nil, nil, 523, nil, 523, nil, + 523, nil, 523, nil, nil, nil, nil, nil, nil, nil, + 523, nil, nil, nil, nil, 523, 523, 523, 523, 523, + 523, nil, nil, nil, 523, 523, nil, nil, nil, nil, + nil, nil, 523, nil, 523, 523, 523, 523, nil, 523, + 523, 526, 526, 526, nil, 526, nil, nil, nil, 526, + 526, nil, nil, nil, 526, nil, 526, 526, 526, 526, + 526, 526, 526, nil, nil, nil, nil, nil, 526, 526, + 526, 526, 526, 526, 526, nil, nil, 526, nil, nil, + nil, nil, nil, nil, 526, nil, nil, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, nil, + 526, 526, nil, 526, 526, 526, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 526, nil, nil, 526, nil, + nil, 526, 526, nil, nil, 526, nil, nil, nil, 526, + nil, 526, nil, nil, nil, nil, nil, nil, nil, 526, + nil, nil, nil, nil, 526, 526, 526, 526, 526, 526, + nil, nil, nil, 526, 526, nil, nil, nil, nil, nil, + nil, 526, nil, 526, 526, 526, 526, nil, 526, 526, + 528, 528, 528, nil, 528, nil, nil, nil, 528, 528, + nil, nil, nil, 528, nil, 528, 528, 528, 528, 528, + 528, 528, nil, nil, nil, nil, nil, 528, 528, 528, + 528, 528, 528, 528, nil, nil, 528, nil, nil, nil, + nil, nil, nil, 528, nil, nil, 528, 528, 528, 528, + 528, 528, 528, 528, nil, 528, 528, 528, nil, 528, + 528, nil, 528, 528, 528, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 528, nil, nil, 528, nil, nil, + 528, 528, nil, nil, 528, nil, nil, nil, nil, nil, + 528, nil, nil, nil, nil, nil, nil, nil, 528, nil, + nil, nil, nil, 528, 528, 528, 528, 528, 528, nil, + nil, nil, 528, 528, nil, nil, nil, nil, nil, nil, + 528, nil, nil, 528, 528, 528, nil, 528, 528, 534, + 534, 534, 534, 534, nil, nil, nil, 534, 534, nil, + nil, nil, 534, nil, 534, 534, 534, 534, 534, 534, + 534, nil, nil, nil, nil, nil, 534, 534, 534, 534, + 534, 534, 534, nil, nil, 534, nil, nil, nil, nil, + nil, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, nil, 534, 534, 534, nil, 534, 534, + nil, 534, 534, 534, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 534, nil, nil, 534, nil, nil, 534, + 534, nil, nil, 534, nil, 534, nil, nil, nil, 534, + nil, nil, nil, nil, nil, nil, nil, 534, nil, nil, + nil, nil, 534, 534, 534, 534, 534, 534, nil, nil, + nil, 534, 534, nil, nil, nil, nil, nil, 534, 534, + nil, nil, 534, 534, 534, nil, 534, 534, 542, 542, + 542, nil, 542, nil, nil, nil, 542, 542, nil, nil, + nil, 542, nil, 542, 542, 542, 542, 542, 542, 542, + nil, nil, nil, nil, nil, 542, 542, 542, 542, 542, + 542, 542, nil, nil, 542, nil, nil, nil, nil, nil, + nil, 542, nil, nil, 542, 542, 542, 542, 542, 542, + 542, 542, nil, 542, 542, 542, nil, 542, 542, nil, + nil, nil, 542, nil, nil, nil, nil, nil, 1084, nil, + 1084, 1084, 1084, 1084, 1084, nil, nil, nil, nil, nil, + nil, nil, 542, nil, 1084, 542, nil, nil, 542, 542, + nil, nil, 542, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1084, nil, nil, nil, + nil, 542, 542, 542, 542, 542, 542, 1084, 1084, nil, + 542, 542, nil, nil, nil, nil, nil, nil, 542, nil, + nil, 542, 542, 542, nil, 542, 542, 544, 544, 544, + nil, 544, nil, nil, nil, 544, 544, nil, nil, nil, + 544, 1084, 544, 544, 544, 544, 544, 544, 544, nil, + nil, nil, nil, nil, 544, 544, 544, 544, 544, 544, + 544, nil, nil, 544, nil, nil, nil, nil, nil, nil, + 544, nil, nil, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, nil, 544, 544, nil, 544, + 544, 544, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 544, nil, nil, 544, nil, nil, 544, 544, nil, + nil, 544, nil, 544, nil, 544, nil, 544, nil, nil, + nil, nil, nil, nil, nil, 544, nil, nil, nil, nil, + 544, 544, 544, 544, 544, 544, nil, nil, nil, 544, + 544, nil, nil, nil, nil, nil, nil, 544, nil, 544, + 544, 544, 544, nil, 544, 544, 550, 550, 550, nil, + 550, nil, nil, nil, 550, 550, nil, nil, nil, 550, + nil, 550, 550, 550, 550, 550, 550, 550, nil, nil, + nil, nil, nil, 550, 550, 550, 550, 550, 550, 550, + nil, nil, 550, nil, nil, nil, nil, nil, nil, 550, + nil, nil, 550, 550, 550, 550, 550, 550, 550, 550, + nil, 550, 550, 550, nil, 550, 550, nil, nil, nil, + 550, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 550, nil, nil, 550, nil, nil, 550, 550, nil, nil, + 550, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 550, + 550, 550, 550, 550, 550, nil, nil, nil, 550, 550, + nil, nil, nil, nil, nil, nil, 550, nil, nil, 550, + 550, 550, nil, 550, 550, 553, 553, 553, nil, 553, + nil, nil, nil, 553, 553, nil, nil, nil, 553, nil, + 553, 553, 553, 553, 553, 553, 553, nil, nil, nil, + nil, nil, 553, 553, 553, 553, 553, 553, 553, nil, + nil, 553, nil, nil, nil, nil, nil, nil, 553, nil, + nil, 553, 553, 553, 553, 553, 553, 553, 553, nil, + 553, 553, 553, nil, 553, 553, nil, 553, 553, 553, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 553, + nil, nil, 553, nil, nil, 553, 553, nil, nil, 553, + nil, nil, nil, nil, nil, 553, nil, nil, nil, nil, + nil, nil, nil, 553, nil, nil, nil, nil, 553, 553, + 553, 553, 553, 553, nil, nil, nil, 553, 553, nil, + nil, nil, nil, nil, nil, 553, nil, nil, 553, 553, + 553, nil, 553, 553, 554, 554, 554, nil, 554, nil, + nil, nil, 554, 554, nil, nil, nil, 554, nil, 554, + 554, 554, 554, 554, 554, 554, nil, nil, nil, nil, + nil, 554, 554, 554, 554, 554, 554, 554, nil, nil, + 554, nil, nil, nil, nil, nil, nil, 554, nil, nil, + 554, 554, 554, 554, 554, 554, 554, 554, nil, 554, + 554, 554, nil, 554, 554, nil, 554, 554, 554, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 554, nil, + nil, 554, nil, nil, 554, 554, nil, nil, 554, nil, + nil, nil, nil, nil, 554, nil, nil, nil, nil, nil, + nil, nil, 554, nil, nil, nil, nil, 554, 554, 554, + 554, 554, 554, nil, nil, nil, 554, 554, nil, nil, + nil, nil, nil, nil, 554, nil, nil, 554, 554, 554, + nil, 554, 554, 559, 559, 559, nil, 559, nil, nil, + nil, 559, 559, nil, nil, nil, 559, nil, 559, 559, + 559, 559, 559, 559, 559, nil, nil, nil, nil, nil, + 559, 559, 559, 559, 559, 559, 559, nil, nil, 559, + nil, nil, nil, nil, nil, nil, 559, nil, nil, 559, + 559, 559, 559, 559, 559, 559, 559, nil, 559, 559, + 559, nil, 559, 559, nil, 559, 559, 559, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 559, nil, nil, + 559, nil, nil, 559, 559, nil, nil, 559, nil, nil, + nil, nil, nil, 559, nil, nil, nil, nil, nil, nil, + nil, 559, nil, nil, nil, nil, 559, 559, 559, 559, + 559, 559, nil, nil, nil, 559, 559, nil, nil, nil, + nil, nil, nil, 559, nil, nil, 559, 559, 559, nil, + 559, 559, 583, 583, 583, nil, 583, nil, nil, nil, + 583, 583, nil, nil, nil, 583, nil, 583, 583, 583, + 583, 583, 583, 583, nil, nil, nil, nil, nil, 583, + 583, 583, 583, 583, 583, 583, nil, nil, 583, nil, + nil, nil, nil, nil, nil, 583, nil, nil, 583, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, + nil, 583, 583, nil, 583, 583, 583, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 583, nil, nil, 583, + nil, nil, 583, 583, nil, nil, 583, nil, 583, nil, + 583, nil, 583, nil, nil, nil, nil, nil, nil, nil, + 583, nil, nil, nil, nil, 583, 583, 583, 583, 583, + 583, nil, nil, nil, 583, 583, nil, nil, nil, nil, + nil, nil, 583, nil, 583, 583, 583, 583, nil, 583, + 583, 593, 593, 593, nil, 593, nil, nil, nil, 593, + 593, nil, nil, nil, 593, nil, 593, 593, 593, 593, + 593, 593, 593, nil, nil, nil, nil, nil, 593, 593, + 593, 593, 593, 593, 593, nil, nil, 593, nil, nil, + nil, nil, nil, nil, 593, nil, nil, 593, 593, 593, + 593, 593, 593, 593, 593, 593, 593, 593, 593, nil, + 593, 593, nil, 593, 593, 593, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 593, nil, nil, 593, nil, + nil, 593, 593, nil, nil, 593, nil, 593, nil, 593, + nil, 593, nil, nil, nil, nil, nil, nil, nil, 593, + nil, nil, nil, nil, 593, 593, 593, 593, 593, 593, + nil, nil, nil, 593, 593, nil, nil, nil, nil, nil, + nil, 593, nil, 593, 593, 593, 593, nil, 593, 593, + 603, 603, 603, nil, 603, nil, nil, nil, 603, 603, + nil, nil, nil, 603, nil, 603, 603, 603, 603, 603, + 603, 603, nil, nil, nil, nil, nil, 603, 603, 603, + 603, 603, 603, 603, nil, nil, 603, nil, nil, nil, + nil, nil, nil, 603, nil, nil, 603, 603, 603, 603, + 603, 603, 603, 603, nil, 603, 603, 603, nil, 603, + 603, nil, 603, 603, 603, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 603, nil, nil, 603, nil, nil, + 603, 603, nil, nil, 603, nil, nil, nil, nil, nil, + 603, nil, nil, nil, nil, nil, nil, nil, 603, nil, + nil, nil, nil, 603, 603, 603, 603, 603, 603, nil, + nil, nil, 603, 603, nil, nil, nil, nil, nil, nil, + 603, nil, nil, 603, 603, 603, nil, 603, 603, 625, + 625, 625, nil, 625, nil, nil, nil, 625, 625, nil, + nil, nil, 625, nil, 625, 625, 625, 625, 625, 625, + 625, nil, nil, nil, nil, nil, 625, 625, 625, 625, + 625, 625, 625, nil, nil, 625, nil, nil, nil, nil, + nil, nil, 625, nil, nil, 625, 625, 625, 625, 625, + 625, 625, 625, nil, 625, 625, 625, nil, 625, 625, + nil, 625, 625, 625, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 625, nil, nil, 625, nil, nil, 625, + 625, nil, nil, 625, nil, nil, nil, nil, nil, 625, + nil, nil, nil, nil, nil, nil, nil, 625, nil, nil, + nil, nil, 625, 625, 625, 625, 625, 625, nil, nil, + nil, 625, 625, nil, nil, nil, nil, nil, nil, 625, + nil, nil, 625, 625, 625, nil, 625, 625, 665, 665, + 665, nil, 665, nil, nil, nil, 665, 665, nil, nil, + nil, 665, nil, 665, 665, 665, 665, 665, 665, 665, + nil, nil, nil, nil, nil, 665, 665, 665, 665, 665, + 665, 665, nil, nil, 665, nil, nil, nil, nil, nil, + nil, 665, nil, nil, 665, 665, 665, 665, 665, 665, + 665, 665, nil, 665, 665, 665, nil, 665, 665, nil, + 665, 665, 665, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 665, nil, nil, 665, nil, nil, 665, 665, + nil, nil, 665, nil, 665, nil, nil, nil, 665, nil, + nil, nil, nil, nil, nil, nil, 665, nil, nil, nil, + nil, 665, 665, 665, 665, 665, 665, nil, nil, nil, + 665, 665, nil, nil, nil, nil, nil, nil, 665, nil, + nil, 665, 665, 665, nil, 665, 665, 666, 666, 666, + nil, 666, nil, nil, nil, 666, 666, nil, nil, nil, + 666, nil, 666, 666, 666, 666, 666, 666, 666, nil, + nil, nil, nil, nil, 666, 666, 666, 666, 666, 666, + 666, nil, nil, 666, nil, nil, nil, nil, nil, nil, + 666, nil, nil, 666, 666, 666, 666, 666, 666, 666, + 666, nil, 666, 666, 666, nil, 666, 666, nil, 666, + 666, 666, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 666, nil, nil, 666, nil, nil, 666, 666, nil, + nil, 666, nil, nil, nil, nil, nil, 666, nil, nil, + nil, nil, nil, nil, nil, 666, nil, nil, nil, nil, + 666, 666, 666, 666, 666, 666, nil, nil, nil, 666, + 666, nil, nil, nil, nil, nil, nil, 666, nil, nil, + 666, 666, 666, nil, 666, 666, 667, 667, 667, nil, + 667, nil, nil, nil, 667, 667, nil, nil, nil, 667, + nil, 667, 667, 667, 667, 667, 667, 667, nil, nil, + nil, nil, nil, 667, 667, 667, 667, 667, 667, 667, + nil, nil, 667, nil, nil, nil, nil, nil, nil, 667, + nil, nil, 667, 667, 667, 667, 667, 667, 667, 667, + 667, 667, 667, 667, nil, 667, 667, nil, 667, 667, + 667, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 667, nil, nil, 667, nil, nil, 667, 667, nil, nil, + 667, nil, 667, nil, 667, nil, 667, nil, nil, nil, + nil, nil, nil, nil, 667, nil, nil, nil, nil, 667, + 667, 667, 667, 667, 667, nil, nil, nil, 667, 667, + nil, nil, nil, nil, nil, nil, 667, nil, 667, 667, + 667, 667, nil, 667, 667, 670, 670, 670, 670, 670, + nil, nil, nil, 670, 670, nil, nil, nil, 670, nil, + 670, 670, 670, 670, 670, 670, 670, nil, nil, nil, + nil, nil, 670, 670, 670, 670, 670, 670, 670, nil, + nil, 670, nil, nil, nil, nil, nil, 670, 670, nil, + 670, 670, 670, 670, 670, 670, 670, 670, 670, nil, + 670, 670, 670, nil, 670, 670, nil, 670, 670, 670, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 670, + nil, nil, 670, nil, nil, 670, 670, nil, nil, 670, + nil, 670, nil, nil, nil, 670, nil, nil, nil, nil, + nil, nil, nil, 670, nil, nil, nil, nil, 670, 670, + 670, 670, 670, 670, nil, nil, nil, 670, 670, nil, + nil, nil, nil, nil, nil, 670, nil, nil, 670, 670, + 670, nil, 670, 670, 671, 671, 671, nil, 671, nil, + nil, nil, 671, 671, nil, nil, nil, 671, nil, 671, + 671, 671, 671, 671, 671, 671, nil, nil, nil, nil, + nil, 671, 671, 671, 671, 671, 671, 671, nil, nil, + 671, nil, nil, nil, nil, nil, nil, 671, nil, nil, + 671, 671, 671, 671, 671, 671, 671, 671, nil, 671, + 671, 671, nil, 671, 671, nil, 671, 671, 671, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 671, nil, + nil, 671, nil, nil, 671, 671, nil, nil, 671, nil, + nil, nil, nil, nil, 671, nil, nil, nil, nil, nil, + nil, nil, 671, nil, nil, nil, nil, 671, 671, 671, + 671, 671, 671, nil, nil, nil, 671, 671, nil, nil, + nil, nil, nil, nil, 671, nil, nil, 671, 671, 671, + nil, 671, 671, 674, 674, 674, nil, 674, nil, nil, + nil, 674, 674, nil, nil, nil, 674, nil, 674, 674, + 674, 674, 674, 674, 674, nil, nil, nil, nil, nil, + 674, 674, 674, 674, 674, 674, 674, nil, nil, 674, + nil, nil, nil, nil, nil, nil, 674, nil, nil, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, nil, 674, 674, nil, 674, 674, 674, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 674, nil, nil, + 674, nil, nil, 674, 674, nil, nil, 674, nil, 674, + nil, 674, nil, 674, nil, nil, nil, nil, nil, nil, + nil, 674, nil, nil, nil, nil, 674, 674, 674, 674, + 674, 674, nil, nil, nil, 674, 674, nil, nil, nil, + nil, nil, nil, 674, nil, 674, 674, 674, 674, nil, + 674, 674, 675, 675, 675, nil, 675, nil, nil, nil, + 675, 675, nil, nil, nil, 675, nil, 675, 675, 675, + 675, 675, 675, 675, nil, nil, nil, nil, nil, 675, + 675, 675, 675, 675, 675, 675, nil, nil, 675, nil, + nil, nil, nil, nil, nil, 675, nil, nil, 675, 675, + 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, + nil, 675, 675, nil, 675, 675, 675, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 675, nil, nil, 675, + nil, nil, 675, 675, nil, nil, 675, nil, nil, nil, + 675, nil, 675, nil, nil, nil, nil, nil, nil, nil, + 675, nil, nil, nil, nil, 675, 675, 675, 675, 675, + 675, nil, nil, nil, 675, 675, nil, nil, nil, nil, + nil, nil, 675, nil, 675, 675, 675, 675, nil, 675, + 675, 676, 676, 676, nil, 676, nil, nil, nil, 676, + 676, nil, nil, nil, 676, nil, 676, 676, 676, 676, + 676, 676, 676, nil, nil, nil, nil, nil, 676, 676, + 676, 676, 676, 676, 676, nil, nil, 676, nil, nil, + nil, nil, nil, nil, 676, nil, nil, 676, 676, 676, + 676, 676, 676, 676, 676, nil, 676, 676, 676, nil, + 676, 676, nil, 676, 676, 676, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 676, nil, nil, 676, nil, + nil, 676, 676, nil, nil, 676, nil, nil, nil, nil, + nil, 676, nil, nil, nil, nil, nil, nil, nil, 676, + nil, nil, nil, nil, 676, 676, 676, 676, 676, 676, + nil, nil, nil, 676, 676, nil, nil, nil, nil, nil, + nil, 676, nil, nil, 676, 676, 676, nil, 676, 676, + 677, 677, 677, nil, 677, nil, nil, nil, 677, 677, + nil, nil, nil, 677, nil, 677, 677, 677, 677, 677, + 677, 677, nil, nil, nil, nil, nil, 677, 677, 677, + 677, 677, 677, 677, nil, nil, 677, nil, nil, nil, + nil, nil, nil, 677, nil, nil, 677, 677, 677, 677, + 677, 677, 677, 677, nil, 677, 677, 677, nil, 677, + 677, nil, 677, 677, 677, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 677, nil, nil, 677, nil, nil, + 677, 677, nil, nil, 677, nil, nil, nil, nil, nil, + 677, nil, nil, nil, nil, nil, nil, nil, 677, nil, + nil, nil, nil, 677, 677, 677, 677, 677, 677, nil, + nil, nil, 677, 677, nil, nil, nil, nil, nil, nil, + 677, nil, nil, 677, 677, 677, nil, 677, 677, 682, + 682, 682, nil, 682, nil, nil, nil, 682, 682, nil, + nil, nil, 682, nil, 682, 682, 682, 682, 682, 682, + 682, nil, nil, nil, nil, nil, 682, 682, 682, 682, + 682, 682, 682, nil, nil, 682, nil, nil, nil, nil, + nil, nil, 682, nil, nil, 682, 682, 682, 682, 682, + 682, 682, 682, nil, 682, 682, 682, nil, 682, 682, + nil, 682, 682, 682, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 682, nil, nil, 682, nil, nil, 682, + 682, nil, nil, 682, nil, nil, nil, nil, nil, 682, + nil, nil, nil, nil, nil, nil, nil, 682, nil, nil, + nil, nil, 682, 682, 682, 682, 682, 682, nil, nil, + nil, 682, 682, nil, nil, nil, nil, nil, nil, 682, + nil, nil, 682, 682, 682, nil, 682, 682, 683, 683, + 683, nil, 683, nil, nil, nil, 683, 683, nil, nil, + nil, 683, nil, 683, 683, 683, 683, 683, 683, 683, + nil, nil, nil, nil, nil, 683, 683, 683, 683, 683, + 683, 683, nil, nil, 683, nil, nil, nil, nil, nil, + nil, 683, nil, nil, 683, 683, 683, 683, 683, 683, + 683, 683, nil, 683, 683, 683, nil, 683, 683, nil, + 683, 683, 683, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 683, nil, nil, 683, nil, nil, 683, 683, + nil, nil, 683, nil, nil, nil, nil, nil, 683, nil, + nil, nil, nil, nil, nil, nil, 683, nil, nil, nil, + nil, 683, 683, 683, 683, 683, 683, nil, nil, nil, + 683, 683, nil, nil, nil, nil, nil, nil, 683, nil, + nil, 683, 683, 683, nil, 683, 683, 707, 707, 707, + nil, 707, nil, nil, nil, 707, 707, nil, nil, nil, + 707, nil, 707, 707, 707, 707, 707, 707, 707, nil, + nil, nil, nil, nil, 707, 707, 707, 707, 707, 707, + 707, nil, nil, 707, nil, nil, nil, nil, nil, nil, + 707, nil, nil, 707, 707, 707, 707, 707, 707, 707, + 707, nil, 707, 707, 707, nil, 707, 707, nil, 707, + 707, 707, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 707, nil, nil, 707, nil, nil, 707, 707, nil, + nil, 707, nil, nil, nil, nil, nil, 707, nil, nil, + nil, nil, nil, nil, nil, 707, nil, nil, nil, nil, + 707, 707, 707, 707, 707, 707, nil, nil, nil, 707, + 707, nil, nil, nil, nil, nil, nil, 707, nil, nil, + 707, 707, 707, nil, 707, 707, 710, 710, 710, nil, + 710, nil, nil, nil, 710, 710, nil, nil, nil, 710, + nil, 710, 710, 710, 710, 710, 710, 710, nil, nil, + nil, nil, nil, 710, 710, 710, 710, 710, 710, 710, + nil, nil, 710, nil, nil, nil, nil, nil, nil, 710, + nil, nil, 710, 710, 710, 710, 710, 710, 710, 710, + nil, 710, 710, 710, nil, 710, 710, nil, 710, 710, + 710, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 710, nil, nil, 710, nil, nil, 710, 710, nil, nil, + 710, nil, nil, nil, nil, nil, 710, nil, nil, nil, + nil, nil, nil, nil, 710, nil, nil, nil, nil, 710, + 710, 710, 710, 710, 710, nil, nil, nil, 710, 710, + nil, nil, nil, nil, nil, nil, 710, nil, nil, 710, + 710, 710, nil, 710, 710, 714, 714, 714, nil, 714, + nil, nil, nil, 714, 714, nil, nil, nil, 714, nil, + 714, 714, 714, 714, 714, 714, 714, nil, nil, nil, + nil, nil, 714, 714, 714, 714, 714, 714, 714, nil, + nil, 714, nil, nil, nil, nil, nil, nil, 714, nil, + nil, 714, 714, 714, 714, 714, 714, 714, 714, nil, + 714, 714, 714, nil, 714, 714, nil, nil, nil, 714, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 714, + nil, nil, 714, nil, nil, 714, 714, nil, nil, 714, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 714, 714, + 714, 714, 714, 714, nil, nil, nil, 714, 714, nil, + nil, nil, nil, nil, nil, 714, nil, nil, 714, 714, + 714, nil, 714, 714, 725, 725, 725, nil, 725, nil, + nil, nil, 725, 725, nil, nil, nil, 725, nil, 725, + 725, 725, 725, 725, 725, 725, nil, nil, nil, nil, + nil, 725, 725, 725, 725, 725, 725, 725, nil, nil, + 725, nil, nil, nil, nil, nil, nil, 725, nil, nil, + 725, 725, 725, 725, 725, 725, 725, 725, nil, 725, + 725, 725, nil, 725, 725, nil, nil, nil, 725, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 725, nil, + nil, 725, nil, nil, 725, 725, nil, nil, 725, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 725, 725, 725, + 725, 725, 725, nil, nil, nil, 725, 725, nil, nil, + nil, nil, nil, nil, 725, nil, nil, 725, 725, 725, + nil, 725, 725, 731, 731, 731, nil, 731, nil, nil, + nil, 731, 731, nil, nil, nil, 731, nil, 731, 731, + 731, 731, 731, 731, 731, nil, nil, nil, nil, nil, + 731, 731, 731, 731, 731, 731, 731, nil, nil, 731, + nil, nil, nil, nil, nil, nil, 731, nil, nil, 731, + 731, 731, 731, 731, 731, 731, 731, nil, 731, 731, + 731, nil, 731, 731, nil, 731, 731, 731, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 731, nil, nil, + 731, nil, nil, 731, 731, nil, nil, 731, nil, 731, + nil, nil, nil, 731, nil, nil, nil, nil, nil, nil, + nil, 731, nil, nil, nil, nil, 731, 731, 731, 731, + 731, 731, nil, nil, nil, 731, 731, nil, nil, nil, + nil, nil, nil, 731, nil, nil, 731, 731, 731, nil, + 731, 731, 736, 736, 736, nil, 736, nil, nil, nil, + 736, 736, nil, nil, nil, 736, nil, 736, 736, 736, + 736, 736, 736, 736, nil, nil, nil, nil, nil, 736, + 736, 736, 736, 736, 736, 736, nil, nil, 736, nil, + nil, nil, nil, nil, nil, 736, nil, nil, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, + nil, 736, 736, nil, 736, 736, 736, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 736, nil, nil, 736, + nil, nil, 736, 736, nil, nil, 736, nil, 736, nil, + nil, nil, 736, nil, nil, nil, nil, nil, nil, nil, + 736, nil, nil, nil, nil, 736, 736, 736, 736, 736, + 736, nil, nil, nil, 736, 736, nil, nil, nil, nil, + nil, nil, 736, nil, 736, 736, 736, 736, nil, 736, + 736, 739, 739, 739, nil, 739, nil, nil, nil, 739, + 739, nil, nil, nil, 739, nil, 739, 739, 739, 739, + 739, 739, 739, nil, nil, nil, nil, nil, 739, 739, + 739, 739, 739, 739, 739, nil, nil, 739, nil, nil, + nil, nil, nil, nil, 739, nil, nil, 739, 739, 739, + 739, 739, 739, 739, 739, 739, 739, 739, 739, nil, + 739, 739, nil, 739, 739, 739, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 739, nil, nil, 739, nil, + nil, 739, 739, nil, nil, 739, nil, nil, nil, nil, + nil, 739, nil, nil, nil, nil, nil, nil, nil, 739, + nil, nil, nil, nil, 739, 739, 739, 739, 739, 739, + nil, nil, nil, 739, 739, nil, nil, nil, nil, nil, + nil, 739, nil, 739, 739, 739, 739, nil, 739, 739, + 753, 753, 753, nil, 753, nil, nil, nil, 753, 753, + nil, nil, nil, 753, nil, 753, 753, 753, 753, 753, + 753, 753, nil, nil, nil, nil, nil, 753, 753, 753, + 753, 753, 753, 753, nil, nil, 753, nil, nil, nil, + nil, nil, nil, 753, nil, nil, 753, 753, 753, 753, + 753, 753, 753, 753, nil, 753, 753, 753, nil, 753, + 753, nil, 753, 753, 753, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 753, nil, nil, 753, nil, nil, + 753, 753, nil, nil, 753, nil, 753, nil, nil, nil, + 753, nil, nil, nil, nil, nil, nil, nil, 753, nil, + nil, nil, nil, 753, 753, 753, 753, 753, 753, nil, + nil, nil, 753, 753, nil, nil, nil, nil, nil, nil, + 753, nil, nil, 753, 753, 753, nil, 753, 753, 765, + 765, 765, nil, 765, nil, nil, nil, 765, 765, nil, + nil, nil, 765, nil, 765, 765, 765, 765, 765, 765, + 765, nil, nil, nil, nil, nil, 765, 765, 765, 765, + 765, 765, 765, nil, nil, 765, nil, nil, nil, nil, + nil, nil, 765, nil, nil, 765, 765, 765, 765, 765, + 765, 765, 765, nil, 765, 765, 765, nil, 765, 765, + nil, 765, 765, 765, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 765, nil, nil, 765, nil, nil, 765, + 765, nil, nil, 765, nil, nil, nil, nil, nil, 765, + nil, nil, nil, nil, nil, nil, nil, 765, nil, nil, + nil, nil, 765, 765, 765, 765, 765, 765, nil, nil, + nil, 765, 765, nil, nil, nil, nil, nil, nil, 765, + nil, nil, 765, 765, 765, nil, 765, 765, 785, 785, + 785, nil, 785, nil, nil, nil, 785, 785, nil, nil, + nil, 785, nil, 785, 785, 785, 785, 785, 785, 785, + nil, nil, nil, nil, nil, 785, 785, 785, 785, 785, + 785, 785, nil, nil, 785, nil, nil, nil, nil, nil, + nil, 785, nil, nil, 785, 785, 785, 785, 785, 785, + 785, 785, nil, 785, 785, 785, nil, 785, 785, nil, + 785, 785, 785, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 785, nil, nil, 785, nil, nil, 785, 785, + nil, nil, 785, nil, nil, nil, nil, nil, 785, nil, + nil, nil, nil, nil, nil, nil, 785, nil, nil, nil, + nil, 785, 785, 785, 785, 785, 785, nil, nil, nil, + 785, 785, nil, nil, nil, nil, nil, nil, 785, nil, + nil, 785, 785, 785, nil, 785, 785, 807, 807, 807, + nil, 807, nil, nil, nil, 807, 807, nil, nil, nil, + 807, nil, 807, 807, 807, 807, 807, 807, 807, nil, + nil, nil, nil, nil, 807, 807, 807, 807, 807, 807, + 807, nil, nil, 807, nil, nil, nil, nil, nil, nil, + 807, nil, nil, 807, 807, 807, 807, 807, 807, 807, + 807, nil, 807, 807, 807, nil, 807, 807, nil, 807, + 807, 807, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 807, nil, nil, 807, nil, nil, 807, 807, nil, + nil, 807, nil, nil, nil, nil, nil, 807, nil, nil, + nil, nil, nil, nil, nil, 807, nil, nil, nil, nil, + 807, 807, 807, 807, 807, 807, nil, nil, nil, 807, + 807, nil, nil, nil, nil, nil, nil, 807, nil, nil, + 807, 807, 807, nil, 807, 807, 815, 815, 815, nil, + 815, nil, nil, nil, 815, 815, nil, nil, nil, 815, + nil, 815, 815, 815, 815, 815, 815, 815, nil, nil, + nil, nil, nil, 815, 815, 815, 815, 815, 815, 815, + nil, nil, 815, nil, nil, nil, nil, nil, nil, 815, + nil, nil, 815, 815, 815, 815, 815, 815, 815, 815, + nil, 815, 815, 815, nil, 815, 815, nil, 815, 815, + 815, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 815, nil, nil, 815, nil, nil, 815, 815, nil, nil, + 815, nil, nil, nil, nil, nil, 815, nil, nil, nil, + nil, nil, nil, nil, 815, nil, nil, nil, nil, 815, + 815, 815, 815, 815, 815, nil, nil, nil, 815, 815, + nil, nil, nil, nil, nil, nil, 815, nil, nil, 815, + 815, 815, nil, 815, 815, 828, 828, 828, nil, 828, + nil, nil, nil, 828, 828, nil, nil, nil, 828, nil, + 828, 828, 828, 828, 828, 828, 828, nil, nil, nil, + nil, nil, 828, 828, 828, 828, 828, 828, 828, nil, + nil, 828, nil, nil, nil, nil, nil, nil, 828, nil, + nil, 828, 828, 828, 828, 828, 828, 828, 828, nil, + 828, 828, 828, nil, 828, 828, nil, 828, 828, 828, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 828, + nil, nil, 828, nil, nil, 828, 828, nil, nil, 828, + nil, nil, nil, nil, nil, 828, nil, nil, nil, nil, + nil, nil, nil, 828, nil, nil, nil, nil, 828, 828, + 828, 828, 828, 828, nil, nil, nil, 828, 828, nil, + nil, nil, nil, nil, nil, 828, nil, nil, 828, 828, + 828, nil, 828, 828, 829, 829, 829, nil, 829, nil, + nil, nil, 829, 829, nil, nil, nil, 829, nil, 829, + 829, 829, 829, 829, 829, 829, nil, nil, nil, nil, + nil, 829, 829, 829, 829, 829, 829, 829, nil, nil, + 829, nil, nil, nil, nil, nil, nil, 829, nil, nil, + 829, 829, 829, 829, 829, 829, 829, 829, nil, 829, + 829, 829, nil, 829, 829, nil, 829, 829, 829, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 829, nil, + nil, 829, nil, nil, 829, 829, nil, nil, 829, nil, + nil, nil, nil, nil, 829, nil, nil, nil, nil, nil, + nil, nil, 829, nil, nil, nil, nil, 829, 829, 829, + 829, 829, 829, nil, nil, nil, 829, 829, nil, nil, + nil, nil, nil, nil, 829, nil, nil, 829, 829, 829, + nil, 829, 829, 830, 830, 830, nil, 830, nil, nil, + nil, 830, 830, nil, nil, nil, 830, nil, 830, 830, + 830, 830, 830, 830, 830, nil, nil, nil, nil, nil, + 830, 830, 830, 830, 830, 830, 830, nil, nil, 830, + nil, nil, nil, nil, nil, nil, 830, nil, nil, 830, + 830, 830, 830, 830, 830, 830, 830, nil, 830, 830, + 830, nil, 830, 830, nil, 830, 830, 830, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 830, nil, nil, + 830, nil, nil, 830, 830, nil, nil, 830, nil, nil, + nil, nil, nil, 830, nil, nil, nil, nil, nil, nil, + nil, 830, nil, nil, nil, nil, 830, 830, 830, 830, + 830, 830, nil, nil, nil, 830, 830, nil, nil, nil, + nil, nil, nil, 830, nil, nil, 830, 830, 830, nil, + 830, 830, 831, 831, 831, nil, 831, nil, nil, nil, + 831, 831, nil, nil, nil, 831, nil, 831, 831, 831, + 831, 831, 831, 831, nil, nil, nil, nil, nil, 831, + 831, 831, 831, 831, 831, 831, nil, nil, 831, nil, + nil, nil, nil, nil, nil, 831, nil, nil, 831, 831, + 831, 831, 831, 831, 831, 831, nil, 831, 831, 831, + nil, 831, 831, nil, 831, 831, 831, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 831, nil, nil, 831, + nil, nil, 831, 831, nil, nil, 831, nil, nil, nil, + nil, nil, 831, nil, nil, nil, nil, nil, nil, nil, + 831, nil, nil, nil, nil, 831, 831, 831, 831, 831, + 831, nil, nil, nil, 831, 831, nil, nil, nil, nil, + nil, nil, 831, nil, nil, 831, 831, 831, nil, 831, + 831, 833, 833, 833, nil, 833, nil, nil, nil, 833, + 833, nil, nil, nil, 833, nil, 833, 833, 833, 833, + 833, 833, 833, nil, nil, nil, nil, nil, 833, 833, + 833, 833, 833, 833, 833, nil, nil, 833, nil, nil, + nil, nil, nil, nil, 833, nil, nil, 833, 833, 833, + 833, 833, 833, 833, 833, nil, 833, 833, 833, nil, + 833, 833, nil, 833, 833, 833, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 833, nil, nil, 833, nil, + nil, 833, 833, nil, nil, 833, nil, nil, nil, nil, + nil, 833, nil, nil, nil, nil, nil, nil, nil, 833, + nil, nil, nil, nil, 833, 833, 833, 833, 833, 833, + nil, nil, nil, 833, 833, nil, nil, nil, nil, nil, + nil, 833, nil, nil, 833, 833, 833, nil, 833, 833, + 866, 866, 866, nil, 866, nil, nil, nil, 866, 866, + nil, nil, nil, 866, nil, 866, 866, 866, 866, 866, + 866, 866, nil, nil, nil, nil, nil, 866, 866, 866, + 866, 866, 866, 866, nil, nil, 866, nil, nil, nil, + nil, nil, nil, 866, nil, nil, 866, 866, 866, 866, + 866, 866, 866, 866, nil, 866, 866, 866, nil, 866, + 866, nil, 866, 866, 866, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 866, nil, nil, 866, nil, nil, + 866, 866, nil, nil, 866, nil, nil, nil, nil, nil, + 866, nil, nil, nil, nil, nil, nil, nil, 866, nil, + nil, nil, nil, 866, 866, 866, 866, 866, 866, nil, + nil, nil, 866, 866, nil, nil, nil, nil, nil, nil, + 866, nil, nil, 866, 866, 866, nil, 866, 866, 873, + 873, 873, nil, 873, nil, nil, nil, 873, 873, nil, + nil, nil, 873, nil, 873, 873, 873, 873, 873, 873, + 873, nil, nil, nil, nil, nil, 873, 873, 873, 873, + 873, 873, 873, nil, nil, 873, nil, nil, nil, nil, + nil, nil, 873, nil, nil, 873, 873, 873, 873, 873, + 873, 873, 873, nil, 873, 873, 873, nil, 873, 873, + nil, 873, 873, 873, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 873, nil, nil, 873, nil, nil, 873, + 873, nil, nil, 873, nil, nil, nil, nil, nil, 873, + nil, nil, nil, nil, nil, nil, nil, 873, nil, nil, + nil, nil, 873, 873, 873, 873, 873, 873, nil, nil, + nil, 873, 873, nil, nil, nil, nil, nil, nil, 873, + nil, nil, 873, 873, 873, nil, 873, 873, 921, 921, + 921, nil, 921, nil, nil, nil, 921, 921, nil, nil, + nil, 921, nil, 921, 921, 921, 921, 921, 921, 921, + nil, nil, nil, nil, nil, 921, 921, 921, 921, 921, + 921, 921, nil, nil, 921, nil, nil, nil, nil, nil, + nil, 921, nil, nil, 921, 921, 921, 921, 921, 921, + 921, 921, 921, 921, 921, 921, nil, 921, 921, nil, + 921, 921, 921, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 921, nil, nil, 921, nil, nil, 921, 921, + nil, nil, 921, nil, nil, nil, 921, nil, 921, nil, + nil, nil, nil, nil, nil, nil, 921, nil, nil, nil, + nil, 921, 921, 921, 921, 921, 921, nil, nil, nil, + 921, 921, nil, nil, nil, nil, nil, nil, 921, nil, + 921, 921, 921, 921, nil, 921, 921, 922, 922, 922, + nil, 922, nil, nil, nil, 922, 922, nil, nil, nil, + 922, nil, 922, 922, 922, 922, 922, 922, 922, nil, + nil, nil, nil, nil, 922, 922, 922, 922, 922, 922, + 922, nil, nil, 922, nil, nil, nil, nil, nil, nil, + 922, nil, nil, 922, 922, 922, 922, 922, 922, 922, + 922, nil, 922, 922, 922, nil, 922, 922, nil, 922, + 922, 922, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 922, nil, nil, 922, nil, nil, 922, 922, nil, + nil, 922, nil, nil, nil, nil, nil, 922, nil, nil, + nil, nil, nil, nil, nil, 922, nil, nil, nil, nil, + 922, 922, 922, 922, 922, 922, nil, nil, nil, 922, + 922, nil, nil, nil, nil, nil, nil, 922, nil, nil, + 922, 922, 922, nil, 922, 922, 934, 934, 934, nil, + 934, nil, nil, nil, 934, 934, nil, nil, nil, 934, + nil, 934, 934, 934, 934, 934, 934, 934, nil, nil, + nil, nil, nil, 934, 934, 934, 934, 934, 934, 934, + nil, nil, 934, nil, nil, nil, nil, nil, nil, 934, + nil, nil, 934, 934, 934, 934, 934, 934, 934, 934, + nil, 934, 934, 934, nil, 934, 934, nil, nil, nil, + 934, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 934, nil, nil, 934, nil, nil, 934, 934, nil, nil, + 934, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 934, + 934, 934, 934, 934, 934, nil, nil, nil, 934, 934, + nil, nil, nil, nil, nil, nil, 934, nil, nil, 934, + 934, 934, nil, 934, 934, 943, 943, 943, nil, 943, + nil, nil, nil, 943, 943, nil, nil, nil, 943, nil, + 943, 943, 943, 943, 943, 943, 943, nil, nil, nil, + nil, nil, 943, 943, 943, 943, 943, 943, 943, nil, + nil, 943, nil, nil, nil, nil, nil, nil, 943, nil, + nil, 943, 943, 943, 943, 943, 943, 943, 943, nil, + 943, 943, 943, nil, 943, 943, nil, nil, nil, 943, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 943, + nil, nil, 943, nil, nil, 943, 943, nil, nil, 943, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 943, 943, + 943, 943, 943, 943, nil, nil, nil, 943, 943, nil, + nil, nil, nil, nil, nil, 943, nil, nil, 943, 943, + 943, nil, 943, 943, 951, 951, 951, nil, 951, nil, + nil, nil, 951, 951, nil, nil, nil, 951, nil, 951, + 951, 951, 951, 951, 951, 951, nil, nil, nil, nil, + nil, 951, 951, 951, 951, 951, 951, 951, nil, nil, + 951, nil, nil, nil, nil, nil, nil, 951, nil, nil, + 951, 951, 951, 951, 951, 951, 951, 951, nil, 951, + 951, 951, nil, 951, 951, nil, 951, 951, 951, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 951, nil, + nil, 951, nil, nil, 951, 951, nil, nil, 951, nil, + 951, nil, nil, nil, 951, nil, nil, nil, nil, nil, + nil, nil, 951, nil, nil, nil, nil, 951, 951, 951, + 951, 951, 951, nil, nil, nil, 951, 951, nil, nil, + nil, nil, nil, nil, 951, nil, nil, 951, 951, 951, + nil, 951, 951, 992, 992, 992, nil, 992, nil, nil, + nil, 992, 992, nil, nil, nil, 992, nil, 992, 992, + 992, 992, 992, 992, 992, nil, nil, nil, nil, nil, + 992, 992, 992, 992, 992, 992, 992, nil, nil, 992, + nil, nil, nil, nil, nil, nil, 992, nil, nil, 992, + 992, 992, 992, 992, 992, 992, 992, nil, 992, 992, + 992, nil, 992, 992, nil, nil, nil, 992, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 992, nil, nil, + 992, nil, nil, 992, 992, nil, nil, 992, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 992, 992, 992, 992, + 992, 992, nil, nil, nil, 992, 992, nil, nil, nil, + nil, nil, nil, 992, nil, nil, 992, 992, 992, nil, + 992, 992, 1006, 1006, 1006, nil, 1006, nil, nil, nil, + 1006, 1006, nil, nil, nil, 1006, nil, 1006, 1006, 1006, + 1006, 1006, 1006, 1006, nil, nil, nil, nil, nil, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, nil, nil, 1006, nil, + nil, nil, nil, nil, nil, 1006, nil, nil, 1006, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, nil, 1006, 1006, 1006, + nil, 1006, 1006, nil, 1006, 1006, 1006, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1006, nil, nil, 1006, + nil, nil, 1006, 1006, nil, nil, 1006, nil, nil, nil, + nil, nil, 1006, nil, nil, nil, nil, nil, nil, nil, + 1006, nil, nil, nil, nil, 1006, 1006, 1006, 1006, 1006, + 1006, nil, nil, nil, 1006, 1006, nil, nil, nil, nil, + nil, nil, 1006, nil, nil, 1006, 1006, 1006, nil, 1006, + 1006, 1037, 1037, 1037, nil, 1037, nil, nil, nil, 1037, + 1037, nil, nil, nil, 1037, nil, 1037, 1037, 1037, 1037, + 1037, 1037, 1037, nil, nil, nil, nil, nil, 1037, 1037, + 1037, 1037, 1037, 1037, 1037, nil, nil, 1037, nil, nil, + nil, nil, nil, nil, 1037, nil, nil, 1037, 1037, 1037, + 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, nil, + 1037, 1037, nil, 1037, 1037, 1037, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1037, nil, nil, 1037, nil, + nil, 1037, 1037, nil, nil, 1037, nil, 1037, nil, 1037, + nil, 1037, nil, nil, nil, nil, nil, nil, nil, 1037, + nil, nil, nil, nil, 1037, 1037, 1037, 1037, 1037, 1037, + nil, nil, nil, 1037, 1037, nil, nil, nil, nil, nil, + nil, 1037, nil, 1037, 1037, 1037, 1037, nil, 1037, 1037, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, nil, nil, nil, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, nil, nil, nil, + nil, nil, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, nil, 11, nil, nil, nil, nil, nil, nil, + nil, nil, 11, 11, nil, 11, 11, 11, 11, 11, + 11, 11, nil, nil, 11, 11, nil, nil, nil, 11, + 11, 11, 11, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 11, 11, nil, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + nil, nil, 11, 11, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 11, nil, nil, nil, nil, nil, nil, + nil, nil, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, nil, nil, nil, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + nil, nil, nil, nil, nil, 12, 12, 12, 12, 12, + 12, 12, 12, 12, nil, nil, 12, nil, nil, nil, + nil, nil, nil, nil, nil, 12, 12, nil, 12, 12, + 12, 12, 12, 12, 12, nil, nil, 12, 12, nil, + nil, nil, 12, 12, 12, 12, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 12, + 12, nil, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, nil, nil, 12, 12, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 12, nil, nil, nil, + nil, nil, nil, nil, nil, 12, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + nil, nil, nil, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, nil, nil, nil, nil, nil, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + nil, 75, nil, nil, nil, nil, nil, nil, 75, 75, + nil, 75, 75, 75, 75, 75, 75, 75, nil, nil, + 75, 75, nil, nil, nil, 75, 75, 75, 75, nil, + nil, nil, nil, nil, 75, nil, nil, nil, nil, nil, + nil, nil, 75, 75, nil, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, nil, nil, 75, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 75, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, nil, nil, nil, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, nil, nil, nil, nil, + nil, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, nil, 105, nil, nil, nil, nil, nil, + nil, 105, 105, nil, 105, 105, 105, 105, 105, 105, + 105, nil, nil, 105, 105, nil, nil, nil, 105, 105, + 105, 105, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 105, nil, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, nil, + nil, 105, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, nil, nil, nil, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, nil, + nil, nil, nil, nil, 428, 428, 428, 428, 428, 428, + 428, 428, 428, nil, nil, 428, nil, nil, nil, nil, + nil, nil, nil, nil, 428, 428, nil, 428, 428, 428, + 428, 428, 428, 428, nil, nil, 428, 428, nil, nil, + nil, 428, 428, 428, 428, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 428, 428, + nil, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, nil, nil, 428, 428, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 428, nil, nil, nil, nil, + nil, nil, nil, nil, 428, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, nil, + nil, nil, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, nil, nil, nil, nil, nil, 662, 662, 662, + 662, 662, 662, 662, 662, 662, nil, nil, 662, nil, + nil, nil, nil, nil, nil, nil, nil, 662, 662, nil, + 662, 662, 662, 662, 662, 662, 662, nil, nil, 662, + 662, nil, nil, nil, 662, 662, 662, 662, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 662, 662, nil, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, nil, nil, 662, 662, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 662, nil, + nil, nil, nil, nil, nil, nil, nil, 662, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, nil, nil, nil, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, nil, nil, nil, nil, nil, + 771, 771, 771, 771, 771, 771, 771, 771, 771, nil, + nil, 771, nil, nil, nil, nil, nil, nil, nil, nil, + 771, 771, nil, 771, 771, 771, 771, 771, 771, 771, + nil, nil, 771, 771, nil, nil, nil, 771, 771, 771, + 771, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 771, 771, nil, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, nil, nil, + 771, nil, nil, nil, nil, 228, 228, nil, nil, 228, + nil, nil, nil, nil, nil, nil, nil, nil, 228, 228, + 771, 228, 228, 228, 228, 228, 228, 228, nil, nil, + 228, 228, nil, nil, nil, 228, 228, 228, 228, nil, + nil, nil, nil, nil, 228, nil, nil, nil, nil, nil, + nil, nil, 228, 228, nil, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, nil, nil, 228, nil, + nil, nil, nil, 229, 229, nil, nil, 229, nil, nil, + nil, nil, nil, nil, nil, nil, 229, 229, 228, 229, + 229, 229, 229, 229, 229, 229, nil, nil, 229, 229, + nil, nil, nil, 229, 229, 229, 229, nil, nil, nil, + nil, nil, 229, nil, nil, nil, nil, nil, nil, nil, + 229, 229, nil, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, nil, nil, 229, nil, nil, nil, + nil, 479, 479, nil, nil, 479, nil, nil, nil, nil, + nil, nil, nil, nil, 479, 479, 229, 479, 479, 479, + 479, 479, 479, 479, nil, nil, 479, 479, nil, nil, + nil, 479, 479, 479, 479, nil, nil, nil, nil, nil, + 479, nil, nil, nil, nil, nil, nil, nil, 479, 479, + nil, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, nil, nil, 479, nil, nil, nil, nil, 480, + 480, nil, nil, 480, nil, nil, nil, nil, nil, nil, + nil, nil, 480, 480, 479, 480, 480, 480, 480, 480, + 480, 480, nil, nil, 480, 480, nil, nil, nil, 480, + 480, 480, 480, nil, nil, nil, nil, nil, 480, nil, + nil, nil, nil, nil, nil, nil, 480, 480, nil, 480, + 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, + nil, nil, 480, nil, nil, nil, nil, 545, 545, nil, + nil, 545, nil, nil, nil, nil, nil, nil, nil, nil, + 545, 545, 480, 545, 545, 545, 545, 545, 545, 545, + nil, nil, 545, 545, nil, nil, nil, 545, 545, 545, + 545, nil, nil, nil, nil, nil, 545, nil, nil, nil, + nil, nil, nil, nil, 545, 545, nil, 545, 545, 545, + 545, 545, 545, 545, 545, 545, 545, 545, nil, nil, + 545, nil, nil, nil, nil, 546, 546, nil, nil, 546, + nil, nil, nil, nil, nil, nil, nil, nil, 546, 546, + 545, 546, 546, 546, 546, 546, 546, 546, nil, nil, + 546, 546, nil, nil, nil, 546, 546, 546, 546, nil, + nil, nil, nil, nil, 546, nil, nil, nil, nil, nil, + nil, nil, 546, 546, nil, 546, 546, 546, 546, 546, + 546, 546, 546, 546, 546, 546, nil, nil, 546, nil, + nil, nil, nil, 555, 555, nil, nil, 555, nil, nil, + nil, nil, nil, nil, nil, nil, 555, 555, 546, 555, + 555, 555, 555, 555, 555, 555, nil, nil, 555, 555, + nil, nil, nil, 555, 555, 555, 555, nil, nil, nil, + nil, nil, 555, nil, nil, nil, nil, nil, nil, nil, + 555, 555, nil, 555, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, nil, nil, 555, nil, nil, nil, + nil, 556, 556, nil, nil, 556, nil, nil, nil, nil, + nil, nil, nil, nil, 556, 556, 555, 556, 556, 556, + 556, 556, 556, 556, nil, nil, 556, 556, nil, nil, + nil, 556, 556, 556, 556, nil, nil, nil, nil, nil, + 556, nil, nil, nil, nil, nil, nil, nil, 556, 556, + nil, 556, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, nil, nil, 556, nil, nil, nil, nil, 584, + 584, nil, nil, 584, nil, nil, nil, nil, nil, nil, + nil, nil, 584, 584, 556, 584, 584, 584, 584, 584, + 584, 584, nil, nil, 584, 584, nil, nil, nil, 584, + 584, 584, 584, nil, nil, nil, nil, nil, 584, nil, + nil, nil, nil, nil, nil, nil, 584, 584, nil, 584, + 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, + nil, nil, 584, nil, nil, nil, nil, 585, 585, nil, + nil, 585, nil, nil, nil, nil, nil, nil, nil, nil, + 585, 585, 584, 585, 585, 585, 585, 585, 585, 585, + nil, nil, 585, 585, nil, nil, nil, 585, 585, 585, + 585, nil, nil, nil, nil, nil, 585, nil, nil, nil, + nil, nil, nil, nil, 585, 585, nil, 585, 585, 585, + 585, 585, 585, 585, 585, 585, 585, 585, nil, nil, + 585, nil, nil, nil, nil, 591, 591, nil, nil, 591, + nil, nil, nil, nil, nil, nil, nil, nil, 591, 591, + 585, 591, 591, 591, 591, 591, 591, 591, nil, nil, + 591, 591, nil, nil, nil, 591, 591, 591, 591, nil, + nil, nil, nil, nil, 591, nil, nil, nil, nil, nil, + nil, nil, 591, 591, nil, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, nil, nil, 591, nil, + nil, nil, nil, 592, 592, nil, nil, 592, nil, nil, + nil, nil, nil, nil, nil, nil, 592, 592, 591, 592, + 592, 592, 592, 592, 592, 592, nil, nil, 592, 592, + nil, nil, nil, 592, 592, 592, 592, nil, nil, nil, + nil, nil, 592, nil, nil, nil, nil, nil, nil, nil, + 592, 592, nil, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, nil, nil, 592, nil, nil, nil, + nil, 668, 668, nil, nil, 668, nil, nil, nil, nil, + nil, nil, nil, nil, 668, 668, 592, 668, 668, 668, + 668, 668, 668, 668, nil, nil, 668, 668, nil, nil, + nil, 668, 668, 668, 668, nil, nil, nil, nil, nil, + 668, nil, nil, nil, nil, nil, nil, nil, 668, 668, + nil, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 668, nil, nil, 668, nil, nil, nil, nil, 669, + 669, nil, nil, 669, nil, nil, nil, nil, nil, nil, + nil, nil, 669, 669, 668, 669, 669, 669, 669, 669, + 669, 669, nil, nil, 669, 669, nil, nil, nil, 669, + 669, 669, 669, nil, nil, nil, nil, nil, 669, nil, + nil, nil, nil, nil, nil, nil, 669, 669, nil, 669, + 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, + nil, 983, 669, 983, 983, 983, 983, 983, 986, nil, + 986, 986, 986, 986, 986, nil, nil, 983, nil, nil, + nil, nil, 669, nil, 986, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 983, + nil, nil, nil, nil, nil, nil, 986, nil, 983, 983, + 983, 983, nil, nil, nil, 986, 986, 986, 986, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1033, 1033, nil, nil, + 1033, nil, nil, nil, 983, nil, nil, nil, nil, 1033, + 1033, 986, 1033, 1033, 1033, 1033, 1033, 1033, 1033, nil, + nil, 1033, 1033, nil, nil, nil, 1033, 1033, 1033, 1033, + nil, nil, nil, nil, nil, 1033, nil, nil, nil, nil, + nil, nil, nil, 1033, 1033, nil, 1033, 1033, 1033, 1033, + 1033, 1033, 1033, 1033, 1033, 1033, 1033, nil, nil, 1033, + nil, nil, nil, nil, 1038, 1038, nil, nil, 1038, nil, + nil, nil, nil, nil, nil, nil, nil, 1038, 1038, 1033, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, nil, nil, 1038, + 1038, nil, nil, nil, 1038, 1038, 1038, 1038, nil, nil, + nil, nil, nil, 1038, nil, nil, nil, nil, nil, nil, + nil, 1038, 1038, nil, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, nil, nil, 1038, nil, nil, + nil, nil, 1039, 1039, nil, nil, 1039, nil, nil, nil, + nil, nil, nil, nil, nil, 1039, 1039, 1038, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, nil, nil, 1039, 1039, nil, + nil, nil, 1039, 1039, 1039, 1039, nil, nil, nil, nil, + nil, 1039, nil, nil, nil, nil, nil, nil, nil, 1039, + 1039, nil, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, nil, 1057, 1039, 1057, 1057, 1057, 1057, + 1057, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1057, nil, nil, nil, nil, 1039, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1057, nil, nil, nil, nil, nil, nil, nil, + nil, 1057, 1057, 1057, 1057, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1057 ] + +racc_action_pointer = [ + nil, 34, 2018, 60, nil, 201, nil, nil, 6077, 763, + nil, 24008, 24141, -12, nil, -30, 60, -17, 152, 279, + 112, nil, -60, 6216, 2298, 236, nil, -40, nil, 0, + 1084, 1216, 6355, 6494, 6633, nil, 2158, 6772, 6911, nil, + 144, 208, 304, 268, 159, 7050, 7189, 489, 7328, 203, + 305, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1348, nil, 7467, nil, nil, 73, nil, 7606, 7745, nil, + nil, 7884, 8023, 8162, 8301, 24274, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -65, nil, nil, nil, nil, nil, nil, 223, + 255, 278, 284, nil, nil, 24407, nil, nil, nil, nil, + nil, nil, 0, nil, nil, 139, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 8440, nil, + nil, nil, nil, 8579, 8718, 8857, 8996, 9135, 312, nil, + 605, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 306, + nil, 2298, 9274, 9413, 9552, 9691, 9830, 9969, 24874, 24942, + nil, nil, 10108, 10247, 10386, nil, nil, 356, -55, -52, + 405, 162, 341, 408, nil, 10525, 2438, 431, 10664, 10803, + 10942, 11081, 11220, 11359, 11498, 11637, 11776, 11915, 12054, 12193, + 12332, 12471, 12610, 12749, 12888, 13027, 13166, 13305, 13444, 13583, + nil, nil, nil, nil, 13722, nil, nil, nil, 1876, nil, + nil, 426, 13861, 14000, nil, nil, nil, nil, nil, nil, + nil, nil, 14139, nil, 2438, nil, 402, 406, nil, 14278, + 460, 14417, nil, nil, 14556, 14695, nil, nil, 460, nil, + nil, 14834, 925, nil, 419, 2578, 461, 499, 474, 14973, + 2718, 371, 411, 458, 551, 510, nil, 548, 516, 206, + nil, nil, nil, 567, 254, 536, 15112, nil, 308, 618, + 514, nil, 620, 15251, nil, 15390, 2858, 1166, 587, 15529, + 15668, nil, 11, -10, -1, 15807, 2998, 3138, 476, 699, + 585, -19, -14, 589, 670, -7, 702, nil, nil, 311, + 342, 308, nil, 625, nil, 620, 15946, nil, nil, nil, + 112, 118, 120, 239, 344, 373, 377, 455, 459, nil, + 461, nil, nil, 645, nil, -59, nil, 370, nil, 538, + nil, 605, 378, nil, 607, 397, nil, 609, -37, nil, + 610, -27, nil, 443, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 24540, nil, + nil, nil, nil, 624, nil, nil, 612, 16085, 618, nil, + nil, 618, nil, 752, 182, 720, nil, nil, 2018, nil, + nil, nil, nil, nil, 2158, 644, nil, nil, 642, 644, + 430, 547, 1480, nil, nil, nil, 271, 403, 687, nil, + nil, 1612, 1744, nil, nil, nil, -33, nil, 690, 25010, + 25078, 16224, 187, 16363, 16502, 16641, 3138, 3278, 364, 490, + 724, 726, 729, 748, 976, 1430, 1562, 3418, 3558, 3698, + 3838, 3978, 4118, 844, 1039, 4258, 4398, 2578, 1166, 807, + nil, 1876, nil, nil, nil, nil, 691, nil, nil, nil, + 692, nil, nil, 16780, nil, nil, 16919, nil, 17058, nil, + 265, nil, nil, nil, 17197, 1178, 712, 702, 703, nil, + nil, 705, 17336, 709, 17475, 25146, 25214, 753, 746, nil, + 17614, 710, nil, 17753, 17892, 25282, 25350, 1298, 2718, 18031, + 833, 851, 735, nil, nil, -80, -68, 736, 751, nil, + 340, 777, 3278, 856, nil, 3418, 30, 860, 868, 863, + 890, nil, nil, 18170, 25418, 25486, 5, nil, nil, 763, + nil, 25554, 25622, 18309, nil, nil, nil, 587, 3558, 811, + nil, nil, nil, 18448, nil, 744, nil, 773, 774, nil, + 777, 780, 781, nil, nil, nil, nil, nil, nil, nil, + nil, 769, 685, nil, nil, 18587, nil, nil, nil, 882, + nil, nil, nil, 886, nil, nil, 895, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 198, nil, + nil, 200, nil, nil, nil, 826, nil, nil, 830, nil, + 3698, nil, 24673, nil, 842, 18726, 18865, 19004, 25690, 25758, + 19143, 19282, 585, 882, 19421, 19560, 19699, 19838, 882, nil, + nil, nil, 19977, 20116, 883, nil, nil, nil, 189, 216, + 542, 681, 870, 869, nil, 116, 972, 163, nil, nil, + 888, nil, 996, nil, 880, nil, 922, 20255, nil, nil, + 20394, nil, nil, -123, 20533, 882, nil, 901, -9, 28, + 951, 33, 773, 952, 916, 20672, nil, 995, 156, 221, + nil, 20811, nil, nil, nil, nil, 20950, nil, nil, 21089, + nil, nil, nil, 618, nil, 1052, nil, nil, nil, nil, + nil, 1059, nil, 21228, 944, 20, 29, 163, 165, 3838, + 550, 781, nil, 947, 3978, 21367, 535, 1076, 4118, 874, + 1048, 24806, 165, 27, 960, 234, nil, nil, 578, 1147, + nil, 1279, nil, 471, nil, 21506, nil, 949, nil, 959, + 961, 881, 968, nil, nil, nil, nil, 936, 4258, nil, + nil, nil, nil, nil, 982, nil, 978, 21645, 982, 222, + 274, 813, 945, nil, 2858, 21784, nil, 983, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 21923, 22062, + 22201, 22340, 317, 22479, nil, nil, 1411, nil, 4398, nil, + nil, 1000, nil, 119, nil, nil, nil, nil, 985, 160, + nil, nil, nil, nil, nil, nil, 4538, nil, 987, 1029, + nil, nil, 447, 1109, nil, nil, 22618, nil, 4678, 1110, + nil, nil, nil, 22757, 42, 41, 1113, nil, 1120, 551, + nil, nil, 1124, 1009, 580, nil, nil, nil, 4818, 4958, + 1005, 1013, 1011, nil, nil, nil, 1012, 1021, nil, 1036, + 1041, nil, 1042, nil, nil, 1047, 980, 819, nil, nil, + nil, nil, nil, nil, nil, 1038, nil, 1048, 320, nil, + nil, 22896, 23035, 2998, 1051, 1055, nil, 1057, 1065, 1070, + nil, 1103, 1101, 1087, 23174, nil, nil, nil, nil, 5098, + 5238, nil, 6, 23313, nil, nil, nil, 10, nil, nil, + nil, 23452, 5378, nil, nil, nil, 5518, nil, nil, nil, + 1144, 1127, 1235, 1010, nil, nil, 1543, nil, 1675, nil, + 6793, nil, 6932, nil, nil, nil, nil, 1122, 1125, nil, + 325, nil, nil, 25820, nil, nil, 25827, nil, 8044, nil, + nil, 1152, 23591, 884, 1213, nil, 1266, 5658, 19, 38, + 898, 1221, 69, nil, 5798, nil, 23730, 355, 1269, 5938, + nil, nil, 451, nil, nil, nil, 1150, 1151, 1153, 1168, + 1077, 1184, 1169, nil, nil, 1173, 1174, 1176, 1179, nil, + 1180, nil, 913, 25895, nil, nil, 1305, 23869, 25963, 26031, + 106, 691, nil, nil, nil, nil, nil, 1305, nil, 1209, + 8183, nil, nil, nil, nil, 1187, nil, 26093, nil, 8322, + nil, 14994, nil, 15133, nil, nil, 1228, 1236, nil, 1202, + 128, 131, 171, 174, nil, nil, nil, 1202, 1208, 1209, + 1210, 1211, 162, nil, 17357, nil, nil, nil, nil, 1212, + nil ] + +racc_action_default = [ + -1, -646, -645, -646, -2, -632, -4, -5, -646, -8, + -9, -646, -646, -646, -36, -646, -646, -40, -646, -646, + -292, -52, -634, -646, -57, -62, -63, -64, -68, -269, + -269, -269, -307, -337, -338, -80, -645, -84, -92, -94, + -646, -533, -534, -646, -646, -646, -646, -228, -646, -634, + -242, -283, -284, -285, -286, -287, -288, -289, -290, -291, + -618, -294, -296, -303, -305, -315, -317, -646, -646, -59, + -59, -632, -646, -646, -646, -646, -339, -340, -342, -343, + -344, -345, -346, -347, -348, -349, -350, -351, -360, -415, + -463, -464, -465, -466, -467, -645, -470, -645, -645, -645, + -645, -645, -645, -506, -507, -645, -509, -515, -517, -518, + -519, -520, -616, -522, -523, -617, -525, -526, -527, -528, + -529, -530, -531, -532, -537, -538, 1091, -3, -633, -641, + -642, -643, -7, -646, -646, -646, -646, -646, -646, -24, + -646, -123, -124, -125, -126, -127, -128, -129, -133, -134, + -135, -136, -137, -138, -139, -140, -141, -142, -143, -144, + -145, -146, -147, -148, -149, -150, -151, -152, -153, -154, + -155, -156, -157, -158, -159, -160, -161, -162, -163, -164, + -165, -166, -167, -168, -169, -170, -171, -172, -173, -174, + -175, -176, -177, -178, -179, -180, -181, -182, -183, -184, + -185, -186, -187, -188, -189, -190, -191, -192, -193, -194, + -195, -196, -197, -198, -199, -200, -201, -202, -203, -29, + -130, -645, -646, -646, -646, -646, -646, -645, -646, -646, + -628, -629, -646, -646, -634, -635, -56, -646, -533, -534, + -646, -292, -646, -646, -234, -646, -645, -646, -646, -646, + -646, -646, -646, -646, -646, -646, -646, -646, -646, -646, + -646, -646, -646, -646, -646, -646, -646, -646, -646, -646, + -243, -244, -245, -246, -646, -353, -443, -423, -646, -630, + -631, -69, -645, -646, -314, -352, -427, -436, -438, -75, + -433, -76, -634, -77, -249, -264, -645, -645, -268, -646, + -274, -646, -645, -610, -646, -646, -78, -79, -632, -17, + -18, -646, -21, -22, -82, -645, -634, -646, -85, -88, + -645, -100, -101, -646, -646, -108, -307, -310, -634, -646, + -337, -338, -341, -434, -646, -90, -646, -96, -302, -516, + -646, -222, -223, -646, -235, -646, -645, -298, -634, -645, + -645, -316, -58, -646, -646, -646, -645, -645, -632, -646, + -633, -533, -534, -646, -646, -292, -646, -370, -371, -118, + -119, -646, -121, -646, -292, -645, -646, -533, -534, -330, + -123, -124, -163, -164, -165, -181, -186, -193, -196, -332, + -646, -605, -606, -565, -468, -646, -491, -646, -493, -646, + -495, -646, -646, -475, -646, -646, -481, -646, -646, -487, + -646, -646, -489, -646, -508, -510, -511, -512, -513, -6, + -644, -30, -31, -32, -33, -34, -10, -11, -646, -26, + -27, -28, -131, -646, -37, -39, -279, -646, -646, -278, + -38, -646, -41, -646, -292, -49, -51, -204, -254, -274, + -53, -54, -42, -205, -254, -634, -259, -260, -645, -645, + -619, -620, -269, -431, -621, -622, -620, -619, -269, -430, + -432, -621, -622, -48, -212, -55, -634, -313, -646, -646, + -646, -645, -302, -646, -646, -646, -213, -214, -215, -216, + -217, -218, -219, -220, -224, -225, -226, -227, -229, -230, + -231, -232, -233, -236, -237, -238, -239, -634, -247, -646, + -444, -269, -619, -620, -66, -70, -634, -270, -440, -443, + -634, -309, -265, -646, -273, -266, -646, -271, -646, -275, + -646, -613, -615, -16, -633, -20, -646, -634, -81, -300, + -97, -86, -646, -634, -645, -646, -646, -107, -646, -516, + -646, -93, -98, -646, -646, -646, -646, -248, -240, -646, + -455, -646, -634, -297, -250, -638, -638, -634, -646, -608, + -638, -646, -645, -361, -362, -645, -646, -646, -646, -646, + -646, -356, -450, -645, -646, -646, -302, -59, -118, -119, + -120, -646, -646, -645, -325, -539, -541, -327, -645, -543, + -334, -626, -627, -646, -416, -565, -419, -604, -604, -548, + -550, -550, -550, -564, -566, -567, -568, -569, -570, -571, + -572, -573, -646, -575, -577, -579, -584, -586, -587, -589, + -594, -596, -597, -599, -600, -601, -646, -469, -492, -497, + -498, -500, -471, -494, -472, -496, -473, -474, -646, -477, + -479, -646, -480, -483, -484, -646, -485, -486, -646, -514, + -645, -25, -646, -35, -282, -646, -646, -645, -646, -646, + -646, -646, -435, -646, -261, -263, -646, -646, -71, -257, + -258, -428, -646, -646, -73, -429, -312, -636, -619, -620, + -619, -620, -634, -646, -422, -645, -65, -424, -440, -256, + -646, -441, -646, -308, -645, -272, -276, -646, -611, -612, + -646, -19, -23, -83, -646, -89, -95, -634, -619, -620, + -645, -623, -106, -646, -91, -646, -211, -221, -634, -645, + -354, -645, -295, -359, -299, -251, -640, -639, -253, -640, + -304, -306, -609, -645, -363, -645, -60, -364, -365, -320, + -321, -646, -323, -646, -634, -619, -620, -623, -301, -645, + -118, -119, -122, -634, -645, -646, -646, -646, -645, -565, + -565, -646, -634, -646, -634, -646, -546, -547, -646, -646, + -557, -646, -560, -646, -562, -646, -372, -646, -374, -376, + -379, -382, -634, -578, -588, -598, -602, -646, -645, -476, + -478, -482, -488, -490, -646, -132, -280, -646, -634, -619, + -620, -620, -619, -50, -255, -646, -637, -645, -44, -207, + -45, -208, -72, -46, -210, -47, -209, -74, -646, -646, + -646, -646, -435, -646, -404, -405, -634, -407, -645, -426, + -425, -646, -437, -645, -439, -267, -277, -614, -87, -435, + -99, -311, -13, -15, -355, -357, -645, -462, -456, -645, + -457, -458, -638, -646, -358, -366, -646, -368, -645, -646, + -61, -322, -446, -646, -646, -435, -646, -435, -646, -646, + -328, -331, -646, -634, -646, -335, -607, -417, -645, -645, + -409, -634, -604, -585, -603, -549, -550, -550, -576, -550, + -550, -595, -550, -573, -590, -634, -646, -646, -381, -574, + -499, -502, -503, -504, -505, -646, -12, -281, -435, -43, + -206, -262, -646, -241, -604, -604, -386, -645, -645, -645, + -403, -646, -634, -573, -581, -582, -592, -445, -67, -645, + -645, -461, -646, -646, -460, -252, -318, -646, -369, -319, + -447, -646, -645, -324, -326, -540, -645, -333, -542, -544, + -543, -646, -646, -646, -418, -545, -646, -553, -646, -555, + -646, -558, -646, -561, -563, -373, -375, -377, -380, -501, + -646, -384, -385, -394, -388, -396, -646, -399, -646, -401, + -406, -646, -646, -580, -646, -442, -645, -645, -533, -534, + -646, -646, -292, -459, -645, -448, -646, -645, -646, -645, + -420, -421, -634, -411, -413, -414, -550, -550, -550, -550, + -646, -646, -604, -583, -387, -645, -645, -645, -645, -593, + -645, -408, -591, -646, -302, -14, -455, -645, -646, -646, + -302, -645, -449, -451, -452, -453, -329, -646, -410, -646, + -646, -551, -554, -556, -559, -378, -383, -646, -391, -646, + -393, -646, -397, -646, -400, -402, -301, -623, -454, -634, + -619, -620, -623, -301, -367, -336, -412, -550, -645, -645, + -645, -645, -435, -552, -646, -389, -392, -395, -398, -645, + -390 ] + +racc_goto_table = [ + 6, 228, 236, 233, 389, 295, 295, 295, 318, 279, + 4, 277, 561, 286, 290, 580, 144, 144, 455, 9, + 515, 351, 131, 353, 354, 9, 729, 358, 621, 426, + 345, 708, 332, 332, 415, 606, 572, 575, 139, 220, + 356, 357, 297, 297, 297, 439, 440, 590, 317, 352, + 352, 128, 768, 352, 127, 147, 147, 551, 525, 314, + 335, 509, 672, 700, 462, 468, 863, 332, 332, 332, + 296, 296, 296, 516, 901, 339, 792, 776, 777, 347, + 144, 281, 289, 291, 869, 928, 978, 316, 131, 421, + 422, 423, 424, 396, 838, 398, 400, 403, 406, 409, + 412, 132, 976, 396, 735, 738, 613, 1013, 786, 742, + 144, 853, 1015, 395, 511, 352, 352, 352, 352, 898, + 359, 891, 1, 413, 705, 1029, 2, 705, 293, 306, + 307, 643, 897, 645, 899, 648, 649, 138, 651, 649, + 375, 379, 660, 852, 940, 9, 711, 452, 536, 453, + 219, 368, 435, 473, 425, 474, 428, 746, 870, 278, + 698, 662, 343, 567, 697, 391, 568, 366, 594, 390, + 600, 346, 348, 446, 740, 562, 446, 349, 350, 764, + 708, 766, 446, 931, 956, 598, 599, 477, 771, 929, + 960, 977, 930, 1076, 932, 1012, 1029, 604, 1015, 1055, + 295, 434, 445, 887, 393, 445, 450, 451, 773, 518, + 519, 445, 463, 843, 874, 475, 476, 976, 19, 479, + 525, 419, 695, 1043, 19, 456, 753, 859, 942, 394, + 397, 399, 1025, 433, 472, 751, 402, 405, 408, 237, + 621, 905, 939, 841, 708, 521, 411, 774, 237, 237, + 237, 910, 19, 323, 323, 295, 295, 797, 317, 901, + 438, 438, 798, 715, 767, 295, 414, 762, 765, 538, + 896, 724, 692, 786, 893, 705, 705, 908, 19, 991, + 456, 1023, 603, 237, 237, nil, nil, 237, 363, 373, + 373, nil, nil, 297, 524, 524, nil, nil, nil, 832, + 396, 563, 297, nil, 702, 545, nil, 552, nil, 548, + nil, 576, 898, 286, 332, 462, 468, 290, 613, 1016, + 530, 296, 555, 898, 849, 131, nil, 317, 535, nil, + 296, 332, 317, nil, nil, 717, 1026, 352, 314, 1027, + nil, 541, nil, 314, 19, 584, 1044, 564, 569, 237, + 237, 237, 237, 19, 534, nil, nil, 533, 597, 566, + 570, 875, 965, nil, 1074, 549, 537, nil, 577, 578, + 877, 543, nil, 596, 754, 131, nil, nil, 1035, 517, + nil, 720, 800, nil, 763, 800, nil, 565, 520, nil, + nil, 720, 786, 786, 981, 982, nil, nil, nil, nil, + nil, 945, nil, 898, 621, 621, 474, 579, 453, nil, + 1078, 883, 884, 1009, 621, 918, 621, 822, nil, nil, + 720, nil, nil, 827, nil, 668, 708, 712, 720, 686, + 878, nil, nil, 144, 882, 848, 673, 19, 237, 443, + 237, 237, 443, 237, nil, nil, 680, nil, 443, 237, + 237, nil, 685, nil, 295, 661, 524, 524, 808, nil, + 679, nil, 19, 463, nil, 845, nil, nil, nil, 699, + nil, 933, 147, 703, nil, nil, 726, nil, nil, 456, + nil, nil, 613, 613, nil, 472, nil, nil, 693, nil, + 713, nil, 1056, nil, nil, 680, 716, nil, 237, 237, + nil, nil, 1068, nil, 462, 468, 786, 786, 237, 679, + nil, nil, nil, 552, 678, 734, nil, 295, nil, nil, + 684, 552, 705, nil, nil, nil, nil, 19, nil, 463, + nil, 19, nil, 704, nil, 323, 19, 332, nil, 463, + nil, 728, 456, nil, nil, 332, nil, nil, 673, nil, + nil, 472, 323, nil, 860, 962, 295, 952, 759, nil, + nil, 472, 19, 696, nil, nil, 295, nil, 463, nil, + nil, 237, 19, 19, nil, nil, 463, nil, 845, nil, + nil, 456, nil, nil, 743, 772, nil, 745, nil, nil, + 472, 456, 237, 747, nil, 732, 472, 818, 820, 819, + 821, 621, nil, 823, 825, 824, 826, nil, nil, nil, + nil, 749, 750, nil, 752, nil, 446, nil, 933, nil, + nil, 933, 1008, nil, nil, 997, 446, 446, nil, nil, + 1004, nil, 446, 446, nil, nil, nil, nil, nil, nil, + 295, nil, nil, nil, nil, 445, 934, nil, nil, nil, + nil, 892, 463, 840, nil, 445, 445, nil, 6, nil, + nil, 445, 445, 1045, nil, 456, nil, 144, 804, nil, + nil, nil, nil, 673, 472, 1047, 1082, 9, nil, nil, + nil, 851, 839, nil, 817, 552, nil, 813, nil, 805, + nil, nil, 933, 834, nil, nil, 850, 237, 673, nil, + 885, nil, 524, nil, 680, nil, 147, 685, nil, 332, + nil, nil, 925, nil, nil, nil, nil, nil, 679, nil, + 332, 879, nil, nil, nil, 886, nil, 857, nil, 861, + nil, nil, nil, nil, nil, 673, 919, nil, 920, nil, + nil, 867, nil, 867, 673, 909, 862, 352, nil, nil, + 19, 819, 821, 826, 824, 890, nil, nil, 323, nil, + 237, nil, nil, nil, nil, 446, 323, nil, nil, 438, + nil, 876, 780, 782, 784, 237, 144, nil, nil, nil, + nil, nil, nil, 880, nil, 871, nil, nil, 19, 673, + 934, 19, nil, 934, 445, nil, 934, nil, 934, 237, + nil, 881, nil, nil, nil, nil, nil, nil, nil, 237, + 915, nil, nil, nil, 19, 524, nil, 890, nil, 237, + nil, nil, 947, nil, nil, nil, nil, nil, 1069, nil, + nil, nil, nil, nil, nil, nil, 958, nil, nil, nil, + nil, 834, nil, nil, 964, 920, nil, nil, 352, nil, + 937, nil, nil, nil, nil, nil, 1022, 944, 975, 925, + 894, nil, 925, 894, 925, nil, nil, 934, 941, 934, + nil, 934, nil, 934, 720, nil, 19, nil, nil, nil, + 948, nil, 443, 237, nil, nil, 19, nil, nil, nil, + nil, nil, 443, 443, 934, nil, 955, 946, 443, 443, + 961, 959, nil, 949, nil, nil, nil, nil, nil, nil, + 953, nil, 954, 890, nil, nil, 957, nil, nil, nil, + nil, 926, nil, nil, nil, 984, 984, 984, nil, 332, + 323, nil, nil, 925, 900, 925, 902, 925, 332, 925, + nil, 323, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 995, 996, nil, nil, nil, nil, nil, nil, nil, + 925, nil, nil, nil, 1007, nil, nil, 29, nil, nil, + nil, nil, nil, 29, nil, 19, nil, nil, nil, nil, + 19, 237, 1038, nil, 19, nil, nil, 332, 29, 927, + nil, nil, nil, 1048, 857, nil, nil, 29, 29, 29, + nil, 29, nil, nil, nil, 867, nil, nil, nil, 1036, + 295, 985, 987, 989, 19, nil, 1041, nil, nil, nil, + nil, nil, 463, 984, 984, 984, 984, 29, 984, nil, + nil, 443, 29, 29, nil, 456, 29, nil, 472, 867, + nil, nil, 1046, nil, 472, nil, nil, nil, nil, nil, + 673, nil, nil, nil, 19, nil, nil, nil, 967, 969, + nil, 971, 973, nil, 974, 894, nil, nil, 926, nil, + nil, 926, 19, 926, nil, nil, 984, 984, 984, 984, + nil, 1075, 237, nil, 19, nil, nil, 984, nil, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 29, 29, + 29, 29, 29, nil, 19, 19, nil, nil, nil, 1058, + 1060, 1062, 1064, nil, 1065, nil, nil, nil, nil, 1017, + nil, 1018, nil, 1019, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1028, + nil, 1030, 926, nil, 926, nil, 926, nil, 926, nil, + 993, nil, nil, nil, nil, 19, 19, nil, nil, 1000, + nil, nil, 1085, 1086, 1087, 1088, nil, nil, 19, 926, + nil, nil, 19, 1090, nil, nil, nil, nil, 1051, 1052, + 1053, 1054, nil, nil, nil, nil, 29, 29, 29, 29, + 29, 29, 29, nil, nil, nil, nil, 29, 29, 29, + nil, nil, nil, 1077, nil, nil, nil, nil, 1032, nil, + 1079, 29, 1080, 19, 1081, nil, nil, nil, nil, nil, + 19, nil, nil, nil, nil, 19, nil, nil, nil, nil, + 436, 449, nil, nil, nil, nil, nil, 1089, nil, 1083, + nil, nil, nil, nil, nil, nil, nil, 29, 29, nil, + nil, nil, nil, 237, nil, nil, nil, 29, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, 32, nil, nil, nil, 29, nil, nil, nil, + 29, nil, nil, nil, nil, 29, nil, 32, nil, nil, + nil, nil, nil, nil, nil, nil, 32, 32, 32, nil, + 32, nil, nil, nil, nil, nil, nil, 527, nil, 529, + nil, 29, 531, 532, nil, nil, nil, nil, nil, nil, + 29, 29, 29, nil, nil, nil, 32, nil, nil, nil, + nil, 32, 32, nil, nil, 32, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 571, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, 32, 32, 32, + 32, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 664, 29, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, 32, 32, 32, 32, + 32, 32, nil, nil, nil, nil, 32, 32, 32, 29, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 29, + 32, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, nil, nil, nil, nil, nil, + nil, 706, nil, nil, 571, nil, 709, 29, nil, nil, + 29, nil, nil, nil, nil, nil, 32, 32, 29, nil, + nil, nil, nil, nil, nil, nil, 32, nil, 29, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 29, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, 32, + nil, nil, nil, nil, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 32, nil, nil, nil, nil, nil, nil, nil, nil, 32, + 32, 32, nil, nil, nil, 29, nil, nil, nil, nil, + nil, 29, 29, 793, nil, 29, nil, nil, nil, nil, + 32, 29, 29, nil, nil, nil, nil, 29, 29, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 806, nil, nil, nil, nil, nil, nil, + nil, nil, 706, 571, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 846, nil, nil, 847, nil, + nil, nil, nil, nil, 29, nil, nil, nil, nil, 29, + 29, nil, nil, 29, nil, nil, nil, nil, nil, 858, + nil, nil, nil, nil, 706, 32, nil, 571, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 872, nil, 29, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 29, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 904, nil, nil, nil, nil, 32, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 32, nil, + nil, nil, nil, nil, nil, 917, nil, nil, nil, nil, + nil, 29, nil, 32, nil, nil, nil, nil, nil, nil, + nil, 29, nil, 29, nil, nil, 32, nil, nil, 32, + nil, nil, nil, nil, nil, nil, nil, 32, nil, nil, + nil, nil, nil, 29, 29, 244, nil, 32, nil, nil, + nil, nil, 32, nil, 294, 294, 294, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 341, 342, nil, + 344, 950, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 29, nil, nil, + nil, 29, nil, nil, 32, nil, nil, nil, nil, 571, + 32, 32, nil, nil, 32, nil, nil, nil, nil, nil, + 32, 32, nil, nil, nil, nil, 32, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1005, + nil, nil, 29, nil, nil, nil, nil, nil, nil, 29, + nil, nil, nil, nil, 29, nil, nil, nil, 16, nil, + nil, nil, nil, nil, 16, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 16, nil, 1042, nil, nil, nil, nil, nil, + nil, nil, nil, 32, nil, nil, nil, nil, 32, 32, + nil, nil, 32, nil, nil, nil, nil, nil, 16, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 367, nil, + nil, nil, nil, nil, 294, 448, nil, nil, 454, 294, + nil, nil, 32, nil, 454, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, 32, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 32, nil, 16, 18, 508, nil, nil, nil, + nil, 18, nil, 16, 294, 294, nil, nil, nil, nil, + 32, nil, nil, nil, 294, nil, nil, nil, nil, nil, + 32, 294, 32, 294, nil, nil, 294, 294, nil, 18, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 557, nil, 558, nil, nil, + nil, 294, 294, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 16, nil, 441, + nil, nil, 441, 32, 32, nil, nil, nil, 441, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + 32, nil, 16, nil, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, nil, nil, nil, nil, nil, nil, 20, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, 32, nil, nil, nil, nil, nil, nil, 32, 294, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, 325, 325, nil, 16, nil, nil, + nil, 16, nil, nil, nil, nil, 16, nil, nil, nil, + nil, 32, nil, nil, nil, nil, nil, nil, nil, 20, + nil, nil, nil, 294, nil, 454, 454, 454, nil, 365, + 374, 374, 16, nil, 18, nil, 18, nil, nil, 18, + nil, nil, 16, 16, nil, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 18, + nil, nil, nil, nil, nil, 294, nil, nil, 294, nil, + 294, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, 294, nil, nil, nil, + nil, nil, nil, nil, 20, 454, 727, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, 41, nil, nil, 18, 294, nil, nil, 18, nil, + nil, nil, nil, 18, nil, 294, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + 321, 321, nil, nil, nil, nil, nil, nil, nil, 18, + nil, nil, nil, nil, nil, nil, nil, 294, nil, 18, + 18, nil, nil, nil, nil, 41, nil, nil, 20, nil, + 444, nil, nil, 444, nil, 361, 377, 377, 377, 444, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, 294, 454, 294, + nil, nil, nil, 814, nil, nil, 294, 294, 454, 454, + 16, nil, nil, nil, 454, 454, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, 294, + 41, nil, 294, nil, nil, nil, nil, nil, 16, nil, + nil, 16, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, 20, 294, nil, nil, 325, 20, 294, nil, + nil, 294, nil, nil, 16, nil, nil, nil, nil, nil, + nil, nil, nil, 325, nil, 294, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, 20, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 294, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 16, 18, nil, 294, + nil, nil, 441, nil, nil, nil, 16, 454, nil, 41, + nil, nil, 441, 441, nil, nil, nil, nil, 441, 441, + 454, 454, 454, 454, nil, 923, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, 18, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, 294, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, 41, nil, + nil, nil, 321, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, nil, nil, nil, 321, + 16, nil, nil, nil, 16, nil, nil, nil, nil, 41, + nil, nil, nil, 294, 454, nil, nil, nil, nil, 41, + 41, nil, nil, 18, nil, nil, nil, nil, nil, 18, + nil, nil, nil, 18, 16, nil, nil, nil, nil, 18, + 18, 20, nil, 294, nil, 18, 18, nil, nil, 325, + nil, 441, nil, nil, nil, nil, nil, 325, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 16, nil, nil, nil, nil, 20, + 42, nil, 20, nil, nil, nil, 42, nil, nil, nil, + nil, nil, 16, nil, nil, nil, nil, nil, 294, nil, + nil, nil, nil, nil, 16, 20, nil, nil, nil, nil, + nil, nil, nil, nil, 42, 322, 322, nil, nil, nil, + nil, nil, 18, nil, 16, 16, nil, 18, nil, 294, + nil, 18, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 362, 378, 378, 378, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, nil, nil, 20, nil, nil, + nil, nil, nil, 444, nil, 16, 16, 20, 18, 1003, + nil, nil, nil, 444, 444, nil, nil, nil, 16, 444, + 444, nil, 16, nil, nil, nil, nil, 41, nil, nil, + nil, 18, nil, nil, nil, 321, 42, nil, nil, nil, + nil, nil, nil, 321, nil, 42, nil, nil, nil, 18, + nil, 325, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 18, 325, 16, nil, 41, nil, nil, 41, nil, + 16, nil, nil, nil, nil, 16, nil, nil, nil, nil, + nil, 18, 18, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, 20, nil, nil, nil, + nil, 20, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, 18, 18, 914, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, nil, 18, + nil, nil, 444, 41, 42, nil, nil, nil, nil, nil, + nil, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, 20, nil, nil, nil, 18, nil, nil, + nil, nil, 18, nil, nil, 20, nil, 321, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 321, 42, + nil, nil, nil, 42, nil, 20, 20, 322, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 322, nil, nil, nil, nil, nil, + nil, nil, 41, nil, 42, nil, nil, 41, nil, nil, + nil, 41, nil, nil, 42, 42, nil, nil, nil, nil, + nil, 374, nil, nil, nil, nil, 20, 20, nil, nil, + 1002, nil, nil, nil, nil, nil, nil, nil, nil, 20, + nil, 41, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 374, + nil, 41, nil, nil, 20, nil, nil, nil, nil, nil, + nil, 20, nil, nil, nil, nil, 20, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 377, nil, nil, + nil, nil, 41, 41, nil, nil, 998, nil, nil, nil, + nil, nil, 42, nil, nil, 41, nil, nil, nil, 41, + 322, nil, nil, nil, nil, nil, nil, nil, 322, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, 42, nil, 377, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, 41, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 322, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 322, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, nil, 42, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 378, nil, nil, nil, nil, 42, 42, nil, + nil, 999, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 378, nil, nil, nil, nil, 42, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, nil, 42 ] + +racc_goto_check = [ + 6, 38, 27, 40, 70, 46, 46, 46, 63, 38, + 2, 168, 12, 85, 85, 113, 71, 71, 36, 9, + 52, 102, 118, 24, 24, 9, 15, 24, 206, 10, + 40, 217, 78, 78, 70, 167, 106, 106, 22, 22, + 42, 42, 84, 84, 84, 29, 29, 68, 14, 31, + 31, 8, 121, 31, 5, 73, 73, 65, 87, 59, + 64, 169, 37, 53, 50, 50, 107, 78, 78, 78, + 82, 82, 82, 36, 212, 76, 144, 150, 150, 9, + 71, 51, 51, 51, 109, 155, 145, 60, 118, 24, + 24, 24, 24, 6, 157, 6, 6, 6, 6, 6, + 6, 7, 142, 6, 83, 83, 201, 161, 143, 83, + 71, 17, 162, 185, 50, 31, 31, 31, 31, 207, + 5, 159, 1, 185, 88, 213, 3, 88, 58, 58, + 58, 190, 156, 190, 156, 189, 190, 11, 189, 190, + 69, 69, 13, 16, 18, 9, 20, 33, 21, 75, + 23, 26, 30, 33, 9, 75, 32, 43, 45, 49, + 55, 74, 79, 81, 86, 98, 101, 115, 117, 122, + 123, 124, 125, 25, 37, 126, 25, 127, 128, 129, + 217, 130, 25, 159, 131, 132, 133, 61, 134, 156, + 135, 146, 147, 161, 153, 160, 213, 163, 162, 145, + 46, 27, 27, 164, 165, 27, 31, 31, 166, 171, + 172, 27, 85, 174, 175, 31, 31, 142, 35, 38, + 87, 7, 177, 178, 35, 6, 179, 180, 181, 184, + 186, 187, 155, 14, 71, 113, 188, 191, 192, 35, + 206, 144, 157, 53, 217, 61, 193, 167, 35, 35, + 35, 194, 35, 35, 35, 46, 46, 195, 14, 212, + 82, 82, 196, 65, 12, 46, 199, 68, 200, 61, + 205, 65, 36, 143, 209, 88, 88, 143, 35, 159, + 6, 210, 216, 35, 35, nil, nil, 35, 35, 35, + 35, nil, nil, 84, 6, 6, nil, nil, nil, 37, + 6, 61, 84, nil, 169, 38, nil, 63, nil, 40, + nil, 24, 207, 85, 78, 50, 50, 85, 201, 156, + 185, 82, 38, 207, 37, 118, nil, 14, 9, nil, + 82, 78, 14, nil, nil, 36, 156, 31, 59, 156, + nil, 64, nil, 59, 35, 38, 109, 6, 6, 35, + 35, 35, 35, 35, 8, nil, nil, 5, 31, 84, + 84, 37, 150, nil, 107, 76, 60, nil, 14, 14, + 37, 60, nil, 6, 36, 118, nil, nil, 17, 58, + nil, 50, 190, nil, 36, 190, nil, 82, 58, nil, + nil, 50, 143, 143, 150, 150, nil, nil, nil, nil, + nil, 83, nil, 207, 206, 206, 75, 5, 75, nil, + 156, 167, 167, 121, 206, 37, 206, 52, nil, nil, + 50, nil, nil, 52, nil, 38, 217, 10, 50, 61, + 12, nil, nil, 71, 12, 65, 40, 35, 35, 35, + 35, 35, 35, 35, nil, nil, 85, nil, 35, 35, + 35, nil, 85, nil, 46, 22, 6, 6, 36, nil, + 6, nil, 35, 85, nil, 87, nil, nil, nil, 61, + nil, 206, 73, 61, nil, nil, 75, nil, nil, 6, + nil, nil, 201, 201, nil, 71, nil, nil, 40, nil, + 61, nil, 150, nil, nil, 85, 61, nil, 35, 35, + nil, nil, 15, nil, 50, 50, 143, 143, 35, 6, + nil, nil, nil, 63, 51, 61, nil, 46, nil, nil, + 51, 63, 88, nil, nil, nil, nil, 35, nil, 85, + nil, 35, nil, 84, nil, 35, 35, 78, nil, 85, + nil, 31, 6, nil, nil, 78, nil, nil, 40, nil, + nil, 71, 35, nil, 29, 12, 46, 106, 42, nil, + nil, 71, 35, 51, nil, nil, 46, nil, 85, nil, + nil, 35, 35, 35, nil, nil, 85, nil, 87, nil, + nil, 6, nil, nil, 14, 31, nil, 14, nil, nil, + 71, 6, 35, 118, nil, 100, 71, 33, 33, 75, + 75, 206, nil, 33, 33, 75, 75, nil, nil, nil, + nil, 100, 100, nil, 100, nil, 25, nil, 206, nil, + nil, 206, 12, nil, nil, 106, 25, 25, nil, nil, + 106, nil, 25, 25, nil, nil, nil, nil, nil, nil, + 46, nil, nil, nil, nil, 27, 208, nil, nil, nil, + nil, 149, 85, 102, nil, 27, 27, nil, 6, nil, + nil, 27, 27, 113, nil, 6, nil, 71, 2, nil, + nil, nil, nil, 40, 71, 12, 37, 9, nil, nil, + nil, 61, 168, nil, 84, 63, nil, 9, nil, 22, + nil, nil, 206, 6, nil, nil, 63, 35, 40, nil, + 70, nil, 6, nil, 85, nil, 73, 85, nil, 78, + nil, nil, 149, nil, nil, nil, nil, nil, 6, nil, + 78, 24, nil, nil, nil, 61, nil, 6, nil, 6, + nil, nil, nil, nil, nil, 40, 33, nil, 75, nil, + nil, 6, nil, 6, 40, 61, 84, 31, nil, nil, + 35, 75, 75, 75, 75, 40, nil, nil, 35, nil, + 35, nil, nil, nil, nil, 25, 35, nil, nil, 82, + nil, 14, 204, 204, 204, 35, 71, nil, nil, nil, + nil, nil, nil, 118, nil, 100, nil, nil, 35, 40, + 208, 35, nil, 208, 27, nil, 208, nil, 208, 35, + nil, 100, nil, nil, nil, nil, nil, nil, nil, 35, + 14, nil, nil, nil, 35, 6, nil, 40, nil, 35, + nil, nil, 24, nil, nil, nil, nil, nil, 36, nil, + nil, nil, nil, nil, nil, nil, 61, nil, nil, nil, + nil, 6, nil, nil, 61, 75, nil, nil, 31, nil, + 14, nil, nil, nil, nil, nil, 149, 6, 61, 149, + 151, nil, 149, 151, 149, nil, nil, 208, 14, 208, + nil, 208, nil, 208, 50, nil, 35, nil, nil, nil, + 14, nil, 35, 35, nil, nil, 35, nil, nil, nil, + nil, nil, 35, 35, 208, nil, 118, 100, 35, 35, + 14, 118, nil, 100, nil, nil, nil, nil, nil, nil, + 100, nil, 100, 40, nil, nil, 100, nil, nil, nil, + nil, 151, nil, nil, nil, 6, 6, 6, nil, 78, + 35, nil, nil, 149, 154, 149, 154, 149, 78, 149, + nil, 35, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 14, 14, nil, nil, nil, nil, nil, nil, nil, + 149, nil, nil, nil, 14, nil, nil, 54, nil, nil, + nil, nil, nil, 54, nil, 35, nil, nil, nil, nil, + 35, 35, 38, nil, 35, nil, nil, 78, 54, 154, + nil, nil, nil, 40, 6, nil, nil, 54, 54, 54, + nil, 54, nil, nil, nil, 6, nil, nil, nil, 14, + 46, 152, 152, 152, 35, nil, 14, nil, nil, nil, + nil, nil, 85, 6, 6, 6, 6, 54, 6, nil, + nil, 35, 54, 54, nil, 6, 54, nil, 71, 6, + nil, nil, 100, nil, 71, nil, nil, nil, nil, nil, + 40, nil, nil, nil, 35, nil, nil, nil, 204, 204, + nil, 204, 204, nil, 204, 151, nil, nil, 151, nil, + nil, 151, 35, 151, nil, nil, 6, 6, 6, 6, + nil, 100, 35, nil, 35, nil, nil, 6, nil, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 54, 54, + 54, 54, 54, nil, 35, 35, nil, nil, nil, 152, + 152, 152, 152, nil, 152, nil, nil, nil, nil, 154, + nil, 154, nil, 154, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 154, + nil, 154, 151, nil, 151, nil, 151, nil, 151, nil, + 35, nil, nil, nil, nil, 35, 35, nil, nil, 35, + nil, nil, 152, 152, 152, 152, nil, nil, 35, 151, + nil, nil, 35, 152, nil, nil, nil, nil, 204, 204, + 204, 204, nil, nil, nil, nil, 54, 54, 54, 54, + 54, 54, 54, nil, nil, nil, nil, 54, 54, 54, + nil, nil, nil, 154, nil, nil, nil, nil, 35, nil, + 154, 54, 154, 35, 154, nil, nil, nil, nil, nil, + 35, nil, nil, nil, nil, 35, nil, nil, nil, nil, + 80, 80, nil, nil, nil, nil, nil, 154, nil, 204, + nil, nil, nil, nil, nil, nil, nil, 54, 54, nil, + nil, nil, nil, 35, nil, nil, nil, 54, nil, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, 57, nil, nil, nil, 54, nil, nil, nil, + 54, nil, nil, nil, nil, 54, nil, 57, nil, nil, + nil, nil, nil, nil, nil, nil, 57, 57, 57, nil, + 57, nil, nil, nil, nil, nil, nil, 80, nil, 80, + nil, 54, 80, 80, nil, nil, nil, nil, nil, nil, + 54, 54, 54, nil, nil, nil, 57, nil, nil, nil, + nil, 57, 57, nil, nil, 57, nil, nil, nil, nil, + nil, 54, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 80, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, nil, nil, nil, nil, 57, 57, 57, + 57, 57, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 80, 54, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, 57, 57, 57, 57, + 57, 57, nil, nil, nil, nil, 57, 57, 57, 54, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 54, + 57, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, nil, nil, nil, nil, nil, + nil, 80, nil, nil, 80, nil, 80, 54, nil, nil, + 54, nil, nil, nil, nil, nil, 57, 57, 54, nil, + nil, nil, nil, nil, nil, nil, 57, nil, 54, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 54, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, 57, + nil, nil, nil, nil, 57, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 57, nil, nil, nil, nil, nil, nil, nil, nil, 57, + 57, 57, nil, nil, nil, 54, nil, nil, nil, nil, + nil, 54, 54, 80, nil, 54, nil, nil, nil, nil, + 57, 54, 54, nil, nil, nil, nil, 54, 54, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 80, nil, nil, nil, nil, nil, nil, + nil, nil, 80, 80, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 80, nil, nil, 80, nil, + nil, nil, nil, nil, 54, nil, nil, nil, nil, 54, + 54, nil, nil, 54, nil, nil, nil, nil, nil, 80, + nil, nil, nil, nil, 80, 57, nil, 80, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 80, nil, 54, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 54, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 80, nil, nil, nil, nil, 57, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 57, nil, + nil, nil, nil, nil, nil, 80, nil, nil, nil, nil, + nil, 54, nil, 57, nil, nil, nil, nil, nil, nil, + nil, 54, nil, 54, nil, nil, 57, nil, nil, 57, + nil, nil, nil, nil, nil, nil, nil, 57, nil, nil, + nil, nil, nil, 54, 54, 41, nil, 57, nil, nil, + nil, nil, 57, nil, 41, 41, 41, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, 41, nil, + 41, 80, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, 54, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 54, nil, nil, + nil, 54, nil, nil, 57, nil, nil, nil, nil, 80, + 57, 57, nil, nil, 57, nil, nil, nil, nil, nil, + 57, 57, nil, nil, nil, nil, 57, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 80, + nil, nil, 54, nil, nil, nil, nil, nil, nil, 54, + nil, nil, nil, nil, 54, nil, nil, nil, 28, nil, + nil, nil, nil, nil, 28, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 28, nil, 80, nil, nil, nil, nil, nil, + nil, nil, nil, 57, nil, nil, nil, nil, 57, 57, + nil, nil, 57, nil, nil, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 28, nil, + nil, nil, nil, nil, 41, 41, nil, nil, 41, 41, + nil, nil, 57, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, 57, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 57, nil, 28, 34, 41, nil, nil, nil, + nil, 34, nil, 28, 41, 41, nil, nil, nil, nil, + 57, nil, nil, nil, 41, nil, nil, nil, nil, nil, + 57, 41, 57, 41, nil, nil, 41, 41, nil, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 41, nil, nil, + nil, 41, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 28, nil, 28, + nil, nil, 28, 57, 57, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + 57, nil, 28, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, 57, nil, nil, nil, nil, nil, nil, 57, 41, + nil, nil, nil, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, 39, 39, nil, 28, nil, nil, + nil, 28, nil, nil, nil, nil, 28, nil, nil, nil, + nil, 57, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, 41, nil, 41, 41, 41, nil, 39, + 39, 39, 28, nil, 34, nil, 34, nil, nil, 34, + nil, nil, 28, 28, nil, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, 41, nil, nil, 41, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 39, 41, nil, nil, nil, + nil, nil, nil, nil, 39, 41, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, 66, nil, nil, 34, 41, nil, nil, 34, nil, + nil, nil, nil, 34, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 66, + 66, 66, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, nil, nil, 41, nil, 34, + 34, nil, nil, nil, nil, 66, nil, nil, 39, nil, + 39, nil, nil, 39, nil, 66, 66, 66, 66, 39, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, nil, nil, nil, 41, 41, 41, + nil, nil, nil, 41, nil, nil, 41, 41, 41, 41, + 28, nil, nil, nil, 41, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, 41, + 66, nil, 41, nil, nil, nil, nil, nil, 28, nil, + nil, 28, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, 39, 41, nil, nil, 39, 39, 41, nil, + nil, 41, nil, nil, 28, nil, nil, nil, nil, nil, + nil, nil, nil, 39, nil, 41, nil, nil, nil, nil, + nil, nil, nil, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, 39, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 28, 34, nil, 41, + nil, nil, 28, nil, nil, nil, 28, 41, nil, 66, + nil, nil, 28, 28, nil, nil, nil, nil, 28, 28, + 41, 41, 41, 41, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, 34, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, 66, nil, + nil, nil, 66, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, nil, nil, 66, + 28, nil, nil, nil, 28, nil, nil, nil, nil, 66, + nil, nil, nil, 41, 41, nil, nil, nil, nil, 66, + 66, nil, nil, 34, nil, nil, nil, nil, nil, 34, + nil, nil, nil, 34, 28, nil, nil, nil, nil, 34, + 34, 39, nil, 41, nil, 34, 34, nil, nil, 39, + nil, 28, nil, nil, nil, nil, nil, 39, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 28, nil, nil, nil, nil, 39, + 67, nil, 39, nil, nil, nil, 67, nil, nil, nil, + nil, nil, 28, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, 28, 39, nil, nil, nil, nil, + nil, nil, nil, nil, 67, 67, 67, nil, nil, nil, + nil, nil, 34, nil, 28, 28, nil, 34, nil, 41, + nil, 34, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, 67, 67, 67, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, nil, nil, 39, nil, nil, + nil, nil, nil, 39, nil, 28, 28, 39, 34, 28, + nil, nil, nil, 39, 39, nil, nil, nil, 28, 39, + 39, nil, 28, nil, nil, nil, nil, 66, nil, nil, + nil, 34, nil, nil, nil, 66, 67, nil, nil, nil, + nil, nil, nil, 66, nil, 67, nil, nil, nil, 34, + nil, 39, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 34, 39, 28, nil, 66, nil, nil, 66, nil, + 28, nil, nil, nil, nil, 28, nil, nil, nil, nil, + nil, 34, 34, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, 39, nil, nil, nil, + nil, 39, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, 34, 34, 39, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, 34, + nil, nil, 39, 66, 67, nil, nil, nil, nil, nil, + nil, nil, nil, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, 39, nil, nil, nil, 34, nil, nil, + nil, nil, 34, nil, nil, 39, nil, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 66, 67, + nil, nil, nil, 67, nil, 39, 39, 67, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, 66, nil, 67, nil, nil, 66, nil, nil, + nil, 66, nil, nil, 67, 67, nil, nil, nil, nil, + nil, 39, nil, nil, nil, nil, 39, 39, nil, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, 66, nil, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, 66, nil, nil, 39, nil, nil, nil, nil, nil, + nil, 39, nil, nil, nil, nil, 39, nil, nil, 66, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, 66, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, 66, 66, nil, nil, 66, nil, nil, nil, + nil, nil, 67, nil, nil, 66, nil, nil, nil, 66, + 67, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, 67, nil, 66, nil, nil, nil, nil, + 66, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, 66, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, 67, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, 67, 67, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, 67, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, 67 ] + +racc_goto_pointer = [ + nil, 122, 8, 126, nil, 49, -2, 93, 46, 17, + -109, 127, -334, -285, 12, -534, -586, -618, -708, nil, + -388, -165, 27, 138, -44, -50, 79, -21, 1976, -177, + -70, -18, 17, -79, 2103, 216, -209, -393, -18, 2247, + -19, 1832, -29, -419, nil, -588, -27, nil, nil, 132, + -164, 52, -261, -455, 965, -354, nil, 1264, 96, 23, + 51, -47, nil, -29, 22, -279, 2403, 2818, -324, 67, + -71, 5, nil, 44, -271, -77, 31, nil, -5, 115, + 1008, -186, 38, -461, 10, -16, -347, -239, -399, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 90, nil, + 34, -184, -44, nil, nil, nil, -317, -677, nil, -661, + nil, nil, nil, -344, nil, 95, nil, -207, 17, nil, + nil, -547, 94, -220, 110, 110, -172, 114, 114, -415, + -416, -696, -194, -203, -412, -695, nil, nil, nil, nil, + nil, nil, -804, -514, -546, -821, -715, -644, nil, -124, + -530, 85, 84, -642, 153, -751, -647, -601, nil, -653, + -768, -856, -851, -196, -570, 115, -396, -358, -14, -215, + nil, -78, -78, nil, -488, -539, nil, -288, -784, -356, + -504, -631, nil, nil, 137, 18, 133, 133, 137, -267, + -266, 137, 137, 144, -546, -383, -379, nil, nil, 161, + -327, -287, nil, nil, 162, -509, -365, -660, -190, -501, + -699, nil, -707, -861, nil, nil, -110, -495 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 309, 7, 360, 312, + nil, nil, nil, nil, 560, nil, nil, nil, nil, 308, + 310, nil, nil, nil, nil, 14, 15, 21, 242, nil, + nil, 17, nil, 442, 243, 340, nil, nil, 592, 241, + 478, 24, nil, nil, 355, nil, 25, 26, 27, nil, + 723, nil, nil, nil, 329, nil, 28, 326, 457, 35, + nil, nil, 37, 40, 39, nil, 238, 239, 372, nil, + 146, 465, 145, 91, nil, 447, 107, 47, 50, 274, + 300, nil, 458, nil, 459, 470, 681, 522, 298, 283, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, + nil, nil, 284, 65, 66, 67, nil, nil, 68, 865, + 69, 70, 71, nil, 72, nil, 73, nil, 573, 74, + 75, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 288, 276, 731, 856, + 582, 866, 788, 620, nil, 789, 790, 1024, 924, 608, + nil, 609, nil, nil, 610, nil, 612, nil, 835, nil, + nil, nil, 618, nil, nil, nil, nil, nil, nil, nil, + 469, nil, nil, 701, nil, nil, 510, nil, nil, nil, + nil, nil, 90, 92, 94, nil, nil, nil, nil, nil, + 638, nil, nil, nil, nil, nil, nil, 103, 104, nil, + nil, 895, 770, 607, nil, 611, 903, 623, 625, 626, + 935, 629, 630, 936, 633, 636, nil, 303 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 3, 151, :_reduce_6, + 2, 151, :_reduce_none, + 1, 154, :_reduce_none, + 0, 158, :_reduce_9, + 3, 154, :_reduce_10, + 0, 160, :_reduce_11, + 4, 157, :_reduce_12, + 0, 165, :_reduce_13, + 6, 159, :_reduce_14, + 3, 159, :_reduce_15, + 2, 161, :_reduce_16, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 3, 166, :_reduce_19, + 2, 166, :_reduce_20, + 1, 167, :_reduce_none, + 0, 168, :_reduce_22, + 3, 167, :_reduce_23, + 0, 179, :_reduce_24, + 4, 156, :_reduce_25, + 3, 156, :_reduce_26, + 3, 156, :_reduce_27, + 3, 156, :_reduce_28, + 2, 156, :_reduce_29, + 3, 156, :_reduce_30, + 3, 156, :_reduce_31, + 3, 156, :_reduce_32, + 3, 156, :_reduce_33, + 3, 156, :_reduce_34, + 4, 156, :_reduce_35, + 1, 156, :_reduce_none, + 3, 156, :_reduce_37, + 3, 156, :_reduce_38, + 3, 156, :_reduce_39, + 1, 156, :_reduce_none, + 3, 172, :_reduce_41, + 3, 172, :_reduce_42, + 6, 172, :_reduce_43, + 5, 172, :_reduce_44, + 5, 172, :_reduce_45, + 5, 172, :_reduce_46, + 5, 172, :_reduce_47, + 3, 172, :_reduce_48, + 1, 180, :_reduce_49, + 3, 180, :_reduce_50, + 1, 180, :_reduce_none, + 1, 178, :_reduce_none, + 3, 178, :_reduce_53, + 3, 178, :_reduce_54, + 3, 178, :_reduce_55, + 2, 178, :_reduce_56, + 1, 178, :_reduce_none, + 1, 171, :_reduce_58, + 0, 191, :_reduce_59, + 0, 192, :_reduce_60, + 4, 189, :_reduce_61, + 1, 174, :_reduce_none, + 1, 174, :_reduce_none, + 1, 194, :_reduce_none, + 4, 194, :_reduce_65, + 0, 202, :_reduce_66, + 4, 199, :_reduce_67, + 1, 201, :_reduce_68, + 2, 193, :_reduce_69, + 3, 193, :_reduce_70, + 4, 193, :_reduce_71, + 5, 193, :_reduce_72, + 4, 193, :_reduce_73, + 5, 193, :_reduce_74, + 2, 193, :_reduce_75, + 2, 193, :_reduce_76, + 2, 193, :_reduce_77, + 2, 193, :_reduce_78, + 2, 193, :_reduce_79, + 1, 173, :_reduce_none, + 3, 173, :_reduce_81, + 1, 207, :_reduce_none, + 3, 207, :_reduce_83, + 1, 206, :_reduce_84, + 2, 206, :_reduce_85, + 3, 206, :_reduce_86, + 5, 206, :_reduce_87, + 2, 206, :_reduce_88, + 4, 206, :_reduce_89, + 2, 206, :_reduce_90, + 4, 206, :_reduce_91, + 1, 206, :_reduce_92, + 3, 206, :_reduce_93, + 1, 210, :_reduce_none, + 3, 210, :_reduce_95, + 2, 209, :_reduce_96, + 3, 209, :_reduce_97, + 1, 212, :_reduce_98, + 3, 212, :_reduce_99, + 1, 211, :_reduce_100, + 1, 211, :_reduce_101, + 4, 211, :_reduce_102, + 3, 211, :_reduce_103, + 3, 211, :_reduce_104, + 3, 211, :_reduce_105, + 3, 211, :_reduce_106, + 2, 211, :_reduce_107, + 1, 211, :_reduce_108, + 1, 175, :_reduce_109, + 1, 175, :_reduce_110, + 4, 175, :_reduce_111, + 3, 175, :_reduce_112, + 3, 175, :_reduce_113, + 3, 175, :_reduce_114, + 3, 175, :_reduce_115, + 2, 175, :_reduce_116, + 1, 175, :_reduce_117, + 1, 215, :_reduce_118, + 1, 215, :_reduce_none, + 2, 216, :_reduce_120, + 1, 216, :_reduce_121, + 3, 216, :_reduce_122, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_126, + 1, 217, :_reduce_none, + 1, 169, :_reduce_128, + 1, 169, :_reduce_none, + 1, 170, :_reduce_130, + 0, 221, :_reduce_131, + 4, 170, :_reduce_132, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 3, 188, :_reduce_204, + 3, 188, :_reduce_205, + 6, 188, :_reduce_206, + 5, 188, :_reduce_207, + 5, 188, :_reduce_208, + 5, 188, :_reduce_209, + 5, 188, :_reduce_210, + 4, 188, :_reduce_211, + 3, 188, :_reduce_212, + 3, 188, :_reduce_213, + 3, 188, :_reduce_214, + 3, 188, :_reduce_215, + 3, 188, :_reduce_216, + 3, 188, :_reduce_217, + 3, 188, :_reduce_218, + 3, 188, :_reduce_219, + 3, 188, :_reduce_220, + 4, 188, :_reduce_221, + 2, 188, :_reduce_222, + 2, 188, :_reduce_223, + 3, 188, :_reduce_224, + 3, 188, :_reduce_225, + 3, 188, :_reduce_226, + 3, 188, :_reduce_227, + 1, 188, :_reduce_none, + 3, 188, :_reduce_229, + 3, 188, :_reduce_230, + 3, 188, :_reduce_231, + 3, 188, :_reduce_232, + 3, 188, :_reduce_233, + 2, 188, :_reduce_234, + 2, 188, :_reduce_235, + 3, 188, :_reduce_236, + 3, 188, :_reduce_237, + 3, 188, :_reduce_238, + 3, 188, :_reduce_239, + 3, 188, :_reduce_240, + 6, 188, :_reduce_241, + 1, 188, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 3, 224, :_reduce_247, + 3, 224, :_reduce_248, + 1, 227, :_reduce_249, + 1, 228, :_reduce_none, + 2, 228, :_reduce_251, + 4, 228, :_reduce_252, + 2, 228, :_reduce_253, + 1, 222, :_reduce_none, + 3, 222, :_reduce_255, + 3, 232, :_reduce_256, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 2, 183, :_reduce_261, + 4, 183, :_reduce_262, + 2, 183, :_reduce_263, + 1, 205, :_reduce_264, + 2, 205, :_reduce_265, + 2, 205, :_reduce_266, + 4, 205, :_reduce_267, + 1, 205, :_reduce_268, + 0, 236, :_reduce_269, + 2, 198, :_reduce_270, + 2, 235, :_reduce_271, + 2, 234, :_reduce_272, + 1, 234, :_reduce_none, + 1, 229, :_reduce_274, + 2, 229, :_reduce_275, + 3, 229, :_reduce_276, + 4, 229, :_reduce_277, + 1, 177, :_reduce_278, + 1, 177, :_reduce_279, + 3, 176, :_reduce_280, + 4, 176, :_reduce_281, + 2, 176, :_reduce_282, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_293, + 0, 271, :_reduce_294, + 4, 225, :_reduce_295, + 0, 272, :_reduce_296, + 3, 225, :_reduce_297, + 0, 273, :_reduce_298, + 4, 225, :_reduce_299, + 3, 225, :_reduce_300, + 3, 225, :_reduce_301, + 2, 225, :_reduce_302, + 0, 274, :_reduce_303, + 4, 225, :_reduce_304, + 0, 275, :_reduce_305, + 4, 225, :_reduce_306, + 1, 225, :_reduce_307, + 4, 225, :_reduce_308, + 3, 225, :_reduce_309, + 1, 225, :_reduce_310, + 5, 225, :_reduce_311, + 4, 225, :_reduce_312, + 3, 225, :_reduce_313, + 2, 225, :_reduce_314, + 1, 225, :_reduce_none, + 2, 225, :_reduce_316, + 1, 225, :_reduce_317, + 6, 225, :_reduce_318, + 6, 225, :_reduce_319, + 4, 225, :_reduce_320, + 4, 225, :_reduce_321, + 5, 225, :_reduce_322, + 4, 225, :_reduce_323, + 6, 225, :_reduce_324, + 0, 276, :_reduce_325, + 6, 225, :_reduce_326, + 0, 277, :_reduce_327, + 0, 278, :_reduce_328, + 8, 225, :_reduce_329, + 0, 279, :_reduce_330, + 5, 225, :_reduce_331, + 0, 280, :_reduce_332, + 6, 225, :_reduce_333, + 0, 281, :_reduce_334, + 0, 282, :_reduce_335, + 9, 225, :_reduce_336, + 1, 225, :_reduce_337, + 1, 225, :_reduce_338, + 1, 225, :_reduce_339, + 1, 225, :_reduce_340, + 1, 182, :_reduce_341, + 1, 246, :_reduce_none, + 1, 252, :_reduce_none, + 1, 255, :_reduce_none, + 1, 257, :_reduce_none, + 1, 258, :_reduce_none, + 1, 259, :_reduce_none, + 1, 261, :_reduce_none, + 1, 263, :_reduce_349, + 1, 266, :_reduce_350, + 1, 267, :_reduce_351, + 1, 283, :_reduce_none, + 1, 284, :_reduce_none, + 1, 285, :_reduce_none, + 1, 286, :_reduce_none, + 1, 287, :_reduce_none, + 1, 163, :_reduce_none, + 1, 288, :_reduce_none, + 1, 247, :_reduce_none, + 1, 204, :_reduce_none, + 1, 253, :_reduce_none, + 1, 253, :_reduce_none, + 2, 253, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 254, :_reduce_none, + 5, 254, :_reduce_367, + 1, 256, :_reduce_none, + 2, 256, :_reduce_369, + 1, 262, :_reduce_none, + 1, 262, :_reduce_371, + 1, 289, :_reduce_none, + 3, 289, :_reduce_373, + 1, 292, :_reduce_374, + 3, 292, :_reduce_375, + 1, 291, :_reduce_376, + 3, 291, :_reduce_377, + 5, 291, :_reduce_378, + 1, 291, :_reduce_379, + 3, 291, :_reduce_380, + 2, 293, :_reduce_381, + 1, 293, :_reduce_382, + 4, 294, :_reduce_383, + 2, 294, :_reduce_384, + 2, 294, :_reduce_385, + 1, 294, :_reduce_386, + 2, 299, :_reduce_387, + 1, 299, :_reduce_none, + 6, 300, :_reduce_389, + 8, 300, :_reduce_390, + 4, 300, :_reduce_391, + 6, 300, :_reduce_392, + 4, 300, :_reduce_393, + 2, 300, :_reduce_394, + 6, 300, :_reduce_395, + 2, 300, :_reduce_396, + 4, 300, :_reduce_397, + 6, 300, :_reduce_398, + 2, 300, :_reduce_399, + 4, 300, :_reduce_400, + 2, 300, :_reduce_401, + 4, 300, :_reduce_402, + 1, 300, :_reduce_403, + 1, 304, :_reduce_404, + 1, 304, :_reduce_405, + 3, 305, :_reduce_406, + 1, 305, :_reduce_407, + 4, 305, :_reduce_408, + 1, 306, :_reduce_none, + 4, 306, :_reduce_410, + 1, 307, :_reduce_411, + 3, 307, :_reduce_412, + 1, 308, :_reduce_413, + 1, 308, :_reduce_none, + 0, 312, :_reduce_415, + 0, 313, :_reduce_416, + 5, 251, :_reduce_417, + 4, 310, :_reduce_418, + 1, 310, :_reduce_419, + 3, 311, :_reduce_420, + 3, 311, :_reduce_421, + 3, 315, :_reduce_422, + 2, 195, :_reduce_423, + 4, 195, :_reduce_424, + 5, 195, :_reduce_425, + 5, 195, :_reduce_426, + 2, 250, :_reduce_427, + 4, 250, :_reduce_428, + 4, 250, :_reduce_429, + 3, 250, :_reduce_430, + 3, 250, :_reduce_431, + 3, 250, :_reduce_432, + 2, 250, :_reduce_433, + 1, 250, :_reduce_434, + 4, 250, :_reduce_435, + 0, 318, :_reduce_436, + 4, 249, :_reduce_437, + 0, 319, :_reduce_438, + 4, 249, :_reduce_439, + 0, 320, :_reduce_440, + 0, 321, :_reduce_441, + 4, 200, :_reduce_442, + 0, 323, :_reduce_443, + 0, 324, :_reduce_444, + 4, 316, :_reduce_445, + 1, 322, :_reduce_446, + 2, 322, :_reduce_447, + 3, 322, :_reduce_448, + 4, 322, :_reduce_449, + 0, 326, :_reduce_450, + 6, 260, :_reduce_451, + 1, 325, :_reduce_none, + 1, 325, :_reduce_none, + 6, 162, :_reduce_454, + 0, 162, :_reduce_455, + 1, 327, :_reduce_456, + 1, 327, :_reduce_none, + 1, 327, :_reduce_none, + 2, 328, :_reduce_459, + 1, 328, :_reduce_none, + 2, 164, :_reduce_461, + 1, 164, :_reduce_none, + 1, 237, :_reduce_463, + 1, 237, :_reduce_none, + 1, 238, :_reduce_465, + 1, 330, :_reduce_466, + 1, 330, :_reduce_none, + 2, 330, :_reduce_468, + 3, 331, :_reduce_469, + 1, 331, :_reduce_470, + 3, 239, :_reduce_471, + 3, 240, :_reduce_472, + 3, 241, :_reduce_473, + 3, 241, :_reduce_474, + 1, 335, :_reduce_475, + 3, 335, :_reduce_476, + 1, 336, :_reduce_none, + 2, 336, :_reduce_478, + 3, 243, :_reduce_479, + 3, 243, :_reduce_480, + 1, 338, :_reduce_481, + 3, 338, :_reduce_482, + 3, 242, :_reduce_483, + 3, 242, :_reduce_484, + 3, 244, :_reduce_485, + 3, 244, :_reduce_486, + 1, 339, :_reduce_487, + 3, 339, :_reduce_488, + 1, 340, :_reduce_489, + 3, 340, :_reduce_490, + 1, 332, :_reduce_491, + 2, 332, :_reduce_492, + 1, 333, :_reduce_493, + 2, 333, :_reduce_494, + 1, 334, :_reduce_495, + 2, 334, :_reduce_496, + 1, 337, :_reduce_497, + 0, 342, :_reduce_498, + 3, 337, :_reduce_499, + 0, 343, :_reduce_500, + 4, 337, :_reduce_501, + 1, 341, :_reduce_502, + 1, 341, :_reduce_503, + 1, 341, :_reduce_504, + 1, 341, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 2, 344, :_reduce_508, + 1, 344, :_reduce_509, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 3, 345, :_reduce_514, + 1, 329, :_reduce_none, + 2, 329, :_reduce_516, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 214, :_reduce_526, + 1, 214, :_reduce_527, + 1, 214, :_reduce_528, + 1, 214, :_reduce_529, + 1, 214, :_reduce_530, + 1, 214, :_reduce_531, + 1, 214, :_reduce_532, + 1, 245, :_reduce_533, + 1, 245, :_reduce_534, + 1, 181, :_reduce_535, + 1, 181, :_reduce_536, + 1, 186, :_reduce_537, + 1, 186, :_reduce_538, + 0, 347, :_reduce_539, + 4, 264, :_reduce_540, + 1, 264, :_reduce_541, + 3, 268, :_reduce_542, + 0, 349, :_reduce_543, + 3, 268, :_reduce_544, + 4, 348, :_reduce_545, + 2, 348, :_reduce_546, + 2, 348, :_reduce_547, + 1, 348, :_reduce_none, + 2, 351, :_reduce_549, + 0, 351, :_reduce_550, + 6, 314, :_reduce_551, + 8, 314, :_reduce_552, + 4, 314, :_reduce_553, + 6, 314, :_reduce_554, + 4, 314, :_reduce_555, + 6, 314, :_reduce_556, + 2, 314, :_reduce_557, + 4, 314, :_reduce_558, + 6, 314, :_reduce_559, + 2, 314, :_reduce_560, + 4, 314, :_reduce_561, + 2, 314, :_reduce_562, + 4, 314, :_reduce_563, + 1, 314, :_reduce_564, + 0, 314, :_reduce_565, + 1, 309, :_reduce_566, + 1, 309, :_reduce_567, + 1, 309, :_reduce_568, + 1, 309, :_reduce_569, + 1, 290, :_reduce_none, + 1, 290, :_reduce_571, + 1, 353, :_reduce_none, + 1, 354, :_reduce_none, + 3, 354, :_reduce_574, + 1, 301, :_reduce_575, + 3, 301, :_reduce_576, + 1, 355, :_reduce_none, + 2, 356, :_reduce_578, + 1, 356, :_reduce_579, + 2, 357, :_reduce_580, + 1, 357, :_reduce_581, + 1, 295, :_reduce_none, + 3, 295, :_reduce_583, + 1, 350, :_reduce_none, + 3, 350, :_reduce_585, + 1, 358, :_reduce_none, + 1, 358, :_reduce_none, + 2, 296, :_reduce_588, + 1, 296, :_reduce_589, + 3, 359, :_reduce_590, + 3, 360, :_reduce_591, + 1, 302, :_reduce_592, + 3, 302, :_reduce_593, + 1, 352, :_reduce_594, + 3, 352, :_reduce_595, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 2, 303, :_reduce_598, + 1, 303, :_reduce_599, + 1, 362, :_reduce_none, + 1, 362, :_reduce_none, + 2, 298, :_reduce_602, + 2, 297, :_reduce_603, + 0, 297, :_reduce_604, + 1, 269, :_reduce_none, + 0, 363, :_reduce_606, + 4, 269, :_reduce_607, + 1, 248, :_reduce_608, + 2, 248, :_reduce_none, + 1, 231, :_reduce_none, + 3, 231, :_reduce_611, + 3, 364, :_reduce_612, + 2, 364, :_reduce_613, + 4, 364, :_reduce_614, + 2, 364, :_reduce_615, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 317, :_reduce_none, + 1, 317, :_reduce_none, + 1, 317, :_reduce_none, + 1, 270, :_reduce_none, + 1, 270, :_reduce_none, + 1, 185, :_reduce_none, + 1, 185, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 187, :_reduce_none, + 1, 187, :_reduce_none, + 2, 208, :_reduce_636, + 2, 184, :_reduce_637, + 0, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 265, :_reduce_641, + 1, 265, :_reduce_none, + 1, 155, :_reduce_none, + 2, 155, :_reduce_644, + 0, 153, :_reduce_645 ] + +racc_reduce_n = 646 + +racc_shift_n = 1091 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLONELY => 142, + :tLOWEST => 143, + :tEQL => 144, + :tBDOT2 => 145, + :tBDOT3 => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLONELY", + "tLOWEST", + "tEQL", + "tBDOT2", + "tBDOT3", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "@3", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@4", + "stmts", + "stmt_or_begin", + "@5", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@6", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@7", + "@8", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@9", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@10", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@11", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "dot_or_colon", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "@23", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@24", + "@25", + "f_args", + "do_block", + "do_body", + "operation3", + "@26", + "@27", + "@28", + "@29", + "case_args", + "@30", + "@31", + "cases", + "@32", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "@34", + "ssym", + "dsym", + "sym", + "@35", + "args_tail", + "@36", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@37", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_12(val, _values, result) + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_13(val, _values, result) + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + + result +end + +def _reduce_14(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_15(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_16(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 17 omitted + +# reduce 18 omitted + +def _reduce_19(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_20(val, _values, result) + result = val[1] + debug 12 + + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_23(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_24(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_25(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_27(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_28(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_29(val, _values, result) + result = val[1] + + result +end + +def _reduce_30(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_31(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_33(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_34(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_35(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_38(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_49(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +def _reduce_50(val, _values, result) + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_54(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_55(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_56(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +# reduce 57 omitted + +def _reduce_58(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_59(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_60(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_61(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 62 omitted + +# reduce 63 omitted + +# reduce 64 omitted + +def _reduce_65(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_66(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_67(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_68(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_69(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_70(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_71(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_72(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_73(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_74(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_75(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_76(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_77(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_78(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_79(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 80 omitted + +def _reduce_81(val, _values, result) + result = val[1] + + result +end + +# reduce 82 omitted + +def _reduce_83(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_84(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_85(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_86(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_87(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_88(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_89(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_90(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_91(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_92(val, _values, result) + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_93(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 94 omitted + +def _reduce_95(val, _values, result) + result = val[1] + + result +end + +def _reduce_96(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_97(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_98(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_99(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_100(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_101(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_102(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_103(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_104(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_105(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_106(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_107(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_108(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_109(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_110(val, _values, result) + var, = val + + result = self.assignable var + + debug 16 + + result +end + +def _reduce_111(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_112(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_113(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_114(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_115(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_116(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_117(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_118(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 119 omitted + +def _reduce_120(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_121(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_122(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +def _reduce_126(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 127 omitted + +def _reduce_128(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 129 omitted + +def _reduce_130(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_131(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_132(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +def _reduce_204(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_205(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_206(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_207(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_208(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_209(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_210(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_211(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_212(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_213(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_214(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_215(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_221(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_222(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_223(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_224(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 228 omitted + +def _reduce_229(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_232(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_233(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_234(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_235(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_236(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_238(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_239(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_240(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_241(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +# reduce 242 omitted + +# reduce 243 omitted + +# reduce 244 omitted + +# reduce 245 omitted + +# reduce 246 omitted + +def _reduce_247(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_248(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_249(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 250 omitted + +def _reduce_251(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_252(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_253(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 254 omitted + +def _reduce_255(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_256(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +# reduce 257 omitted + +# reduce 258 omitted + +# reduce 259 omitted + +# reduce 260 omitted + +def _reduce_261(val, _values, result) + result = args val + + result +end + +def _reduce_262(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_263(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_264(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_265(val, _values, result) + result = call_args val + + result +end + +def _reduce_266(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_267(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_268(val, _values, result) + result = call_args val + + result +end + +def _reduce_269(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_270(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_271(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_272(val, _values, result) + result = val[1] + + result +end + +# reduce 273 omitted + +def _reduce_274(val, _values, result) + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + + result +end + +def _reduce_275(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_276(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_277(val, _values, result) + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_278(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_279(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_280(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_281(val, _values, result) + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_282(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 283 omitted + +# reduce 284 omitted + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +# reduce 290 omitted + +# reduce 291 omitted + +# reduce 292 omitted + +def _reduce_293(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_294(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_295(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_296(val, _values, result) + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + + result +end + +def _reduce_297(val, _values, result) + _, line, _ = val + result = s(:begin).line line + + result +end + +def _reduce_298(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_299(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_300(val, _values, result) + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + + result +end + +def _reduce_301(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_302(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_303(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_304(val, _values, result) + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_305(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_306(val, _values, result) + result = new_hash val + + result +end + +def _reduce_307(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_308(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_309(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_310(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_311(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_312(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_313(val, _values, result) + debug 20 + + result +end + +def _reduce_314(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 315 omitted + +def _reduce_316(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_317(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_318(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_319(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_320(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_321(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_322(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_323(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_324(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_325(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_326(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_327(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_328(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_329(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_330(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_331(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_332(val, _values, result) + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result +end + +def _reduce_333(val, _values, result) + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_334(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_335(val, _values, result) + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + + result +end + +def _reduce_336(val, _values, result) + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_337(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_338(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_339(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_340(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_341(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 342 omitted + +# reduce 343 omitted + +# reduce 344 omitted + +# reduce 345 omitted + +# reduce 346 omitted + +# reduce 347 omitted + +# reduce 348 omitted + +def _reduce_349(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_350(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_351(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +# reduce 352 omitted + +# reduce 353 omitted + +# reduce 354 omitted + +# reduce 355 omitted + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +# reduce 360 omitted + +# reduce 361 omitted + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +# reduce 366 omitted + +def _reduce_367(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 368 omitted + +def _reduce_369(val, _values, result) + result = val[1] + + result +end + +# reduce 370 omitted + +def _reduce_371(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +# reduce 372 omitted + +def _reduce_373(val, _values, result) + result = val[1] + + result +end + +def _reduce_374(val, _values, result) + sym, = val + + result = s(:array, sym).line lexer.lineno + + result +end + +def _reduce_375(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_376(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_377(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_378(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_379(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_380(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_381(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_382(val, _values, result) + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + + result +end + +def _reduce_383(val, _values, result) + result = call_args val + + result +end + +def _reduce_384(val, _values, result) + result = call_args val + + result +end + +def _reduce_385(val, _values, result) + result = call_args val + + result +end + +def _reduce_386(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_387(val, _values, result) + result = args val + + result +end + +# reduce 388 omitted + +def _reduce_389(val, _values, result) + result = args val + + result +end + +def _reduce_390(val, _values, result) + result = args val + + result +end + +def _reduce_391(val, _values, result) + result = args val + + result +end + +def _reduce_392(val, _values, result) + result = args val + + result +end + +def _reduce_393(val, _values, result) + result = args val + + result +end + +def _reduce_394(val, _values, result) + result = args(val) << nil + + result +end + +def _reduce_395(val, _values, result) + result = args val + + result +end + +def _reduce_396(val, _values, result) + result = args val + + result +end + +def _reduce_397(val, _values, result) + result = args val + + result +end + +def _reduce_398(val, _values, result) + result = args val + + result +end + +def _reduce_399(val, _values, result) + result = args val + + result +end + +def _reduce_400(val, _values, result) + result = args val + + result +end + +def _reduce_401(val, _values, result) + result = args val + + result +end + +def _reduce_402(val, _values, result) + result = args val + + result +end + +def _reduce_403(val, _values, result) + result = args val + + result +end + +def _reduce_404(val, _values, result) + result = 0 + result +end + +def _reduce_405(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_406(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +def _reduce_407(val, _values, result) + result = s(:args).line lexer.lineno + + result +end + +def _reduce_408(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +# reduce 409 omitted + +def _reduce_410(val, _values, result) + result = args val + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +def _reduce_412(val, _values, result) + result = args val + + result +end + +def _reduce_413(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 414 omitted + +def _reduce_415(val, _values, result) + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_416(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_417(val, _values, result) + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_418(val, _values, result) + result = args val + + result +end + +def _reduce_419(val, _values, result) + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_420(val, _values, result) + result = val[1] + + result +end + +def _reduce_421(val, _values, result) + result = val[1] + + result +end + +def _reduce_422(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_423(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_424(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_425(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_426(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_427(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_428(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_429(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_430(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_431(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_432(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_433(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_434(val, _values, result) + result = s(:zsuper).line lexer.lineno + + result +end + +def _reduce_435(val, _values, result) + result = new_aref val + + result +end + +def _reduce_436(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_437(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_438(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_439(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_440(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_441(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_442(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_443(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_444(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_445(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_446(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_447(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_448(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_449(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_450(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_451(val, _values, result) + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + + result +end + +# reduce 452 omitted + +# reduce 453 omitted + +def _reduce_454(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_455(val, _values, result) + result = nil + + result +end + +def _reduce_456(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 457 omitted + +# reduce 458 omitted + +def _reduce_459(val, _values, result) + result = val[1] + + result +end + +# reduce 460 omitted + +def _reduce_461(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 462 omitted + +def _reduce_463(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 464 omitted + +def _reduce_465(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_466(val, _values, result) + debug 37 + + result +end + +# reduce 467 omitted + +def _reduce_468(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_469(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_470(val, _values, result) + result = new_string val + + result +end + +def _reduce_471(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_472(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_473(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_474(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_475(val, _values, result) + result = new_word_list + + result +end + +def _reduce_476(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 477 omitted + +def _reduce_478(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_479(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_480(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_481(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_482(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_483(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_484(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_485(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_486(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_487(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_488(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_489(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_490(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_491(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_492(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_493(val, _values, result) + result = nil + + result +end + +def _reduce_494(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_495(val, _values, result) + result = nil + + result +end + +def _reduce_496(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_497(val, _values, result) + result = new_string val + + result +end + +def _reduce_498(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_499(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_500(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_501(val, _values, result) + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_502(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_503(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_504(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 505 omitted + +# reduce 506 omitted + +# reduce 507 omitted + +def _reduce_508(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_509(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 510 omitted + +# reduce 511 omitted + +# reduce 512 omitted + +# reduce 513 omitted + +def _reduce_514(val, _values, result) + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + + result +end + +# reduce 515 omitted + +def _reduce_516(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 517 omitted + +# reduce 518 omitted + +# reduce 519 omitted + +# reduce 520 omitted + +# reduce 521 omitted + +# reduce 522 omitted + +# reduce 523 omitted + +# reduce 524 omitted + +# reduce 525 omitted + +def _reduce_526(val, _values, result) + result = s(:nil).line lexer.lineno + result +end + +def _reduce_527(val, _values, result) + result = s(:self).line lexer.lineno + result +end + +def _reduce_528(val, _values, result) + result = s(:true).line lexer.lineno + result +end + +def _reduce_529(val, _values, result) + result = s(:false).line lexer.lineno + result +end + +def _reduce_530(val, _values, result) + result = s(:str, self.file).line lexer.lineno + result +end + +def _reduce_531(val, _values, result) + result = s(:lit, lexer.lineno).line lexer.lineno + result +end + +def _reduce_532(val, _values, result) + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_533(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + + result +end + +def _reduce_534(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_535(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_536(val, _values, result) + result = self.assignable val[0] + debug 40 + + result +end + +def _reduce_537(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_538(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_539(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_540(val, _values, result) + result = val[2] + + result +end + +def _reduce_541(val, _values, result) + result = nil + + result +end + +def _reduce_542(val, _values, result) + result = end_args val + + result +end + +def _reduce_543(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_544(val, _values, result) + result = end_args val + + result +end + +def _reduce_545(val, _values, result) + result = args val + + result +end + +def _reduce_546(val, _values, result) + result = args val + + result +end + +def _reduce_547(val, _values, result) + result = args val + + result +end + +# reduce 548 omitted + +def _reduce_549(val, _values, result) + result = val[1] + + result +end + +def _reduce_550(val, _values, result) + result = nil + + result +end + +def _reduce_551(val, _values, result) + result = args val + + result +end + +def _reduce_552(val, _values, result) + result = args val + + result +end + +def _reduce_553(val, _values, result) + result = args val + + result +end + +def _reduce_554(val, _values, result) + result = args val + + result +end + +def _reduce_555(val, _values, result) + result = args val + + result +end + +def _reduce_556(val, _values, result) + result = args val + + result +end + +def _reduce_557(val, _values, result) + result = args val + + result +end + +def _reduce_558(val, _values, result) + result = args val + + result +end + +def _reduce_559(val, _values, result) + result = args val + + result +end + +def _reduce_560(val, _values, result) + result = args val + + result +end + +def _reduce_561(val, _values, result) + result = args val + + result +end + +def _reduce_562(val, _values, result) + result = args val + + result +end + +def _reduce_563(val, _values, result) + result = args val + + result +end + +def _reduce_564(val, _values, result) + result = args val + + result +end + +def _reduce_565(val, _values, result) + result = args val + # result.line lexer.lineno + + result +end + +def _reduce_566(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_567(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_568(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_569(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 570 omitted + +def _reduce_571(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 572 omitted + +# reduce 573 omitted + +def _reduce_574(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_575(val, _values, result) + result = new_arg val + + result +end + +def _reduce_576(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +# reduce 577 omitted + +def _reduce_578(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_579(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_580(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_581(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 582 omitted + +def _reduce_583(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 584 omitted + +def _reduce_585(val, _values, result) + result = args val + + result +end + +# reduce 586 omitted + +# reduce 587 omitted + +def _reduce_588(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_589(val, _values, result) + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + + result +end + +def _reduce_590(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + + result +end + +def _reduce_591(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + + result +end + +def _reduce_592(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_593(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_594(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_595(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 596 omitted + +# reduce 597 omitted + +def _reduce_598(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_599(val, _values, result) + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + + result +end + +# reduce 600 omitted + +# reduce 601 omitted + +def _reduce_602(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_603(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_604(val, _values, result) + result = nil + + result +end + +# reduce 605 omitted + +def _reduce_606(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_607(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_608(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 609 omitted + +# reduce 610 omitted + +def _reduce_611(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_612(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_613(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_614(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_615(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 616 omitted + +# reduce 617 omitted + +# reduce 618 omitted + +# reduce 619 omitted + +# reduce 620 omitted + +# reduce 621 omitted + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +# reduce 626 omitted + +# reduce 627 omitted + +# reduce 628 omitted + +# reduce 629 omitted + +# reduce 630 omitted + +# reduce 631 omitted + +# reduce 632 omitted + +# reduce 633 omitted + +# reduce 634 omitted + +# reduce 635 omitted + +def _reduce_636(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_637(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 638 omitted + +# reduce 639 omitted + +# reduce 640 omitted + +def _reduce_641(val, _values, result) + yyerrok + result +end + +# reduce 642 omitted + +# reduce 643 omitted + +def _reduce_644(val, _values, result) + yyerrok + result +end + +def _reduce_645(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby24Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby24_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby24_parser.y new file mode 100644 index 000000000..7be3565dd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby24_parser.y @@ -0,0 +1,2745 @@ +# -*- racc -*- + +class Ruby24Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + compstmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + + f_opt: f_arg_asgn tEQL arg_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + + f_block_opt: f_arg_asgn tEQL primary_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby25_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby25_parser.rb new file mode 100644 index 000000000..b793ed2ec --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby25_parser.rb @@ -0,0 +1,11212 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby25Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -521, 639, 574, 224, 225, -109, -95, -521, -521, -521, + -110, 574, -521, -521, -521, -103, -521, -117, 574, 224, + 225, -81, 574, 655, -521, 285, -521, -521, -521, -116, + 234, -109, -535, 658, 3, -536, -521, -521, 230, -521, + -521, -521, -521, -521, -112, 280, 737, 224, 225, 736, + -110, 95, -105, -114, 574, 889, 748, -104, 737, 96, + 126, 739, 641, 640, 637, -111, 235, -521, -521, -521, + -521, -521, -521, -521, -521, -521, -521, -521, -521, -521, + -521, -117, -103, -521, -521, -521, 654, -521, -521, -109, + 282, -521, -110, 235, -521, -521, 657, -521, 285, -521, + 221, -521, 231, -521, -521, -521, -521, -521, -521, -521, + -100, -521, 287, -521, 222, -101, 130, -103, -116, -105, + -103, 129, -108, -619, -104, 130, -521, -521, -521, -521, + 129, -521, 130, -521, -107, -103, 130, 129, -521, -524, + -112, 129, -521, -114, -521, -109, -524, -524, -524, -103, + -109, -524, -524, -524, -105, -524, 130, -105, -105, -104, + 888, 129, -104, -524, -110, -524, -524, -524, 130, -110, + -102, 951, -105, 129, -111, -524, -524, -104, -524, -524, + -524, -524, -524, -113, -102, 287, -115, -113, 285, -115, + -521, 837, 224, 225, 837, -117, -524, -521, -531, 232, + -117, 224, 225, -524, 223, -531, -524, -524, -524, -524, + -524, -524, -524, -524, -524, -524, -524, -524, -524, -524, + 108, 109, -524, -524, -524, 836, -524, -524, 836, 854, + -524, 285, -116, -524, -524, 855, -524, -116, -524, 226, + -524, -108, -524, -524, -524, -524, -524, -524, -524, 483, + -524, -102, -524, -619, -112, -620, -117, -114, 639, -112, + 639, -619, -114, 275, -620, -524, -524, -524, -524, 232, + -524, -301, -524, 337, 553, 287, 828, -524, -301, -301, + -301, -524, 235, -524, -301, -301, -102, -301, -111, -102, + 624, 235, -104, -111, -106, -535, 282, -113, 110, 111, + -115, 627, -113, 829, -102, -115, -117, -301, -301, 676, + -301, -301, -301, -301, -301, 108, 109, -530, 287, 641, + 640, 641, 640, 338, -530, 639, -117, 130, 799, 235, + 801, -116, 129, -112, 635, 634, -616, -100, -301, -301, + -301, -301, -301, -301, -301, -301, -301, -301, -301, -301, + -301, -301, -109, 401, -301, -301, -301, 230, 682, 588, + -114, 677, -301, 589, 229, -301, -112, -617, 628, 868, + -301, 581, -301, 227, -301, -301, -301, -301, -301, -301, + -301, 624, -301, -341, -301, 404, 641, 640, 637, -521, + -341, -536, 627, 110, 111, 553, -521, -301, -301, -341, + -106, -616, -301, -623, 922, -521, 710, 815, 407, -301, + -623, -623, -623, -301, 410, -115, -623, -623, -114, -623, + -524, 231, -532, -616, 427, 635, 634, -524, -623, -532, + 639, 255, -617, -101, 230, 432, -524, -107, 639, -623, + -623, 480, -623, -623, -623, -623, -623, -341, -110, -533, + 481, -529, -116, -521, -617, -526, -533, 639, -529, 628, + 482, -111, -526, 252, -111, -533, 737, 254, 253, 739, + -623, -623, -623, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -623, -623, -524, 484, -623, -623, -623, -534, + 683, 641, 640, 642, -623, 485, -534, -623, 231, 641, + 640, 647, -623, 639, -623, -534, -623, -623, -623, -623, + -623, -623, -623, -533, -623, -623, -623, 676, 641, 640, + 652, 234, 619, 514, 616, 615, 614, 624, 617, -623, + -623, 523, -104, -527, -623, 526, 230, -528, 627, 601, + -527, -623, -623, 546, -528, -623, 602, -113, 528, -623, + -623, -623, 544, -534, -623, -623, -623, 255, -623, -103, + 622, 272, 273, -80, 641, 640, 659, -623, -623, -623, + -623, 635, 634, 737, -112, -623, 739, 235, -623, -623, + 1049, -623, -623, -623, -623, -623, 130, 235, -292, 252, + 539, 129, 230, 254, 253, -292, 271, 270, 639, 556, + 231, 644, 130, 540, -292, 628, 547, 129, 481, -623, + -623, -623, -623, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -623, 224, 225, -623, -623, -623, -623, 830, + -623, 864, 868, -623, 677, -623, -623, -623, 292, -623, + -619, -623, 235, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -292, -623, -623, -623, 231, 282, 429, 641, + 640, 130, -623, 431, 430, 550, 129, 230, -623, -623, + -623, -623, 815, -623, 585, -623, -105, 130, 635, 634, + -623, -301, 129, 583, -623, 554, -113, 255, -301, -301, + -301, -114, -623, -301, -301, -301, 619, -301, 616, 615, + 614, 624, 617, 230, 864, 868, 130, -301, -301, -301, + 591, 129, 627, 235, -102, 581, 420, -301, -301, 593, + -301, -301, -301, -301, -301, 586, 587, 595, 646, -111, + 650, 231, 653, 656, 622, 605, 619, 663, 616, 615, + 614, -274, 617, 632, 631, 635, 634, 665, -301, -301, + -301, -301, -301, -301, -301, -301, -301, -301, -301, -301, + -301, -301, 666, 670, -301, -301, -301, 231, 831, -301, + 235, 674, -301, 675, 787, -301, -301, 282, -301, 628, + -301, 687, -301, 791, -301, -301, -301, -301, -301, -301, + -301, 255, -301, 255, -301, 619, 255, 616, 615, 614, + 624, 617, 133, 134, 135, 136, 137, -301, -301, -301, + -301, 627, -301, -301, -301, 255, 694, 235, 235, -301, + -301, -301, -301, -301, 427, -115, -301, -301, 235, -301, + 230, -302, -95, 622, 714, 235, 559, 669, -302, 725, + 730, -302, 632, 631, 635, 634, 667, -302, -302, -301, + -301, -301, -301, -301, -301, -301, -301, -302, -301, -301, + 733, 235, 235, -620, 741, 528, -301, -301, 744, 733, + 619, -620, 616, 615, 614, -301, 617, 733, 628, 581, + -301, -301, -301, -301, -301, -301, -301, -301, -301, -301, + -301, -301, -301, -301, 231, -302, -301, -301, -301, 733, + 682, 769, 775, 778, -301, -302, 779, -301, 787, 781, + 783, 255, -301, 785, -301, -301, -301, -301, -301, -301, + -301, -301, -301, -301, -301, 619, -301, 616, 615, 614, + 624, 617, 619, 794, 616, 615, 614, 795, 617, -301, + -301, 627, -301, 252, -301, -623, 796, 254, 253, 250, + 251, -301, -623, -623, -623, -301, 802, -115, -623, -623, + 803, -623, 230, 622, 133, 134, 135, 136, 137, 1033, + -623, -275, 632, 631, 635, 634, 230, 816, 593, 514, + 514, -623, -623, 1039, -623, -623, -623, -623, -623, 911, + 912, 230, 1037, 913, 124, 125, 235, 833, 1033, 275, + 619, 842, 616, 615, 614, 844, 617, 593, 628, 526, + 528, 725, -623, -623, -623, -623, -623, -623, -623, -623, + -623, -623, -623, -623, -623, -623, 231, 235, -623, -623, + -623, 619, 683, 616, 615, 614, -623, 617, 787, -623, + 231, 282, 282, 255, -623, 725, -623, 791, -623, -623, + -623, -623, -623, -623, -623, 231, -623, -623, -623, 265, + 266, 1014, 255, 616, 615, 614, 868, 617, 733, 787, + 235, -623, -623, 235, -623, 252, -623, 258, 791, 254, + 253, 250, 251, -623, -434, 733, 235, -623, 906, -113, + 907, -434, -434, -434, 235, 916, -434, -434, -434, 619, + -434, 616, 615, 614, 624, 617, 255, -276, 235, -434, + -434, -434, 921, 938, 725, 627, -274, 943, 733, 733, + -434, -434, 733, -434, -434, -434, -434, -434, 619, 733, + 616, 615, 614, 733, 617, 235, 963, 622, 252, 235, + 778, 966, 254, 253, 250, 251, 632, 631, 635, 634, + 968, -434, -434, -434, -434, -434, -434, -434, -434, -434, + -434, -434, -434, -434, -434, 970, 787, -434, -434, -434, + 972, 972, -434, 235, 282, -434, 979, -277, -434, -434, + 980, -434, 628, -434, 778, -434, 983, -434, -434, -434, + -434, -434, -434, -434, 986, -434, -434, -434, 619, 988, + 616, 615, 614, 624, 617, 133, 134, 135, 136, 137, + -434, -434, 990, -434, 627, -434, -310, 133, 134, 135, + 136, 137, -434, -310, -310, -310, -434, 235, -310, -310, + -310, 992, -310, 255, 769, 619, 622, 616, 615, 614, + 1010, 617, -310, -310, 1011, 632, 631, 635, 634, 265, + 266, 1020, -310, -310, 1021, -310, -310, -310, -310, -310, + 1014, 1031, 616, 615, 614, 252, 617, 258, 1034, 254, + 253, 250, 251, 787, 854, 256, 1040, 257, 733, 1050, + 972, 628, 972, -310, -310, -310, -310, -310, -310, -310, + -310, -310, -310, -310, -310, -310, -310, 972, 778, -310, + -310, -310, 1057, 1059, -310, 1061, 292, -310, 1063, 1063, + -310, -310, 730, -310, 733, -310, 1021, -310, -620, -310, + -310, -310, -310, -310, -310, -310, -619, -310, 235, -310, + 619, 972, 616, 615, 614, 624, 617, 1084, 1063, 1063, + 1063, 1063, -310, -310, nil, -310, 627, -310, -293, nil, + nil, nil, nil, nil, -310, -293, -293, -293, -310, nil, + -293, -293, -293, nil, -293, 255, nil, nil, 622, nil, + nil, nil, nil, nil, -293, -293, -293, 632, 631, 635, + 634, 265, 266, nil, -293, -293, nil, -293, -293, -293, + -293, -293, nil, nil, nil, nil, nil, 252, nil, 258, + nil, 254, 253, 250, 251, nil, nil, 256, nil, 257, + nil, nil, nil, 628, nil, -293, -293, -293, -293, -293, + -293, -293, -293, -293, -293, -293, -293, -293, -293, nil, + nil, -293, -293, -293, nil, nil, -293, nil, nil, -293, + nil, nil, -293, -293, nil, -293, nil, -293, nil, -293, + nil, -293, -293, -293, -293, -293, -293, -293, nil, -293, + nil, -293, 619, nil, 616, 615, 614, 624, 617, nil, + nil, nil, nil, nil, -293, -293, -293, -293, 627, -293, + -645, -293, nil, nil, nil, nil, -293, -645, -645, -645, + -293, nil, -645, -645, -645, nil, -645, 255, nil, nil, + 622, nil, nil, nil, nil, -645, -645, -645, nil, 632, + 631, 635, 634, 265, 266, nil, -645, -645, nil, -645, + -645, -645, -645, -645, nil, nil, nil, nil, nil, 252, + nil, 258, nil, 254, 253, 250, 251, 235, nil, nil, + nil, nil, nil, nil, nil, 628, nil, -645, -645, -645, + -645, -645, -645, -645, -645, -645, -645, -645, -645, -645, + -645, nil, nil, -645, -645, -645, nil, nil, -645, nil, + 282, -645, nil, nil, -645, -645, nil, -645, nil, -645, + nil, -645, nil, -645, -645, -645, -645, -645, -645, -645, + nil, -645, -645, -645, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, -645, -645, nil, -645, + 627, -645, -624, nil, nil, nil, nil, nil, -645, -624, + -624, -624, -645, nil, -624, -624, -624, nil, -624, 255, + nil, nil, 622, nil, nil, nil, nil, -624, -624, -624, + -624, 632, 631, 635, 634, 265, 266, nil, -624, -624, + nil, -624, -624, -624, -624, -624, nil, nil, nil, nil, + nil, 252, nil, nil, nil, 254, 253, 250, 251, nil, + nil, nil, nil, nil, nil, nil, nil, 628, nil, -624, + -624, -624, -624, -624, -624, -624, -624, -624, -624, -624, + -624, -624, -624, nil, nil, -624, -624, -624, nil, nil, + -624, nil, nil, -624, nil, nil, -624, -624, nil, -624, + nil, -624, nil, -624, nil, -624, -624, -624, -624, -624, + -624, -624, nil, -624, -624, -624, 619, nil, 616, 615, + 614, 624, 617, nil, nil, nil, nil, nil, -624, -624, + -624, -624, 627, -624, -625, -624, nil, nil, nil, nil, + -624, -625, -625, -625, -624, nil, -625, -625, -625, nil, + -625, nil, nil, nil, 622, nil, nil, nil, nil, -625, + -625, -625, -625, nil, nil, 635, 634, nil, nil, nil, + -625, -625, nil, -625, -625, -625, -625, -625, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 628, + nil, -625, -625, -625, -625, -625, -625, -625, -625, -625, + -625, -625, -625, -625, -625, nil, nil, -625, -625, -625, + nil, nil, -625, nil, nil, -625, nil, nil, -625, -625, + nil, -625, nil, -625, nil, -625, nil, -625, -625, -625, + -625, -625, -625, -625, nil, -625, -625, -625, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + -625, -625, -625, -625, nil, -625, -645, -625, nil, nil, + nil, nil, -625, -645, -645, -645, -625, nil, -645, -645, + -645, nil, -645, nil, nil, nil, nil, nil, nil, nil, + nil, -645, -645, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -645, -645, nil, -645, -645, -645, -645, -645, + nil, nil, nil, nil, nil, nil, nil, 512, 464, nil, + nil, 513, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, nil, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, -645, nil, nil, 175, 176, 161, + 162, -645, nil, nil, nil, nil, 282, -645, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, -645, -645, + 177, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -645, nil, nil, nil, nil, -645, nil, nil, + 170, nil, nil, nil, -645, nil, nil, nil, -645, 8, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, 671, 11, 49, 10, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, -249, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, 671, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, 235, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 315, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, 248, 249, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, 269, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, -646, -646, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, 268, 263, 264, nil, -646, -646, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 8, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 10, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, -646, -646, -646, -646, + 272, 273, nil, nil, -646, -646, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, nil, nil, 263, 264, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, 255, 259, 260, 261, 262, + 272, 273, 267, nil, 263, 264, nil, nil, nil, nil, + nil, 265, 266, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, 252, nil, 258, + 48, 254, 253, 250, 251, 271, 270, 256, 23, 257, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 311, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, 313, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, 10, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 304, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 301, nil, 299, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 302, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 305, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 301, nil, 299, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, nil, nil, 324, nil, + 627, 320, nil, nil, 62, 63, nil, nil, 64, nil, + 319, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 328, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 334, nil, nil, + nil, nil, nil, 619, nil, 616, 615, 614, 624, 617, + nil, nil, nil, nil, nil, nil, nil, 324, nil, 627, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 622, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, 635, 634, nil, 96, 106, nil, nil, nil, + 336, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, 628, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, nil, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + 130, nil, nil, nil, nil, 129, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, 619, nil, 616, 615, 614, + 624, 617, nil, nil, nil, nil, nil, nil, nil, 364, + nil, 627, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 635, 634, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 628, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 369, 60, 114, 113, 370, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, 376, nil, nil, 371, nil, + 627, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 328, nil, nil, 122, + 121, 123, 369, 60, 114, 113, 370, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 334, nil, nil, + nil, nil, nil, 619, nil, 616, 615, 614, 624, 617, + nil, nil, nil, nil, nil, nil, nil, 371, nil, 627, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 622, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, 635, 634, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, 12, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, 628, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 49, 10, 13, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 43, nil, nil, 36, + nil, nil, 62, 63, nil, nil, 64, nil, 38, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, 420, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + 12, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 49, nil, 13, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 43, nil, nil, 36, nil, nil, 62, 63, nil, + nil, 64, nil, 38, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 437, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 437, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, 235, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 304, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, 301, + nil, 299, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 302, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 305, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 301, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, 235, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, 12, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 49, + nil, 13, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, 36, nil, nil, 62, 63, nil, nil, + 64, nil, 38, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, 619, nil, 616, 615, 614, + 624, 617, nil, nil, nil, nil, nil, nil, nil, 324, + nil, 627, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, 635, 634, nil, 96, 106, nil, + nil, nil, 542, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, 628, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, 619, nil, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, nil, nil, 324, nil, + 627, 320, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, 635, 634, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, 628, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + 559, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 304, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 302, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 305, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 707, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, 313, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, 420, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 328, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 334, nil, nil, nil, nil, nil, 619, nil, + 616, 615, 614, 624, 617, nil, nil, nil, nil, nil, + nil, nil, 324, nil, 627, 320, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 622, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, 635, 634, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, 628, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 304, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 301, nil, 299, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 302, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 305, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 328, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 334, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 324, nil, nil, 320, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 301, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, 807, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, 12, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 49, nil, + 13, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 43, + nil, nil, 36, nil, nil, 62, 63, nil, nil, 64, + nil, 38, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, 304, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, 707, + nil, 299, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 302, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, 305, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 324, + nil, nil, 320, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 328, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, nil, nil, 334, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 324, nil, + nil, 320, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, 437, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 707, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, 873, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, 304, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, 299, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 302, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + 305, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 328, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, nil, nil, + 334, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 994, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 328, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, nil, nil, 334, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1001, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + 1006, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 328, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, nil, nil, 334, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 994, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 188, 199, 189, 212, 185, 205, 195, 194, 215, 216, + 210, 193, 192, 187, 213, 217, 218, 197, 186, 200, + 204, 206, 198, 191, nil, nil, nil, 207, 214, 209, + 208, 201, 211, 196, 184, 203, 202, nil, nil, nil, + nil, nil, 183, 190, 181, 182, 178, 179, 180, 141, + 143, 140, nil, 142, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, nil, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, 105, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 106, nil, nil, nil, nil, nil, nil, + nil, nil, 170, 188, 199, 189, 212, 185, 205, 195, + 194, 215, 216, 210, 193, 192, 187, 213, 217, 218, + 197, 186, 200, 204, 206, 198, 191, nil, nil, nil, + 207, 214, 209, 208, 201, 211, 196, 184, 203, 202, + nil, nil, nil, nil, nil, 183, 190, 181, 182, 178, + 179, 180, 141, 143, nil, nil, 142, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, nil, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, nil, 177, 105, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 106, nil, nil, nil, + nil, nil, nil, nil, nil, 170, 188, 199, 189, 212, + 185, 205, 195, 194, 215, 216, 210, 193, 192, 187, + 213, 217, 218, 197, 186, 200, 204, 206, 198, 191, + nil, nil, nil, 207, 214, 209, 387, 386, 388, 385, + 184, 203, 202, nil, nil, nil, nil, nil, 183, 190, + 181, 182, 382, 383, 384, 380, 143, 114, 113, 381, + nil, 116, nil, nil, nil, nil, nil, nil, 173, 174, + nil, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 392, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 188, + 199, 189, 212, 185, 205, 195, 194, 215, 216, 210, + 193, 192, 187, 213, 217, 218, 197, 186, 200, 204, + 206, 198, 191, nil, nil, nil, 207, 214, 209, 208, + 201, 211, 196, 184, 203, 202, nil, nil, nil, nil, + nil, 183, 190, 181, 182, 178, 179, 180, 141, 143, + 417, 416, 142, nil, 418, nil, nil, nil, nil, nil, + nil, 173, 174, nil, 169, 151, 152, 153, 160, 157, + 159, nil, nil, 154, 155, nil, nil, nil, 175, 176, + 161, 162, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 166, 165, nil, 150, 172, + 168, 167, 163, 164, 158, 156, 148, 171, 149, nil, + nil, 177, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 188, 199, 189, 212, 185, 205, 195, 194, + 215, 216, 210, 193, 192, 187, 213, 217, 218, 197, + 186, 200, 204, 206, 198, 191, nil, nil, nil, 207, + 214, 209, 208, 201, 211, 196, 184, 203, 202, nil, + nil, nil, nil, nil, 183, 190, 181, 182, 178, 179, + 180, 141, 143, nil, nil, 142, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, nil, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, 105, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 106, nil, nil, nil, nil, + nil, nil, nil, nil, 170, 188, 199, 189, 212, 185, + 205, 195, 194, 215, 216, 210, 193, 192, 187, 213, + 217, 218, 197, 186, 200, 204, 206, 198, 191, nil, + nil, nil, 207, 214, 209, 208, 201, 211, 196, 184, + 203, 202, nil, nil, nil, nil, nil, 183, 190, 181, + 182, 178, 179, 180, 141, 143, nil, nil, 142, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, nil, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, 105, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 106, nil, + nil, nil, nil, nil, nil, nil, nil, 170, 188, 199, + 189, 212, 185, 205, 195, 194, 215, 216, 210, 193, + 192, 187, 213, 217, 218, 197, 186, 200, 204, 206, + 198, 191, nil, nil, nil, 207, 214, 209, 208, 201, + 211, 196, 184, 203, 202, nil, nil, nil, nil, nil, + 183, 190, 181, 182, 178, 179, 180, 141, 143, nil, + nil, 142, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, nil, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 460, 464, nil, nil, 461, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 467, 471, nil, nil, 466, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 688, 464, nil, nil, 689, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 690, + 471, nil, nil, 691, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 718, 464, nil, + nil, 719, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 282, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 721, 471, nil, nil, 722, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 688, 464, nil, nil, 689, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 690, 471, nil, nil, 691, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 755, + 464, nil, nil, 756, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 757, 471, nil, + nil, 758, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 282, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 760, 471, nil, nil, 761, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 512, 464, nil, nil, 513, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 809, 464, nil, nil, 810, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 812, + 471, nil, nil, 811, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, 619, 177, 616, 615, 614, 624, 617, 619, nil, + 616, 615, 614, 624, 617, nil, nil, 627, nil, nil, + nil, nil, 170, nil, 627, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 622, + nil, nil, nil, nil, nil, nil, 622, nil, 632, 631, + 635, 634, nil, nil, nil, 632, 631, 635, 634, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1067, 471, nil, nil, + 1066, nil, nil, nil, 628, nil, nil, nil, nil, 173, + 174, 628, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, 282, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + nil, nil, nil, nil, 1070, 464, nil, nil, 1071, nil, + nil, nil, nil, nil, nil, nil, nil, 173, 174, 170, + 169, 151, 152, 153, 160, 157, 159, nil, nil, 154, + 155, nil, nil, nil, 175, 176, 161, 162, nil, nil, + nil, nil, nil, 282, nil, nil, nil, nil, nil, nil, + nil, 166, 165, nil, 150, 172, 168, 167, 163, 164, + 158, 156, 148, 171, 149, nil, nil, 177, nil, nil, + nil, nil, 1072, 471, nil, nil, 1073, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 174, 170, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, 282, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, 619, 177, 616, 615, 614, 624, + 617, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 627, nil, nil, nil, nil, 170, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, nil, nil, nil, + nil, 632, 631, 635, 634, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 628 ] + +racc_action_check = [ + 112, 395, 353, 476, 476, 361, 713, 112, 112, 112, + 362, 354, 112, 112, 112, 718, 112, 365, 942, 17, + 17, 713, 947, 408, 112, 29, 112, 112, 112, 586, + 22, 998, 238, 411, 1, 239, 112, 112, 27, 112, + 112, 112, 112, 112, 755, 27, 565, 352, 352, 565, + 999, 92, 719, 756, 874, 773, 576, 721, 566, 92, + 3, 566, 395, 395, 395, 875, 22, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 1002, 718, 112, 112, 112, 408, 112, 112, 238, + 29, 112, 239, 476, 112, 112, 411, 112, 65, 112, + 13, 112, 27, 112, 112, 112, 112, 112, 112, 112, + 361, 112, 29, 112, 15, 362, 353, 718, 1040, 719, + 718, 353, 365, 721, 721, 354, 112, 112, 112, 112, + 354, 112, 942, 112, 586, 718, 947, 942, 112, 115, + 1070, 947, 112, 1071, 112, 998, 115, 115, 115, 755, + 998, 115, 115, 115, 719, 115, 576, 719, 756, 721, + 773, 576, 721, 115, 999, 115, 115, 115, 874, 999, + 875, 874, 719, 874, 1082, 115, 115, 721, 115, 115, + 115, 115, 115, 1072, 849, 65, 1073, 757, 697, 758, + 380, 695, 728, 728, 843, 1002, 381, 380, 382, 20, + 1002, 772, 772, 381, 16, 382, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 44, 44, 115, 115, 115, 695, 115, 115, 843, 729, + 115, 329, 1040, 115, 115, 729, 115, 1040, 115, 18, + 115, 20, 115, 115, 115, 115, 115, 115, 115, 241, + 115, 849, 115, 757, 1070, 758, 20, 1071, 648, 1070, + 651, 1072, 1071, 25, 1073, 115, 115, 115, 115, 444, + 115, 466, 115, 40, 482, 697, 688, 115, 466, 466, + 466, 115, 728, 115, 466, 466, 849, 466, 1082, 849, + 775, 772, 757, 1082, 758, 41, 329, 1072, 44, 44, + 1073, 775, 1072, 689, 849, 1073, 241, 466, 466, 809, + 466, 466, 466, 466, 466, 334, 334, 383, 329, 648, + 648, 651, 651, 43, 383, 530, 444, 5, 648, 49, + 651, 482, 5, 688, 775, 775, 369, 41, 466, 466, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 41, 99, 466, 466, 466, 19, 466, 371, + 689, 810, 466, 371, 19, 466, 809, 370, 775, 1007, + 466, 1007, 466, 19, 466, 466, 466, 466, 466, 466, + 466, 980, 466, 50, 466, 100, 530, 530, 530, 369, + 50, 42, 980, 334, 334, 338, 369, 466, 466, 50, + 466, 369, 466, 467, 832, 369, 530, 918, 101, 466, + 467, 467, 467, 466, 102, 466, 467, 467, 810, 467, + 370, 19, 384, 369, 138, 980, 980, 370, 467, 384, + 397, 488, 370, 42, 237, 219, 370, 338, 402, 467, + 467, 237, 467, 467, 467, 467, 467, 50, 42, 321, + 237, 385, 338, 369, 370, 386, 321, 405, 385, 980, + 240, 832, 386, 488, 918, 321, 570, 488, 488, 570, + 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, + 467, 467, 467, 467, 370, 242, 467, 467, 467, 322, + 467, 397, 397, 397, 467, 243, 322, 467, 237, 402, + 402, 402, 467, 413, 467, 322, 467, 467, 467, 467, + 467, 467, 467, 321, 467, 467, 467, 460, 405, 405, + 405, 247, 783, 281, 783, 783, 783, 783, 783, 467, + 467, 296, 467, 387, 467, 297, 323, 388, 783, 390, + 387, 467, 690, 323, 388, 467, 390, 467, 300, 690, + 690, 690, 323, 322, 690, 690, 690, 489, 690, 460, + 783, 47, 47, 314, 413, 413, 413, 690, 690, 690, + 690, 783, 783, 862, 460, 760, 862, 1012, 690, 690, + 1012, 690, 690, 690, 690, 690, 308, 316, 325, 489, + 317, 308, 340, 489, 489, 325, 47, 47, 399, 340, + 323, 399, 358, 318, 325, 783, 324, 358, 340, 690, + 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 690, 690, 597, 597, 690, 690, 690, 760, 690, + 690, 743, 743, 690, 461, 760, 690, 690, 327, 690, + 760, 690, 328, 690, 760, 690, 690, 690, 690, 690, + 690, 690, 325, 690, 690, 690, 340, 333, 140, 399, + 399, 766, 760, 140, 140, 335, 766, 363, 690, 690, + 690, 690, 672, 690, 363, 690, 461, 879, 778, 778, + 690, 691, 879, 363, 690, 339, 690, 342, 691, 691, + 691, 461, 760, 691, 691, 691, 393, 691, 393, 393, + 393, 393, 393, 373, 1041, 1041, 884, 691, 691, 691, + 373, 884, 393, 348, 672, 359, 360, 691, 691, 373, + 691, 691, 691, 691, 691, 364, 366, 375, 401, 672, + 404, 363, 407, 410, 393, 393, 622, 433, 622, 622, + 622, 436, 622, 393, 393, 393, 393, 438, 691, 691, + 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, + 691, 691, 441, 445, 691, 691, 691, 373, 691, 691, + 455, 458, 691, 459, 622, 691, 691, 468, 691, 393, + 691, 478, 691, 622, 691, 691, 691, 691, 691, 691, + 691, 490, 691, 491, 691, 605, 492, 605, 605, 605, + 605, 605, 9, 9, 9, 9, 9, 691, 691, 691, + 691, 605, 691, 811, 691, 493, 509, 516, 520, 691, + 811, 811, 811, 691, 536, 691, 811, 811, 537, 811, + 443, 547, 538, 605, 541, 543, 548, 443, 547, 551, + 560, 589, 605, 605, 605, 605, 443, 547, 589, 811, + 811, 722, 811, 811, 811, 811, 811, 589, 722, 761, + 561, 562, 567, 722, 568, 571, 761, 722, 573, 577, + 907, 761, 907, 907, 907, 761, 907, 578, 605, 579, + 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 443, 547, 811, 811, 811, 580, + 811, 599, 607, 608, 811, 589, 610, 811, 907, 611, + 612, 503, 811, 621, 811, 722, 811, 811, 811, 811, + 811, 811, 811, 761, 811, 769, 811, 769, 769, 769, + 769, 769, 791, 629, 791, 791, 791, 633, 791, 811, + 811, 769, 811, 503, 811, 812, 636, 503, 503, 503, + 503, 811, 812, 812, 812, 811, 655, 811, 812, 812, + 658, 812, 993, 769, 312, 312, 312, 312, 312, 993, + 812, 664, 769, 769, 769, 769, 1000, 673, 993, 678, + 684, 812, 812, 1000, 812, 812, 812, 812, 812, 797, + 797, 1032, 1000, 797, 797, 797, 692, 693, 1032, 696, + 787, 700, 787, 787, 787, 702, 787, 1032, 769, 704, + 706, 715, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 993, 717, 812, 812, + 812, 906, 812, 906, 906, 906, 812, 906, 787, 812, + 1000, 720, 723, 494, 812, 724, 812, 787, 812, 812, + 812, 812, 812, 812, 812, 1032, 812, 812, 812, 494, + 494, 963, 727, 963, 963, 963, 745, 963, 751, 906, + 754, 812, 812, 763, 812, 494, 812, 494, 906, 494, + 494, 494, 494, 812, 30, 767, 774, 812, 789, 812, + 790, 30, 30, 30, 792, 804, 30, 30, 30, 770, + 30, 770, 770, 770, 770, 770, 504, 806, 808, 30, + 30, 30, 817, 841, 848, 770, 858, 859, 863, 869, + 30, 30, 876, 30, 30, 30, 30, 30, 1020, 878, + 1020, 1020, 1020, 882, 1020, 883, 890, 770, 504, 891, + 892, 896, 504, 504, 504, 504, 770, 770, 770, 770, + 897, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 899, 1020, 30, 30, 30, + 900, 902, 30, 905, 30, 30, 915, 917, 30, 30, + 924, 30, 770, 30, 925, 30, 927, 30, 30, 30, + 30, 30, 30, 30, 928, 30, 30, 30, 779, 929, + 779, 779, 779, 779, 779, 347, 347, 347, 347, 347, + 30, 30, 931, 30, 779, 30, 31, 535, 535, 535, + 535, 535, 30, 31, 31, 31, 30, 932, 31, 31, + 31, 933, 31, 508, 960, 1021, 779, 1021, 1021, 1021, + 961, 1021, 31, 31, 962, 779, 779, 779, 779, 508, + 508, 977, 31, 31, 978, 31, 31, 31, 31, 31, + 1049, 991, 1049, 1049, 1049, 508, 1049, 508, 994, 508, + 508, 508, 508, 1021, 996, 508, 1001, 508, 1008, 1016, + 1017, 779, 1018, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 1019, 1022, 31, + 31, 31, 1025, 1026, 31, 1027, 31, 31, 1028, 1030, + 31, 31, 1036, 31, 1047, 31, 1055, 31, 1066, 31, + 31, 31, 31, 31, 31, 31, 1067, 31, 1069, 31, + 781, 1077, 781, 781, 781, 781, 781, 1078, 1079, 1080, + 1081, 1089, 31, 31, nil, 31, 781, 31, 60, nil, + nil, nil, nil, nil, 31, 60, 60, 60, 31, nil, + 60, 60, 60, nil, 60, 557, nil, nil, 781, nil, + nil, nil, nil, nil, 60, 60, 60, 781, 781, 781, + 781, 557, 557, nil, 60, 60, nil, 60, 60, 60, + 60, 60, nil, nil, nil, nil, nil, 557, nil, 557, + nil, 557, 557, 557, 557, nil, nil, 557, nil, 557, + nil, nil, nil, 781, nil, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, nil, + nil, 60, 60, 60, nil, nil, 60, nil, nil, 60, + nil, nil, 60, 60, nil, 60, nil, 60, nil, 60, + nil, 60, 60, 60, 60, 60, 60, 60, nil, 60, + nil, 60, 836, nil, 836, 836, 836, 836, 836, nil, + nil, nil, nil, nil, 60, 60, 60, 60, 836, 60, + 462, 60, nil, nil, nil, nil, 60, 462, 462, 462, + 60, nil, 462, 462, 462, nil, 462, 495, nil, nil, + 836, nil, nil, nil, nil, 462, 462, 462, nil, 836, + 836, 836, 836, 495, 495, nil, 462, 462, nil, 462, + 462, 462, 462, 462, nil, nil, nil, nil, nil, 495, + nil, 495, nil, 495, 495, 495, 495, 836, nil, nil, + nil, nil, nil, nil, nil, 836, nil, 462, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, + 462, nil, nil, 462, 462, 462, nil, nil, 462, nil, + 462, 462, nil, nil, 462, 462, nil, 462, nil, 462, + nil, 462, nil, 462, 462, 462, 462, 462, 462, 462, + nil, 462, 462, 462, 966, nil, 966, 966, 966, 966, + 966, nil, nil, nil, nil, nil, 462, 462, nil, 462, + 966, 462, 471, nil, nil, nil, nil, nil, 462, 471, + 471, 471, 462, nil, 471, 471, 471, nil, 471, 496, + nil, nil, 966, nil, nil, nil, nil, 471, 471, 471, + 471, 966, 966, 966, 966, 496, 496, nil, 471, 471, + nil, 471, 471, 471, 471, 471, nil, nil, nil, nil, + nil, 496, nil, nil, nil, 496, 496, 496, 496, nil, + nil, nil, nil, nil, nil, nil, nil, 966, nil, 471, + 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 471, nil, nil, 471, 471, 471, nil, nil, + 471, nil, nil, 471, nil, nil, 471, 471, nil, 471, + nil, 471, nil, 471, nil, 471, 471, 471, 471, 471, + 471, 471, nil, 471, 471, 471, 968, nil, 968, 968, + 968, 968, 968, nil, nil, nil, nil, nil, 471, 471, + 471, 471, 968, 471, 472, 471, nil, nil, nil, nil, + 471, 472, 472, 472, 471, nil, 472, 472, 472, nil, + 472, nil, nil, nil, 968, nil, nil, nil, nil, 472, + 472, 472, 472, nil, nil, 968, 968, nil, nil, nil, + 472, 472, nil, 472, 472, 472, 472, 472, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 968, + nil, 472, 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, nil, nil, 472, 472, 472, + nil, nil, 472, nil, nil, 472, nil, nil, 472, 472, + nil, 472, nil, 472, nil, 472, nil, 472, 472, 472, + 472, 472, 472, 472, nil, 472, 472, 472, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 472, 472, 472, 472, nil, 472, 511, 472, nil, nil, + nil, nil, 472, 511, 511, 511, 472, nil, 511, 511, + 511, nil, 511, nil, nil, nil, nil, nil, nil, nil, + nil, 511, 511, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 511, 511, nil, 511, 511, 511, 511, 511, + nil, nil, nil, nil, nil, nil, nil, 278, 278, nil, + nil, 278, nil, nil, nil, nil, nil, nil, nil, nil, + 278, 278, nil, 278, 278, 278, 278, 278, 278, 278, + nil, nil, 278, 278, 511, nil, nil, 278, 278, 278, + 278, 511, nil, nil, nil, nil, 511, 511, nil, nil, + nil, nil, nil, nil, 278, 278, nil, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 511, 511, + 278, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 511, nil, nil, nil, nil, 511, nil, nil, + 278, nil, nil, nil, 511, nil, nil, nil, 511, 2, + 2, 2, 2, 2, 2, nil, nil, nil, 2, 2, + nil, nil, nil, 2, nil, 2, 2, 2, 2, 2, + 2, 2, nil, nil, nil, nil, nil, 2, 2, 2, + 2, 2, 2, 2, nil, nil, 2, nil, nil, nil, + nil, 448, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, nil, 2, 2, 2, nil, 2, + 2, nil, 2, 2, 2, 448, 448, 448, 448, 448, + 448, 448, 448, 448, 448, 448, nil, 448, 448, nil, + nil, 448, 448, nil, 2, nil, nil, 2, nil, nil, + 2, 2, nil, nil, 2, nil, 2, 448, nil, 448, + 2, 448, 448, 448, 448, 448, 448, 448, 2, 448, + nil, nil, nil, 2, 2, 2, 2, 2, 2, nil, + nil, nil, 2, 2, nil, 448, nil, 448, nil, nil, + 2, nil, nil, 2, 2, 2, nil, 2, 2, 36, + 36, 36, 36, 36, 36, nil, nil, nil, 36, 36, + nil, nil, nil, 36, nil, 36, 36, 36, 36, 36, + 36, 36, nil, nil, nil, nil, nil, 36, 36, 36, + 36, 36, 36, 36, nil, nil, 36, nil, nil, nil, + nil, 454, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, nil, 36, 36, 36, nil, 36, + 36, nil, 36, 36, 36, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, nil, 454, 454, nil, + nil, 454, 454, nil, 36, nil, nil, 36, nil, nil, + 36, 36, nil, nil, 36, nil, 36, 454, nil, 454, + 36, 454, 454, 454, 454, 454, 454, 454, 36, 454, + nil, nil, nil, 36, 36, 36, 36, 36, 36, nil, + nil, nil, 36, 36, nil, 454, nil, nil, nil, nil, + 36, nil, nil, 36, 36, 36, nil, 36, 36, 221, + 221, 221, 221, 221, 221, nil, nil, nil, 221, 221, + nil, nil, nil, 221, nil, 221, 221, 221, 221, 221, + 221, 221, nil, nil, nil, nil, nil, 221, 221, 221, + 221, 221, 221, 221, nil, nil, 221, nil, nil, nil, + nil, nil, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, nil, 221, 221, 221, nil, 221, + 221, nil, 221, 221, 221, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, nil, 24, 24, nil, + nil, 24, 24, nil, 221, nil, nil, 221, nil, nil, + 221, 221, nil, nil, 221, nil, 221, 24, nil, 24, + 221, 24, 24, 24, 24, 24, 24, 24, 221, 24, + nil, nil, nil, 221, 221, 221, 221, 221, 221, nil, + nil, nil, 221, 221, nil, 24, nil, nil, nil, nil, + 221, nil, nil, 221, 221, 221, nil, 221, 221, 246, + 246, 246, 246, 246, 246, nil, nil, nil, 246, 246, + nil, nil, nil, 246, nil, 246, 246, 246, 246, 246, + 246, 246, nil, nil, nil, nil, nil, 246, 246, 246, + 246, 246, 246, 246, nil, nil, 246, nil, nil, nil, + nil, nil, 246, 246, 246, 246, 246, 246, 246, 246, + 246, 246, 246, 246, nil, 246, 246, 246, nil, 246, + 246, nil, 246, 246, 246, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, nil, 294, 294, nil, + nil, 294, 294, nil, 246, nil, nil, 246, nil, nil, + 246, 246, nil, nil, 246, nil, 246, 294, nil, 294, + 246, 294, 294, 294, 294, 294, 294, 294, 246, 294, + nil, nil, nil, 246, 246, 246, 246, 246, 246, nil, + nil, nil, 246, 246, nil, 294, nil, nil, nil, nil, + 246, nil, nil, 246, 246, 246, nil, 246, 246, 315, + 315, 315, 315, 315, 315, nil, nil, nil, 315, 315, + nil, nil, nil, 315, nil, 315, 315, 315, 315, 315, + 315, 315, nil, nil, nil, nil, nil, 315, 315, 315, + 315, 315, 315, 315, nil, nil, 315, nil, nil, nil, + nil, nil, 315, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 315, nil, 315, 315, 315, nil, 315, + 315, nil, 315, 315, 315, 507, 507, 507, 507, 507, + 507, 507, 507, 507, 507, 507, nil, 507, 507, nil, + nil, 507, 507, nil, 315, nil, nil, 315, nil, nil, + 315, 315, nil, nil, 315, nil, 315, 507, nil, 507, + 315, 507, 507, 507, 507, 507, 507, 507, 315, 507, + nil, nil, nil, 315, 315, 315, 315, 315, 315, nil, + nil, nil, 315, 315, 507, 507, nil, nil, nil, nil, + 315, nil, nil, 315, 315, 315, nil, 315, 315, 320, + 320, 320, 320, 320, 320, nil, nil, nil, 320, 320, + nil, nil, nil, 320, nil, 320, 320, 320, 320, 320, + 320, 320, nil, nil, nil, nil, nil, 320, 320, 320, + 320, 320, 320, 320, nil, nil, 320, nil, nil, nil, + nil, nil, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, nil, 320, 320, 320, nil, 320, + 320, nil, 320, 320, 320, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, nil, 558, 558, nil, + nil, 558, 558, nil, 320, nil, nil, 320, nil, nil, + 320, 320, nil, nil, 320, nil, 320, 558, nil, 558, + 320, 558, 558, 558, 558, 558, 558, 558, 320, 558, + nil, nil, nil, 320, 320, 320, 320, 320, 320, nil, + nil, nil, 320, 320, nil, 558, nil, nil, nil, nil, + 320, nil, nil, 320, 320, 320, nil, 320, 320, 346, + 346, 346, 346, 346, 346, nil, nil, nil, 346, 346, + nil, nil, nil, 346, nil, 346, 346, 346, 346, 346, + 346, 346, nil, nil, nil, nil, nil, 346, 346, 346, + 346, 346, 346, 346, nil, nil, 346, nil, nil, nil, + nil, nil, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 346, nil, 346, 346, 346, nil, 346, + 346, nil, 346, 346, 346, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, nil, 814, 814, nil, + nil, 814, 814, nil, 346, nil, nil, 346, nil, nil, + 346, 346, nil, nil, 346, nil, 346, 814, nil, 814, + 346, 814, 814, 814, 814, 814, 814, 814, 346, 814, + nil, nil, nil, 346, 346, 346, 346, 346, 346, nil, + nil, nil, 346, 346, nil, 814, nil, nil, nil, nil, + 346, nil, nil, 346, 346, 346, nil, 346, 346, 356, + 356, 356, 356, 356, 356, nil, nil, nil, 356, 356, + nil, nil, nil, 356, nil, 356, 356, 356, 356, 356, + 356, 356, nil, nil, nil, nil, nil, 356, 356, 356, + 356, 356, 356, 356, nil, nil, 356, nil, nil, nil, + nil, nil, 356, 356, 356, 356, 356, 356, 356, 356, + 356, 356, 356, 356, nil, 356, 356, 356, nil, 356, + 356, nil, 356, 356, 356, 923, 923, 923, 923, 923, + 923, 923, 923, 923, 923, 923, nil, 923, 923, nil, + nil, 923, 923, nil, 356, nil, nil, 356, nil, nil, + 356, 356, nil, nil, 356, nil, 356, 923, nil, 923, + 356, 923, 923, 923, 923, 923, 923, 923, 356, 923, + nil, nil, nil, 356, 356, 356, 356, 356, 356, nil, + nil, nil, 356, 356, nil, 923, nil, nil, nil, nil, + 356, nil, nil, 356, 356, 356, nil, 356, 356, 357, + 357, 357, 357, 357, 357, nil, nil, nil, 357, 357, + nil, nil, nil, 357, nil, 357, 357, 357, 357, 357, + 357, 357, nil, nil, nil, nil, nil, 357, 357, 357, + 357, 357, 357, 357, nil, nil, 357, nil, nil, nil, + nil, nil, 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, nil, 357, 357, 357, nil, 357, + 357, nil, 357, 357, 357, 486, 486, 486, 486, 486, + 486, 486, 486, 486, 486, 486, nil, 486, 486, nil, + nil, 486, 486, nil, 357, nil, nil, 357, nil, nil, + 357, 357, nil, nil, 357, nil, 357, 486, nil, 486, + 357, 486, 486, 486, 486, 486, 486, 486, 357, 486, + nil, nil, nil, 357, 357, 357, 357, 357, 357, nil, + nil, nil, 357, 357, nil, nil, nil, nil, nil, nil, + 357, nil, nil, 357, 357, 357, nil, 357, 357, 572, + 572, 572, 572, 572, 572, nil, nil, nil, 572, 572, + nil, nil, nil, 572, nil, 572, 572, 572, 572, 572, + 572, 572, nil, nil, nil, nil, nil, 572, 572, 572, + 572, 572, 572, 572, nil, nil, 572, nil, nil, nil, + nil, nil, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, nil, 572, 572, 572, nil, 572, + 572, nil, 572, 572, 572, 487, 487, 487, 487, 487, + 487, 487, 487, 487, 487, 487, nil, 487, 487, nil, + nil, 487, 487, nil, 572, nil, nil, 572, nil, nil, + 572, 572, nil, nil, 572, nil, 572, 487, nil, 487, + 572, 487, 487, 487, 487, 487, 487, 487, 572, 487, + nil, nil, nil, 572, 572, 572, 572, 572, 572, nil, + nil, nil, 572, 572, nil, nil, nil, nil, nil, nil, + 572, nil, nil, 572, 572, 572, nil, 572, 572, 575, + 575, 575, 575, 575, 575, nil, nil, nil, 575, 575, + nil, nil, nil, 575, nil, 575, 575, 575, 575, 575, + 575, 575, nil, nil, nil, nil, nil, 575, 575, 575, + 575, 575, 575, 575, nil, nil, 575, nil, nil, nil, + nil, nil, 575, 575, 575, 575, 575, 575, 575, 575, + 575, 575, 575, 575, nil, 575, 575, 575, nil, 575, + 575, nil, 575, 575, 575, 497, 497, 497, 497, 497, + 497, 497, nil, nil, 497, 497, nil, nil, nil, nil, + nil, 497, 497, nil, 575, nil, nil, 575, nil, nil, + 575, 575, nil, nil, 575, nil, 575, 497, nil, 497, + 575, 497, 497, 497, 497, 497, 497, 497, 575, 497, + nil, nil, nil, 575, 575, 575, 575, 575, 575, nil, + nil, nil, 575, 575, nil, nil, nil, nil, nil, nil, + 575, nil, nil, 575, 575, 575, nil, 575, 575, 598, + 598, 598, 598, 598, 598, nil, nil, nil, 598, 598, + nil, nil, nil, 598, nil, 598, 598, 598, 598, 598, + 598, 598, nil, nil, nil, nil, nil, 598, 598, 598, + 598, 598, 598, 598, nil, nil, 598, nil, nil, nil, + nil, nil, 598, 598, 598, 598, 598, 598, 598, 598, + 598, 598, 598, 598, nil, 598, 598, 598, nil, 598, + 598, nil, 598, 598, 598, 498, 498, 498, 498, 498, + 498, 498, nil, nil, 498, 498, nil, nil, nil, nil, + nil, 498, 498, nil, 598, nil, nil, 598, nil, nil, + 598, 598, nil, nil, 598, nil, 598, 498, nil, 498, + 598, 498, 498, 498, 498, 498, 498, 498, 598, 498, + nil, nil, nil, 598, 598, 598, 598, 598, 598, nil, + nil, nil, 598, 598, nil, nil, nil, nil, nil, nil, + 598, nil, nil, 598, 598, 598, nil, 598, 598, 660, + 660, 660, 660, 660, 660, nil, nil, nil, 660, 660, + nil, nil, nil, 660, nil, 660, 660, 660, 660, 660, + 660, 660, nil, nil, nil, nil, nil, 660, 660, 660, + 660, 660, 660, 660, nil, nil, 660, nil, nil, nil, + nil, nil, 660, 660, 660, 660, 660, 660, 660, 660, + 660, 660, 660, 660, nil, 660, 660, 660, nil, 660, + 660, nil, 660, 660, 660, 499, 499, 499, 499, 499, + 499, 499, nil, nil, 499, 499, nil, nil, nil, nil, + nil, 499, 499, nil, 660, nil, nil, 660, nil, nil, + 660, 660, nil, nil, 660, nil, 660, 499, nil, 499, + 660, 499, 499, 499, 499, 499, 499, 499, 660, 499, + nil, nil, nil, 660, 660, 660, 660, 660, 660, nil, + nil, nil, 660, 660, nil, nil, nil, nil, nil, nil, + 660, nil, nil, 660, 660, 660, nil, 660, 660, 759, + 759, 759, 759, 759, 759, nil, nil, nil, 759, 759, + nil, nil, nil, 759, nil, 759, 759, 759, 759, 759, + 759, 759, nil, nil, nil, nil, nil, 759, 759, 759, + 759, 759, 759, 759, nil, nil, 759, nil, nil, nil, + nil, nil, 759, 759, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 759, nil, 759, 759, 759, nil, 759, + 759, nil, 759, 759, 759, 500, 500, 500, 500, 500, + 500, 500, nil, nil, 500, 500, nil, nil, nil, nil, + nil, 500, 500, nil, 759, nil, nil, 759, nil, nil, + 759, 759, nil, nil, 759, nil, 759, 500, nil, 500, + 759, 500, 500, 500, 500, 500, 500, 500, 759, 500, + nil, nil, nil, 759, 759, 759, 759, 759, 759, nil, + nil, nil, 759, 759, nil, nil, nil, nil, nil, nil, + 759, nil, nil, 759, 759, 759, nil, 759, 759, 764, + 764, 764, 764, 764, 764, nil, nil, nil, 764, 764, + nil, nil, nil, 764, nil, 764, 764, 764, 764, 764, + 764, 764, nil, nil, nil, nil, nil, 764, 764, 764, + 764, 764, 764, 764, nil, nil, 764, nil, nil, nil, + nil, nil, 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, nil, 764, 764, 764, nil, 764, + 764, nil, 764, 764, 764, 501, 501, 501, 501, 501, + 501, 501, nil, nil, 501, 501, nil, nil, nil, nil, + nil, 501, 501, nil, 764, nil, nil, 764, nil, nil, + 764, 764, nil, nil, 764, nil, 764, 501, nil, 501, + 764, 501, 501, 501, 501, 501, 501, 501, 764, 501, + nil, nil, nil, 764, 764, 764, 764, 764, 764, nil, + nil, nil, 764, 764, nil, nil, nil, nil, nil, nil, + 764, nil, nil, 764, 764, 764, nil, 764, 764, 768, + 768, 768, 768, 768, 768, nil, nil, nil, 768, 768, + nil, nil, nil, 768, nil, 768, 768, 768, 768, 768, + 768, 768, nil, nil, nil, nil, nil, 768, 768, 768, + 768, 768, 768, 768, nil, nil, 768, nil, nil, nil, + nil, nil, 768, 768, 768, 768, 768, 768, 768, 768, + 768, 768, 768, 768, nil, 768, 768, 768, nil, 768, + 768, nil, 768, 768, 768, 502, 502, 502, 502, 502, + 502, 502, nil, nil, 502, 502, nil, nil, nil, nil, + nil, 502, 502, nil, 768, nil, nil, 768, nil, nil, + 768, 768, nil, nil, 768, nil, 768, 502, nil, 502, + 768, 502, 502, 502, 502, 502, 502, 502, 768, 502, + nil, nil, nil, 768, 768, 768, 768, 768, 768, nil, + nil, nil, 768, 768, nil, nil, nil, nil, nil, nil, + 768, nil, nil, 768, 768, 768, nil, 768, 768, 798, + 798, 798, 798, 798, 798, nil, nil, nil, 798, 798, + nil, nil, nil, 798, nil, 798, 798, 798, 798, 798, + 798, 798, nil, nil, nil, nil, nil, 798, 798, 798, + 798, 798, 798, 798, nil, nil, 798, nil, nil, nil, + nil, nil, 798, 798, 798, 798, 798, 798, 798, 798, + 798, 798, 798, 798, nil, 798, 798, 798, nil, 798, + 798, nil, 798, 798, 798, 505, 505, 505, 505, 505, + 505, 505, nil, nil, 505, 505, nil, nil, nil, nil, + nil, 505, 505, nil, 798, nil, nil, 798, nil, nil, + 798, 798, nil, nil, 798, nil, 798, 505, nil, 505, + 798, 505, 505, 505, 505, 505, 505, 505, 798, 505, + nil, nil, nil, 798, 798, 798, 798, 798, 798, nil, + nil, nil, 798, 798, nil, nil, nil, nil, nil, nil, + 798, nil, nil, 798, 798, 798, nil, 798, 798, 838, + 838, 838, 838, 838, 838, nil, nil, nil, 838, 838, + nil, nil, nil, 838, nil, 838, 838, 838, 838, 838, + 838, 838, nil, nil, nil, nil, nil, 838, 838, 838, + 838, 838, 838, 838, nil, nil, 838, nil, nil, nil, + nil, nil, 838, 838, 838, 838, 838, 838, 838, 838, + 838, 838, 838, 838, nil, 838, 838, 838, nil, 838, + 838, nil, 838, 838, 838, 506, 506, 506, 506, 506, + 506, 506, 506, nil, 506, 506, nil, nil, nil, nil, + nil, 506, 506, nil, 838, nil, nil, 838, nil, nil, + 838, 838, nil, nil, 838, nil, 838, 506, nil, 506, + 838, 506, 506, 506, 506, 506, 506, 506, 838, 506, + nil, nil, nil, 838, 838, 838, 838, 838, 838, nil, + nil, nil, 838, 838, nil, nil, nil, nil, nil, nil, + 838, nil, nil, 838, 838, 838, nil, 838, 838, 856, + 856, 856, 856, 856, 856, nil, nil, nil, 856, 856, + nil, nil, nil, 856, nil, 856, 856, 856, 856, 856, + 856, 856, nil, nil, nil, nil, nil, 856, 856, 856, + 856, 856, 856, 856, nil, nil, 856, nil, nil, nil, + nil, nil, 856, 856, 856, 856, 856, 856, 856, 856, + 856, 856, 856, 856, nil, 856, 856, 856, nil, 856, + 856, nil, 856, 856, 856, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 856, nil, nil, 856, nil, nil, + 856, 856, nil, nil, 856, nil, 856, nil, nil, nil, + 856, nil, nil, nil, nil, nil, nil, nil, 856, nil, + nil, nil, nil, 856, 856, 856, 856, 856, 856, nil, + nil, nil, 856, 856, nil, nil, nil, nil, nil, nil, + 856, nil, nil, 856, 856, 856, nil, 856, 856, 868, + 868, 868, 868, 868, 868, nil, nil, nil, 868, 868, + nil, nil, nil, 868, nil, 868, 868, 868, 868, 868, + 868, 868, nil, nil, nil, nil, nil, 868, 868, 868, + 868, 868, 868, 868, nil, nil, 868, nil, nil, nil, + nil, nil, 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, nil, 868, 868, 868, nil, 868, + 868, nil, 868, 868, 868, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 868, nil, nil, 868, nil, nil, + 868, 868, nil, nil, 868, nil, 868, nil, nil, nil, + 868, nil, nil, nil, nil, nil, nil, nil, 868, nil, + nil, nil, nil, 868, 868, 868, 868, 868, 868, nil, + nil, nil, 868, 868, nil, nil, nil, nil, nil, nil, + 868, nil, nil, 868, 868, 868, nil, 868, 868, 888, + 888, 888, 888, 888, 888, nil, nil, nil, 888, 888, + nil, nil, nil, 888, nil, 888, 888, 888, 888, 888, + 888, 888, nil, nil, nil, nil, nil, 888, 888, 888, + 888, 888, 888, 888, nil, nil, 888, nil, nil, nil, + nil, nil, 888, 888, 888, 888, 888, 888, 888, 888, + 888, 888, 888, 888, nil, 888, 888, 888, nil, 888, + 888, nil, 888, 888, 888, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 888, nil, nil, 888, nil, nil, + 888, 888, nil, nil, 888, nil, 888, nil, nil, nil, + 888, nil, nil, nil, nil, nil, nil, nil, 888, nil, + nil, nil, nil, 888, 888, 888, 888, 888, 888, nil, + nil, nil, 888, 888, nil, nil, nil, nil, nil, nil, + 888, nil, nil, 888, 888, 888, nil, 888, 888, 889, + 889, 889, 889, 889, 889, nil, nil, nil, 889, 889, + nil, nil, nil, 889, nil, 889, 889, 889, 889, 889, + 889, 889, nil, nil, nil, nil, nil, 889, 889, 889, + 889, 889, 889, 889, nil, nil, 889, nil, nil, nil, + nil, nil, 889, 889, 889, 889, 889, 889, 889, 889, + 889, 889, 889, 889, nil, 889, 889, 889, nil, 889, + 889, nil, 889, 889, 889, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 889, nil, nil, 889, nil, nil, + 889, 889, nil, nil, 889, nil, 889, nil, nil, nil, + 889, nil, nil, nil, nil, nil, nil, nil, 889, nil, + nil, nil, nil, 889, 889, 889, 889, 889, 889, nil, + nil, nil, 889, 889, nil, nil, nil, nil, nil, nil, + 889, nil, nil, 889, 889, 889, nil, 889, 889, 939, + 939, 939, 939, 939, 939, nil, nil, nil, 939, 939, + nil, nil, nil, 939, nil, 939, 939, 939, 939, 939, + 939, 939, nil, nil, nil, nil, nil, 939, 939, 939, + 939, 939, 939, 939, nil, nil, 939, nil, nil, nil, + nil, nil, 939, 939, 939, 939, 939, 939, 939, 939, + 939, 939, 939, 939, nil, 939, 939, 939, nil, 939, + 939, nil, 939, 939, 939, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 939, nil, nil, 939, nil, nil, + 939, 939, nil, nil, 939, nil, 939, nil, nil, nil, + 939, nil, nil, nil, nil, nil, nil, nil, 939, nil, + nil, nil, nil, 939, 939, 939, 939, 939, 939, nil, + nil, nil, 939, 939, nil, nil, nil, nil, nil, nil, + 939, nil, nil, 939, 939, 939, nil, 939, 939, 940, + 940, 940, 940, 940, 940, nil, nil, nil, 940, 940, + nil, nil, nil, 940, nil, 940, 940, 940, 940, 940, + 940, 940, nil, nil, nil, nil, nil, 940, 940, 940, + 940, 940, 940, 940, nil, nil, 940, nil, nil, nil, + nil, nil, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, nil, 940, 940, 940, nil, 940, + 940, nil, 940, 940, 940, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 940, nil, nil, 940, nil, nil, + 940, 940, nil, nil, 940, nil, 940, nil, nil, nil, + 940, nil, nil, nil, nil, nil, nil, nil, 940, nil, + nil, nil, nil, 940, 940, 940, 940, 940, 940, nil, + nil, nil, 940, 940, nil, nil, nil, nil, nil, nil, + 940, nil, nil, 940, 940, 940, nil, 940, 940, 952, + 952, 952, 952, 952, 952, nil, nil, nil, 952, 952, + nil, nil, nil, 952, nil, 952, 952, 952, 952, 952, + 952, 952, nil, nil, nil, nil, nil, 952, 952, 952, + 952, 952, 952, 952, nil, nil, 952, nil, nil, nil, + nil, nil, 952, 952, 952, 952, 952, 952, 952, 952, + 952, 952, 952, 952, nil, 952, 952, 952, nil, 952, + 952, nil, 952, 952, 952, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 952, nil, nil, 952, nil, nil, + 952, 952, nil, nil, 952, nil, 952, nil, nil, nil, + 952, nil, nil, nil, nil, nil, nil, nil, 952, nil, + nil, nil, nil, 952, 952, 952, 952, 952, 952, nil, + nil, nil, 952, 952, nil, nil, nil, nil, nil, nil, + 952, nil, nil, 952, 952, 952, nil, 952, 952, 956, + 956, 956, 956, 956, 956, nil, nil, nil, 956, 956, + nil, nil, nil, 956, nil, 956, 956, 956, 956, 956, + 956, 956, nil, nil, nil, nil, nil, 956, 956, 956, + 956, 956, 956, 956, nil, nil, 956, nil, nil, nil, + nil, nil, 956, 956, 956, 956, 956, 956, 956, 956, + 956, 956, 956, 956, nil, 956, 956, 956, nil, 956, + 956, nil, 956, 956, 956, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 956, nil, nil, 956, nil, nil, + 956, 956, nil, nil, 956, nil, 956, nil, nil, nil, + 956, nil, nil, nil, nil, nil, nil, nil, 956, nil, + nil, nil, nil, 956, 956, 956, 956, 956, 956, nil, + nil, nil, 956, 956, nil, nil, nil, nil, nil, nil, + 956, nil, nil, 956, 956, 956, nil, 956, 956, 997, + 997, 997, 997, 997, 997, nil, nil, nil, 997, 997, + nil, nil, nil, 997, nil, 997, 997, 997, 997, 997, + 997, 997, nil, nil, nil, nil, nil, 997, 997, 997, + 997, 997, 997, 997, nil, nil, 997, nil, nil, nil, + nil, nil, 997, 997, 997, 997, 997, 997, 997, 997, + 997, 997, 997, 997, nil, 997, 997, 997, nil, 997, + 997, nil, 997, 997, 997, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 997, nil, nil, 997, nil, nil, + 997, 997, nil, nil, 997, nil, 997, nil, nil, nil, + 997, nil, nil, nil, nil, nil, nil, nil, 997, nil, + nil, nil, nil, 997, 997, 997, 997, 997, 997, nil, + nil, nil, 997, 997, nil, nil, nil, nil, nil, nil, + 997, nil, nil, 997, 997, 997, nil, 997, 997, 1004, + 1004, 1004, 1004, 1004, 1004, nil, nil, nil, 1004, 1004, + nil, nil, nil, 1004, nil, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, nil, nil, nil, nil, nil, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, nil, nil, 1004, nil, nil, nil, + nil, nil, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, nil, 1004, 1004, 1004, nil, 1004, + 1004, nil, 1004, 1004, 1004, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1004, nil, nil, 1004, nil, nil, + 1004, 1004, nil, nil, 1004, nil, 1004, nil, nil, nil, + 1004, nil, nil, nil, nil, nil, nil, nil, 1004, nil, + nil, nil, nil, 1004, 1004, 1004, 1004, 1004, 1004, nil, + nil, nil, 1004, 1004, nil, nil, nil, nil, nil, nil, + 1004, nil, nil, 1004, 1004, 1004, nil, 1004, 1004, 1009, + 1009, 1009, 1009, 1009, 1009, nil, nil, nil, 1009, 1009, + nil, nil, nil, 1009, nil, 1009, 1009, 1009, 1009, 1009, + 1009, 1009, nil, nil, nil, nil, nil, 1009, 1009, 1009, + 1009, 1009, 1009, 1009, nil, nil, 1009, nil, nil, nil, + nil, nil, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, + 1009, 1009, 1009, 1009, nil, 1009, 1009, 1009, nil, 1009, + 1009, nil, 1009, 1009, 1009, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1009, nil, nil, 1009, nil, nil, + 1009, 1009, nil, nil, 1009, nil, 1009, nil, nil, nil, + 1009, nil, nil, nil, nil, nil, nil, nil, 1009, nil, + nil, nil, nil, 1009, 1009, 1009, 1009, 1009, 1009, nil, + nil, nil, 1009, 1009, nil, nil, nil, nil, nil, nil, + 1009, nil, nil, 1009, 1009, 1009, nil, 1009, 1009, 8, + 8, 8, 8, 8, nil, nil, nil, 8, 8, nil, + nil, nil, 8, nil, 8, 8, 8, 8, 8, 8, + 8, nil, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, 8, nil, nil, 8, nil, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, nil, 8, 8, 8, nil, 8, 8, + nil, 8, 8, 8, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 8, nil, nil, 8, nil, nil, 8, + 8, nil, nil, 8, nil, 8, nil, nil, nil, 8, + nil, nil, nil, nil, nil, nil, nil, 8, nil, nil, + nil, nil, 8, 8, 8, 8, 8, 8, nil, nil, + nil, 8, 8, nil, nil, nil, nil, nil, nil, 8, + nil, nil, 8, 8, 8, nil, 8, 8, 23, 23, + 23, nil, 23, nil, nil, nil, 23, 23, nil, nil, + nil, 23, nil, 23, 23, 23, 23, 23, 23, 23, + nil, nil, nil, nil, nil, 23, 23, 23, 23, 23, + 23, 23, nil, nil, 23, nil, nil, nil, nil, nil, + nil, 23, nil, nil, 23, 23, 23, 23, 23, 23, + 23, 23, nil, 23, 23, 23, nil, 23, 23, nil, + 23, 23, 23, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, 23, nil, nil, 23, 23, + nil, nil, 23, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 23, 23, 23, 23, 23, 23, nil, nil, nil, + 23, 23, nil, nil, nil, nil, nil, nil, 23, nil, + nil, 23, 23, 23, nil, 23, 23, 32, 32, 32, + nil, 32, nil, nil, nil, 32, 32, nil, nil, nil, + 32, nil, 32, 32, 32, 32, 32, 32, 32, nil, + nil, nil, nil, nil, 32, 32, 32, 32, 32, 32, + 32, nil, nil, 32, nil, nil, nil, nil, nil, nil, + 32, nil, nil, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, nil, 32, 32, nil, 32, + 32, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 32, nil, nil, 32, nil, nil, 32, 32, nil, + nil, 32, nil, 32, nil, 32, nil, 32, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + 32, 32, 32, 32, 32, 32, nil, nil, nil, 32, + 32, nil, nil, nil, nil, nil, nil, 32, nil, 32, + 32, 32, 32, nil, 32, 32, 33, 33, 33, nil, + 33, nil, nil, nil, 33, 33, nil, nil, nil, 33, + nil, 33, 33, 33, 33, 33, 33, 33, nil, nil, + nil, nil, nil, 33, 33, 33, 33, 33, 33, 33, + nil, nil, 33, nil, nil, nil, nil, nil, nil, 33, + nil, nil, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, nil, 33, 33, nil, 33, 33, + 33, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 33, nil, nil, 33, nil, nil, 33, 33, nil, nil, + 33, nil, 33, nil, 33, nil, 33, nil, nil, nil, + nil, nil, nil, nil, 33, nil, nil, nil, nil, 33, + 33, 33, 33, 33, 33, nil, nil, nil, 33, 33, + nil, nil, nil, nil, nil, nil, 33, nil, 33, 33, + 33, 33, nil, 33, 33, 34, 34, 34, nil, 34, + nil, nil, nil, 34, 34, nil, nil, nil, 34, nil, + 34, 34, 34, 34, 34, 34, 34, nil, nil, nil, + nil, nil, 34, 34, 34, 34, 34, 34, 34, nil, + nil, 34, nil, nil, nil, nil, nil, nil, 34, nil, + nil, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, nil, 34, 34, nil, 34, 34, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, 34, nil, nil, 34, 34, nil, nil, 34, + nil, 34, nil, 34, nil, 34, nil, nil, nil, nil, + nil, nil, nil, 34, nil, nil, nil, nil, 34, 34, + 34, 34, 34, 34, nil, nil, nil, 34, 34, nil, + nil, nil, nil, nil, nil, 34, nil, 34, 34, 34, + 34, nil, 34, 34, 37, 37, 37, nil, 37, nil, + nil, nil, 37, 37, nil, nil, nil, 37, nil, 37, + 37, 37, 37, 37, 37, 37, nil, nil, nil, nil, + nil, 37, 37, 37, 37, 37, 37, 37, nil, nil, + 37, nil, nil, nil, nil, nil, nil, 37, nil, nil, + 37, 37, 37, 37, 37, 37, 37, 37, nil, 37, + 37, 37, nil, 37, 37, nil, nil, nil, 37, nil, + nil, nil, nil, nil, 970, nil, 970, 970, 970, 970, + 970, nil, nil, nil, nil, nil, nil, nil, 37, nil, + 970, 37, nil, nil, 37, 37, nil, nil, 37, nil, + 37, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 970, nil, nil, nil, nil, 37, 37, 37, + 37, 37, 37, 970, 970, nil, 37, 37, nil, nil, + nil, nil, nil, nil, 37, nil, nil, 37, 37, 37, + nil, 37, 37, 38, 38, 38, nil, 38, nil, nil, + nil, 38, 38, nil, nil, nil, 38, 970, 38, 38, + 38, 38, 38, 38, 38, nil, nil, nil, nil, nil, + 38, 38, 38, 38, 38, 38, 38, nil, nil, 38, + nil, nil, nil, nil, nil, nil, 38, nil, nil, 38, + 38, 38, 38, 38, 38, 38, 38, nil, 38, 38, + 38, nil, 38, 38, nil, nil, nil, 38, nil, nil, + nil, nil, nil, 972, nil, 972, 972, 972, 972, 972, + nil, nil, nil, nil, nil, nil, nil, 38, nil, 972, + 38, nil, nil, 38, 38, nil, nil, 38, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 972, nil, nil, nil, nil, 38, 38, 38, 38, + 38, 38, 972, 972, nil, 38, 38, nil, nil, nil, + 38, nil, nil, 38, nil, nil, 38, 38, 38, nil, + 38, 38, 45, 45, 45, nil, 45, nil, nil, nil, + 45, 45, nil, nil, nil, 45, 972, 45, 45, 45, + 45, 45, 45, 45, nil, nil, nil, nil, nil, 45, + 45, 45, 45, 45, 45, 45, nil, nil, 45, nil, + nil, nil, nil, nil, nil, 45, nil, nil, 45, 45, + 45, 45, 45, 45, 45, 45, nil, 45, 45, 45, + nil, 45, 45, nil, 45, 45, 45, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 45, nil, nil, 45, + nil, nil, 45, 45, nil, nil, 45, nil, nil, nil, + nil, nil, 45, nil, nil, nil, nil, nil, nil, nil, + 45, nil, nil, nil, nil, 45, 45, 45, 45, 45, + 45, nil, nil, nil, 45, 45, nil, nil, nil, nil, + nil, nil, 45, nil, nil, 45, 45, 45, nil, 45, + 45, 46, 46, 46, nil, 46, nil, nil, nil, 46, + 46, nil, nil, nil, 46, nil, 46, 46, 46, 46, + 46, 46, 46, nil, nil, nil, nil, nil, 46, 46, + 46, 46, 46, 46, 46, nil, nil, 46, nil, nil, + nil, nil, nil, nil, 46, nil, nil, 46, 46, 46, + 46, 46, 46, 46, 46, nil, 46, 46, 46, nil, + 46, 46, nil, 46, 46, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 46, nil, nil, 46, nil, + nil, 46, 46, nil, nil, 46, nil, nil, nil, nil, + nil, 46, nil, nil, nil, nil, nil, nil, nil, 46, + nil, nil, nil, nil, 46, 46, 46, 46, 46, 46, + nil, nil, nil, 46, 46, nil, nil, nil, nil, nil, + nil, 46, nil, nil, 46, 46, 46, nil, 46, 46, + 48, 48, 48, nil, 48, nil, nil, nil, 48, 48, + nil, nil, nil, 48, nil, 48, 48, 48, 48, 48, + 48, 48, nil, nil, nil, nil, nil, 48, 48, 48, + 48, 48, 48, 48, nil, nil, 48, nil, nil, nil, + nil, nil, nil, 48, nil, nil, 48, 48, 48, 48, + 48, 48, 48, 48, nil, 48, 48, 48, nil, 48, + 48, nil, 48, 48, 48, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 48, nil, nil, 48, nil, nil, + 48, 48, nil, nil, 48, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, 48, 48, 48, 48, 48, 48, nil, + nil, nil, 48, 48, nil, nil, nil, nil, nil, nil, + 48, nil, nil, 48, 48, 48, nil, 48, 48, 62, + 62, 62, 62, 62, nil, nil, nil, 62, 62, nil, + nil, nil, 62, nil, 62, 62, 62, 62, 62, 62, + 62, nil, nil, nil, nil, nil, 62, 62, 62, 62, + 62, 62, 62, nil, nil, 62, nil, nil, nil, nil, + nil, 62, 62, nil, 62, 62, 62, 62, 62, 62, + 62, 62, 62, nil, 62, 62, 62, nil, 62, 62, + nil, 62, 62, 62, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 62, nil, nil, 62, nil, nil, 62, + 62, nil, nil, 62, nil, 62, nil, nil, nil, 62, + nil, nil, nil, nil, nil, nil, nil, 62, nil, nil, + nil, nil, 62, 62, 62, 62, 62, 62, nil, nil, + nil, 62, 62, nil, nil, nil, nil, nil, nil, 62, + nil, nil, 62, 62, 62, nil, 62, 62, 67, 67, + 67, nil, 67, nil, nil, nil, 67, 67, nil, nil, + nil, 67, nil, 67, 67, 67, 67, 67, 67, 67, + nil, nil, nil, nil, nil, 67, 67, 67, 67, 67, + 67, 67, nil, nil, 67, nil, nil, nil, nil, nil, + nil, 67, nil, nil, 67, 67, 67, 67, 67, 67, + 67, 67, nil, 67, 67, 67, nil, 67, 67, nil, + 67, 67, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, 67, nil, nil, 67, 67, + nil, nil, 67, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, 67, 67, 67, 67, 67, 67, nil, nil, nil, + 67, 67, nil, nil, nil, nil, nil, nil, 67, nil, + nil, 67, 67, 67, nil, 67, 67, 68, 68, 68, + nil, 68, nil, nil, nil, 68, 68, nil, nil, nil, + 68, nil, 68, 68, 68, 68, 68, 68, 68, nil, + nil, nil, nil, nil, 68, 68, 68, 68, 68, 68, + 68, nil, nil, 68, nil, nil, nil, nil, nil, nil, + 68, nil, nil, 68, 68, 68, 68, 68, 68, 68, + 68, nil, 68, 68, 68, nil, 68, 68, nil, 68, + 68, 68, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 68, nil, nil, 68, nil, nil, 68, 68, nil, + nil, 68, nil, nil, nil, nil, nil, 68, nil, nil, + nil, nil, nil, nil, nil, 68, nil, nil, nil, nil, + 68, 68, 68, 68, 68, 68, nil, nil, nil, 68, + 68, nil, nil, nil, nil, nil, nil, 68, nil, nil, + 68, 68, 68, nil, 68, 68, 71, 71, 71, nil, + 71, nil, nil, nil, 71, 71, nil, nil, nil, 71, + nil, 71, 71, 71, 71, 71, 71, 71, nil, nil, + nil, nil, nil, 71, 71, 71, 71, 71, 71, 71, + nil, nil, 71, nil, nil, nil, nil, nil, nil, 71, + nil, nil, 71, 71, 71, 71, 71, 71, 71, 71, + nil, 71, 71, 71, nil, 71, 71, nil, 71, 71, + 71, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 71, nil, nil, 71, nil, nil, 71, 71, nil, nil, + 71, nil, nil, nil, nil, nil, 71, nil, nil, nil, + nil, nil, nil, nil, 71, nil, nil, nil, nil, 71, + 71, 71, 71, 71, 71, nil, nil, nil, 71, 71, + 71, nil, nil, nil, nil, 71, 71, nil, nil, 71, + 71, 71, nil, 71, 71, 72, 72, 72, nil, 72, + nil, nil, nil, 72, 72, nil, nil, nil, 72, nil, + 72, 72, 72, 72, 72, 72, 72, nil, nil, nil, + nil, nil, 72, 72, 72, 72, 72, 72, 72, nil, + nil, 72, nil, nil, nil, nil, nil, nil, 72, nil, + nil, 72, 72, 72, 72, 72, 72, 72, 72, nil, + 72, 72, 72, nil, 72, 72, nil, nil, nil, 72, + nil, nil, nil, nil, nil, 988, nil, 988, 988, 988, + 988, 988, nil, nil, nil, nil, nil, nil, nil, 72, + nil, 988, 72, nil, nil, 72, 72, nil, nil, 72, + nil, 72, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 988, nil, nil, nil, nil, 72, 72, + 72, 72, 72, 72, 988, 988, nil, 72, 72, nil, + nil, nil, nil, nil, nil, 72, nil, nil, 72, 72, + 72, nil, 72, 72, 73, 73, 73, nil, 73, nil, + nil, nil, 73, 73, nil, nil, nil, 73, 988, 73, + 73, 73, 73, 73, 73, 73, nil, nil, nil, nil, + nil, 73, 73, 73, 73, 73, 73, 73, nil, nil, + 73, nil, nil, nil, nil, nil, nil, 73, nil, nil, + 73, 73, 73, 73, 73, 73, 73, 73, nil, 73, + 73, 73, nil, 73, 73, nil, nil, nil, 73, nil, + nil, nil, nil, nil, 1050, nil, 1050, 1050, 1050, 1050, + 1050, nil, nil, nil, nil, 73, nil, nil, 73, nil, + 1050, 73, nil, nil, 73, 73, nil, nil, 73, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1050, nil, nil, nil, nil, 73, 73, 73, + 73, 73, 73, 1050, 1050, nil, 73, 73, nil, nil, + nil, nil, nil, nil, 73, nil, nil, 73, 73, 73, + nil, 73, 73, 74, 74, 74, nil, 74, nil, nil, + nil, 74, 74, nil, nil, nil, 74, 1050, 74, 74, + 74, 74, 74, 74, 74, nil, nil, nil, nil, nil, + 74, 74, 74, 74, 74, 74, 74, nil, nil, 74, + nil, nil, nil, nil, nil, nil, 74, nil, nil, 74, + 74, 74, 74, 74, 74, 74, 74, nil, 74, 74, + 74, nil, 74, 74, nil, nil, nil, 74, nil, nil, + nil, nil, nil, 1059, nil, 1059, 1059, 1059, 1059, 1059, + nil, nil, nil, nil, nil, nil, nil, 74, nil, 1059, + 74, nil, nil, 74, 74, nil, nil, 74, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1059, nil, nil, nil, nil, 74, 74, 74, 74, + 74, 74, 1059, 1059, nil, 74, 74, nil, nil, nil, + nil, nil, nil, 74, nil, nil, 74, 74, 74, nil, + 74, 74, 128, 128, 128, 128, 128, nil, nil, nil, + 128, 128, nil, nil, nil, 128, 1059, 128, 128, 128, + 128, 128, 128, 128, nil, nil, nil, nil, nil, 128, + 128, 128, 128, 128, 128, 128, nil, nil, 128, nil, + nil, nil, nil, nil, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, nil, 128, 128, 128, + nil, 128, 128, nil, 128, 128, 128, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 128, nil, nil, 128, + nil, nil, 128, 128, nil, nil, 128, nil, 128, nil, + nil, nil, 128, nil, nil, nil, nil, nil, nil, nil, + 128, nil, nil, nil, nil, 128, 128, 128, 128, 128, + 128, nil, nil, nil, 128, 128, nil, nil, nil, nil, + nil, 128, 128, nil, nil, 128, 128, 128, nil, 128, + 128, 133, 133, 133, nil, 133, nil, nil, nil, 133, + 133, nil, nil, nil, 133, nil, 133, 133, 133, 133, + 133, 133, 133, nil, nil, nil, nil, nil, 133, 133, + 133, 133, 133, 133, 133, nil, nil, 133, nil, nil, + nil, nil, nil, nil, 133, nil, nil, 133, 133, 133, + 133, 133, 133, 133, 133, nil, 133, 133, 133, nil, + 133, 133, nil, 133, 133, 133, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 133, nil, nil, 133, nil, + nil, 133, 133, nil, nil, 133, nil, nil, nil, nil, + nil, 133, nil, nil, nil, nil, nil, nil, nil, 133, + nil, nil, nil, nil, 133, 133, 133, 133, 133, 133, + nil, nil, nil, 133, 133, nil, nil, nil, nil, nil, + nil, 133, nil, nil, 133, 133, 133, nil, 133, 133, + 134, 134, 134, nil, 134, nil, nil, nil, 134, 134, + nil, nil, nil, 134, nil, 134, 134, 134, 134, 134, + 134, 134, nil, nil, nil, nil, nil, 134, 134, 134, + 134, 134, 134, 134, nil, nil, 134, nil, nil, nil, + nil, nil, nil, 134, nil, nil, 134, 134, 134, 134, + 134, 134, 134, 134, nil, 134, 134, 134, nil, 134, + 134, nil, 134, 134, 134, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 134, nil, nil, 134, nil, nil, + 134, 134, nil, nil, 134, nil, nil, nil, nil, nil, + 134, nil, nil, nil, nil, nil, nil, nil, 134, nil, + nil, nil, nil, 134, 134, 134, 134, 134, 134, nil, + nil, nil, 134, 134, nil, nil, nil, nil, nil, nil, + 134, nil, nil, 134, 134, 134, nil, 134, 134, 135, + 135, 135, nil, 135, nil, nil, nil, 135, 135, nil, + nil, nil, 135, nil, 135, 135, 135, 135, 135, 135, + 135, nil, nil, nil, nil, nil, 135, 135, 135, 135, + 135, 135, 135, nil, nil, 135, nil, nil, nil, nil, + nil, nil, 135, nil, nil, 135, 135, 135, 135, 135, + 135, 135, 135, nil, 135, 135, 135, nil, 135, 135, + nil, 135, 135, 135, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 135, nil, nil, 135, nil, nil, 135, + 135, nil, nil, 135, nil, nil, nil, nil, nil, 135, + nil, nil, nil, nil, nil, nil, nil, 135, nil, nil, + nil, nil, 135, 135, 135, 135, 135, 135, nil, nil, + nil, 135, 135, nil, nil, nil, nil, nil, nil, 135, + nil, nil, 135, 135, 135, nil, 135, 135, 136, 136, + 136, nil, 136, nil, nil, nil, 136, 136, nil, nil, + nil, 136, nil, 136, 136, 136, 136, 136, 136, 136, + nil, nil, nil, nil, nil, 136, 136, 136, 136, 136, + 136, 136, nil, nil, 136, nil, nil, nil, nil, nil, + nil, 136, nil, nil, 136, 136, 136, 136, 136, 136, + 136, 136, nil, 136, 136, 136, nil, 136, 136, nil, + 136, 136, 136, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 136, nil, nil, 136, nil, nil, 136, 136, + nil, nil, 136, nil, nil, nil, nil, nil, 136, nil, + nil, nil, nil, nil, nil, nil, 136, nil, nil, nil, + nil, 136, 136, 136, 136, 136, 136, nil, nil, nil, + 136, 136, nil, nil, nil, nil, nil, nil, 136, nil, + nil, 136, 136, 136, nil, 136, 136, 137, 137, 137, + 137, 137, nil, nil, nil, 137, 137, nil, nil, nil, + 137, nil, 137, 137, 137, 137, 137, 137, 137, nil, + nil, nil, nil, nil, 137, 137, 137, 137, 137, 137, + 137, nil, nil, 137, nil, nil, nil, nil, nil, 137, + 137, nil, 137, 137, 137, 137, 137, 137, 137, 137, + 137, nil, 137, 137, 137, nil, 137, 137, nil, 137, + 137, 137, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 137, nil, nil, 137, nil, nil, 137, 137, nil, + nil, 137, nil, 137, nil, nil, nil, 137, nil, nil, + nil, nil, nil, nil, nil, 137, nil, nil, nil, nil, + 137, 137, 137, 137, 137, 137, nil, nil, nil, 137, + 137, nil, nil, nil, nil, nil, nil, 137, nil, nil, + 137, 137, 137, nil, 137, 137, 222, 222, 222, nil, + 222, nil, nil, nil, 222, 222, nil, nil, nil, 222, + nil, 222, 222, 222, 222, 222, 222, 222, nil, nil, + nil, nil, nil, 222, 222, 222, 222, 222, 222, 222, + nil, nil, 222, nil, nil, nil, nil, nil, nil, 222, + nil, nil, 222, 222, 222, 222, 222, 222, 222, 222, + nil, 222, 222, 222, nil, 222, 222, nil, 222, 222, + 222, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 222, nil, nil, 222, nil, nil, 222, 222, nil, nil, + 222, nil, 222, nil, nil, nil, 222, nil, nil, nil, + nil, nil, nil, nil, 222, nil, nil, nil, nil, 222, + 222, 222, 222, 222, 222, nil, nil, nil, 222, 222, + nil, nil, nil, nil, nil, nil, 222, nil, nil, 222, + 222, 222, nil, 222, 222, 223, 223, 223, nil, 223, + nil, nil, nil, 223, 223, nil, nil, nil, 223, nil, + 223, 223, 223, 223, 223, 223, 223, nil, nil, nil, + nil, nil, 223, 223, 223, 223, 223, 223, 223, nil, + nil, 223, nil, nil, nil, nil, nil, nil, 223, nil, + nil, 223, 223, 223, 223, 223, 223, 223, 223, nil, + 223, 223, 223, nil, 223, 223, nil, 223, 223, 223, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 223, + nil, nil, 223, nil, nil, 223, 223, nil, nil, 223, + nil, 223, nil, nil, nil, 223, nil, nil, nil, nil, + nil, nil, nil, 223, nil, nil, nil, nil, 223, 223, + 223, 223, 223, 223, nil, nil, nil, 223, 223, nil, + nil, nil, nil, nil, nil, 223, nil, nil, 223, 223, + 223, nil, 223, 223, 224, 224, 224, nil, 224, nil, + nil, nil, 224, 224, nil, nil, nil, 224, nil, 224, + 224, 224, 224, 224, 224, 224, nil, nil, nil, nil, + nil, 224, 224, 224, 224, 224, 224, 224, nil, nil, + 224, nil, nil, nil, nil, nil, nil, 224, nil, nil, + 224, 224, 224, 224, 224, 224, 224, 224, nil, 224, + 224, 224, nil, 224, 224, nil, 224, 224, 224, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 224, nil, + nil, 224, nil, nil, 224, 224, nil, nil, 224, nil, + nil, nil, nil, nil, 224, nil, nil, nil, nil, nil, + nil, nil, 224, nil, nil, nil, nil, 224, 224, 224, + 224, 224, 224, nil, nil, nil, 224, 224, nil, nil, + nil, nil, nil, nil, 224, nil, nil, 224, 224, 224, + nil, 224, 224, 225, 225, 225, nil, 225, nil, nil, + nil, 225, 225, nil, nil, nil, 225, nil, 225, 225, + 225, 225, 225, 225, 225, nil, nil, nil, nil, nil, + 225, 225, 225, 225, 225, 225, 225, nil, nil, 225, + nil, nil, nil, nil, nil, nil, 225, nil, nil, 225, + 225, 225, 225, 225, 225, 225, 225, nil, 225, 225, + 225, nil, 225, 225, nil, 225, 225, 225, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 225, nil, nil, + 225, nil, nil, 225, 225, nil, nil, 225, nil, nil, + nil, nil, nil, 225, nil, nil, nil, nil, nil, nil, + nil, 225, nil, nil, nil, nil, 225, 225, 225, 225, + 225, 225, nil, nil, nil, 225, 225, nil, nil, nil, + nil, nil, nil, 225, nil, nil, 225, 225, 225, nil, + 225, 225, 226, 226, 226, nil, 226, nil, nil, nil, + 226, 226, nil, nil, nil, 226, nil, 226, 226, 226, + 226, 226, 226, 226, nil, nil, nil, nil, nil, 226, + 226, 226, 226, 226, 226, 226, nil, nil, 226, nil, + nil, nil, nil, nil, nil, 226, nil, nil, 226, 226, + 226, 226, 226, 226, 226, 226, nil, 226, 226, 226, + nil, 226, 226, nil, 226, 226, 226, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 226, nil, nil, 226, + nil, nil, 226, 226, nil, nil, 226, nil, nil, nil, + nil, nil, 226, nil, nil, nil, nil, nil, nil, nil, + 226, nil, nil, nil, nil, 226, 226, 226, 226, 226, + 226, nil, nil, nil, 226, 226, nil, nil, nil, nil, + nil, nil, 226, nil, nil, 226, 226, 226, nil, 226, + 226, 227, 227, 227, nil, 227, nil, nil, nil, 227, + 227, nil, nil, nil, 227, nil, 227, 227, 227, 227, + 227, 227, 227, nil, nil, nil, nil, nil, 227, 227, + 227, 227, 227, 227, 227, nil, nil, 227, nil, nil, + nil, nil, nil, nil, 227, nil, nil, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, nil, + 227, 227, nil, 227, 227, 227, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 227, nil, nil, 227, nil, + nil, 227, 227, nil, nil, 227, nil, 227, nil, 227, + nil, 227, nil, nil, nil, nil, nil, nil, nil, 227, + nil, nil, nil, nil, 227, 227, 227, 227, 227, 227, + nil, nil, nil, 227, 227, nil, nil, nil, nil, nil, + nil, 227, nil, 227, 227, 227, 227, nil, 227, 227, + 232, 232, 232, nil, 232, nil, nil, nil, 232, 232, + nil, nil, nil, 232, nil, 232, 232, 232, 232, 232, + 232, 232, nil, nil, nil, nil, nil, 232, 232, 232, + 232, 232, 232, 232, nil, nil, 232, nil, nil, nil, + nil, nil, nil, 232, nil, nil, 232, 232, 232, 232, + 232, 232, 232, 232, nil, 232, 232, 232, nil, 232, + 232, nil, 232, 232, 232, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 232, nil, nil, 232, nil, nil, + 232, 232, nil, nil, 232, nil, nil, nil, nil, nil, + 232, nil, nil, nil, nil, nil, nil, nil, 232, nil, + nil, nil, nil, 232, 232, 232, 232, 232, 232, nil, + nil, nil, 232, 232, nil, nil, nil, nil, nil, nil, + 232, nil, nil, 232, 232, 232, nil, 232, 232, 233, + 233, 233, nil, 233, nil, nil, nil, 233, 233, nil, + nil, nil, 233, nil, 233, 233, 233, 233, 233, 233, + 233, nil, nil, nil, nil, nil, 233, 233, 233, 233, + 233, 233, 233, nil, nil, 233, nil, nil, nil, nil, + nil, nil, 233, nil, nil, 233, 233, 233, 233, 233, + 233, 233, 233, nil, 233, 233, 233, nil, 233, 233, + nil, 233, 233, 233, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 233, nil, nil, 233, nil, nil, 233, + 233, nil, nil, 233, nil, nil, nil, nil, nil, 233, + nil, nil, nil, nil, nil, nil, nil, 233, nil, nil, + nil, nil, 233, 233, 233, 233, 233, 233, nil, nil, + nil, 233, 233, nil, nil, nil, nil, nil, nil, 233, + nil, nil, 233, 233, 233, nil, 233, 233, 234, 234, + 234, nil, 234, nil, nil, nil, 234, 234, nil, nil, + nil, 234, nil, 234, 234, 234, 234, 234, 234, 234, + nil, nil, nil, nil, nil, 234, 234, 234, 234, 234, + 234, 234, nil, nil, 234, nil, nil, nil, nil, nil, + nil, 234, nil, nil, 234, 234, 234, 234, 234, 234, + 234, 234, nil, 234, 234, 234, nil, 234, 234, nil, + 234, 234, 234, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 234, nil, nil, 234, nil, nil, 234, 234, + nil, nil, 234, nil, nil, nil, nil, nil, 234, nil, + nil, nil, nil, nil, nil, nil, 234, nil, nil, nil, + nil, 234, 234, 234, 234, 234, 234, nil, nil, nil, + 234, 234, 234, nil, nil, nil, nil, nil, 234, nil, + nil, 234, 234, 234, nil, 234, 234, 245, 245, 245, + nil, 245, nil, nil, nil, 245, 245, nil, nil, nil, + 245, nil, 245, 245, 245, 245, 245, 245, 245, nil, + nil, nil, nil, nil, 245, 245, 245, 245, 245, 245, + 245, nil, nil, 245, nil, nil, nil, nil, nil, nil, + 245, nil, nil, 245, 245, 245, 245, 245, 245, 245, + 245, nil, 245, 245, 245, nil, 245, 245, nil, 245, + 245, 245, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, 245, nil, nil, 245, 245, nil, + nil, 245, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 245, 245, 245, 245, 245, 245, nil, nil, nil, 245, + 245, nil, nil, nil, nil, nil, nil, 245, nil, nil, + 245, 245, 245, nil, 245, 245, 248, 248, 248, nil, + 248, nil, nil, nil, 248, 248, nil, nil, nil, 248, + nil, 248, 248, 248, 248, 248, 248, 248, nil, nil, + nil, nil, nil, 248, 248, 248, 248, 248, 248, 248, + nil, nil, 248, nil, nil, nil, nil, nil, nil, 248, + nil, nil, 248, 248, 248, 248, 248, 248, 248, 248, + nil, 248, 248, 248, nil, 248, 248, nil, 248, 248, + 248, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 248, nil, nil, 248, nil, nil, 248, 248, nil, nil, + 248, nil, nil, nil, nil, nil, 248, nil, nil, nil, + nil, nil, nil, nil, 248, nil, nil, nil, nil, 248, + 248, 248, 248, 248, 248, nil, nil, nil, 248, 248, + nil, nil, nil, nil, nil, nil, 248, nil, nil, 248, + 248, 248, nil, 248, 248, 249, 249, 249, nil, 249, + nil, nil, nil, 249, 249, nil, nil, nil, 249, nil, + 249, 249, 249, 249, 249, 249, 249, nil, nil, nil, + nil, nil, 249, 249, 249, 249, 249, 249, 249, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 249, nil, + nil, 249, 249, 249, 249, 249, 249, 249, 249, nil, + 249, 249, 249, nil, 249, 249, nil, 249, 249, 249, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, 249, nil, nil, 249, 249, nil, nil, 249, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 249, 249, + 249, 249, 249, 249, nil, nil, nil, 249, 249, nil, + nil, nil, nil, nil, nil, 249, nil, nil, 249, 249, + 249, nil, 249, 249, 250, 250, 250, nil, 250, nil, + nil, nil, 250, 250, nil, nil, nil, 250, nil, 250, + 250, 250, 250, 250, 250, 250, nil, nil, nil, nil, + nil, 250, 250, 250, 250, 250, 250, 250, nil, nil, + 250, nil, nil, nil, nil, nil, nil, 250, nil, nil, + 250, 250, 250, 250, 250, 250, 250, 250, nil, 250, + 250, 250, nil, 250, 250, nil, 250, 250, 250, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 250, nil, + nil, 250, nil, nil, 250, 250, nil, nil, 250, nil, + nil, nil, nil, nil, 250, nil, nil, nil, nil, nil, + nil, nil, 250, nil, nil, nil, nil, 250, 250, 250, + 250, 250, 250, nil, nil, nil, 250, 250, nil, nil, + nil, nil, nil, nil, 250, nil, nil, 250, 250, 250, + nil, 250, 250, 251, 251, 251, nil, 251, nil, nil, + nil, 251, 251, nil, nil, nil, 251, nil, 251, 251, + 251, 251, 251, 251, 251, nil, nil, nil, nil, nil, + 251, 251, 251, 251, 251, 251, 251, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 251, nil, nil, 251, + 251, 251, 251, 251, 251, 251, 251, nil, 251, 251, + 251, nil, 251, 251, nil, 251, 251, 251, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 251, nil, nil, + 251, nil, nil, 251, 251, nil, nil, 251, nil, nil, + nil, nil, nil, 251, nil, nil, nil, nil, nil, nil, + nil, 251, nil, nil, nil, nil, 251, 251, 251, 251, + 251, 251, nil, nil, nil, 251, 251, nil, nil, nil, + nil, nil, nil, 251, nil, nil, 251, 251, 251, nil, + 251, 251, 252, 252, 252, nil, 252, nil, nil, nil, + 252, 252, nil, nil, nil, 252, nil, 252, 252, 252, + 252, 252, 252, 252, nil, nil, nil, nil, nil, 252, + 252, 252, 252, 252, 252, 252, nil, nil, 252, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 252, 252, + 252, 252, 252, 252, 252, 252, nil, 252, 252, 252, + nil, 252, 252, nil, 252, 252, 252, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 252, + nil, nil, 252, 252, nil, nil, 252, nil, nil, nil, + nil, nil, 252, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, nil, nil, 252, 252, 252, 252, 252, + 252, nil, nil, nil, 252, 252, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 252, 252, 252, nil, 252, + 252, 253, 253, 253, nil, 253, nil, nil, nil, 253, + 253, nil, nil, nil, 253, nil, 253, 253, 253, 253, + 253, 253, 253, nil, nil, nil, nil, nil, 253, 253, + 253, 253, 253, 253, 253, nil, nil, 253, nil, nil, + nil, nil, nil, nil, 253, nil, nil, 253, 253, 253, + 253, 253, 253, 253, 253, nil, 253, 253, 253, nil, + 253, 253, nil, 253, 253, 253, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 253, nil, nil, 253, nil, + nil, 253, 253, nil, nil, 253, nil, nil, nil, nil, + nil, 253, nil, nil, nil, nil, nil, nil, nil, 253, + nil, nil, nil, nil, 253, 253, 253, 253, 253, 253, + nil, nil, nil, 253, 253, nil, nil, nil, nil, nil, + nil, 253, nil, nil, 253, 253, 253, nil, 253, 253, + 254, 254, 254, nil, 254, nil, nil, nil, 254, 254, + nil, nil, nil, 254, nil, 254, 254, 254, 254, 254, + 254, 254, nil, nil, nil, nil, nil, 254, 254, 254, + 254, 254, 254, 254, nil, nil, 254, nil, nil, nil, + nil, nil, nil, 254, nil, nil, 254, 254, 254, 254, + 254, 254, 254, 254, nil, 254, 254, 254, nil, 254, + 254, nil, 254, 254, 254, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 254, nil, nil, 254, nil, nil, + 254, 254, nil, nil, 254, nil, nil, nil, nil, nil, + 254, nil, nil, nil, nil, nil, nil, nil, 254, nil, + nil, nil, nil, 254, 254, 254, 254, 254, 254, nil, + nil, nil, 254, 254, nil, nil, nil, nil, nil, nil, + 254, nil, nil, 254, 254, 254, nil, 254, 254, 255, + 255, 255, nil, 255, nil, nil, nil, 255, 255, nil, + nil, nil, 255, nil, 255, 255, 255, 255, 255, 255, + 255, nil, nil, nil, nil, nil, 255, 255, 255, 255, + 255, 255, 255, nil, nil, 255, nil, nil, nil, nil, + nil, nil, 255, nil, nil, 255, 255, 255, 255, 255, + 255, 255, 255, nil, 255, 255, 255, nil, 255, 255, + nil, 255, 255, 255, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 255, nil, nil, 255, nil, nil, 255, + 255, nil, nil, 255, nil, nil, nil, nil, nil, 255, + nil, nil, nil, nil, nil, nil, nil, 255, nil, nil, + nil, nil, 255, 255, 255, 255, 255, 255, nil, nil, + nil, 255, 255, nil, nil, nil, nil, nil, nil, 255, + nil, nil, 255, 255, 255, nil, 255, 255, 256, 256, + 256, nil, 256, nil, nil, nil, 256, 256, nil, nil, + nil, 256, nil, 256, 256, 256, 256, 256, 256, 256, + nil, nil, nil, nil, nil, 256, 256, 256, 256, 256, + 256, 256, nil, nil, 256, nil, nil, nil, nil, nil, + nil, 256, nil, nil, 256, 256, 256, 256, 256, 256, + 256, 256, nil, 256, 256, 256, nil, 256, 256, nil, + 256, 256, 256, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 256, nil, nil, 256, nil, nil, 256, 256, + nil, nil, 256, nil, nil, nil, nil, nil, 256, nil, + nil, nil, nil, nil, nil, nil, 256, nil, nil, nil, + nil, 256, 256, 256, 256, 256, 256, nil, nil, nil, + 256, 256, nil, nil, nil, nil, nil, nil, 256, nil, + nil, 256, 256, 256, nil, 256, 256, 257, 257, 257, + nil, 257, nil, nil, nil, 257, 257, nil, nil, nil, + 257, nil, 257, 257, 257, 257, 257, 257, 257, nil, + nil, nil, nil, nil, 257, 257, 257, 257, 257, 257, + 257, nil, nil, 257, nil, nil, nil, nil, nil, nil, + 257, nil, nil, 257, 257, 257, 257, 257, 257, 257, + 257, nil, 257, 257, 257, nil, 257, 257, nil, 257, + 257, 257, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, 257, nil, nil, 257, 257, nil, + nil, 257, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 257, 257, 257, 257, 257, 257, nil, nil, nil, 257, + 257, nil, nil, nil, nil, nil, nil, 257, nil, nil, + 257, 257, 257, nil, 257, 257, 258, 258, 258, nil, + 258, nil, nil, nil, 258, 258, nil, nil, nil, 258, + nil, 258, 258, 258, 258, 258, 258, 258, nil, nil, + nil, nil, nil, 258, 258, 258, 258, 258, 258, 258, + nil, nil, 258, nil, nil, nil, nil, nil, nil, 258, + nil, nil, 258, 258, 258, 258, 258, 258, 258, 258, + nil, 258, 258, 258, nil, 258, 258, nil, 258, 258, + 258, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 258, nil, nil, 258, nil, nil, 258, 258, nil, nil, + 258, nil, nil, nil, nil, nil, 258, nil, nil, nil, + nil, nil, nil, nil, 258, nil, nil, nil, nil, 258, + 258, 258, 258, 258, 258, nil, nil, nil, 258, 258, + nil, nil, nil, nil, nil, nil, 258, nil, nil, 258, + 258, 258, nil, 258, 258, 259, 259, 259, nil, 259, + nil, nil, nil, 259, 259, nil, nil, nil, 259, nil, + 259, 259, 259, 259, 259, 259, 259, nil, nil, nil, + nil, nil, 259, 259, 259, 259, 259, 259, 259, nil, + nil, 259, nil, nil, nil, nil, nil, nil, 259, nil, + nil, 259, 259, 259, 259, 259, 259, 259, 259, nil, + 259, 259, 259, nil, 259, 259, nil, 259, 259, 259, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 259, + nil, nil, 259, nil, nil, 259, 259, nil, nil, 259, + nil, nil, nil, nil, nil, 259, nil, nil, nil, nil, + nil, nil, nil, 259, nil, nil, nil, nil, 259, 259, + 259, 259, 259, 259, nil, nil, nil, 259, 259, nil, + nil, nil, nil, nil, nil, 259, nil, nil, 259, 259, + 259, nil, 259, 259, 260, 260, 260, nil, 260, nil, + nil, nil, 260, 260, nil, nil, nil, 260, nil, 260, + 260, 260, 260, 260, 260, 260, nil, nil, nil, nil, + nil, 260, 260, 260, 260, 260, 260, 260, nil, nil, + 260, nil, nil, nil, nil, nil, nil, 260, nil, nil, + 260, 260, 260, 260, 260, 260, 260, 260, nil, 260, + 260, 260, nil, 260, 260, nil, 260, 260, 260, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 260, nil, + nil, 260, nil, nil, 260, 260, nil, nil, 260, nil, + nil, nil, nil, nil, 260, nil, nil, nil, nil, nil, + nil, nil, 260, nil, nil, nil, nil, 260, 260, 260, + 260, 260, 260, nil, nil, nil, 260, 260, nil, nil, + nil, nil, nil, nil, 260, nil, nil, 260, 260, 260, + nil, 260, 260, 261, 261, 261, nil, 261, nil, nil, + nil, 261, 261, nil, nil, nil, 261, nil, 261, 261, + 261, 261, 261, 261, 261, nil, nil, nil, nil, nil, + 261, 261, 261, 261, 261, 261, 261, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 261, nil, nil, 261, + 261, 261, 261, 261, 261, 261, 261, nil, 261, 261, + 261, nil, 261, 261, nil, 261, 261, 261, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 261, nil, nil, + 261, nil, nil, 261, 261, nil, nil, 261, nil, nil, + nil, nil, nil, 261, nil, nil, nil, nil, nil, nil, + nil, 261, nil, nil, nil, nil, 261, 261, 261, 261, + 261, 261, nil, nil, nil, 261, 261, nil, nil, nil, + nil, nil, nil, 261, nil, nil, 261, 261, 261, nil, + 261, 261, 262, 262, 262, nil, 262, nil, nil, nil, + 262, 262, nil, nil, nil, 262, nil, 262, 262, 262, + 262, 262, 262, 262, nil, nil, nil, nil, nil, 262, + 262, 262, 262, 262, 262, 262, nil, nil, 262, nil, + nil, nil, nil, nil, nil, 262, nil, nil, 262, 262, + 262, 262, 262, 262, 262, 262, nil, 262, 262, 262, + nil, 262, 262, nil, 262, 262, 262, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 262, nil, nil, 262, + nil, nil, 262, 262, nil, nil, 262, nil, nil, nil, + nil, nil, 262, nil, nil, nil, nil, nil, nil, nil, + 262, nil, nil, nil, nil, 262, 262, 262, 262, 262, + 262, nil, nil, nil, 262, 262, nil, nil, nil, nil, + nil, nil, 262, nil, nil, 262, 262, 262, nil, 262, + 262, 263, 263, 263, nil, 263, nil, nil, nil, 263, + 263, nil, nil, nil, 263, nil, 263, 263, 263, 263, + 263, 263, 263, nil, nil, nil, nil, nil, 263, 263, + 263, 263, 263, 263, 263, nil, nil, 263, nil, nil, + nil, nil, nil, nil, 263, nil, nil, 263, 263, 263, + 263, 263, 263, 263, 263, nil, 263, 263, 263, nil, + 263, 263, nil, 263, 263, 263, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 263, nil, nil, 263, nil, + nil, 263, 263, nil, nil, 263, nil, nil, nil, nil, + nil, 263, nil, nil, nil, nil, nil, nil, nil, 263, + nil, nil, nil, nil, 263, 263, 263, 263, 263, 263, + nil, nil, nil, 263, 263, nil, nil, nil, nil, nil, + nil, 263, nil, nil, 263, 263, 263, nil, 263, 263, + 264, 264, 264, nil, 264, nil, nil, nil, 264, 264, + nil, nil, nil, 264, nil, 264, 264, 264, 264, 264, + 264, 264, nil, nil, nil, nil, nil, 264, 264, 264, + 264, 264, 264, 264, nil, nil, 264, nil, nil, nil, + nil, nil, nil, 264, nil, nil, 264, 264, 264, 264, + 264, 264, 264, 264, nil, 264, 264, 264, nil, 264, + 264, nil, 264, 264, 264, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 264, nil, nil, 264, nil, nil, + 264, 264, nil, nil, 264, nil, nil, nil, nil, nil, + 264, nil, nil, nil, nil, nil, nil, nil, 264, nil, + nil, nil, nil, 264, 264, 264, 264, 264, 264, nil, + nil, nil, 264, 264, nil, nil, nil, nil, nil, nil, + 264, nil, nil, 264, 264, 264, nil, 264, 264, 265, + 265, 265, nil, 265, nil, nil, nil, 265, 265, nil, + nil, nil, 265, nil, 265, 265, 265, 265, 265, 265, + 265, nil, nil, nil, nil, nil, 265, 265, 265, 265, + 265, 265, 265, nil, nil, 265, nil, nil, nil, nil, + nil, nil, 265, nil, nil, 265, 265, 265, 265, 265, + 265, 265, 265, nil, 265, 265, 265, nil, 265, 265, + nil, 265, 265, 265, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 265, nil, nil, 265, nil, nil, 265, + 265, nil, nil, 265, nil, nil, nil, nil, nil, 265, + nil, nil, nil, nil, nil, nil, nil, 265, nil, nil, + nil, nil, 265, 265, 265, 265, 265, 265, nil, nil, + nil, 265, 265, nil, nil, nil, nil, nil, nil, 265, + nil, nil, 265, 265, 265, nil, 265, 265, 266, 266, + 266, nil, 266, nil, nil, nil, 266, 266, nil, nil, + nil, 266, nil, 266, 266, 266, 266, 266, 266, 266, + nil, nil, nil, nil, nil, 266, 266, 266, 266, 266, + 266, 266, nil, nil, 266, nil, nil, nil, nil, nil, + nil, 266, nil, nil, 266, 266, 266, 266, 266, 266, + 266, 266, nil, 266, 266, 266, nil, 266, 266, nil, + 266, 266, 266, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 266, nil, nil, 266, nil, nil, 266, 266, + nil, nil, 266, nil, nil, nil, nil, nil, 266, nil, + nil, nil, nil, nil, nil, nil, 266, nil, nil, nil, + nil, 266, 266, 266, 266, 266, 266, nil, nil, nil, + 266, 266, nil, nil, nil, nil, nil, nil, 266, nil, + nil, 266, 266, 266, nil, 266, 266, 267, 267, 267, + nil, 267, nil, nil, nil, 267, 267, nil, nil, nil, + 267, nil, 267, 267, 267, 267, 267, 267, 267, nil, + nil, nil, nil, nil, 267, 267, 267, 267, 267, 267, + 267, nil, nil, 267, nil, nil, nil, nil, nil, nil, + 267, nil, nil, 267, 267, 267, 267, 267, 267, 267, + 267, nil, 267, 267, 267, nil, 267, 267, nil, 267, + 267, 267, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 267, nil, nil, 267, nil, nil, 267, 267, nil, + nil, 267, nil, nil, nil, nil, nil, 267, nil, nil, + nil, nil, nil, nil, nil, 267, nil, nil, nil, nil, + 267, 267, 267, 267, 267, 267, nil, nil, nil, 267, + 267, nil, nil, nil, nil, nil, nil, 267, nil, nil, + 267, 267, 267, nil, 267, 267, 268, 268, 268, nil, + 268, nil, nil, nil, 268, 268, nil, nil, nil, 268, + nil, 268, 268, 268, 268, 268, 268, 268, nil, nil, + nil, nil, nil, 268, 268, 268, 268, 268, 268, 268, + nil, nil, 268, nil, nil, nil, nil, nil, nil, 268, + nil, nil, 268, 268, 268, 268, 268, 268, 268, 268, + nil, 268, 268, 268, nil, 268, 268, nil, 268, 268, + 268, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 268, nil, nil, 268, nil, nil, 268, 268, nil, nil, + 268, nil, nil, nil, nil, nil, 268, nil, nil, nil, + nil, nil, nil, nil, 268, nil, nil, nil, nil, 268, + 268, 268, 268, 268, 268, nil, nil, nil, 268, 268, + nil, nil, nil, nil, nil, nil, 268, nil, nil, 268, + 268, 268, nil, 268, 268, 269, 269, 269, nil, 269, + nil, nil, nil, 269, 269, nil, nil, nil, 269, nil, + 269, 269, 269, 269, 269, 269, 269, nil, nil, nil, + nil, nil, 269, 269, 269, 269, 269, 269, 269, nil, + nil, 269, nil, nil, nil, nil, nil, nil, 269, nil, + nil, 269, 269, 269, 269, 269, 269, 269, 269, nil, + 269, 269, 269, nil, 269, 269, nil, 269, 269, 269, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 269, + nil, nil, 269, nil, nil, 269, 269, nil, nil, 269, + nil, nil, nil, nil, nil, 269, nil, nil, nil, nil, + nil, nil, nil, 269, nil, nil, nil, nil, 269, 269, + 269, 269, 269, 269, nil, nil, nil, 269, 269, nil, + nil, nil, nil, nil, nil, 269, nil, nil, 269, 269, + 269, nil, 269, 269, 274, 274, 274, nil, 274, nil, + nil, nil, 274, 274, nil, nil, nil, 274, nil, 274, + 274, 274, 274, 274, 274, 274, nil, nil, nil, nil, + nil, 274, 274, 274, 274, 274, 274, 274, nil, nil, + 274, nil, nil, nil, nil, nil, nil, 274, nil, nil, + 274, 274, 274, 274, 274, 274, 274, 274, nil, 274, + 274, 274, nil, 274, 274, nil, 274, 274, 274, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 274, nil, + nil, 274, nil, nil, 274, 274, nil, nil, 274, nil, + nil, nil, nil, nil, 274, nil, nil, nil, nil, nil, + nil, nil, 274, nil, nil, nil, nil, 274, 274, 274, + 274, 274, 274, nil, nil, nil, 274, 274, nil, nil, + nil, nil, nil, nil, 274, nil, nil, 274, 274, 274, + nil, 274, 274, 282, 282, 282, nil, 282, nil, nil, + nil, 282, 282, nil, nil, nil, 282, nil, 282, 282, + 282, 282, 282, 282, 282, nil, nil, nil, nil, nil, + 282, 282, 282, 282, 282, 282, 282, nil, nil, 282, + nil, nil, nil, nil, nil, nil, 282, nil, nil, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, nil, 282, 282, nil, 282, 282, 282, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 282, nil, nil, + 282, nil, nil, 282, 282, nil, nil, 282, nil, 282, + nil, 282, nil, 282, nil, nil, nil, nil, nil, nil, + nil, 282, nil, nil, nil, nil, 282, 282, 282, 282, + 282, 282, nil, nil, nil, 282, 282, nil, nil, nil, + nil, nil, nil, 282, nil, 282, 282, 282, 282, nil, + 282, 282, 283, 283, 283, nil, 283, nil, nil, nil, + 283, 283, nil, nil, nil, 283, nil, 283, 283, 283, + 283, 283, 283, 283, nil, nil, nil, nil, nil, 283, + 283, 283, 283, 283, 283, 283, nil, nil, 283, nil, + nil, nil, nil, nil, nil, 283, nil, nil, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + nil, 283, 283, nil, 283, 283, 283, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 283, nil, nil, 283, + nil, nil, 283, 283, nil, nil, 283, nil, 283, nil, + 283, nil, 283, nil, nil, nil, nil, nil, nil, nil, + 283, nil, nil, nil, nil, 283, 283, 283, 283, 283, + 283, nil, nil, nil, 283, 283, nil, nil, nil, nil, + nil, nil, 283, nil, 283, 283, 283, 283, nil, 283, + 283, 292, 292, 292, nil, 292, nil, nil, nil, 292, + 292, nil, nil, nil, 292, nil, 292, 292, 292, 292, + 292, 292, 292, nil, nil, nil, nil, nil, 292, 292, + 292, 292, 292, 292, 292, nil, nil, 292, nil, nil, + nil, nil, nil, nil, 292, nil, nil, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, nil, + 292, 292, nil, 292, 292, 292, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 292, nil, nil, 292, nil, + nil, 292, 292, nil, nil, 292, nil, 292, nil, 292, + nil, 292, nil, nil, nil, nil, nil, nil, nil, 292, + nil, nil, nil, nil, 292, 292, 292, 292, 292, 292, + nil, nil, nil, 292, 292, 292, nil, nil, nil, nil, + nil, 292, nil, 292, 292, 292, 292, nil, 292, 292, + 299, 299, 299, nil, 299, nil, nil, nil, 299, 299, + nil, nil, nil, 299, nil, 299, 299, 299, 299, 299, + 299, 299, nil, nil, nil, nil, nil, 299, 299, 299, + 299, 299, 299, 299, nil, nil, 299, nil, nil, nil, + nil, nil, nil, 299, nil, nil, 299, 299, 299, 299, + 299, 299, 299, 299, nil, 299, 299, 299, nil, 299, + 299, nil, 299, 299, 299, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 299, nil, nil, 299, nil, nil, + 299, 299, nil, nil, 299, nil, nil, nil, nil, nil, + 299, nil, nil, nil, nil, nil, nil, nil, 299, nil, + nil, nil, nil, 299, 299, 299, 299, 299, 299, nil, + nil, nil, 299, 299, nil, nil, nil, nil, nil, nil, + 299, nil, nil, 299, 299, 299, nil, 299, 299, 301, + 301, 301, nil, 301, nil, nil, nil, 301, 301, nil, + nil, nil, 301, nil, 301, 301, 301, 301, 301, 301, + 301, nil, nil, nil, nil, nil, 301, 301, 301, 301, + 301, 301, 301, nil, nil, 301, nil, nil, nil, nil, + nil, nil, 301, nil, nil, 301, 301, 301, 301, 301, + 301, 301, 301, nil, 301, 301, 301, nil, 301, 301, + nil, 301, 301, 301, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 301, nil, nil, 301, nil, nil, 301, + 301, nil, nil, 301, nil, nil, nil, nil, nil, 301, + nil, nil, nil, nil, nil, nil, nil, 301, nil, nil, + nil, nil, 301, 301, 301, 301, 301, 301, nil, nil, + nil, 301, 301, nil, nil, nil, nil, nil, nil, 301, + nil, nil, 301, 301, 301, nil, 301, 301, 304, 304, + 304, nil, 304, nil, nil, nil, 304, 304, nil, nil, + nil, 304, nil, 304, 304, 304, 304, 304, 304, 304, + nil, nil, nil, nil, nil, 304, 304, 304, 304, 304, + 304, 304, nil, nil, 304, nil, nil, nil, nil, nil, + nil, 304, nil, nil, 304, 304, 304, 304, 304, 304, + 304, 304, nil, 304, 304, 304, nil, 304, 304, nil, + 304, 304, 304, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 304, nil, nil, 304, nil, nil, 304, 304, + nil, nil, 304, nil, nil, nil, nil, nil, 304, nil, + nil, nil, nil, nil, nil, nil, 304, nil, nil, nil, + nil, 304, 304, 304, 304, 304, 304, nil, nil, nil, + 304, 304, nil, nil, nil, nil, nil, nil, 304, nil, + nil, 304, 304, 304, nil, 304, 304, 305, 305, 305, + nil, 305, nil, nil, nil, 305, 305, nil, nil, nil, + 305, nil, 305, 305, 305, 305, 305, 305, 305, nil, + nil, nil, nil, nil, 305, 305, 305, 305, 305, 305, + 305, nil, nil, 305, nil, nil, nil, nil, nil, nil, + 305, nil, nil, 305, 305, 305, 305, 305, 305, 305, + 305, nil, 305, 305, 305, nil, 305, 305, nil, 305, + 305, 305, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 305, nil, nil, 305, nil, nil, 305, 305, nil, + nil, 305, nil, nil, nil, nil, nil, 305, nil, nil, + nil, nil, nil, nil, nil, 305, nil, nil, nil, nil, + 305, 305, 305, 305, 305, 305, nil, nil, nil, 305, + 305, nil, nil, nil, nil, nil, nil, 305, nil, nil, + 305, 305, 305, nil, 305, 305, 311, 311, 311, 311, + 311, nil, nil, nil, 311, 311, nil, nil, nil, 311, + nil, 311, 311, 311, 311, 311, 311, 311, nil, nil, + nil, nil, nil, 311, 311, 311, 311, 311, 311, 311, + nil, nil, 311, nil, nil, nil, nil, nil, 311, 311, + nil, 311, 311, 311, 311, 311, 311, 311, 311, 311, + nil, 311, 311, 311, nil, 311, 311, nil, 311, 311, + 311, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 311, nil, nil, 311, nil, nil, 311, 311, nil, nil, + 311, nil, 311, nil, nil, nil, 311, nil, nil, nil, + nil, nil, nil, nil, 311, nil, nil, nil, nil, 311, + 311, 311, 311, 311, 311, nil, nil, nil, 311, 311, + nil, nil, nil, nil, nil, nil, 311, nil, nil, 311, + 311, 311, nil, 311, 311, 319, 319, 319, nil, 319, + nil, nil, nil, 319, 319, nil, nil, nil, 319, nil, + 319, 319, 319, 319, 319, 319, 319, nil, nil, nil, + nil, nil, 319, 319, 319, 319, 319, 319, 319, nil, + nil, 319, nil, nil, nil, nil, nil, nil, 319, nil, + nil, 319, 319, 319, 319, 319, 319, 319, 319, nil, + 319, 319, 319, nil, 319, 319, nil, nil, nil, 319, + nil, nil, nil, nil, nil, 1061, nil, 1061, 1061, 1061, + 1061, 1061, nil, nil, nil, nil, nil, nil, nil, 319, + nil, 1061, 319, nil, nil, 319, 319, nil, nil, 319, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1061, nil, nil, nil, nil, 319, 319, + 319, 319, 319, 319, 1061, 1061, nil, 319, 319, nil, + nil, nil, 319, nil, nil, 319, nil, nil, 319, 319, + 319, nil, 319, 319, 336, 336, 336, nil, 336, nil, + nil, nil, 336, 336, nil, nil, nil, 336, 1061, 336, + 336, 336, 336, 336, 336, 336, nil, nil, nil, nil, + nil, 336, 336, 336, 336, 336, 336, 336, nil, nil, + 336, nil, nil, nil, nil, nil, nil, 336, nil, nil, + 336, 336, 336, 336, 336, 336, 336, 336, nil, 336, + 336, 336, nil, 336, 336, nil, nil, nil, 336, nil, + nil, nil, nil, nil, 1063, nil, 1063, 1063, 1063, 1063, + 1063, nil, nil, nil, nil, nil, nil, nil, 336, nil, + 1063, 336, nil, nil, 336, 336, nil, nil, 336, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1063, nil, nil, nil, nil, 336, 336, 336, + 336, 336, 336, 1063, 1063, nil, 336, 336, nil, nil, + nil, nil, nil, nil, 336, nil, nil, 336, 336, 336, + nil, 336, 336, 343, 343, 343, nil, 343, nil, nil, + nil, 343, 343, nil, nil, nil, 343, 1063, 343, 343, + 343, 343, 343, 343, 343, nil, nil, nil, nil, nil, + 343, 343, 343, 343, 343, 343, 343, nil, nil, 343, + nil, nil, nil, nil, nil, nil, 343, nil, nil, 343, + 343, 343, 343, 343, 343, 343, 343, nil, 343, 343, + 343, nil, 343, 343, nil, 343, 343, 343, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 343, nil, nil, + 343, nil, nil, 343, 343, nil, nil, 343, nil, nil, + nil, nil, nil, 343, nil, nil, nil, nil, nil, nil, + nil, 343, nil, nil, nil, nil, 343, 343, 343, 343, + 343, 343, nil, nil, nil, 343, 343, nil, nil, nil, + nil, nil, nil, 343, nil, nil, 343, 343, 343, nil, + 343, 343, 345, 345, 345, nil, 345, nil, nil, nil, + 345, 345, nil, nil, nil, 345, nil, 345, 345, 345, + 345, 345, 345, 345, nil, nil, nil, nil, nil, 345, + 345, 345, 345, 345, 345, 345, nil, nil, 345, nil, + nil, nil, nil, nil, nil, 345, nil, nil, 345, 345, + 345, 345, 345, 345, 345, 345, nil, 345, 345, 345, + nil, 345, 345, nil, 345, 345, 345, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 345, nil, nil, 345, + 345, nil, 345, 345, nil, nil, 345, nil, nil, nil, + nil, nil, 345, nil, nil, nil, nil, nil, nil, nil, + 345, nil, nil, nil, nil, 345, 345, 345, 345, 345, + 345, nil, nil, nil, 345, 345, nil, nil, nil, nil, + nil, nil, 345, nil, nil, 345, 345, 345, nil, 345, + 345, 349, 349, 349, nil, 349, nil, nil, nil, 349, + 349, nil, nil, nil, 349, nil, 349, 349, 349, 349, + 349, 349, 349, nil, nil, nil, nil, nil, 349, 349, + 349, 349, 349, 349, 349, nil, nil, 349, nil, nil, + nil, nil, nil, nil, 349, nil, nil, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, 349, nil, + 349, 349, nil, 349, 349, 349, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 349, nil, nil, 349, nil, + nil, 349, 349, nil, nil, 349, nil, 349, nil, nil, + nil, 349, nil, nil, nil, nil, nil, nil, nil, 349, + nil, nil, nil, nil, 349, 349, 349, 349, 349, 349, + nil, nil, nil, 349, 349, nil, nil, nil, nil, nil, + nil, 349, nil, 349, 349, 349, 349, nil, 349, 349, + 350, 350, 350, nil, 350, nil, nil, nil, 350, 350, + nil, nil, nil, 350, nil, 350, 350, 350, 350, 350, + 350, 350, nil, nil, nil, nil, nil, 350, 350, 350, + 350, 350, 350, 350, nil, nil, 350, nil, nil, nil, + nil, nil, nil, 350, nil, nil, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, nil, 350, + 350, nil, 350, 350, 350, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 350, nil, nil, 350, nil, nil, + 350, 350, nil, nil, 350, nil, nil, nil, nil, nil, + 350, nil, nil, nil, nil, nil, nil, nil, 350, nil, + nil, nil, nil, 350, 350, 350, 350, 350, 350, nil, + nil, nil, 350, 350, nil, nil, nil, nil, nil, nil, + 350, nil, 350, 350, 350, 350, nil, 350, 350, 355, + 355, 355, nil, 355, nil, nil, nil, 355, 355, nil, + nil, nil, 355, nil, 355, 355, 355, 355, 355, 355, + 355, nil, nil, nil, nil, nil, 355, 355, 355, 355, + 355, 355, 355, nil, nil, 355, nil, nil, nil, nil, + nil, nil, 355, nil, nil, 355, 355, 355, 355, 355, + 355, 355, 355, nil, 355, 355, 355, nil, 355, 355, + nil, 355, 355, 355, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 355, nil, nil, 355, nil, nil, 355, + 355, nil, nil, 355, nil, nil, nil, nil, nil, 355, + nil, nil, nil, nil, nil, nil, nil, 355, nil, nil, + nil, nil, 355, 355, 355, 355, 355, 355, nil, nil, + nil, 355, 355, nil, nil, nil, nil, nil, nil, 355, + nil, nil, 355, 355, 355, nil, 355, 355, 376, 376, + 376, nil, 376, nil, nil, nil, 376, 376, nil, nil, + nil, 376, nil, 376, 376, 376, 376, 376, 376, 376, + nil, nil, nil, nil, nil, 376, 376, 376, 376, 376, + 376, 376, nil, nil, 376, nil, nil, nil, nil, nil, + nil, 376, nil, nil, 376, 376, 376, 376, 376, 376, + 376, 376, nil, 376, 376, 376, nil, 376, 376, nil, + 376, 376, 376, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 376, nil, nil, 376, nil, nil, 376, 376, + nil, nil, 376, nil, nil, nil, nil, nil, 376, nil, + nil, nil, nil, nil, nil, nil, 376, nil, nil, nil, + nil, 376, 376, 376, 376, 376, 376, nil, nil, nil, + 376, 376, nil, nil, nil, nil, nil, nil, 376, nil, + nil, 376, 376, 376, nil, 376, 376, 437, 437, 437, + nil, 437, nil, nil, nil, 437, 437, nil, nil, nil, + 437, nil, 437, 437, 437, 437, 437, 437, 437, nil, + nil, nil, nil, nil, 437, 437, 437, 437, 437, 437, + 437, nil, nil, 437, nil, nil, nil, nil, nil, nil, + 437, nil, nil, 437, 437, 437, 437, 437, 437, 437, + 437, nil, 437, 437, 437, nil, 437, 437, nil, 437, + 437, 437, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 437, nil, nil, 437, nil, nil, 437, 437, nil, + nil, 437, nil, nil, nil, nil, nil, 437, nil, nil, + nil, nil, nil, nil, nil, 437, nil, nil, nil, nil, + 437, 437, 437, 437, 437, 437, nil, nil, nil, 437, + 437, nil, nil, nil, nil, nil, nil, 437, nil, nil, + 437, 437, 437, nil, 437, 437, 481, 481, 481, nil, + 481, nil, nil, nil, 481, 481, nil, nil, nil, 481, + nil, 481, 481, 481, 481, 481, 481, 481, nil, nil, + nil, nil, nil, 481, 481, 481, 481, 481, 481, 481, + nil, nil, 481, nil, nil, nil, nil, nil, nil, 481, + nil, nil, 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, nil, 481, 481, nil, 481, 481, + 481, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 481, nil, nil, 481, nil, nil, 481, 481, nil, nil, + 481, nil, 481, nil, 481, nil, 481, nil, nil, nil, + nil, nil, nil, nil, 481, nil, nil, nil, nil, 481, + 481, 481, 481, 481, 481, nil, nil, nil, 481, 481, + nil, nil, nil, nil, nil, nil, 481, nil, 481, 481, + 481, 481, nil, 481, 481, 483, 483, 483, nil, 483, + nil, nil, nil, 483, 483, nil, nil, nil, 483, nil, + 483, 483, 483, 483, 483, 483, 483, nil, nil, nil, + nil, nil, 483, 483, 483, 483, 483, 483, 483, nil, + nil, 483, nil, nil, nil, nil, nil, nil, 483, nil, + nil, 483, 483, 483, 483, 483, 483, 483, 483, nil, + 483, 483, 483, nil, 483, 483, nil, 483, 483, 483, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 483, + nil, nil, 483, nil, nil, 483, 483, nil, nil, 483, + nil, nil, nil, nil, nil, 483, nil, nil, nil, nil, + nil, nil, nil, 483, nil, nil, nil, nil, 483, 483, + 483, 483, 483, 483, nil, nil, nil, 483, 483, nil, + nil, nil, nil, nil, nil, 483, nil, nil, 483, 483, + 483, nil, 483, 483, 484, 484, 484, nil, 484, nil, + nil, nil, 484, 484, nil, nil, nil, 484, nil, 484, + 484, 484, 484, 484, 484, 484, nil, nil, nil, nil, + nil, 484, 484, 484, 484, 484, 484, 484, nil, nil, + 484, nil, nil, nil, nil, nil, nil, 484, nil, nil, + 484, 484, 484, 484, 484, 484, 484, 484, nil, 484, + 484, 484, nil, 484, 484, nil, 484, 484, 484, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 484, nil, + nil, 484, nil, nil, 484, 484, nil, nil, 484, nil, + nil, nil, nil, nil, 484, nil, nil, nil, nil, nil, + nil, nil, 484, nil, nil, nil, nil, 484, 484, 484, + 484, 484, 484, nil, nil, nil, 484, 484, nil, nil, + nil, nil, nil, nil, 484, nil, nil, 484, 484, 484, + nil, 484, 484, 485, 485, 485, nil, 485, nil, nil, + nil, 485, 485, nil, nil, nil, 485, nil, 485, 485, + 485, 485, 485, 485, 485, nil, nil, nil, nil, nil, + 485, 485, 485, 485, 485, 485, 485, nil, nil, 485, + nil, nil, nil, nil, nil, nil, 485, nil, nil, 485, + 485, 485, 485, 485, 485, 485, 485, nil, 485, 485, + 485, nil, 485, 485, nil, 485, 485, 485, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 485, nil, nil, + 485, nil, nil, 485, 485, nil, nil, 485, nil, nil, + nil, nil, nil, 485, nil, nil, nil, nil, nil, nil, + nil, 485, nil, nil, nil, nil, 485, 485, 485, 485, + 485, 485, nil, nil, nil, 485, 485, nil, nil, nil, + nil, nil, nil, 485, nil, nil, 485, 485, 485, nil, + 485, 485, 523, 523, 523, nil, 523, nil, nil, nil, + 523, 523, nil, nil, nil, 523, nil, 523, 523, 523, + 523, 523, 523, 523, nil, nil, nil, nil, nil, 523, + 523, 523, 523, 523, 523, 523, nil, nil, 523, nil, + nil, nil, nil, nil, nil, 523, nil, nil, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, + nil, 523, 523, nil, 523, 523, 523, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 523, nil, nil, 523, + nil, nil, 523, 523, nil, nil, 523, nil, 523, nil, + 523, nil, 523, nil, nil, nil, nil, nil, nil, nil, + 523, nil, nil, nil, nil, 523, 523, 523, 523, 523, + 523, nil, nil, nil, 523, 523, nil, nil, nil, nil, + nil, nil, 523, nil, 523, 523, 523, 523, nil, 523, + 523, 526, 526, 526, nil, 526, nil, nil, nil, 526, + 526, nil, nil, nil, 526, nil, 526, 526, 526, 526, + 526, 526, 526, nil, nil, nil, nil, nil, 526, 526, + 526, 526, 526, 526, 526, nil, nil, 526, nil, nil, + nil, nil, nil, nil, 526, nil, nil, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, nil, + 526, 526, nil, 526, 526, 526, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 526, nil, nil, 526, nil, + nil, 526, 526, nil, nil, 526, nil, nil, nil, 526, + nil, 526, nil, nil, nil, nil, nil, nil, nil, 526, + nil, nil, nil, nil, 526, 526, 526, 526, 526, 526, + nil, nil, nil, 526, 526, nil, nil, nil, nil, nil, + nil, 526, nil, 526, 526, 526, 526, nil, 526, 526, + 528, 528, 528, nil, 528, nil, nil, nil, 528, 528, + nil, nil, nil, 528, nil, 528, 528, 528, 528, 528, + 528, 528, nil, nil, nil, nil, nil, 528, 528, 528, + 528, 528, 528, 528, nil, nil, 528, nil, nil, nil, + nil, nil, nil, 528, nil, nil, 528, 528, 528, 528, + 528, 528, 528, 528, nil, 528, 528, 528, nil, 528, + 528, nil, 528, 528, 528, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 528, nil, nil, 528, nil, nil, + 528, 528, nil, nil, 528, nil, nil, nil, nil, nil, + 528, nil, nil, nil, nil, nil, nil, nil, 528, nil, + nil, nil, nil, 528, 528, 528, 528, 528, 528, nil, + nil, nil, 528, 528, nil, nil, nil, nil, nil, nil, + 528, nil, nil, 528, 528, 528, nil, 528, 528, 534, + 534, 534, 534, 534, nil, nil, nil, 534, 534, nil, + nil, nil, 534, nil, 534, 534, 534, 534, 534, 534, + 534, nil, nil, nil, nil, nil, 534, 534, 534, 534, + 534, 534, 534, nil, nil, 534, nil, nil, nil, nil, + nil, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 534, 534, nil, 534, 534, 534, nil, 534, 534, + nil, 534, 534, 534, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 534, nil, nil, 534, nil, nil, 534, + 534, nil, nil, 534, nil, 534, nil, nil, nil, 534, + nil, nil, nil, nil, nil, nil, nil, 534, nil, nil, + nil, nil, 534, 534, 534, 534, 534, 534, nil, nil, + nil, 534, 534, nil, nil, nil, nil, nil, 534, 534, + nil, nil, 534, 534, 534, nil, 534, 534, 542, 542, + 542, nil, 542, nil, nil, nil, 542, 542, nil, nil, + nil, 542, nil, 542, 542, 542, 542, 542, 542, 542, + nil, nil, nil, nil, nil, 542, 542, 542, 542, 542, + 542, 542, nil, nil, 542, nil, nil, nil, nil, nil, + nil, 542, nil, nil, 542, 542, 542, 542, 542, 542, + 542, 542, nil, 542, 542, 542, nil, 542, 542, nil, + nil, nil, 542, nil, nil, nil, nil, nil, 1084, nil, + 1084, 1084, 1084, 1084, 1084, nil, nil, nil, nil, nil, + nil, nil, 542, nil, 1084, 542, nil, nil, 542, 542, + nil, nil, 542, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1084, nil, nil, nil, + nil, 542, 542, 542, 542, 542, 542, 1084, 1084, nil, + 542, 542, nil, nil, nil, nil, nil, nil, 542, nil, + nil, 542, 542, 542, nil, 542, 542, 544, 544, 544, + nil, 544, nil, nil, nil, 544, 544, nil, nil, nil, + 544, 1084, 544, 544, 544, 544, 544, 544, 544, nil, + nil, nil, nil, nil, 544, 544, 544, 544, 544, 544, + 544, nil, nil, 544, nil, nil, nil, nil, nil, nil, + 544, nil, nil, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, nil, 544, 544, nil, 544, + 544, 544, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 544, nil, nil, 544, nil, nil, 544, 544, nil, + nil, 544, nil, 544, nil, 544, nil, 544, nil, nil, + nil, nil, nil, nil, nil, 544, nil, nil, nil, nil, + 544, 544, 544, 544, 544, 544, nil, nil, nil, 544, + 544, nil, nil, nil, nil, nil, nil, 544, nil, 544, + 544, 544, 544, nil, 544, 544, 550, 550, 550, nil, + 550, nil, nil, nil, 550, 550, nil, nil, nil, 550, + nil, 550, 550, 550, 550, 550, 550, 550, nil, nil, + nil, nil, nil, 550, 550, 550, 550, 550, 550, 550, + nil, nil, 550, nil, nil, nil, nil, nil, nil, 550, + nil, nil, 550, 550, 550, 550, 550, 550, 550, 550, + nil, 550, 550, 550, nil, 550, 550, nil, nil, nil, + 550, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 550, nil, nil, 550, nil, nil, 550, 550, nil, nil, + 550, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 550, + 550, 550, 550, 550, 550, nil, nil, nil, 550, 550, + nil, nil, nil, nil, nil, nil, 550, nil, nil, 550, + 550, 550, nil, 550, 550, 553, 553, 553, nil, 553, + nil, nil, nil, 553, 553, nil, nil, nil, 553, nil, + 553, 553, 553, 553, 553, 553, 553, nil, nil, nil, + nil, nil, 553, 553, 553, 553, 553, 553, 553, nil, + nil, 553, nil, nil, nil, nil, nil, nil, 553, nil, + nil, 553, 553, 553, 553, 553, 553, 553, 553, nil, + 553, 553, 553, nil, 553, 553, nil, 553, 553, 553, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 553, + nil, nil, 553, nil, nil, 553, 553, nil, nil, 553, + nil, nil, nil, nil, nil, 553, nil, nil, nil, nil, + nil, nil, nil, 553, nil, nil, nil, nil, 553, 553, + 553, 553, 553, 553, nil, nil, nil, 553, 553, nil, + nil, nil, nil, nil, nil, 553, nil, nil, 553, 553, + 553, nil, 553, 553, 554, 554, 554, nil, 554, nil, + nil, nil, 554, 554, nil, nil, nil, 554, nil, 554, + 554, 554, 554, 554, 554, 554, nil, nil, nil, nil, + nil, 554, 554, 554, 554, 554, 554, 554, nil, nil, + 554, nil, nil, nil, nil, nil, nil, 554, nil, nil, + 554, 554, 554, 554, 554, 554, 554, 554, nil, 554, + 554, 554, nil, 554, 554, nil, 554, 554, 554, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 554, nil, + nil, 554, nil, nil, 554, 554, nil, nil, 554, nil, + nil, nil, nil, nil, 554, nil, nil, nil, nil, nil, + nil, nil, 554, nil, nil, nil, nil, 554, 554, 554, + 554, 554, 554, nil, nil, nil, 554, 554, nil, nil, + nil, nil, nil, nil, 554, nil, nil, 554, 554, 554, + nil, 554, 554, 559, 559, 559, nil, 559, nil, nil, + nil, 559, 559, nil, nil, nil, 559, nil, 559, 559, + 559, 559, 559, 559, 559, nil, nil, nil, nil, nil, + 559, 559, 559, 559, 559, 559, 559, nil, nil, 559, + nil, nil, nil, nil, nil, nil, 559, nil, nil, 559, + 559, 559, 559, 559, 559, 559, 559, nil, 559, 559, + 559, nil, 559, 559, nil, 559, 559, 559, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 559, nil, nil, + 559, nil, nil, 559, 559, nil, nil, 559, nil, nil, + nil, nil, nil, 559, nil, nil, nil, nil, nil, nil, + nil, 559, nil, nil, nil, nil, 559, 559, 559, 559, + 559, 559, nil, nil, nil, 559, 559, nil, nil, nil, + nil, nil, nil, 559, nil, nil, 559, 559, 559, nil, + 559, 559, 583, 583, 583, nil, 583, nil, nil, nil, + 583, 583, nil, nil, nil, 583, nil, 583, 583, 583, + 583, 583, 583, 583, nil, nil, nil, nil, nil, 583, + 583, 583, 583, 583, 583, 583, nil, nil, 583, nil, + nil, nil, nil, nil, nil, 583, nil, nil, 583, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, + nil, 583, 583, nil, 583, 583, 583, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 583, nil, nil, 583, + nil, nil, 583, 583, nil, nil, 583, nil, 583, nil, + 583, nil, 583, nil, nil, nil, nil, nil, nil, nil, + 583, nil, nil, nil, nil, 583, 583, 583, 583, 583, + 583, nil, nil, nil, 583, 583, nil, nil, nil, nil, + nil, nil, 583, nil, 583, 583, 583, 583, nil, 583, + 583, 593, 593, 593, nil, 593, nil, nil, nil, 593, + 593, nil, nil, nil, 593, nil, 593, 593, 593, 593, + 593, 593, 593, nil, nil, nil, nil, nil, 593, 593, + 593, 593, 593, 593, 593, nil, nil, 593, nil, nil, + nil, nil, nil, nil, 593, nil, nil, 593, 593, 593, + 593, 593, 593, 593, 593, 593, 593, 593, 593, nil, + 593, 593, nil, 593, 593, 593, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 593, nil, nil, 593, nil, + nil, 593, 593, nil, nil, 593, nil, 593, nil, 593, + nil, 593, nil, nil, nil, nil, nil, nil, nil, 593, + nil, nil, nil, nil, 593, 593, 593, 593, 593, 593, + nil, nil, nil, 593, 593, nil, nil, nil, nil, nil, + nil, 593, nil, 593, 593, 593, 593, nil, 593, 593, + 603, 603, 603, nil, 603, nil, nil, nil, 603, 603, + nil, nil, nil, 603, nil, 603, 603, 603, 603, 603, + 603, 603, nil, nil, nil, nil, nil, 603, 603, 603, + 603, 603, 603, 603, nil, nil, 603, nil, nil, nil, + nil, nil, nil, 603, nil, nil, 603, 603, 603, 603, + 603, 603, 603, 603, nil, 603, 603, 603, nil, 603, + 603, nil, 603, 603, 603, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 603, nil, nil, 603, nil, nil, + 603, 603, nil, nil, 603, nil, nil, nil, nil, nil, + 603, nil, nil, nil, nil, nil, nil, nil, 603, nil, + nil, nil, nil, 603, 603, 603, 603, 603, 603, nil, + nil, nil, 603, 603, nil, nil, nil, nil, nil, nil, + 603, nil, nil, 603, 603, 603, nil, 603, 603, 625, + 625, 625, nil, 625, nil, nil, nil, 625, 625, nil, + nil, nil, 625, nil, 625, 625, 625, 625, 625, 625, + 625, nil, nil, nil, nil, nil, 625, 625, 625, 625, + 625, 625, 625, nil, nil, 625, nil, nil, nil, nil, + nil, nil, 625, nil, nil, 625, 625, 625, 625, 625, + 625, 625, 625, nil, 625, 625, 625, nil, 625, 625, + nil, 625, 625, 625, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 625, nil, nil, 625, nil, nil, 625, + 625, nil, nil, 625, nil, nil, nil, nil, nil, 625, + nil, nil, nil, nil, nil, nil, nil, 625, nil, nil, + nil, nil, 625, 625, 625, 625, 625, 625, nil, nil, + nil, 625, 625, nil, nil, nil, nil, nil, nil, 625, + nil, nil, 625, 625, 625, nil, 625, 625, 665, 665, + 665, nil, 665, nil, nil, nil, 665, 665, nil, nil, + nil, 665, nil, 665, 665, 665, 665, 665, 665, 665, + nil, nil, nil, nil, nil, 665, 665, 665, 665, 665, + 665, 665, nil, nil, 665, nil, nil, nil, nil, nil, + nil, 665, nil, nil, 665, 665, 665, 665, 665, 665, + 665, 665, nil, 665, 665, 665, nil, 665, 665, nil, + 665, 665, 665, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 665, nil, nil, 665, nil, nil, 665, 665, + nil, nil, 665, nil, 665, nil, nil, nil, 665, nil, + nil, nil, nil, nil, nil, nil, 665, nil, nil, nil, + nil, 665, 665, 665, 665, 665, 665, nil, nil, nil, + 665, 665, nil, nil, nil, nil, nil, nil, 665, nil, + nil, 665, 665, 665, nil, 665, 665, 666, 666, 666, + nil, 666, nil, nil, nil, 666, 666, nil, nil, nil, + 666, nil, 666, 666, 666, 666, 666, 666, 666, nil, + nil, nil, nil, nil, 666, 666, 666, 666, 666, 666, + 666, nil, nil, 666, nil, nil, nil, nil, nil, nil, + 666, nil, nil, 666, 666, 666, 666, 666, 666, 666, + 666, nil, 666, 666, 666, nil, 666, 666, nil, 666, + 666, 666, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 666, nil, nil, 666, nil, nil, 666, 666, nil, + nil, 666, nil, nil, nil, nil, nil, 666, nil, nil, + nil, nil, nil, nil, nil, 666, nil, nil, nil, nil, + 666, 666, 666, 666, 666, 666, nil, nil, nil, 666, + 666, nil, nil, nil, nil, nil, nil, 666, nil, nil, + 666, 666, 666, nil, 666, 666, 667, 667, 667, nil, + 667, nil, nil, nil, 667, 667, nil, nil, nil, 667, + nil, 667, 667, 667, 667, 667, 667, 667, nil, nil, + nil, nil, nil, 667, 667, 667, 667, 667, 667, 667, + nil, nil, 667, nil, nil, nil, nil, nil, nil, 667, + nil, nil, 667, 667, 667, 667, 667, 667, 667, 667, + 667, 667, 667, 667, nil, 667, 667, nil, 667, 667, + 667, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 667, nil, nil, 667, nil, nil, 667, 667, nil, nil, + 667, nil, 667, nil, 667, nil, 667, nil, nil, nil, + nil, nil, nil, nil, 667, nil, nil, nil, nil, 667, + 667, 667, 667, 667, 667, nil, nil, nil, 667, 667, + nil, nil, nil, nil, nil, nil, 667, nil, 667, 667, + 667, 667, nil, 667, 667, 670, 670, 670, 670, 670, + nil, nil, nil, 670, 670, nil, nil, nil, 670, nil, + 670, 670, 670, 670, 670, 670, 670, nil, nil, nil, + nil, nil, 670, 670, 670, 670, 670, 670, 670, nil, + nil, 670, nil, nil, nil, nil, nil, 670, 670, nil, + 670, 670, 670, 670, 670, 670, 670, 670, 670, nil, + 670, 670, 670, nil, 670, 670, nil, 670, 670, 670, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 670, + nil, nil, 670, nil, nil, 670, 670, nil, nil, 670, + nil, 670, nil, nil, nil, 670, nil, nil, nil, nil, + nil, nil, nil, 670, nil, nil, nil, nil, 670, 670, + 670, 670, 670, 670, nil, nil, nil, 670, 670, nil, + nil, nil, nil, nil, nil, 670, nil, nil, 670, 670, + 670, nil, 670, 670, 671, 671, 671, nil, 671, nil, + nil, nil, 671, 671, nil, nil, nil, 671, nil, 671, + 671, 671, 671, 671, 671, 671, nil, nil, nil, nil, + nil, 671, 671, 671, 671, 671, 671, 671, nil, nil, + 671, nil, nil, nil, nil, nil, nil, 671, nil, nil, + 671, 671, 671, 671, 671, 671, 671, 671, nil, 671, + 671, 671, nil, 671, 671, nil, 671, 671, 671, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 671, nil, + nil, 671, nil, nil, 671, 671, nil, nil, 671, nil, + nil, nil, nil, nil, 671, nil, nil, nil, nil, nil, + nil, nil, 671, nil, nil, nil, nil, 671, 671, 671, + 671, 671, 671, nil, nil, nil, 671, 671, nil, nil, + nil, nil, nil, nil, 671, nil, nil, 671, 671, 671, + nil, 671, 671, 674, 674, 674, nil, 674, nil, nil, + nil, 674, 674, nil, nil, nil, 674, nil, 674, 674, + 674, 674, 674, 674, 674, nil, nil, nil, nil, nil, + 674, 674, 674, 674, 674, 674, 674, nil, nil, 674, + nil, nil, nil, nil, nil, nil, 674, nil, nil, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, nil, 674, 674, nil, 674, 674, 674, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 674, nil, nil, + 674, nil, nil, 674, 674, nil, nil, 674, nil, 674, + nil, 674, nil, 674, nil, nil, nil, nil, nil, nil, + nil, 674, nil, nil, nil, nil, 674, 674, 674, 674, + 674, 674, nil, nil, nil, 674, 674, nil, nil, nil, + nil, nil, nil, 674, nil, 674, 674, 674, 674, nil, + 674, 674, 675, 675, 675, nil, 675, nil, nil, nil, + 675, 675, nil, nil, nil, 675, nil, 675, 675, 675, + 675, 675, 675, 675, nil, nil, nil, nil, nil, 675, + 675, 675, 675, 675, 675, 675, nil, nil, 675, nil, + nil, nil, nil, nil, nil, 675, nil, nil, 675, 675, + 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, + nil, 675, 675, nil, 675, 675, 675, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 675, nil, nil, 675, + nil, nil, 675, 675, nil, nil, 675, nil, nil, nil, + 675, nil, 675, nil, nil, nil, nil, nil, nil, nil, + 675, nil, nil, nil, nil, 675, 675, 675, 675, 675, + 675, nil, nil, nil, 675, 675, nil, nil, nil, nil, + nil, nil, 675, nil, 675, 675, 675, 675, nil, 675, + 675, 676, 676, 676, nil, 676, nil, nil, nil, 676, + 676, nil, nil, nil, 676, nil, 676, 676, 676, 676, + 676, 676, 676, nil, nil, nil, nil, nil, 676, 676, + 676, 676, 676, 676, 676, nil, nil, 676, nil, nil, + nil, nil, nil, nil, 676, nil, nil, 676, 676, 676, + 676, 676, 676, 676, 676, nil, 676, 676, 676, nil, + 676, 676, nil, 676, 676, 676, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 676, nil, nil, 676, nil, + nil, 676, 676, nil, nil, 676, nil, nil, nil, nil, + nil, 676, nil, nil, nil, nil, nil, nil, nil, 676, + nil, nil, nil, nil, 676, 676, 676, 676, 676, 676, + nil, nil, nil, 676, 676, nil, nil, nil, nil, nil, + nil, 676, nil, nil, 676, 676, 676, nil, 676, 676, + 677, 677, 677, nil, 677, nil, nil, nil, 677, 677, + nil, nil, nil, 677, nil, 677, 677, 677, 677, 677, + 677, 677, nil, nil, nil, nil, nil, 677, 677, 677, + 677, 677, 677, 677, nil, nil, 677, nil, nil, nil, + nil, nil, nil, 677, nil, nil, 677, 677, 677, 677, + 677, 677, 677, 677, nil, 677, 677, 677, nil, 677, + 677, nil, 677, 677, 677, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 677, nil, nil, 677, nil, nil, + 677, 677, nil, nil, 677, nil, nil, nil, nil, nil, + 677, nil, nil, nil, nil, nil, nil, nil, 677, nil, + nil, nil, nil, 677, 677, 677, 677, 677, 677, nil, + nil, nil, 677, 677, nil, nil, nil, nil, nil, nil, + 677, nil, nil, 677, 677, 677, nil, 677, 677, 682, + 682, 682, nil, 682, nil, nil, nil, 682, 682, nil, + nil, nil, 682, nil, 682, 682, 682, 682, 682, 682, + 682, nil, nil, nil, nil, nil, 682, 682, 682, 682, + 682, 682, 682, nil, nil, 682, nil, nil, nil, nil, + nil, nil, 682, nil, nil, 682, 682, 682, 682, 682, + 682, 682, 682, nil, 682, 682, 682, nil, 682, 682, + nil, 682, 682, 682, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 682, nil, nil, 682, nil, nil, 682, + 682, nil, nil, 682, nil, nil, nil, nil, nil, 682, + nil, nil, nil, nil, nil, nil, nil, 682, nil, nil, + nil, nil, 682, 682, 682, 682, 682, 682, nil, nil, + nil, 682, 682, nil, nil, nil, nil, nil, nil, 682, + nil, nil, 682, 682, 682, nil, 682, 682, 683, 683, + 683, nil, 683, nil, nil, nil, 683, 683, nil, nil, + nil, 683, nil, 683, 683, 683, 683, 683, 683, 683, + nil, nil, nil, nil, nil, 683, 683, 683, 683, 683, + 683, 683, nil, nil, 683, nil, nil, nil, nil, nil, + nil, 683, nil, nil, 683, 683, 683, 683, 683, 683, + 683, 683, nil, 683, 683, 683, nil, 683, 683, nil, + 683, 683, 683, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 683, nil, nil, 683, nil, nil, 683, 683, + nil, nil, 683, nil, nil, nil, nil, nil, 683, nil, + nil, nil, nil, nil, nil, nil, 683, nil, nil, nil, + nil, 683, 683, 683, 683, 683, 683, nil, nil, nil, + 683, 683, nil, nil, nil, nil, nil, nil, 683, nil, + nil, 683, 683, 683, nil, 683, 683, 707, 707, 707, + nil, 707, nil, nil, nil, 707, 707, nil, nil, nil, + 707, nil, 707, 707, 707, 707, 707, 707, 707, nil, + nil, nil, nil, nil, 707, 707, 707, 707, 707, 707, + 707, nil, nil, 707, nil, nil, nil, nil, nil, nil, + 707, nil, nil, 707, 707, 707, 707, 707, 707, 707, + 707, nil, 707, 707, 707, nil, 707, 707, nil, 707, + 707, 707, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 707, nil, nil, 707, nil, nil, 707, 707, nil, + nil, 707, nil, nil, nil, nil, nil, 707, nil, nil, + nil, nil, nil, nil, nil, 707, nil, nil, nil, nil, + 707, 707, 707, 707, 707, 707, nil, nil, nil, 707, + 707, nil, nil, nil, nil, nil, nil, 707, nil, nil, + 707, 707, 707, nil, 707, 707, 710, 710, 710, nil, + 710, nil, nil, nil, 710, 710, nil, nil, nil, 710, + nil, 710, 710, 710, 710, 710, 710, 710, nil, nil, + nil, nil, nil, 710, 710, 710, 710, 710, 710, 710, + nil, nil, 710, nil, nil, nil, nil, nil, nil, 710, + nil, nil, 710, 710, 710, 710, 710, 710, 710, 710, + nil, 710, 710, 710, nil, 710, 710, nil, 710, 710, + 710, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 710, nil, nil, 710, nil, nil, 710, 710, nil, nil, + 710, nil, nil, nil, nil, nil, 710, nil, nil, nil, + nil, nil, nil, nil, 710, nil, nil, nil, nil, 710, + 710, 710, 710, 710, 710, nil, nil, nil, 710, 710, + nil, nil, nil, nil, nil, nil, 710, nil, nil, 710, + 710, 710, nil, 710, 710, 714, 714, 714, nil, 714, + nil, nil, nil, 714, 714, nil, nil, nil, 714, nil, + 714, 714, 714, 714, 714, 714, 714, nil, nil, nil, + nil, nil, 714, 714, 714, 714, 714, 714, 714, nil, + nil, 714, nil, nil, nil, nil, nil, nil, 714, nil, + nil, 714, 714, 714, 714, 714, 714, 714, 714, nil, + 714, 714, 714, nil, 714, 714, nil, nil, nil, 714, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 714, + nil, nil, 714, nil, nil, 714, 714, nil, nil, 714, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 714, 714, + 714, 714, 714, 714, nil, nil, nil, 714, 714, nil, + nil, nil, nil, nil, nil, 714, nil, nil, 714, 714, + 714, nil, 714, 714, 725, 725, 725, nil, 725, nil, + nil, nil, 725, 725, nil, nil, nil, 725, nil, 725, + 725, 725, 725, 725, 725, 725, nil, nil, nil, nil, + nil, 725, 725, 725, 725, 725, 725, 725, nil, nil, + 725, nil, nil, nil, nil, nil, nil, 725, nil, nil, + 725, 725, 725, 725, 725, 725, 725, 725, nil, 725, + 725, 725, nil, 725, 725, nil, nil, nil, 725, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 725, nil, + nil, 725, nil, nil, 725, 725, nil, nil, 725, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 725, 725, 725, + 725, 725, 725, nil, nil, nil, 725, 725, nil, nil, + nil, nil, nil, nil, 725, nil, nil, 725, 725, 725, + nil, 725, 725, 731, 731, 731, nil, 731, nil, nil, + nil, 731, 731, nil, nil, nil, 731, nil, 731, 731, + 731, 731, 731, 731, 731, nil, nil, nil, nil, nil, + 731, 731, 731, 731, 731, 731, 731, nil, nil, 731, + nil, nil, nil, nil, nil, nil, 731, nil, nil, 731, + 731, 731, 731, 731, 731, 731, 731, nil, 731, 731, + 731, nil, 731, 731, nil, 731, 731, 731, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 731, nil, nil, + 731, nil, nil, 731, 731, nil, nil, 731, nil, 731, + nil, nil, nil, 731, nil, nil, nil, nil, nil, nil, + nil, 731, nil, nil, nil, nil, 731, 731, 731, 731, + 731, 731, nil, nil, nil, 731, 731, nil, nil, nil, + nil, nil, nil, 731, nil, nil, 731, 731, 731, nil, + 731, 731, 736, 736, 736, nil, 736, nil, nil, nil, + 736, 736, nil, nil, nil, 736, nil, 736, 736, 736, + 736, 736, 736, 736, nil, nil, nil, nil, nil, 736, + 736, 736, 736, 736, 736, 736, nil, nil, 736, nil, + nil, nil, nil, nil, nil, 736, nil, nil, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, + nil, 736, 736, nil, 736, 736, 736, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 736, nil, nil, 736, + nil, nil, 736, 736, nil, nil, 736, nil, 736, nil, + nil, nil, 736, nil, nil, nil, nil, nil, nil, nil, + 736, nil, nil, nil, nil, 736, 736, 736, 736, 736, + 736, nil, nil, nil, 736, 736, nil, nil, nil, nil, + nil, nil, 736, nil, 736, 736, 736, 736, nil, 736, + 736, 739, 739, 739, nil, 739, nil, nil, nil, 739, + 739, nil, nil, nil, 739, nil, 739, 739, 739, 739, + 739, 739, 739, nil, nil, nil, nil, nil, 739, 739, + 739, 739, 739, 739, 739, nil, nil, 739, nil, nil, + nil, nil, nil, nil, 739, nil, nil, 739, 739, 739, + 739, 739, 739, 739, 739, 739, 739, 739, 739, nil, + 739, 739, nil, 739, 739, 739, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 739, nil, nil, 739, nil, + nil, 739, 739, nil, nil, 739, nil, nil, nil, nil, + nil, 739, nil, nil, nil, nil, nil, nil, nil, 739, + nil, nil, nil, nil, 739, 739, 739, 739, 739, 739, + nil, nil, nil, 739, 739, nil, nil, nil, nil, nil, + nil, 739, nil, 739, 739, 739, 739, nil, 739, 739, + 753, 753, 753, nil, 753, nil, nil, nil, 753, 753, + nil, nil, nil, 753, nil, 753, 753, 753, 753, 753, + 753, 753, nil, nil, nil, nil, nil, 753, 753, 753, + 753, 753, 753, 753, nil, nil, 753, nil, nil, nil, + nil, nil, nil, 753, nil, nil, 753, 753, 753, 753, + 753, 753, 753, 753, nil, 753, 753, 753, nil, 753, + 753, nil, 753, 753, 753, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 753, nil, nil, 753, nil, nil, + 753, 753, nil, nil, 753, nil, 753, nil, nil, nil, + 753, nil, nil, nil, nil, nil, nil, nil, 753, nil, + nil, nil, nil, 753, 753, 753, 753, 753, 753, nil, + nil, nil, 753, 753, nil, nil, nil, nil, nil, nil, + 753, nil, nil, 753, 753, 753, nil, 753, 753, 765, + 765, 765, nil, 765, nil, nil, nil, 765, 765, nil, + nil, nil, 765, nil, 765, 765, 765, 765, 765, 765, + 765, nil, nil, nil, nil, nil, 765, 765, 765, 765, + 765, 765, 765, nil, nil, 765, nil, nil, nil, nil, + nil, nil, 765, nil, nil, 765, 765, 765, 765, 765, + 765, 765, 765, nil, 765, 765, 765, nil, 765, 765, + nil, 765, 765, 765, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 765, nil, nil, 765, nil, nil, 765, + 765, nil, nil, 765, nil, nil, nil, nil, nil, 765, + nil, nil, nil, nil, nil, nil, nil, 765, nil, nil, + nil, nil, 765, 765, 765, 765, 765, 765, nil, nil, + nil, 765, 765, nil, nil, nil, nil, nil, nil, 765, + nil, nil, 765, 765, 765, nil, 765, 765, 785, 785, + 785, nil, 785, nil, nil, nil, 785, 785, nil, nil, + nil, 785, nil, 785, 785, 785, 785, 785, 785, 785, + nil, nil, nil, nil, nil, 785, 785, 785, 785, 785, + 785, 785, nil, nil, 785, nil, nil, nil, nil, nil, + nil, 785, nil, nil, 785, 785, 785, 785, 785, 785, + 785, 785, nil, 785, 785, 785, nil, 785, 785, nil, + 785, 785, 785, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 785, nil, nil, 785, nil, nil, 785, 785, + nil, nil, 785, nil, nil, nil, nil, nil, 785, nil, + nil, nil, nil, nil, nil, nil, 785, nil, nil, nil, + nil, 785, 785, 785, 785, 785, 785, nil, nil, nil, + 785, 785, nil, nil, nil, nil, nil, nil, 785, nil, + nil, 785, 785, 785, nil, 785, 785, 807, 807, 807, + nil, 807, nil, nil, nil, 807, 807, nil, nil, nil, + 807, nil, 807, 807, 807, 807, 807, 807, 807, nil, + nil, nil, nil, nil, 807, 807, 807, 807, 807, 807, + 807, nil, nil, 807, nil, nil, nil, nil, nil, nil, + 807, nil, nil, 807, 807, 807, 807, 807, 807, 807, + 807, nil, 807, 807, 807, nil, 807, 807, nil, 807, + 807, 807, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 807, nil, nil, 807, nil, nil, 807, 807, nil, + nil, 807, nil, nil, nil, nil, nil, 807, nil, nil, + nil, nil, nil, nil, nil, 807, nil, nil, nil, nil, + 807, 807, 807, 807, 807, 807, nil, nil, nil, 807, + 807, nil, nil, nil, nil, nil, nil, 807, nil, nil, + 807, 807, 807, nil, 807, 807, 815, 815, 815, nil, + 815, nil, nil, nil, 815, 815, nil, nil, nil, 815, + nil, 815, 815, 815, 815, 815, 815, 815, nil, nil, + nil, nil, nil, 815, 815, 815, 815, 815, 815, 815, + nil, nil, 815, nil, nil, nil, nil, nil, nil, 815, + nil, nil, 815, 815, 815, 815, 815, 815, 815, 815, + nil, 815, 815, 815, nil, 815, 815, nil, 815, 815, + 815, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 815, nil, nil, 815, nil, nil, 815, 815, nil, nil, + 815, nil, nil, nil, nil, nil, 815, nil, nil, nil, + nil, nil, nil, nil, 815, nil, nil, nil, nil, 815, + 815, 815, 815, 815, 815, nil, nil, nil, 815, 815, + nil, nil, nil, nil, nil, nil, 815, nil, nil, 815, + 815, 815, nil, 815, 815, 828, 828, 828, nil, 828, + nil, nil, nil, 828, 828, nil, nil, nil, 828, nil, + 828, 828, 828, 828, 828, 828, 828, nil, nil, nil, + nil, nil, 828, 828, 828, 828, 828, 828, 828, nil, + nil, 828, nil, nil, nil, nil, nil, nil, 828, nil, + nil, 828, 828, 828, 828, 828, 828, 828, 828, nil, + 828, 828, 828, nil, 828, 828, nil, 828, 828, 828, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 828, + nil, nil, 828, nil, nil, 828, 828, nil, nil, 828, + nil, nil, nil, nil, nil, 828, nil, nil, nil, nil, + nil, nil, nil, 828, nil, nil, nil, nil, 828, 828, + 828, 828, 828, 828, nil, nil, nil, 828, 828, nil, + nil, nil, nil, nil, nil, 828, nil, nil, 828, 828, + 828, nil, 828, 828, 829, 829, 829, nil, 829, nil, + nil, nil, 829, 829, nil, nil, nil, 829, nil, 829, + 829, 829, 829, 829, 829, 829, nil, nil, nil, nil, + nil, 829, 829, 829, 829, 829, 829, 829, nil, nil, + 829, nil, nil, nil, nil, nil, nil, 829, nil, nil, + 829, 829, 829, 829, 829, 829, 829, 829, nil, 829, + 829, 829, nil, 829, 829, nil, 829, 829, 829, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 829, nil, + nil, 829, nil, nil, 829, 829, nil, nil, 829, nil, + nil, nil, nil, nil, 829, nil, nil, nil, nil, nil, + nil, nil, 829, nil, nil, nil, nil, 829, 829, 829, + 829, 829, 829, nil, nil, nil, 829, 829, nil, nil, + nil, nil, nil, nil, 829, nil, nil, 829, 829, 829, + nil, 829, 829, 830, 830, 830, nil, 830, nil, nil, + nil, 830, 830, nil, nil, nil, 830, nil, 830, 830, + 830, 830, 830, 830, 830, nil, nil, nil, nil, nil, + 830, 830, 830, 830, 830, 830, 830, nil, nil, 830, + nil, nil, nil, nil, nil, nil, 830, nil, nil, 830, + 830, 830, 830, 830, 830, 830, 830, nil, 830, 830, + 830, nil, 830, 830, nil, 830, 830, 830, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 830, nil, nil, + 830, nil, nil, 830, 830, nil, nil, 830, nil, nil, + nil, nil, nil, 830, nil, nil, nil, nil, nil, nil, + nil, 830, nil, nil, nil, nil, 830, 830, 830, 830, + 830, 830, nil, nil, nil, 830, 830, nil, nil, nil, + nil, nil, nil, 830, nil, nil, 830, 830, 830, nil, + 830, 830, 831, 831, 831, nil, 831, nil, nil, nil, + 831, 831, nil, nil, nil, 831, nil, 831, 831, 831, + 831, 831, 831, 831, nil, nil, nil, nil, nil, 831, + 831, 831, 831, 831, 831, 831, nil, nil, 831, nil, + nil, nil, nil, nil, nil, 831, nil, nil, 831, 831, + 831, 831, 831, 831, 831, 831, nil, 831, 831, 831, + nil, 831, 831, nil, 831, 831, 831, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 831, nil, nil, 831, + nil, nil, 831, 831, nil, nil, 831, nil, nil, nil, + nil, nil, 831, nil, nil, nil, nil, nil, nil, nil, + 831, nil, nil, nil, nil, 831, 831, 831, 831, 831, + 831, nil, nil, nil, 831, 831, nil, nil, nil, nil, + nil, nil, 831, nil, nil, 831, 831, 831, nil, 831, + 831, 833, 833, 833, nil, 833, nil, nil, nil, 833, + 833, nil, nil, nil, 833, nil, 833, 833, 833, 833, + 833, 833, 833, nil, nil, nil, nil, nil, 833, 833, + 833, 833, 833, 833, 833, nil, nil, 833, nil, nil, + nil, nil, nil, nil, 833, nil, nil, 833, 833, 833, + 833, 833, 833, 833, 833, nil, 833, 833, 833, nil, + 833, 833, nil, 833, 833, 833, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 833, nil, nil, 833, nil, + nil, 833, 833, nil, nil, 833, nil, nil, nil, nil, + nil, 833, nil, nil, nil, nil, nil, nil, nil, 833, + nil, nil, nil, nil, 833, 833, 833, 833, 833, 833, + nil, nil, nil, 833, 833, nil, nil, nil, nil, nil, + nil, 833, nil, nil, 833, 833, 833, nil, 833, 833, + 866, 866, 866, nil, 866, nil, nil, nil, 866, 866, + nil, nil, nil, 866, nil, 866, 866, 866, 866, 866, + 866, 866, nil, nil, nil, nil, nil, 866, 866, 866, + 866, 866, 866, 866, nil, nil, 866, nil, nil, nil, + nil, nil, nil, 866, nil, nil, 866, 866, 866, 866, + 866, 866, 866, 866, nil, 866, 866, 866, nil, 866, + 866, nil, 866, 866, 866, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 866, nil, nil, 866, nil, nil, + 866, 866, nil, nil, 866, nil, nil, nil, nil, nil, + 866, nil, nil, nil, nil, nil, nil, nil, 866, nil, + nil, nil, nil, 866, 866, 866, 866, 866, 866, nil, + nil, nil, 866, 866, nil, nil, nil, nil, nil, nil, + 866, nil, nil, 866, 866, 866, nil, 866, 866, 873, + 873, 873, nil, 873, nil, nil, nil, 873, 873, nil, + nil, nil, 873, nil, 873, 873, 873, 873, 873, 873, + 873, nil, nil, nil, nil, nil, 873, 873, 873, 873, + 873, 873, 873, nil, nil, 873, nil, nil, nil, nil, + nil, nil, 873, nil, nil, 873, 873, 873, 873, 873, + 873, 873, 873, nil, 873, 873, 873, nil, 873, 873, + nil, 873, 873, 873, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 873, nil, nil, 873, nil, nil, 873, + 873, nil, nil, 873, nil, nil, nil, nil, nil, 873, + nil, nil, nil, nil, nil, nil, nil, 873, nil, nil, + nil, nil, 873, 873, 873, 873, 873, 873, nil, nil, + nil, 873, 873, nil, nil, nil, nil, nil, nil, 873, + nil, nil, 873, 873, 873, nil, 873, 873, 921, 921, + 921, nil, 921, nil, nil, nil, 921, 921, nil, nil, + nil, 921, nil, 921, 921, 921, 921, 921, 921, 921, + nil, nil, nil, nil, nil, 921, 921, 921, 921, 921, + 921, 921, nil, nil, 921, nil, nil, nil, nil, nil, + nil, 921, nil, nil, 921, 921, 921, 921, 921, 921, + 921, 921, 921, 921, 921, 921, nil, 921, 921, nil, + 921, 921, 921, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 921, nil, nil, 921, nil, nil, 921, 921, + nil, nil, 921, nil, nil, nil, 921, nil, 921, nil, + nil, nil, nil, nil, nil, nil, 921, nil, nil, nil, + nil, 921, 921, 921, 921, 921, 921, nil, nil, nil, + 921, 921, nil, nil, nil, nil, nil, nil, 921, nil, + 921, 921, 921, 921, nil, 921, 921, 922, 922, 922, + nil, 922, nil, nil, nil, 922, 922, nil, nil, nil, + 922, nil, 922, 922, 922, 922, 922, 922, 922, nil, + nil, nil, nil, nil, 922, 922, 922, 922, 922, 922, + 922, nil, nil, 922, nil, nil, nil, nil, nil, nil, + 922, nil, nil, 922, 922, 922, 922, 922, 922, 922, + 922, nil, 922, 922, 922, nil, 922, 922, nil, 922, + 922, 922, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 922, nil, nil, 922, nil, nil, 922, 922, nil, + nil, 922, nil, nil, nil, nil, nil, 922, nil, nil, + nil, nil, nil, nil, nil, 922, nil, nil, nil, nil, + 922, 922, 922, 922, 922, 922, nil, nil, nil, 922, + 922, nil, nil, nil, nil, nil, nil, 922, nil, nil, + 922, 922, 922, nil, 922, 922, 934, 934, 934, nil, + 934, nil, nil, nil, 934, 934, nil, nil, nil, 934, + nil, 934, 934, 934, 934, 934, 934, 934, nil, nil, + nil, nil, nil, 934, 934, 934, 934, 934, 934, 934, + nil, nil, 934, nil, nil, nil, nil, nil, nil, 934, + nil, nil, 934, 934, 934, 934, 934, 934, 934, 934, + nil, 934, 934, 934, nil, 934, 934, nil, nil, nil, + 934, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 934, nil, nil, 934, nil, nil, 934, 934, nil, nil, + 934, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 934, + 934, 934, 934, 934, 934, nil, nil, nil, 934, 934, + nil, nil, nil, nil, nil, nil, 934, nil, nil, 934, + 934, 934, nil, 934, 934, 943, 943, 943, nil, 943, + nil, nil, nil, 943, 943, nil, nil, nil, 943, nil, + 943, 943, 943, 943, 943, 943, 943, nil, nil, nil, + nil, nil, 943, 943, 943, 943, 943, 943, 943, nil, + nil, 943, nil, nil, nil, nil, nil, nil, 943, nil, + nil, 943, 943, 943, 943, 943, 943, 943, 943, nil, + 943, 943, 943, nil, 943, 943, nil, nil, nil, 943, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 943, + nil, nil, 943, nil, nil, 943, 943, nil, nil, 943, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 943, 943, + 943, 943, 943, 943, nil, nil, nil, 943, 943, nil, + nil, nil, nil, nil, nil, 943, nil, nil, 943, 943, + 943, nil, 943, 943, 951, 951, 951, nil, 951, nil, + nil, nil, 951, 951, nil, nil, nil, 951, nil, 951, + 951, 951, 951, 951, 951, 951, nil, nil, nil, nil, + nil, 951, 951, 951, 951, 951, 951, 951, nil, nil, + 951, nil, nil, nil, nil, nil, nil, 951, nil, nil, + 951, 951, 951, 951, 951, 951, 951, 951, nil, 951, + 951, 951, nil, 951, 951, nil, 951, 951, 951, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 951, nil, + nil, 951, nil, nil, 951, 951, nil, nil, 951, nil, + 951, nil, nil, nil, 951, nil, nil, nil, nil, nil, + nil, nil, 951, nil, nil, nil, nil, 951, 951, 951, + 951, 951, 951, nil, nil, nil, 951, 951, nil, nil, + nil, nil, nil, nil, 951, nil, nil, 951, 951, 951, + nil, 951, 951, 992, 992, 992, nil, 992, nil, nil, + nil, 992, 992, nil, nil, nil, 992, nil, 992, 992, + 992, 992, 992, 992, 992, nil, nil, nil, nil, nil, + 992, 992, 992, 992, 992, 992, 992, nil, nil, 992, + nil, nil, nil, nil, nil, nil, 992, nil, nil, 992, + 992, 992, 992, 992, 992, 992, 992, nil, 992, 992, + 992, nil, 992, 992, nil, nil, nil, 992, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 992, nil, nil, + 992, nil, nil, 992, 992, nil, nil, 992, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 992, 992, 992, 992, + 992, 992, nil, nil, nil, 992, 992, nil, nil, nil, + nil, nil, nil, 992, nil, nil, 992, 992, 992, nil, + 992, 992, 1006, 1006, 1006, nil, 1006, nil, nil, nil, + 1006, 1006, nil, nil, nil, 1006, nil, 1006, 1006, 1006, + 1006, 1006, 1006, 1006, nil, nil, nil, nil, nil, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, nil, nil, 1006, nil, + nil, nil, nil, nil, nil, 1006, nil, nil, 1006, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, nil, 1006, 1006, 1006, + nil, 1006, 1006, nil, 1006, 1006, 1006, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1006, nil, nil, 1006, + nil, nil, 1006, 1006, nil, nil, 1006, nil, nil, nil, + nil, nil, 1006, nil, nil, nil, nil, nil, nil, nil, + 1006, nil, nil, nil, nil, 1006, 1006, 1006, 1006, 1006, + 1006, nil, nil, nil, 1006, 1006, nil, nil, nil, nil, + nil, nil, 1006, nil, nil, 1006, 1006, 1006, nil, 1006, + 1006, 1037, 1037, 1037, nil, 1037, nil, nil, nil, 1037, + 1037, nil, nil, nil, 1037, nil, 1037, 1037, 1037, 1037, + 1037, 1037, 1037, nil, nil, nil, nil, nil, 1037, 1037, + 1037, 1037, 1037, 1037, 1037, nil, nil, 1037, nil, nil, + nil, nil, nil, nil, 1037, nil, nil, 1037, 1037, 1037, + 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, nil, + 1037, 1037, nil, 1037, 1037, 1037, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1037, nil, nil, 1037, nil, + nil, 1037, 1037, nil, nil, 1037, nil, 1037, nil, 1037, + nil, 1037, nil, nil, nil, nil, nil, nil, nil, 1037, + nil, nil, nil, nil, 1037, 1037, 1037, 1037, 1037, 1037, + nil, nil, nil, 1037, 1037, nil, nil, nil, nil, nil, + nil, 1037, nil, 1037, 1037, 1037, 1037, nil, 1037, 1037, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, nil, nil, nil, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, nil, nil, nil, + nil, nil, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, nil, 11, nil, nil, nil, nil, nil, nil, + nil, nil, 11, 11, nil, 11, 11, 11, 11, 11, + 11, 11, nil, nil, 11, 11, nil, nil, nil, 11, + 11, 11, 11, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 11, 11, nil, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + nil, nil, 11, 11, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 11, nil, nil, nil, nil, nil, nil, + nil, nil, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, nil, nil, nil, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + nil, nil, nil, nil, nil, 12, 12, 12, 12, 12, + 12, 12, 12, 12, nil, nil, 12, nil, nil, nil, + nil, nil, nil, nil, nil, 12, 12, nil, 12, 12, + 12, 12, 12, 12, 12, nil, nil, 12, 12, nil, + nil, nil, 12, 12, 12, 12, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 12, + 12, nil, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, nil, nil, 12, 12, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 12, nil, nil, nil, + nil, nil, nil, nil, nil, 12, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + nil, nil, nil, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, nil, nil, nil, nil, nil, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + nil, 75, nil, nil, nil, nil, nil, nil, 75, 75, + nil, 75, 75, 75, 75, 75, 75, 75, nil, nil, + 75, 75, nil, nil, nil, 75, 75, 75, 75, nil, + nil, nil, nil, nil, 75, nil, nil, nil, nil, nil, + nil, nil, 75, 75, nil, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, nil, nil, 75, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 75, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, nil, nil, nil, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, nil, nil, nil, nil, + nil, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, nil, 105, nil, nil, nil, nil, nil, + nil, 105, 105, nil, 105, 105, 105, 105, 105, 105, + 105, nil, nil, 105, 105, nil, nil, nil, 105, 105, + 105, 105, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 105, nil, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, nil, + nil, 105, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, nil, nil, nil, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, nil, + nil, nil, nil, nil, 428, 428, 428, 428, 428, 428, + 428, 428, 428, nil, nil, 428, nil, nil, nil, nil, + nil, nil, nil, nil, 428, 428, nil, 428, 428, 428, + 428, 428, 428, 428, nil, nil, 428, 428, nil, nil, + nil, 428, 428, 428, 428, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 428, 428, + nil, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, nil, nil, 428, 428, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 428, nil, nil, nil, nil, + nil, nil, nil, nil, 428, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, nil, + nil, nil, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, nil, nil, nil, nil, nil, 662, 662, 662, + 662, 662, 662, 662, 662, 662, nil, nil, 662, nil, + nil, nil, nil, nil, nil, nil, nil, 662, 662, nil, + 662, 662, 662, 662, 662, 662, 662, nil, nil, 662, + 662, nil, nil, nil, 662, 662, 662, 662, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 662, 662, nil, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, nil, nil, 662, 662, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 662, nil, + nil, nil, nil, nil, nil, nil, nil, 662, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, nil, nil, nil, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, nil, nil, nil, nil, nil, + 771, 771, 771, 771, 771, 771, 771, 771, 771, nil, + nil, 771, nil, nil, nil, nil, nil, nil, nil, nil, + 771, 771, nil, 771, 771, 771, 771, 771, 771, 771, + nil, nil, 771, 771, nil, nil, nil, 771, 771, 771, + 771, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 771, 771, nil, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, nil, nil, + 771, nil, nil, nil, nil, 228, 228, nil, nil, 228, + nil, nil, nil, nil, nil, nil, nil, nil, 228, 228, + 771, 228, 228, 228, 228, 228, 228, 228, nil, nil, + 228, 228, nil, nil, nil, 228, 228, 228, 228, nil, + nil, nil, nil, nil, 228, nil, nil, nil, nil, nil, + nil, nil, 228, 228, nil, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, nil, nil, 228, nil, + nil, nil, nil, 229, 229, nil, nil, 229, nil, nil, + nil, nil, nil, nil, nil, nil, 229, 229, 228, 229, + 229, 229, 229, 229, 229, 229, nil, nil, 229, 229, + nil, nil, nil, 229, 229, 229, 229, nil, nil, nil, + nil, nil, 229, nil, nil, nil, nil, nil, nil, nil, + 229, 229, nil, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, nil, nil, 229, nil, nil, nil, + nil, 479, 479, nil, nil, 479, nil, nil, nil, nil, + nil, nil, nil, nil, 479, 479, 229, 479, 479, 479, + 479, 479, 479, 479, nil, nil, 479, 479, nil, nil, + nil, 479, 479, 479, 479, nil, nil, nil, nil, nil, + 479, nil, nil, nil, nil, nil, nil, nil, 479, 479, + nil, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, nil, nil, 479, nil, nil, nil, nil, 480, + 480, nil, nil, 480, nil, nil, nil, nil, nil, nil, + nil, nil, 480, 480, 479, 480, 480, 480, 480, 480, + 480, 480, nil, nil, 480, 480, nil, nil, nil, 480, + 480, 480, 480, nil, nil, nil, nil, nil, 480, nil, + nil, nil, nil, nil, nil, nil, 480, 480, nil, 480, + 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, + nil, nil, 480, nil, nil, nil, nil, 545, 545, nil, + nil, 545, nil, nil, nil, nil, nil, nil, nil, nil, + 545, 545, 480, 545, 545, 545, 545, 545, 545, 545, + nil, nil, 545, 545, nil, nil, nil, 545, 545, 545, + 545, nil, nil, nil, nil, nil, 545, nil, nil, nil, + nil, nil, nil, nil, 545, 545, nil, 545, 545, 545, + 545, 545, 545, 545, 545, 545, 545, 545, nil, nil, + 545, nil, nil, nil, nil, 546, 546, nil, nil, 546, + nil, nil, nil, nil, nil, nil, nil, nil, 546, 546, + 545, 546, 546, 546, 546, 546, 546, 546, nil, nil, + 546, 546, nil, nil, nil, 546, 546, 546, 546, nil, + nil, nil, nil, nil, 546, nil, nil, nil, nil, nil, + nil, nil, 546, 546, nil, 546, 546, 546, 546, 546, + 546, 546, 546, 546, 546, 546, nil, nil, 546, nil, + nil, nil, nil, 555, 555, nil, nil, 555, nil, nil, + nil, nil, nil, nil, nil, nil, 555, 555, 546, 555, + 555, 555, 555, 555, 555, 555, nil, nil, 555, 555, + nil, nil, nil, 555, 555, 555, 555, nil, nil, nil, + nil, nil, 555, nil, nil, nil, nil, nil, nil, nil, + 555, 555, nil, 555, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, nil, nil, 555, nil, nil, nil, + nil, 556, 556, nil, nil, 556, nil, nil, nil, nil, + nil, nil, nil, nil, 556, 556, 555, 556, 556, 556, + 556, 556, 556, 556, nil, nil, 556, 556, nil, nil, + nil, 556, 556, 556, 556, nil, nil, nil, nil, nil, + 556, nil, nil, nil, nil, nil, nil, nil, 556, 556, + nil, 556, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, nil, nil, 556, nil, nil, nil, nil, 584, + 584, nil, nil, 584, nil, nil, nil, nil, nil, nil, + nil, nil, 584, 584, 556, 584, 584, 584, 584, 584, + 584, 584, nil, nil, 584, 584, nil, nil, nil, 584, + 584, 584, 584, nil, nil, nil, nil, nil, 584, nil, + nil, nil, nil, nil, nil, nil, 584, 584, nil, 584, + 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, + nil, nil, 584, nil, nil, nil, nil, 585, 585, nil, + nil, 585, nil, nil, nil, nil, nil, nil, nil, nil, + 585, 585, 584, 585, 585, 585, 585, 585, 585, 585, + nil, nil, 585, 585, nil, nil, nil, 585, 585, 585, + 585, nil, nil, nil, nil, nil, 585, nil, nil, nil, + nil, nil, nil, nil, 585, 585, nil, 585, 585, 585, + 585, 585, 585, 585, 585, 585, 585, 585, nil, nil, + 585, nil, nil, nil, nil, 591, 591, nil, nil, 591, + nil, nil, nil, nil, nil, nil, nil, nil, 591, 591, + 585, 591, 591, 591, 591, 591, 591, 591, nil, nil, + 591, 591, nil, nil, nil, 591, 591, 591, 591, nil, + nil, nil, nil, nil, 591, nil, nil, nil, nil, nil, + nil, nil, 591, 591, nil, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, nil, nil, 591, nil, + nil, nil, nil, 592, 592, nil, nil, 592, nil, nil, + nil, nil, nil, nil, nil, nil, 592, 592, 591, 592, + 592, 592, 592, 592, 592, 592, nil, nil, 592, 592, + nil, nil, nil, 592, 592, 592, 592, nil, nil, nil, + nil, nil, 592, nil, nil, nil, nil, nil, nil, nil, + 592, 592, nil, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, nil, nil, 592, nil, nil, nil, + nil, 668, 668, nil, nil, 668, nil, nil, nil, nil, + nil, nil, nil, nil, 668, 668, 592, 668, 668, 668, + 668, 668, 668, 668, nil, nil, 668, 668, nil, nil, + nil, 668, 668, 668, 668, nil, nil, nil, nil, nil, + 668, nil, nil, nil, nil, nil, nil, nil, 668, 668, + nil, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 668, nil, nil, 668, nil, nil, nil, nil, 669, + 669, nil, nil, 669, nil, nil, nil, nil, nil, nil, + nil, nil, 669, 669, 668, 669, 669, 669, 669, 669, + 669, 669, nil, nil, 669, 669, nil, nil, nil, 669, + 669, 669, 669, nil, nil, nil, nil, nil, 669, nil, + nil, nil, nil, nil, nil, nil, 669, 669, nil, 669, + 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, + nil, 983, 669, 983, 983, 983, 983, 983, 986, nil, + 986, 986, 986, 986, 986, nil, nil, 983, nil, nil, + nil, nil, 669, nil, 986, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 983, + nil, nil, nil, nil, nil, nil, 986, nil, 983, 983, + 983, 983, nil, nil, nil, 986, 986, 986, 986, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1033, 1033, nil, nil, + 1033, nil, nil, nil, 983, nil, nil, nil, nil, 1033, + 1033, 986, 1033, 1033, 1033, 1033, 1033, 1033, 1033, nil, + nil, 1033, 1033, nil, nil, nil, 1033, 1033, 1033, 1033, + nil, nil, nil, nil, nil, 1033, nil, nil, nil, nil, + nil, nil, nil, 1033, 1033, nil, 1033, 1033, 1033, 1033, + 1033, 1033, 1033, 1033, 1033, 1033, 1033, nil, nil, 1033, + nil, nil, nil, nil, 1038, 1038, nil, nil, 1038, nil, + nil, nil, nil, nil, nil, nil, nil, 1038, 1038, 1033, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, nil, nil, 1038, + 1038, nil, nil, nil, 1038, 1038, 1038, 1038, nil, nil, + nil, nil, nil, 1038, nil, nil, nil, nil, nil, nil, + nil, 1038, 1038, nil, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, nil, nil, 1038, nil, nil, + nil, nil, 1039, 1039, nil, nil, 1039, nil, nil, nil, + nil, nil, nil, nil, nil, 1039, 1039, 1038, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, nil, nil, 1039, 1039, nil, + nil, nil, 1039, 1039, 1039, 1039, nil, nil, nil, nil, + nil, 1039, nil, nil, nil, nil, nil, nil, nil, 1039, + 1039, nil, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, nil, 1057, 1039, 1057, 1057, 1057, 1057, + 1057, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1057, nil, nil, nil, nil, 1039, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1057, nil, nil, nil, nil, nil, nil, nil, + nil, 1057, 1057, 1057, 1057, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1057 ] + +racc_action_pointer = [ + nil, 34, 2018, 60, nil, 201, nil, nil, 6077, 763, + nil, 24008, 24141, -12, nil, -30, 60, -17, 152, 279, + 112, nil, -60, 6216, 2298, 236, nil, -40, nil, 0, + 1084, 1216, 6355, 6494, 6633, nil, 2158, 6772, 6911, nil, + 144, 208, 304, 268, 159, 7050, 7189, 489, 7328, 203, + 305, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1348, nil, 7467, nil, nil, 73, nil, 7606, 7745, nil, + nil, 7884, 8023, 8162, 8301, 24274, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, -65, nil, nil, nil, nil, nil, nil, 223, + 255, 278, 284, nil, nil, 24407, nil, nil, nil, nil, + nil, nil, 0, nil, nil, 139, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 8440, nil, + nil, nil, nil, 8579, 8718, 8857, 8996, 9135, 312, nil, + 605, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 306, + nil, 2298, 9274, 9413, 9552, 9691, 9830, 9969, 24874, 24942, + nil, nil, 10108, 10247, 10386, nil, nil, 356, -55, -52, + 405, 162, 341, 408, nil, 10525, 2438, 431, 10664, 10803, + 10942, 11081, 11220, 11359, 11498, 11637, 11776, 11915, 12054, 12193, + 12332, 12471, 12610, 12749, 12888, 13027, 13166, 13305, 13444, 13583, + nil, nil, nil, nil, 13722, nil, nil, nil, 1876, nil, + nil, 426, 13861, 14000, nil, nil, nil, nil, nil, nil, + nil, nil, 14139, nil, 2438, nil, 402, 406, nil, 14278, + 460, 14417, nil, nil, 14556, 14695, nil, nil, 460, nil, + nil, 14834, 925, nil, 419, 2578, 461, 499, 474, 14973, + 2718, 371, 411, 458, 551, 510, nil, 548, 516, 206, + nil, nil, nil, 567, 254, 536, 15112, nil, 308, 618, + 514, nil, 620, 15251, nil, 15390, 2858, 1166, 587, 15529, + 15668, nil, 11, -10, -1, 15807, 2998, 3138, 476, 699, + 585, -19, -14, 589, 670, -7, 702, nil, nil, 311, + 342, 308, nil, 625, nil, 620, 15946, nil, nil, nil, + 112, 118, 120, 239, 344, 373, 377, 455, 459, nil, + 461, nil, nil, 645, nil, -59, nil, 370, nil, 538, + nil, 605, 378, nil, 607, 397, nil, 609, -37, nil, + 610, -27, nil, 443, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 24540, nil, + nil, nil, nil, 624, nil, nil, 612, 16085, 618, nil, + nil, 618, nil, 752, 182, 720, nil, nil, 2018, nil, + nil, nil, nil, nil, 2158, 644, nil, nil, 642, 644, + 430, 547, 1480, nil, nil, nil, 271, 403, 687, nil, + nil, 1612, 1744, nil, nil, nil, -33, nil, 690, 25010, + 25078, 16224, 187, 16363, 16502, 16641, 3138, 3278, 364, 490, + 724, 726, 729, 748, 976, 1430, 1562, 3418, 3558, 3698, + 3838, 3978, 4118, 844, 1039, 4258, 4398, 2578, 1166, 807, + nil, 1876, nil, nil, nil, nil, 691, nil, nil, nil, + 692, nil, nil, 16780, nil, nil, 16919, nil, 17058, nil, + 265, nil, nil, nil, 17197, 1178, 712, 702, 703, nil, + nil, 705, 17336, 709, 17475, 25146, 25214, 753, 746, nil, + 17614, 710, nil, 17753, 17892, 25282, 25350, 1298, 2718, 18031, + 833, 851, 735, nil, nil, -80, -68, 736, 751, nil, + 340, 777, 3278, 856, nil, 3418, 30, 860, 868, 863, + 890, nil, nil, 18170, 25418, 25486, 5, nil, nil, 763, + nil, 25554, 25622, 18309, nil, nil, nil, 587, 3558, 811, + nil, nil, nil, 18448, nil, 744, nil, 773, 774, nil, + 777, 780, 781, nil, nil, nil, nil, nil, nil, nil, + nil, 769, 685, nil, nil, 18587, nil, nil, nil, 882, + nil, nil, nil, 886, nil, nil, 895, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 198, nil, + nil, 200, nil, nil, nil, 826, nil, nil, 830, nil, + 3698, nil, 24673, nil, 842, 18726, 18865, 19004, 25690, 25758, + 19143, 19282, 585, 882, 19421, 19560, 19699, 19838, 882, nil, + nil, nil, 19977, 20116, 883, nil, nil, nil, 189, 216, + 542, 681, 870, 869, nil, 116, 972, 163, nil, nil, + 888, nil, 996, nil, 880, nil, 922, 20255, nil, nil, + 20394, nil, nil, -123, 20533, 882, nil, 901, -9, 28, + 951, 33, 773, 952, 916, 20672, nil, 995, 156, 221, + nil, 20811, nil, nil, nil, nil, 20950, nil, nil, 21089, + nil, nil, nil, 618, nil, 1052, nil, nil, nil, nil, + nil, 1059, nil, 21228, 944, 20, 29, 163, 165, 3838, + 550, 781, nil, 947, 3978, 21367, 535, 1076, 4118, 874, + 1048, 24806, 165, 27, 960, 234, nil, nil, 578, 1147, + nil, 1279, nil, 471, nil, 21506, nil, 949, nil, 959, + 961, 881, 968, nil, nil, nil, nil, 936, 4258, nil, + nil, nil, nil, nil, 982, nil, 978, 21645, 982, 222, + 274, 813, 945, nil, 2858, 21784, nil, 983, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 21923, 22062, + 22201, 22340, 317, 22479, nil, nil, 1411, nil, 4398, nil, + nil, 1000, nil, 119, nil, nil, nil, nil, 985, 160, + nil, nil, nil, nil, nil, nil, 4538, nil, 987, 1029, + nil, nil, 447, 1109, nil, nil, 22618, nil, 4678, 1110, + nil, nil, nil, 22757, 42, 41, 1113, nil, 1120, 551, + nil, nil, 1124, 1009, 580, nil, nil, nil, 4818, 4958, + 1005, 1013, 1011, nil, nil, nil, 1012, 1021, nil, 1036, + 1041, nil, 1042, nil, nil, 1047, 980, 819, nil, nil, + nil, nil, nil, nil, nil, 1038, nil, 1048, 320, nil, + nil, 22896, 23035, 2998, 1051, 1055, nil, 1057, 1065, 1070, + nil, 1103, 1101, 1087, 23174, nil, nil, nil, nil, 5098, + 5238, nil, 6, 23313, nil, nil, nil, 10, nil, nil, + nil, 23452, 5378, nil, nil, nil, 5518, nil, nil, nil, + 1144, 1127, 1235, 1010, nil, nil, 1543, nil, 1675, nil, + 6793, nil, 6932, nil, nil, nil, nil, 1122, 1125, nil, + 325, nil, nil, 25820, nil, nil, 25827, nil, 8044, nil, + nil, 1152, 23591, 884, 1213, nil, 1266, 5658, 19, 38, + 898, 1221, 69, nil, 5798, nil, 23730, 355, 1269, 5938, + nil, nil, 451, nil, nil, nil, 1150, 1151, 1153, 1168, + 1077, 1184, 1169, nil, nil, 1173, 1174, 1176, 1179, nil, + 1180, nil, 913, 25895, nil, nil, 1305, 23869, 25963, 26031, + 106, 691, nil, nil, nil, nil, nil, 1305, nil, 1209, + 8183, nil, nil, nil, nil, 1187, nil, 26093, nil, 8322, + nil, 14994, nil, 15133, nil, nil, 1228, 1236, nil, 1202, + 128, 131, 171, 174, nil, nil, nil, 1202, 1208, 1209, + 1210, 1211, 162, nil, 17357, nil, nil, nil, nil, 1212, + nil ] + +racc_action_default = [ + -1, -646, -645, -646, -2, -632, -4, -5, -646, -8, + -9, -646, -646, -646, -36, -646, -646, -40, -646, -646, + -292, -52, -634, -646, -57, -62, -63, -64, -68, -269, + -269, -269, -307, -337, -338, -80, -645, -84, -92, -94, + -646, -533, -534, -646, -646, -646, -646, -228, -646, -634, + -242, -283, -284, -285, -286, -287, -288, -289, -290, -291, + -618, -294, -296, -303, -305, -315, -317, -646, -646, -59, + -59, -632, -646, -646, -646, -646, -339, -340, -342, -343, + -344, -345, -346, -347, -348, -349, -350, -351, -360, -415, + -463, -464, -465, -466, -467, -645, -470, -645, -645, -645, + -645, -645, -645, -506, -507, -645, -509, -515, -517, -518, + -519, -520, -616, -522, -523, -617, -525, -526, -527, -528, + -529, -530, -531, -532, -537, -538, 1091, -3, -633, -641, + -642, -643, -7, -646, -646, -646, -646, -646, -646, -24, + -646, -123, -124, -125, -126, -127, -128, -129, -133, -134, + -135, -136, -137, -138, -139, -140, -141, -142, -143, -144, + -145, -146, -147, -148, -149, -150, -151, -152, -153, -154, + -155, -156, -157, -158, -159, -160, -161, -162, -163, -164, + -165, -166, -167, -168, -169, -170, -171, -172, -173, -174, + -175, -176, -177, -178, -179, -180, -181, -182, -183, -184, + -185, -186, -187, -188, -189, -190, -191, -192, -193, -194, + -195, -196, -197, -198, -199, -200, -201, -202, -203, -29, + -130, -645, -646, -646, -646, -646, -646, -645, -646, -646, + -628, -629, -646, -646, -634, -635, -56, -646, -533, -534, + -646, -292, -646, -646, -234, -646, -645, -646, -646, -646, + -646, -646, -646, -646, -646, -646, -646, -646, -646, -646, + -646, -646, -646, -646, -646, -646, -646, -646, -646, -646, + -243, -244, -245, -246, -646, -353, -443, -423, -646, -630, + -631, -69, -645, -646, -314, -352, -427, -436, -438, -75, + -433, -76, -634, -77, -249, -264, -645, -645, -268, -646, + -274, -646, -645, -610, -646, -646, -78, -79, -632, -17, + -18, -646, -21, -22, -82, -645, -634, -646, -85, -88, + -645, -100, -101, -646, -646, -108, -307, -310, -634, -646, + -337, -338, -341, -434, -646, -90, -646, -96, -302, -516, + -646, -222, -223, -646, -235, -646, -645, -298, -634, -645, + -645, -316, -58, -646, -646, -646, -645, -645, -632, -646, + -633, -533, -534, -646, -646, -292, -646, -370, -371, -118, + -119, -646, -121, -646, -292, -645, -646, -533, -534, -330, + -123, -124, -163, -164, -165, -181, -186, -193, -196, -332, + -646, -605, -606, -565, -468, -646, -491, -646, -493, -646, + -495, -646, -646, -475, -646, -646, -481, -646, -646, -487, + -646, -646, -489, -646, -508, -510, -511, -512, -513, -6, + -644, -30, -31, -32, -33, -34, -10, -11, -646, -26, + -27, -28, -131, -646, -37, -39, -279, -646, -646, -278, + -38, -646, -41, -646, -292, -49, -51, -204, -254, -274, + -53, -54, -42, -205, -254, -634, -259, -260, -645, -645, + -619, -620, -269, -431, -621, -622, -620, -619, -269, -430, + -432, -621, -622, -48, -212, -55, -634, -313, -646, -646, + -646, -645, -302, -646, -646, -646, -213, -214, -215, -216, + -217, -218, -219, -220, -224, -225, -226, -227, -229, -230, + -231, -232, -233, -236, -237, -238, -239, -634, -247, -646, + -444, -269, -619, -620, -66, -70, -634, -270, -440, -443, + -634, -309, -265, -646, -273, -266, -646, -271, -646, -275, + -646, -613, -615, -16, -633, -20, -646, -634, -81, -300, + -97, -86, -646, -634, -645, -646, -646, -107, -646, -516, + -646, -93, -98, -646, -646, -646, -646, -248, -240, -646, + -455, -646, -634, -297, -250, -638, -638, -634, -646, -608, + -638, -646, -645, -361, -362, -645, -646, -646, -646, -646, + -646, -356, -450, -645, -646, -646, -302, -59, -118, -119, + -120, -646, -646, -645, -325, -539, -541, -327, -645, -543, + -334, -626, -627, -646, -416, -565, -419, -604, -604, -548, + -550, -550, -550, -564, -566, -567, -568, -569, -570, -571, + -572, -573, -646, -575, -577, -579, -584, -586, -587, -589, + -594, -596, -597, -599, -600, -601, -646, -469, -492, -497, + -498, -500, -471, -494, -472, -496, -473, -474, -646, -477, + -479, -646, -480, -483, -484, -646, -485, -486, -646, -514, + -645, -25, -646, -35, -282, -646, -646, -645, -646, -646, + -646, -646, -435, -646, -261, -263, -646, -646, -71, -257, + -258, -428, -646, -646, -73, -429, -312, -636, -619, -620, + -619, -620, -634, -646, -422, -645, -65, -424, -440, -256, + -646, -441, -646, -308, -645, -272, -276, -646, -611, -612, + -646, -19, -23, -83, -646, -89, -95, -634, -619, -620, + -645, -623, -106, -646, -91, -646, -211, -221, -634, -645, + -354, -645, -295, -359, -299, -251, -640, -639, -253, -640, + -304, -306, -609, -645, -363, -645, -60, -364, -365, -320, + -321, -646, -323, -646, -634, -619, -620, -623, -301, -645, + -118, -119, -122, -634, -645, -646, -646, -646, -645, -565, + -565, -646, -634, -646, -634, -646, -546, -547, -646, -646, + -557, -646, -560, -646, -562, -646, -372, -646, -374, -376, + -379, -382, -634, -578, -588, -598, -602, -646, -645, -476, + -478, -482, -488, -490, -646, -132, -280, -646, -634, -619, + -620, -620, -619, -50, -255, -646, -637, -645, -44, -207, + -45, -208, -72, -46, -210, -47, -209, -74, -646, -646, + -646, -646, -435, -646, -404, -405, -634, -407, -645, -426, + -425, -646, -437, -645, -439, -267, -277, -614, -87, -435, + -99, -311, -13, -15, -355, -357, -645, -462, -456, -645, + -457, -458, -638, -646, -358, -366, -646, -368, -645, -646, + -61, -322, -446, -646, -646, -435, -646, -435, -646, -646, + -328, -331, -646, -634, -646, -335, -607, -417, -645, -645, + -409, -634, -604, -585, -603, -549, -550, -550, -576, -550, + -550, -595, -550, -573, -590, -634, -646, -646, -381, -574, + -499, -502, -503, -504, -505, -646, -12, -281, -435, -43, + -206, -262, -646, -241, -604, -604, -386, -645, -645, -645, + -403, -646, -634, -573, -581, -582, -592, -445, -67, -645, + -645, -461, -646, -646, -460, -252, -318, -646, -369, -319, + -447, -646, -645, -324, -326, -540, -645, -333, -542, -544, + -543, -646, -646, -646, -418, -545, -646, -553, -646, -555, + -646, -558, -646, -561, -563, -373, -375, -377, -380, -501, + -646, -384, -385, -394, -388, -396, -646, -399, -646, -401, + -406, -646, -646, -580, -646, -442, -645, -645, -533, -534, + -646, -646, -292, -459, -645, -448, -646, -645, -646, -645, + -420, -421, -634, -411, -413, -414, -550, -550, -550, -550, + -646, -646, -604, -583, -387, -645, -645, -645, -645, -593, + -645, -408, -591, -646, -302, -14, -455, -645, -646, -646, + -302, -645, -449, -451, -452, -453, -329, -646, -410, -646, + -646, -551, -554, -556, -559, -378, -383, -646, -391, -646, + -393, -646, -397, -646, -400, -402, -301, -623, -454, -634, + -619, -620, -623, -301, -367, -336, -412, -550, -645, -645, + -645, -645, -435, -552, -646, -389, -392, -395, -398, -645, + -390 ] + +racc_goto_table = [ + 6, 228, 236, 233, 389, 295, 295, 295, 318, 279, + 277, 4, 580, 286, 290, 351, 144, 144, 455, 9, + 452, 515, 131, 525, 729, 9, 473, 139, 220, 426, + 345, 128, 332, 332, 415, 621, 768, 551, 353, 354, + 462, 468, 358, 446, 572, 575, 446, 590, 317, 352, + 352, 339, 446, 352, 314, 296, 296, 296, 606, 297, + 297, 297, 356, 357, 708, 147, 147, 332, 332, 332, + 439, 440, 863, 516, 869, 776, 777, 509, 127, 347, + 144, 281, 289, 291, 335, 978, 705, 316, 131, 705, + 511, 613, 672, 396, 786, 398, 400, 403, 406, 409, + 412, 436, 449, 396, 421, 422, 423, 424, 901, 792, + 144, 395, 838, 853, 928, 352, 352, 352, 352, 735, + 738, 413, 700, 1013, 742, 976, 1029, 891, 1015, 648, + 375, 379, 651, 1, 2, 138, 897, 132, 899, 293, + 306, 307, 660, 852, 359, 9, 940, 643, 711, 645, + 536, 219, 649, 368, 425, 649, 435, 428, 746, 870, + 278, 698, 662, 343, 567, 697, 391, 568, 366, 594, + 390, 600, 346, 348, 562, 349, 350, 764, 527, 766, + 529, 956, 598, 531, 532, 525, 599, 771, 960, 931, + 898, 977, 930, 929, 932, 1012, 604, 1029, 1055, 887, + 295, 434, 445, 393, 740, 445, 450, 451, 773, 1076, + 518, 445, 463, 708, 1015, 475, 476, 519, 19, 479, + 843, 561, 874, 695, 19, 456, 1043, 753, 859, 571, + 942, 394, 751, 433, 472, 397, 399, 705, 705, 237, + 976, 402, 405, 715, 408, 438, 438, 621, 237, 237, + 237, 724, 19, 323, 323, 295, 295, 419, 317, 786, + 939, 1025, 411, 908, 910, 295, 797, 762, 798, 414, + 774, 765, 692, 896, 905, 893, 1023, 708, 19, 603, + 456, nil, nil, 237, 237, 991, nil, 237, 363, 373, + 373, 462, 468, 901, 524, 524, nil, nil, nil, nil, + 396, nil, 841, 613, nil, 545, 296, 552, nil, 548, + 297, nil, nil, 286, 332, 296, 664, 290, 530, 297, + 702, nil, 555, 1016, nil, 131, 576, 317, 535, 832, + nil, 332, 317, 314, 534, 717, 1044, 352, 314, nil, + 1026, 549, nil, 1027, 19, 584, nil, 564, 569, 237, + 237, 237, 237, 19, 849, 453, nil, 720, 597, nil, + 965, 474, nil, nil, nil, 541, 537, 720, 577, 578, + 1074, 543, 565, 596, 754, 131, 566, 570, 786, 786, + 1035, 533, nil, 898, 763, nil, nil, nil, nil, nil, + 517, 875, 981, 982, 898, nil, 720, 1009, 800, 520, + 877, 800, 706, nil, 720, 571, nil, 709, nil, nil, + nil, 621, 621, nil, 1078, 848, 945, nil, 822, nil, + nil, 621, nil, 621, 827, 668, nil, 712, nil, nil, + 845, 579, nil, 144, 883, 884, 673, 19, 237, 443, + 237, 237, 443, 237, 661, 918, 680, nil, 443, 237, + 237, nil, 685, nil, 295, nil, 524, 524, 808, 708, + 679, nil, 19, 463, nil, nil, nil, 613, 613, nil, + 818, 820, nil, 767, 898, nil, 823, 825, 933, 456, + 462, 468, 147, nil, 705, 472, 446, nil, 693, nil, + 1056, nil, 786, 786, nil, 680, 446, 446, 237, 237, + 1068, nil, 446, 446, 793, nil, nil, nil, 237, 679, + nil, nil, nil, 552, 678, nil, nil, 295, nil, nil, + 684, 552, nil, nil, nil, nil, nil, 19, nil, 463, + nil, 19, nil, nil, nil, 323, 19, 332, nil, 463, + nil, 728, 456, 845, 806, 332, nil, nil, 673, nil, + 704, 472, 323, 706, 571, nil, 295, nil, nil, nil, + nil, 472, 19, 696, nil, 952, 295, nil, 463, nil, + nil, 237, 19, 19, nil, nil, 463, nil, nil, 860, + 759, 456, nil, nil, 743, 772, 846, 745, nil, 847, + 472, 456, 237, 747, nil, nil, 472, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 621, 919, + 858, nil, 474, nil, 453, 706, nil, nil, 571, nil, + nil, nil, nil, nil, nil, 933, nil, nil, 933, nil, + nil, nil, 872, 997, nil, 446, nil, 477, 1004, 878, + 295, nil, nil, 882, nil, 445, 934, 840, nil, nil, + nil, nil, 463, nil, nil, 445, 445, nil, 6, nil, + 1045, 445, 445, nil, 904, 456, nil, 144, nil, 804, + nil, nil, nil, 673, 472, 732, nil, 9, 805, nil, + nil, 839, 726, nil, nil, 552, 917, 813, nil, nil, + nil, 749, 750, 834, 752, 521, 850, 237, 673, 933, + 885, 817, 524, nil, 680, nil, 1082, 685, nil, 332, + nil, nil, nil, 937, nil, nil, 147, nil, 679, 538, + 332, nil, nil, nil, nil, nil, nil, 857, nil, 861, + nil, nil, nil, nil, nil, 673, 879, nil, nil, nil, + nil, 867, nil, 867, 673, nil, nil, 352, nil, nil, + 19, 563, 950, nil, 438, 890, nil, nil, 323, nil, + 237, 892, nil, 862, 962, nil, 323, nil, nil, nil, + nil, 876, 780, 782, 784, 237, 144, nil, nil, nil, + nil, nil, nil, 880, nil, nil, nil, nil, 19, 673, + 934, 19, nil, 934, 445, nil, 934, nil, 934, 237, + 571, nil, nil, nil, nil, 819, 821, nil, nil, 237, + 915, 824, 826, nil, 19, 524, nil, 890, nil, 237, + nil, nil, 925, nil, nil, nil, nil, nil, 1069, 894, + 1005, 1008, 894, nil, nil, nil, nil, 947, nil, nil, + nil, 834, nil, nil, nil, nil, nil, nil, 352, nil, + 720, nil, nil, nil, nil, nil, nil, 944, nil, nil, + nil, nil, nil, nil, nil, 871, nil, 934, 941, 934, + nil, 934, nil, 934, nil, nil, 19, nil, nil, 686, + 948, 881, 443, 237, 1047, 1042, 19, nil, nil, nil, + 926, nil, 443, 443, 934, nil, 955, nil, 443, 443, + 961, 959, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 890, nil, nil, nil, nil, nil, 699, + nil, nil, nil, 703, nil, 984, 984, 984, nil, 332, + 323, nil, nil, nil, 900, nil, 902, nil, 332, nil, + 713, 323, nil, nil, 920, nil, 716, nil, nil, nil, + nil, 995, 996, nil, nil, nil, nil, 819, 821, 826, + 824, nil, nil, nil, 1007, 734, 1022, 29, nil, 925, + nil, nil, 925, 29, 925, 19, nil, 946, nil, nil, + 19, 237, 1038, 949, 19, nil, nil, 332, 29, 927, + 953, nil, 954, 1048, 857, nil, 957, 29, 29, 29, + nil, 29, nil, nil, nil, 867, nil, nil, nil, 1036, + 295, nil, nil, nil, 19, nil, 1041, nil, nil, nil, + nil, nil, 463, 984, 984, 984, 984, 29, 984, nil, + nil, 443, 29, 29, 894, 456, 29, 926, 472, 867, + 926, nil, 926, 925, 472, 925, nil, 925, nil, 925, + 673, 920, nil, nil, 19, nil, nil, nil, 967, 969, + nil, 971, 973, nil, 974, nil, nil, nil, nil, nil, + 925, nil, 19, nil, nil, nil, 984, 984, 984, 984, + nil, nil, 237, nil, 19, nil, nil, 984, nil, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 29, 29, + 29, 29, 29, nil, 19, 19, nil, nil, nil, nil, + nil, 926, nil, 926, nil, 926, nil, 926, nil, 1017, + nil, 1018, 1046, 1019, nil, nil, nil, nil, nil, nil, + nil, 851, nil, nil, nil, nil, nil, nil, 926, 1028, + nil, 1030, nil, nil, nil, nil, nil, nil, nil, nil, + 993, 985, 987, 989, nil, 19, 19, nil, nil, 1000, + nil, 1075, nil, nil, nil, nil, nil, nil, 19, nil, + nil, nil, 19, nil, nil, 886, nil, nil, 1051, 1052, + 1053, 1054, nil, nil, nil, nil, 29, 29, 29, 29, + 29, 29, 29, nil, nil, 909, nil, 29, 29, 29, + nil, nil, nil, 1077, nil, nil, nil, nil, 1032, nil, + 1079, 29, 1080, 19, 1081, nil, nil, nil, nil, nil, + 19, nil, nil, nil, nil, 19, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1089, nil, 1083, + nil, nil, nil, nil, nil, nil, nil, 29, 29, 1058, + 1060, 1062, 1064, 237, 1065, nil, nil, 29, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, 32, nil, nil, nil, 29, nil, nil, nil, + 29, nil, nil, nil, nil, 29, 958, 32, nil, nil, + nil, nil, nil, nil, 964, nil, 32, 32, 32, nil, + 32, nil, 1085, 1086, 1087, 1088, nil, nil, 975, nil, + nil, 29, nil, 1090, nil, nil, nil, nil, nil, nil, + 29, 29, 29, nil, nil, nil, 32, nil, nil, nil, + nil, 32, 32, nil, nil, 32, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, 32, 32, 32, + 32, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 29, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, 32, 32, 32, 32, + 32, 32, nil, nil, nil, nil, 32, 32, 32, 29, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 29, + 32, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 29, nil, nil, + 29, nil, nil, nil, nil, nil, 32, 32, 29, nil, + nil, nil, nil, nil, nil, nil, 32, nil, 29, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 29, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, 32, + nil, nil, nil, nil, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 32, nil, nil, nil, nil, nil, nil, nil, nil, 32, + 32, 32, nil, nil, nil, 29, nil, nil, nil, nil, + nil, 29, 29, nil, nil, 29, nil, nil, nil, nil, + 32, 29, 29, nil, nil, nil, nil, 29, 29, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, nil, nil, nil, nil, 29, + 29, nil, nil, 29, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 29, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 29, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 32, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 32, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 29, nil, 32, nil, nil, nil, nil, nil, nil, + nil, 29, nil, 29, nil, nil, 32, nil, nil, 32, + nil, nil, nil, nil, nil, nil, nil, 32, nil, nil, + nil, nil, nil, 29, 29, 244, nil, 32, nil, nil, + nil, nil, 32, nil, 294, 294, 294, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 341, 342, nil, + 344, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 29, nil, nil, + nil, 29, nil, nil, 32, nil, nil, nil, nil, nil, + 32, 32, nil, nil, 32, nil, nil, nil, nil, nil, + 32, 32, nil, nil, nil, nil, 32, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, nil, nil, 29, + nil, nil, nil, nil, 29, nil, nil, nil, 16, nil, + nil, nil, nil, nil, 16, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 16, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 32, nil, nil, nil, nil, 32, 32, + nil, nil, 32, nil, nil, nil, nil, nil, 16, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 367, nil, + nil, nil, nil, nil, 294, 448, nil, nil, 454, 294, + nil, nil, 32, nil, 454, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, 32, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 32, nil, 16, 18, 508, nil, nil, nil, + nil, 18, nil, 16, 294, 294, nil, nil, nil, nil, + 32, nil, nil, nil, 294, nil, nil, nil, nil, nil, + 32, 294, 32, 294, nil, nil, 294, 294, nil, 18, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 557, nil, 558, nil, nil, + nil, 294, 294, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 16, nil, 441, + nil, nil, 441, 32, 32, nil, nil, nil, 441, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + 32, nil, 16, nil, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, nil, nil, nil, nil, nil, nil, 20, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, 32, nil, nil, nil, nil, nil, nil, 32, 294, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, 325, 325, nil, 16, nil, nil, + nil, 16, nil, nil, nil, nil, 16, nil, nil, nil, + nil, 32, nil, nil, nil, nil, nil, nil, nil, 20, + nil, nil, nil, 294, nil, 454, 454, 454, nil, 365, + 374, 374, 16, nil, 18, nil, 18, nil, nil, 18, + nil, nil, 16, 16, nil, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 18, + nil, nil, nil, nil, nil, 294, nil, nil, 294, nil, + 294, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, 294, nil, nil, nil, + nil, nil, nil, nil, 20, 454, 727, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, 41, nil, nil, 18, 294, nil, nil, 18, nil, + nil, nil, nil, 18, nil, 294, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + 321, 321, nil, nil, nil, nil, nil, nil, nil, 18, + nil, nil, nil, nil, nil, nil, nil, 294, nil, 18, + 18, nil, nil, nil, nil, 41, nil, nil, 20, nil, + 444, nil, nil, 444, nil, 361, 377, 377, 377, 444, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, 294, 454, 294, + nil, nil, nil, 814, nil, nil, 294, 294, 454, 454, + 16, nil, nil, nil, 454, 454, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, 294, + 41, nil, 294, nil, nil, nil, nil, nil, 16, nil, + nil, 16, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, 20, 294, nil, nil, 325, 20, 294, nil, + nil, 294, nil, nil, 16, nil, nil, nil, nil, nil, + nil, nil, nil, 325, nil, 294, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, 20, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 294, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 16, 18, nil, 294, + nil, nil, 441, nil, nil, nil, 16, 454, nil, 41, + nil, nil, 441, 441, nil, nil, nil, nil, 441, 441, + 454, 454, 454, 454, nil, 923, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, 18, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, 294, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, 41, nil, + nil, nil, 321, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, nil, nil, nil, 321, + 16, nil, nil, nil, 16, nil, nil, nil, nil, 41, + nil, nil, nil, 294, 454, nil, nil, nil, nil, 41, + 41, nil, nil, 18, nil, nil, nil, nil, nil, 18, + nil, nil, nil, 18, 16, nil, nil, nil, nil, 18, + 18, 20, nil, 294, nil, 18, 18, nil, nil, 325, + nil, 441, nil, nil, nil, nil, nil, 325, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 16, nil, nil, nil, nil, 20, + 42, nil, 20, nil, nil, nil, 42, nil, nil, nil, + nil, nil, 16, nil, nil, nil, nil, nil, 294, nil, + nil, nil, nil, nil, 16, 20, nil, nil, nil, nil, + nil, nil, nil, nil, 42, 322, 322, nil, nil, nil, + nil, nil, 18, nil, 16, 16, nil, 18, nil, 294, + nil, 18, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 362, 378, 378, 378, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, nil, nil, 20, nil, nil, + nil, nil, nil, 444, nil, 16, 16, 20, 18, 1003, + nil, nil, nil, 444, 444, nil, nil, nil, 16, 444, + 444, nil, 16, nil, nil, nil, nil, 41, nil, nil, + nil, 18, nil, nil, nil, 321, 42, nil, nil, nil, + nil, nil, nil, 321, nil, 42, nil, nil, nil, 18, + nil, 325, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 18, 325, 16, nil, 41, nil, nil, 41, nil, + 16, nil, nil, nil, nil, 16, nil, nil, nil, nil, + nil, 18, 18, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, 20, nil, nil, nil, + nil, 20, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, 18, 18, 914, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, nil, 18, + nil, nil, 444, 41, 42, nil, nil, nil, nil, nil, + nil, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, 20, nil, nil, nil, 18, nil, nil, + nil, nil, 18, nil, nil, 20, nil, 321, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 321, 42, + nil, nil, nil, 42, nil, 20, 20, 322, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 322, nil, nil, nil, nil, nil, + nil, nil, 41, nil, 42, nil, nil, 41, nil, nil, + nil, 41, nil, nil, 42, 42, nil, nil, nil, nil, + nil, 374, nil, nil, nil, nil, 20, 20, nil, nil, + 1002, nil, nil, nil, nil, nil, nil, nil, nil, 20, + nil, 41, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 374, + nil, 41, nil, nil, 20, nil, nil, nil, nil, nil, + nil, 20, nil, nil, nil, nil, 20, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 377, nil, nil, + nil, nil, 41, 41, nil, nil, 998, nil, nil, nil, + nil, nil, 42, nil, nil, 41, nil, nil, nil, 41, + 322, nil, nil, nil, nil, nil, nil, nil, 322, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, 42, nil, 377, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, 41, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 322, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 322, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, nil, 42, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 378, nil, nil, nil, nil, 42, 42, nil, + nil, 999, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 378, nil, nil, nil, nil, 42, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, nil, 42 ] + +racc_goto_check = [ + 6, 38, 27, 40, 70, 46, 46, 46, 63, 38, + 168, 2, 113, 85, 85, 102, 71, 71, 36, 9, + 33, 52, 118, 87, 15, 9, 33, 22, 22, 10, + 40, 8, 78, 78, 70, 206, 121, 65, 24, 24, + 50, 50, 24, 25, 106, 106, 25, 68, 14, 31, + 31, 76, 25, 31, 59, 82, 82, 82, 167, 84, + 84, 84, 42, 42, 217, 73, 73, 78, 78, 78, + 29, 29, 107, 36, 109, 150, 150, 169, 5, 9, + 71, 51, 51, 51, 64, 145, 88, 60, 118, 88, + 50, 201, 37, 6, 143, 6, 6, 6, 6, 6, + 6, 80, 80, 6, 24, 24, 24, 24, 212, 144, + 71, 185, 157, 17, 155, 31, 31, 31, 31, 83, + 83, 185, 53, 161, 83, 142, 213, 159, 162, 189, + 69, 69, 189, 1, 3, 11, 156, 7, 156, 58, + 58, 58, 13, 16, 5, 9, 18, 190, 20, 190, + 21, 23, 190, 26, 9, 190, 30, 32, 43, 45, + 49, 55, 74, 79, 81, 86, 98, 101, 115, 117, + 122, 123, 124, 125, 126, 127, 128, 129, 80, 130, + 80, 131, 132, 80, 80, 87, 133, 134, 135, 159, + 207, 146, 147, 156, 153, 160, 163, 213, 145, 164, + 46, 27, 27, 165, 37, 27, 31, 31, 166, 161, + 171, 27, 85, 217, 162, 31, 31, 172, 35, 38, + 174, 12, 175, 177, 35, 6, 178, 179, 180, 80, + 181, 184, 113, 14, 71, 186, 187, 88, 88, 35, + 142, 188, 191, 65, 192, 82, 82, 206, 35, 35, + 35, 65, 35, 35, 35, 46, 46, 7, 14, 143, + 157, 155, 193, 143, 194, 46, 195, 68, 196, 199, + 167, 200, 36, 205, 144, 209, 210, 217, 35, 216, + 6, nil, nil, 35, 35, 159, nil, 35, 35, 35, + 35, 50, 50, 212, 6, 6, nil, nil, nil, nil, + 6, nil, 53, 201, nil, 38, 82, 63, nil, 40, + 84, nil, nil, 85, 78, 82, 80, 85, 185, 84, + 169, nil, 38, 156, nil, 118, 24, 14, 9, 37, + nil, 78, 14, 59, 8, 36, 109, 31, 59, nil, + 156, 76, nil, 156, 35, 38, nil, 6, 6, 35, + 35, 35, 35, 35, 37, 75, nil, 50, 31, nil, + 150, 75, nil, nil, nil, 64, 60, 50, 14, 14, + 107, 60, 82, 6, 36, 118, 84, 84, 143, 143, + 17, 5, nil, 207, 36, nil, nil, nil, nil, nil, + 58, 37, 150, 150, 207, nil, 50, 121, 190, 58, + 37, 190, 80, nil, 50, 80, nil, 80, nil, nil, + nil, 206, 206, nil, 156, 65, 83, nil, 52, nil, + nil, 206, nil, 206, 52, 38, nil, 10, nil, nil, + 87, 5, nil, 71, 167, 167, 40, 35, 35, 35, + 35, 35, 35, 35, 22, 37, 85, nil, 35, 35, + 35, nil, 85, nil, 46, nil, 6, 6, 36, 217, + 6, nil, 35, 85, nil, nil, nil, 201, 201, nil, + 33, 33, nil, 12, 207, nil, 33, 33, 206, 6, + 50, 50, 73, nil, 88, 71, 25, nil, 40, nil, + 150, nil, 143, 143, nil, 85, 25, 25, 35, 35, + 15, nil, 25, 25, 80, nil, nil, nil, 35, 6, + nil, nil, nil, 63, 51, nil, nil, 46, nil, nil, + 51, 63, nil, nil, nil, nil, nil, 35, nil, 85, + nil, 35, nil, nil, nil, 35, 35, 78, nil, 85, + nil, 31, 6, 87, 80, 78, nil, nil, 40, nil, + 84, 71, 35, 80, 80, nil, 46, nil, nil, nil, + nil, 71, 35, 51, nil, 106, 46, nil, 85, nil, + nil, 35, 35, 35, nil, nil, 85, nil, nil, 29, + 42, 6, nil, nil, 14, 31, 80, 14, nil, 80, + 71, 6, 35, 118, nil, nil, 71, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 206, 33, + 80, nil, 75, nil, 75, 80, nil, nil, 80, nil, + nil, nil, nil, nil, nil, 206, nil, nil, 206, nil, + nil, nil, 80, 106, nil, 25, nil, 61, 106, 12, + 46, nil, nil, 12, nil, 27, 208, 102, nil, nil, + nil, nil, 85, nil, nil, 27, 27, nil, 6, nil, + 113, 27, 27, nil, 80, 6, nil, 71, nil, 2, + nil, nil, nil, 40, 71, 100, nil, 9, 22, nil, + nil, 168, 75, nil, nil, 63, 80, 9, nil, nil, + nil, 100, 100, 6, 100, 61, 63, 35, 40, 206, + 70, 84, 6, nil, 85, nil, 37, 85, nil, 78, + nil, nil, nil, 12, nil, nil, 73, nil, 6, 61, + 78, nil, nil, nil, nil, nil, nil, 6, nil, 6, + nil, nil, nil, nil, nil, 40, 24, nil, nil, nil, + nil, 6, nil, 6, 40, nil, nil, 31, nil, nil, + 35, 61, 80, nil, 82, 40, nil, nil, 35, nil, + 35, 149, nil, 84, 12, nil, 35, nil, nil, nil, + nil, 14, 204, 204, 204, 35, 71, nil, nil, nil, + nil, nil, nil, 118, nil, nil, nil, nil, 35, 40, + 208, 35, nil, 208, 27, nil, 208, nil, 208, 35, + 80, nil, nil, nil, nil, 75, 75, nil, nil, 35, + 14, 75, 75, nil, 35, 6, nil, 40, nil, 35, + nil, nil, 149, nil, nil, nil, nil, nil, 36, 151, + 80, 12, 151, nil, nil, nil, nil, 24, nil, nil, + nil, 6, nil, nil, nil, nil, nil, nil, 31, nil, + 50, nil, nil, nil, nil, nil, nil, 6, nil, nil, + nil, nil, nil, nil, nil, 100, nil, 208, 14, 208, + nil, 208, nil, 208, nil, nil, 35, nil, nil, 61, + 14, 100, 35, 35, 12, 80, 35, nil, nil, nil, + 151, nil, 35, 35, 208, nil, 118, nil, 35, 35, + 14, 118, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 40, nil, nil, nil, nil, nil, 61, + nil, nil, nil, 61, nil, 6, 6, 6, nil, 78, + 35, nil, nil, nil, 154, nil, 154, nil, 78, nil, + 61, 35, nil, nil, 75, nil, 61, nil, nil, nil, + nil, 14, 14, nil, nil, nil, nil, 75, 75, 75, + 75, nil, nil, nil, 14, 61, 149, 54, nil, 149, + nil, nil, 149, 54, 149, 35, nil, 100, nil, nil, + 35, 35, 38, 100, 35, nil, nil, 78, 54, 154, + 100, nil, 100, 40, 6, nil, 100, 54, 54, 54, + nil, 54, nil, nil, nil, 6, nil, nil, nil, 14, + 46, nil, nil, nil, 35, nil, 14, nil, nil, nil, + nil, nil, 85, 6, 6, 6, 6, 54, 6, nil, + nil, 35, 54, 54, 151, 6, 54, 151, 71, 6, + 151, nil, 151, 149, 71, 149, nil, 149, nil, 149, + 40, 75, nil, nil, 35, nil, nil, nil, 204, 204, + nil, 204, 204, nil, 204, nil, nil, nil, nil, nil, + 149, nil, 35, nil, nil, nil, 6, 6, 6, 6, + nil, nil, 35, nil, 35, nil, nil, 6, nil, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 54, 54, + 54, 54, 54, nil, 35, 35, nil, nil, nil, nil, + nil, 151, nil, 151, nil, 151, nil, 151, nil, 154, + nil, 154, 100, 154, nil, nil, nil, nil, nil, nil, + nil, 61, nil, nil, nil, nil, nil, nil, 151, 154, + nil, 154, nil, nil, nil, nil, nil, nil, nil, nil, + 35, 152, 152, 152, nil, 35, 35, nil, nil, 35, + nil, 100, nil, nil, nil, nil, nil, nil, 35, nil, + nil, nil, 35, nil, nil, 61, nil, nil, 204, 204, + 204, 204, nil, nil, nil, nil, 54, 54, 54, 54, + 54, 54, 54, nil, nil, 61, nil, 54, 54, 54, + nil, nil, nil, 154, nil, nil, nil, nil, 35, nil, + 154, 54, 154, 35, 154, nil, nil, nil, nil, nil, + 35, nil, nil, nil, nil, 35, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 154, nil, 204, + nil, nil, nil, nil, nil, nil, nil, 54, 54, 152, + 152, 152, 152, 35, 152, nil, nil, 54, nil, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, 57, nil, nil, nil, 54, nil, nil, nil, + 54, nil, nil, nil, nil, 54, 61, 57, nil, nil, + nil, nil, nil, nil, 61, nil, 57, 57, 57, nil, + 57, nil, 152, 152, 152, 152, nil, nil, 61, nil, + nil, 54, nil, 152, nil, nil, nil, nil, nil, nil, + 54, 54, 54, nil, nil, nil, 57, nil, nil, nil, + nil, 57, 57, nil, nil, 57, nil, nil, nil, nil, + nil, 54, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, nil, nil, nil, nil, 57, 57, 57, + 57, 57, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 54, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, 57, 57, 57, 57, + 57, 57, nil, nil, nil, nil, 57, 57, 57, 54, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 54, + 57, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 54, nil, nil, nil, nil, nil, 57, 57, 54, nil, + nil, nil, nil, nil, nil, nil, 57, nil, 54, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 54, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, 57, + nil, nil, nil, nil, 57, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 57, nil, nil, nil, nil, nil, nil, nil, nil, 57, + 57, 57, nil, nil, nil, 54, nil, nil, nil, nil, + nil, 54, 54, nil, nil, 54, nil, nil, nil, nil, + 57, 54, 54, nil, nil, nil, nil, 54, 54, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, nil, nil, nil, nil, 54, + 54, nil, nil, 54, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 54, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 54, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 57, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 57, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 54, nil, 57, nil, nil, nil, nil, nil, nil, + nil, 54, nil, 54, nil, nil, 57, nil, nil, 57, + nil, nil, nil, nil, nil, nil, nil, 57, nil, nil, + nil, nil, nil, 54, 54, 41, nil, 57, nil, nil, + nil, nil, 57, nil, 41, 41, 41, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, 41, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, 54, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 54, nil, nil, + nil, 54, nil, nil, 57, nil, nil, nil, nil, nil, + 57, 57, nil, nil, 57, nil, nil, nil, nil, nil, + 57, 57, nil, nil, nil, nil, 57, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, nil, nil, nil, nil, 54, + nil, nil, nil, nil, 54, nil, nil, nil, 28, nil, + nil, nil, nil, nil, 28, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 28, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 57, nil, nil, nil, nil, 57, 57, + nil, nil, 57, nil, nil, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 28, nil, + nil, nil, nil, nil, 41, 41, nil, nil, 41, 41, + nil, nil, 57, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, 57, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 57, nil, 28, 34, 41, nil, nil, nil, + nil, 34, nil, 28, 41, 41, nil, nil, nil, nil, + 57, nil, nil, nil, 41, nil, nil, nil, nil, nil, + 57, 41, 57, 41, nil, nil, 41, 41, nil, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 41, nil, nil, + nil, 41, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 28, nil, 28, + nil, nil, 28, 57, 57, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + 57, nil, 28, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, 57, nil, nil, nil, nil, nil, nil, 57, 41, + nil, nil, nil, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, 39, 39, nil, 28, nil, nil, + nil, 28, nil, nil, nil, nil, 28, nil, nil, nil, + nil, 57, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, 41, nil, 41, 41, 41, nil, 39, + 39, 39, 28, nil, 34, nil, 34, nil, nil, 34, + nil, nil, 28, 28, nil, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, 41, nil, nil, 41, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 39, 41, nil, nil, nil, + nil, nil, nil, nil, 39, 41, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, 66, nil, nil, 34, 41, nil, nil, 34, nil, + nil, nil, nil, 34, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 66, + 66, 66, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, nil, nil, 41, nil, 34, + 34, nil, nil, nil, nil, 66, nil, nil, 39, nil, + 39, nil, nil, 39, nil, 66, 66, 66, 66, 39, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, nil, nil, nil, 41, 41, 41, + nil, nil, nil, 41, nil, nil, 41, 41, 41, 41, + 28, nil, nil, nil, 41, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, 41, + 66, nil, 41, nil, nil, nil, nil, nil, 28, nil, + nil, 28, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, 39, 41, nil, nil, 39, 39, 41, nil, + nil, 41, nil, nil, 28, nil, nil, nil, nil, nil, + nil, nil, nil, 39, nil, 41, nil, nil, nil, nil, + nil, nil, nil, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, 39, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 28, 34, nil, 41, + nil, nil, 28, nil, nil, nil, 28, 41, nil, 66, + nil, nil, 28, 28, nil, nil, nil, nil, 28, 28, + 41, 41, 41, 41, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, 34, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, 66, nil, + nil, nil, 66, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, nil, nil, 66, + 28, nil, nil, nil, 28, nil, nil, nil, nil, 66, + nil, nil, nil, 41, 41, nil, nil, nil, nil, 66, + 66, nil, nil, 34, nil, nil, nil, nil, nil, 34, + nil, nil, nil, 34, 28, nil, nil, nil, nil, 34, + 34, 39, nil, 41, nil, 34, 34, nil, nil, 39, + nil, 28, nil, nil, nil, nil, nil, 39, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 28, nil, nil, nil, nil, 39, + 67, nil, 39, nil, nil, nil, 67, nil, nil, nil, + nil, nil, 28, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, 28, 39, nil, nil, nil, nil, + nil, nil, nil, nil, 67, 67, 67, nil, nil, nil, + nil, nil, 34, nil, 28, 28, nil, 34, nil, 41, + nil, 34, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, 67, 67, 67, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, nil, nil, 39, nil, nil, + nil, nil, nil, 39, nil, 28, 28, 39, 34, 28, + nil, nil, nil, 39, 39, nil, nil, nil, 28, 39, + 39, nil, 28, nil, nil, nil, nil, 66, nil, nil, + nil, 34, nil, nil, nil, 66, 67, nil, nil, nil, + nil, nil, nil, 66, nil, 67, nil, nil, nil, 34, + nil, 39, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 34, 39, 28, nil, 66, nil, nil, 66, nil, + 28, nil, nil, nil, nil, 28, nil, nil, nil, nil, + nil, 34, 34, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, 39, nil, nil, nil, + nil, 39, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, 34, 34, 39, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, 34, + nil, nil, 39, 66, 67, nil, nil, nil, nil, nil, + nil, nil, nil, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, 39, nil, nil, nil, 34, nil, nil, + nil, nil, 34, nil, nil, 39, nil, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 66, 67, + nil, nil, nil, 67, nil, 39, 39, 67, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, 66, nil, 67, nil, nil, 66, nil, nil, + nil, 66, nil, nil, 67, 67, nil, nil, nil, nil, + nil, 39, nil, nil, nil, nil, 39, 39, nil, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, 66, nil, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, 66, nil, nil, 39, nil, nil, nil, nil, nil, + nil, 39, nil, nil, nil, nil, 39, nil, nil, 66, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, 66, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, 66, 66, nil, nil, 66, nil, nil, nil, + nil, nil, 67, nil, nil, 66, nil, nil, nil, 66, + 67, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, 67, nil, 66, nil, nil, nil, nil, + 66, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, 66, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, 67, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, 67, 67, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, 67, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, 67 ] + +racc_goto_pointer = [ + nil, 133, 9, 134, nil, 73, -2, 129, 26, 17, + -109, 125, -125, -285, 12, -536, -586, -616, -706, nil, + -386, -163, 16, 139, -29, -180, 81, -21, 1976, -152, + -66, -18, 18, -206, 2103, 216, -209, -363, -18, 2247, + -19, 1832, -7, -418, nil, -587, -27, nil, nil, 133, + -188, 52, -260, -396, 965, -353, nil, 1264, 107, 18, + 51, 403, nil, -29, 46, -299, 2403, 2818, -324, 57, + -71, 5, nil, 54, -270, 129, 7, nil, -5, 116, + -121, -185, 23, -446, 27, -16, -346, -274, -437, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 91, nil, + 114, -183, -50, nil, nil, nil, -309, -671, nil, -671, + nil, nil, nil, -347, nil, 96, nil, -206, 17, nil, + nil, -563, 95, -219, 111, 111, -173, 112, 112, -417, + -418, -699, -197, -203, -413, -697, nil, nil, nil, nil, + nil, nil, -781, -528, -513, -822, -715, -644, nil, -14, + -532, 54, 224, -642, 153, -722, -643, -583, nil, -647, + -768, -840, -835, -197, -574, 114, -396, -335, -15, -199, + nil, -77, -71, nil, -481, -531, nil, -287, -781, -355, + -503, -629, nil, nil, 139, 16, 138, 138, 142, -273, + -250, 142, 143, 160, -533, -374, -373, nil, nil, 164, + -324, -302, nil, nil, 162, -506, -358, -589, -190, -500, + -704, nil, -673, -860, nil, nil, -113, -462 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 309, 7, 360, 312, + nil, nil, nil, nil, 560, nil, nil, nil, nil, 308, + 310, nil, nil, nil, nil, 14, 15, 21, 242, nil, + nil, 17, nil, 442, 243, 340, nil, nil, 592, 241, + 478, 24, nil, nil, 355, nil, 25, 26, 27, nil, + 723, nil, nil, nil, 329, nil, 28, 326, 457, 35, + nil, nil, 37, 40, 39, nil, 238, 239, 372, nil, + 146, 465, 145, 91, nil, 447, 107, 47, 50, 274, + 300, nil, 458, nil, 459, 470, 681, 522, 298, 283, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, + nil, nil, 284, 65, 66, 67, nil, nil, 68, 865, + 69, 70, 71, nil, 72, nil, 73, nil, 573, 74, + 75, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 288, 276, 731, 856, + 582, 866, 788, 620, nil, 789, 790, 1024, 924, 608, + nil, 609, nil, nil, 610, nil, 612, nil, 835, nil, + nil, nil, 618, nil, nil, nil, nil, nil, nil, nil, + 469, nil, nil, 701, nil, nil, 510, nil, nil, nil, + nil, nil, 90, 92, 94, nil, nil, nil, nil, nil, + 638, nil, nil, nil, nil, nil, nil, 103, 104, nil, + nil, 895, 770, 607, nil, 611, 903, 623, 625, 626, + 935, 629, 630, 936, 633, 636, nil, 303 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 3, 151, :_reduce_6, + 2, 151, :_reduce_none, + 1, 154, :_reduce_none, + 0, 158, :_reduce_9, + 3, 154, :_reduce_10, + 0, 160, :_reduce_11, + 4, 157, :_reduce_12, + 0, 165, :_reduce_13, + 6, 159, :_reduce_14, + 3, 159, :_reduce_15, + 2, 161, :_reduce_16, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 3, 166, :_reduce_19, + 2, 166, :_reduce_20, + 1, 167, :_reduce_none, + 0, 168, :_reduce_22, + 3, 167, :_reduce_23, + 0, 179, :_reduce_24, + 4, 156, :_reduce_25, + 3, 156, :_reduce_26, + 3, 156, :_reduce_27, + 3, 156, :_reduce_28, + 2, 156, :_reduce_29, + 3, 156, :_reduce_30, + 3, 156, :_reduce_31, + 3, 156, :_reduce_32, + 3, 156, :_reduce_33, + 3, 156, :_reduce_34, + 4, 156, :_reduce_35, + 1, 156, :_reduce_none, + 3, 156, :_reduce_37, + 3, 156, :_reduce_38, + 3, 156, :_reduce_39, + 1, 156, :_reduce_none, + 3, 172, :_reduce_41, + 3, 172, :_reduce_42, + 6, 172, :_reduce_43, + 5, 172, :_reduce_44, + 5, 172, :_reduce_45, + 5, 172, :_reduce_46, + 5, 172, :_reduce_47, + 3, 172, :_reduce_48, + 1, 180, :_reduce_49, + 3, 180, :_reduce_50, + 1, 180, :_reduce_none, + 1, 178, :_reduce_none, + 3, 178, :_reduce_53, + 3, 178, :_reduce_54, + 3, 178, :_reduce_55, + 2, 178, :_reduce_56, + 1, 178, :_reduce_none, + 1, 171, :_reduce_58, + 0, 191, :_reduce_59, + 0, 192, :_reduce_60, + 4, 189, :_reduce_61, + 1, 174, :_reduce_none, + 1, 174, :_reduce_none, + 1, 194, :_reduce_none, + 4, 194, :_reduce_65, + 0, 202, :_reduce_66, + 4, 199, :_reduce_67, + 1, 201, :_reduce_68, + 2, 193, :_reduce_69, + 3, 193, :_reduce_70, + 4, 193, :_reduce_71, + 5, 193, :_reduce_72, + 4, 193, :_reduce_73, + 5, 193, :_reduce_74, + 2, 193, :_reduce_75, + 2, 193, :_reduce_76, + 2, 193, :_reduce_77, + 2, 193, :_reduce_78, + 2, 193, :_reduce_79, + 1, 173, :_reduce_none, + 3, 173, :_reduce_81, + 1, 207, :_reduce_none, + 3, 207, :_reduce_83, + 1, 206, :_reduce_84, + 2, 206, :_reduce_85, + 3, 206, :_reduce_86, + 5, 206, :_reduce_87, + 2, 206, :_reduce_88, + 4, 206, :_reduce_89, + 2, 206, :_reduce_90, + 4, 206, :_reduce_91, + 1, 206, :_reduce_92, + 3, 206, :_reduce_93, + 1, 210, :_reduce_none, + 3, 210, :_reduce_95, + 2, 209, :_reduce_96, + 3, 209, :_reduce_97, + 1, 212, :_reduce_98, + 3, 212, :_reduce_99, + 1, 211, :_reduce_100, + 1, 211, :_reduce_101, + 4, 211, :_reduce_102, + 3, 211, :_reduce_103, + 3, 211, :_reduce_104, + 3, 211, :_reduce_105, + 3, 211, :_reduce_106, + 2, 211, :_reduce_107, + 1, 211, :_reduce_108, + 1, 175, :_reduce_109, + 1, 175, :_reduce_110, + 4, 175, :_reduce_111, + 3, 175, :_reduce_112, + 3, 175, :_reduce_113, + 3, 175, :_reduce_114, + 3, 175, :_reduce_115, + 2, 175, :_reduce_116, + 1, 175, :_reduce_117, + 1, 215, :_reduce_118, + 1, 215, :_reduce_none, + 2, 216, :_reduce_120, + 1, 216, :_reduce_121, + 3, 216, :_reduce_122, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_126, + 1, 217, :_reduce_none, + 1, 169, :_reduce_128, + 1, 169, :_reduce_none, + 1, 170, :_reduce_130, + 0, 221, :_reduce_131, + 4, 170, :_reduce_132, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 3, 188, :_reduce_204, + 3, 188, :_reduce_205, + 6, 188, :_reduce_206, + 5, 188, :_reduce_207, + 5, 188, :_reduce_208, + 5, 188, :_reduce_209, + 5, 188, :_reduce_210, + 4, 188, :_reduce_211, + 3, 188, :_reduce_212, + 3, 188, :_reduce_213, + 3, 188, :_reduce_214, + 3, 188, :_reduce_215, + 3, 188, :_reduce_216, + 3, 188, :_reduce_217, + 3, 188, :_reduce_218, + 3, 188, :_reduce_219, + 3, 188, :_reduce_220, + 4, 188, :_reduce_221, + 2, 188, :_reduce_222, + 2, 188, :_reduce_223, + 3, 188, :_reduce_224, + 3, 188, :_reduce_225, + 3, 188, :_reduce_226, + 3, 188, :_reduce_227, + 1, 188, :_reduce_none, + 3, 188, :_reduce_229, + 3, 188, :_reduce_230, + 3, 188, :_reduce_231, + 3, 188, :_reduce_232, + 3, 188, :_reduce_233, + 2, 188, :_reduce_234, + 2, 188, :_reduce_235, + 3, 188, :_reduce_236, + 3, 188, :_reduce_237, + 3, 188, :_reduce_238, + 3, 188, :_reduce_239, + 3, 188, :_reduce_240, + 6, 188, :_reduce_241, + 1, 188, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 3, 224, :_reduce_247, + 3, 224, :_reduce_248, + 1, 227, :_reduce_249, + 1, 228, :_reduce_none, + 2, 228, :_reduce_251, + 4, 228, :_reduce_252, + 2, 228, :_reduce_253, + 1, 222, :_reduce_none, + 3, 222, :_reduce_255, + 3, 232, :_reduce_256, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 2, 183, :_reduce_261, + 4, 183, :_reduce_262, + 2, 183, :_reduce_263, + 1, 205, :_reduce_264, + 2, 205, :_reduce_265, + 2, 205, :_reduce_266, + 4, 205, :_reduce_267, + 1, 205, :_reduce_268, + 0, 236, :_reduce_269, + 2, 198, :_reduce_270, + 2, 235, :_reduce_271, + 2, 234, :_reduce_272, + 1, 234, :_reduce_none, + 1, 229, :_reduce_274, + 2, 229, :_reduce_275, + 3, 229, :_reduce_276, + 4, 229, :_reduce_277, + 1, 177, :_reduce_278, + 1, 177, :_reduce_279, + 3, 176, :_reduce_280, + 4, 176, :_reduce_281, + 2, 176, :_reduce_282, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_293, + 0, 271, :_reduce_294, + 4, 225, :_reduce_295, + 0, 272, :_reduce_296, + 3, 225, :_reduce_297, + 0, 273, :_reduce_298, + 4, 225, :_reduce_299, + 3, 225, :_reduce_300, + 3, 225, :_reduce_301, + 2, 225, :_reduce_302, + 0, 274, :_reduce_303, + 4, 225, :_reduce_304, + 0, 275, :_reduce_305, + 4, 225, :_reduce_306, + 1, 225, :_reduce_307, + 4, 225, :_reduce_308, + 3, 225, :_reduce_309, + 1, 225, :_reduce_310, + 5, 225, :_reduce_311, + 4, 225, :_reduce_312, + 3, 225, :_reduce_313, + 2, 225, :_reduce_314, + 1, 225, :_reduce_none, + 2, 225, :_reduce_316, + 1, 225, :_reduce_317, + 6, 225, :_reduce_318, + 6, 225, :_reduce_319, + 4, 225, :_reduce_320, + 4, 225, :_reduce_321, + 5, 225, :_reduce_322, + 4, 225, :_reduce_323, + 6, 225, :_reduce_324, + 0, 276, :_reduce_325, + 6, 225, :_reduce_326, + 0, 277, :_reduce_327, + 0, 278, :_reduce_328, + 8, 225, :_reduce_329, + 0, 279, :_reduce_330, + 5, 225, :_reduce_331, + 0, 280, :_reduce_332, + 6, 225, :_reduce_333, + 0, 281, :_reduce_334, + 0, 282, :_reduce_335, + 9, 225, :_reduce_336, + 1, 225, :_reduce_337, + 1, 225, :_reduce_338, + 1, 225, :_reduce_339, + 1, 225, :_reduce_340, + 1, 182, :_reduce_341, + 1, 246, :_reduce_none, + 1, 252, :_reduce_none, + 1, 255, :_reduce_none, + 1, 257, :_reduce_none, + 1, 258, :_reduce_none, + 1, 259, :_reduce_none, + 1, 261, :_reduce_none, + 1, 263, :_reduce_349, + 1, 266, :_reduce_350, + 1, 267, :_reduce_351, + 1, 283, :_reduce_none, + 1, 284, :_reduce_none, + 1, 285, :_reduce_none, + 1, 286, :_reduce_none, + 1, 287, :_reduce_none, + 1, 163, :_reduce_none, + 1, 288, :_reduce_none, + 1, 247, :_reduce_none, + 1, 204, :_reduce_none, + 1, 253, :_reduce_none, + 1, 253, :_reduce_none, + 2, 253, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 254, :_reduce_none, + 5, 254, :_reduce_367, + 1, 256, :_reduce_none, + 2, 256, :_reduce_369, + 1, 262, :_reduce_none, + 1, 262, :_reduce_371, + 1, 289, :_reduce_none, + 3, 289, :_reduce_373, + 1, 292, :_reduce_374, + 3, 292, :_reduce_375, + 1, 291, :_reduce_376, + 3, 291, :_reduce_377, + 5, 291, :_reduce_378, + 1, 291, :_reduce_379, + 3, 291, :_reduce_380, + 2, 293, :_reduce_381, + 1, 293, :_reduce_382, + 4, 294, :_reduce_383, + 2, 294, :_reduce_384, + 2, 294, :_reduce_385, + 1, 294, :_reduce_386, + 2, 299, :_reduce_387, + 1, 299, :_reduce_none, + 6, 300, :_reduce_389, + 8, 300, :_reduce_390, + 4, 300, :_reduce_391, + 6, 300, :_reduce_392, + 4, 300, :_reduce_393, + 2, 300, :_reduce_394, + 6, 300, :_reduce_395, + 2, 300, :_reduce_396, + 4, 300, :_reduce_397, + 6, 300, :_reduce_398, + 2, 300, :_reduce_399, + 4, 300, :_reduce_400, + 2, 300, :_reduce_401, + 4, 300, :_reduce_402, + 1, 300, :_reduce_403, + 1, 304, :_reduce_404, + 1, 304, :_reduce_405, + 3, 305, :_reduce_406, + 1, 305, :_reduce_407, + 4, 305, :_reduce_408, + 1, 306, :_reduce_none, + 4, 306, :_reduce_410, + 1, 307, :_reduce_411, + 3, 307, :_reduce_412, + 1, 308, :_reduce_413, + 1, 308, :_reduce_none, + 0, 312, :_reduce_415, + 0, 313, :_reduce_416, + 5, 251, :_reduce_417, + 4, 310, :_reduce_418, + 1, 310, :_reduce_419, + 3, 311, :_reduce_420, + 3, 311, :_reduce_421, + 3, 315, :_reduce_422, + 2, 195, :_reduce_423, + 4, 195, :_reduce_424, + 5, 195, :_reduce_425, + 5, 195, :_reduce_426, + 2, 250, :_reduce_427, + 4, 250, :_reduce_428, + 4, 250, :_reduce_429, + 3, 250, :_reduce_430, + 3, 250, :_reduce_431, + 3, 250, :_reduce_432, + 2, 250, :_reduce_433, + 1, 250, :_reduce_434, + 4, 250, :_reduce_435, + 0, 318, :_reduce_436, + 4, 249, :_reduce_437, + 0, 319, :_reduce_438, + 4, 249, :_reduce_439, + 0, 320, :_reduce_440, + 0, 321, :_reduce_441, + 4, 200, :_reduce_442, + 0, 323, :_reduce_443, + 0, 324, :_reduce_444, + 4, 316, :_reduce_445, + 1, 322, :_reduce_446, + 2, 322, :_reduce_447, + 3, 322, :_reduce_448, + 4, 322, :_reduce_449, + 0, 326, :_reduce_450, + 6, 260, :_reduce_451, + 1, 325, :_reduce_none, + 1, 325, :_reduce_none, + 6, 162, :_reduce_454, + 0, 162, :_reduce_455, + 1, 327, :_reduce_456, + 1, 327, :_reduce_none, + 1, 327, :_reduce_none, + 2, 328, :_reduce_459, + 1, 328, :_reduce_none, + 2, 164, :_reduce_461, + 1, 164, :_reduce_none, + 1, 237, :_reduce_463, + 1, 237, :_reduce_none, + 1, 238, :_reduce_465, + 1, 330, :_reduce_466, + 1, 330, :_reduce_none, + 2, 330, :_reduce_468, + 3, 331, :_reduce_469, + 1, 331, :_reduce_470, + 3, 239, :_reduce_471, + 3, 240, :_reduce_472, + 3, 241, :_reduce_473, + 3, 241, :_reduce_474, + 1, 335, :_reduce_475, + 3, 335, :_reduce_476, + 1, 336, :_reduce_none, + 2, 336, :_reduce_478, + 3, 243, :_reduce_479, + 3, 243, :_reduce_480, + 1, 338, :_reduce_481, + 3, 338, :_reduce_482, + 3, 242, :_reduce_483, + 3, 242, :_reduce_484, + 3, 244, :_reduce_485, + 3, 244, :_reduce_486, + 1, 339, :_reduce_487, + 3, 339, :_reduce_488, + 1, 340, :_reduce_489, + 3, 340, :_reduce_490, + 1, 332, :_reduce_491, + 2, 332, :_reduce_492, + 1, 333, :_reduce_493, + 2, 333, :_reduce_494, + 1, 334, :_reduce_495, + 2, 334, :_reduce_496, + 1, 337, :_reduce_497, + 0, 342, :_reduce_498, + 3, 337, :_reduce_499, + 0, 343, :_reduce_500, + 4, 337, :_reduce_501, + 1, 341, :_reduce_502, + 1, 341, :_reduce_503, + 1, 341, :_reduce_504, + 1, 341, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 2, 344, :_reduce_508, + 1, 344, :_reduce_509, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 3, 345, :_reduce_514, + 1, 329, :_reduce_none, + 2, 329, :_reduce_516, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 214, :_reduce_526, + 1, 214, :_reduce_527, + 1, 214, :_reduce_528, + 1, 214, :_reduce_529, + 1, 214, :_reduce_530, + 1, 214, :_reduce_531, + 1, 214, :_reduce_532, + 1, 245, :_reduce_533, + 1, 245, :_reduce_534, + 1, 181, :_reduce_535, + 1, 181, :_reduce_536, + 1, 186, :_reduce_537, + 1, 186, :_reduce_538, + 0, 347, :_reduce_539, + 4, 264, :_reduce_540, + 1, 264, :_reduce_541, + 3, 268, :_reduce_542, + 0, 349, :_reduce_543, + 3, 268, :_reduce_544, + 4, 348, :_reduce_545, + 2, 348, :_reduce_546, + 2, 348, :_reduce_547, + 1, 348, :_reduce_none, + 2, 351, :_reduce_549, + 0, 351, :_reduce_550, + 6, 314, :_reduce_551, + 8, 314, :_reduce_552, + 4, 314, :_reduce_553, + 6, 314, :_reduce_554, + 4, 314, :_reduce_555, + 6, 314, :_reduce_556, + 2, 314, :_reduce_557, + 4, 314, :_reduce_558, + 6, 314, :_reduce_559, + 2, 314, :_reduce_560, + 4, 314, :_reduce_561, + 2, 314, :_reduce_562, + 4, 314, :_reduce_563, + 1, 314, :_reduce_564, + 0, 314, :_reduce_565, + 1, 309, :_reduce_566, + 1, 309, :_reduce_567, + 1, 309, :_reduce_568, + 1, 309, :_reduce_569, + 1, 290, :_reduce_none, + 1, 290, :_reduce_571, + 1, 353, :_reduce_none, + 1, 354, :_reduce_none, + 3, 354, :_reduce_574, + 1, 301, :_reduce_575, + 3, 301, :_reduce_576, + 1, 355, :_reduce_none, + 2, 356, :_reduce_578, + 1, 356, :_reduce_579, + 2, 357, :_reduce_580, + 1, 357, :_reduce_581, + 1, 295, :_reduce_none, + 3, 295, :_reduce_583, + 1, 350, :_reduce_none, + 3, 350, :_reduce_585, + 1, 358, :_reduce_none, + 1, 358, :_reduce_none, + 2, 296, :_reduce_588, + 1, 296, :_reduce_589, + 3, 359, :_reduce_590, + 3, 360, :_reduce_591, + 1, 302, :_reduce_592, + 3, 302, :_reduce_593, + 1, 352, :_reduce_594, + 3, 352, :_reduce_595, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 2, 303, :_reduce_598, + 1, 303, :_reduce_599, + 1, 362, :_reduce_none, + 1, 362, :_reduce_none, + 2, 298, :_reduce_602, + 2, 297, :_reduce_603, + 0, 297, :_reduce_604, + 1, 269, :_reduce_none, + 0, 363, :_reduce_606, + 4, 269, :_reduce_607, + 1, 248, :_reduce_608, + 2, 248, :_reduce_none, + 1, 231, :_reduce_none, + 3, 231, :_reduce_611, + 3, 364, :_reduce_612, + 2, 364, :_reduce_613, + 4, 364, :_reduce_614, + 2, 364, :_reduce_615, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 317, :_reduce_none, + 1, 317, :_reduce_none, + 1, 317, :_reduce_none, + 1, 270, :_reduce_none, + 1, 270, :_reduce_none, + 1, 185, :_reduce_none, + 1, 185, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 187, :_reduce_none, + 1, 187, :_reduce_none, + 2, 208, :_reduce_636, + 2, 184, :_reduce_637, + 0, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 265, :_reduce_641, + 1, 265, :_reduce_none, + 1, 155, :_reduce_none, + 2, 155, :_reduce_644, + 0, 153, :_reduce_645 ] + +racc_reduce_n = 646 + +racc_shift_n = 1091 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLONELY => 142, + :tLOWEST => 143, + :tEQL => 144, + :tBDOT2 => 145, + :tBDOT3 => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLONELY", + "tLOWEST", + "tEQL", + "tBDOT2", + "tBDOT3", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "@3", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@4", + "stmts", + "stmt_or_begin", + "@5", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@6", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@7", + "@8", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@9", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@10", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@11", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "dot_or_colon", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "@23", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@24", + "@25", + "f_args", + "do_block", + "do_body", + "operation3", + "@26", + "@27", + "@28", + "@29", + "case_args", + "@30", + "@31", + "cases", + "@32", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "@34", + "ssym", + "dsym", + "sym", + "@35", + "args_tail", + "@36", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@37", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_12(val, _values, result) + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_13(val, _values, result) + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + + result +end + +def _reduce_14(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_15(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_16(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 17 omitted + +# reduce 18 omitted + +def _reduce_19(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_20(val, _values, result) + result = val[1] + debug 12 + + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_23(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_24(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_25(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_27(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_28(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_29(val, _values, result) + result = val[1] + + result +end + +def _reduce_30(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_31(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_33(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_34(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_35(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_38(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_49(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +def _reduce_50(val, _values, result) + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_54(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_55(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_56(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +# reduce 57 omitted + +def _reduce_58(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_59(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_60(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_61(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 62 omitted + +# reduce 63 omitted + +# reduce 64 omitted + +def _reduce_65(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_66(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_67(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_68(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_69(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_70(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_71(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_72(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_73(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_74(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_75(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_76(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_77(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_78(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_79(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 80 omitted + +def _reduce_81(val, _values, result) + result = val[1] + + result +end + +# reduce 82 omitted + +def _reduce_83(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_84(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_85(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_86(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_87(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_88(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_89(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_90(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_91(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_92(val, _values, result) + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_93(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 94 omitted + +def _reduce_95(val, _values, result) + result = val[1] + + result +end + +def _reduce_96(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_97(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_98(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_99(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_100(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_101(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_102(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_103(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_104(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_105(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_106(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_107(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_108(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_109(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_110(val, _values, result) + var, = val + + result = self.assignable var + + debug 16 + + result +end + +def _reduce_111(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_112(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_113(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_114(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_115(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_116(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_117(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_118(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 119 omitted + +def _reduce_120(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_121(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_122(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +def _reduce_126(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 127 omitted + +def _reduce_128(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 129 omitted + +def _reduce_130(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_131(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_132(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +def _reduce_204(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_205(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_206(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_207(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_208(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_209(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_210(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_211(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_212(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_213(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_214(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_215(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_216(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_217(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_221(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_222(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_223(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_224(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 228 omitted + +def _reduce_229(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_232(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_233(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_234(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_235(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_236(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_238(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_239(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_240(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_241(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +# reduce 242 omitted + +# reduce 243 omitted + +# reduce 244 omitted + +# reduce 245 omitted + +# reduce 246 omitted + +def _reduce_247(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_248(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_249(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 250 omitted + +def _reduce_251(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_252(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_253(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 254 omitted + +def _reduce_255(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_256(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +# reduce 257 omitted + +# reduce 258 omitted + +# reduce 259 omitted + +# reduce 260 omitted + +def _reduce_261(val, _values, result) + result = args val + + result +end + +def _reduce_262(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_263(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_264(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_265(val, _values, result) + result = call_args val + + result +end + +def _reduce_266(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_267(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_268(val, _values, result) + result = call_args val + + result +end + +def _reduce_269(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_270(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_271(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_272(val, _values, result) + result = val[1] + + result +end + +# reduce 273 omitted + +def _reduce_274(val, _values, result) + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + + result +end + +def _reduce_275(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_276(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_277(val, _values, result) + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_278(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_279(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_280(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_281(val, _values, result) + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_282(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 283 omitted + +# reduce 284 omitted + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +# reduce 290 omitted + +# reduce 291 omitted + +# reduce 292 omitted + +def _reduce_293(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_294(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_295(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_296(val, _values, result) + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + + result +end + +def _reduce_297(val, _values, result) + _, line, _ = val + result = s(:begin).line line + + result +end + +def _reduce_298(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_299(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_300(val, _values, result) + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + + result +end + +def _reduce_301(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_302(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_303(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_304(val, _values, result) + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_305(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_306(val, _values, result) + result = new_hash val + + result +end + +def _reduce_307(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_308(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_309(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_310(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_311(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_312(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_313(val, _values, result) + debug 20 + + result +end + +def _reduce_314(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 315 omitted + +def _reduce_316(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_317(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_318(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_319(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_320(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_321(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_322(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_323(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_324(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_325(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_326(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_327(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_328(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_329(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_330(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_331(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_332(val, _values, result) + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result +end + +def _reduce_333(val, _values, result) + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_334(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_335(val, _values, result) + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + + result +end + +def _reduce_336(val, _values, result) + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_337(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_338(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_339(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_340(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_341(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 342 omitted + +# reduce 343 omitted + +# reduce 344 omitted + +# reduce 345 omitted + +# reduce 346 omitted + +# reduce 347 omitted + +# reduce 348 omitted + +def _reduce_349(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_350(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_351(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +# reduce 352 omitted + +# reduce 353 omitted + +# reduce 354 omitted + +# reduce 355 omitted + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +# reduce 360 omitted + +# reduce 361 omitted + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +# reduce 366 omitted + +def _reduce_367(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 368 omitted + +def _reduce_369(val, _values, result) + result = val[1] + + result +end + +# reduce 370 omitted + +def _reduce_371(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +# reduce 372 omitted + +def _reduce_373(val, _values, result) + result = val[1] + + result +end + +def _reduce_374(val, _values, result) + sym, = val + + result = s(:array, sym).line lexer.lineno + + result +end + +def _reduce_375(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_376(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_377(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_378(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_379(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_380(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_381(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_382(val, _values, result) + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + + result +end + +def _reduce_383(val, _values, result) + result = call_args val + + result +end + +def _reduce_384(val, _values, result) + result = call_args val + + result +end + +def _reduce_385(val, _values, result) + result = call_args val + + result +end + +def _reduce_386(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_387(val, _values, result) + result = args val + + result +end + +# reduce 388 omitted + +def _reduce_389(val, _values, result) + result = args val + + result +end + +def _reduce_390(val, _values, result) + result = args val + + result +end + +def _reduce_391(val, _values, result) + result = args val + + result +end + +def _reduce_392(val, _values, result) + result = args val + + result +end + +def _reduce_393(val, _values, result) + result = args val + + result +end + +def _reduce_394(val, _values, result) + result = args(val) << nil + + result +end + +def _reduce_395(val, _values, result) + result = args val + + result +end + +def _reduce_396(val, _values, result) + result = args val + + result +end + +def _reduce_397(val, _values, result) + result = args val + + result +end + +def _reduce_398(val, _values, result) + result = args val + + result +end + +def _reduce_399(val, _values, result) + result = args val + + result +end + +def _reduce_400(val, _values, result) + result = args val + + result +end + +def _reduce_401(val, _values, result) + result = args val + + result +end + +def _reduce_402(val, _values, result) + result = args val + + result +end + +def _reduce_403(val, _values, result) + result = args val + + result +end + +def _reduce_404(val, _values, result) + result = 0 + result +end + +def _reduce_405(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_406(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +def _reduce_407(val, _values, result) + result = s(:args).line lexer.lineno + + result +end + +def _reduce_408(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +# reduce 409 omitted + +def _reduce_410(val, _values, result) + result = args val + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +def _reduce_412(val, _values, result) + result = args val + + result +end + +def _reduce_413(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 414 omitted + +def _reduce_415(val, _values, result) + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_416(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_417(val, _values, result) + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_418(val, _values, result) + result = args val + + result +end + +def _reduce_419(val, _values, result) + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_420(val, _values, result) + result = val[1] + + result +end + +def _reduce_421(val, _values, result) + result = val[1] + + result +end + +def _reduce_422(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_423(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_424(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_425(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_426(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_427(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_428(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_429(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_430(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_431(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_432(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_433(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_434(val, _values, result) + result = s(:zsuper).line lexer.lineno + + result +end + +def _reduce_435(val, _values, result) + result = new_aref val + + result +end + +def _reduce_436(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_437(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_438(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_439(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_440(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_441(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_442(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_443(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_444(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_445(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_446(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_447(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_448(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_449(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_450(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_451(val, _values, result) + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + + result +end + +# reduce 452 omitted + +# reduce 453 omitted + +def _reduce_454(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_455(val, _values, result) + result = nil + + result +end + +def _reduce_456(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 457 omitted + +# reduce 458 omitted + +def _reduce_459(val, _values, result) + result = val[1] + + result +end + +# reduce 460 omitted + +def _reduce_461(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 462 omitted + +def _reduce_463(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 464 omitted + +def _reduce_465(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_466(val, _values, result) + debug 37 + + result +end + +# reduce 467 omitted + +def _reduce_468(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_469(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_470(val, _values, result) + result = new_string val + + result +end + +def _reduce_471(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_472(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_473(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_474(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_475(val, _values, result) + result = new_word_list + + result +end + +def _reduce_476(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 477 omitted + +def _reduce_478(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_479(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_480(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_481(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_482(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_483(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_484(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_485(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_486(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_487(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_488(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_489(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_490(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_491(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_492(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_493(val, _values, result) + result = nil + + result +end + +def _reduce_494(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_495(val, _values, result) + result = nil + + result +end + +def _reduce_496(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_497(val, _values, result) + result = new_string val + + result +end + +def _reduce_498(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_499(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_500(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_501(val, _values, result) + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_502(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_503(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_504(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 505 omitted + +# reduce 506 omitted + +# reduce 507 omitted + +def _reduce_508(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_509(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 510 omitted + +# reduce 511 omitted + +# reduce 512 omitted + +# reduce 513 omitted + +def _reduce_514(val, _values, result) + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + + result +end + +# reduce 515 omitted + +def _reduce_516(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 517 omitted + +# reduce 518 omitted + +# reduce 519 omitted + +# reduce 520 omitted + +# reduce 521 omitted + +# reduce 522 omitted + +# reduce 523 omitted + +# reduce 524 omitted + +# reduce 525 omitted + +def _reduce_526(val, _values, result) + result = s(:nil).line lexer.lineno + result +end + +def _reduce_527(val, _values, result) + result = s(:self).line lexer.lineno + result +end + +def _reduce_528(val, _values, result) + result = s(:true).line lexer.lineno + result +end + +def _reduce_529(val, _values, result) + result = s(:false).line lexer.lineno + result +end + +def _reduce_530(val, _values, result) + result = s(:str, self.file).line lexer.lineno + result +end + +def _reduce_531(val, _values, result) + result = s(:lit, lexer.lineno).line lexer.lineno + result +end + +def _reduce_532(val, _values, result) + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_533(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + + result +end + +def _reduce_534(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_535(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_536(val, _values, result) + result = self.assignable val[0] + debug 40 + + result +end + +def _reduce_537(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_538(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_539(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_540(val, _values, result) + result = val[2] + + result +end + +def _reduce_541(val, _values, result) + result = nil + + result +end + +def _reduce_542(val, _values, result) + result = end_args val + + result +end + +def _reduce_543(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_544(val, _values, result) + result = end_args val + + result +end + +def _reduce_545(val, _values, result) + result = args val + + result +end + +def _reduce_546(val, _values, result) + result = args val + + result +end + +def _reduce_547(val, _values, result) + result = args val + + result +end + +# reduce 548 omitted + +def _reduce_549(val, _values, result) + result = val[1] + + result +end + +def _reduce_550(val, _values, result) + result = nil + + result +end + +def _reduce_551(val, _values, result) + result = args val + + result +end + +def _reduce_552(val, _values, result) + result = args val + + result +end + +def _reduce_553(val, _values, result) + result = args val + + result +end + +def _reduce_554(val, _values, result) + result = args val + + result +end + +def _reduce_555(val, _values, result) + result = args val + + result +end + +def _reduce_556(val, _values, result) + result = args val + + result +end + +def _reduce_557(val, _values, result) + result = args val + + result +end + +def _reduce_558(val, _values, result) + result = args val + + result +end + +def _reduce_559(val, _values, result) + result = args val + + result +end + +def _reduce_560(val, _values, result) + result = args val + + result +end + +def _reduce_561(val, _values, result) + result = args val + + result +end + +def _reduce_562(val, _values, result) + result = args val + + result +end + +def _reduce_563(val, _values, result) + result = args val + + result +end + +def _reduce_564(val, _values, result) + result = args val + + result +end + +def _reduce_565(val, _values, result) + result = args val + # result.line lexer.lineno + + result +end + +def _reduce_566(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_567(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_568(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_569(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 570 omitted + +def _reduce_571(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 572 omitted + +# reduce 573 omitted + +def _reduce_574(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_575(val, _values, result) + result = new_arg val + + result +end + +def _reduce_576(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +# reduce 577 omitted + +def _reduce_578(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_579(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_580(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_581(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 582 omitted + +def _reduce_583(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 584 omitted + +def _reduce_585(val, _values, result) + result = args val + + result +end + +# reduce 586 omitted + +# reduce 587 omitted + +def _reduce_588(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_589(val, _values, result) + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + + result +end + +def _reduce_590(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + + result +end + +def _reduce_591(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + + result +end + +def _reduce_592(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_593(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_594(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_595(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 596 omitted + +# reduce 597 omitted + +def _reduce_598(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_599(val, _values, result) + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + + result +end + +# reduce 600 omitted + +# reduce 601 omitted + +def _reduce_602(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_603(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_604(val, _values, result) + result = nil + + result +end + +# reduce 605 omitted + +def _reduce_606(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_607(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_608(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 609 omitted + +# reduce 610 omitted + +def _reduce_611(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_612(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_613(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_614(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_615(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 616 omitted + +# reduce 617 omitted + +# reduce 618 omitted + +# reduce 619 omitted + +# reduce 620 omitted + +# reduce 621 omitted + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +# reduce 626 omitted + +# reduce 627 omitted + +# reduce 628 omitted + +# reduce 629 omitted + +# reduce 630 omitted + +# reduce 631 omitted + +# reduce 632 omitted + +# reduce 633 omitted + +# reduce 634 omitted + +# reduce 635 omitted + +def _reduce_636(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_637(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 638 omitted + +# reduce 639 omitted + +# reduce 640 omitted + +def _reduce_641(val, _values, result) + yyerrok + result +end + +# reduce 642 omitted + +# reduce 643 omitted + +def _reduce_644(val, _values, result) + yyerrok + result +end + +def _reduce_645(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby25Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby25_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby25_parser.y new file mode 100644 index 000000000..4738da097 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby25_parser.y @@ -0,0 +1,2745 @@ +# -*- racc -*- + +class Ruby25Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + + warn "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + bodystmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + + f_opt: f_arg_asgn tEQL arg_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + + f_block_opt: f_arg_asgn tEQL primary_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby26_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby26_parser.rb new file mode 100644 index 000000000..654673c9e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby26_parser.rb @@ -0,0 +1,11234 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby26Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -523, 655, 658, 285, 574, -109, 285, -523, -523, -523, + 224, 225, -523, -523, -523, -103, -523, -110, 837, -105, + 574, 574, 224, 225, -523, 234, -523, -523, -523, 224, + 225, 588, 224, 225, -95, 589, -523, -523, 230, -523, + -523, -523, -523, -523, 868, 280, 581, 574, -117, -104, + -116, -81, 836, -112, -114, -109, 133, 134, 135, 136, + 137, 235, 889, -102, 654, 657, -537, -523, -523, -523, + -523, -523, -523, -523, -523, -523, -523, -523, -523, -523, + -523, 574, -103, -523, -523, -523, -105, -523, -523, 748, + 287, -523, -111, 287, -523, -523, 3, -523, 126, -523, + 235, -523, 231, -523, -523, -523, -523, -523, -523, -523, + -100, -523, 235, -523, 221, -621, -104, -103, 130, 235, + -103, -105, -101, 129, -105, -109, -523, -523, -523, -523, + -102, -523, -110, -523, 130, 130, -526, -103, -523, 129, + 129, -105, -523, -526, -526, -526, -523, -117, -526, -526, + -526, -104, -526, -108, -104, -107, -116, -112, -103, -105, + -526, 130, -526, -526, -526, -102, 129, 888, -102, -109, + -114, -104, -526, -526, -109, -526, -526, -526, -526, -526, + -113, -115, -111, 837, 95, -102, -113, -115, 222, 130, + 285, -538, 96, 854, 129, 130, 429, -102, 951, 855, + 129, 431, 430, -526, -526, -526, -526, -526, -526, -526, + -526, -526, -526, -526, -526, -526, -526, 836, 285, -526, + -526, -526, 223, -526, -526, 108, 109, -526, 108, 109, + -526, -526, 226, -526, 483, -526, 275, -526, 232, -526, + -526, -526, -526, -526, -526, -526, -110, -526, 337, -526, + -110, -110, -621, -622, 338, 282, 639, 553, -621, -622, + 639, -117, -526, -526, -526, -526, -117, -526, 130, -526, + -116, -112, -303, 129, -526, -116, -112, 287, -526, -303, + -303, -303, -526, 282, -114, -303, -303, 624, -303, -114, + 235, -104, -106, -117, -113, -115, -111, -117, 627, -113, + -115, -111, 828, 110, 111, 287, 110, 111, -303, -303, + 401, -303, -303, -303, -303, -303, -116, 641, 640, 637, + 230, 641, 640, 829, 624, 404, 639, 229, 130, 130, + 799, 635, 634, 129, 129, 627, 227, 710, 407, -303, + -303, -303, -303, -303, -303, -303, -303, -303, -303, -303, + -303, -303, -303, 130, 676, -303, -303, -303, 129, 682, + 677, -112, 410, -303, 922, 628, -303, 639, 635, 634, + 427, -303, -618, -303, 432, -303, -303, -303, -303, -303, + -303, -303, -114, -303, 231, -303, 482, 641, 640, 619, + -343, 616, 615, 614, 624, 617, 801, -343, -303, -303, + 484, -106, 628, -303, 230, 627, -343, 815, -625, 639, + -303, 480, 644, -112, -303, -625, -625, -625, -115, -114, + 481, -625, -625, -111, -625, -523, 485, 622, 641, 640, + 637, 232, -523, -625, 234, 639, -535, -618, 635, 634, + 514, -523, 639, -535, -625, -625, -536, -625, -625, -625, + -625, -625, -535, -536, -343, 523, -523, 526, 230, -618, + -526, 528, -536, -523, -537, 546, -111, -526, 231, -80, + 641, 640, 628, -108, 544, -625, -625, -625, -625, -625, + -625, -625, -625, -625, -625, -625, -625, -625, -625, -523, + -117, -625, -625, -625, -533, 683, 641, 640, 642, -625, + -535, -533, -625, 641, 640, 647, -100, -625, -619, -625, + -536, -625, -625, -625, -625, -625, -625, -625, 235, -625, + -625, -625, 231, -109, 539, 619, -294, 616, 615, 614, + 624, 617, 540, -294, -625, -625, 547, -104, -532, -625, + -534, 627, -294, 639, -625, -532, -625, -534, -531, 292, + -625, -625, -625, -625, -113, -531, -625, -625, -625, -528, + -625, -526, 737, 622, 235, 736, -528, -538, -526, -625, + -625, -625, -625, -619, 635, 634, 737, -526, 282, 739, + -625, -625, 230, -625, -625, -625, -625, -625, 130, 556, + -294, 550, -529, 129, 230, -619, -530, 130, 481, -529, + 553, 585, 129, -530, 641, 640, 652, 554, 628, -101, + 583, -625, -625, -625, -625, -625, -625, -625, -625, -625, + -625, -625, -625, -625, -625, -526, -110, -625, -625, -625, + 601, 830, -625, 737, 255, -625, 739, 602, -625, -625, + 639, -625, -107, -625, -625, -625, 231, -625, -625, -625, + -625, -625, -625, -625, 235, -625, -625, -625, 231, -116, + 737, 581, 619, 739, 616, 615, 614, 624, 617, 230, + -625, -625, -625, -625, 420, -625, 591, -625, 627, 586, + -303, 587, -625, 595, 676, 593, -625, -303, -303, -303, + -113, 646, -303, -303, -303, 650, -303, -625, 230, 653, + 622, 641, 640, 659, -625, 669, -303, -303, -303, -621, + 656, 635, 634, -625, 667, 663, -303, -303, -304, -303, + -303, -303, -303, -303, 235, -304, -103, 1049, -304, -276, + -303, -625, 665, 231, -304, -304, 677, -303, 815, 224, + 225, 666, -622, -112, -304, 628, -303, -303, -303, -303, + -303, -303, -303, -303, -303, -303, -303, -303, -303, -303, + -303, -625, 231, -303, -303, -303, 670, 831, -303, 224, + 225, -303, 864, 868, -303, -303, 235, -303, -105, -303, + -102, -303, -304, -303, -303, -303, -303, -303, -303, -303, + 674, -303, -304, -303, -303, -114, 619, -111, 616, 615, + 614, 624, 617, -303, 675, 255, -303, -303, -303, -303, + -303, -303, 627, -303, 282, -622, -303, 687, -303, -303, + 635, 634, -303, -303, -303, -303, -115, 255, 255, -303, + -303, 255, -303, 230, 622, 605, 255, 252, 864, 868, + 1033, 254, 253, 632, 631, 635, 634, 230, 255, 593, + 694, 235, -303, -303, 1039, -303, -303, -303, -303, -303, + 252, 235, 230, 1037, 254, 253, 427, -303, 235, 1033, + -95, 619, 714, 616, 615, 614, 235, 617, 593, 628, + 559, 725, 730, -303, -303, -303, -303, -303, -303, -303, + -303, -303, -303, -303, -303, -303, -303, 231, 733, -303, + -303, -303, 619, 682, 616, 615, 614, -303, 617, 787, + -303, 231, 235, 235, 741, -303, 528, -303, 791, -303, + -303, -303, -303, -303, -303, -303, 231, -303, 744, -303, + 733, 733, 619, 581, 616, 615, 614, 624, 617, 733, + 787, 769, -303, -303, 775, -303, 778, -303, 627, 791, + 272, 273, -625, 779, -303, 781, 783, 785, -303, -625, + -625, -625, -115, 794, 795, -625, -625, 255, -625, 619, + 622, 616, 615, 614, 796, 617, 802, -625, 803, 632, + 631, 635, 634, 265, 266, 271, 270, -277, -625, -625, + 816, -625, -625, -625, -625, -625, 514, 514, 235, 252, + 833, 258, 275, 254, 253, 250, 251, 787, 842, 256, + 844, 257, 526, 528, 725, 628, 791, 235, 282, -625, + -625, -625, -625, -625, -625, -625, -625, -625, -625, -625, + -625, -625, -625, 282, 725, -625, -625, -625, 619, 683, + 616, 615, 614, -625, 617, 255, -625, 868, 733, 235, + 235, -625, 733, -625, 235, -625, -625, -625, -625, -625, + -625, -625, 906, -625, -625, -625, 907, 235, 916, 619, + -278, 616, 615, 614, 624, 617, 787, 235, -625, -625, + 921, -625, 938, -625, 725, 627, -276, 943, -436, 733, + -625, 733, 733, 733, -625, -436, -436, -436, -113, 733, + -436, -436, -436, 235, -436, 255, 619, 622, 616, 615, + 614, 963, 617, -436, -436, -436, 632, 631, 635, 634, + 235, 265, 266, 778, -436, -436, 966, -436, -436, -436, + -436, -436, 619, 968, 616, 615, 614, 252, 617, 258, + 970, 254, 253, 250, 251, 972, 972, 256, 235, 257, + 979, -279, 628, 980, 778, -436, -436, -436, -436, -436, + -436, -436, -436, -436, -436, -436, -436, -436, -436, 983, + 787, -436, -436, -436, 986, 988, -436, 990, 282, -436, + 235, 992, -436, -436, 769, -436, 1010, -436, 1011, -436, + 1020, -436, -436, -436, -436, -436, -436, -436, 1021, -436, + -436, -436, 619, 1031, 616, 615, 614, 624, 617, 133, + 134, 135, 136, 137, -436, -436, 1034, -436, 627, -436, + -312, 133, 134, 135, 136, 137, -436, -312, -312, -312, + -436, 854, -312, -312, -312, 1040, -312, 255, 911, 912, + 622, 733, 913, 124, 125, 255, -312, -312, 1050, 632, + 631, 635, 634, 265, 266, 972, -312, -312, 972, -312, + -312, -312, -312, -312, 619, 972, 616, 615, 614, 252, + 617, 258, 778, 254, 253, 250, 251, 252, 1057, 1059, + 1061, 254, 253, 250, 251, 628, 1063, -312, -312, -312, + -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, + -312, 1063, 787, -312, -312, -312, 730, 733, -312, 1021, + 292, -312, -622, -621, -312, -312, 235, -312, 972, -312, + 1084, -312, 1063, -312, -312, -312, -312, -312, -312, -312, + 1063, -312, 1063, -312, 619, 1063, 616, 615, 614, 624, + 617, 133, 134, 135, 136, 137, -312, -312, nil, -312, + 627, -312, -295, nil, nil, nil, nil, nil, -312, -295, + -295, -295, -312, nil, -295, -295, -295, nil, -295, 255, + nil, nil, 622, nil, nil, nil, nil, 255, -295, -295, + -295, 632, 631, 635, 634, 265, 266, nil, -295, -295, + nil, -295, -295, -295, -295, -295, 1014, nil, 616, 615, + 614, 252, 617, 258, nil, 254, 253, 250, 251, 252, + nil, nil, nil, 254, 253, 250, 251, 628, nil, -295, + -295, -295, -295, -295, -295, -295, -295, -295, -295, -295, + -295, -295, -295, nil, nil, -295, -295, -295, nil, nil, + -295, nil, nil, -295, nil, nil, -295, -295, nil, -295, + nil, -295, nil, -295, nil, -295, -295, -295, -295, -295, + -295, -295, nil, -295, nil, -295, 619, nil, 616, 615, + 614, 624, 617, nil, nil, nil, nil, nil, -295, -295, + -295, -295, 627, -295, -647, -295, nil, nil, nil, nil, + -295, -647, -647, -647, -295, nil, -647, -647, -647, nil, + -647, 255, nil, nil, 622, nil, nil, nil, nil, -647, + -647, -647, nil, 632, 631, 635, 634, 265, 266, nil, + -647, -647, nil, -647, -647, -647, -647, -647, 1014, nil, + 616, 615, 614, 252, 617, nil, nil, 254, 253, 250, + 251, nil, nil, nil, nil, nil, nil, nil, nil, 628, + nil, -647, -647, -647, -647, -647, -647, -647, -647, -647, + -647, -647, -647, -647, -647, nil, nil, -647, -647, -647, + nil, nil, -647, nil, 282, -647, nil, nil, -647, -647, + nil, -647, nil, -647, nil, -647, nil, -647, -647, -647, + -647, -647, -647, -647, nil, -647, -647, -647, 619, nil, + 616, 615, 614, 624, 617, nil, nil, nil, nil, nil, + -647, -647, nil, -647, 627, -647, -626, nil, nil, nil, + nil, nil, -647, -626, -626, -626, -647, nil, -626, -626, + -626, nil, -626, nil, nil, nil, 622, nil, nil, nil, + nil, -626, -626, -626, -626, 632, 631, 635, 634, nil, + nil, nil, -626, -626, nil, -626, -626, -626, -626, -626, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 235, nil, nil, nil, nil, nil, nil, + nil, 628, nil, -626, -626, -626, -626, -626, -626, -626, + -626, -626, -626, -626, -626, -626, -626, nil, nil, -626, + -626, -626, nil, nil, -626, nil, nil, -626, nil, nil, + -626, -626, nil, -626, nil, -626, nil, -626, nil, -626, + -626, -626, -626, -626, -626, -626, nil, -626, -626, -626, + 619, nil, 616, 615, 614, 624, 617, nil, nil, nil, + nil, nil, -626, -626, -626, -626, 627, -626, -627, -626, + nil, nil, nil, nil, -626, -627, -627, -627, -626, nil, + -627, -627, -627, nil, -627, nil, nil, nil, 622, nil, + nil, nil, nil, -627, -627, -627, -627, 632, 631, 635, + 634, nil, nil, nil, -627, -627, nil, -627, -627, -627, + -627, -627, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 628, nil, -627, -627, -627, -627, -627, + -627, -627, -627, -627, -627, -627, -627, -627, -627, nil, + nil, -627, -627, -627, nil, nil, -627, nil, nil, -627, + nil, nil, -627, -627, nil, -627, nil, -627, nil, -627, + nil, -627, -627, -627, -627, -627, -627, -627, nil, -627, + -627, -627, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, -627, -627, -627, -627, nil, -627, + -647, -627, nil, nil, nil, nil, -627, -647, -647, -647, + -627, nil, -647, -647, -647, nil, -647, nil, nil, nil, + nil, nil, nil, nil, nil, -647, -647, nil, nil, nil, + nil, nil, nil, nil, nil, nil, -647, -647, nil, -647, + -647, -647, -647, -647, nil, nil, nil, nil, nil, nil, + nil, 512, 464, nil, nil, 513, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, nil, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, -647, nil, + nil, 175, 176, 161, 162, -647, nil, nil, nil, nil, + 282, -647, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, -647, -647, 177, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, -647, nil, nil, nil, + nil, -647, nil, nil, 170, nil, nil, nil, -647, nil, + nil, nil, -647, 8, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, 671, 11, 49, 10, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, 248, 249, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, 269, + nil, -251, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, 671, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, 248, 249, nil, nil, 265, 266, nil, 43, nil, + nil, 315, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, 269, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, 248, 249, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, 269, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, 248, 249, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, 269, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, 248, 249, nil, nil, 265, 266, nil, 43, nil, + nil, 315, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, 235, 269, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, 248, 249, nil, nil, 265, 266, nil, 43, nil, + nil, 315, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, 269, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, 248, 249, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, 269, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, 248, 249, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, 269, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, -648, -648, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, 268, 263, 264, + nil, -648, -648, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + -648, -648, -648, -648, 272, 273, nil, nil, -648, -648, + nil, nil, nil, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + -648, -648, -648, -648, 272, 273, nil, nil, -648, -648, + nil, nil, nil, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 8, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 10, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + -648, -648, -648, -648, 272, 273, nil, nil, -648, -648, + nil, nil, nil, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + -648, -648, -648, -648, 272, 273, nil, nil, -648, -648, + nil, nil, nil, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + -648, -648, -648, -648, 272, 273, nil, nil, -648, -648, + nil, nil, nil, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + -648, -648, -648, -648, 272, 273, nil, nil, -648, -648, + nil, nil, nil, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, nil, nil, 263, 264, + nil, nil, nil, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, 255, + 259, 260, 261, 262, 272, 273, 267, nil, 263, 264, + nil, nil, nil, nil, nil, 265, 266, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, 252, nil, 258, 48, 254, 253, 250, 251, 271, + 270, 256, 23, 257, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 311, 85, 86, 87, 12, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 49, 313, 13, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 62, 63, nil, nil, 64, nil, + 38, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, 12, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, 11, 49, 10, 13, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, + 36, nil, nil, 62, 63, nil, nil, 64, nil, 38, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 304, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, 301, nil, 299, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 302, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 305, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, 304, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, 301, nil, 299, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 302, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, 305, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 328, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 334, nil, nil, nil, nil, nil, 619, nil, + 616, 615, 614, 624, 617, nil, nil, nil, nil, nil, + nil, nil, 324, nil, 627, 320, nil, nil, 62, 63, + nil, nil, 64, nil, 319, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 622, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, 635, 634, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, 628, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 328, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 334, nil, nil, nil, nil, nil, 619, nil, 616, + 615, 614, 624, 617, nil, nil, nil, nil, nil, nil, + nil, 324, nil, 627, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 622, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, 635, 634, nil, 96, + 106, nil, nil, nil, 336, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + 628, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, 12, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, 11, 49, nil, 13, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, + 36, nil, nil, 62, 63, nil, nil, 64, nil, 38, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, 130, nil, nil, nil, nil, 129, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 328, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, nil, nil, 334, nil, nil, nil, nil, nil, 619, + nil, 616, 615, 614, 624, 617, nil, nil, nil, nil, + nil, nil, nil, 364, nil, 627, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 622, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, 635, 634, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, 628, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 328, nil, nil, 122, 121, 123, 369, 60, 114, + 113, 370, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 334, nil, nil, nil, nil, nil, 619, nil, + 616, 615, 614, 624, 617, nil, nil, nil, nil, 376, + nil, nil, 371, nil, 627, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 622, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, 635, 634, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, 628, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 328, nil, nil, 122, 121, 123, 369, 60, 114, 113, + 370, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 334, nil, nil, nil, nil, nil, 619, nil, 616, + 615, 614, 624, 617, nil, nil, nil, nil, nil, nil, + nil, 371, nil, 627, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 622, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, 635, 634, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, 12, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + 628, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 49, + 10, 13, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, 36, nil, nil, 62, 63, nil, nil, + 64, nil, 38, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, 420, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 22, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, 12, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 22, nil, nil, + nil, nil, nil, 11, 49, nil, 13, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 43, nil, nil, 36, nil, + nil, 62, 63, nil, nil, 64, nil, 38, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, 437, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, 437, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 33, 34, 76, 77, + nil, nil, nil, nil, nil, 88, 31, 30, 118, 117, + 119, 120, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 301, nil, 299, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, 235, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 304, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 301, nil, 299, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 302, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 305, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 301, nil, 299, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, 235, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, 12, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 49, nil, 13, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 62, 63, nil, nil, 64, nil, 38, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 328, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, nil, nil, 334, nil, nil, nil, nil, nil, 619, + nil, 616, 615, 614, 624, 617, nil, nil, nil, nil, + nil, nil, nil, 324, nil, 627, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 622, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, 635, 634, + nil, 96, 106, nil, nil, nil, 542, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, 628, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 328, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 334, nil, nil, nil, nil, nil, 619, nil, + 616, 615, 614, 624, 617, nil, nil, nil, nil, nil, + nil, nil, 324, nil, 627, 320, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 622, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, 635, 634, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, 628, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, 559, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 301, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, 304, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 302, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, 305, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 304, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, 301, nil, 299, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 302, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 305, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 707, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, 299, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, 12, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, 11, 49, 313, 13, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, + 36, nil, nil, 62, 63, nil, nil, 64, nil, 38, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, 420, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 328, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, nil, nil, 334, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 324, nil, nil, 320, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, 304, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, 301, nil, 299, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 302, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, 305, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 328, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, nil, nil, 334, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 324, nil, nil, 320, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 33, 34, 76, 77, nil, + nil, nil, nil, nil, 88, 31, 30, 118, 117, 119, + 120, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 33, 34, 76, 77, nil, nil, + nil, nil, nil, 88, 31, 30, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 301, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 301, nil, 299, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, 807, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 33, + 34, 76, 77, nil, nil, nil, nil, nil, 88, 31, + 30, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, 304, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, 301, nil, 299, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 302, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, 305, 93, 100, 102, nil, 110, 111, 85, + 86, 87, 12, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 33, 34, 76, + 77, nil, nil, nil, nil, nil, 88, 31, 30, 118, + 117, 119, 120, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 49, nil, 13, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 62, + 63, nil, nil, 64, nil, 38, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, 304, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 707, nil, 299, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 302, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, 305, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, 299, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 33, 34, 76, 77, nil, nil, nil, nil, nil, 88, + 31, 30, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 328, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, nil, nil, 334, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 324, nil, nil, 320, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 328, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + nil, nil, 334, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 324, nil, nil, 320, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, 437, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + 304, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, 707, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 302, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, 305, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 330, 331, 76, 77, nil, nil, nil, nil, + nil, 88, 327, 333, 118, 117, 119, 120, nil, nil, + 247, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + 873, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 245, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 33, 34, 76, 77, nil, nil, nil, nil, nil, + 88, 31, 30, 118, 117, 119, 120, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, nil, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 95, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, nil, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 33, 34, + 76, 77, nil, nil, nil, nil, nil, 88, 31, 30, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, 45, 46, 44, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 240, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 245, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 49, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, 45, 46, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 240, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, 48, + nil, nil, nil, nil, nil, nil, nil, 245, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, 45, + 46, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 240, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 330, 331, 76, 77, nil, nil, nil, + nil, nil, 88, 327, 333, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, nil, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 95, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 93, 100, + 102, nil, 110, 111, 85, 86, 87, nil, 78, nil, + nil, nil, 79, 80, nil, nil, nil, 83, nil, 81, + 82, 84, 33, 34, 76, 77, nil, nil, nil, nil, + nil, 88, 31, 30, 118, 117, 119, 120, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 49, nil, nil, + 122, 121, 123, 112, 60, 114, 113, 115, nil, 116, + 124, 125, nil, 108, 109, nil, 45, 46, 44, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 240, nil, + nil, 246, nil, nil, 62, 63, nil, nil, 64, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 105, 95, 97, + 98, 99, 101, nil, nil, nil, 96, 106, nil, nil, + nil, nil, nil, nil, 89, nil, nil, 93, 100, 102, + nil, 110, 111, 85, 86, 87, nil, 78, nil, nil, + nil, 79, 80, nil, nil, nil, 83, nil, 81, 82, + 84, 330, 331, 76, 77, nil, nil, nil, nil, nil, + 88, 327, 333, 118, 117, 119, 120, nil, nil, 247, + nil, nil, nil, nil, nil, nil, 49, nil, nil, 122, + 121, 123, 112, 60, 114, 113, 115, nil, 116, 124, + 125, nil, 108, 109, nil, 45, 46, 44, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 240, nil, nil, + 246, nil, nil, 62, 63, nil, nil, 64, nil, nil, + nil, nil, nil, 48, nil, nil, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, 105, 95, 97, 98, + 99, 101, nil, nil, nil, 96, 106, nil, nil, nil, + nil, nil, nil, 89, nil, nil, 93, 100, 102, nil, + 110, 111, 85, 86, 87, nil, 78, nil, nil, nil, + 79, 80, nil, nil, nil, 83, nil, 81, 82, 84, + 330, 331, 76, 77, nil, nil, nil, nil, nil, 88, + 327, 333, 118, 117, 119, 120, nil, nil, 247, nil, + nil, nil, nil, nil, nil, 49, nil, nil, 122, 121, + 123, 112, 60, 114, 113, 115, 304, 116, 124, 125, + nil, 108, 109, nil, 45, 46, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 240, nil, nil, 246, + nil, nil, 62, 63, nil, nil, 64, nil, nil, nil, + 299, nil, 48, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, nil, nil, 105, 302, 97, 98, 99, + 101, nil, nil, nil, 96, 106, nil, nil, nil, nil, + nil, nil, 89, nil, 305, 93, 100, 102, nil, 110, + 111, 85, 86, 87, nil, 78, nil, nil, nil, 79, + 80, nil, nil, nil, 83, nil, 81, 82, 84, 330, + 331, 76, 77, nil, nil, nil, nil, nil, 88, 327, + 333, 118, 117, 119, 120, nil, nil, 247, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 122, 121, 123, + 112, 60, 114, 113, 115, nil, 116, 124, 125, nil, + 108, 109, nil, 45, 46, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 240, nil, nil, 246, nil, + nil, 62, 63, nil, nil, 64, nil, nil, nil, nil, + nil, 48, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 105, 95, 97, 98, 99, 101, + nil, nil, nil, 96, 106, nil, nil, nil, nil, nil, + nil, 89, nil, nil, 93, 100, 102, nil, 110, 111, + 85, 86, 87, nil, 78, nil, nil, nil, 79, 80, + nil, nil, nil, 83, nil, 81, 82, 84, 330, 331, + 76, 77, nil, nil, nil, nil, nil, 88, 327, 333, + 118, 117, 119, 120, nil, nil, 247, nil, nil, nil, + nil, nil, nil, 328, nil, nil, 122, 121, 123, 112, + 60, 114, 113, 115, nil, 116, 124, 125, nil, 108, + 109, nil, nil, nil, 334, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 994, nil, nil, 246, nil, nil, + 62, 63, nil, nil, 64, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 105, 95, 97, 98, 99, 101, nil, + nil, nil, 96, 106, nil, nil, nil, nil, nil, nil, + 89, nil, nil, 93, 100, 102, nil, 110, 111, 85, + 86, 87, nil, 78, nil, nil, nil, 79, 80, nil, + nil, nil, 83, nil, 81, 82, 84, 330, 331, 76, + 77, nil, nil, nil, nil, nil, 88, 327, 333, 118, + 117, 119, 120, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 328, nil, nil, 122, 121, 123, 112, 60, + 114, 113, 115, nil, 116, 124, 125, nil, 108, 109, + nil, nil, nil, 334, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1001, nil, nil, 246, nil, nil, 62, + 63, nil, nil, 64, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 105, 95, 97, 98, 99, 101, nil, nil, + nil, 96, 106, nil, nil, nil, nil, nil, nil, 89, + nil, nil, 93, 100, 102, nil, 110, 111, 85, 86, + 87, nil, 78, nil, nil, nil, 79, 80, nil, nil, + nil, 83, nil, 81, 82, 84, 330, 331, 76, 77, + nil, nil, nil, nil, nil, 88, 327, 333, 118, 117, + 119, 120, nil, nil, 247, nil, nil, nil, nil, nil, + nil, 49, nil, nil, 122, 121, 123, 112, 60, 114, + 113, 115, nil, 116, 124, 125, nil, 108, 109, nil, + 45, 46, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 240, nil, nil, 246, nil, nil, 62, 63, + nil, nil, 64, nil, 1006, nil, nil, nil, 48, nil, + nil, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, 105, 95, 97, 98, 99, 101, nil, nil, nil, + 96, 106, nil, nil, nil, nil, nil, nil, 89, nil, + nil, 93, 100, 102, nil, 110, 111, 85, 86, 87, + nil, 78, nil, nil, nil, 79, 80, nil, nil, nil, + 83, nil, 81, 82, 84, 330, 331, 76, 77, nil, + nil, nil, nil, nil, 88, 327, 333, 118, 117, 119, + 120, nil, nil, 247, nil, nil, nil, nil, nil, nil, + 328, nil, nil, 122, 121, 123, 112, 60, 114, 113, + 115, nil, 116, 124, 125, nil, 108, 109, nil, nil, + nil, 334, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 994, nil, nil, 246, nil, nil, 62, 63, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 105, 95, 97, 98, 99, 101, nil, nil, nil, 96, + 106, nil, nil, nil, nil, nil, nil, 89, nil, nil, + 93, 100, 102, nil, 110, 111, 85, 86, 87, nil, + 78, nil, nil, nil, 79, 80, nil, nil, nil, 83, + nil, 81, 82, 84, 330, 331, 76, 77, nil, nil, + nil, nil, nil, 88, 327, 333, 118, 117, 119, 120, + nil, nil, 247, nil, nil, nil, nil, nil, nil, 49, + nil, nil, 122, 121, 123, 112, 60, 114, 113, 115, + nil, 116, 124, 125, nil, 108, 109, nil, 45, 46, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 240, nil, nil, 246, nil, nil, 62, 63, nil, nil, + 64, nil, nil, nil, nil, nil, 48, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 105, + 95, 97, 98, 99, 101, nil, nil, nil, 96, 106, + nil, nil, nil, nil, nil, nil, 89, nil, nil, 93, + 100, 102, nil, 110, 111, 85, 86, 87, nil, 78, + nil, nil, nil, 79, 80, nil, nil, nil, 83, nil, + 81, 82, 84, 33, 34, 76, 77, nil, nil, nil, + nil, nil, 88, 31, 30, 118, 117, 119, 120, nil, + nil, 247, nil, nil, nil, nil, nil, nil, 49, nil, + nil, 122, 121, 123, 112, 60, 114, 113, 115, 304, + 116, 124, 125, nil, 108, 109, nil, 45, 46, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 240, + nil, nil, 246, nil, nil, 62, 63, nil, nil, 64, + nil, 301, nil, 299, nil, 48, nil, nil, nil, nil, + nil, nil, nil, 245, nil, nil, nil, nil, 105, 302, + 97, 98, 99, 101, nil, nil, nil, 96, 106, nil, + nil, nil, nil, nil, nil, 89, nil, 305, 93, 100, + 102, nil, 110, 111, 188, 199, 189, 212, 185, 205, + 195, 194, 215, 216, 210, 193, 192, 187, 213, 217, + 218, 197, 186, 200, 204, 206, 198, 191, nil, nil, + nil, 207, 214, 209, 208, 201, 211, 196, 184, 203, + 202, nil, nil, nil, nil, nil, 183, 190, 181, 182, + 178, 179, 180, 141, 143, 140, nil, 142, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, nil, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, 105, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 106, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 188, 199, 189, + 212, 185, 205, 195, 194, 215, 216, 210, 193, 192, + 187, 213, 217, 218, 197, 186, 200, 204, 206, 198, + 191, nil, nil, nil, 207, 214, 209, 208, 201, 211, + 196, 184, 203, 202, nil, nil, nil, nil, nil, 183, + 190, 181, 182, 178, 179, 180, 141, 143, nil, nil, + 142, nil, nil, nil, nil, nil, nil, nil, nil, 173, + 174, nil, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, nil, 177, + 105, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 106, nil, nil, nil, nil, nil, nil, nil, nil, 170, + 188, 199, 189, 212, 185, 205, 195, 194, 215, 216, + 210, 193, 192, 187, 213, 217, 218, 197, 186, 200, + 204, 206, 198, 191, nil, nil, nil, 207, 214, 209, + 387, 386, 388, 385, 184, 203, 202, nil, nil, nil, + nil, nil, 183, 190, 181, 182, 382, 383, 384, 380, + 143, 114, 113, 381, nil, 116, nil, nil, nil, nil, + nil, nil, 173, 174, nil, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 392, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 170, 188, 199, 189, 212, 185, 205, 195, + 194, 215, 216, 210, 193, 192, 187, 213, 217, 218, + 197, 186, 200, 204, 206, 198, 191, nil, nil, nil, + 207, 214, 209, 208, 201, 211, 196, 184, 203, 202, + nil, nil, nil, nil, nil, 183, 190, 181, 182, 178, + 179, 180, 141, 143, 417, 416, 142, nil, 418, nil, + nil, nil, nil, nil, nil, 173, 174, nil, 169, 151, + 152, 153, 160, 157, 159, nil, nil, 154, 155, nil, + nil, nil, 175, 176, 161, 162, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 166, + 165, nil, 150, 172, 168, 167, 163, 164, 158, 156, + 148, 171, 149, nil, nil, 177, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 170, 188, 199, 189, 212, + 185, 205, 195, 194, 215, 216, 210, 193, 192, 187, + 213, 217, 218, 197, 186, 200, 204, 206, 198, 191, + nil, nil, nil, 207, 214, 209, 208, 201, 211, 196, + 184, 203, 202, nil, nil, nil, nil, nil, 183, 190, + 181, 182, 178, 179, 180, 141, 143, nil, nil, 142, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + nil, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, 105, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 106, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 188, + 199, 189, 212, 185, 205, 195, 194, 215, 216, 210, + 193, 192, 187, 213, 217, 218, 197, 186, 200, 204, + 206, 198, 191, nil, nil, nil, 207, 214, 209, 208, + 201, 211, 196, 184, 203, 202, nil, nil, nil, nil, + nil, 183, 190, 181, 182, 178, 179, 180, 141, 143, + nil, nil, 142, nil, nil, nil, nil, nil, nil, nil, + nil, 173, 174, nil, 169, 151, 152, 153, 160, 157, + 159, nil, nil, 154, 155, nil, nil, nil, 175, 176, + 161, 162, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 166, 165, nil, 150, 172, + 168, 167, 163, 164, 158, 156, 148, 171, 149, nil, + nil, 177, 105, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 106, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 188, 199, 189, 212, 185, 205, 195, 194, + 215, 216, 210, 193, 192, 187, 213, 217, 218, 197, + 186, 200, 204, 206, 198, 191, nil, nil, nil, 207, + 214, 209, 208, 201, 211, 196, 184, 203, 202, nil, + nil, nil, nil, nil, 183, 190, 181, 182, 178, 179, + 180, 141, 143, nil, nil, 142, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, nil, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 460, + 464, nil, nil, 461, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 467, 471, nil, + nil, 466, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 282, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 688, 464, nil, nil, 689, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 690, 471, nil, nil, 691, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 718, 464, nil, nil, 719, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 721, + 471, nil, nil, 722, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 688, 464, nil, + nil, 689, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 282, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 690, 471, nil, nil, 691, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 755, 464, nil, nil, 756, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, nil, 177, nil, nil, nil, + nil, 757, 471, nil, nil, 758, nil, nil, nil, nil, + nil, nil, nil, nil, 173, 174, 170, 169, 151, 152, + 153, 160, 157, 159, nil, nil, 154, 155, nil, nil, + nil, 175, 176, 161, 162, nil, nil, nil, nil, nil, + 282, nil, nil, nil, nil, nil, nil, nil, 166, 165, + nil, 150, 172, 168, 167, 163, 164, 158, 156, 148, + 171, 149, nil, nil, 177, nil, nil, nil, nil, 760, + 471, nil, nil, 761, nil, nil, nil, nil, nil, nil, + nil, nil, 173, 174, 170, 169, 151, 152, 153, 160, + 157, 159, nil, nil, 154, 155, nil, nil, nil, 175, + 176, 161, 162, nil, nil, nil, nil, nil, 282, nil, + nil, nil, nil, nil, nil, nil, 166, 165, nil, 150, + 172, 168, 167, 163, 164, 158, 156, 148, 171, 149, + nil, nil, 177, nil, nil, nil, nil, 512, 464, nil, + nil, 513, nil, nil, nil, nil, nil, nil, nil, nil, + 173, 174, 170, 169, 151, 152, 153, 160, 157, 159, + nil, nil, 154, 155, nil, nil, nil, 175, 176, 161, + 162, nil, nil, nil, nil, nil, 282, nil, nil, nil, + nil, nil, nil, nil, 166, 165, nil, 150, 172, 168, + 167, 163, 164, 158, 156, 148, 171, 149, nil, nil, + 177, nil, nil, nil, nil, 809, 464, nil, nil, 810, + nil, nil, nil, nil, nil, nil, nil, nil, 173, 174, + 170, 169, 151, 152, 153, 160, 157, 159, nil, nil, + 154, 155, nil, nil, nil, 175, 176, 161, 162, nil, + nil, nil, nil, nil, 282, nil, nil, nil, nil, nil, + nil, nil, 166, 165, nil, 150, 172, 168, 167, 163, + 164, 158, 156, 148, 171, 149, nil, nil, 177, nil, + nil, nil, nil, 812, 471, nil, nil, 811, nil, nil, + nil, nil, nil, nil, nil, nil, 173, 174, 170, 169, + 151, 152, 153, 160, 157, 159, nil, nil, 154, 155, + nil, nil, nil, 175, 176, 161, 162, nil, nil, nil, + nil, nil, 282, nil, nil, nil, nil, nil, nil, nil, + 166, 165, nil, 150, 172, 168, 167, 163, 164, 158, + 156, 148, 171, 149, nil, 619, 177, 616, 615, 614, + 624, 617, 619, nil, 616, 615, 614, 624, 617, nil, + nil, 627, nil, nil, nil, nil, 170, nil, 627, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 622, nil, nil, nil, nil, nil, nil, + 622, nil, 632, 631, 635, 634, nil, nil, nil, 632, + 631, 635, 634, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1067, 471, nil, nil, 1066, nil, nil, nil, 628, nil, + nil, nil, nil, 173, 174, 628, 169, 151, 152, 153, + 160, 157, 159, nil, nil, 154, 155, nil, nil, nil, + 175, 176, 161, 162, nil, nil, nil, nil, nil, 282, + nil, nil, nil, nil, nil, nil, nil, 166, 165, nil, + 150, 172, 168, 167, 163, 164, 158, 156, 148, 171, + 149, nil, nil, 177, nil, nil, nil, nil, 1070, 464, + nil, nil, 1071, nil, nil, nil, nil, nil, nil, nil, + nil, 173, 174, 170, 169, 151, 152, 153, 160, 157, + 159, nil, nil, 154, 155, nil, nil, nil, 175, 176, + 161, 162, nil, nil, nil, nil, nil, 282, nil, nil, + nil, nil, nil, nil, nil, 166, 165, nil, 150, 172, + 168, 167, 163, 164, 158, 156, 148, 171, 149, nil, + nil, 177, nil, nil, nil, nil, 1072, 471, nil, nil, + 1073, nil, nil, nil, nil, nil, nil, nil, nil, 173, + 174, 170, 169, 151, 152, 153, 160, 157, 159, nil, + nil, 154, 155, nil, nil, nil, 175, 176, 161, 162, + nil, nil, nil, nil, nil, 282, nil, nil, nil, nil, + nil, nil, nil, 166, 165, nil, 150, 172, 168, 167, + 163, 164, 158, 156, 148, 171, 149, nil, 619, 177, + 616, 615, 614, 624, 617, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 627, nil, nil, nil, nil, 170, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 622, nil, nil, nil, + nil, nil, nil, nil, nil, 632, 631, 635, 634, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 628 ] + +racc_action_check = [ + 112, 408, 411, 65, 353, 361, 697, 112, 112, 112, + 476, 476, 112, 112, 112, 718, 112, 362, 695, 719, + 354, 942, 728, 728, 112, 22, 112, 112, 112, 772, + 772, 371, 17, 17, 713, 371, 112, 112, 27, 112, + 112, 112, 112, 112, 1007, 27, 1007, 947, 365, 721, + 586, 713, 695, 755, 756, 998, 9, 9, 9, 9, + 9, 22, 773, 849, 408, 411, 238, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 874, 718, 112, 112, 112, 719, 112, 112, 576, + 65, 112, 875, 697, 112, 112, 1, 112, 3, 112, + 476, 112, 27, 112, 112, 112, 112, 112, 112, 112, + 361, 112, 728, 112, 13, 721, 721, 718, 353, 772, + 718, 719, 362, 353, 719, 238, 112, 112, 112, 112, + 849, 112, 999, 112, 354, 942, 115, 718, 112, 354, + 942, 719, 112, 115, 115, 115, 112, 1002, 115, 115, + 115, 721, 115, 365, 721, 586, 1040, 1070, 755, 756, + 115, 947, 115, 115, 115, 849, 947, 773, 849, 998, + 1071, 721, 115, 115, 998, 115, 115, 115, 115, 115, + 1072, 1073, 1082, 843, 92, 849, 757, 758, 15, 576, + 29, 239, 92, 729, 576, 874, 140, 875, 874, 729, + 874, 140, 140, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 843, 329, 115, + 115, 115, 16, 115, 115, 44, 44, 115, 334, 334, + 115, 115, 18, 115, 241, 115, 25, 115, 444, 115, + 115, 115, 115, 115, 115, 115, 999, 115, 40, 115, + 239, 999, 757, 758, 43, 29, 530, 482, 1072, 1073, + 648, 1002, 115, 115, 115, 115, 1002, 115, 5, 115, + 1040, 1070, 466, 5, 115, 1040, 1070, 29, 115, 466, + 466, 466, 115, 329, 1071, 466, 466, 775, 466, 1071, + 49, 757, 758, 241, 1072, 1073, 1082, 444, 775, 1072, + 1073, 1082, 688, 44, 44, 329, 334, 334, 466, 466, + 99, 466, 466, 466, 466, 466, 482, 530, 530, 530, + 19, 648, 648, 689, 980, 100, 651, 19, 308, 358, + 648, 775, 775, 308, 358, 980, 19, 530, 101, 466, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 466, 766, 809, 466, 466, 466, 766, 466, + 810, 688, 102, 466, 832, 775, 466, 395, 980, 980, + 138, 466, 369, 466, 219, 466, 466, 466, 466, 466, + 466, 466, 689, 466, 19, 466, 240, 651, 651, 783, + 50, 783, 783, 783, 783, 783, 651, 50, 466, 466, + 242, 466, 980, 466, 237, 783, 50, 918, 467, 399, + 466, 237, 399, 809, 466, 467, 467, 467, 466, 810, + 237, 467, 467, 832, 467, 369, 243, 783, 395, 395, + 395, 20, 369, 467, 247, 397, 321, 369, 783, 783, + 281, 369, 402, 321, 467, 467, 322, 467, 467, 467, + 467, 467, 321, 322, 50, 296, 380, 297, 323, 369, + 381, 300, 322, 380, 41, 323, 918, 381, 237, 314, + 399, 399, 783, 20, 323, 467, 467, 467, 467, 467, + 467, 467, 467, 467, 467, 467, 467, 467, 467, 369, + 20, 467, 467, 467, 382, 467, 397, 397, 397, 467, + 321, 382, 467, 402, 402, 402, 41, 467, 370, 467, + 322, 467, 467, 467, 467, 467, 467, 467, 316, 467, + 467, 467, 323, 41, 317, 968, 325, 968, 968, 968, + 968, 968, 318, 325, 467, 467, 324, 467, 383, 467, + 384, 968, 325, 405, 690, 383, 467, 384, 385, 327, + 467, 690, 690, 690, 467, 385, 690, 690, 690, 386, + 690, 370, 565, 968, 328, 565, 386, 42, 370, 690, + 690, 690, 690, 370, 968, 968, 566, 370, 333, 566, + 690, 690, 340, 690, 690, 690, 690, 690, 879, 340, + 325, 335, 387, 879, 363, 370, 388, 884, 340, 387, + 338, 363, 884, 388, 405, 405, 405, 339, 968, 42, + 363, 690, 690, 690, 690, 690, 690, 690, 690, 690, + 690, 690, 690, 690, 690, 370, 42, 690, 690, 690, + 390, 690, 690, 570, 342, 690, 570, 390, 690, 690, + 413, 690, 338, 690, 760, 690, 340, 690, 690, 690, + 690, 690, 690, 690, 348, 690, 690, 690, 363, 338, + 862, 359, 970, 862, 970, 970, 970, 970, 970, 373, + 690, 690, 690, 690, 360, 690, 373, 690, 970, 364, + 691, 366, 690, 375, 460, 373, 690, 691, 691, 691, + 690, 401, 691, 691, 691, 404, 691, 760, 443, 407, + 970, 413, 413, 413, 760, 443, 691, 691, 691, 760, + 410, 970, 970, 760, 443, 433, 691, 691, 547, 691, + 691, 691, 691, 691, 1012, 547, 460, 1012, 589, 436, + 722, 760, 438, 373, 547, 589, 461, 722, 672, 352, + 352, 441, 722, 460, 589, 970, 722, 691, 691, 691, + 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, + 691, 760, 443, 691, 691, 691, 445, 691, 691, 597, + 597, 691, 743, 743, 691, 691, 455, 691, 461, 691, + 672, 691, 547, 691, 691, 691, 691, 691, 691, 691, + 458, 691, 589, 691, 722, 461, 393, 672, 393, 393, + 393, 393, 393, 761, 459, 488, 691, 691, 691, 691, + 761, 691, 393, 691, 468, 761, 811, 478, 691, 761, + 778, 778, 691, 811, 811, 811, 691, 490, 489, 811, + 811, 491, 811, 993, 393, 393, 492, 488, 1041, 1041, + 993, 488, 488, 393, 393, 393, 393, 1000, 493, 993, + 509, 516, 811, 811, 1000, 811, 811, 811, 811, 811, + 489, 520, 1032, 1000, 489, 489, 536, 761, 537, 1032, + 538, 622, 541, 622, 622, 622, 543, 622, 1032, 393, + 548, 551, 560, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 993, 561, 811, + 811, 811, 787, 811, 787, 787, 787, 811, 787, 622, + 811, 1000, 562, 567, 568, 811, 571, 811, 622, 811, + 811, 811, 811, 811, 811, 811, 1032, 811, 573, 811, + 577, 578, 605, 579, 605, 605, 605, 605, 605, 580, + 787, 599, 811, 811, 607, 811, 608, 811, 605, 787, + 47, 47, 812, 610, 811, 611, 612, 621, 811, 812, + 812, 812, 811, 629, 633, 812, 812, 508, 812, 906, + 605, 906, 906, 906, 636, 906, 655, 812, 658, 605, + 605, 605, 605, 508, 508, 47, 47, 664, 812, 812, + 673, 812, 812, 812, 812, 812, 678, 684, 692, 508, + 693, 508, 696, 508, 508, 508, 508, 906, 700, 508, + 702, 508, 704, 706, 715, 605, 906, 717, 720, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 723, 724, 812, 812, 812, 907, 812, + 907, 907, 907, 812, 907, 727, 812, 745, 751, 754, + 763, 812, 767, 812, 774, 812, 812, 812, 812, 812, + 812, 812, 789, 812, 812, 812, 790, 792, 804, 769, + 806, 769, 769, 769, 769, 769, 907, 808, 812, 812, + 817, 812, 841, 812, 848, 769, 858, 859, 30, 863, + 812, 869, 876, 878, 812, 30, 30, 30, 812, 882, + 30, 30, 30, 883, 30, 557, 791, 769, 791, 791, + 791, 890, 791, 30, 30, 30, 769, 769, 769, 769, + 891, 557, 557, 892, 30, 30, 896, 30, 30, 30, + 30, 30, 1020, 897, 1020, 1020, 1020, 557, 1020, 557, + 899, 557, 557, 557, 557, 900, 902, 557, 905, 557, + 915, 917, 769, 924, 925, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 927, + 1020, 30, 30, 30, 928, 929, 30, 931, 30, 30, + 932, 933, 30, 30, 960, 30, 961, 30, 962, 30, + 977, 30, 30, 30, 30, 30, 30, 30, 978, 30, + 30, 30, 770, 991, 770, 770, 770, 770, 770, 312, + 312, 312, 312, 312, 30, 30, 994, 30, 770, 30, + 31, 347, 347, 347, 347, 347, 30, 31, 31, 31, + 30, 996, 31, 31, 31, 1001, 31, 494, 797, 797, + 770, 1008, 797, 797, 797, 503, 31, 31, 1016, 770, + 770, 770, 770, 494, 494, 1017, 31, 31, 1018, 31, + 31, 31, 31, 31, 1021, 1019, 1021, 1021, 1021, 494, + 1021, 494, 1022, 494, 494, 494, 494, 503, 1025, 1026, + 1027, 503, 503, 503, 503, 770, 1028, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 1030, 1021, 31, 31, 31, 1036, 1047, 31, 1055, + 31, 31, 1066, 1067, 31, 31, 1069, 31, 1077, 31, + 1078, 31, 1079, 31, 31, 31, 31, 31, 31, 31, + 1080, 31, 1081, 31, 779, 1089, 779, 779, 779, 779, + 779, 535, 535, 535, 535, 535, 31, 31, nil, 31, + 779, 31, 60, nil, nil, nil, nil, nil, 31, 60, + 60, 60, 31, nil, 60, 60, 60, nil, 60, 495, + nil, nil, 779, nil, nil, nil, nil, 504, 60, 60, + 60, 779, 779, 779, 779, 495, 495, nil, 60, 60, + nil, 60, 60, 60, 60, 60, 963, nil, 963, 963, + 963, 495, 963, 495, nil, 495, 495, 495, 495, 504, + nil, nil, nil, 504, 504, 504, 504, 779, nil, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, nil, nil, 60, 60, 60, nil, nil, + 60, nil, nil, 60, nil, nil, 60, 60, nil, 60, + nil, 60, nil, 60, nil, 60, 60, 60, 60, 60, + 60, 60, nil, 60, nil, 60, 781, nil, 781, 781, + 781, 781, 781, nil, nil, nil, nil, nil, 60, 60, + 60, 60, 781, 60, 462, 60, nil, nil, nil, nil, + 60, 462, 462, 462, 60, nil, 462, 462, 462, nil, + 462, 496, nil, nil, 781, nil, nil, nil, nil, 462, + 462, 462, nil, 781, 781, 781, 781, 496, 496, nil, + 462, 462, nil, 462, 462, 462, 462, 462, 1049, nil, + 1049, 1049, 1049, 496, 1049, nil, nil, 496, 496, 496, + 496, nil, nil, nil, nil, nil, nil, nil, nil, 781, + nil, 462, 462, 462, 462, 462, 462, 462, 462, 462, + 462, 462, 462, 462, 462, nil, nil, 462, 462, 462, + nil, nil, 462, nil, 462, 462, nil, nil, 462, 462, + nil, 462, nil, 462, nil, 462, nil, 462, 462, 462, + 462, 462, 462, 462, nil, 462, 462, 462, 836, nil, + 836, 836, 836, 836, 836, nil, nil, nil, nil, nil, + 462, 462, nil, 462, 836, 462, 471, nil, nil, nil, + nil, nil, 462, 471, 471, 471, 462, nil, 471, 471, + 471, nil, 471, nil, nil, nil, 836, nil, nil, nil, + nil, 471, 471, 471, 471, 836, 836, 836, 836, nil, + nil, nil, 471, 471, nil, 471, 471, 471, 471, 471, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 836, nil, nil, nil, nil, nil, nil, + nil, 836, nil, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 471, 471, 471, 471, 471, nil, nil, 471, + 471, 471, nil, nil, 471, nil, nil, 471, nil, nil, + 471, 471, nil, 471, nil, 471, nil, 471, nil, 471, + 471, 471, 471, 471, 471, 471, nil, 471, 471, 471, + 966, nil, 966, 966, 966, 966, 966, nil, nil, nil, + nil, nil, 471, 471, 471, 471, 966, 471, 472, 471, + nil, nil, nil, nil, 471, 472, 472, 472, 471, nil, + 472, 472, 472, nil, 472, nil, nil, nil, 966, nil, + nil, nil, nil, 472, 472, 472, 472, 966, 966, 966, + 966, nil, nil, nil, 472, 472, nil, 472, 472, 472, + 472, 472, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 966, nil, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, 472, nil, + nil, 472, 472, 472, nil, nil, 472, nil, nil, 472, + nil, nil, 472, 472, nil, 472, nil, 472, nil, 472, + nil, 472, 472, 472, 472, 472, 472, 472, nil, 472, + 472, 472, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 472, 472, 472, 472, nil, 472, + 511, 472, nil, nil, nil, nil, 472, 511, 511, 511, + 472, nil, 511, 511, 511, nil, 511, nil, nil, nil, + nil, nil, nil, nil, nil, 511, 511, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 511, 511, nil, 511, + 511, 511, 511, 511, nil, nil, nil, nil, nil, nil, + nil, 278, 278, nil, nil, 278, nil, nil, nil, nil, + nil, nil, nil, nil, 278, 278, nil, 278, 278, 278, + 278, 278, 278, 278, nil, nil, 278, 278, 511, nil, + nil, 278, 278, 278, 278, 511, nil, nil, nil, nil, + 511, 511, nil, nil, nil, nil, nil, nil, 278, 278, + nil, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 511, 511, 278, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 511, nil, nil, nil, + nil, 511, nil, nil, 278, nil, nil, nil, 511, nil, + nil, nil, 511, 2, 2, 2, 2, 2, 2, nil, + nil, nil, 2, 2, nil, nil, nil, 2, nil, 2, + 2, 2, 2, 2, 2, 2, nil, nil, nil, nil, + nil, 2, 2, 2, 2, 2, 2, 2, nil, nil, + 2, nil, nil, nil, nil, 448, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, nil, 2, + 2, 2, nil, 2, 2, nil, 2, 2, 2, 448, + 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, + nil, 448, 448, nil, nil, 448, 448, nil, 2, nil, + nil, 2, nil, nil, 2, 2, nil, nil, 2, nil, + 2, 448, nil, 448, 2, 448, 448, 448, 448, 448, + 448, 448, 2, 448, nil, nil, nil, 2, 2, 2, + 2, 2, 2, nil, nil, nil, 2, 2, nil, 448, + nil, 448, nil, nil, 2, nil, nil, 2, 2, 2, + nil, 2, 2, 36, 36, 36, 36, 36, 36, nil, + nil, nil, 36, 36, nil, nil, nil, 36, nil, 36, + 36, 36, 36, 36, 36, 36, nil, nil, nil, nil, + nil, 36, 36, 36, 36, 36, 36, 36, nil, nil, + 36, nil, nil, nil, nil, 454, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, nil, 36, + 36, 36, nil, 36, 36, nil, 36, 36, 36, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + nil, 454, 454, nil, nil, 454, 454, nil, 36, nil, + nil, 36, nil, nil, 36, 36, nil, nil, 36, nil, + 36, 454, nil, 454, 36, 454, 454, 454, 454, 454, + 454, 454, 36, 454, nil, nil, nil, 36, 36, 36, + 36, 36, 36, nil, nil, nil, 36, 36, nil, 454, + nil, nil, nil, nil, 36, nil, nil, 36, 36, 36, + nil, 36, 36, 221, 221, 221, 221, 221, 221, nil, + nil, nil, 221, 221, nil, nil, nil, 221, nil, 221, + 221, 221, 221, 221, 221, 221, nil, nil, nil, nil, + nil, 221, 221, 221, 221, 221, 221, 221, nil, nil, + 221, nil, nil, nil, nil, nil, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, nil, 221, + 221, 221, nil, 221, 221, nil, 221, 221, 221, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + nil, 24, 24, nil, nil, 24, 24, nil, 221, nil, + nil, 221, nil, nil, 221, 221, nil, nil, 221, nil, + 221, 24, nil, 24, 221, 24, 24, 24, 24, 24, + 24, 24, 221, 24, nil, nil, nil, 221, 221, 221, + 221, 221, 221, nil, nil, nil, 221, 221, nil, 24, + nil, nil, nil, nil, 221, nil, nil, 221, 221, 221, + nil, 221, 221, 246, 246, 246, 246, 246, 246, nil, + nil, nil, 246, 246, nil, nil, nil, 246, nil, 246, + 246, 246, 246, 246, 246, 246, nil, nil, nil, nil, + nil, 246, 246, 246, 246, 246, 246, 246, nil, nil, + 246, nil, nil, nil, nil, nil, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, nil, 246, + 246, 246, nil, 246, 246, nil, 246, 246, 246, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + nil, 294, 294, nil, nil, 294, 294, nil, 246, nil, + nil, 246, nil, nil, 246, 246, nil, nil, 246, nil, + 246, 294, nil, 294, 246, 294, 294, 294, 294, 294, + 294, 294, 246, 294, nil, nil, nil, 246, 246, 246, + 246, 246, 246, nil, nil, nil, 246, 246, nil, 294, + nil, nil, nil, nil, 246, nil, nil, 246, 246, 246, + nil, 246, 246, 315, 315, 315, 315, 315, 315, nil, + nil, nil, 315, 315, nil, nil, nil, 315, nil, 315, + 315, 315, 315, 315, 315, 315, nil, nil, nil, nil, + nil, 315, 315, 315, 315, 315, 315, 315, nil, nil, + 315, nil, nil, nil, nil, nil, 315, 315, 315, 315, + 315, 315, 315, 315, 315, 315, 315, 315, nil, 315, + 315, 315, nil, 315, 315, nil, 315, 315, 315, 507, + 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, + nil, 507, 507, nil, nil, 507, 507, nil, 315, nil, + nil, 315, nil, nil, 315, 315, nil, nil, 315, nil, + 315, 507, nil, 507, 315, 507, 507, 507, 507, 507, + 507, 507, 315, 507, nil, nil, nil, 315, 315, 315, + 315, 315, 315, nil, nil, nil, 315, 315, 507, 507, + nil, nil, nil, nil, 315, nil, nil, 315, 315, 315, + nil, 315, 315, 320, 320, 320, 320, 320, 320, nil, + nil, nil, 320, 320, nil, nil, nil, 320, nil, 320, + 320, 320, 320, 320, 320, 320, nil, nil, nil, nil, + nil, 320, 320, 320, 320, 320, 320, 320, nil, nil, + 320, nil, nil, nil, nil, nil, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, nil, 320, + 320, 320, nil, 320, 320, nil, 320, 320, 320, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + nil, 558, 558, nil, nil, 558, 558, nil, 320, nil, + nil, 320, nil, nil, 320, 320, nil, nil, 320, nil, + 320, 558, nil, 558, 320, 558, 558, 558, 558, 558, + 558, 558, 320, 558, nil, nil, nil, 320, 320, 320, + 320, 320, 320, nil, nil, nil, 320, 320, nil, 558, + nil, nil, nil, nil, 320, nil, nil, 320, 320, 320, + nil, 320, 320, 346, 346, 346, 346, 346, 346, nil, + nil, nil, 346, 346, nil, nil, nil, 346, nil, 346, + 346, 346, 346, 346, 346, 346, nil, nil, nil, nil, + nil, 346, 346, 346, 346, 346, 346, 346, nil, nil, + 346, nil, nil, nil, nil, nil, 346, 346, 346, 346, + 346, 346, 346, 346, 346, 346, 346, 346, nil, 346, + 346, 346, nil, 346, 346, nil, 346, 346, 346, 814, + 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, + nil, 814, 814, nil, nil, 814, 814, nil, 346, nil, + nil, 346, nil, nil, 346, 346, nil, nil, 346, nil, + 346, 814, nil, 814, 346, 814, 814, 814, 814, 814, + 814, 814, 346, 814, nil, nil, nil, 346, 346, 346, + 346, 346, 346, nil, nil, nil, 346, 346, nil, 814, + nil, nil, nil, nil, 346, nil, nil, 346, 346, 346, + nil, 346, 346, 356, 356, 356, 356, 356, 356, nil, + nil, nil, 356, 356, nil, nil, nil, 356, nil, 356, + 356, 356, 356, 356, 356, 356, nil, nil, nil, nil, + nil, 356, 356, 356, 356, 356, 356, 356, nil, nil, + 356, nil, nil, nil, nil, nil, 356, 356, 356, 356, + 356, 356, 356, 356, 356, 356, 356, 356, nil, 356, + 356, 356, nil, 356, 356, nil, 356, 356, 356, 923, + 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, + nil, 923, 923, nil, nil, 923, 923, nil, 356, nil, + nil, 356, nil, nil, 356, 356, nil, nil, 356, nil, + 356, 923, nil, 923, 356, 923, 923, 923, 923, 923, + 923, 923, 356, 923, nil, nil, nil, 356, 356, 356, + 356, 356, 356, nil, nil, nil, 356, 356, nil, 923, + nil, nil, nil, nil, 356, nil, nil, 356, 356, 356, + nil, 356, 356, 357, 357, 357, 357, 357, 357, nil, + nil, nil, 357, 357, nil, nil, nil, 357, nil, 357, + 357, 357, 357, 357, 357, 357, nil, nil, nil, nil, + nil, 357, 357, 357, 357, 357, 357, 357, nil, nil, + 357, nil, nil, nil, nil, nil, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, nil, 357, + 357, 357, nil, 357, 357, nil, 357, 357, 357, 486, + 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, + nil, 486, 486, nil, nil, 486, 486, nil, 357, nil, + nil, 357, nil, nil, 357, 357, nil, nil, 357, nil, + 357, 486, nil, 486, 357, 486, 486, 486, 486, 486, + 486, 486, 357, 486, nil, nil, nil, 357, 357, 357, + 357, 357, 357, nil, nil, nil, 357, 357, nil, nil, + nil, nil, nil, nil, 357, nil, nil, 357, 357, 357, + nil, 357, 357, 572, 572, 572, 572, 572, 572, nil, + nil, nil, 572, 572, nil, nil, nil, 572, nil, 572, + 572, 572, 572, 572, 572, 572, nil, nil, nil, nil, + nil, 572, 572, 572, 572, 572, 572, 572, nil, nil, + 572, nil, nil, nil, nil, nil, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, nil, 572, + 572, 572, nil, 572, 572, nil, 572, 572, 572, 487, + 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, + nil, 487, 487, nil, nil, 487, 487, nil, 572, nil, + nil, 572, nil, nil, 572, 572, nil, nil, 572, nil, + 572, 487, nil, 487, 572, 487, 487, 487, 487, 487, + 487, 487, 572, 487, nil, nil, nil, 572, 572, 572, + 572, 572, 572, nil, nil, nil, 572, 572, nil, nil, + nil, nil, nil, nil, 572, nil, nil, 572, 572, 572, + nil, 572, 572, 575, 575, 575, 575, 575, 575, nil, + nil, nil, 575, 575, nil, nil, nil, 575, nil, 575, + 575, 575, 575, 575, 575, 575, nil, nil, nil, nil, + nil, 575, 575, 575, 575, 575, 575, 575, nil, nil, + 575, nil, nil, nil, nil, nil, 575, 575, 575, 575, + 575, 575, 575, 575, 575, 575, 575, 575, nil, 575, + 575, 575, nil, 575, 575, nil, 575, 575, 575, 497, + 497, 497, 497, 497, 497, 497, nil, nil, 497, 497, + nil, nil, nil, nil, nil, 497, 497, nil, 575, nil, + nil, 575, nil, nil, 575, 575, nil, nil, 575, nil, + 575, 497, nil, 497, 575, 497, 497, 497, 497, 497, + 497, 497, 575, 497, nil, nil, nil, 575, 575, 575, + 575, 575, 575, nil, nil, nil, 575, 575, nil, nil, + nil, nil, nil, nil, 575, nil, nil, 575, 575, 575, + nil, 575, 575, 598, 598, 598, 598, 598, 598, nil, + nil, nil, 598, 598, nil, nil, nil, 598, nil, 598, + 598, 598, 598, 598, 598, 598, nil, nil, nil, nil, + nil, 598, 598, 598, 598, 598, 598, 598, nil, nil, + 598, nil, nil, nil, nil, nil, 598, 598, 598, 598, + 598, 598, 598, 598, 598, 598, 598, 598, nil, 598, + 598, 598, nil, 598, 598, nil, 598, 598, 598, 498, + 498, 498, 498, 498, 498, 498, nil, nil, 498, 498, + nil, nil, nil, nil, nil, 498, 498, nil, 598, nil, + nil, 598, nil, nil, 598, 598, nil, nil, 598, nil, + 598, 498, nil, 498, 598, 498, 498, 498, 498, 498, + 498, 498, 598, 498, nil, nil, nil, 598, 598, 598, + 598, 598, 598, nil, nil, nil, 598, 598, nil, nil, + nil, nil, nil, nil, 598, nil, nil, 598, 598, 598, + nil, 598, 598, 660, 660, 660, 660, 660, 660, nil, + nil, nil, 660, 660, nil, nil, nil, 660, nil, 660, + 660, 660, 660, 660, 660, 660, nil, nil, nil, nil, + nil, 660, 660, 660, 660, 660, 660, 660, nil, nil, + 660, nil, nil, nil, nil, nil, 660, 660, 660, 660, + 660, 660, 660, 660, 660, 660, 660, 660, nil, 660, + 660, 660, nil, 660, 660, nil, 660, 660, 660, 499, + 499, 499, 499, 499, 499, 499, nil, nil, 499, 499, + nil, nil, nil, nil, nil, 499, 499, nil, 660, nil, + nil, 660, nil, nil, 660, 660, nil, nil, 660, nil, + 660, 499, nil, 499, 660, 499, 499, 499, 499, 499, + 499, 499, 660, 499, nil, nil, nil, 660, 660, 660, + 660, 660, 660, nil, nil, nil, 660, 660, nil, nil, + nil, nil, nil, nil, 660, nil, nil, 660, 660, 660, + nil, 660, 660, 759, 759, 759, 759, 759, 759, nil, + nil, nil, 759, 759, nil, nil, nil, 759, nil, 759, + 759, 759, 759, 759, 759, 759, nil, nil, nil, nil, + nil, 759, 759, 759, 759, 759, 759, 759, nil, nil, + 759, nil, nil, nil, nil, nil, 759, 759, 759, 759, + 759, 759, 759, 759, 759, 759, 759, 759, nil, 759, + 759, 759, nil, 759, 759, nil, 759, 759, 759, 500, + 500, 500, 500, 500, 500, 500, nil, nil, 500, 500, + nil, nil, nil, nil, nil, 500, 500, nil, 759, nil, + nil, 759, nil, nil, 759, 759, nil, nil, 759, nil, + 759, 500, nil, 500, 759, 500, 500, 500, 500, 500, + 500, 500, 759, 500, nil, nil, nil, 759, 759, 759, + 759, 759, 759, nil, nil, nil, 759, 759, nil, nil, + nil, nil, nil, nil, 759, nil, nil, 759, 759, 759, + nil, 759, 759, 764, 764, 764, 764, 764, 764, nil, + nil, nil, 764, 764, nil, nil, nil, 764, nil, 764, + 764, 764, 764, 764, 764, 764, nil, nil, nil, nil, + nil, 764, 764, 764, 764, 764, 764, 764, nil, nil, + 764, nil, nil, nil, nil, nil, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, nil, 764, + 764, 764, nil, 764, 764, nil, 764, 764, 764, 501, + 501, 501, 501, 501, 501, 501, nil, nil, 501, 501, + nil, nil, nil, nil, nil, 501, 501, nil, 764, nil, + nil, 764, nil, nil, 764, 764, nil, nil, 764, nil, + 764, 501, nil, 501, 764, 501, 501, 501, 501, 501, + 501, 501, 764, 501, nil, nil, nil, 764, 764, 764, + 764, 764, 764, nil, nil, nil, 764, 764, nil, nil, + nil, nil, nil, nil, 764, nil, nil, 764, 764, 764, + nil, 764, 764, 768, 768, 768, 768, 768, 768, nil, + nil, nil, 768, 768, nil, nil, nil, 768, nil, 768, + 768, 768, 768, 768, 768, 768, nil, nil, nil, nil, + nil, 768, 768, 768, 768, 768, 768, 768, nil, nil, + 768, nil, nil, nil, nil, nil, 768, 768, 768, 768, + 768, 768, 768, 768, 768, 768, 768, 768, nil, 768, + 768, 768, nil, 768, 768, nil, 768, 768, 768, 502, + 502, 502, 502, 502, 502, 502, nil, nil, 502, 502, + nil, nil, nil, nil, nil, 502, 502, nil, 768, nil, + nil, 768, nil, nil, 768, 768, nil, nil, 768, nil, + 768, 502, nil, 502, 768, 502, 502, 502, 502, 502, + 502, 502, 768, 502, nil, nil, nil, 768, 768, 768, + 768, 768, 768, nil, nil, nil, 768, 768, nil, nil, + nil, nil, nil, nil, 768, nil, nil, 768, 768, 768, + nil, 768, 768, 798, 798, 798, 798, 798, 798, nil, + nil, nil, 798, 798, nil, nil, nil, 798, nil, 798, + 798, 798, 798, 798, 798, 798, nil, nil, nil, nil, + nil, 798, 798, 798, 798, 798, 798, 798, nil, nil, + 798, nil, nil, nil, nil, nil, 798, 798, 798, 798, + 798, 798, 798, 798, 798, 798, 798, 798, nil, 798, + 798, 798, nil, 798, 798, nil, 798, 798, 798, 505, + 505, 505, 505, 505, 505, 505, nil, nil, 505, 505, + nil, nil, nil, nil, nil, 505, 505, nil, 798, nil, + nil, 798, nil, nil, 798, 798, nil, nil, 798, nil, + 798, 505, nil, 505, 798, 505, 505, 505, 505, 505, + 505, 505, 798, 505, nil, nil, nil, 798, 798, 798, + 798, 798, 798, nil, nil, nil, 798, 798, nil, nil, + nil, nil, nil, nil, 798, nil, nil, 798, 798, 798, + nil, 798, 798, 838, 838, 838, 838, 838, 838, nil, + nil, nil, 838, 838, nil, nil, nil, 838, nil, 838, + 838, 838, 838, 838, 838, 838, nil, nil, nil, nil, + nil, 838, 838, 838, 838, 838, 838, 838, nil, nil, + 838, nil, nil, nil, nil, nil, 838, 838, 838, 838, + 838, 838, 838, 838, 838, 838, 838, 838, nil, 838, + 838, 838, nil, 838, 838, nil, 838, 838, 838, 506, + 506, 506, 506, 506, 506, 506, 506, nil, 506, 506, + nil, nil, nil, nil, nil, 506, 506, nil, 838, nil, + nil, 838, nil, nil, 838, 838, nil, nil, 838, nil, + 838, 506, nil, 506, 838, 506, 506, 506, 506, 506, + 506, 506, 838, 506, nil, nil, nil, 838, 838, 838, + 838, 838, 838, nil, nil, nil, 838, 838, nil, nil, + nil, nil, nil, nil, 838, nil, nil, 838, 838, 838, + nil, 838, 838, 856, 856, 856, 856, 856, 856, nil, + nil, nil, 856, 856, nil, nil, nil, 856, nil, 856, + 856, 856, 856, 856, 856, 856, nil, nil, nil, nil, + nil, 856, 856, 856, 856, 856, 856, 856, nil, nil, + 856, nil, nil, nil, nil, nil, 856, 856, 856, 856, + 856, 856, 856, 856, 856, 856, 856, 856, nil, 856, + 856, 856, nil, 856, 856, nil, 856, 856, 856, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 856, nil, + nil, 856, nil, nil, 856, 856, nil, nil, 856, nil, + 856, nil, nil, nil, 856, nil, nil, nil, nil, nil, + nil, nil, 856, nil, nil, nil, nil, 856, 856, 856, + 856, 856, 856, nil, nil, nil, 856, 856, nil, nil, + nil, nil, nil, nil, 856, nil, nil, 856, 856, 856, + nil, 856, 856, 868, 868, 868, 868, 868, 868, nil, + nil, nil, 868, 868, nil, nil, nil, 868, nil, 868, + 868, 868, 868, 868, 868, 868, nil, nil, nil, nil, + nil, 868, 868, 868, 868, 868, 868, 868, nil, nil, + 868, nil, nil, nil, nil, nil, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, nil, 868, + 868, 868, nil, 868, 868, nil, 868, 868, 868, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 868, nil, + nil, 868, nil, nil, 868, 868, nil, nil, 868, nil, + 868, nil, nil, nil, 868, nil, nil, nil, nil, nil, + nil, nil, 868, nil, nil, nil, nil, 868, 868, 868, + 868, 868, 868, nil, nil, nil, 868, 868, nil, nil, + nil, nil, nil, nil, 868, nil, nil, 868, 868, 868, + nil, 868, 868, 888, 888, 888, 888, 888, 888, nil, + nil, nil, 888, 888, nil, nil, nil, 888, nil, 888, + 888, 888, 888, 888, 888, 888, nil, nil, nil, nil, + nil, 888, 888, 888, 888, 888, 888, 888, nil, nil, + 888, nil, nil, nil, nil, nil, 888, 888, 888, 888, + 888, 888, 888, 888, 888, 888, 888, 888, nil, 888, + 888, 888, nil, 888, 888, nil, 888, 888, 888, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 888, nil, + nil, 888, nil, nil, 888, 888, nil, nil, 888, nil, + 888, nil, nil, nil, 888, nil, nil, nil, nil, nil, + nil, nil, 888, nil, nil, nil, nil, 888, 888, 888, + 888, 888, 888, nil, nil, nil, 888, 888, nil, nil, + nil, nil, nil, nil, 888, nil, nil, 888, 888, 888, + nil, 888, 888, 889, 889, 889, 889, 889, 889, nil, + nil, nil, 889, 889, nil, nil, nil, 889, nil, 889, + 889, 889, 889, 889, 889, 889, nil, nil, nil, nil, + nil, 889, 889, 889, 889, 889, 889, 889, nil, nil, + 889, nil, nil, nil, nil, nil, 889, 889, 889, 889, + 889, 889, 889, 889, 889, 889, 889, 889, nil, 889, + 889, 889, nil, 889, 889, nil, 889, 889, 889, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 889, nil, + nil, 889, nil, nil, 889, 889, nil, nil, 889, nil, + 889, nil, nil, nil, 889, nil, nil, nil, nil, nil, + nil, nil, 889, nil, nil, nil, nil, 889, 889, 889, + 889, 889, 889, nil, nil, nil, 889, 889, nil, nil, + nil, nil, nil, nil, 889, nil, nil, 889, 889, 889, + nil, 889, 889, 939, 939, 939, 939, 939, 939, nil, + nil, nil, 939, 939, nil, nil, nil, 939, nil, 939, + 939, 939, 939, 939, 939, 939, nil, nil, nil, nil, + nil, 939, 939, 939, 939, 939, 939, 939, nil, nil, + 939, nil, nil, nil, nil, nil, 939, 939, 939, 939, + 939, 939, 939, 939, 939, 939, 939, 939, nil, 939, + 939, 939, nil, 939, 939, nil, 939, 939, 939, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 939, nil, + nil, 939, nil, nil, 939, 939, nil, nil, 939, nil, + 939, nil, nil, nil, 939, nil, nil, nil, nil, nil, + nil, nil, 939, nil, nil, nil, nil, 939, 939, 939, + 939, 939, 939, nil, nil, nil, 939, 939, nil, nil, + nil, nil, nil, nil, 939, nil, nil, 939, 939, 939, + nil, 939, 939, 940, 940, 940, 940, 940, 940, nil, + nil, nil, 940, 940, nil, nil, nil, 940, nil, 940, + 940, 940, 940, 940, 940, 940, nil, nil, nil, nil, + nil, 940, 940, 940, 940, 940, 940, 940, nil, nil, + 940, nil, nil, nil, nil, nil, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, nil, 940, + 940, 940, nil, 940, 940, nil, 940, 940, 940, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 940, nil, + nil, 940, nil, nil, 940, 940, nil, nil, 940, nil, + 940, nil, nil, nil, 940, nil, nil, nil, nil, nil, + nil, nil, 940, nil, nil, nil, nil, 940, 940, 940, + 940, 940, 940, nil, nil, nil, 940, 940, nil, nil, + nil, nil, nil, nil, 940, nil, nil, 940, 940, 940, + nil, 940, 940, 952, 952, 952, 952, 952, 952, nil, + nil, nil, 952, 952, nil, nil, nil, 952, nil, 952, + 952, 952, 952, 952, 952, 952, nil, nil, nil, nil, + nil, 952, 952, 952, 952, 952, 952, 952, nil, nil, + 952, nil, nil, nil, nil, nil, 952, 952, 952, 952, + 952, 952, 952, 952, 952, 952, 952, 952, nil, 952, + 952, 952, nil, 952, 952, nil, 952, 952, 952, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 952, nil, + nil, 952, nil, nil, 952, 952, nil, nil, 952, nil, + 952, nil, nil, nil, 952, nil, nil, nil, nil, nil, + nil, nil, 952, nil, nil, nil, nil, 952, 952, 952, + 952, 952, 952, nil, nil, nil, 952, 952, nil, nil, + nil, nil, nil, nil, 952, nil, nil, 952, 952, 952, + nil, 952, 952, 956, 956, 956, 956, 956, 956, nil, + nil, nil, 956, 956, nil, nil, nil, 956, nil, 956, + 956, 956, 956, 956, 956, 956, nil, nil, nil, nil, + nil, 956, 956, 956, 956, 956, 956, 956, nil, nil, + 956, nil, nil, nil, nil, nil, 956, 956, 956, 956, + 956, 956, 956, 956, 956, 956, 956, 956, nil, 956, + 956, 956, nil, 956, 956, nil, 956, 956, 956, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 956, nil, + nil, 956, nil, nil, 956, 956, nil, nil, 956, nil, + 956, nil, nil, nil, 956, nil, nil, nil, nil, nil, + nil, nil, 956, nil, nil, nil, nil, 956, 956, 956, + 956, 956, 956, nil, nil, nil, 956, 956, nil, nil, + nil, nil, nil, nil, 956, nil, nil, 956, 956, 956, + nil, 956, 956, 997, 997, 997, 997, 997, 997, nil, + nil, nil, 997, 997, nil, nil, nil, 997, nil, 997, + 997, 997, 997, 997, 997, 997, nil, nil, nil, nil, + nil, 997, 997, 997, 997, 997, 997, 997, nil, nil, + 997, nil, nil, nil, nil, nil, 997, 997, 997, 997, + 997, 997, 997, 997, 997, 997, 997, 997, nil, 997, + 997, 997, nil, 997, 997, nil, 997, 997, 997, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 997, nil, + nil, 997, nil, nil, 997, 997, nil, nil, 997, nil, + 997, nil, nil, nil, 997, nil, nil, nil, nil, nil, + nil, nil, 997, nil, nil, nil, nil, 997, 997, 997, + 997, 997, 997, nil, nil, nil, 997, 997, nil, nil, + nil, nil, nil, nil, 997, nil, nil, 997, 997, 997, + nil, 997, 997, 1004, 1004, 1004, 1004, 1004, 1004, nil, + nil, nil, 1004, 1004, nil, nil, nil, 1004, nil, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, nil, nil, nil, nil, + nil, 1004, 1004, 1004, 1004, 1004, 1004, 1004, nil, nil, + 1004, nil, nil, nil, nil, nil, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, nil, 1004, + 1004, 1004, nil, 1004, 1004, nil, 1004, 1004, 1004, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1004, nil, + nil, 1004, nil, nil, 1004, 1004, nil, nil, 1004, nil, + 1004, nil, nil, nil, 1004, nil, nil, nil, nil, nil, + nil, nil, 1004, nil, nil, nil, nil, 1004, 1004, 1004, + 1004, 1004, 1004, nil, nil, nil, 1004, 1004, nil, nil, + nil, nil, nil, nil, 1004, nil, nil, 1004, 1004, 1004, + nil, 1004, 1004, 1009, 1009, 1009, 1009, 1009, 1009, nil, + nil, nil, 1009, 1009, nil, nil, nil, 1009, nil, 1009, + 1009, 1009, 1009, 1009, 1009, 1009, nil, nil, nil, nil, + nil, 1009, 1009, 1009, 1009, 1009, 1009, 1009, nil, nil, + 1009, nil, nil, nil, nil, nil, 1009, 1009, 1009, 1009, + 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, nil, 1009, + 1009, 1009, nil, 1009, 1009, nil, 1009, 1009, 1009, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1009, nil, + nil, 1009, nil, nil, 1009, 1009, nil, nil, 1009, nil, + 1009, nil, nil, nil, 1009, nil, nil, nil, nil, nil, + nil, nil, 1009, nil, nil, nil, nil, 1009, 1009, 1009, + 1009, 1009, 1009, nil, nil, nil, 1009, 1009, nil, nil, + nil, nil, nil, nil, 1009, nil, nil, 1009, 1009, 1009, + nil, 1009, 1009, 8, 8, 8, 8, 8, nil, nil, + nil, 8, 8, nil, nil, nil, 8, nil, 8, 8, + 8, 8, 8, 8, 8, nil, nil, nil, nil, nil, + 8, 8, 8, 8, 8, 8, 8, nil, nil, 8, + nil, nil, nil, nil, nil, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, nil, 8, 8, + 8, nil, 8, 8, nil, 8, 8, 8, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 8, nil, nil, + 8, nil, nil, 8, 8, nil, nil, 8, nil, 8, + nil, nil, nil, 8, nil, nil, nil, nil, nil, nil, + nil, 8, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, nil, nil, nil, 8, 8, nil, nil, nil, + nil, nil, nil, 8, nil, nil, 8, 8, 8, nil, + 8, 8, 23, 23, 23, nil, 23, nil, nil, nil, + 23, 23, nil, nil, nil, 23, nil, 23, 23, 23, + 23, 23, 23, 23, nil, nil, nil, nil, nil, 23, + 23, 23, 23, 23, 23, 23, nil, nil, 23, nil, + nil, nil, nil, nil, nil, 23, nil, nil, 23, 23, + 23, 23, 23, 23, 23, 23, nil, 23, 23, 23, + nil, 23, 23, nil, 23, 23, 23, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, 23, + nil, nil, 23, 23, nil, nil, 23, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 23, 23, 23, 23, 23, + 23, nil, nil, nil, 23, 23, nil, nil, nil, nil, + nil, nil, 23, nil, nil, 23, 23, 23, nil, 23, + 23, 32, 32, 32, nil, 32, nil, nil, nil, 32, + 32, nil, nil, nil, 32, nil, 32, 32, 32, 32, + 32, 32, 32, nil, nil, nil, nil, nil, 32, 32, + 32, 32, 32, 32, 32, nil, nil, 32, nil, nil, + nil, nil, nil, nil, 32, nil, nil, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, nil, + 32, 32, nil, 32, 32, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, 32, nil, + nil, 32, 32, nil, nil, 32, nil, 32, nil, 32, + nil, 32, nil, nil, nil, nil, nil, nil, nil, 32, + nil, nil, nil, nil, 32, 32, 32, 32, 32, 32, + nil, nil, nil, 32, 32, nil, nil, nil, nil, nil, + nil, 32, nil, 32, 32, 32, 32, nil, 32, 32, + 33, 33, 33, nil, 33, nil, nil, nil, 33, 33, + nil, nil, nil, 33, nil, 33, 33, 33, 33, 33, + 33, 33, nil, nil, nil, nil, nil, 33, 33, 33, + 33, 33, 33, 33, nil, nil, 33, nil, nil, nil, + nil, nil, nil, 33, nil, nil, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, nil, 33, + 33, nil, 33, 33, 33, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 33, nil, nil, 33, nil, nil, + 33, 33, nil, nil, 33, nil, 33, nil, 33, nil, + 33, nil, nil, nil, nil, nil, nil, nil, 33, nil, + nil, nil, nil, 33, 33, 33, 33, 33, 33, nil, + nil, nil, 33, 33, nil, nil, nil, nil, nil, nil, + 33, nil, 33, 33, 33, 33, nil, 33, 33, 34, + 34, 34, nil, 34, nil, nil, nil, 34, 34, nil, + nil, nil, 34, nil, 34, 34, 34, 34, 34, 34, + 34, nil, nil, nil, nil, nil, 34, 34, 34, 34, + 34, 34, 34, nil, nil, 34, nil, nil, nil, nil, + nil, nil, 34, nil, nil, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, nil, 34, 34, + nil, 34, 34, 34, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 34, nil, nil, 34, nil, nil, 34, + 34, nil, nil, 34, nil, 34, nil, 34, nil, 34, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + nil, nil, 34, 34, 34, 34, 34, 34, nil, nil, + nil, 34, 34, nil, nil, nil, nil, nil, nil, 34, + nil, 34, 34, 34, 34, nil, 34, 34, 37, 37, + 37, nil, 37, nil, nil, nil, 37, 37, nil, nil, + nil, 37, nil, 37, 37, 37, 37, 37, 37, 37, + nil, nil, nil, nil, nil, 37, 37, 37, 37, 37, + 37, 37, nil, nil, 37, nil, nil, nil, nil, nil, + nil, 37, nil, nil, 37, 37, 37, 37, 37, 37, + 37, 37, nil, 37, 37, 37, nil, 37, 37, nil, + nil, nil, 37, nil, nil, nil, nil, nil, 972, nil, + 972, 972, 972, 972, 972, nil, nil, nil, nil, nil, + nil, nil, 37, nil, 972, 37, nil, nil, 37, 37, + nil, nil, 37, nil, 37, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 972, nil, nil, nil, + nil, 37, 37, 37, 37, 37, 37, 972, 972, nil, + 37, 37, nil, nil, nil, nil, nil, nil, 37, nil, + nil, 37, 37, 37, nil, 37, 37, 38, 38, 38, + nil, 38, nil, nil, nil, 38, 38, nil, nil, nil, + 38, 972, 38, 38, 38, 38, 38, 38, 38, nil, + nil, nil, nil, nil, 38, 38, 38, 38, 38, 38, + 38, nil, nil, 38, nil, nil, nil, nil, nil, nil, + 38, nil, nil, 38, 38, 38, 38, 38, 38, 38, + 38, nil, 38, 38, 38, nil, 38, 38, nil, nil, + nil, 38, nil, nil, nil, nil, nil, 988, nil, 988, + 988, 988, 988, 988, nil, nil, nil, nil, nil, nil, + nil, 38, nil, 988, 38, nil, nil, 38, 38, nil, + nil, 38, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 988, nil, nil, nil, nil, + 38, 38, 38, 38, 38, 38, 988, 988, nil, 38, + 38, nil, nil, nil, 38, nil, nil, 38, nil, nil, + 38, 38, 38, nil, 38, 38, 45, 45, 45, nil, + 45, nil, nil, nil, 45, 45, nil, nil, nil, 45, + 988, 45, 45, 45, 45, 45, 45, 45, nil, nil, + nil, nil, nil, 45, 45, 45, 45, 45, 45, 45, + nil, nil, 45, nil, nil, nil, nil, nil, nil, 45, + nil, nil, 45, 45, 45, 45, 45, 45, 45, 45, + nil, 45, 45, 45, nil, 45, 45, nil, 45, 45, + 45, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 45, nil, nil, 45, nil, nil, 45, 45, nil, nil, + 45, nil, nil, nil, nil, nil, 45, nil, nil, nil, + nil, nil, nil, nil, 45, nil, nil, nil, nil, 45, + 45, 45, 45, 45, 45, nil, nil, nil, 45, 45, + nil, nil, nil, nil, nil, nil, 45, nil, nil, 45, + 45, 45, nil, 45, 45, 46, 46, 46, nil, 46, + nil, nil, nil, 46, 46, nil, nil, nil, 46, nil, + 46, 46, 46, 46, 46, 46, 46, nil, nil, nil, + nil, nil, 46, 46, 46, 46, 46, 46, 46, nil, + nil, 46, nil, nil, nil, nil, nil, nil, 46, nil, + nil, 46, 46, 46, 46, 46, 46, 46, 46, nil, + 46, 46, 46, nil, 46, 46, nil, 46, 46, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 46, + nil, nil, 46, nil, nil, 46, 46, nil, nil, 46, + nil, nil, nil, nil, nil, 46, nil, nil, nil, nil, + nil, nil, nil, 46, nil, nil, nil, nil, 46, 46, + 46, 46, 46, 46, nil, nil, nil, 46, 46, nil, + nil, nil, nil, nil, nil, 46, nil, nil, 46, 46, + 46, nil, 46, 46, 48, 48, 48, nil, 48, nil, + nil, nil, 48, 48, nil, nil, nil, 48, nil, 48, + 48, 48, 48, 48, 48, 48, nil, nil, nil, nil, + nil, 48, 48, 48, 48, 48, 48, 48, nil, nil, + 48, nil, nil, nil, nil, nil, nil, 48, nil, nil, + 48, 48, 48, 48, 48, 48, 48, 48, nil, 48, + 48, 48, nil, 48, 48, nil, 48, 48, 48, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 48, nil, + nil, 48, nil, nil, 48, 48, nil, nil, 48, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, 48, 48, 48, + 48, 48, 48, nil, nil, nil, 48, 48, nil, nil, + nil, nil, nil, nil, 48, nil, nil, 48, 48, 48, + nil, 48, 48, 62, 62, 62, 62, 62, nil, nil, + nil, 62, 62, nil, nil, nil, 62, nil, 62, 62, + 62, 62, 62, 62, 62, nil, nil, nil, nil, nil, + 62, 62, 62, 62, 62, 62, 62, nil, nil, 62, + nil, nil, nil, nil, nil, 62, 62, nil, 62, 62, + 62, 62, 62, 62, 62, 62, 62, nil, 62, 62, + 62, nil, 62, 62, nil, 62, 62, 62, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 62, nil, nil, + 62, nil, nil, 62, 62, nil, nil, 62, nil, 62, + nil, nil, nil, 62, nil, nil, nil, nil, nil, nil, + nil, 62, nil, nil, nil, nil, 62, 62, 62, 62, + 62, 62, nil, nil, nil, 62, 62, nil, nil, nil, + nil, nil, nil, 62, nil, nil, 62, 62, 62, nil, + 62, 62, 67, 67, 67, nil, 67, nil, nil, nil, + 67, 67, nil, nil, nil, 67, nil, 67, 67, 67, + 67, 67, 67, 67, nil, nil, nil, nil, nil, 67, + 67, 67, 67, 67, 67, 67, nil, nil, 67, nil, + nil, nil, nil, nil, nil, 67, nil, nil, 67, 67, + 67, 67, 67, 67, 67, 67, nil, 67, 67, 67, + nil, 67, 67, nil, 67, 67, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, 67, + nil, nil, 67, 67, nil, nil, 67, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, 67, 67, 67, 67, 67, + 67, nil, nil, nil, 67, 67, nil, nil, nil, nil, + nil, nil, 67, nil, nil, 67, 67, 67, nil, 67, + 67, 68, 68, 68, nil, 68, nil, nil, nil, 68, + 68, nil, nil, nil, 68, nil, 68, 68, 68, 68, + 68, 68, 68, nil, nil, nil, nil, nil, 68, 68, + 68, 68, 68, 68, 68, nil, nil, 68, nil, nil, + nil, nil, nil, nil, 68, nil, nil, 68, 68, 68, + 68, 68, 68, 68, 68, nil, 68, 68, 68, nil, + 68, 68, nil, 68, 68, 68, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 68, nil, nil, 68, nil, + nil, 68, 68, nil, nil, 68, nil, nil, nil, nil, + nil, 68, nil, nil, nil, nil, nil, nil, nil, 68, + nil, nil, nil, nil, 68, 68, 68, 68, 68, 68, + nil, nil, nil, 68, 68, nil, nil, nil, nil, nil, + nil, 68, nil, nil, 68, 68, 68, nil, 68, 68, + 71, 71, 71, nil, 71, nil, nil, nil, 71, 71, + nil, nil, nil, 71, nil, 71, 71, 71, 71, 71, + 71, 71, nil, nil, nil, nil, nil, 71, 71, 71, + 71, 71, 71, 71, nil, nil, 71, nil, nil, nil, + nil, nil, nil, 71, nil, nil, 71, 71, 71, 71, + 71, 71, 71, 71, nil, 71, 71, 71, nil, 71, + 71, nil, 71, 71, 71, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 71, nil, nil, 71, nil, nil, + 71, 71, nil, nil, 71, nil, nil, nil, nil, nil, + 71, nil, nil, nil, nil, nil, nil, nil, 71, nil, + nil, nil, nil, 71, 71, 71, 71, 71, 71, nil, + nil, nil, 71, 71, 71, nil, nil, nil, nil, 71, + 71, nil, nil, 71, 71, 71, nil, 71, 71, 72, + 72, 72, nil, 72, nil, nil, nil, 72, 72, nil, + nil, nil, 72, nil, 72, 72, 72, 72, 72, 72, + 72, nil, nil, nil, nil, nil, 72, 72, 72, 72, + 72, 72, 72, nil, nil, 72, nil, nil, nil, nil, + nil, nil, 72, nil, nil, 72, 72, 72, 72, 72, + 72, 72, 72, nil, 72, 72, 72, nil, 72, 72, + nil, nil, nil, 72, nil, nil, nil, nil, nil, 1050, + nil, 1050, 1050, 1050, 1050, 1050, nil, nil, nil, nil, + nil, nil, nil, 72, nil, 1050, 72, nil, nil, 72, + 72, nil, nil, 72, nil, 72, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1050, nil, nil, + nil, nil, 72, 72, 72, 72, 72, 72, 1050, 1050, + nil, 72, 72, nil, nil, nil, nil, nil, nil, 72, + nil, nil, 72, 72, 72, nil, 72, 72, 73, 73, + 73, nil, 73, nil, nil, nil, 73, 73, nil, nil, + nil, 73, 1050, 73, 73, 73, 73, 73, 73, 73, + nil, nil, nil, nil, nil, 73, 73, 73, 73, 73, + 73, 73, nil, nil, 73, nil, nil, nil, nil, nil, + nil, 73, nil, nil, 73, 73, 73, 73, 73, 73, + 73, 73, nil, 73, 73, 73, nil, 73, 73, nil, + nil, nil, 73, nil, nil, nil, nil, nil, 1059, nil, + 1059, 1059, 1059, 1059, 1059, nil, nil, nil, nil, 73, + nil, nil, 73, nil, 1059, 73, nil, nil, 73, 73, + nil, nil, 73, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1059, nil, nil, nil, + nil, 73, 73, 73, 73, 73, 73, 1059, 1059, nil, + 73, 73, nil, nil, nil, nil, nil, nil, 73, nil, + nil, 73, 73, 73, nil, 73, 73, 74, 74, 74, + nil, 74, nil, nil, nil, 74, 74, nil, nil, nil, + 74, 1059, 74, 74, 74, 74, 74, 74, 74, nil, + nil, nil, nil, nil, 74, 74, 74, 74, 74, 74, + 74, nil, nil, 74, nil, nil, nil, nil, nil, nil, + 74, nil, nil, 74, 74, 74, 74, 74, 74, 74, + 74, nil, 74, 74, 74, nil, 74, 74, nil, nil, + nil, 74, nil, nil, nil, nil, nil, 1061, nil, 1061, + 1061, 1061, 1061, 1061, nil, nil, nil, nil, nil, nil, + nil, 74, nil, 1061, 74, nil, nil, 74, 74, nil, + nil, 74, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1061, nil, nil, nil, nil, + 74, 74, 74, 74, 74, 74, 1061, 1061, nil, 74, + 74, nil, nil, nil, nil, nil, nil, 74, nil, nil, + 74, 74, 74, nil, 74, 74, 128, 128, 128, 128, + 128, nil, nil, nil, 128, 128, nil, nil, nil, 128, + 1061, 128, 128, 128, 128, 128, 128, 128, nil, nil, + nil, nil, nil, 128, 128, 128, 128, 128, 128, 128, + nil, nil, 128, nil, nil, nil, nil, nil, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + nil, 128, 128, 128, nil, 128, 128, nil, 128, 128, + 128, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 128, nil, nil, 128, nil, nil, 128, 128, nil, nil, + 128, nil, 128, nil, nil, nil, 128, nil, nil, nil, + nil, nil, nil, nil, 128, nil, nil, nil, nil, 128, + 128, 128, 128, 128, 128, nil, nil, nil, 128, 128, + nil, nil, nil, nil, nil, 128, 128, nil, nil, 128, + 128, 128, nil, 128, 128, 133, 133, 133, nil, 133, + nil, nil, nil, 133, 133, nil, nil, nil, 133, nil, + 133, 133, 133, 133, 133, 133, 133, nil, nil, nil, + nil, nil, 133, 133, 133, 133, 133, 133, 133, nil, + nil, 133, nil, nil, nil, nil, nil, nil, 133, nil, + nil, 133, 133, 133, 133, 133, 133, 133, 133, nil, + 133, 133, 133, nil, 133, 133, nil, 133, 133, 133, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 133, + nil, nil, 133, nil, nil, 133, 133, nil, nil, 133, + nil, nil, nil, nil, nil, 133, nil, nil, nil, nil, + nil, nil, nil, 133, nil, nil, nil, nil, 133, 133, + 133, 133, 133, 133, nil, nil, nil, 133, 133, nil, + nil, nil, nil, nil, nil, 133, nil, nil, 133, 133, + 133, nil, 133, 133, 134, 134, 134, nil, 134, nil, + nil, nil, 134, 134, nil, nil, nil, 134, nil, 134, + 134, 134, 134, 134, 134, 134, nil, nil, nil, nil, + nil, 134, 134, 134, 134, 134, 134, 134, nil, nil, + 134, nil, nil, nil, nil, nil, nil, 134, nil, nil, + 134, 134, 134, 134, 134, 134, 134, 134, nil, 134, + 134, 134, nil, 134, 134, nil, 134, 134, 134, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 134, nil, + nil, 134, nil, nil, 134, 134, nil, nil, 134, nil, + nil, nil, nil, nil, 134, nil, nil, nil, nil, nil, + nil, nil, 134, nil, nil, nil, nil, 134, 134, 134, + 134, 134, 134, nil, nil, nil, 134, 134, nil, nil, + nil, nil, nil, nil, 134, nil, nil, 134, 134, 134, + nil, 134, 134, 135, 135, 135, nil, 135, nil, nil, + nil, 135, 135, nil, nil, nil, 135, nil, 135, 135, + 135, 135, 135, 135, 135, nil, nil, nil, nil, nil, + 135, 135, 135, 135, 135, 135, 135, nil, nil, 135, + nil, nil, nil, nil, nil, nil, 135, nil, nil, 135, + 135, 135, 135, 135, 135, 135, 135, nil, 135, 135, + 135, nil, 135, 135, nil, 135, 135, 135, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 135, nil, nil, + 135, nil, nil, 135, 135, nil, nil, 135, nil, nil, + nil, nil, nil, 135, nil, nil, nil, nil, nil, nil, + nil, 135, nil, nil, nil, nil, 135, 135, 135, 135, + 135, 135, nil, nil, nil, 135, 135, nil, nil, nil, + nil, nil, nil, 135, nil, nil, 135, 135, 135, nil, + 135, 135, 136, 136, 136, nil, 136, nil, nil, nil, + 136, 136, nil, nil, nil, 136, nil, 136, 136, 136, + 136, 136, 136, 136, nil, nil, nil, nil, nil, 136, + 136, 136, 136, 136, 136, 136, nil, nil, 136, nil, + nil, nil, nil, nil, nil, 136, nil, nil, 136, 136, + 136, 136, 136, 136, 136, 136, nil, 136, 136, 136, + nil, 136, 136, nil, 136, 136, 136, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 136, nil, nil, 136, + nil, nil, 136, 136, nil, nil, 136, nil, nil, nil, + nil, nil, 136, nil, nil, nil, nil, nil, nil, nil, + 136, nil, nil, nil, nil, 136, 136, 136, 136, 136, + 136, nil, nil, nil, 136, 136, nil, nil, nil, nil, + nil, nil, 136, nil, nil, 136, 136, 136, nil, 136, + 136, 137, 137, 137, 137, 137, nil, nil, nil, 137, + 137, nil, nil, nil, 137, nil, 137, 137, 137, 137, + 137, 137, 137, nil, nil, nil, nil, nil, 137, 137, + 137, 137, 137, 137, 137, nil, nil, 137, nil, nil, + nil, nil, nil, 137, 137, nil, 137, 137, 137, 137, + 137, 137, 137, 137, 137, nil, 137, 137, 137, nil, + 137, 137, nil, 137, 137, 137, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 137, nil, nil, 137, nil, + nil, 137, 137, nil, nil, 137, nil, 137, nil, nil, + nil, 137, nil, nil, nil, nil, nil, nil, nil, 137, + nil, nil, nil, nil, 137, 137, 137, 137, 137, 137, + nil, nil, nil, 137, 137, nil, nil, nil, nil, nil, + nil, 137, nil, nil, 137, 137, 137, nil, 137, 137, + 222, 222, 222, nil, 222, nil, nil, nil, 222, 222, + nil, nil, nil, 222, nil, 222, 222, 222, 222, 222, + 222, 222, nil, nil, nil, nil, nil, 222, 222, 222, + 222, 222, 222, 222, nil, nil, 222, nil, nil, nil, + nil, nil, nil, 222, nil, nil, 222, 222, 222, 222, + 222, 222, 222, 222, nil, 222, 222, 222, nil, 222, + 222, nil, 222, 222, 222, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 222, nil, nil, 222, nil, nil, + 222, 222, nil, nil, 222, nil, 222, nil, nil, nil, + 222, nil, nil, nil, nil, nil, nil, nil, 222, nil, + nil, nil, nil, 222, 222, 222, 222, 222, 222, nil, + nil, nil, 222, 222, nil, nil, nil, nil, nil, nil, + 222, nil, nil, 222, 222, 222, nil, 222, 222, 223, + 223, 223, nil, 223, nil, nil, nil, 223, 223, nil, + nil, nil, 223, nil, 223, 223, 223, 223, 223, 223, + 223, nil, nil, nil, nil, nil, 223, 223, 223, 223, + 223, 223, 223, nil, nil, 223, nil, nil, nil, nil, + nil, nil, 223, nil, nil, 223, 223, 223, 223, 223, + 223, 223, 223, nil, 223, 223, 223, nil, 223, 223, + nil, 223, 223, 223, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 223, nil, nil, 223, nil, nil, 223, + 223, nil, nil, 223, nil, 223, nil, nil, nil, 223, + nil, nil, nil, nil, nil, nil, nil, 223, nil, nil, + nil, nil, 223, 223, 223, 223, 223, 223, nil, nil, + nil, 223, 223, nil, nil, nil, nil, nil, nil, 223, + nil, nil, 223, 223, 223, nil, 223, 223, 224, 224, + 224, nil, 224, nil, nil, nil, 224, 224, nil, nil, + nil, 224, nil, 224, 224, 224, 224, 224, 224, 224, + nil, nil, nil, nil, nil, 224, 224, 224, 224, 224, + 224, 224, nil, nil, 224, nil, nil, nil, nil, nil, + nil, 224, nil, nil, 224, 224, 224, 224, 224, 224, + 224, 224, nil, 224, 224, 224, nil, 224, 224, nil, + 224, 224, 224, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 224, nil, nil, 224, nil, nil, 224, 224, + nil, nil, 224, nil, nil, nil, nil, nil, 224, nil, + nil, nil, nil, nil, nil, nil, 224, nil, nil, nil, + nil, 224, 224, 224, 224, 224, 224, nil, nil, nil, + 224, 224, nil, nil, nil, nil, nil, nil, 224, nil, + nil, 224, 224, 224, nil, 224, 224, 225, 225, 225, + nil, 225, nil, nil, nil, 225, 225, nil, nil, nil, + 225, nil, 225, 225, 225, 225, 225, 225, 225, nil, + nil, nil, nil, nil, 225, 225, 225, 225, 225, 225, + 225, nil, nil, 225, nil, nil, nil, nil, nil, nil, + 225, nil, nil, 225, 225, 225, 225, 225, 225, 225, + 225, nil, 225, 225, 225, nil, 225, 225, nil, 225, + 225, 225, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 225, nil, nil, 225, nil, nil, 225, 225, nil, + nil, 225, nil, nil, nil, nil, nil, 225, nil, nil, + nil, nil, nil, nil, nil, 225, nil, nil, nil, nil, + 225, 225, 225, 225, 225, 225, nil, nil, nil, 225, + 225, nil, nil, nil, nil, nil, nil, 225, nil, nil, + 225, 225, 225, nil, 225, 225, 226, 226, 226, nil, + 226, nil, nil, nil, 226, 226, nil, nil, nil, 226, + nil, 226, 226, 226, 226, 226, 226, 226, nil, nil, + nil, nil, nil, 226, 226, 226, 226, 226, 226, 226, + nil, nil, 226, nil, nil, nil, nil, nil, nil, 226, + nil, nil, 226, 226, 226, 226, 226, 226, 226, 226, + nil, 226, 226, 226, nil, 226, 226, nil, 226, 226, + 226, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 226, nil, nil, 226, nil, nil, 226, 226, nil, nil, + 226, nil, nil, nil, nil, nil, 226, nil, nil, nil, + nil, nil, nil, nil, 226, nil, nil, nil, nil, 226, + 226, 226, 226, 226, 226, nil, nil, nil, 226, 226, + nil, nil, nil, nil, nil, nil, 226, nil, nil, 226, + 226, 226, nil, 226, 226, 227, 227, 227, nil, 227, + nil, nil, nil, 227, 227, nil, nil, nil, 227, nil, + 227, 227, 227, 227, 227, 227, 227, nil, nil, nil, + nil, nil, 227, 227, 227, 227, 227, 227, 227, nil, + nil, 227, nil, nil, nil, nil, nil, nil, 227, nil, + nil, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, nil, 227, 227, nil, 227, 227, 227, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 227, + nil, nil, 227, nil, nil, 227, 227, nil, nil, 227, + nil, 227, nil, 227, nil, 227, nil, nil, nil, nil, + nil, nil, nil, 227, nil, nil, nil, nil, 227, 227, + 227, 227, 227, 227, nil, nil, nil, 227, 227, nil, + nil, nil, nil, nil, nil, 227, nil, 227, 227, 227, + 227, nil, 227, 227, 232, 232, 232, nil, 232, nil, + nil, nil, 232, 232, nil, nil, nil, 232, nil, 232, + 232, 232, 232, 232, 232, 232, nil, nil, nil, nil, + nil, 232, 232, 232, 232, 232, 232, 232, nil, nil, + 232, nil, nil, nil, nil, nil, nil, 232, nil, nil, + 232, 232, 232, 232, 232, 232, 232, 232, nil, 232, + 232, 232, nil, 232, 232, nil, 232, 232, 232, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 232, nil, + nil, 232, nil, nil, 232, 232, nil, nil, 232, nil, + nil, nil, nil, nil, 232, nil, nil, nil, nil, nil, + nil, nil, 232, nil, nil, nil, nil, 232, 232, 232, + 232, 232, 232, nil, nil, nil, 232, 232, nil, nil, + nil, nil, nil, nil, 232, nil, nil, 232, 232, 232, + nil, 232, 232, 233, 233, 233, nil, 233, nil, nil, + nil, 233, 233, nil, nil, nil, 233, nil, 233, 233, + 233, 233, 233, 233, 233, nil, nil, nil, nil, nil, + 233, 233, 233, 233, 233, 233, 233, nil, nil, 233, + nil, nil, nil, nil, nil, nil, 233, nil, nil, 233, + 233, 233, 233, 233, 233, 233, 233, nil, 233, 233, + 233, nil, 233, 233, nil, 233, 233, 233, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 233, nil, nil, + 233, nil, nil, 233, 233, nil, nil, 233, nil, nil, + nil, nil, nil, 233, nil, nil, nil, nil, nil, nil, + nil, 233, nil, nil, nil, nil, 233, 233, 233, 233, + 233, 233, nil, nil, nil, 233, 233, nil, nil, nil, + nil, nil, nil, 233, nil, nil, 233, 233, 233, nil, + 233, 233, 234, 234, 234, nil, 234, nil, nil, nil, + 234, 234, nil, nil, nil, 234, nil, 234, 234, 234, + 234, 234, 234, 234, nil, nil, nil, nil, nil, 234, + 234, 234, 234, 234, 234, 234, nil, nil, 234, nil, + nil, nil, nil, nil, nil, 234, nil, nil, 234, 234, + 234, 234, 234, 234, 234, 234, nil, 234, 234, 234, + nil, 234, 234, nil, 234, 234, 234, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 234, nil, nil, 234, + nil, nil, 234, 234, nil, nil, 234, nil, nil, nil, + nil, nil, 234, nil, nil, nil, nil, nil, nil, nil, + 234, nil, nil, nil, nil, 234, 234, 234, 234, 234, + 234, nil, nil, nil, 234, 234, 234, nil, nil, nil, + nil, nil, 234, nil, nil, 234, 234, 234, nil, 234, + 234, 245, 245, 245, nil, 245, nil, nil, nil, 245, + 245, nil, nil, nil, 245, nil, 245, 245, 245, 245, + 245, 245, 245, nil, nil, nil, nil, nil, 245, 245, + 245, 245, 245, 245, 245, nil, nil, 245, nil, nil, + nil, nil, nil, nil, 245, nil, nil, 245, 245, 245, + 245, 245, 245, 245, 245, nil, 245, 245, 245, nil, + 245, 245, nil, 245, 245, 245, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 245, nil, nil, 245, nil, + nil, 245, 245, nil, nil, 245, nil, nil, nil, nil, + nil, 245, nil, nil, nil, nil, nil, nil, nil, 245, + nil, nil, nil, nil, 245, 245, 245, 245, 245, 245, + nil, nil, nil, 245, 245, nil, nil, nil, nil, nil, + nil, 245, nil, nil, 245, 245, 245, nil, 245, 245, + 248, 248, 248, nil, 248, nil, nil, nil, 248, 248, + nil, nil, nil, 248, nil, 248, 248, 248, 248, 248, + 248, 248, nil, nil, nil, nil, nil, 248, 248, 248, + 248, 248, 248, 248, nil, nil, 248, nil, nil, nil, + nil, nil, nil, 248, nil, nil, 248, 248, 248, 248, + 248, 248, 248, 248, nil, 248, 248, 248, nil, 248, + 248, nil, 248, 248, 248, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 248, nil, nil, 248, nil, nil, + 248, 248, nil, nil, 248, nil, nil, nil, nil, nil, + 248, nil, nil, nil, nil, nil, nil, nil, 248, nil, + nil, nil, nil, 248, 248, 248, 248, 248, 248, nil, + nil, nil, 248, 248, nil, nil, nil, nil, nil, nil, + 248, nil, nil, 248, 248, 248, nil, 248, 248, 249, + 249, 249, nil, 249, nil, nil, nil, 249, 249, nil, + nil, nil, 249, nil, 249, 249, 249, 249, 249, 249, + 249, nil, nil, nil, nil, nil, 249, 249, 249, 249, + 249, 249, 249, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 249, nil, nil, 249, 249, 249, 249, 249, + 249, 249, 249, nil, 249, 249, 249, nil, 249, 249, + nil, 249, 249, 249, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, 249, nil, nil, 249, + 249, nil, nil, 249, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 249, 249, 249, 249, 249, 249, nil, nil, + nil, 249, 249, nil, nil, nil, nil, nil, nil, 249, + nil, nil, 249, 249, 249, nil, 249, 249, 250, 250, + 250, nil, 250, nil, nil, nil, 250, 250, nil, nil, + nil, 250, nil, 250, 250, 250, 250, 250, 250, 250, + nil, nil, nil, nil, nil, 250, 250, 250, 250, 250, + 250, 250, nil, nil, 250, nil, nil, nil, nil, nil, + nil, 250, nil, nil, 250, 250, 250, 250, 250, 250, + 250, 250, nil, 250, 250, 250, nil, 250, 250, nil, + 250, 250, 250, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 250, nil, nil, 250, nil, nil, 250, 250, + nil, nil, 250, nil, nil, nil, nil, nil, 250, nil, + nil, nil, nil, nil, nil, nil, 250, nil, nil, nil, + nil, 250, 250, 250, 250, 250, 250, nil, nil, nil, + 250, 250, nil, nil, nil, nil, nil, nil, 250, nil, + nil, 250, 250, 250, nil, 250, 250, 251, 251, 251, + nil, 251, nil, nil, nil, 251, 251, nil, nil, nil, + 251, nil, 251, 251, 251, 251, 251, 251, 251, nil, + nil, nil, nil, nil, 251, 251, 251, 251, 251, 251, + 251, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 251, nil, nil, 251, 251, 251, 251, 251, 251, 251, + 251, nil, 251, 251, 251, nil, 251, 251, nil, 251, + 251, 251, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 251, nil, nil, 251, nil, nil, 251, 251, nil, + nil, 251, nil, nil, nil, nil, nil, 251, nil, nil, + nil, nil, nil, nil, nil, 251, nil, nil, nil, nil, + 251, 251, 251, 251, 251, 251, nil, nil, nil, 251, + 251, nil, nil, nil, nil, nil, nil, 251, nil, nil, + 251, 251, 251, nil, 251, 251, 252, 252, 252, nil, + 252, nil, nil, nil, 252, 252, nil, nil, nil, 252, + nil, 252, 252, 252, 252, 252, 252, 252, nil, nil, + nil, nil, nil, 252, 252, 252, 252, 252, 252, 252, + nil, nil, 252, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 252, 252, 252, 252, 252, 252, 252, 252, + nil, 252, 252, 252, nil, 252, 252, nil, 252, 252, + 252, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 252, nil, nil, 252, 252, nil, nil, + 252, nil, nil, nil, nil, nil, 252, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, nil, nil, 252, + 252, 252, 252, 252, 252, nil, nil, nil, 252, 252, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 252, + 252, 252, nil, 252, 252, 253, 253, 253, nil, 253, + nil, nil, nil, 253, 253, nil, nil, nil, 253, nil, + 253, 253, 253, 253, 253, 253, 253, nil, nil, nil, + nil, nil, 253, 253, 253, 253, 253, 253, 253, nil, + nil, 253, nil, nil, nil, nil, nil, nil, 253, nil, + nil, 253, 253, 253, 253, 253, 253, 253, 253, nil, + 253, 253, 253, nil, 253, 253, nil, 253, 253, 253, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 253, + nil, nil, 253, nil, nil, 253, 253, nil, nil, 253, + nil, nil, nil, nil, nil, 253, nil, nil, nil, nil, + nil, nil, nil, 253, nil, nil, nil, nil, 253, 253, + 253, 253, 253, 253, nil, nil, nil, 253, 253, nil, + nil, nil, nil, nil, nil, 253, nil, nil, 253, 253, + 253, nil, 253, 253, 254, 254, 254, nil, 254, nil, + nil, nil, 254, 254, nil, nil, nil, 254, nil, 254, + 254, 254, 254, 254, 254, 254, nil, nil, nil, nil, + nil, 254, 254, 254, 254, 254, 254, 254, nil, nil, + 254, nil, nil, nil, nil, nil, nil, 254, nil, nil, + 254, 254, 254, 254, 254, 254, 254, 254, nil, 254, + 254, 254, nil, 254, 254, nil, 254, 254, 254, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 254, nil, + nil, 254, nil, nil, 254, 254, nil, nil, 254, nil, + nil, nil, nil, nil, 254, nil, nil, nil, nil, nil, + nil, nil, 254, nil, nil, nil, nil, 254, 254, 254, + 254, 254, 254, nil, nil, nil, 254, 254, nil, nil, + nil, nil, nil, nil, 254, nil, nil, 254, 254, 254, + nil, 254, 254, 255, 255, 255, nil, 255, nil, nil, + nil, 255, 255, nil, nil, nil, 255, nil, 255, 255, + 255, 255, 255, 255, 255, nil, nil, nil, nil, nil, + 255, 255, 255, 255, 255, 255, 255, nil, nil, 255, + nil, nil, nil, nil, nil, nil, 255, nil, nil, 255, + 255, 255, 255, 255, 255, 255, 255, nil, 255, 255, + 255, nil, 255, 255, nil, 255, 255, 255, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 255, nil, nil, + 255, nil, nil, 255, 255, nil, nil, 255, nil, nil, + nil, nil, nil, 255, nil, nil, nil, nil, nil, nil, + nil, 255, nil, nil, nil, nil, 255, 255, 255, 255, + 255, 255, nil, nil, nil, 255, 255, nil, nil, nil, + nil, nil, nil, 255, nil, nil, 255, 255, 255, nil, + 255, 255, 256, 256, 256, nil, 256, nil, nil, nil, + 256, 256, nil, nil, nil, 256, nil, 256, 256, 256, + 256, 256, 256, 256, nil, nil, nil, nil, nil, 256, + 256, 256, 256, 256, 256, 256, nil, nil, 256, nil, + nil, nil, nil, nil, nil, 256, nil, nil, 256, 256, + 256, 256, 256, 256, 256, 256, nil, 256, 256, 256, + nil, 256, 256, nil, 256, 256, 256, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 256, nil, nil, 256, + nil, nil, 256, 256, nil, nil, 256, nil, nil, nil, + nil, nil, 256, nil, nil, nil, nil, nil, nil, nil, + 256, nil, nil, nil, nil, 256, 256, 256, 256, 256, + 256, nil, nil, nil, 256, 256, nil, nil, nil, nil, + nil, nil, 256, nil, nil, 256, 256, 256, nil, 256, + 256, 257, 257, 257, nil, 257, nil, nil, nil, 257, + 257, nil, nil, nil, 257, nil, 257, 257, 257, 257, + 257, 257, 257, nil, nil, nil, nil, nil, 257, 257, + 257, 257, 257, 257, 257, nil, nil, 257, nil, nil, + nil, nil, nil, nil, 257, nil, nil, 257, 257, 257, + 257, 257, 257, 257, 257, nil, 257, 257, 257, nil, + 257, 257, nil, 257, 257, 257, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, 257, nil, + nil, 257, 257, nil, nil, 257, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 257, 257, 257, 257, 257, 257, + nil, nil, nil, 257, 257, nil, nil, nil, nil, nil, + nil, 257, nil, nil, 257, 257, 257, nil, 257, 257, + 258, 258, 258, nil, 258, nil, nil, nil, 258, 258, + nil, nil, nil, 258, nil, 258, 258, 258, 258, 258, + 258, 258, nil, nil, nil, nil, nil, 258, 258, 258, + 258, 258, 258, 258, nil, nil, 258, nil, nil, nil, + nil, nil, nil, 258, nil, nil, 258, 258, 258, 258, + 258, 258, 258, 258, nil, 258, 258, 258, nil, 258, + 258, nil, 258, 258, 258, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 258, nil, nil, 258, nil, nil, + 258, 258, nil, nil, 258, nil, nil, nil, nil, nil, + 258, nil, nil, nil, nil, nil, nil, nil, 258, nil, + nil, nil, nil, 258, 258, 258, 258, 258, 258, nil, + nil, nil, 258, 258, nil, nil, nil, nil, nil, nil, + 258, nil, nil, 258, 258, 258, nil, 258, 258, 259, + 259, 259, nil, 259, nil, nil, nil, 259, 259, nil, + nil, nil, 259, nil, 259, 259, 259, 259, 259, 259, + 259, nil, nil, nil, nil, nil, 259, 259, 259, 259, + 259, 259, 259, nil, nil, 259, nil, nil, nil, nil, + nil, nil, 259, nil, nil, 259, 259, 259, 259, 259, + 259, 259, 259, nil, 259, 259, 259, nil, 259, 259, + nil, 259, 259, 259, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 259, nil, nil, 259, nil, nil, 259, + 259, nil, nil, 259, nil, nil, nil, nil, nil, 259, + nil, nil, nil, nil, nil, nil, nil, 259, nil, nil, + nil, nil, 259, 259, 259, 259, 259, 259, nil, nil, + nil, 259, 259, nil, nil, nil, nil, nil, nil, 259, + nil, nil, 259, 259, 259, nil, 259, 259, 260, 260, + 260, nil, 260, nil, nil, nil, 260, 260, nil, nil, + nil, 260, nil, 260, 260, 260, 260, 260, 260, 260, + nil, nil, nil, nil, nil, 260, 260, 260, 260, 260, + 260, 260, nil, nil, 260, nil, nil, nil, nil, nil, + nil, 260, nil, nil, 260, 260, 260, 260, 260, 260, + 260, 260, nil, 260, 260, 260, nil, 260, 260, nil, + 260, 260, 260, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 260, nil, nil, 260, nil, nil, 260, 260, + nil, nil, 260, nil, nil, nil, nil, nil, 260, nil, + nil, nil, nil, nil, nil, nil, 260, nil, nil, nil, + nil, 260, 260, 260, 260, 260, 260, nil, nil, nil, + 260, 260, nil, nil, nil, nil, nil, nil, 260, nil, + nil, 260, 260, 260, nil, 260, 260, 261, 261, 261, + nil, 261, nil, nil, nil, 261, 261, nil, nil, nil, + 261, nil, 261, 261, 261, 261, 261, 261, 261, nil, + nil, nil, nil, nil, 261, 261, 261, 261, 261, 261, + 261, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 261, nil, nil, 261, 261, 261, 261, 261, 261, 261, + 261, nil, 261, 261, 261, nil, 261, 261, nil, 261, + 261, 261, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 261, nil, nil, 261, nil, nil, 261, 261, nil, + nil, 261, nil, nil, nil, nil, nil, 261, nil, nil, + nil, nil, nil, nil, nil, 261, nil, nil, nil, nil, + 261, 261, 261, 261, 261, 261, nil, nil, nil, 261, + 261, nil, nil, nil, nil, nil, nil, 261, nil, nil, + 261, 261, 261, nil, 261, 261, 262, 262, 262, nil, + 262, nil, nil, nil, 262, 262, nil, nil, nil, 262, + nil, 262, 262, 262, 262, 262, 262, 262, nil, nil, + nil, nil, nil, 262, 262, 262, 262, 262, 262, 262, + nil, nil, 262, nil, nil, nil, nil, nil, nil, 262, + nil, nil, 262, 262, 262, 262, 262, 262, 262, 262, + nil, 262, 262, 262, nil, 262, 262, nil, 262, 262, + 262, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 262, nil, nil, 262, nil, nil, 262, 262, nil, nil, + 262, nil, nil, nil, nil, nil, 262, nil, nil, nil, + nil, nil, nil, nil, 262, nil, nil, nil, nil, 262, + 262, 262, 262, 262, 262, nil, nil, nil, 262, 262, + nil, nil, nil, nil, nil, nil, 262, nil, nil, 262, + 262, 262, nil, 262, 262, 263, 263, 263, nil, 263, + nil, nil, nil, 263, 263, nil, nil, nil, 263, nil, + 263, 263, 263, 263, 263, 263, 263, nil, nil, nil, + nil, nil, 263, 263, 263, 263, 263, 263, 263, nil, + nil, 263, nil, nil, nil, nil, nil, nil, 263, nil, + nil, 263, 263, 263, 263, 263, 263, 263, 263, nil, + 263, 263, 263, nil, 263, 263, nil, 263, 263, 263, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 263, + nil, nil, 263, nil, nil, 263, 263, nil, nil, 263, + nil, nil, nil, nil, nil, 263, nil, nil, nil, nil, + nil, nil, nil, 263, nil, nil, nil, nil, 263, 263, + 263, 263, 263, 263, nil, nil, nil, 263, 263, nil, + nil, nil, nil, nil, nil, 263, nil, nil, 263, 263, + 263, nil, 263, 263, 264, 264, 264, nil, 264, nil, + nil, nil, 264, 264, nil, nil, nil, 264, nil, 264, + 264, 264, 264, 264, 264, 264, nil, nil, nil, nil, + nil, 264, 264, 264, 264, 264, 264, 264, nil, nil, + 264, nil, nil, nil, nil, nil, nil, 264, nil, nil, + 264, 264, 264, 264, 264, 264, 264, 264, nil, 264, + 264, 264, nil, 264, 264, nil, 264, 264, 264, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 264, nil, + nil, 264, nil, nil, 264, 264, nil, nil, 264, nil, + nil, nil, nil, nil, 264, nil, nil, nil, nil, nil, + nil, nil, 264, nil, nil, nil, nil, 264, 264, 264, + 264, 264, 264, nil, nil, nil, 264, 264, nil, nil, + nil, nil, nil, nil, 264, nil, nil, 264, 264, 264, + nil, 264, 264, 265, 265, 265, nil, 265, nil, nil, + nil, 265, 265, nil, nil, nil, 265, nil, 265, 265, + 265, 265, 265, 265, 265, nil, nil, nil, nil, nil, + 265, 265, 265, 265, 265, 265, 265, nil, nil, 265, + nil, nil, nil, nil, nil, nil, 265, nil, nil, 265, + 265, 265, 265, 265, 265, 265, 265, nil, 265, 265, + 265, nil, 265, 265, nil, 265, 265, 265, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 265, nil, nil, + 265, nil, nil, 265, 265, nil, nil, 265, nil, nil, + nil, nil, nil, 265, nil, nil, nil, nil, nil, nil, + nil, 265, nil, nil, nil, nil, 265, 265, 265, 265, + 265, 265, nil, nil, nil, 265, 265, nil, nil, nil, + nil, nil, nil, 265, nil, nil, 265, 265, 265, nil, + 265, 265, 266, 266, 266, nil, 266, nil, nil, nil, + 266, 266, nil, nil, nil, 266, nil, 266, 266, 266, + 266, 266, 266, 266, nil, nil, nil, nil, nil, 266, + 266, 266, 266, 266, 266, 266, nil, nil, 266, nil, + nil, nil, nil, nil, nil, 266, nil, nil, 266, 266, + 266, 266, 266, 266, 266, 266, nil, 266, 266, 266, + nil, 266, 266, nil, 266, 266, 266, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 266, nil, nil, 266, + nil, nil, 266, 266, nil, nil, 266, nil, nil, nil, + nil, nil, 266, nil, nil, nil, nil, nil, nil, nil, + 266, nil, nil, nil, nil, 266, 266, 266, 266, 266, + 266, nil, nil, nil, 266, 266, nil, nil, nil, nil, + nil, nil, 266, nil, nil, 266, 266, 266, nil, 266, + 266, 267, 267, 267, nil, 267, nil, nil, nil, 267, + 267, nil, nil, nil, 267, nil, 267, 267, 267, 267, + 267, 267, 267, nil, nil, nil, nil, nil, 267, 267, + 267, 267, 267, 267, 267, nil, nil, 267, nil, nil, + nil, nil, nil, nil, 267, nil, nil, 267, 267, 267, + 267, 267, 267, 267, 267, nil, 267, 267, 267, nil, + 267, 267, nil, 267, 267, 267, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 267, nil, nil, 267, nil, + nil, 267, 267, nil, nil, 267, nil, nil, nil, nil, + nil, 267, nil, nil, nil, nil, nil, nil, nil, 267, + nil, nil, nil, nil, 267, 267, 267, 267, 267, 267, + nil, nil, nil, 267, 267, nil, nil, nil, nil, nil, + nil, 267, nil, nil, 267, 267, 267, nil, 267, 267, + 268, 268, 268, nil, 268, nil, nil, nil, 268, 268, + nil, nil, nil, 268, nil, 268, 268, 268, 268, 268, + 268, 268, nil, nil, nil, nil, nil, 268, 268, 268, + 268, 268, 268, 268, nil, nil, 268, nil, nil, nil, + nil, nil, nil, 268, nil, nil, 268, 268, 268, 268, + 268, 268, 268, 268, nil, 268, 268, 268, nil, 268, + 268, nil, 268, 268, 268, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 268, nil, nil, 268, nil, nil, + 268, 268, nil, nil, 268, nil, nil, nil, nil, nil, + 268, nil, nil, nil, nil, nil, nil, nil, 268, nil, + nil, nil, nil, 268, 268, 268, 268, 268, 268, nil, + nil, nil, 268, 268, nil, nil, nil, nil, nil, nil, + 268, nil, nil, 268, 268, 268, nil, 268, 268, 269, + 269, 269, nil, 269, nil, nil, nil, 269, 269, nil, + nil, nil, 269, nil, 269, 269, 269, 269, 269, 269, + 269, nil, nil, nil, nil, nil, 269, 269, 269, 269, + 269, 269, 269, nil, nil, 269, nil, nil, nil, nil, + nil, nil, 269, nil, nil, 269, 269, 269, 269, 269, + 269, 269, 269, nil, 269, 269, 269, nil, 269, 269, + nil, 269, 269, 269, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 269, nil, nil, 269, nil, nil, 269, + 269, nil, nil, 269, nil, nil, nil, nil, nil, 269, + nil, nil, nil, nil, nil, nil, nil, 269, nil, nil, + nil, nil, 269, 269, 269, 269, 269, 269, nil, nil, + nil, 269, 269, nil, nil, nil, nil, nil, nil, 269, + nil, nil, 269, 269, 269, nil, 269, 269, 274, 274, + 274, nil, 274, nil, nil, nil, 274, 274, nil, nil, + nil, 274, nil, 274, 274, 274, 274, 274, 274, 274, + nil, nil, nil, nil, nil, 274, 274, 274, 274, 274, + 274, 274, nil, nil, 274, nil, nil, nil, nil, nil, + nil, 274, nil, nil, 274, 274, 274, 274, 274, 274, + 274, 274, nil, 274, 274, 274, nil, 274, 274, nil, + 274, 274, 274, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 274, nil, nil, 274, nil, nil, 274, 274, + nil, nil, 274, nil, nil, nil, nil, nil, 274, nil, + nil, nil, nil, nil, nil, nil, 274, nil, nil, nil, + nil, 274, 274, 274, 274, 274, 274, nil, nil, nil, + 274, 274, nil, nil, nil, nil, nil, nil, 274, nil, + nil, 274, 274, 274, nil, 274, 274, 282, 282, 282, + nil, 282, nil, nil, nil, 282, 282, nil, nil, nil, + 282, nil, 282, 282, 282, 282, 282, 282, 282, nil, + nil, nil, nil, nil, 282, 282, 282, 282, 282, 282, + 282, nil, nil, 282, nil, nil, nil, nil, nil, nil, + 282, nil, nil, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, nil, 282, 282, nil, 282, + 282, 282, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 282, nil, nil, 282, nil, nil, 282, 282, nil, + nil, 282, nil, 282, nil, 282, nil, 282, nil, nil, + nil, nil, nil, nil, nil, 282, nil, nil, nil, nil, + 282, 282, 282, 282, 282, 282, nil, nil, nil, 282, + 282, nil, nil, nil, nil, nil, nil, 282, nil, 282, + 282, 282, 282, nil, 282, 282, 283, 283, 283, nil, + 283, nil, nil, nil, 283, 283, nil, nil, nil, 283, + nil, 283, 283, 283, 283, 283, 283, 283, nil, nil, + nil, nil, nil, 283, 283, 283, 283, 283, 283, 283, + nil, nil, 283, nil, nil, nil, nil, nil, nil, 283, + nil, nil, 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, nil, 283, 283, nil, 283, 283, + 283, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 283, nil, nil, 283, nil, nil, 283, 283, nil, nil, + 283, nil, 283, nil, 283, nil, 283, nil, nil, nil, + nil, nil, nil, nil, 283, nil, nil, nil, nil, 283, + 283, 283, 283, 283, 283, nil, nil, nil, 283, 283, + nil, nil, nil, nil, nil, nil, 283, nil, 283, 283, + 283, 283, nil, 283, 283, 292, 292, 292, nil, 292, + nil, nil, nil, 292, 292, nil, nil, nil, 292, nil, + 292, 292, 292, 292, 292, 292, 292, nil, nil, nil, + nil, nil, 292, 292, 292, 292, 292, 292, 292, nil, + nil, 292, nil, nil, nil, nil, nil, nil, 292, nil, + nil, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, nil, 292, 292, nil, 292, 292, 292, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 292, + nil, nil, 292, nil, nil, 292, 292, nil, nil, 292, + nil, 292, nil, 292, nil, 292, nil, nil, nil, nil, + nil, nil, nil, 292, nil, nil, nil, nil, 292, 292, + 292, 292, 292, 292, nil, nil, nil, 292, 292, 292, + nil, nil, nil, nil, nil, 292, nil, 292, 292, 292, + 292, nil, 292, 292, 299, 299, 299, nil, 299, nil, + nil, nil, 299, 299, nil, nil, nil, 299, nil, 299, + 299, 299, 299, 299, 299, 299, nil, nil, nil, nil, + nil, 299, 299, 299, 299, 299, 299, 299, nil, nil, + 299, nil, nil, nil, nil, nil, nil, 299, nil, nil, + 299, 299, 299, 299, 299, 299, 299, 299, nil, 299, + 299, 299, nil, 299, 299, nil, 299, 299, 299, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 299, nil, + nil, 299, nil, nil, 299, 299, nil, nil, 299, nil, + nil, nil, nil, nil, 299, nil, nil, nil, nil, nil, + nil, nil, 299, nil, nil, nil, nil, 299, 299, 299, + 299, 299, 299, nil, nil, nil, 299, 299, nil, nil, + nil, nil, nil, nil, 299, nil, nil, 299, 299, 299, + nil, 299, 299, 301, 301, 301, nil, 301, nil, nil, + nil, 301, 301, nil, nil, nil, 301, nil, 301, 301, + 301, 301, 301, 301, 301, nil, nil, nil, nil, nil, + 301, 301, 301, 301, 301, 301, 301, nil, nil, 301, + nil, nil, nil, nil, nil, nil, 301, nil, nil, 301, + 301, 301, 301, 301, 301, 301, 301, nil, 301, 301, + 301, nil, 301, 301, nil, 301, 301, 301, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 301, nil, nil, + 301, nil, nil, 301, 301, nil, nil, 301, nil, nil, + nil, nil, nil, 301, nil, nil, nil, nil, nil, nil, + nil, 301, nil, nil, nil, nil, 301, 301, 301, 301, + 301, 301, nil, nil, nil, 301, 301, nil, nil, nil, + nil, nil, nil, 301, nil, nil, 301, 301, 301, nil, + 301, 301, 304, 304, 304, nil, 304, nil, nil, nil, + 304, 304, nil, nil, nil, 304, nil, 304, 304, 304, + 304, 304, 304, 304, nil, nil, nil, nil, nil, 304, + 304, 304, 304, 304, 304, 304, nil, nil, 304, nil, + nil, nil, nil, nil, nil, 304, nil, nil, 304, 304, + 304, 304, 304, 304, 304, 304, nil, 304, 304, 304, + nil, 304, 304, nil, 304, 304, 304, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 304, nil, nil, 304, + nil, nil, 304, 304, nil, nil, 304, nil, nil, nil, + nil, nil, 304, nil, nil, nil, nil, nil, nil, nil, + 304, nil, nil, nil, nil, 304, 304, 304, 304, 304, + 304, nil, nil, nil, 304, 304, nil, nil, nil, nil, + nil, nil, 304, nil, nil, 304, 304, 304, nil, 304, + 304, 305, 305, 305, nil, 305, nil, nil, nil, 305, + 305, nil, nil, nil, 305, nil, 305, 305, 305, 305, + 305, 305, 305, nil, nil, nil, nil, nil, 305, 305, + 305, 305, 305, 305, 305, nil, nil, 305, nil, nil, + nil, nil, nil, nil, 305, nil, nil, 305, 305, 305, + 305, 305, 305, 305, 305, nil, 305, 305, 305, nil, + 305, 305, nil, 305, 305, 305, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 305, nil, nil, 305, nil, + nil, 305, 305, nil, nil, 305, nil, nil, nil, nil, + nil, 305, nil, nil, nil, nil, nil, nil, nil, 305, + nil, nil, nil, nil, 305, 305, 305, 305, 305, 305, + nil, nil, nil, 305, 305, nil, nil, nil, nil, nil, + nil, 305, nil, nil, 305, 305, 305, nil, 305, 305, + 311, 311, 311, 311, 311, nil, nil, nil, 311, 311, + nil, nil, nil, 311, nil, 311, 311, 311, 311, 311, + 311, 311, nil, nil, nil, nil, nil, 311, 311, 311, + 311, 311, 311, 311, nil, nil, 311, nil, nil, nil, + nil, nil, 311, 311, nil, 311, 311, 311, 311, 311, + 311, 311, 311, 311, nil, 311, 311, 311, nil, 311, + 311, nil, 311, 311, 311, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 311, nil, nil, 311, nil, nil, + 311, 311, nil, nil, 311, nil, 311, nil, nil, nil, + 311, nil, nil, nil, nil, nil, nil, nil, 311, nil, + nil, nil, nil, 311, 311, 311, 311, 311, 311, nil, + nil, nil, 311, 311, nil, nil, nil, nil, nil, nil, + 311, nil, nil, 311, 311, 311, nil, 311, 311, 319, + 319, 319, nil, 319, nil, nil, nil, 319, 319, nil, + nil, nil, 319, nil, 319, 319, 319, 319, 319, 319, + 319, nil, nil, nil, nil, nil, 319, 319, 319, 319, + 319, 319, 319, nil, nil, 319, nil, nil, nil, nil, + nil, nil, 319, nil, nil, 319, 319, 319, 319, 319, + 319, 319, 319, nil, 319, 319, 319, nil, 319, 319, + nil, nil, nil, 319, nil, nil, nil, nil, nil, 1063, + nil, 1063, 1063, 1063, 1063, 1063, nil, nil, nil, nil, + nil, nil, nil, 319, nil, 1063, 319, nil, nil, 319, + 319, nil, nil, 319, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1063, nil, nil, + nil, nil, 319, 319, 319, 319, 319, 319, 1063, 1063, + nil, 319, 319, nil, nil, nil, 319, nil, nil, 319, + nil, nil, 319, 319, 319, nil, 319, 319, 336, 336, + 336, nil, 336, nil, nil, nil, 336, 336, nil, nil, + nil, 336, 1063, 336, 336, 336, 336, 336, 336, 336, + nil, nil, nil, nil, nil, 336, 336, 336, 336, 336, + 336, 336, nil, nil, 336, nil, nil, nil, nil, nil, + nil, 336, nil, nil, 336, 336, 336, 336, 336, 336, + 336, 336, nil, 336, 336, 336, nil, 336, 336, nil, + nil, nil, 336, nil, nil, nil, nil, nil, 1084, nil, + 1084, 1084, 1084, 1084, 1084, nil, nil, nil, nil, nil, + nil, nil, 336, nil, 1084, 336, nil, nil, 336, 336, + nil, nil, 336, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1084, nil, nil, nil, + nil, 336, 336, 336, 336, 336, 336, 1084, 1084, nil, + 336, 336, nil, nil, nil, nil, nil, nil, 336, nil, + nil, 336, 336, 336, nil, 336, 336, 343, 343, 343, + nil, 343, nil, nil, nil, 343, 343, nil, nil, nil, + 343, 1084, 343, 343, 343, 343, 343, 343, 343, nil, + nil, nil, nil, nil, 343, 343, 343, 343, 343, 343, + 343, nil, nil, 343, nil, nil, nil, nil, nil, nil, + 343, nil, nil, 343, 343, 343, 343, 343, 343, 343, + 343, nil, 343, 343, 343, nil, 343, 343, nil, 343, + 343, 343, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 343, nil, nil, 343, nil, nil, 343, 343, nil, + nil, 343, nil, nil, nil, nil, nil, 343, nil, nil, + nil, nil, nil, nil, nil, 343, nil, nil, nil, nil, + 343, 343, 343, 343, 343, 343, nil, nil, nil, 343, + 343, nil, nil, nil, nil, nil, nil, 343, nil, nil, + 343, 343, 343, nil, 343, 343, 345, 345, 345, nil, + 345, nil, nil, nil, 345, 345, nil, nil, nil, 345, + nil, 345, 345, 345, 345, 345, 345, 345, nil, nil, + nil, nil, nil, 345, 345, 345, 345, 345, 345, 345, + nil, nil, 345, nil, nil, nil, nil, nil, nil, 345, + nil, nil, 345, 345, 345, 345, 345, 345, 345, 345, + nil, 345, 345, 345, nil, 345, 345, nil, 345, 345, + 345, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 345, nil, nil, 345, 345, nil, 345, 345, nil, nil, + 345, nil, nil, nil, nil, nil, 345, nil, nil, nil, + nil, nil, nil, nil, 345, nil, nil, nil, nil, 345, + 345, 345, 345, 345, 345, nil, nil, nil, 345, 345, + nil, nil, nil, nil, nil, nil, 345, nil, nil, 345, + 345, 345, nil, 345, 345, 349, 349, 349, nil, 349, + nil, nil, nil, 349, 349, nil, nil, nil, 349, nil, + 349, 349, 349, 349, 349, 349, 349, nil, nil, nil, + nil, nil, 349, 349, 349, 349, 349, 349, 349, nil, + nil, 349, nil, nil, nil, nil, nil, nil, 349, nil, + nil, 349, 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, nil, 349, 349, nil, 349, 349, 349, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 349, + nil, nil, 349, nil, nil, 349, 349, nil, nil, 349, + nil, 349, nil, nil, nil, 349, nil, nil, nil, nil, + nil, nil, nil, 349, nil, nil, nil, nil, 349, 349, + 349, 349, 349, 349, nil, nil, nil, 349, 349, nil, + nil, nil, nil, nil, nil, 349, nil, 349, 349, 349, + 349, nil, 349, 349, 350, 350, 350, nil, 350, nil, + nil, nil, 350, 350, nil, nil, nil, 350, nil, 350, + 350, 350, 350, 350, 350, 350, nil, nil, nil, nil, + nil, 350, 350, 350, 350, 350, 350, 350, nil, nil, + 350, nil, nil, nil, nil, nil, nil, 350, nil, nil, + 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, + 350, 350, nil, 350, 350, nil, 350, 350, 350, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 350, nil, + nil, 350, nil, nil, 350, 350, nil, nil, 350, nil, + nil, nil, nil, nil, 350, nil, nil, nil, nil, nil, + nil, nil, 350, nil, nil, nil, nil, 350, 350, 350, + 350, 350, 350, nil, nil, nil, 350, 350, nil, nil, + nil, nil, nil, nil, 350, nil, 350, 350, 350, 350, + nil, 350, 350, 355, 355, 355, nil, 355, nil, nil, + nil, 355, 355, nil, nil, nil, 355, nil, 355, 355, + 355, 355, 355, 355, 355, nil, nil, nil, nil, nil, + 355, 355, 355, 355, 355, 355, 355, nil, nil, 355, + nil, nil, nil, nil, nil, nil, 355, nil, nil, 355, + 355, 355, 355, 355, 355, 355, 355, nil, 355, 355, + 355, nil, 355, 355, nil, 355, 355, 355, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 355, nil, nil, + 355, nil, nil, 355, 355, nil, nil, 355, nil, nil, + nil, nil, nil, 355, nil, nil, nil, nil, nil, nil, + nil, 355, nil, nil, nil, nil, 355, 355, 355, 355, + 355, 355, nil, nil, nil, 355, 355, nil, nil, nil, + nil, nil, nil, 355, nil, nil, 355, 355, 355, nil, + 355, 355, 376, 376, 376, nil, 376, nil, nil, nil, + 376, 376, nil, nil, nil, 376, nil, 376, 376, 376, + 376, 376, 376, 376, nil, nil, nil, nil, nil, 376, + 376, 376, 376, 376, 376, 376, nil, nil, 376, nil, + nil, nil, nil, nil, nil, 376, nil, nil, 376, 376, + 376, 376, 376, 376, 376, 376, nil, 376, 376, 376, + nil, 376, 376, nil, 376, 376, 376, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 376, nil, nil, 376, + nil, nil, 376, 376, nil, nil, 376, nil, nil, nil, + nil, nil, 376, nil, nil, nil, nil, nil, nil, nil, + 376, nil, nil, nil, nil, 376, 376, 376, 376, 376, + 376, nil, nil, nil, 376, 376, nil, nil, nil, nil, + nil, nil, 376, nil, nil, 376, 376, 376, nil, 376, + 376, 437, 437, 437, nil, 437, nil, nil, nil, 437, + 437, nil, nil, nil, 437, nil, 437, 437, 437, 437, + 437, 437, 437, nil, nil, nil, nil, nil, 437, 437, + 437, 437, 437, 437, 437, nil, nil, 437, nil, nil, + nil, nil, nil, nil, 437, nil, nil, 437, 437, 437, + 437, 437, 437, 437, 437, nil, 437, 437, 437, nil, + 437, 437, nil, 437, 437, 437, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 437, nil, nil, 437, nil, + nil, 437, 437, nil, nil, 437, nil, nil, nil, nil, + nil, 437, nil, nil, nil, nil, nil, nil, nil, 437, + nil, nil, nil, nil, 437, 437, 437, 437, 437, 437, + nil, nil, nil, 437, 437, nil, nil, nil, nil, nil, + nil, 437, nil, nil, 437, 437, 437, nil, 437, 437, + 481, 481, 481, nil, 481, nil, nil, nil, 481, 481, + nil, nil, nil, 481, nil, 481, 481, 481, 481, 481, + 481, 481, nil, nil, nil, nil, nil, 481, 481, 481, + 481, 481, 481, 481, nil, nil, 481, nil, nil, nil, + nil, nil, nil, 481, nil, nil, 481, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 481, 481, nil, 481, + 481, nil, 481, 481, 481, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 481, nil, nil, 481, nil, nil, + 481, 481, nil, nil, 481, nil, 481, nil, 481, nil, + 481, nil, nil, nil, nil, nil, nil, nil, 481, nil, + nil, nil, nil, 481, 481, 481, 481, 481, 481, nil, + nil, nil, 481, 481, nil, nil, nil, nil, nil, nil, + 481, nil, 481, 481, 481, 481, nil, 481, 481, 483, + 483, 483, nil, 483, nil, nil, nil, 483, 483, nil, + nil, nil, 483, nil, 483, 483, 483, 483, 483, 483, + 483, nil, nil, nil, nil, nil, 483, 483, 483, 483, + 483, 483, 483, nil, nil, 483, nil, nil, nil, nil, + nil, nil, 483, nil, nil, 483, 483, 483, 483, 483, + 483, 483, 483, nil, 483, 483, 483, nil, 483, 483, + nil, 483, 483, 483, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 483, nil, nil, 483, nil, nil, 483, + 483, nil, nil, 483, nil, nil, nil, nil, nil, 483, + nil, nil, nil, nil, nil, nil, nil, 483, nil, nil, + nil, nil, 483, 483, 483, 483, 483, 483, nil, nil, + nil, 483, 483, nil, nil, nil, nil, nil, nil, 483, + nil, nil, 483, 483, 483, nil, 483, 483, 484, 484, + 484, nil, 484, nil, nil, nil, 484, 484, nil, nil, + nil, 484, nil, 484, 484, 484, 484, 484, 484, 484, + nil, nil, nil, nil, nil, 484, 484, 484, 484, 484, + 484, 484, nil, nil, 484, nil, nil, nil, nil, nil, + nil, 484, nil, nil, 484, 484, 484, 484, 484, 484, + 484, 484, nil, 484, 484, 484, nil, 484, 484, nil, + 484, 484, 484, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 484, nil, nil, 484, nil, nil, 484, 484, + nil, nil, 484, nil, nil, nil, nil, nil, 484, nil, + nil, nil, nil, nil, nil, nil, 484, nil, nil, nil, + nil, 484, 484, 484, 484, 484, 484, nil, nil, nil, + 484, 484, nil, nil, nil, nil, nil, nil, 484, nil, + nil, 484, 484, 484, nil, 484, 484, 485, 485, 485, + nil, 485, nil, nil, nil, 485, 485, nil, nil, nil, + 485, nil, 485, 485, 485, 485, 485, 485, 485, nil, + nil, nil, nil, nil, 485, 485, 485, 485, 485, 485, + 485, nil, nil, 485, nil, nil, nil, nil, nil, nil, + 485, nil, nil, 485, 485, 485, 485, 485, 485, 485, + 485, nil, 485, 485, 485, nil, 485, 485, nil, 485, + 485, 485, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 485, nil, nil, 485, nil, nil, 485, 485, nil, + nil, 485, nil, nil, nil, nil, nil, 485, nil, nil, + nil, nil, nil, nil, nil, 485, nil, nil, nil, nil, + 485, 485, 485, 485, 485, 485, nil, nil, nil, 485, + 485, nil, nil, nil, nil, nil, nil, 485, nil, nil, + 485, 485, 485, nil, 485, 485, 523, 523, 523, nil, + 523, nil, nil, nil, 523, 523, nil, nil, nil, 523, + nil, 523, 523, 523, 523, 523, 523, 523, nil, nil, + nil, nil, nil, 523, 523, 523, 523, 523, 523, 523, + nil, nil, 523, nil, nil, nil, nil, nil, nil, 523, + nil, nil, 523, 523, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, nil, 523, 523, nil, 523, 523, + 523, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 523, nil, nil, 523, nil, nil, 523, 523, nil, nil, + 523, nil, 523, nil, 523, nil, 523, nil, nil, nil, + nil, nil, nil, nil, 523, nil, nil, nil, nil, 523, + 523, 523, 523, 523, 523, nil, nil, nil, 523, 523, + nil, nil, nil, nil, nil, nil, 523, nil, 523, 523, + 523, 523, nil, 523, 523, 526, 526, 526, nil, 526, + nil, nil, nil, 526, 526, nil, nil, nil, 526, nil, + 526, 526, 526, 526, 526, 526, 526, nil, nil, nil, + nil, nil, 526, 526, 526, 526, 526, 526, 526, nil, + nil, 526, nil, nil, nil, nil, nil, nil, 526, nil, + nil, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, nil, 526, 526, nil, 526, 526, 526, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 526, + nil, nil, 526, nil, nil, 526, 526, nil, nil, 526, + nil, nil, nil, 526, nil, 526, nil, nil, nil, nil, + nil, nil, nil, 526, nil, nil, nil, nil, 526, 526, + 526, 526, 526, 526, nil, nil, nil, 526, 526, nil, + nil, nil, nil, nil, nil, 526, nil, 526, 526, 526, + 526, nil, 526, 526, 528, 528, 528, nil, 528, nil, + nil, nil, 528, 528, nil, nil, nil, 528, nil, 528, + 528, 528, 528, 528, 528, 528, nil, nil, nil, nil, + nil, 528, 528, 528, 528, 528, 528, 528, nil, nil, + 528, nil, nil, nil, nil, nil, nil, 528, nil, nil, + 528, 528, 528, 528, 528, 528, 528, 528, nil, 528, + 528, 528, nil, 528, 528, nil, 528, 528, 528, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 528, nil, + nil, 528, nil, nil, 528, 528, nil, nil, 528, nil, + nil, nil, nil, nil, 528, nil, nil, nil, nil, nil, + nil, nil, 528, nil, nil, nil, nil, 528, 528, 528, + 528, 528, 528, nil, nil, nil, 528, 528, nil, nil, + nil, nil, nil, nil, 528, nil, nil, 528, 528, 528, + nil, 528, 528, 534, 534, 534, 534, 534, nil, nil, + nil, 534, 534, nil, nil, nil, 534, nil, 534, 534, + 534, 534, 534, 534, 534, nil, nil, nil, nil, nil, + 534, 534, 534, 534, 534, 534, 534, nil, nil, 534, + nil, nil, nil, nil, nil, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, nil, 534, 534, + 534, nil, 534, 534, nil, 534, 534, 534, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 534, nil, nil, + 534, nil, nil, 534, 534, nil, nil, 534, nil, 534, + nil, nil, nil, 534, nil, nil, nil, nil, nil, nil, + nil, 534, nil, nil, nil, nil, 534, 534, 534, 534, + 534, 534, nil, nil, nil, 534, 534, nil, nil, nil, + nil, nil, 534, 534, nil, nil, 534, 534, 534, nil, + 534, 534, 542, 542, 542, nil, 542, nil, nil, nil, + 542, 542, nil, nil, nil, 542, nil, 542, 542, 542, + 542, 542, 542, 542, nil, nil, nil, nil, nil, 542, + 542, 542, 542, 542, 542, 542, nil, nil, 542, nil, + nil, nil, nil, nil, nil, 542, nil, nil, 542, 542, + 542, 542, 542, 542, 542, 542, nil, 542, 542, 542, + nil, 542, 542, nil, nil, nil, 542, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 542, nil, nil, 542, + nil, nil, 542, 542, nil, nil, 542, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 542, 542, 542, 542, 542, + 542, nil, nil, nil, 542, 542, nil, nil, nil, nil, + nil, nil, 542, nil, nil, 542, 542, 542, nil, 542, + 542, 544, 544, 544, nil, 544, nil, nil, nil, 544, + 544, nil, nil, nil, 544, nil, 544, 544, 544, 544, + 544, 544, 544, nil, nil, nil, nil, nil, 544, 544, + 544, 544, 544, 544, 544, nil, nil, 544, nil, nil, + nil, nil, nil, nil, 544, nil, nil, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, nil, + 544, 544, nil, 544, 544, 544, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 544, nil, nil, 544, nil, + nil, 544, 544, nil, nil, 544, nil, 544, nil, 544, + nil, 544, nil, nil, nil, nil, nil, nil, nil, 544, + nil, nil, nil, nil, 544, 544, 544, 544, 544, 544, + nil, nil, nil, 544, 544, nil, nil, nil, nil, nil, + nil, 544, nil, 544, 544, 544, 544, nil, 544, 544, + 550, 550, 550, nil, 550, nil, nil, nil, 550, 550, + nil, nil, nil, 550, nil, 550, 550, 550, 550, 550, + 550, 550, nil, nil, nil, nil, nil, 550, 550, 550, + 550, 550, 550, 550, nil, nil, 550, nil, nil, nil, + nil, nil, nil, 550, nil, nil, 550, 550, 550, 550, + 550, 550, 550, 550, nil, 550, 550, 550, nil, 550, + 550, nil, nil, nil, 550, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 550, nil, nil, 550, nil, nil, + 550, 550, nil, nil, 550, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 550, 550, 550, 550, 550, 550, nil, + nil, nil, 550, 550, nil, nil, nil, nil, nil, nil, + 550, nil, nil, 550, 550, 550, nil, 550, 550, 553, + 553, 553, nil, 553, nil, nil, nil, 553, 553, nil, + nil, nil, 553, nil, 553, 553, 553, 553, 553, 553, + 553, nil, nil, nil, nil, nil, 553, 553, 553, 553, + 553, 553, 553, nil, nil, 553, nil, nil, nil, nil, + nil, nil, 553, nil, nil, 553, 553, 553, 553, 553, + 553, 553, 553, nil, 553, 553, 553, nil, 553, 553, + nil, 553, 553, 553, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 553, nil, nil, 553, nil, nil, 553, + 553, nil, nil, 553, nil, nil, nil, nil, nil, 553, + nil, nil, nil, nil, nil, nil, nil, 553, nil, nil, + nil, nil, 553, 553, 553, 553, 553, 553, nil, nil, + nil, 553, 553, nil, nil, nil, nil, nil, nil, 553, + nil, nil, 553, 553, 553, nil, 553, 553, 554, 554, + 554, nil, 554, nil, nil, nil, 554, 554, nil, nil, + nil, 554, nil, 554, 554, 554, 554, 554, 554, 554, + nil, nil, nil, nil, nil, 554, 554, 554, 554, 554, + 554, 554, nil, nil, 554, nil, nil, nil, nil, nil, + nil, 554, nil, nil, 554, 554, 554, 554, 554, 554, + 554, 554, nil, 554, 554, 554, nil, 554, 554, nil, + 554, 554, 554, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 554, nil, nil, 554, nil, nil, 554, 554, + nil, nil, 554, nil, nil, nil, nil, nil, 554, nil, + nil, nil, nil, nil, nil, nil, 554, nil, nil, nil, + nil, 554, 554, 554, 554, 554, 554, nil, nil, nil, + 554, 554, nil, nil, nil, nil, nil, nil, 554, nil, + nil, 554, 554, 554, nil, 554, 554, 559, 559, 559, + nil, 559, nil, nil, nil, 559, 559, nil, nil, nil, + 559, nil, 559, 559, 559, 559, 559, 559, 559, nil, + nil, nil, nil, nil, 559, 559, 559, 559, 559, 559, + 559, nil, nil, 559, nil, nil, nil, nil, nil, nil, + 559, nil, nil, 559, 559, 559, 559, 559, 559, 559, + 559, nil, 559, 559, 559, nil, 559, 559, nil, 559, + 559, 559, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 559, nil, nil, 559, nil, nil, 559, 559, nil, + nil, 559, nil, nil, nil, nil, nil, 559, nil, nil, + nil, nil, nil, nil, nil, 559, nil, nil, nil, nil, + 559, 559, 559, 559, 559, 559, nil, nil, nil, 559, + 559, nil, nil, nil, nil, nil, nil, 559, nil, nil, + 559, 559, 559, nil, 559, 559, 583, 583, 583, nil, + 583, nil, nil, nil, 583, 583, nil, nil, nil, 583, + nil, 583, 583, 583, 583, 583, 583, 583, nil, nil, + nil, nil, nil, 583, 583, 583, 583, 583, 583, 583, + nil, nil, 583, nil, nil, nil, nil, nil, nil, 583, + nil, nil, 583, 583, 583, 583, 583, 583, 583, 583, + 583, 583, 583, 583, nil, 583, 583, nil, 583, 583, + 583, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 583, nil, nil, 583, nil, nil, 583, 583, nil, nil, + 583, nil, 583, nil, 583, nil, 583, nil, nil, nil, + nil, nil, nil, nil, 583, nil, nil, nil, nil, 583, + 583, 583, 583, 583, 583, nil, nil, nil, 583, 583, + nil, nil, nil, nil, nil, nil, 583, nil, 583, 583, + 583, 583, nil, 583, 583, 593, 593, 593, nil, 593, + nil, nil, nil, 593, 593, nil, nil, nil, 593, nil, + 593, 593, 593, 593, 593, 593, 593, nil, nil, nil, + nil, nil, 593, 593, 593, 593, 593, 593, 593, nil, + nil, 593, nil, nil, nil, nil, nil, nil, 593, nil, + nil, 593, 593, 593, 593, 593, 593, 593, 593, 593, + 593, 593, 593, nil, 593, 593, nil, 593, 593, 593, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 593, + nil, nil, 593, nil, nil, 593, 593, nil, nil, 593, + nil, 593, nil, 593, nil, 593, nil, nil, nil, nil, + nil, nil, nil, 593, nil, nil, nil, nil, 593, 593, + 593, 593, 593, 593, nil, nil, nil, 593, 593, nil, + nil, nil, nil, nil, nil, 593, nil, 593, 593, 593, + 593, nil, 593, 593, 603, 603, 603, nil, 603, nil, + nil, nil, 603, 603, nil, nil, nil, 603, nil, 603, + 603, 603, 603, 603, 603, 603, nil, nil, nil, nil, + nil, 603, 603, 603, 603, 603, 603, 603, nil, nil, + 603, nil, nil, nil, nil, nil, nil, 603, nil, nil, + 603, 603, 603, 603, 603, 603, 603, 603, nil, 603, + 603, 603, nil, 603, 603, nil, 603, 603, 603, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 603, nil, + nil, 603, nil, nil, 603, 603, nil, nil, 603, nil, + nil, nil, nil, nil, 603, nil, nil, nil, nil, nil, + nil, nil, 603, nil, nil, nil, nil, 603, 603, 603, + 603, 603, 603, nil, nil, nil, 603, 603, nil, nil, + nil, nil, nil, nil, 603, nil, nil, 603, 603, 603, + nil, 603, 603, 625, 625, 625, nil, 625, nil, nil, + nil, 625, 625, nil, nil, nil, 625, nil, 625, 625, + 625, 625, 625, 625, 625, nil, nil, nil, nil, nil, + 625, 625, 625, 625, 625, 625, 625, nil, nil, 625, + nil, nil, nil, nil, nil, nil, 625, nil, nil, 625, + 625, 625, 625, 625, 625, 625, 625, nil, 625, 625, + 625, nil, 625, 625, nil, 625, 625, 625, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 625, nil, nil, + 625, nil, nil, 625, 625, nil, nil, 625, nil, nil, + nil, nil, nil, 625, nil, nil, nil, nil, nil, nil, + nil, 625, nil, nil, nil, nil, 625, 625, 625, 625, + 625, 625, nil, nil, nil, 625, 625, nil, nil, nil, + nil, nil, nil, 625, nil, nil, 625, 625, 625, nil, + 625, 625, 665, 665, 665, nil, 665, nil, nil, nil, + 665, 665, nil, nil, nil, 665, nil, 665, 665, 665, + 665, 665, 665, 665, nil, nil, nil, nil, nil, 665, + 665, 665, 665, 665, 665, 665, nil, nil, 665, nil, + nil, nil, nil, nil, nil, 665, nil, nil, 665, 665, + 665, 665, 665, 665, 665, 665, nil, 665, 665, 665, + nil, 665, 665, nil, 665, 665, 665, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 665, nil, nil, 665, + nil, nil, 665, 665, nil, nil, 665, nil, 665, nil, + nil, nil, 665, nil, nil, nil, nil, nil, nil, nil, + 665, nil, nil, nil, nil, 665, 665, 665, 665, 665, + 665, nil, nil, nil, 665, 665, nil, nil, nil, nil, + nil, nil, 665, nil, nil, 665, 665, 665, nil, 665, + 665, 666, 666, 666, nil, 666, nil, nil, nil, 666, + 666, nil, nil, nil, 666, nil, 666, 666, 666, 666, + 666, 666, 666, nil, nil, nil, nil, nil, 666, 666, + 666, 666, 666, 666, 666, nil, nil, 666, nil, nil, + nil, nil, nil, nil, 666, nil, nil, 666, 666, 666, + 666, 666, 666, 666, 666, nil, 666, 666, 666, nil, + 666, 666, nil, 666, 666, 666, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 666, nil, nil, 666, nil, + nil, 666, 666, nil, nil, 666, nil, nil, nil, nil, + nil, 666, nil, nil, nil, nil, nil, nil, nil, 666, + nil, nil, nil, nil, 666, 666, 666, 666, 666, 666, + nil, nil, nil, 666, 666, nil, nil, nil, nil, nil, + nil, 666, nil, nil, 666, 666, 666, nil, 666, 666, + 667, 667, 667, nil, 667, nil, nil, nil, 667, 667, + nil, nil, nil, 667, nil, 667, 667, 667, 667, 667, + 667, 667, nil, nil, nil, nil, nil, 667, 667, 667, + 667, 667, 667, 667, nil, nil, 667, nil, nil, nil, + nil, nil, nil, 667, nil, nil, 667, 667, 667, 667, + 667, 667, 667, 667, 667, 667, 667, 667, nil, 667, + 667, nil, 667, 667, 667, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 667, nil, nil, 667, nil, nil, + 667, 667, nil, nil, 667, nil, 667, nil, 667, nil, + 667, nil, nil, nil, nil, nil, nil, nil, 667, nil, + nil, nil, nil, 667, 667, 667, 667, 667, 667, nil, + nil, nil, 667, 667, nil, nil, nil, nil, nil, nil, + 667, nil, 667, 667, 667, 667, nil, 667, 667, 670, + 670, 670, 670, 670, nil, nil, nil, 670, 670, nil, + nil, nil, 670, nil, 670, 670, 670, 670, 670, 670, + 670, nil, nil, nil, nil, nil, 670, 670, 670, 670, + 670, 670, 670, nil, nil, 670, nil, nil, nil, nil, + nil, 670, 670, nil, 670, 670, 670, 670, 670, 670, + 670, 670, 670, nil, 670, 670, 670, nil, 670, 670, + nil, 670, 670, 670, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 670, nil, nil, 670, nil, nil, 670, + 670, nil, nil, 670, nil, 670, nil, nil, nil, 670, + nil, nil, nil, nil, nil, nil, nil, 670, nil, nil, + nil, nil, 670, 670, 670, 670, 670, 670, nil, nil, + nil, 670, 670, nil, nil, nil, nil, nil, nil, 670, + nil, nil, 670, 670, 670, nil, 670, 670, 671, 671, + 671, nil, 671, nil, nil, nil, 671, 671, nil, nil, + nil, 671, nil, 671, 671, 671, 671, 671, 671, 671, + nil, nil, nil, nil, nil, 671, 671, 671, 671, 671, + 671, 671, nil, nil, 671, nil, nil, nil, nil, nil, + nil, 671, nil, nil, 671, 671, 671, 671, 671, 671, + 671, 671, nil, 671, 671, 671, nil, 671, 671, nil, + 671, 671, 671, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 671, nil, nil, 671, nil, nil, 671, 671, + nil, nil, 671, nil, nil, nil, nil, nil, 671, nil, + nil, nil, nil, nil, nil, nil, 671, nil, nil, nil, + nil, 671, 671, 671, 671, 671, 671, nil, nil, nil, + 671, 671, nil, nil, nil, nil, nil, nil, 671, nil, + nil, 671, 671, 671, nil, 671, 671, 674, 674, 674, + nil, 674, nil, nil, nil, 674, 674, nil, nil, nil, + 674, nil, 674, 674, 674, 674, 674, 674, 674, nil, + nil, nil, nil, nil, 674, 674, 674, 674, 674, 674, + 674, nil, nil, 674, nil, nil, nil, nil, nil, nil, + 674, nil, nil, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, nil, 674, 674, nil, 674, + 674, 674, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 674, nil, nil, 674, nil, nil, 674, 674, nil, + nil, 674, nil, 674, nil, 674, nil, 674, nil, nil, + nil, nil, nil, nil, nil, 674, nil, nil, nil, nil, + 674, 674, 674, 674, 674, 674, nil, nil, nil, 674, + 674, nil, nil, nil, nil, nil, nil, 674, nil, 674, + 674, 674, 674, nil, 674, 674, 675, 675, 675, nil, + 675, nil, nil, nil, 675, 675, nil, nil, nil, 675, + nil, 675, 675, 675, 675, 675, 675, 675, nil, nil, + nil, nil, nil, 675, 675, 675, 675, 675, 675, 675, + nil, nil, 675, nil, nil, nil, nil, nil, nil, 675, + nil, nil, 675, 675, 675, 675, 675, 675, 675, 675, + 675, 675, 675, 675, nil, 675, 675, nil, 675, 675, + 675, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 675, nil, nil, 675, nil, nil, 675, 675, nil, nil, + 675, nil, nil, nil, 675, nil, 675, nil, nil, nil, + nil, nil, nil, nil, 675, nil, nil, nil, nil, 675, + 675, 675, 675, 675, 675, nil, nil, nil, 675, 675, + nil, nil, nil, nil, nil, nil, 675, nil, 675, 675, + 675, 675, nil, 675, 675, 676, 676, 676, nil, 676, + nil, nil, nil, 676, 676, nil, nil, nil, 676, nil, + 676, 676, 676, 676, 676, 676, 676, nil, nil, nil, + nil, nil, 676, 676, 676, 676, 676, 676, 676, nil, + nil, 676, nil, nil, nil, nil, nil, nil, 676, nil, + nil, 676, 676, 676, 676, 676, 676, 676, 676, nil, + 676, 676, 676, nil, 676, 676, nil, 676, 676, 676, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 676, + nil, nil, 676, nil, nil, 676, 676, nil, nil, 676, + nil, nil, nil, nil, nil, 676, nil, nil, nil, nil, + nil, nil, nil, 676, nil, nil, nil, nil, 676, 676, + 676, 676, 676, 676, nil, nil, nil, 676, 676, nil, + nil, nil, nil, nil, nil, 676, nil, nil, 676, 676, + 676, nil, 676, 676, 677, 677, 677, nil, 677, nil, + nil, nil, 677, 677, nil, nil, nil, 677, nil, 677, + 677, 677, 677, 677, 677, 677, nil, nil, nil, nil, + nil, 677, 677, 677, 677, 677, 677, 677, nil, nil, + 677, nil, nil, nil, nil, nil, nil, 677, nil, nil, + 677, 677, 677, 677, 677, 677, 677, 677, nil, 677, + 677, 677, nil, 677, 677, nil, 677, 677, 677, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 677, nil, + nil, 677, nil, nil, 677, 677, nil, nil, 677, nil, + nil, nil, nil, nil, 677, nil, nil, nil, nil, nil, + nil, nil, 677, nil, nil, nil, nil, 677, 677, 677, + 677, 677, 677, nil, nil, nil, 677, 677, nil, nil, + nil, nil, nil, nil, 677, nil, nil, 677, 677, 677, + nil, 677, 677, 682, 682, 682, nil, 682, nil, nil, + nil, 682, 682, nil, nil, nil, 682, nil, 682, 682, + 682, 682, 682, 682, 682, nil, nil, nil, nil, nil, + 682, 682, 682, 682, 682, 682, 682, nil, nil, 682, + nil, nil, nil, nil, nil, nil, 682, nil, nil, 682, + 682, 682, 682, 682, 682, 682, 682, nil, 682, 682, + 682, nil, 682, 682, nil, 682, 682, 682, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 682, nil, nil, + 682, nil, nil, 682, 682, nil, nil, 682, nil, nil, + nil, nil, nil, 682, nil, nil, nil, nil, nil, nil, + nil, 682, nil, nil, nil, nil, 682, 682, 682, 682, + 682, 682, nil, nil, nil, 682, 682, nil, nil, nil, + nil, nil, nil, 682, nil, nil, 682, 682, 682, nil, + 682, 682, 683, 683, 683, nil, 683, nil, nil, nil, + 683, 683, nil, nil, nil, 683, nil, 683, 683, 683, + 683, 683, 683, 683, nil, nil, nil, nil, nil, 683, + 683, 683, 683, 683, 683, 683, nil, nil, 683, nil, + nil, nil, nil, nil, nil, 683, nil, nil, 683, 683, + 683, 683, 683, 683, 683, 683, nil, 683, 683, 683, + nil, 683, 683, nil, 683, 683, 683, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 683, nil, nil, 683, + nil, nil, 683, 683, nil, nil, 683, nil, nil, nil, + nil, nil, 683, nil, nil, nil, nil, nil, nil, nil, + 683, nil, nil, nil, nil, 683, 683, 683, 683, 683, + 683, nil, nil, nil, 683, 683, nil, nil, nil, nil, + nil, nil, 683, nil, nil, 683, 683, 683, nil, 683, + 683, 707, 707, 707, nil, 707, nil, nil, nil, 707, + 707, nil, nil, nil, 707, nil, 707, 707, 707, 707, + 707, 707, 707, nil, nil, nil, nil, nil, 707, 707, + 707, 707, 707, 707, 707, nil, nil, 707, nil, nil, + nil, nil, nil, nil, 707, nil, nil, 707, 707, 707, + 707, 707, 707, 707, 707, nil, 707, 707, 707, nil, + 707, 707, nil, 707, 707, 707, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 707, nil, nil, 707, nil, + nil, 707, 707, nil, nil, 707, nil, nil, nil, nil, + nil, 707, nil, nil, nil, nil, nil, nil, nil, 707, + nil, nil, nil, nil, 707, 707, 707, 707, 707, 707, + nil, nil, nil, 707, 707, nil, nil, nil, nil, nil, + nil, 707, nil, nil, 707, 707, 707, nil, 707, 707, + 710, 710, 710, nil, 710, nil, nil, nil, 710, 710, + nil, nil, nil, 710, nil, 710, 710, 710, 710, 710, + 710, 710, nil, nil, nil, nil, nil, 710, 710, 710, + 710, 710, 710, 710, nil, nil, 710, nil, nil, nil, + nil, nil, nil, 710, nil, nil, 710, 710, 710, 710, + 710, 710, 710, 710, nil, 710, 710, 710, nil, 710, + 710, nil, 710, 710, 710, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 710, nil, nil, 710, nil, nil, + 710, 710, nil, nil, 710, nil, nil, nil, nil, nil, + 710, nil, nil, nil, nil, nil, nil, nil, 710, nil, + nil, nil, nil, 710, 710, 710, 710, 710, 710, nil, + nil, nil, 710, 710, nil, nil, nil, nil, nil, nil, + 710, nil, nil, 710, 710, 710, nil, 710, 710, 714, + 714, 714, nil, 714, nil, nil, nil, 714, 714, nil, + nil, nil, 714, nil, 714, 714, 714, 714, 714, 714, + 714, nil, nil, nil, nil, nil, 714, 714, 714, 714, + 714, 714, 714, nil, nil, 714, nil, nil, nil, nil, + nil, nil, 714, nil, nil, 714, 714, 714, 714, 714, + 714, 714, 714, nil, 714, 714, 714, nil, 714, 714, + nil, nil, nil, 714, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 714, nil, nil, 714, nil, nil, 714, + 714, nil, nil, 714, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 714, 714, 714, 714, 714, 714, nil, nil, + nil, 714, 714, nil, nil, nil, nil, nil, nil, 714, + nil, nil, 714, 714, 714, nil, 714, 714, 725, 725, + 725, nil, 725, nil, nil, nil, 725, 725, nil, nil, + nil, 725, nil, 725, 725, 725, 725, 725, 725, 725, + nil, nil, nil, nil, nil, 725, 725, 725, 725, 725, + 725, 725, nil, nil, 725, nil, nil, nil, nil, nil, + nil, 725, nil, nil, 725, 725, 725, 725, 725, 725, + 725, 725, nil, 725, 725, 725, nil, 725, 725, nil, + nil, nil, 725, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 725, nil, nil, 725, nil, nil, 725, 725, + nil, nil, 725, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 725, 725, 725, 725, 725, 725, nil, nil, nil, + 725, 725, nil, nil, nil, nil, nil, nil, 725, nil, + nil, 725, 725, 725, nil, 725, 725, 731, 731, 731, + nil, 731, nil, nil, nil, 731, 731, nil, nil, nil, + 731, nil, 731, 731, 731, 731, 731, 731, 731, nil, + nil, nil, nil, nil, 731, 731, 731, 731, 731, 731, + 731, nil, nil, 731, nil, nil, nil, nil, nil, nil, + 731, nil, nil, 731, 731, 731, 731, 731, 731, 731, + 731, nil, 731, 731, 731, nil, 731, 731, nil, 731, + 731, 731, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 731, nil, nil, 731, nil, nil, 731, 731, nil, + nil, 731, nil, 731, nil, nil, nil, 731, nil, nil, + nil, nil, nil, nil, nil, 731, nil, nil, nil, nil, + 731, 731, 731, 731, 731, 731, nil, nil, nil, 731, + 731, nil, nil, nil, nil, nil, nil, 731, nil, nil, + 731, 731, 731, nil, 731, 731, 736, 736, 736, nil, + 736, nil, nil, nil, 736, 736, nil, nil, nil, 736, + nil, 736, 736, 736, 736, 736, 736, 736, nil, nil, + nil, nil, nil, 736, 736, 736, 736, 736, 736, 736, + nil, nil, 736, nil, nil, nil, nil, nil, nil, 736, + nil, nil, 736, 736, 736, 736, 736, 736, 736, 736, + 736, 736, 736, 736, nil, 736, 736, nil, 736, 736, + 736, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 736, nil, nil, 736, nil, nil, 736, 736, nil, nil, + 736, nil, 736, nil, nil, nil, 736, nil, nil, nil, + nil, nil, nil, nil, 736, nil, nil, nil, nil, 736, + 736, 736, 736, 736, 736, nil, nil, nil, 736, 736, + nil, nil, nil, nil, nil, nil, 736, nil, 736, 736, + 736, 736, nil, 736, 736, 739, 739, 739, nil, 739, + nil, nil, nil, 739, 739, nil, nil, nil, 739, nil, + 739, 739, 739, 739, 739, 739, 739, nil, nil, nil, + nil, nil, 739, 739, 739, 739, 739, 739, 739, nil, + nil, 739, nil, nil, nil, nil, nil, nil, 739, nil, + nil, 739, 739, 739, 739, 739, 739, 739, 739, 739, + 739, 739, 739, nil, 739, 739, nil, 739, 739, 739, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 739, + nil, nil, 739, nil, nil, 739, 739, nil, nil, 739, + nil, nil, nil, nil, nil, 739, nil, nil, nil, nil, + nil, nil, nil, 739, nil, nil, nil, nil, 739, 739, + 739, 739, 739, 739, nil, nil, nil, 739, 739, nil, + nil, nil, nil, nil, nil, 739, nil, 739, 739, 739, + 739, nil, 739, 739, 753, 753, 753, nil, 753, nil, + nil, nil, 753, 753, nil, nil, nil, 753, nil, 753, + 753, 753, 753, 753, 753, 753, nil, nil, nil, nil, + nil, 753, 753, 753, 753, 753, 753, 753, nil, nil, + 753, nil, nil, nil, nil, nil, nil, 753, nil, nil, + 753, 753, 753, 753, 753, 753, 753, 753, nil, 753, + 753, 753, nil, 753, 753, nil, 753, 753, 753, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 753, nil, + nil, 753, nil, nil, 753, 753, nil, nil, 753, nil, + 753, nil, nil, nil, 753, nil, nil, nil, nil, nil, + nil, nil, 753, nil, nil, nil, nil, 753, 753, 753, + 753, 753, 753, nil, nil, nil, 753, 753, nil, nil, + nil, nil, nil, nil, 753, nil, nil, 753, 753, 753, + nil, 753, 753, 765, 765, 765, nil, 765, nil, nil, + nil, 765, 765, nil, nil, nil, 765, nil, 765, 765, + 765, 765, 765, 765, 765, nil, nil, nil, nil, nil, + 765, 765, 765, 765, 765, 765, 765, nil, nil, 765, + nil, nil, nil, nil, nil, nil, 765, nil, nil, 765, + 765, 765, 765, 765, 765, 765, 765, nil, 765, 765, + 765, nil, 765, 765, nil, 765, 765, 765, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 765, nil, nil, + 765, nil, nil, 765, 765, nil, nil, 765, nil, nil, + nil, nil, nil, 765, nil, nil, nil, nil, nil, nil, + nil, 765, nil, nil, nil, nil, 765, 765, 765, 765, + 765, 765, nil, nil, nil, 765, 765, nil, nil, nil, + nil, nil, nil, 765, nil, nil, 765, 765, 765, nil, + 765, 765, 785, 785, 785, nil, 785, nil, nil, nil, + 785, 785, nil, nil, nil, 785, nil, 785, 785, 785, + 785, 785, 785, 785, nil, nil, nil, nil, nil, 785, + 785, 785, 785, 785, 785, 785, nil, nil, 785, nil, + nil, nil, nil, nil, nil, 785, nil, nil, 785, 785, + 785, 785, 785, 785, 785, 785, nil, 785, 785, 785, + nil, 785, 785, nil, 785, 785, 785, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 785, nil, nil, 785, + nil, nil, 785, 785, nil, nil, 785, nil, nil, nil, + nil, nil, 785, nil, nil, nil, nil, nil, nil, nil, + 785, nil, nil, nil, nil, 785, 785, 785, 785, 785, + 785, nil, nil, nil, 785, 785, nil, nil, nil, nil, + nil, nil, 785, nil, nil, 785, 785, 785, nil, 785, + 785, 807, 807, 807, nil, 807, nil, nil, nil, 807, + 807, nil, nil, nil, 807, nil, 807, 807, 807, 807, + 807, 807, 807, nil, nil, nil, nil, nil, 807, 807, + 807, 807, 807, 807, 807, nil, nil, 807, nil, nil, + nil, nil, nil, nil, 807, nil, nil, 807, 807, 807, + 807, 807, 807, 807, 807, nil, 807, 807, 807, nil, + 807, 807, nil, 807, 807, 807, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 807, nil, nil, 807, nil, + nil, 807, 807, nil, nil, 807, nil, nil, nil, nil, + nil, 807, nil, nil, nil, nil, nil, nil, nil, 807, + nil, nil, nil, nil, 807, 807, 807, 807, 807, 807, + nil, nil, nil, 807, 807, nil, nil, nil, nil, nil, + nil, 807, nil, nil, 807, 807, 807, nil, 807, 807, + 815, 815, 815, nil, 815, nil, nil, nil, 815, 815, + nil, nil, nil, 815, nil, 815, 815, 815, 815, 815, + 815, 815, nil, nil, nil, nil, nil, 815, 815, 815, + 815, 815, 815, 815, nil, nil, 815, nil, nil, nil, + nil, nil, nil, 815, nil, nil, 815, 815, 815, 815, + 815, 815, 815, 815, nil, 815, 815, 815, nil, 815, + 815, nil, 815, 815, 815, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 815, nil, nil, 815, nil, nil, + 815, 815, nil, nil, 815, nil, nil, nil, nil, nil, + 815, nil, nil, nil, nil, nil, nil, nil, 815, nil, + nil, nil, nil, 815, 815, 815, 815, 815, 815, nil, + nil, nil, 815, 815, nil, nil, nil, nil, nil, nil, + 815, nil, nil, 815, 815, 815, nil, 815, 815, 828, + 828, 828, nil, 828, nil, nil, nil, 828, 828, nil, + nil, nil, 828, nil, 828, 828, 828, 828, 828, 828, + 828, nil, nil, nil, nil, nil, 828, 828, 828, 828, + 828, 828, 828, nil, nil, 828, nil, nil, nil, nil, + nil, nil, 828, nil, nil, 828, 828, 828, 828, 828, + 828, 828, 828, nil, 828, 828, 828, nil, 828, 828, + nil, 828, 828, 828, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 828, nil, nil, 828, nil, nil, 828, + 828, nil, nil, 828, nil, nil, nil, nil, nil, 828, + nil, nil, nil, nil, nil, nil, nil, 828, nil, nil, + nil, nil, 828, 828, 828, 828, 828, 828, nil, nil, + nil, 828, 828, nil, nil, nil, nil, nil, nil, 828, + nil, nil, 828, 828, 828, nil, 828, 828, 829, 829, + 829, nil, 829, nil, nil, nil, 829, 829, nil, nil, + nil, 829, nil, 829, 829, 829, 829, 829, 829, 829, + nil, nil, nil, nil, nil, 829, 829, 829, 829, 829, + 829, 829, nil, nil, 829, nil, nil, nil, nil, nil, + nil, 829, nil, nil, 829, 829, 829, 829, 829, 829, + 829, 829, nil, 829, 829, 829, nil, 829, 829, nil, + 829, 829, 829, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 829, nil, nil, 829, nil, nil, 829, 829, + nil, nil, 829, nil, nil, nil, nil, nil, 829, nil, + nil, nil, nil, nil, nil, nil, 829, nil, nil, nil, + nil, 829, 829, 829, 829, 829, 829, nil, nil, nil, + 829, 829, nil, nil, nil, nil, nil, nil, 829, nil, + nil, 829, 829, 829, nil, 829, 829, 830, 830, 830, + nil, 830, nil, nil, nil, 830, 830, nil, nil, nil, + 830, nil, 830, 830, 830, 830, 830, 830, 830, nil, + nil, nil, nil, nil, 830, 830, 830, 830, 830, 830, + 830, nil, nil, 830, nil, nil, nil, nil, nil, nil, + 830, nil, nil, 830, 830, 830, 830, 830, 830, 830, + 830, nil, 830, 830, 830, nil, 830, 830, nil, 830, + 830, 830, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 830, nil, nil, 830, nil, nil, 830, 830, nil, + nil, 830, nil, nil, nil, nil, nil, 830, nil, nil, + nil, nil, nil, nil, nil, 830, nil, nil, nil, nil, + 830, 830, 830, 830, 830, 830, nil, nil, nil, 830, + 830, nil, nil, nil, nil, nil, nil, 830, nil, nil, + 830, 830, 830, nil, 830, 830, 831, 831, 831, nil, + 831, nil, nil, nil, 831, 831, nil, nil, nil, 831, + nil, 831, 831, 831, 831, 831, 831, 831, nil, nil, + nil, nil, nil, 831, 831, 831, 831, 831, 831, 831, + nil, nil, 831, nil, nil, nil, nil, nil, nil, 831, + nil, nil, 831, 831, 831, 831, 831, 831, 831, 831, + nil, 831, 831, 831, nil, 831, 831, nil, 831, 831, + 831, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 831, nil, nil, 831, nil, nil, 831, 831, nil, nil, + 831, nil, nil, nil, nil, nil, 831, nil, nil, nil, + nil, nil, nil, nil, 831, nil, nil, nil, nil, 831, + 831, 831, 831, 831, 831, nil, nil, nil, 831, 831, + nil, nil, nil, nil, nil, nil, 831, nil, nil, 831, + 831, 831, nil, 831, 831, 833, 833, 833, nil, 833, + nil, nil, nil, 833, 833, nil, nil, nil, 833, nil, + 833, 833, 833, 833, 833, 833, 833, nil, nil, nil, + nil, nil, 833, 833, 833, 833, 833, 833, 833, nil, + nil, 833, nil, nil, nil, nil, nil, nil, 833, nil, + nil, 833, 833, 833, 833, 833, 833, 833, 833, nil, + 833, 833, 833, nil, 833, 833, nil, 833, 833, 833, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 833, + nil, nil, 833, nil, nil, 833, 833, nil, nil, 833, + nil, nil, nil, nil, nil, 833, nil, nil, nil, nil, + nil, nil, nil, 833, nil, nil, nil, nil, 833, 833, + 833, 833, 833, 833, nil, nil, nil, 833, 833, nil, + nil, nil, nil, nil, nil, 833, nil, nil, 833, 833, + 833, nil, 833, 833, 866, 866, 866, nil, 866, nil, + nil, nil, 866, 866, nil, nil, nil, 866, nil, 866, + 866, 866, 866, 866, 866, 866, nil, nil, nil, nil, + nil, 866, 866, 866, 866, 866, 866, 866, nil, nil, + 866, nil, nil, nil, nil, nil, nil, 866, nil, nil, + 866, 866, 866, 866, 866, 866, 866, 866, nil, 866, + 866, 866, nil, 866, 866, nil, 866, 866, 866, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 866, nil, + nil, 866, nil, nil, 866, 866, nil, nil, 866, nil, + nil, nil, nil, nil, 866, nil, nil, nil, nil, nil, + nil, nil, 866, nil, nil, nil, nil, 866, 866, 866, + 866, 866, 866, nil, nil, nil, 866, 866, nil, nil, + nil, nil, nil, nil, 866, nil, nil, 866, 866, 866, + nil, 866, 866, 873, 873, 873, nil, 873, nil, nil, + nil, 873, 873, nil, nil, nil, 873, nil, 873, 873, + 873, 873, 873, 873, 873, nil, nil, nil, nil, nil, + 873, 873, 873, 873, 873, 873, 873, nil, nil, 873, + nil, nil, nil, nil, nil, nil, 873, nil, nil, 873, + 873, 873, 873, 873, 873, 873, 873, nil, 873, 873, + 873, nil, 873, 873, nil, 873, 873, 873, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 873, nil, nil, + 873, nil, nil, 873, 873, nil, nil, 873, nil, nil, + nil, nil, nil, 873, nil, nil, nil, nil, nil, nil, + nil, 873, nil, nil, nil, nil, 873, 873, 873, 873, + 873, 873, nil, nil, nil, 873, 873, nil, nil, nil, + nil, nil, nil, 873, nil, nil, 873, 873, 873, nil, + 873, 873, 921, 921, 921, nil, 921, nil, nil, nil, + 921, 921, nil, nil, nil, 921, nil, 921, 921, 921, + 921, 921, 921, 921, nil, nil, nil, nil, nil, 921, + 921, 921, 921, 921, 921, 921, nil, nil, 921, nil, + nil, nil, nil, nil, nil, 921, nil, nil, 921, 921, + 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, + nil, 921, 921, nil, 921, 921, 921, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 921, nil, nil, 921, + nil, nil, 921, 921, nil, nil, 921, nil, nil, nil, + 921, nil, 921, nil, nil, nil, nil, nil, nil, nil, + 921, nil, nil, nil, nil, 921, 921, 921, 921, 921, + 921, nil, nil, nil, 921, 921, nil, nil, nil, nil, + nil, nil, 921, nil, 921, 921, 921, 921, nil, 921, + 921, 922, 922, 922, nil, 922, nil, nil, nil, 922, + 922, nil, nil, nil, 922, nil, 922, 922, 922, 922, + 922, 922, 922, nil, nil, nil, nil, nil, 922, 922, + 922, 922, 922, 922, 922, nil, nil, 922, nil, nil, + nil, nil, nil, nil, 922, nil, nil, 922, 922, 922, + 922, 922, 922, 922, 922, nil, 922, 922, 922, nil, + 922, 922, nil, 922, 922, 922, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 922, nil, nil, 922, nil, + nil, 922, 922, nil, nil, 922, nil, nil, nil, nil, + nil, 922, nil, nil, nil, nil, nil, nil, nil, 922, + nil, nil, nil, nil, 922, 922, 922, 922, 922, 922, + nil, nil, nil, 922, 922, nil, nil, nil, nil, nil, + nil, 922, nil, nil, 922, 922, 922, nil, 922, 922, + 934, 934, 934, nil, 934, nil, nil, nil, 934, 934, + nil, nil, nil, 934, nil, 934, 934, 934, 934, 934, + 934, 934, nil, nil, nil, nil, nil, 934, 934, 934, + 934, 934, 934, 934, nil, nil, 934, nil, nil, nil, + nil, nil, nil, 934, nil, nil, 934, 934, 934, 934, + 934, 934, 934, 934, nil, 934, 934, 934, nil, 934, + 934, nil, nil, nil, 934, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 934, nil, nil, 934, nil, nil, + 934, 934, nil, nil, 934, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 934, 934, 934, 934, 934, 934, nil, + nil, nil, 934, 934, nil, nil, nil, nil, nil, nil, + 934, nil, nil, 934, 934, 934, nil, 934, 934, 943, + 943, 943, nil, 943, nil, nil, nil, 943, 943, nil, + nil, nil, 943, nil, 943, 943, 943, 943, 943, 943, + 943, nil, nil, nil, nil, nil, 943, 943, 943, 943, + 943, 943, 943, nil, nil, 943, nil, nil, nil, nil, + nil, nil, 943, nil, nil, 943, 943, 943, 943, 943, + 943, 943, 943, nil, 943, 943, 943, nil, 943, 943, + nil, nil, nil, 943, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 943, nil, nil, 943, nil, nil, 943, + 943, nil, nil, 943, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 943, 943, 943, 943, 943, 943, nil, nil, + nil, 943, 943, nil, nil, nil, nil, nil, nil, 943, + nil, nil, 943, 943, 943, nil, 943, 943, 951, 951, + 951, nil, 951, nil, nil, nil, 951, 951, nil, nil, + nil, 951, nil, 951, 951, 951, 951, 951, 951, 951, + nil, nil, nil, nil, nil, 951, 951, 951, 951, 951, + 951, 951, nil, nil, 951, nil, nil, nil, nil, nil, + nil, 951, nil, nil, 951, 951, 951, 951, 951, 951, + 951, 951, nil, 951, 951, 951, nil, 951, 951, nil, + 951, 951, 951, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 951, nil, nil, 951, nil, nil, 951, 951, + nil, nil, 951, nil, 951, nil, nil, nil, 951, nil, + nil, nil, nil, nil, nil, nil, 951, nil, nil, nil, + nil, 951, 951, 951, 951, 951, 951, nil, nil, nil, + 951, 951, nil, nil, nil, nil, nil, nil, 951, nil, + nil, 951, 951, 951, nil, 951, 951, 992, 992, 992, + nil, 992, nil, nil, nil, 992, 992, nil, nil, nil, + 992, nil, 992, 992, 992, 992, 992, 992, 992, nil, + nil, nil, nil, nil, 992, 992, 992, 992, 992, 992, + 992, nil, nil, 992, nil, nil, nil, nil, nil, nil, + 992, nil, nil, 992, 992, 992, 992, 992, 992, 992, + 992, nil, 992, 992, 992, nil, 992, 992, nil, nil, + nil, 992, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 992, nil, nil, 992, nil, nil, 992, 992, nil, + nil, 992, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 992, 992, 992, 992, 992, 992, nil, nil, nil, 992, + 992, nil, nil, nil, nil, nil, nil, 992, nil, nil, + 992, 992, 992, nil, 992, 992, 1006, 1006, 1006, nil, + 1006, nil, nil, nil, 1006, 1006, nil, nil, nil, 1006, + nil, 1006, 1006, 1006, 1006, 1006, 1006, 1006, nil, nil, + nil, nil, nil, 1006, 1006, 1006, 1006, 1006, 1006, 1006, + nil, nil, 1006, nil, nil, nil, nil, nil, nil, 1006, + nil, nil, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, + nil, 1006, 1006, 1006, nil, 1006, 1006, nil, 1006, 1006, + 1006, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1006, nil, nil, 1006, nil, nil, 1006, 1006, nil, nil, + 1006, nil, nil, nil, nil, nil, 1006, nil, nil, nil, + nil, nil, nil, nil, 1006, nil, nil, nil, nil, 1006, + 1006, 1006, 1006, 1006, 1006, nil, nil, nil, 1006, 1006, + nil, nil, nil, nil, nil, nil, 1006, nil, nil, 1006, + 1006, 1006, nil, 1006, 1006, 1037, 1037, 1037, nil, 1037, + nil, nil, nil, 1037, 1037, nil, nil, nil, 1037, nil, + 1037, 1037, 1037, 1037, 1037, 1037, 1037, nil, nil, nil, + nil, nil, 1037, 1037, 1037, 1037, 1037, 1037, 1037, nil, + nil, 1037, nil, nil, nil, nil, nil, nil, 1037, nil, + nil, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, + 1037, 1037, 1037, nil, 1037, 1037, nil, 1037, 1037, 1037, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1037, + nil, nil, 1037, nil, nil, 1037, 1037, nil, nil, 1037, + nil, 1037, nil, 1037, nil, 1037, nil, nil, nil, nil, + nil, nil, nil, 1037, nil, nil, nil, nil, 1037, 1037, + 1037, 1037, 1037, 1037, nil, nil, nil, 1037, 1037, nil, + nil, nil, nil, nil, nil, 1037, nil, 1037, 1037, 1037, + 1037, nil, 1037, 1037, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, nil, nil, + nil, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, nil, nil, nil, nil, nil, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, nil, 11, nil, nil, + nil, nil, nil, nil, nil, nil, 11, 11, nil, 11, + 11, 11, 11, 11, 11, 11, nil, nil, 11, 11, + nil, nil, nil, 11, 11, 11, 11, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 11, 11, nil, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, nil, nil, 11, 11, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 11, nil, nil, + nil, nil, nil, nil, nil, nil, 11, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, nil, nil, nil, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, nil, nil, nil, nil, nil, 12, + 12, 12, 12, 12, 12, 12, 12, 12, nil, nil, + 12, nil, nil, nil, nil, nil, nil, nil, nil, 12, + 12, nil, 12, 12, 12, 12, 12, 12, 12, nil, + nil, 12, 12, nil, nil, nil, 12, 12, 12, 12, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 12, 12, nil, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, nil, nil, 12, + 12, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 12, nil, nil, nil, nil, nil, nil, nil, nil, 12, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, nil, nil, nil, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, nil, nil, nil, + nil, nil, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, nil, 75, nil, nil, nil, nil, + nil, nil, 75, 75, nil, 75, 75, 75, 75, 75, + 75, 75, nil, nil, 75, 75, nil, nil, nil, 75, + 75, 75, 75, nil, nil, nil, nil, nil, 75, nil, + nil, nil, nil, nil, nil, nil, 75, 75, nil, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + nil, nil, 75, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 75, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, nil, nil, nil, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + nil, nil, nil, nil, nil, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, nil, 105, nil, + nil, nil, nil, nil, nil, 105, 105, nil, 105, 105, + 105, 105, 105, 105, 105, nil, nil, 105, 105, nil, + nil, nil, 105, 105, 105, 105, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 105, + 105, nil, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, nil, nil, 105, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + nil, nil, nil, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, nil, nil, nil, nil, nil, 428, 428, + 428, 428, 428, 428, 428, 428, 428, nil, nil, 428, + nil, nil, nil, nil, nil, nil, nil, nil, 428, 428, + nil, 428, 428, 428, 428, 428, 428, 428, nil, nil, + 428, 428, nil, nil, nil, 428, 428, 428, 428, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 428, 428, nil, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, nil, nil, 428, 428, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 428, + nil, nil, nil, nil, nil, nil, nil, nil, 428, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, nil, nil, nil, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, nil, nil, nil, nil, + nil, 662, 662, 662, 662, 662, 662, 662, 662, 662, + nil, nil, 662, nil, nil, nil, nil, nil, nil, nil, + nil, 662, 662, nil, 662, 662, 662, 662, 662, 662, + 662, nil, nil, 662, 662, nil, nil, nil, 662, 662, + 662, 662, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 662, 662, nil, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, nil, + nil, 662, 662, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 662, nil, nil, nil, nil, nil, nil, nil, + nil, 662, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, nil, nil, nil, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, nil, + nil, nil, nil, nil, 771, 771, 771, 771, 771, 771, + 771, 771, 771, nil, nil, 771, nil, nil, nil, nil, + nil, nil, nil, nil, 771, 771, nil, 771, 771, 771, + 771, 771, 771, 771, nil, nil, 771, 771, nil, nil, + nil, 771, 771, 771, 771, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 771, 771, + nil, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, nil, nil, 771, nil, nil, nil, nil, 228, + 228, nil, nil, 228, nil, nil, nil, nil, nil, nil, + nil, nil, 228, 228, 771, 228, 228, 228, 228, 228, + 228, 228, nil, nil, 228, 228, nil, nil, nil, 228, + 228, 228, 228, nil, nil, nil, nil, nil, 228, nil, + nil, nil, nil, nil, nil, nil, 228, 228, nil, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + nil, nil, 228, nil, nil, nil, nil, 229, 229, nil, + nil, 229, nil, nil, nil, nil, nil, nil, nil, nil, + 229, 229, 228, 229, 229, 229, 229, 229, 229, 229, + nil, nil, 229, 229, nil, nil, nil, 229, 229, 229, + 229, nil, nil, nil, nil, nil, 229, nil, nil, nil, + nil, nil, nil, nil, 229, 229, nil, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, nil, nil, + 229, nil, nil, nil, nil, 479, 479, nil, nil, 479, + nil, nil, nil, nil, nil, nil, nil, nil, 479, 479, + 229, 479, 479, 479, 479, 479, 479, 479, nil, nil, + 479, 479, nil, nil, nil, 479, 479, 479, 479, nil, + nil, nil, nil, nil, 479, nil, nil, nil, nil, nil, + nil, nil, 479, 479, nil, 479, 479, 479, 479, 479, + 479, 479, 479, 479, 479, 479, nil, nil, 479, nil, + nil, nil, nil, 480, 480, nil, nil, 480, nil, nil, + nil, nil, nil, nil, nil, nil, 480, 480, 479, 480, + 480, 480, 480, 480, 480, 480, nil, nil, 480, 480, + nil, nil, nil, 480, 480, 480, 480, nil, nil, nil, + nil, nil, 480, nil, nil, nil, nil, nil, nil, nil, + 480, 480, nil, 480, 480, 480, 480, 480, 480, 480, + 480, 480, 480, 480, nil, nil, 480, nil, nil, nil, + nil, 545, 545, nil, nil, 545, nil, nil, nil, nil, + nil, nil, nil, nil, 545, 545, 480, 545, 545, 545, + 545, 545, 545, 545, nil, nil, 545, 545, nil, nil, + nil, 545, 545, 545, 545, nil, nil, nil, nil, nil, + 545, nil, nil, nil, nil, nil, nil, nil, 545, 545, + nil, 545, 545, 545, 545, 545, 545, 545, 545, 545, + 545, 545, nil, nil, 545, nil, nil, nil, nil, 546, + 546, nil, nil, 546, nil, nil, nil, nil, nil, nil, + nil, nil, 546, 546, 545, 546, 546, 546, 546, 546, + 546, 546, nil, nil, 546, 546, nil, nil, nil, 546, + 546, 546, 546, nil, nil, nil, nil, nil, 546, nil, + nil, nil, nil, nil, nil, nil, 546, 546, nil, 546, + 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, + nil, nil, 546, nil, nil, nil, nil, 555, 555, nil, + nil, 555, nil, nil, nil, nil, nil, nil, nil, nil, + 555, 555, 546, 555, 555, 555, 555, 555, 555, 555, + nil, nil, 555, 555, nil, nil, nil, 555, 555, 555, + 555, nil, nil, nil, nil, nil, 555, nil, nil, nil, + nil, nil, nil, nil, 555, 555, nil, 555, 555, 555, + 555, 555, 555, 555, 555, 555, 555, 555, nil, nil, + 555, nil, nil, nil, nil, 556, 556, nil, nil, 556, + nil, nil, nil, nil, nil, nil, nil, nil, 556, 556, + 555, 556, 556, 556, 556, 556, 556, 556, nil, nil, + 556, 556, nil, nil, nil, 556, 556, 556, 556, nil, + nil, nil, nil, nil, 556, nil, nil, nil, nil, nil, + nil, nil, 556, 556, nil, 556, 556, 556, 556, 556, + 556, 556, 556, 556, 556, 556, nil, nil, 556, nil, + nil, nil, nil, 584, 584, nil, nil, 584, nil, nil, + nil, nil, nil, nil, nil, nil, 584, 584, 556, 584, + 584, 584, 584, 584, 584, 584, nil, nil, 584, 584, + nil, nil, nil, 584, 584, 584, 584, nil, nil, nil, + nil, nil, 584, nil, nil, nil, nil, nil, nil, nil, + 584, 584, nil, 584, 584, 584, 584, 584, 584, 584, + 584, 584, 584, 584, nil, nil, 584, nil, nil, nil, + nil, 585, 585, nil, nil, 585, nil, nil, nil, nil, + nil, nil, nil, nil, 585, 585, 584, 585, 585, 585, + 585, 585, 585, 585, nil, nil, 585, 585, nil, nil, + nil, 585, 585, 585, 585, nil, nil, nil, nil, nil, + 585, nil, nil, nil, nil, nil, nil, nil, 585, 585, + nil, 585, 585, 585, 585, 585, 585, 585, 585, 585, + 585, 585, nil, nil, 585, nil, nil, nil, nil, 591, + 591, nil, nil, 591, nil, nil, nil, nil, nil, nil, + nil, nil, 591, 591, 585, 591, 591, 591, 591, 591, + 591, 591, nil, nil, 591, 591, nil, nil, nil, 591, + 591, 591, 591, nil, nil, nil, nil, nil, 591, nil, + nil, nil, nil, nil, nil, nil, 591, 591, nil, 591, + 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, + nil, nil, 591, nil, nil, nil, nil, 592, 592, nil, + nil, 592, nil, nil, nil, nil, nil, nil, nil, nil, + 592, 592, 591, 592, 592, 592, 592, 592, 592, 592, + nil, nil, 592, 592, nil, nil, nil, 592, 592, 592, + 592, nil, nil, nil, nil, nil, 592, nil, nil, nil, + nil, nil, nil, nil, 592, 592, nil, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, nil, nil, + 592, nil, nil, nil, nil, 668, 668, nil, nil, 668, + nil, nil, nil, nil, nil, nil, nil, nil, 668, 668, + 592, 668, 668, 668, 668, 668, 668, 668, nil, nil, + 668, 668, nil, nil, nil, 668, 668, 668, 668, nil, + nil, nil, nil, nil, 668, nil, nil, nil, nil, nil, + nil, nil, 668, 668, nil, 668, 668, 668, 668, 668, + 668, 668, 668, 668, 668, 668, nil, nil, 668, nil, + nil, nil, nil, 669, 669, nil, nil, 669, nil, nil, + nil, nil, nil, nil, nil, nil, 669, 669, 668, 669, + 669, 669, 669, 669, 669, 669, nil, nil, 669, 669, + nil, nil, nil, 669, 669, 669, 669, nil, nil, nil, + nil, nil, 669, nil, nil, nil, nil, nil, nil, nil, + 669, 669, nil, 669, 669, 669, 669, 669, 669, 669, + 669, 669, 669, 669, nil, 983, 669, 983, 983, 983, + 983, 983, 986, nil, 986, 986, 986, 986, 986, nil, + nil, 983, nil, nil, nil, nil, 669, nil, 986, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 983, nil, nil, nil, nil, nil, nil, + 986, nil, 983, 983, 983, 983, nil, nil, nil, 986, + 986, 986, 986, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1033, 1033, nil, nil, 1033, nil, nil, nil, 983, nil, + nil, nil, nil, 1033, 1033, 986, 1033, 1033, 1033, 1033, + 1033, 1033, 1033, nil, nil, 1033, 1033, nil, nil, nil, + 1033, 1033, 1033, 1033, nil, nil, nil, nil, nil, 1033, + nil, nil, nil, nil, nil, nil, nil, 1033, 1033, nil, + 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, + 1033, nil, nil, 1033, nil, nil, nil, nil, 1038, 1038, + nil, nil, 1038, nil, nil, nil, nil, nil, nil, nil, + nil, 1038, 1038, 1033, 1038, 1038, 1038, 1038, 1038, 1038, + 1038, nil, nil, 1038, 1038, nil, nil, nil, 1038, 1038, + 1038, 1038, nil, nil, nil, nil, nil, 1038, nil, nil, + nil, nil, nil, nil, nil, 1038, 1038, nil, 1038, 1038, + 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, nil, + nil, 1038, nil, nil, nil, nil, 1039, 1039, nil, nil, + 1039, nil, nil, nil, nil, nil, nil, nil, nil, 1039, + 1039, 1038, 1039, 1039, 1039, 1039, 1039, 1039, 1039, nil, + nil, 1039, 1039, nil, nil, nil, 1039, 1039, 1039, 1039, + nil, nil, nil, nil, nil, 1039, nil, nil, nil, nil, + nil, nil, nil, 1039, 1039, nil, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, nil, 1057, 1039, + 1057, 1057, 1057, 1057, 1057, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1057, nil, nil, nil, nil, 1039, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1057, nil, nil, nil, + nil, nil, nil, nil, nil, 1057, 1057, 1057, 1057, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1057 ] + +racc_action_pointer = [ + nil, 96, 2022, 98, nil, 142, nil, nil, 6081, 17, + nil, 24012, 24145, 2, nil, 42, 76, -4, 145, 242, + 344, nil, -65, 6220, 2302, 209, nil, -40, nil, 165, + 1088, 1220, 6359, 6498, 6637, nil, 2162, 6776, 6915, nil, + 119, 377, 480, 199, 164, 7054, 7193, 878, 7332, 164, + 312, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1352, nil, 7471, nil, nil, -22, nil, 7610, 7749, nil, + nil, 7888, 8027, 8166, 8305, 24278, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 68, nil, nil, nil, nil, nil, nil, 180, + 195, 208, 232, nil, nil, 24411, nil, nil, nil, nil, + nil, nil, 0, nil, nil, 136, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 8444, nil, + nil, nil, nil, 8583, 8722, 8861, 9000, 9139, 258, nil, + 143, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 245, + nil, 2302, 9278, 9417, 9556, 9695, 9834, 9973, 24878, 24946, + nil, nil, 10112, 10251, 10390, nil, nil, 326, -21, 104, + 331, 147, 254, 339, nil, 10529, 2442, 344, 10668, 10807, + 10946, 11085, 11224, 11363, 11502, 11641, 11780, 11919, 12058, 12197, + 12336, 12475, 12614, 12753, 12892, 13031, 13170, 13309, 13448, 13587, + nil, nil, nil, nil, 13726, nil, nil, nil, 1880, nil, + nil, 343, 13865, 14004, nil, nil, nil, nil, nil, nil, + nil, nil, 14143, nil, 2442, nil, 326, 328, nil, 14282, + 373, 14421, nil, nil, 14560, 14699, nil, nil, 202, nil, + nil, 14838, 1170, nil, 323, 2582, 392, 433, 403, 14977, + 2722, 358, 368, 380, 481, 448, nil, 459, 438, 193, + nil, nil, nil, 488, 167, 462, 15116, nil, 513, 540, + 504, nil, 567, 15255, nil, 15394, 2862, 1182, 528, 15533, + 15672, nil, 703, -8, 8, 15811, 3002, 3142, 203, 645, + 543, -19, -7, 516, 624, 24, 657, nil, nil, 347, + 483, -20, nil, 591, nil, 576, 15950, nil, nil, nil, + 378, 382, 416, 460, 462, 470, 481, 514, 518, nil, + 552, nil, nil, 745, nil, 307, nil, 375, nil, 349, + nil, 568, 382, nil, 572, 483, nil, 576, -59, nil, + 587, -58, nil, 580, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 24544, nil, + nil, nil, nil, 602, nil, nil, 600, 16089, 603, nil, + nil, 595, nil, 620, 151, 723, nil, nil, 2022, nil, + nil, nil, nil, nil, 2162, 650, nil, nil, 661, 675, + 597, 649, 1484, nil, nil, nil, 272, 408, 724, nil, + nil, 1616, 1748, nil, nil, nil, -26, nil, 726, 25014, + 25082, 16228, 170, 16367, 16506, 16645, 3142, 3282, 738, 761, + 760, 764, 769, 781, 1170, 1302, 1434, 3422, 3562, 3702, + 3842, 3982, 4122, 1178, 1310, 4262, 4402, 2582, 900, 841, + nil, 1880, nil, nil, nil, nil, 725, nil, nil, nil, + 735, nil, nil, 16784, nil, nil, 16923, nil, 17062, nil, + 196, nil, nil, nil, 17201, 1302, 754, 742, 741, nil, + nil, 743, 17340, 750, 17479, 25150, 25218, 640, 790, nil, + 17618, 752, nil, 17757, 17896, 25286, 25354, 1038, 2722, 18035, + 875, 889, 786, nil, nil, 436, 450, 787, 801, nil, + 507, 828, 3282, 916, nil, 3422, 63, 921, 922, 917, + 930, nil, nil, 18174, 25422, 25490, 26, nil, nil, 650, + nil, 25558, 25626, 18313, nil, nil, nil, 733, 3562, 851, + nil, nil, nil, 18452, nil, 881, nil, 815, 817, nil, + 824, 826, 827, nil, nil, nil, nil, nil, nil, nil, + nil, 811, 820, nil, nil, 18591, nil, nil, nil, 912, + nil, nil, nil, 913, nil, nil, 923, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 200, nil, + nil, 266, nil, nil, nil, 846, nil, nil, 848, nil, + 3702, nil, 24677, nil, 858, 18730, 18869, 19008, 25694, 25762, + 19147, 19286, 651, 895, 19425, 19564, 19703, 19842, 899, nil, + nil, nil, 19981, 20120, 900, nil, nil, nil, 215, 236, + 544, 680, 872, 872, nil, -57, 975, -19, nil, nil, + 895, nil, 1001, nil, 883, nil, 925, 20259, nil, nil, + 20398, nil, nil, -95, 20537, 885, nil, 891, -9, -5, + 928, 25, 652, 943, 905, 20676, nil, 978, -14, 185, + nil, 20815, nil, nil, nil, nil, 20954, nil, nil, 21093, + nil, nil, nil, 759, nil, 1033, nil, nil, nil, nil, + nil, 1039, nil, 21232, 923, 29, 30, 162, 163, 3842, + 619, 725, nil, 924, 3982, 21371, 227, 1043, 4122, 1018, + 1151, 24810, -7, 34, 928, 231, nil, nil, 720, 1283, + nil, 1415, nil, 338, nil, 21510, nil, 851, nil, 933, + 937, 1055, 941, nil, nil, nil, nil, 1185, 4262, nil, + nil, nil, nil, nil, 955, nil, 941, 21649, 951, 267, + 273, 816, 952, nil, 2862, 21788, nil, 951, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 21927, 22066, + 22205, 22344, 277, 22483, nil, nil, 1547, nil, 4402, nil, + nil, 969, nil, 108, nil, nil, nil, nil, 955, 39, + nil, nil, nil, nil, nil, nil, 4542, nil, 957, 999, + nil, nil, 534, 1080, nil, nil, 22622, nil, 4682, 1082, + nil, nil, nil, 22761, 69, 68, 1083, nil, 1084, 462, + nil, nil, 1090, 977, 471, nil, nil, nil, 4822, 4962, + 980, 994, 994, nil, nil, nil, 997, 1004, nil, 1011, + 1016, nil, 1017, nil, nil, 1022, 918, 987, nil, nil, + nil, nil, nil, nil, nil, 1012, nil, 1022, 320, nil, + nil, 22900, 23039, 3002, 1024, 1025, nil, 1040, 1045, 1046, + nil, 1068, 1054, 1035, 23178, nil, nil, nil, nil, 5102, + 5242, nil, 9, 23317, nil, nil, nil, 35, nil, nil, + nil, 23456, 5382, nil, nil, nil, 5522, nil, nil, nil, + 1094, 1073, 1179, 1345, nil, nil, 1679, nil, 474, nil, + 611, nil, 6797, nil, nil, nil, nil, 1061, 1069, nil, + 268, nil, nil, 25824, nil, nil, 25831, nil, 6936, nil, + nil, 1094, 23595, 755, 1161, nil, 1223, 5662, 43, 120, + 769, 1180, 135, nil, 5802, nil, 23734, 30, 1232, 5942, + nil, nil, 598, nil, nil, nil, 1119, 1126, 1129, 1136, + 1081, 1213, 1143, nil, nil, 1149, 1150, 1151, 1157, nil, + 1172, nil, 784, 25899, nil, nil, 1299, 23873, 25967, 26035, + 144, 825, nil, nil, nil, nil, nil, 1298, nil, 1477, + 8048, nil, nil, nil, nil, 1180, nil, 26097, nil, 8187, + nil, 8326, nil, 14998, nil, nil, 1222, 1223, nil, 1190, + 145, 158, 168, 169, nil, nil, nil, 1189, 1191, 1193, + 1201, 1203, 170, nil, 15137, nil, nil, nil, nil, 1206, + nil ] + +racc_action_default = [ + -1, -648, -647, -648, -2, -634, -4, -5, -648, -8, + -9, -648, -648, -648, -36, -648, -648, -40, -648, -648, + -294, -52, -636, -648, -57, -62, -63, -64, -68, -271, + -271, -271, -309, -339, -340, -80, -647, -84, -92, -94, + -648, -535, -536, -648, -648, -648, -648, -230, -648, -636, + -244, -285, -286, -287, -288, -289, -290, -291, -292, -293, + -620, -296, -298, -305, -307, -317, -319, -648, -648, -59, + -59, -634, -648, -648, -648, -648, -341, -342, -344, -345, + -346, -347, -348, -349, -350, -351, -352, -353, -362, -417, + -465, -466, -467, -468, -469, -647, -472, -647, -647, -647, + -647, -647, -647, -508, -509, -647, -511, -517, -519, -520, + -521, -522, -618, -524, -525, -619, -527, -528, -529, -530, + -531, -532, -533, -534, -539, -540, 1091, -3, -635, -643, + -644, -645, -7, -648, -648, -648, -648, -648, -648, -24, + -648, -123, -124, -125, -126, -127, -128, -129, -133, -134, + -135, -136, -137, -138, -139, -140, -141, -142, -143, -144, + -145, -146, -147, -148, -149, -150, -151, -152, -153, -154, + -155, -156, -157, -158, -159, -160, -161, -162, -163, -164, + -165, -166, -167, -168, -169, -170, -171, -172, -173, -174, + -175, -176, -177, -178, -179, -180, -181, -182, -183, -184, + -185, -186, -187, -188, -189, -190, -191, -192, -193, -194, + -195, -196, -197, -198, -199, -200, -201, -202, -203, -29, + -130, -647, -648, -648, -648, -648, -648, -647, -648, -648, + -630, -631, -648, -648, -636, -637, -56, -648, -535, -536, + -648, -294, -648, -648, -236, -648, -647, -648, -215, -216, + -648, -648, -648, -648, -648, -648, -648, -648, -648, -648, + -648, -648, -648, -648, -648, -648, -648, -648, -648, -648, + -245, -246, -247, -248, -648, -355, -445, -425, -648, -632, + -633, -69, -647, -648, -316, -354, -429, -438, -440, -75, + -435, -76, -636, -77, -251, -266, -647, -647, -270, -648, + -276, -648, -647, -612, -648, -648, -78, -79, -634, -17, + -18, -648, -21, -22, -82, -647, -636, -648, -85, -88, + -647, -100, -101, -648, -648, -108, -309, -312, -636, -648, + -339, -340, -343, -436, -648, -90, -648, -96, -304, -518, + -648, -224, -225, -648, -237, -648, -647, -300, -636, -647, + -647, -318, -58, -648, -648, -648, -647, -647, -634, -648, + -635, -535, -536, -648, -648, -294, -648, -372, -373, -118, + -119, -648, -121, -648, -294, -647, -648, -535, -536, -332, + -123, -124, -163, -164, -165, -181, -186, -193, -196, -334, + -648, -607, -608, -567, -470, -648, -493, -648, -495, -648, + -497, -648, -648, -477, -648, -648, -483, -648, -648, -489, + -648, -648, -491, -648, -510, -512, -513, -514, -515, -6, + -646, -30, -31, -32, -33, -34, -10, -11, -648, -26, + -27, -28, -131, -648, -37, -39, -281, -648, -648, -280, + -38, -648, -41, -648, -294, -49, -51, -204, -256, -276, + -53, -54, -42, -205, -256, -636, -261, -262, -647, -647, + -621, -622, -271, -433, -623, -624, -622, -621, -271, -432, + -434, -623, -624, -48, -212, -55, -636, -315, -648, -648, + -648, -647, -304, -648, -648, -648, -213, -214, -217, -218, + -219, -220, -221, -222, -226, -227, -228, -229, -231, -232, + -233, -234, -235, -238, -239, -240, -241, -636, -249, -648, + -446, -271, -621, -622, -66, -70, -636, -272, -442, -445, + -636, -311, -267, -648, -275, -268, -648, -273, -648, -277, + -648, -615, -617, -16, -635, -20, -648, -636, -81, -302, + -97, -86, -648, -636, -647, -648, -648, -107, -648, -518, + -648, -93, -98, -648, -648, -648, -648, -250, -242, -648, + -457, -648, -636, -299, -252, -640, -640, -636, -648, -610, + -640, -648, -647, -363, -364, -647, -648, -648, -648, -648, + -648, -358, -452, -647, -648, -648, -304, -59, -118, -119, + -120, -648, -648, -647, -327, -541, -543, -329, -647, -545, + -336, -628, -629, -648, -418, -567, -421, -606, -606, -550, + -552, -552, -552, -566, -568, -569, -570, -571, -572, -573, + -574, -575, -648, -577, -579, -581, -586, -588, -589, -591, + -596, -598, -599, -601, -602, -603, -648, -471, -494, -499, + -500, -502, -473, -496, -474, -498, -475, -476, -648, -479, + -481, -648, -482, -485, -486, -648, -487, -488, -648, -516, + -647, -25, -648, -35, -284, -648, -648, -647, -648, -648, + -648, -648, -437, -648, -263, -265, -648, -648, -71, -259, + -260, -430, -648, -648, -73, -431, -314, -638, -621, -622, + -621, -622, -636, -648, -424, -647, -65, -426, -442, -258, + -648, -443, -648, -310, -647, -274, -278, -648, -613, -614, + -648, -19, -23, -83, -648, -89, -95, -636, -621, -622, + -647, -625, -106, -648, -91, -648, -211, -223, -636, -647, + -356, -647, -297, -361, -301, -253, -642, -641, -255, -642, + -306, -308, -611, -647, -365, -647, -60, -366, -367, -322, + -323, -648, -325, -648, -636, -621, -622, -625, -303, -647, + -118, -119, -122, -636, -647, -648, -648, -648, -647, -567, + -567, -648, -636, -648, -636, -648, -548, -549, -648, -648, + -559, -648, -562, -648, -564, -648, -374, -648, -376, -378, + -381, -384, -636, -580, -590, -600, -604, -648, -647, -478, + -480, -484, -490, -492, -648, -132, -282, -648, -636, -621, + -622, -622, -621, -50, -257, -648, -639, -647, -44, -207, + -45, -208, -72, -46, -210, -47, -209, -74, -648, -648, + -648, -648, -437, -648, -406, -407, -636, -409, -647, -428, + -427, -648, -439, -647, -441, -269, -279, -616, -87, -437, + -99, -313, -13, -15, -357, -359, -647, -464, -458, -647, + -459, -460, -640, -648, -360, -368, -648, -370, -647, -648, + -61, -324, -448, -648, -648, -437, -648, -437, -648, -648, + -330, -333, -648, -636, -648, -337, -609, -419, -647, -647, + -411, -636, -606, -587, -605, -551, -552, -552, -578, -552, + -552, -597, -552, -575, -592, -636, -648, -648, -383, -576, + -501, -504, -505, -506, -507, -648, -12, -283, -437, -43, + -206, -264, -648, -243, -606, -606, -388, -647, -647, -647, + -405, -648, -636, -575, -583, -584, -594, -447, -67, -647, + -647, -463, -648, -648, -462, -254, -320, -648, -371, -321, + -449, -648, -647, -326, -328, -542, -647, -335, -544, -546, + -545, -648, -648, -648, -420, -547, -648, -555, -648, -557, + -648, -560, -648, -563, -565, -375, -377, -379, -382, -503, + -648, -386, -387, -396, -390, -398, -648, -401, -648, -403, + -408, -648, -648, -582, -648, -444, -647, -647, -535, -536, + -648, -648, -294, -461, -647, -450, -648, -647, -648, -647, + -422, -423, -636, -413, -415, -416, -552, -552, -552, -552, + -648, -648, -606, -585, -389, -647, -647, -647, -647, -595, + -647, -410, -593, -648, -304, -14, -457, -647, -648, -648, + -304, -647, -451, -453, -454, -455, -331, -648, -412, -648, + -648, -553, -556, -558, -561, -380, -385, -648, -393, -648, + -395, -648, -399, -648, -402, -404, -303, -625, -456, -636, + -621, -622, -625, -303, -369, -338, -414, -552, -647, -647, + -647, -647, -437, -554, -648, -391, -394, -397, -400, -647, + -392 ] + +racc_goto_table = [ + 6, 228, 236, 233, 389, 295, 295, 295, 318, 279, + 277, 4, 580, 286, 290, 351, 144, 144, 455, 9, + 452, 515, 131, 525, 729, 9, 473, 139, 220, 426, + 345, 128, 332, 332, 415, 621, 768, 551, 353, 354, + 462, 468, 358, 446, 572, 575, 446, 590, 317, 352, + 352, 339, 446, 352, 314, 296, 296, 296, 606, 297, + 297, 297, 356, 357, 708, 147, 147, 332, 332, 332, + 439, 440, 863, 516, 869, 776, 777, 509, 127, 347, + 144, 281, 289, 291, 335, 978, 705, 316, 131, 705, + 511, 613, 672, 396, 786, 398, 400, 403, 406, 409, + 412, 436, 449, 396, 421, 422, 423, 424, 901, 792, + 144, 395, 838, 853, 928, 352, 352, 352, 352, 735, + 738, 413, 700, 1013, 742, 976, 1029, 891, 1015, 648, + 375, 379, 651, 1, 2, 138, 897, 132, 899, 293, + 306, 307, 660, 852, 359, 9, 940, 643, 711, 645, + 536, 219, 649, 368, 425, 649, 435, 428, 746, 870, + 278, 698, 662, 343, 567, 697, 391, 568, 366, 594, + 390, 600, 346, 348, 562, 349, 350, 764, 527, 766, + 529, 956, 598, 531, 532, 525, 599, 771, 960, 931, + 898, 977, 930, 929, 932, 1012, 604, 1029, 1055, 887, + 295, 434, 445, 393, 740, 445, 450, 451, 773, 1076, + 518, 445, 463, 708, 1015, 475, 476, 519, 19, 479, + 843, 561, 874, 695, 19, 456, 1043, 753, 859, 571, + 942, 394, 751, 433, 472, 397, 399, 705, 705, 237, + 976, 402, 405, 715, 408, 438, 438, 621, 237, 237, + 237, 724, 19, 323, 323, 295, 295, 419, 317, 786, + 939, 1025, 411, 908, 910, 295, 797, 762, 798, 414, + 774, 765, 692, 896, 905, 893, 1023, 708, 19, 603, + 456, nil, nil, 237, 237, 991, nil, 237, 363, 373, + 373, 462, 468, 901, 524, 524, nil, nil, nil, nil, + 396, nil, 841, 613, nil, 545, 296, 552, nil, 548, + 297, nil, nil, 286, 332, 296, 664, 290, 530, 297, + 702, nil, 555, 1016, nil, 131, 576, 317, 535, 832, + nil, 332, 317, 314, 534, 717, 1044, 352, 314, nil, + 1026, 549, nil, 1027, 19, 584, nil, 564, 569, 237, + 237, 237, 237, 19, 849, 453, nil, 720, 597, nil, + 965, 474, nil, nil, nil, 541, 537, 720, 577, 578, + 1074, 543, 565, 596, 754, 131, 566, 570, 786, 786, + 1035, 533, nil, 898, 763, nil, nil, nil, nil, nil, + 517, 875, 981, 982, 898, nil, 720, 1009, 800, 520, + 877, 800, 706, nil, 720, 571, nil, 709, nil, nil, + nil, 621, 621, nil, 1078, 848, 945, nil, 822, nil, + nil, 621, nil, 621, 827, 668, nil, 712, nil, nil, + 845, 579, nil, 144, 883, 884, 673, 19, 237, 443, + 237, 237, 443, 237, 661, 918, 680, nil, 443, 237, + 237, nil, 685, nil, 295, nil, 524, 524, 808, 708, + 679, nil, 19, 463, nil, nil, nil, 613, 613, nil, + 818, 820, nil, 767, 898, nil, 823, 825, 933, 456, + 462, 468, 147, nil, 705, 472, 446, nil, 693, nil, + 1056, nil, 786, 786, nil, 680, 446, 446, 237, 237, + 1068, nil, 446, 446, 793, nil, nil, nil, 237, 679, + nil, nil, nil, 552, 678, nil, nil, 295, nil, nil, + 684, 552, nil, nil, nil, nil, nil, 19, nil, 463, + nil, 19, nil, nil, nil, 323, 19, 332, nil, 463, + nil, 728, 456, 845, 806, 332, nil, nil, 673, nil, + 704, 472, 323, 706, 571, nil, 295, nil, nil, nil, + nil, 472, 19, 696, nil, 952, 295, nil, 463, nil, + nil, 237, 19, 19, nil, nil, 463, nil, nil, 860, + 759, 456, nil, nil, 743, 772, 846, 745, nil, 847, + 472, 456, 237, 747, nil, nil, 472, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 621, 919, + 858, nil, 474, nil, 453, 706, nil, nil, 571, nil, + nil, nil, nil, nil, nil, 933, nil, nil, 933, nil, + nil, nil, 872, 997, nil, 446, nil, 477, 1004, 878, + 295, nil, nil, 882, nil, 445, 934, 840, nil, nil, + nil, nil, 463, nil, nil, 445, 445, nil, 6, nil, + 1045, 445, 445, nil, 904, 456, nil, 144, nil, 804, + nil, nil, nil, 673, 472, 732, nil, 9, 805, nil, + nil, 839, 726, nil, nil, 552, 917, 813, nil, nil, + nil, 749, 750, 834, 752, 521, 850, 237, 673, 933, + 885, 817, 524, nil, 680, nil, 1082, 685, nil, 332, + nil, nil, nil, 937, nil, nil, 147, nil, 679, 538, + 332, nil, nil, nil, nil, nil, nil, 857, nil, 861, + nil, nil, nil, nil, nil, 673, 879, nil, nil, nil, + nil, 867, nil, 867, 673, nil, nil, 352, nil, nil, + 19, 563, 950, nil, 438, 890, nil, nil, 323, nil, + 237, 892, nil, 862, 962, nil, 323, nil, nil, nil, + nil, 876, 780, 782, 784, 237, 144, nil, nil, nil, + nil, nil, nil, 880, nil, nil, nil, nil, 19, 673, + 934, 19, nil, 934, 445, nil, 934, nil, 934, 237, + 571, nil, nil, nil, nil, 819, 821, nil, nil, 237, + 915, 824, 826, nil, 19, 524, nil, 890, nil, 237, + nil, nil, 925, nil, nil, nil, nil, nil, 1069, 894, + 1005, 1008, 894, nil, nil, nil, nil, 947, nil, nil, + nil, 834, nil, nil, nil, nil, nil, nil, 352, nil, + 720, nil, nil, nil, nil, nil, nil, 944, nil, nil, + nil, nil, nil, nil, nil, 871, nil, 934, 941, 934, + nil, 934, nil, 934, nil, nil, 19, nil, nil, 686, + 948, 881, 443, 237, 1047, 1042, 19, nil, nil, nil, + 926, nil, 443, 443, 934, nil, 955, nil, 443, 443, + 961, 959, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 890, nil, nil, nil, nil, nil, 699, + nil, nil, nil, 703, nil, 984, 984, 984, nil, 332, + 323, nil, nil, nil, 900, nil, 902, nil, 332, nil, + 713, 323, nil, nil, 920, nil, 716, nil, nil, nil, + nil, 995, 996, nil, nil, nil, nil, 819, 821, 826, + 824, nil, nil, nil, 1007, 734, 1022, 29, nil, 925, + nil, nil, 925, 29, 925, 19, nil, 946, nil, nil, + 19, 237, 1038, 949, 19, nil, nil, 332, 29, 927, + 953, nil, 954, 1048, 857, nil, 957, 29, 29, 29, + nil, 29, nil, nil, nil, 867, nil, nil, nil, 1036, + 295, nil, nil, nil, 19, nil, 1041, nil, nil, nil, + nil, nil, 463, 984, 984, 984, 984, 29, 984, nil, + nil, 443, 29, 29, 894, 456, 29, 926, 472, 867, + 926, nil, 926, 925, 472, 925, nil, 925, nil, 925, + 673, 920, nil, nil, 19, nil, nil, nil, 967, 969, + nil, 971, 973, nil, 974, nil, nil, nil, nil, nil, + 925, nil, 19, nil, nil, nil, 984, 984, 984, 984, + nil, nil, 237, nil, 19, nil, nil, 984, nil, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 29, 29, + 29, 29, 29, nil, 19, 19, nil, nil, nil, nil, + nil, 926, nil, 926, nil, 926, nil, 926, nil, 1017, + nil, 1018, 1046, 1019, nil, nil, nil, nil, nil, nil, + nil, 851, nil, nil, nil, nil, nil, nil, 926, 1028, + nil, 1030, nil, nil, nil, nil, nil, nil, nil, nil, + 993, 985, 987, 989, nil, 19, 19, nil, nil, 1000, + nil, 1075, nil, nil, nil, nil, nil, nil, 19, nil, + nil, nil, 19, nil, nil, 886, nil, nil, 1051, 1052, + 1053, 1054, nil, nil, nil, nil, 29, 29, 29, 29, + 29, 29, 29, nil, nil, 909, nil, 29, 29, 29, + nil, nil, nil, 1077, nil, nil, nil, nil, 1032, nil, + 1079, 29, 1080, 19, 1081, nil, nil, nil, nil, nil, + 19, nil, nil, nil, nil, 19, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1089, nil, 1083, + nil, nil, nil, nil, nil, nil, nil, 29, 29, 1058, + 1060, 1062, 1064, 237, 1065, nil, nil, 29, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, 32, nil, nil, nil, 29, nil, nil, nil, + 29, nil, nil, nil, nil, 29, 958, 32, nil, nil, + nil, nil, nil, nil, 964, nil, 32, 32, 32, nil, + 32, nil, 1085, 1086, 1087, 1088, nil, nil, 975, nil, + nil, 29, nil, 1090, nil, nil, nil, nil, nil, nil, + 29, 29, 29, nil, nil, nil, 32, nil, nil, nil, + nil, 32, 32, nil, nil, 32, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, 32, 32, 32, + 32, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 29, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, 32, 32, 32, 32, + 32, 32, nil, nil, nil, nil, 32, 32, 32, 29, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 29, + 32, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 29, nil, nil, + 29, nil, nil, nil, nil, nil, 32, 32, 29, nil, + nil, nil, nil, nil, nil, nil, 32, nil, 29, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 29, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, 32, + nil, nil, nil, nil, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 32, nil, nil, nil, nil, nil, nil, nil, nil, 32, + 32, 32, nil, nil, nil, 29, nil, nil, nil, nil, + nil, 29, 29, nil, nil, 29, nil, nil, nil, nil, + 32, 29, 29, nil, nil, nil, nil, 29, 29, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, nil, nil, nil, nil, 29, + 29, nil, nil, 29, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 29, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 29, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 32, nil, + nil, nil, nil, 29, nil, nil, nil, nil, 32, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 29, nil, 32, nil, nil, nil, nil, nil, nil, + nil, 29, nil, 29, nil, nil, 32, nil, nil, 32, + nil, nil, nil, nil, nil, nil, nil, 32, nil, nil, + nil, nil, nil, 29, 29, 244, nil, 32, nil, nil, + nil, nil, 32, nil, 294, 294, 294, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 341, 342, nil, + 344, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 29, nil, nil, + nil, 29, nil, nil, 32, nil, nil, nil, nil, nil, + 32, 32, nil, nil, 32, nil, nil, nil, nil, nil, + 32, 32, nil, nil, nil, nil, 32, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, nil, nil, 29, + nil, nil, nil, nil, 29, nil, nil, nil, 16, nil, + nil, nil, nil, nil, 16, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 16, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 32, nil, nil, nil, nil, 32, 32, + nil, nil, 32, nil, nil, nil, nil, nil, 16, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 367, nil, + nil, nil, nil, nil, 294, 448, nil, nil, 454, 294, + nil, nil, 32, nil, 454, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, 32, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 32, nil, 16, 18, 508, nil, nil, nil, + nil, 18, nil, 16, 294, 294, nil, nil, nil, nil, + 32, nil, nil, nil, 294, nil, nil, nil, nil, nil, + 32, 294, 32, 294, nil, nil, 294, 294, nil, 18, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 557, nil, 558, nil, nil, + nil, 294, 294, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 16, nil, 441, + nil, nil, 441, 32, 32, nil, nil, nil, 441, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, nil, + 32, nil, 16, nil, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, nil, nil, nil, nil, nil, nil, 20, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, 32, nil, nil, nil, nil, nil, nil, 32, 294, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, 325, 325, nil, 16, nil, nil, + nil, 16, nil, nil, nil, nil, 16, nil, nil, nil, + nil, 32, nil, nil, nil, nil, nil, nil, nil, 20, + nil, nil, nil, 294, nil, 454, 454, 454, nil, 365, + 374, 374, 16, nil, 18, nil, 18, nil, nil, 18, + nil, nil, 16, 16, nil, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 18, + nil, nil, nil, nil, nil, 294, nil, nil, 294, nil, + 294, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, 294, nil, nil, nil, + nil, nil, nil, nil, 20, 454, 727, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, 41, nil, nil, 18, 294, nil, nil, 18, nil, + nil, nil, nil, 18, nil, 294, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + 321, 321, nil, nil, nil, nil, nil, nil, nil, 18, + nil, nil, nil, nil, nil, nil, nil, 294, nil, 18, + 18, nil, nil, nil, nil, 41, nil, nil, 20, nil, + 444, nil, nil, 444, nil, 361, 377, 377, 377, 444, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, 294, 454, 294, + nil, nil, nil, 814, nil, nil, 294, 294, 454, 454, + 16, nil, nil, nil, 454, 454, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, 294, + 41, nil, 294, nil, nil, nil, nil, nil, 16, nil, + nil, 16, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, 20, 294, nil, nil, 325, 20, 294, nil, + nil, 294, nil, nil, 16, nil, nil, nil, nil, nil, + nil, nil, nil, 325, nil, 294, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, 20, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 294, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 16, 18, nil, 294, + nil, nil, 441, nil, nil, nil, 16, 454, nil, 41, + nil, nil, 441, 441, nil, nil, nil, nil, 441, 441, + 454, 454, 454, 454, nil, 923, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, 18, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, 294, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, 41, nil, + nil, nil, 321, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 16, nil, nil, nil, 321, + 16, nil, nil, nil, 16, nil, nil, nil, nil, 41, + nil, nil, nil, 294, 454, nil, nil, nil, nil, 41, + 41, nil, nil, 18, nil, nil, nil, nil, nil, 18, + nil, nil, nil, 18, 16, nil, nil, nil, nil, 18, + 18, 20, nil, 294, nil, 18, 18, nil, nil, 325, + nil, 441, nil, nil, nil, nil, nil, 325, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 16, nil, nil, nil, nil, 20, + 42, nil, 20, nil, nil, nil, 42, nil, nil, nil, + nil, nil, 16, nil, nil, nil, nil, nil, 294, nil, + nil, nil, nil, nil, 16, 20, nil, nil, nil, nil, + nil, nil, nil, nil, 42, 322, 322, nil, nil, nil, + nil, nil, 18, nil, 16, 16, nil, 18, nil, 294, + nil, 18, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 362, 378, 378, 378, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, nil, nil, nil, 20, nil, nil, + nil, nil, nil, 444, nil, 16, 16, 20, 18, 1003, + nil, nil, nil, 444, 444, nil, nil, nil, 16, 444, + 444, nil, 16, nil, nil, nil, nil, 41, nil, nil, + nil, 18, nil, nil, nil, 321, 42, nil, nil, nil, + nil, nil, nil, 321, nil, 42, nil, nil, nil, 18, + nil, 325, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 18, 325, 16, nil, 41, nil, nil, 41, nil, + 16, nil, nil, nil, nil, 16, nil, nil, nil, nil, + nil, 18, 18, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, 20, nil, nil, nil, + nil, 20, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, 18, 18, 914, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, nil, nil, nil, 18, + nil, nil, 444, 41, 42, nil, nil, nil, nil, nil, + nil, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 18, nil, nil, 20, nil, nil, nil, 18, nil, nil, + nil, nil, 18, nil, nil, 20, nil, 321, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 321, 42, + nil, nil, nil, 42, nil, 20, 20, 322, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 322, nil, nil, nil, nil, nil, + nil, nil, 41, nil, 42, nil, nil, 41, nil, nil, + nil, 41, nil, nil, 42, 42, nil, nil, nil, nil, + nil, 374, nil, nil, nil, nil, 20, 20, nil, nil, + 1002, nil, nil, nil, nil, nil, nil, nil, nil, 20, + nil, 41, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 374, + nil, 41, nil, nil, 20, nil, nil, nil, nil, nil, + nil, 20, nil, nil, nil, nil, 20, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 377, nil, nil, + nil, nil, 41, 41, nil, nil, 998, nil, nil, nil, + nil, nil, 42, nil, nil, 41, nil, nil, nil, 41, + 322, nil, nil, nil, nil, nil, nil, nil, 322, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, 42, nil, 377, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, 41, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 322, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 322, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, nil, 42, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 42, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 378, nil, nil, nil, nil, 42, 42, nil, + nil, 999, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, 42, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 378, nil, nil, nil, nil, 42, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, nil, 42 ] + +racc_goto_check = [ + 6, 38, 27, 40, 70, 46, 46, 46, 63, 38, + 168, 2, 113, 85, 85, 102, 71, 71, 36, 9, + 33, 52, 118, 87, 15, 9, 33, 22, 22, 10, + 40, 8, 78, 78, 70, 206, 121, 65, 24, 24, + 50, 50, 24, 25, 106, 106, 25, 68, 14, 31, + 31, 76, 25, 31, 59, 82, 82, 82, 167, 84, + 84, 84, 42, 42, 217, 73, 73, 78, 78, 78, + 29, 29, 107, 36, 109, 150, 150, 169, 5, 9, + 71, 51, 51, 51, 64, 145, 88, 60, 118, 88, + 50, 201, 37, 6, 143, 6, 6, 6, 6, 6, + 6, 80, 80, 6, 24, 24, 24, 24, 212, 144, + 71, 185, 157, 17, 155, 31, 31, 31, 31, 83, + 83, 185, 53, 161, 83, 142, 213, 159, 162, 189, + 69, 69, 189, 1, 3, 11, 156, 7, 156, 58, + 58, 58, 13, 16, 5, 9, 18, 190, 20, 190, + 21, 23, 190, 26, 9, 190, 30, 32, 43, 45, + 49, 55, 74, 79, 81, 86, 98, 101, 115, 117, + 122, 123, 124, 125, 126, 127, 128, 129, 80, 130, + 80, 131, 132, 80, 80, 87, 133, 134, 135, 159, + 207, 146, 147, 156, 153, 160, 163, 213, 145, 164, + 46, 27, 27, 165, 37, 27, 31, 31, 166, 161, + 171, 27, 85, 217, 162, 31, 31, 172, 35, 38, + 174, 12, 175, 177, 35, 6, 178, 179, 180, 80, + 181, 184, 113, 14, 71, 186, 187, 88, 88, 35, + 142, 188, 191, 65, 192, 82, 82, 206, 35, 35, + 35, 65, 35, 35, 35, 46, 46, 7, 14, 143, + 157, 155, 193, 143, 194, 46, 195, 68, 196, 199, + 167, 200, 36, 205, 144, 209, 210, 217, 35, 216, + 6, nil, nil, 35, 35, 159, nil, 35, 35, 35, + 35, 50, 50, 212, 6, 6, nil, nil, nil, nil, + 6, nil, 53, 201, nil, 38, 82, 63, nil, 40, + 84, nil, nil, 85, 78, 82, 80, 85, 185, 84, + 169, nil, 38, 156, nil, 118, 24, 14, 9, 37, + nil, 78, 14, 59, 8, 36, 109, 31, 59, nil, + 156, 76, nil, 156, 35, 38, nil, 6, 6, 35, + 35, 35, 35, 35, 37, 75, nil, 50, 31, nil, + 150, 75, nil, nil, nil, 64, 60, 50, 14, 14, + 107, 60, 82, 6, 36, 118, 84, 84, 143, 143, + 17, 5, nil, 207, 36, nil, nil, nil, nil, nil, + 58, 37, 150, 150, 207, nil, 50, 121, 190, 58, + 37, 190, 80, nil, 50, 80, nil, 80, nil, nil, + nil, 206, 206, nil, 156, 65, 83, nil, 52, nil, + nil, 206, nil, 206, 52, 38, nil, 10, nil, nil, + 87, 5, nil, 71, 167, 167, 40, 35, 35, 35, + 35, 35, 35, 35, 22, 37, 85, nil, 35, 35, + 35, nil, 85, nil, 46, nil, 6, 6, 36, 217, + 6, nil, 35, 85, nil, nil, nil, 201, 201, nil, + 33, 33, nil, 12, 207, nil, 33, 33, 206, 6, + 50, 50, 73, nil, 88, 71, 25, nil, 40, nil, + 150, nil, 143, 143, nil, 85, 25, 25, 35, 35, + 15, nil, 25, 25, 80, nil, nil, nil, 35, 6, + nil, nil, nil, 63, 51, nil, nil, 46, nil, nil, + 51, 63, nil, nil, nil, nil, nil, 35, nil, 85, + nil, 35, nil, nil, nil, 35, 35, 78, nil, 85, + nil, 31, 6, 87, 80, 78, nil, nil, 40, nil, + 84, 71, 35, 80, 80, nil, 46, nil, nil, nil, + nil, 71, 35, 51, nil, 106, 46, nil, 85, nil, + nil, 35, 35, 35, nil, nil, 85, nil, nil, 29, + 42, 6, nil, nil, 14, 31, 80, 14, nil, 80, + 71, 6, 35, 118, nil, nil, 71, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 206, 33, + 80, nil, 75, nil, 75, 80, nil, nil, 80, nil, + nil, nil, nil, nil, nil, 206, nil, nil, 206, nil, + nil, nil, 80, 106, nil, 25, nil, 61, 106, 12, + 46, nil, nil, 12, nil, 27, 208, 102, nil, nil, + nil, nil, 85, nil, nil, 27, 27, nil, 6, nil, + 113, 27, 27, nil, 80, 6, nil, 71, nil, 2, + nil, nil, nil, 40, 71, 100, nil, 9, 22, nil, + nil, 168, 75, nil, nil, 63, 80, 9, nil, nil, + nil, 100, 100, 6, 100, 61, 63, 35, 40, 206, + 70, 84, 6, nil, 85, nil, 37, 85, nil, 78, + nil, nil, nil, 12, nil, nil, 73, nil, 6, 61, + 78, nil, nil, nil, nil, nil, nil, 6, nil, 6, + nil, nil, nil, nil, nil, 40, 24, nil, nil, nil, + nil, 6, nil, 6, 40, nil, nil, 31, nil, nil, + 35, 61, 80, nil, 82, 40, nil, nil, 35, nil, + 35, 149, nil, 84, 12, nil, 35, nil, nil, nil, + nil, 14, 204, 204, 204, 35, 71, nil, nil, nil, + nil, nil, nil, 118, nil, nil, nil, nil, 35, 40, + 208, 35, nil, 208, 27, nil, 208, nil, 208, 35, + 80, nil, nil, nil, nil, 75, 75, nil, nil, 35, + 14, 75, 75, nil, 35, 6, nil, 40, nil, 35, + nil, nil, 149, nil, nil, nil, nil, nil, 36, 151, + 80, 12, 151, nil, nil, nil, nil, 24, nil, nil, + nil, 6, nil, nil, nil, nil, nil, nil, 31, nil, + 50, nil, nil, nil, nil, nil, nil, 6, nil, nil, + nil, nil, nil, nil, nil, 100, nil, 208, 14, 208, + nil, 208, nil, 208, nil, nil, 35, nil, nil, 61, + 14, 100, 35, 35, 12, 80, 35, nil, nil, nil, + 151, nil, 35, 35, 208, nil, 118, nil, 35, 35, + 14, 118, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 40, nil, nil, nil, nil, nil, 61, + nil, nil, nil, 61, nil, 6, 6, 6, nil, 78, + 35, nil, nil, nil, 154, nil, 154, nil, 78, nil, + 61, 35, nil, nil, 75, nil, 61, nil, nil, nil, + nil, 14, 14, nil, nil, nil, nil, 75, 75, 75, + 75, nil, nil, nil, 14, 61, 149, 54, nil, 149, + nil, nil, 149, 54, 149, 35, nil, 100, nil, nil, + 35, 35, 38, 100, 35, nil, nil, 78, 54, 154, + 100, nil, 100, 40, 6, nil, 100, 54, 54, 54, + nil, 54, nil, nil, nil, 6, nil, nil, nil, 14, + 46, nil, nil, nil, 35, nil, 14, nil, nil, nil, + nil, nil, 85, 6, 6, 6, 6, 54, 6, nil, + nil, 35, 54, 54, 151, 6, 54, 151, 71, 6, + 151, nil, 151, 149, 71, 149, nil, 149, nil, 149, + 40, 75, nil, nil, 35, nil, nil, nil, 204, 204, + nil, 204, 204, nil, 204, nil, nil, nil, nil, nil, + 149, nil, 35, nil, nil, nil, 6, 6, 6, 6, + nil, nil, 35, nil, 35, nil, nil, 6, nil, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 54, 54, + 54, 54, 54, nil, 35, 35, nil, nil, nil, nil, + nil, 151, nil, 151, nil, 151, nil, 151, nil, 154, + nil, 154, 100, 154, nil, nil, nil, nil, nil, nil, + nil, 61, nil, nil, nil, nil, nil, nil, 151, 154, + nil, 154, nil, nil, nil, nil, nil, nil, nil, nil, + 35, 152, 152, 152, nil, 35, 35, nil, nil, 35, + nil, 100, nil, nil, nil, nil, nil, nil, 35, nil, + nil, nil, 35, nil, nil, 61, nil, nil, 204, 204, + 204, 204, nil, nil, nil, nil, 54, 54, 54, 54, + 54, 54, 54, nil, nil, 61, nil, 54, 54, 54, + nil, nil, nil, 154, nil, nil, nil, nil, 35, nil, + 154, 54, 154, 35, 154, nil, nil, nil, nil, nil, + 35, nil, nil, nil, nil, 35, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 154, nil, 204, + nil, nil, nil, nil, nil, nil, nil, 54, 54, 152, + 152, 152, 152, 35, 152, nil, nil, 54, nil, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + nil, nil, 57, nil, nil, nil, 54, nil, nil, nil, + 54, nil, nil, nil, nil, 54, 61, 57, nil, nil, + nil, nil, nil, nil, 61, nil, 57, 57, 57, nil, + 57, nil, 152, 152, 152, 152, nil, nil, 61, nil, + nil, 54, nil, 152, nil, nil, nil, nil, nil, nil, + 54, 54, 54, nil, nil, nil, 57, nil, nil, nil, + nil, 57, 57, nil, nil, 57, nil, nil, nil, nil, + nil, 54, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, nil, nil, nil, nil, 57, 57, 57, + 57, 57, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 54, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, 57, 57, 57, 57, + 57, 57, nil, nil, nil, nil, 57, 57, 57, 54, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 54, + 57, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 54, nil, nil, nil, nil, nil, 57, 57, 54, nil, + nil, nil, nil, nil, nil, nil, 57, nil, 54, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 54, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, 57, + nil, nil, nil, nil, 57, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 57, nil, nil, nil, nil, nil, nil, nil, nil, 57, + 57, 57, nil, nil, nil, 54, nil, nil, nil, nil, + nil, 54, 54, nil, nil, 54, nil, nil, nil, nil, + 57, 54, 54, nil, nil, nil, nil, 54, 54, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, nil, nil, nil, nil, 54, + 54, nil, nil, 54, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 57, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 54, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 54, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 57, nil, + nil, nil, nil, 54, nil, nil, nil, nil, 57, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 54, nil, 57, nil, nil, nil, nil, nil, nil, + nil, 54, nil, 54, nil, nil, 57, nil, nil, 57, + nil, nil, nil, nil, nil, nil, nil, 57, nil, nil, + nil, nil, nil, 54, 54, 41, nil, 57, nil, nil, + nil, nil, 57, nil, 41, 41, 41, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, 41, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 54, 54, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 54, nil, nil, + nil, 54, nil, nil, 57, nil, nil, nil, nil, nil, + 57, 57, nil, nil, 57, nil, nil, nil, nil, nil, + 57, 57, nil, nil, nil, nil, 57, 57, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, nil, nil, nil, nil, 54, + nil, nil, nil, nil, 54, nil, nil, nil, 28, nil, + nil, nil, nil, nil, 28, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 54, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 28, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 57, nil, nil, nil, nil, 57, 57, + nil, nil, 57, nil, nil, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 28, nil, + nil, nil, nil, nil, 41, 41, nil, nil, 41, 41, + nil, nil, 57, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, 57, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 57, nil, 28, 34, 41, nil, nil, nil, + nil, 34, nil, 28, 41, 41, nil, nil, nil, nil, + 57, nil, nil, nil, 41, nil, nil, nil, nil, nil, + 57, 41, 57, 41, nil, nil, 41, 41, nil, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 57, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 41, nil, nil, + nil, 41, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 28, nil, 28, + nil, nil, 28, 57, 57, nil, nil, nil, 28, nil, + nil, nil, nil, nil, nil, nil, 57, nil, nil, nil, + 57, nil, 28, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, 57, nil, nil, nil, nil, nil, nil, 57, 41, + nil, nil, nil, 57, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, 39, 39, nil, 28, nil, nil, + nil, 28, nil, nil, nil, nil, 28, nil, nil, nil, + nil, 57, nil, nil, nil, nil, nil, nil, nil, 39, + nil, nil, nil, 41, nil, 41, 41, 41, nil, 39, + 39, 39, 28, nil, 34, nil, 34, nil, nil, 34, + nil, nil, 28, 28, nil, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, 41, nil, nil, 41, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 39, 41, nil, nil, nil, + nil, nil, nil, nil, 39, 41, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 66, nil, nil, nil, nil, + nil, 66, nil, nil, 34, 41, nil, nil, 34, nil, + nil, nil, nil, 34, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 66, + 66, 66, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, nil, nil, 41, nil, 34, + 34, nil, nil, nil, nil, 66, nil, nil, 39, nil, + 39, nil, nil, 39, nil, 66, 66, 66, 66, 39, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, nil, nil, nil, 41, 41, 41, + nil, nil, nil, 41, nil, nil, 41, 41, 41, 41, + 28, nil, nil, nil, 41, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, 41, + 66, nil, 41, nil, nil, nil, nil, nil, 28, nil, + nil, 28, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, 39, 41, nil, nil, 39, 39, 41, nil, + nil, 41, nil, nil, 28, nil, nil, nil, nil, nil, + nil, nil, nil, 39, nil, 41, nil, nil, nil, nil, + nil, nil, nil, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 39, 39, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 28, 34, nil, 41, + nil, nil, 28, nil, nil, nil, 28, 41, nil, 66, + nil, nil, 28, 28, nil, nil, nil, nil, 28, 28, + 41, 41, 41, 41, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, 34, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, 66, nil, nil, nil, 66, nil, + nil, nil, 66, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 28, nil, nil, nil, 66, + 28, nil, nil, nil, 28, nil, nil, nil, nil, 66, + nil, nil, nil, 41, 41, nil, nil, nil, nil, 66, + 66, nil, nil, 34, nil, nil, nil, nil, nil, 34, + nil, nil, nil, 34, 28, nil, nil, nil, nil, 34, + 34, 39, nil, 41, nil, 34, 34, nil, nil, 39, + nil, 28, nil, nil, nil, nil, nil, 39, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 28, nil, nil, nil, nil, 39, + 67, nil, 39, nil, nil, nil, 67, nil, nil, nil, + nil, nil, 28, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, 28, 39, nil, nil, nil, nil, + nil, nil, nil, nil, 67, 67, 67, nil, nil, nil, + nil, nil, 34, nil, 28, 28, nil, 34, nil, 41, + nil, 34, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, 67, 67, 67, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, nil, nil, 39, nil, nil, + nil, nil, nil, 39, nil, 28, 28, 39, 34, 28, + nil, nil, nil, 39, 39, nil, nil, nil, 28, 39, + 39, nil, 28, nil, nil, nil, nil, 66, nil, nil, + nil, 34, nil, nil, nil, 66, 67, nil, nil, nil, + nil, nil, nil, 66, nil, 67, nil, nil, nil, 34, + nil, 39, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 34, 39, 28, nil, 66, nil, nil, 66, nil, + 28, nil, nil, nil, nil, 28, nil, nil, nil, nil, + nil, 34, 34, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, 39, nil, nil, nil, + nil, 39, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 67, + nil, nil, 34, 34, 39, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, 34, + nil, nil, 39, 66, 67, nil, nil, nil, nil, nil, + nil, nil, nil, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, 39, nil, nil, nil, 34, nil, nil, + nil, nil, 34, nil, nil, 39, nil, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 66, 67, + nil, nil, nil, 67, nil, 39, 39, 67, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, 66, nil, 67, nil, nil, 66, nil, nil, + nil, 66, nil, nil, 67, 67, nil, nil, nil, nil, + nil, 39, nil, nil, nil, nil, 39, 39, nil, nil, + 39, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, 66, nil, 39, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 39, + nil, 66, nil, nil, 39, nil, nil, nil, nil, nil, + nil, 39, nil, nil, nil, nil, 39, nil, nil, 66, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 66, 66, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, 66, 66, nil, nil, 66, nil, nil, nil, + nil, nil, 67, nil, nil, 66, nil, nil, nil, 66, + 67, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, 67, nil, 66, nil, nil, nil, nil, + 66, nil, nil, nil, nil, nil, nil, 66, nil, nil, + nil, nil, 66, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 67, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, 67, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, 67, 67, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, 67, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, 67, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, 67 ] + +racc_goto_pointer = [ + nil, 133, 9, 134, nil, 73, -2, 129, 26, 17, + -109, 125, -125, -285, 12, -536, -586, -616, -706, nil, + -386, -163, 16, 139, -29, -180, 81, -21, 1976, -152, + -66, -18, 18, -206, 2103, 216, -209, -363, -18, 2247, + -19, 1832, -7, -418, nil, -587, -27, nil, nil, 133, + -188, 52, -260, -396, 965, -353, nil, 1264, 107, 18, + 51, 403, nil, -29, 46, -299, 2403, 2818, -324, 57, + -71, 5, nil, 54, -270, 129, 7, nil, -5, 116, + -121, -185, 23, -446, 27, -16, -346, -274, -437, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 91, nil, + 114, -183, -50, nil, nil, nil, -309, -671, nil, -671, + nil, nil, nil, -347, nil, 96, nil, -206, 17, nil, + nil, -563, 95, -219, 111, 111, -173, 112, 112, -417, + -418, -699, -197, -203, -413, -697, nil, nil, nil, nil, + nil, nil, -781, -528, -513, -822, -715, -644, nil, -14, + -532, 54, 224, -642, 153, -722, -643, -583, nil, -647, + -768, -840, -835, -197, -574, 114, -396, -335, -15, -199, + nil, -77, -71, nil, -481, -531, nil, -287, -781, -355, + -503, -629, nil, nil, 139, 16, 138, 138, 142, -273, + -250, 142, 143, 160, -533, -374, -373, nil, nil, 164, + -324, -302, nil, nil, 162, -506, -358, -589, -190, -500, + -704, nil, -673, -860, nil, nil, -113, -462 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 309, 7, 360, 312, + nil, nil, nil, nil, 560, nil, nil, nil, nil, 308, + 310, nil, nil, nil, nil, 14, 15, 21, 242, nil, + nil, 17, nil, 442, 243, 340, nil, nil, 592, 241, + 478, 24, nil, nil, 355, nil, 25, 26, 27, nil, + 723, nil, nil, nil, 329, nil, 28, 326, 457, 35, + nil, nil, 37, 40, 39, nil, 238, 239, 372, nil, + 146, 465, 145, 91, nil, 447, 107, 47, 50, 274, + 300, nil, 458, nil, 459, 470, 681, 522, 298, 283, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, + nil, nil, 284, 65, 66, 67, nil, nil, 68, 865, + 69, 70, 71, nil, 72, nil, 73, nil, 573, 74, + 75, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 288, 276, 731, 856, + 582, 866, 788, 620, nil, 789, 790, 1024, 924, 608, + nil, 609, nil, nil, 610, nil, 612, nil, 835, nil, + nil, nil, 618, nil, nil, nil, nil, nil, nil, nil, + 469, nil, nil, 701, nil, nil, 510, nil, nil, nil, + nil, nil, 90, 92, 94, nil, nil, nil, nil, nil, + 638, nil, nil, nil, nil, nil, nil, 103, 104, nil, + nil, 895, 770, 607, nil, 611, 903, 623, 625, 626, + 935, 629, 630, 936, 633, 636, nil, 303 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 3, 151, :_reduce_6, + 2, 151, :_reduce_none, + 1, 154, :_reduce_none, + 0, 158, :_reduce_9, + 3, 154, :_reduce_10, + 0, 160, :_reduce_11, + 4, 157, :_reduce_12, + 0, 165, :_reduce_13, + 6, 159, :_reduce_14, + 3, 159, :_reduce_15, + 2, 161, :_reduce_16, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 3, 166, :_reduce_19, + 2, 166, :_reduce_20, + 1, 167, :_reduce_none, + 0, 168, :_reduce_22, + 3, 167, :_reduce_23, + 0, 179, :_reduce_24, + 4, 156, :_reduce_25, + 3, 156, :_reduce_26, + 3, 156, :_reduce_27, + 3, 156, :_reduce_28, + 2, 156, :_reduce_29, + 3, 156, :_reduce_30, + 3, 156, :_reduce_31, + 3, 156, :_reduce_32, + 3, 156, :_reduce_33, + 3, 156, :_reduce_34, + 4, 156, :_reduce_35, + 1, 156, :_reduce_none, + 3, 156, :_reduce_37, + 3, 156, :_reduce_38, + 3, 156, :_reduce_39, + 1, 156, :_reduce_none, + 3, 172, :_reduce_41, + 3, 172, :_reduce_42, + 6, 172, :_reduce_43, + 5, 172, :_reduce_44, + 5, 172, :_reduce_45, + 5, 172, :_reduce_46, + 5, 172, :_reduce_47, + 3, 172, :_reduce_48, + 1, 180, :_reduce_49, + 3, 180, :_reduce_50, + 1, 180, :_reduce_none, + 1, 178, :_reduce_none, + 3, 178, :_reduce_53, + 3, 178, :_reduce_54, + 3, 178, :_reduce_55, + 2, 178, :_reduce_56, + 1, 178, :_reduce_none, + 1, 171, :_reduce_58, + 0, 191, :_reduce_59, + 0, 192, :_reduce_60, + 4, 189, :_reduce_61, + 1, 174, :_reduce_none, + 1, 174, :_reduce_none, + 1, 194, :_reduce_none, + 4, 194, :_reduce_65, + 0, 202, :_reduce_66, + 4, 199, :_reduce_67, + 1, 201, :_reduce_68, + 2, 193, :_reduce_69, + 3, 193, :_reduce_70, + 4, 193, :_reduce_71, + 5, 193, :_reduce_72, + 4, 193, :_reduce_73, + 5, 193, :_reduce_74, + 2, 193, :_reduce_75, + 2, 193, :_reduce_76, + 2, 193, :_reduce_77, + 2, 193, :_reduce_78, + 2, 193, :_reduce_79, + 1, 173, :_reduce_none, + 3, 173, :_reduce_81, + 1, 207, :_reduce_none, + 3, 207, :_reduce_83, + 1, 206, :_reduce_84, + 2, 206, :_reduce_85, + 3, 206, :_reduce_86, + 5, 206, :_reduce_87, + 2, 206, :_reduce_88, + 4, 206, :_reduce_89, + 2, 206, :_reduce_90, + 4, 206, :_reduce_91, + 1, 206, :_reduce_92, + 3, 206, :_reduce_93, + 1, 210, :_reduce_none, + 3, 210, :_reduce_95, + 2, 209, :_reduce_96, + 3, 209, :_reduce_97, + 1, 212, :_reduce_98, + 3, 212, :_reduce_99, + 1, 211, :_reduce_100, + 1, 211, :_reduce_101, + 4, 211, :_reduce_102, + 3, 211, :_reduce_103, + 3, 211, :_reduce_104, + 3, 211, :_reduce_105, + 3, 211, :_reduce_106, + 2, 211, :_reduce_107, + 1, 211, :_reduce_108, + 1, 175, :_reduce_109, + 1, 175, :_reduce_110, + 4, 175, :_reduce_111, + 3, 175, :_reduce_112, + 3, 175, :_reduce_113, + 3, 175, :_reduce_114, + 3, 175, :_reduce_115, + 2, 175, :_reduce_116, + 1, 175, :_reduce_117, + 1, 215, :_reduce_118, + 1, 215, :_reduce_none, + 2, 216, :_reduce_120, + 1, 216, :_reduce_121, + 3, 216, :_reduce_122, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_126, + 1, 217, :_reduce_none, + 1, 169, :_reduce_128, + 1, 169, :_reduce_none, + 1, 170, :_reduce_130, + 0, 221, :_reduce_131, + 4, 170, :_reduce_132, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 218, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 3, 188, :_reduce_204, + 3, 188, :_reduce_205, + 6, 188, :_reduce_206, + 5, 188, :_reduce_207, + 5, 188, :_reduce_208, + 5, 188, :_reduce_209, + 5, 188, :_reduce_210, + 4, 188, :_reduce_211, + 3, 188, :_reduce_212, + 3, 188, :_reduce_213, + 3, 188, :_reduce_214, + 2, 188, :_reduce_215, + 2, 188, :_reduce_216, + 3, 188, :_reduce_217, + 3, 188, :_reduce_218, + 3, 188, :_reduce_219, + 3, 188, :_reduce_220, + 3, 188, :_reduce_221, + 3, 188, :_reduce_222, + 4, 188, :_reduce_223, + 2, 188, :_reduce_224, + 2, 188, :_reduce_225, + 3, 188, :_reduce_226, + 3, 188, :_reduce_227, + 3, 188, :_reduce_228, + 3, 188, :_reduce_229, + 1, 188, :_reduce_none, + 3, 188, :_reduce_231, + 3, 188, :_reduce_232, + 3, 188, :_reduce_233, + 3, 188, :_reduce_234, + 3, 188, :_reduce_235, + 2, 188, :_reduce_236, + 2, 188, :_reduce_237, + 3, 188, :_reduce_238, + 3, 188, :_reduce_239, + 3, 188, :_reduce_240, + 3, 188, :_reduce_241, + 3, 188, :_reduce_242, + 6, 188, :_reduce_243, + 1, 188, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 1, 226, :_reduce_none, + 3, 224, :_reduce_249, + 3, 224, :_reduce_250, + 1, 227, :_reduce_251, + 1, 228, :_reduce_none, + 2, 228, :_reduce_253, + 4, 228, :_reduce_254, + 2, 228, :_reduce_255, + 1, 222, :_reduce_none, + 3, 222, :_reduce_257, + 3, 232, :_reduce_258, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 2, 183, :_reduce_263, + 4, 183, :_reduce_264, + 2, 183, :_reduce_265, + 1, 205, :_reduce_266, + 2, 205, :_reduce_267, + 2, 205, :_reduce_268, + 4, 205, :_reduce_269, + 1, 205, :_reduce_270, + 0, 236, :_reduce_271, + 2, 198, :_reduce_272, + 2, 235, :_reduce_273, + 2, 234, :_reduce_274, + 1, 234, :_reduce_none, + 1, 229, :_reduce_276, + 2, 229, :_reduce_277, + 3, 229, :_reduce_278, + 4, 229, :_reduce_279, + 1, 177, :_reduce_280, + 1, 177, :_reduce_281, + 3, 176, :_reduce_282, + 4, 176, :_reduce_283, + 2, 176, :_reduce_284, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_295, + 0, 271, :_reduce_296, + 4, 225, :_reduce_297, + 0, 272, :_reduce_298, + 3, 225, :_reduce_299, + 0, 273, :_reduce_300, + 4, 225, :_reduce_301, + 3, 225, :_reduce_302, + 3, 225, :_reduce_303, + 2, 225, :_reduce_304, + 0, 274, :_reduce_305, + 4, 225, :_reduce_306, + 0, 275, :_reduce_307, + 4, 225, :_reduce_308, + 1, 225, :_reduce_309, + 4, 225, :_reduce_310, + 3, 225, :_reduce_311, + 1, 225, :_reduce_312, + 5, 225, :_reduce_313, + 4, 225, :_reduce_314, + 3, 225, :_reduce_315, + 2, 225, :_reduce_316, + 1, 225, :_reduce_none, + 2, 225, :_reduce_318, + 1, 225, :_reduce_319, + 6, 225, :_reduce_320, + 6, 225, :_reduce_321, + 4, 225, :_reduce_322, + 4, 225, :_reduce_323, + 5, 225, :_reduce_324, + 4, 225, :_reduce_325, + 6, 225, :_reduce_326, + 0, 276, :_reduce_327, + 6, 225, :_reduce_328, + 0, 277, :_reduce_329, + 0, 278, :_reduce_330, + 8, 225, :_reduce_331, + 0, 279, :_reduce_332, + 5, 225, :_reduce_333, + 0, 280, :_reduce_334, + 6, 225, :_reduce_335, + 0, 281, :_reduce_336, + 0, 282, :_reduce_337, + 9, 225, :_reduce_338, + 1, 225, :_reduce_339, + 1, 225, :_reduce_340, + 1, 225, :_reduce_341, + 1, 225, :_reduce_342, + 1, 182, :_reduce_343, + 1, 246, :_reduce_none, + 1, 252, :_reduce_none, + 1, 255, :_reduce_none, + 1, 257, :_reduce_none, + 1, 258, :_reduce_none, + 1, 259, :_reduce_none, + 1, 261, :_reduce_none, + 1, 263, :_reduce_351, + 1, 266, :_reduce_352, + 1, 267, :_reduce_353, + 1, 283, :_reduce_none, + 1, 284, :_reduce_none, + 1, 285, :_reduce_none, + 1, 286, :_reduce_none, + 1, 287, :_reduce_none, + 1, 163, :_reduce_none, + 1, 288, :_reduce_none, + 1, 247, :_reduce_none, + 1, 204, :_reduce_none, + 1, 253, :_reduce_none, + 1, 253, :_reduce_none, + 2, 253, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 254, :_reduce_none, + 5, 254, :_reduce_369, + 1, 256, :_reduce_none, + 2, 256, :_reduce_371, + 1, 262, :_reduce_none, + 1, 262, :_reduce_373, + 1, 289, :_reduce_none, + 3, 289, :_reduce_375, + 1, 292, :_reduce_376, + 3, 292, :_reduce_377, + 1, 291, :_reduce_378, + 3, 291, :_reduce_379, + 5, 291, :_reduce_380, + 1, 291, :_reduce_381, + 3, 291, :_reduce_382, + 2, 293, :_reduce_383, + 1, 293, :_reduce_384, + 4, 294, :_reduce_385, + 2, 294, :_reduce_386, + 2, 294, :_reduce_387, + 1, 294, :_reduce_388, + 2, 299, :_reduce_389, + 1, 299, :_reduce_none, + 6, 300, :_reduce_391, + 8, 300, :_reduce_392, + 4, 300, :_reduce_393, + 6, 300, :_reduce_394, + 4, 300, :_reduce_395, + 2, 300, :_reduce_396, + 6, 300, :_reduce_397, + 2, 300, :_reduce_398, + 4, 300, :_reduce_399, + 6, 300, :_reduce_400, + 2, 300, :_reduce_401, + 4, 300, :_reduce_402, + 2, 300, :_reduce_403, + 4, 300, :_reduce_404, + 1, 300, :_reduce_405, + 1, 304, :_reduce_406, + 1, 304, :_reduce_407, + 3, 305, :_reduce_408, + 1, 305, :_reduce_409, + 4, 305, :_reduce_410, + 1, 306, :_reduce_none, + 4, 306, :_reduce_412, + 1, 307, :_reduce_413, + 3, 307, :_reduce_414, + 1, 308, :_reduce_415, + 1, 308, :_reduce_none, + 0, 312, :_reduce_417, + 0, 313, :_reduce_418, + 5, 251, :_reduce_419, + 4, 310, :_reduce_420, + 1, 310, :_reduce_421, + 3, 311, :_reduce_422, + 3, 311, :_reduce_423, + 3, 315, :_reduce_424, + 2, 195, :_reduce_425, + 4, 195, :_reduce_426, + 5, 195, :_reduce_427, + 5, 195, :_reduce_428, + 2, 250, :_reduce_429, + 4, 250, :_reduce_430, + 4, 250, :_reduce_431, + 3, 250, :_reduce_432, + 3, 250, :_reduce_433, + 3, 250, :_reduce_434, + 2, 250, :_reduce_435, + 1, 250, :_reduce_436, + 4, 250, :_reduce_437, + 0, 318, :_reduce_438, + 4, 249, :_reduce_439, + 0, 319, :_reduce_440, + 4, 249, :_reduce_441, + 0, 320, :_reduce_442, + 0, 321, :_reduce_443, + 4, 200, :_reduce_444, + 0, 323, :_reduce_445, + 0, 324, :_reduce_446, + 4, 316, :_reduce_447, + 1, 322, :_reduce_448, + 2, 322, :_reduce_449, + 3, 322, :_reduce_450, + 4, 322, :_reduce_451, + 0, 326, :_reduce_452, + 6, 260, :_reduce_453, + 1, 325, :_reduce_none, + 1, 325, :_reduce_none, + 6, 162, :_reduce_456, + 0, 162, :_reduce_457, + 1, 327, :_reduce_458, + 1, 327, :_reduce_none, + 1, 327, :_reduce_none, + 2, 328, :_reduce_461, + 1, 328, :_reduce_none, + 2, 164, :_reduce_463, + 1, 164, :_reduce_none, + 1, 237, :_reduce_465, + 1, 237, :_reduce_none, + 1, 238, :_reduce_467, + 1, 330, :_reduce_468, + 1, 330, :_reduce_none, + 2, 330, :_reduce_470, + 3, 331, :_reduce_471, + 1, 331, :_reduce_472, + 3, 239, :_reduce_473, + 3, 240, :_reduce_474, + 3, 241, :_reduce_475, + 3, 241, :_reduce_476, + 1, 335, :_reduce_477, + 3, 335, :_reduce_478, + 1, 336, :_reduce_none, + 2, 336, :_reduce_480, + 3, 243, :_reduce_481, + 3, 243, :_reduce_482, + 1, 338, :_reduce_483, + 3, 338, :_reduce_484, + 3, 242, :_reduce_485, + 3, 242, :_reduce_486, + 3, 244, :_reduce_487, + 3, 244, :_reduce_488, + 1, 339, :_reduce_489, + 3, 339, :_reduce_490, + 1, 340, :_reduce_491, + 3, 340, :_reduce_492, + 1, 332, :_reduce_493, + 2, 332, :_reduce_494, + 1, 333, :_reduce_495, + 2, 333, :_reduce_496, + 1, 334, :_reduce_497, + 2, 334, :_reduce_498, + 1, 337, :_reduce_499, + 0, 342, :_reduce_500, + 3, 337, :_reduce_501, + 0, 343, :_reduce_502, + 4, 337, :_reduce_503, + 1, 341, :_reduce_504, + 1, 341, :_reduce_505, + 1, 341, :_reduce_506, + 1, 341, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 2, 344, :_reduce_510, + 1, 344, :_reduce_511, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 3, 345, :_reduce_516, + 1, 329, :_reduce_none, + 2, 329, :_reduce_518, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 214, :_reduce_528, + 1, 214, :_reduce_529, + 1, 214, :_reduce_530, + 1, 214, :_reduce_531, + 1, 214, :_reduce_532, + 1, 214, :_reduce_533, + 1, 214, :_reduce_534, + 1, 245, :_reduce_535, + 1, 245, :_reduce_536, + 1, 181, :_reduce_537, + 1, 181, :_reduce_538, + 1, 186, :_reduce_539, + 1, 186, :_reduce_540, + 0, 347, :_reduce_541, + 4, 264, :_reduce_542, + 1, 264, :_reduce_543, + 3, 268, :_reduce_544, + 0, 349, :_reduce_545, + 3, 268, :_reduce_546, + 4, 348, :_reduce_547, + 2, 348, :_reduce_548, + 2, 348, :_reduce_549, + 1, 348, :_reduce_none, + 2, 351, :_reduce_551, + 0, 351, :_reduce_552, + 6, 314, :_reduce_553, + 8, 314, :_reduce_554, + 4, 314, :_reduce_555, + 6, 314, :_reduce_556, + 4, 314, :_reduce_557, + 6, 314, :_reduce_558, + 2, 314, :_reduce_559, + 4, 314, :_reduce_560, + 6, 314, :_reduce_561, + 2, 314, :_reduce_562, + 4, 314, :_reduce_563, + 2, 314, :_reduce_564, + 4, 314, :_reduce_565, + 1, 314, :_reduce_566, + 0, 314, :_reduce_567, + 1, 309, :_reduce_568, + 1, 309, :_reduce_569, + 1, 309, :_reduce_570, + 1, 309, :_reduce_571, + 1, 290, :_reduce_none, + 1, 290, :_reduce_573, + 1, 353, :_reduce_none, + 1, 354, :_reduce_none, + 3, 354, :_reduce_576, + 1, 301, :_reduce_577, + 3, 301, :_reduce_578, + 1, 355, :_reduce_none, + 2, 356, :_reduce_580, + 1, 356, :_reduce_581, + 2, 357, :_reduce_582, + 1, 357, :_reduce_583, + 1, 295, :_reduce_none, + 3, 295, :_reduce_585, + 1, 350, :_reduce_none, + 3, 350, :_reduce_587, + 1, 358, :_reduce_none, + 1, 358, :_reduce_none, + 2, 296, :_reduce_590, + 1, 296, :_reduce_591, + 3, 359, :_reduce_592, + 3, 360, :_reduce_593, + 1, 302, :_reduce_594, + 3, 302, :_reduce_595, + 1, 352, :_reduce_596, + 3, 352, :_reduce_597, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 2, 303, :_reduce_600, + 1, 303, :_reduce_601, + 1, 362, :_reduce_none, + 1, 362, :_reduce_none, + 2, 298, :_reduce_604, + 2, 297, :_reduce_605, + 0, 297, :_reduce_606, + 1, 269, :_reduce_none, + 0, 363, :_reduce_608, + 4, 269, :_reduce_609, + 1, 248, :_reduce_610, + 2, 248, :_reduce_none, + 1, 231, :_reduce_none, + 3, 231, :_reduce_613, + 3, 364, :_reduce_614, + 2, 364, :_reduce_615, + 4, 364, :_reduce_616, + 2, 364, :_reduce_617, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 317, :_reduce_none, + 1, 317, :_reduce_none, + 1, 317, :_reduce_none, + 1, 270, :_reduce_none, + 1, 270, :_reduce_none, + 1, 185, :_reduce_none, + 1, 185, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 187, :_reduce_none, + 1, 187, :_reduce_none, + 2, 208, :_reduce_638, + 2, 184, :_reduce_639, + 0, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 1, 265, :_reduce_643, + 1, 265, :_reduce_none, + 1, 155, :_reduce_none, + 2, 155, :_reduce_646, + 0, 153, :_reduce_647 ] + +racc_reduce_n = 648 + +racc_shift_n = 1091 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLONELY => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tLOWEST => 145, + :tEQL => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLONELY", + "tBDOT2", + "tBDOT3", + "tLOWEST", + "tEQL", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "@3", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@4", + "stmts", + "stmt_or_begin", + "@5", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@6", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "expr_value_do", + "do", + "@7", + "@8", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@9", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@10", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@11", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "dot_or_colon", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "@23", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@24", + "@25", + "f_args", + "do_block", + "do_body", + "operation3", + "@26", + "@27", + "@28", + "@29", + "case_args", + "@30", + "@31", + "cases", + "@32", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@33", + "@34", + "ssym", + "dsym", + "sym", + "@35", + "args_tail", + "@36", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@37", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_12(val, _values, result) + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_13(val, _values, result) + res = _values[-2] + # TODO: move down to main match so I can just use val + + yyerror "else without rescue is useless" unless res + + result +end + +def _reduce_14(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_15(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_16(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 17 omitted + +# reduce 18 omitted + +def _reduce_19(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_20(val, _values, result) + result = val[1] + debug 12 + + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_23(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_24(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_25(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_27(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_28(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_29(val, _values, result) + result = val[1] + + result +end + +def _reduce_30(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_31(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_33(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_34(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_35(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_38(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_49(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +def _reduce_50(val, _values, result) + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_54(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_55(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_56(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +# reduce 57 omitted + +def _reduce_58(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_59(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_60(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_61(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 62 omitted + +# reduce 63 omitted + +# reduce 64 omitted + +def _reduce_65(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_66(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_67(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_68(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_69(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_70(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_71(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_72(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_73(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_74(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_75(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_76(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_77(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_78(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_79(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 80 omitted + +def _reduce_81(val, _values, result) + result = val[1] + + result +end + +# reduce 82 omitted + +def _reduce_83(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_84(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_85(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_86(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_87(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_88(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_89(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_90(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_91(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_92(val, _values, result) + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_93(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 94 omitted + +def _reduce_95(val, _values, result) + result = val[1] + + result +end + +def _reduce_96(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_97(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_98(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_99(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_100(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_101(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_102(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_103(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_104(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_105(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_106(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_107(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_108(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_109(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_110(val, _values, result) + var, = val + + result = self.assignable var + + debug 16 + + result +end + +def _reduce_111(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_112(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_113(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_114(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_115(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_116(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_117(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_118(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 119 omitted + +def _reduce_120(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_121(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_122(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +def _reduce_126(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 127 omitted + +def _reduce_128(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 129 omitted + +def _reduce_130(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_131(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_132(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +def _reduce_204(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_205(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_206(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_207(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_208(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_209(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_210(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_211(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_212(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_213(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_214(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_215(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + + result +end + +def _reduce_216(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + + result +end + +def _reduce_217(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_218(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_219(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_220(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_221(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_222(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_223(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_224(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_225(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_226(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 230 omitted + +def _reduce_231(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_234(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_235(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_236(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_237(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_238(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_239(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_240(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_241(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_242(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_243(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +# reduce 244 omitted + +# reduce 245 omitted + +# reduce 246 omitted + +# reduce 247 omitted + +# reduce 248 omitted + +def _reduce_249(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_250(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_251(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 252 omitted + +def _reduce_253(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_254(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_255(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 256 omitted + +def _reduce_257(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_258(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +# reduce 259 omitted + +# reduce 260 omitted + +# reduce 261 omitted + +# reduce 262 omitted + +def _reduce_263(val, _values, result) + result = args val + + result +end + +def _reduce_264(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_265(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_266(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_267(val, _values, result) + result = call_args val + + result +end + +def _reduce_268(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_269(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_270(val, _values, result) + result = call_args val + + result +end + +def _reduce_271(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_272(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_273(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_274(val, _values, result) + result = val[1] + + result +end + +# reduce 275 omitted + +def _reduce_276(val, _values, result) + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + + result +end + +def _reduce_277(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_278(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_279(val, _values, result) + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_280(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_281(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_282(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_283(val, _values, result) + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_284(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 285 omitted + +# reduce 286 omitted + +# reduce 287 omitted + +# reduce 288 omitted + +# reduce 289 omitted + +# reduce 290 omitted + +# reduce 291 omitted + +# reduce 292 omitted + +# reduce 293 omitted + +# reduce 294 omitted + +def _reduce_295(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_296(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_297(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_298(val, _values, result) + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + + result +end + +def _reduce_299(val, _values, result) + _, line, _ = val + result = s(:begin).line line + + result +end + +def _reduce_300(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_301(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_302(val, _values, result) + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + + result +end + +def _reduce_303(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_304(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_305(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_306(val, _values, result) + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_307(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_308(val, _values, result) + result = new_hash val + + result +end + +def _reduce_309(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_310(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_311(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_312(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_313(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_314(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_315(val, _values, result) + debug 20 + + result +end + +def _reduce_316(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 317 omitted + +def _reduce_318(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_319(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_320(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_321(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_322(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_323(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_324(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_325(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_326(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_327(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_328(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_329(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_330(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_331(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_332(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_333(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_334(val, _values, result) + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result +end + +def _reduce_335(val, _values, result) + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_336(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_337(val, _values, result) + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + + result +end + +def _reduce_338(val, _values, result) + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_339(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_340(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_341(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_342(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_343(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 344 omitted + +# reduce 345 omitted + +# reduce 346 omitted + +# reduce 347 omitted + +# reduce 348 omitted + +# reduce 349 omitted + +# reduce 350 omitted + +def _reduce_351(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_352(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_353(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +# reduce 354 omitted + +# reduce 355 omitted + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +# reduce 360 omitted + +# reduce 361 omitted + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +# reduce 366 omitted + +# reduce 367 omitted + +# reduce 368 omitted + +def _reduce_369(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 370 omitted + +def _reduce_371(val, _values, result) + result = val[1] + + result +end + +# reduce 372 omitted + +def _reduce_373(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +# reduce 374 omitted + +def _reduce_375(val, _values, result) + result = val[1] + + result +end + +def _reduce_376(val, _values, result) + sym, = val + + result = s(:array, sym).line lexer.lineno + + result +end + +def _reduce_377(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_378(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_379(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_380(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_381(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_382(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_383(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_384(val, _values, result) + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + + result +end + +def _reduce_385(val, _values, result) + result = call_args val + + result +end + +def _reduce_386(val, _values, result) + result = call_args val + + result +end + +def _reduce_387(val, _values, result) + result = call_args val + + result +end + +def _reduce_388(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_389(val, _values, result) + result = args val + + result +end + +# reduce 390 omitted + +def _reduce_391(val, _values, result) + result = args val + + result +end + +def _reduce_392(val, _values, result) + result = args val + + result +end + +def _reduce_393(val, _values, result) + result = args val + + result +end + +def _reduce_394(val, _values, result) + result = args val + + result +end + +def _reduce_395(val, _values, result) + result = args val + + result +end + +def _reduce_396(val, _values, result) + result = args(val) << nil + + result +end + +def _reduce_397(val, _values, result) + result = args val + + result +end + +def _reduce_398(val, _values, result) + result = args val + + result +end + +def _reduce_399(val, _values, result) + result = args val + + result +end + +def _reduce_400(val, _values, result) + result = args val + + result +end + +def _reduce_401(val, _values, result) + result = args val + + result +end + +def _reduce_402(val, _values, result) + result = args val + + result +end + +def _reduce_403(val, _values, result) + result = args val + + result +end + +def _reduce_404(val, _values, result) + result = args val + + result +end + +def _reduce_405(val, _values, result) + result = args val + + result +end + +def _reduce_406(val, _values, result) + result = 0 + result +end + +def _reduce_407(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_408(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +def _reduce_409(val, _values, result) + result = s(:args).line lexer.lineno + + result +end + +def _reduce_410(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +# reduce 411 omitted + +def _reduce_412(val, _values, result) + result = args val + + result +end + +def _reduce_413(val, _values, result) + result = args val + + result +end + +def _reduce_414(val, _values, result) + result = args val + + result +end + +def _reduce_415(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 416 omitted + +def _reduce_417(val, _values, result) + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_418(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_419(val, _values, result) + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_420(val, _values, result) + result = args val + + result +end + +def _reduce_421(val, _values, result) + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_422(val, _values, result) + result = val[1] + + result +end + +def _reduce_423(val, _values, result) + result = val[1] + + result +end + +def _reduce_424(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_425(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_426(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_427(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_428(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_429(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_430(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_431(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_432(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_433(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_434(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_435(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_436(val, _values, result) + result = s(:zsuper).line lexer.lineno + + result +end + +def _reduce_437(val, _values, result) + result = new_aref val + + result +end + +def _reduce_438(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_439(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_440(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_441(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_442(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_443(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_444(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_445(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_446(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_447(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_448(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_449(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_450(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_451(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_452(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_453(val, _values, result) + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + + result +end + +# reduce 454 omitted + +# reduce 455 omitted + +def _reduce_456(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_457(val, _values, result) + result = nil + + result +end + +def _reduce_458(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 459 omitted + +# reduce 460 omitted + +def _reduce_461(val, _values, result) + result = val[1] + + result +end + +# reduce 462 omitted + +def _reduce_463(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 464 omitted + +def _reduce_465(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 466 omitted + +def _reduce_467(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_468(val, _values, result) + debug 37 + + result +end + +# reduce 469 omitted + +def _reduce_470(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_471(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_472(val, _values, result) + result = new_string val + + result +end + +def _reduce_473(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_474(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_475(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_476(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_477(val, _values, result) + result = new_word_list + + result +end + +def _reduce_478(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 479 omitted + +def _reduce_480(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_481(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_482(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_483(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_484(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_485(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_486(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_487(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_488(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_489(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_490(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_491(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_492(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_493(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_494(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_495(val, _values, result) + result = nil + + result +end + +def _reduce_496(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_497(val, _values, result) + result = nil + + result +end + +def _reduce_498(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_499(val, _values, result) + result = new_string val + + result +end + +def _reduce_500(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_501(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_502(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_503(val, _values, result) + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_504(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_505(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_506(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 507 omitted + +# reduce 508 omitted + +# reduce 509 omitted + +def _reduce_510(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_511(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 512 omitted + +# reduce 513 omitted + +# reduce 514 omitted + +# reduce 515 omitted + +def _reduce_516(val, _values, result) + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + + result +end + +# reduce 517 omitted + +def _reduce_518(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 519 omitted + +# reduce 520 omitted + +# reduce 521 omitted + +# reduce 522 omitted + +# reduce 523 omitted + +# reduce 524 omitted + +# reduce 525 omitted + +# reduce 526 omitted + +# reduce 527 omitted + +def _reduce_528(val, _values, result) + result = s(:nil).line lexer.lineno + result +end + +def _reduce_529(val, _values, result) + result = s(:self).line lexer.lineno + result +end + +def _reduce_530(val, _values, result) + result = s(:true).line lexer.lineno + result +end + +def _reduce_531(val, _values, result) + result = s(:false).line lexer.lineno + result +end + +def _reduce_532(val, _values, result) + result = s(:str, self.file).line lexer.lineno + result +end + +def _reduce_533(val, _values, result) + result = s(:lit, lexer.lineno).line lexer.lineno + result +end + +def _reduce_534(val, _values, result) + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_535(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + + result +end + +def _reduce_536(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_537(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_538(val, _values, result) + result = self.assignable val[0] + debug 40 + + result +end + +def _reduce_539(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_540(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_541(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_542(val, _values, result) + result = val[2] + + result +end + +def _reduce_543(val, _values, result) + result = nil + + result +end + +def _reduce_544(val, _values, result) + result = end_args val + + result +end + +def _reduce_545(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_546(val, _values, result) + result = end_args val + + result +end + +def _reduce_547(val, _values, result) + result = args val + + result +end + +def _reduce_548(val, _values, result) + result = args val + + result +end + +def _reduce_549(val, _values, result) + result = args val + + result +end + +# reduce 550 omitted + +def _reduce_551(val, _values, result) + result = val[1] + + result +end + +def _reduce_552(val, _values, result) + result = nil + + result +end + +def _reduce_553(val, _values, result) + result = args val + + result +end + +def _reduce_554(val, _values, result) + result = args val + + result +end + +def _reduce_555(val, _values, result) + result = args val + + result +end + +def _reduce_556(val, _values, result) + result = args val + + result +end + +def _reduce_557(val, _values, result) + result = args val + + result +end + +def _reduce_558(val, _values, result) + result = args val + + result +end + +def _reduce_559(val, _values, result) + result = args val + + result +end + +def _reduce_560(val, _values, result) + result = args val + + result +end + +def _reduce_561(val, _values, result) + result = args val + + result +end + +def _reduce_562(val, _values, result) + result = args val + + result +end + +def _reduce_563(val, _values, result) + result = args val + + result +end + +def _reduce_564(val, _values, result) + result = args val + + result +end + +def _reduce_565(val, _values, result) + result = args val + + result +end + +def _reduce_566(val, _values, result) + result = args val + + result +end + +def _reduce_567(val, _values, result) + result = args val + # result.line lexer.lineno + + result +end + +def _reduce_568(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_569(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_570(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_571(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 572 omitted + +def _reduce_573(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 574 omitted + +# reduce 575 omitted + +def _reduce_576(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_577(val, _values, result) + result = new_arg val + + result +end + +def _reduce_578(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +# reduce 579 omitted + +def _reduce_580(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_581(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_582(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_583(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 584 omitted + +def _reduce_585(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 586 omitted + +def _reduce_587(val, _values, result) + result = args val + + result +end + +# reduce 588 omitted + +# reduce 589 omitted + +def _reduce_590(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_591(val, _values, result) + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + + result +end + +def _reduce_592(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + + result +end + +def _reduce_593(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + + result +end + +def _reduce_594(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_595(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_596(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_597(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 598 omitted + +# reduce 599 omitted + +def _reduce_600(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_601(val, _values, result) + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + + result +end + +# reduce 602 omitted + +# reduce 603 omitted + +def _reduce_604(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_605(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_606(val, _values, result) + result = nil + + result +end + +# reduce 607 omitted + +def _reduce_608(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_609(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_610(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 611 omitted + +# reduce 612 omitted + +def _reduce_613(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_614(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_615(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_616(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_617(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 618 omitted + +# reduce 619 omitted + +# reduce 620 omitted + +# reduce 621 omitted + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +# reduce 626 omitted + +# reduce 627 omitted + +# reduce 628 omitted + +# reduce 629 omitted + +# reduce 630 omitted + +# reduce 631 omitted + +# reduce 632 omitted + +# reduce 633 omitted + +# reduce 634 omitted + +# reduce 635 omitted + +# reduce 636 omitted + +# reduce 637 omitted + +def _reduce_638(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_639(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 640 omitted + +# reduce 641 omitted + +# reduce 642 omitted + +def _reduce_643(val, _values, result) + yyerrok + result +end + +# reduce 644 omitted + +# reduce 645 omitted + +def _reduce_646(val, _values, result) + yyerrok + result +end + +def _reduce_647(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby26Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby26_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby26_parser.y new file mode 100644 index 000000000..004da87ad --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby26_parser.y @@ -0,0 +1,2760 @@ +# -*- racc -*- + +class Ruby26Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + tBDOT2 tBDOT3 + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + + yyerror "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + | arg tDOT2 + { + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + } + | arg tDOT3 + { + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + } + + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + bodystmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + + f_opt: f_arg_asgn tEQL arg_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + + f_block_opt: f_arg_asgn tEQL primary_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby27_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby27_parser.rb new file mode 100644 index 000000000..bad46e9e9 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby27_parser.rb @@ -0,0 +1,12963 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby27Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -623, 665, 668, 288, 583, -112, 288, -623, -623, -623, + 226, 227, -623, -623, -623, -106, -623, -113, 1095, -108, + 583, 583, 226, 227, -623, 879, -623, -623, -623, 226, + 227, 597, 3, 838, 1100, 598, -623, -623, 232, -623, + -623, -623, -623, -623, -98, 283, -741, 583, -120, -107, + -119, 839, 1099, -115, -117, 583, 597, 879, 128, 237, + 897, -84, 961, -105, 664, 667, -516, -623, -623, -623, + -623, -623, -623, -623, -623, -623, -623, -623, -623, -623, + -623, 583, -106, -623, -623, -623, -108, -623, -623, 789, + 290, -623, -114, 290, -623, -623, 1096, -623, 1135, -623, + 237, -623, 233, -623, -623, -623, -623, -623, -623, -623, + -103, -623, 237, -623, 1012, -726, -107, -106, 132, 237, + -106, -108, -104, 131, -108, 637, -623, -623, -623, -623, + -105, -623, -112, -623, 132, 132, -626, -106, -623, 131, + 131, -108, -623, -626, -626, -626, -623, -113, -626, -626, + -626, -107, -626, -111, -107, -110, -120, -119, -106, -108, + -626, 132, -626, -626, -626, -105, 131, 960, -105, 132, + -115, -107, -626, -626, 131, -626, -626, -626, -626, -626, + -117, -116, 1155, -114, 223, -105, -116, -118, 903, 132, + 288, -637, 638, 97, 131, 132, 236, -105, 1058, -638, + 131, 98, 903, -626, -626, -626, -626, -626, -626, -626, + -626, -626, -626, -626, -626, -626, -626, 224, 288, -626, + -626, -626, 902, -626, -626, 110, 111, -626, 110, 111, + -626, -626, 237, -626, 488, -626, 902, -626, 225, -626, + -626, -626, -626, -626, -626, -626, -112, -626, -118, -626, + -112, -112, -726, -727, 228, 285, 649, 1012, -113, -726, + 1156, -113, -626, -626, -626, -626, -113, -626, 637, -626, + -120, -119, -310, 278, -626, -120, -119, 290, -626, -310, + -310, -310, -626, 285, -115, -310, -310, 634, -310, -115, + -741, -107, -109, -120, -117, -116, -310, -114, 637, -117, + -116, 234, -114, 112, 113, 290, 112, 113, -310, -310, + 562, -310, -310, -310, -310, -310, 340, 651, 650, 647, + 232, 237, -623, 874, 935, 649, -727, 231, 132, -623, + 875, 645, 644, 131, 794, 638, 229, 751, 687, -310, + -310, -310, -310, -310, -310, -310, -310, -310, -310, -310, + -310, -310, -310, 688, 234, -310, -310, -310, 649, 693, + -120, 634, -118, -310, 995, 638, -310, -118, 649, -119, + 597, -310, 637, -310, 897, -310, -310, -310, -310, -310, + -310, -310, -115, -310, 233, -310, 651, 650, 629, -117, + 626, 625, 624, 634, 627, 844, -111, -115, -310, -310, + 861, -109, 885, -310, 637, 645, 644, 881, -730, -741, + -310, 882, -117, -120, -310, -730, -730, -730, -118, 651, + 650, -730, -730, -114, -730, 341, 632, 614, 846, 651, + 650, 647, -730, -730, -626, 642, 641, 645, 644, 638, + 237, -626, 649, 237, -730, -730, -351, -730, -730, -730, + -730, -730, 590, -351, 232, 935, 406, 590, -635, -114, + 794, 485, -351, 649, -637, -635, 654, 434, 226, 227, + 486, 638, 436, 435, -635, -730, -730, -730, -730, -730, + -730, -730, -730, -730, -730, -730, -730, -730, -730, 409, + -633, -730, -730, -730, -632, 694, -638, -633, 412, -730, + 649, -632, -730, 651, 650, 652, -103, -730, 415, -730, + -351, -730, -730, -730, -730, -730, -730, -730, 233, -730, + -730, -730, -635, -112, 651, 650, 629, 432, 626, 625, + 624, 634, 627, -636, -730, -730, 562, -107, -104, -730, + -636, 649, 637, 132, -730, 649, -730, 437, 131, -636, + -730, -730, -730, -730, -116, -113, -730, -730, -730, -634, + -730, 651, 650, 657, 632, 487, -634, 489, -730, -730, + -730, -730, -730, 642, 641, 645, 644, 490, -110, 236, + -730, -730, 232, -730, -730, -730, -730, -730, 132, 555, + 275, 276, -631, 131, -301, -119, 520, -636, 553, -631, + 687, -301, 651, 650, 662, 532, 651, 650, 669, 638, + -301, -730, -730, -730, -730, -730, -730, -730, -730, -730, + -730, -730, -730, -730, -730, 274, 273, -730, -730, -730, + -628, 876, -730, -629, 535, -730, 537, -628, -730, -730, + -629, -730, -106, -730, -83, -730, 233, -730, -730, -730, + -730, -730, -730, -730, -630, -730, -730, -730, -301, -115, + 778, -630, 629, 777, 626, 625, 624, 634, 627, 232, + -730, -730, -730, -730, 610, -730, 564, -730, 637, 237, + -310, 611, -730, 548, 688, 486, -730, -310, -310, -310, + -116, 921, -310, -310, -310, 549, -310, 922, 232, 778, + 632, 556, 780, 295, -310, 594, -310, -310, -310, 642, + 641, 645, 644, 237, 592, 285, -310, -310, 232, -310, + -310, -310, -310, -310, 132, 600, -108, 132, 232, 131, + -311, 861, 131, 233, 602, 680, 629, -311, 626, 625, + 624, 559, 627, -117, 678, 638, -311, -310, -310, -310, + -310, -310, -310, -310, -310, -310, -310, -310, -310, -310, + -310, 132, 233, -310, -310, -310, 131, 877, -310, 778, + 565, -310, 780, -105, -310, -310, 258, -310, 237, -310, + 590, -310, 233, -310, -310, -310, -310, -310, -310, -310, + -114, -310, 233, -310, -311, 425, 629, 595, 626, 625, + 624, 634, 627, -311, 226, 227, -310, -310, -310, -310, + -311, -310, 637, -310, 778, 596, -310, 780, -310, -311, + 226, 227, -310, -310, -310, -310, -118, 604, 879, -310, + -310, 1105, -310, 237, 632, 629, 1195, 626, 625, 624, + -310, 627, 656, 642, 641, 645, 644, 135, 136, 137, + 138, 139, -310, -310, -310, -310, -310, -310, -310, -310, + 660, -310, -310, 663, 232, 666, -727, -311, 673, -310, + -310, 1174, 258, 831, -727, 892, 893, 674, -310, 638, + 602, -283, 835, -310, -310, -310, -310, -310, -310, -310, + -310, -310, -310, -310, -310, -310, -310, 931, 935, -310, + -310, -310, 676, 693, 255, 645, 644, -310, 257, 256, + -310, 1133, 1134, 931, 935, -310, 677, -310, -310, -310, + -310, -310, -310, -310, -310, -310, -310, -310, 233, -310, + 681, 237, 685, 686, 629, 285, 626, 625, 624, 634, + 627, 232, -310, -310, 698, -310, 258, -310, 1180, 258, + 637, 258, -730, 258, -310, 733, 237, 1178, -310, -730, + -730, -730, -118, 739, 258, -730, -730, 1146, -730, 626, + 625, 624, 632, 627, 237, 258, -730, -730, 237, 432, + -723, 642, 641, 645, 644, 237, -98, 755, -730, -730, + 232, -730, -730, -730, -730, -730, 255, 1174, 237, 568, + 257, 256, 253, 254, 766, 233, 602, 255, 771, 774, + 237, 257, 256, 253, 254, 237, 782, 638, 537, -730, + -730, -730, -730, -730, -730, -730, -730, -730, -730, -730, + -730, -730, -730, -623, 785, -730, -730, -730, 774, 694, + -623, 774, 774, -730, 812, -723, -730, 818, 821, -623, + 821, -730, 823, -730, 233, -730, -730, -730, -730, -730, + -730, -730, 825, -730, -730, -730, 827, -723, 629, 829, + 626, 625, 624, 840, 627, 841, 847, 848, -730, -730, + -284, -730, 862, -730, 520, 629, 520, 626, 625, 624, + -730, 627, 237, 879, -730, 880, 896, -623, -116, 8, + 87, 88, 89, 12, 80, 899, 831, 278, 81, 82, + 909, 911, -724, 85, -730, 83, 84, 86, 33, 34, + 78, 79, 535, 831, 537, 766, 237, 90, 31, 30, + 120, 119, 121, 122, 258, 629, 22, 626, 625, 624, + 285, 627, 11, 51, 10, 13, 124, 123, 125, 114, + 62, 116, 115, 117, 285, 118, 126, 127, 766, 110, + 111, 258, 47, 48, 46, -626, 255, -730, 935, 774, + 257, 256, -626, 831, -730, 774, 237, -724, 237, -726, + 774, -626, 835, -730, 43, 237, 979, 36, 258, 980, + 64, 65, 237, 989, 66, -285, 38, 237, 994, -724, + 50, -730, 728, 998, 268, 269, 984, 985, 23, 1019, + 986, 126, 127, 107, 97, 99, 100, 101, 103, 1039, + 255, 237, 98, 108, 257, 256, 253, 254, 766, -626, + 91, -730, -283, 95, 102, 104, 1045, 112, 113, 774, + 774, 44, 45, 314, 87, 88, 89, 12, 80, 774, + 774, 774, 81, 82, 237, 1066, 237, 85, 1072, 83, + 84, 86, 33, 34, 78, 79, 250, 237, 821, 839, + 1075, 90, 31, 30, 120, 119, 121, 122, 1077, 1146, + 22, 626, 625, 624, 1079, 627, 11, 51, 316, 13, + 124, 123, 125, 114, 62, 116, 115, 117, 1081, 118, + 126, 127, 1081, 110, 111, 237, 47, 48, 46, 258, + 262, 263, 264, 265, 275, 276, 270, 271, 266, 267, + 1088, 251, 252, -286, 1089, 268, 269, 1090, 43, 1094, + 1097, 318, 237, 237, 64, 65, 237, 237, 66, 1106, + 38, 255, 821, 261, 50, 257, 256, 253, 254, 274, + 273, 259, 23, 260, 821, 1110, 1113, 107, 97, 99, + 100, 101, 103, 1115, 1117, 237, 98, 108, 1119, 272, + 812, 1142, 1143, 1152, 91, 1153, 879, 95, 102, 104, + 1154, 112, 113, 1157, 879, 44, 45, 314, 87, 88, + 89, 12, 80, 1172, 1175, 921, 81, 82, 1181, 774, + 237, 85, 1196, 83, 84, 86, 33, 34, 78, 79, + 135, 136, 137, 138, 139, 90, 31, 30, 120, 119, + 121, 122, 1081, 1081, 22, 1081, 1202, 1205, 821, 682, + 11, 51, 316, 13, 124, 123, 125, 114, 62, 116, + 115, 117, 1207, 118, 126, 127, 1209, 110, 111, 1211, + 47, 48, 46, 258, 262, 263, 264, 265, 275, 276, + 270, 271, 266, 267, 1213, 251, 252, 1213, 771, 268, + 269, 774, 43, 1153, 1205, 36, 1205, -727, 64, 65, + -726, 237, 66, 1081, 38, 255, 1205, 261, 50, 257, + 256, 253, 254, 274, 273, 259, 23, 260, 1240, 1213, + 1213, 107, 97, 99, 100, 101, 103, 1213, 1213, nil, + 98, 108, nil, 272, nil, -256, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 314, 87, 88, 89, 12, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, 135, 136, 137, 138, 139, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, 682, 11, 51, 316, 13, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, 258, 262, 263, + 264, 265, 275, 276, 270, 271, 266, 267, nil, 251, + 252, nil, nil, 268, 269, nil, 43, nil, nil, 36, + nil, nil, 64, 65, nil, nil, 66, nil, 38, 255, + nil, 261, 50, 257, 256, 253, 254, 274, 273, 259, + 23, 260, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, 272, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 314, 87, 88, 89, 12, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, 135, 136, + 137, 138, 139, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 51, + 316, 13, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, 258, 262, 263, 264, 265, 275, 276, 270, 271, + 266, 267, nil, 251, 252, nil, nil, 268, 269, nil, + 43, nil, nil, 318, nil, nil, 64, 65, nil, nil, + 66, nil, 38, 255, nil, 261, 50, 257, 256, 253, + 254, 274, 273, 259, 23, 260, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, 272, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 314, + 87, 88, 89, 12, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 51, 316, 13, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, 258, 262, 263, 264, 265, + 275, 276, 270, 271, 266, 267, nil, 251, 252, nil, + nil, 268, 269, nil, 43, nil, nil, 318, nil, nil, + 64, 65, nil, nil, 66, nil, 38, 255, nil, 261, + 50, 257, 256, 253, 254, 274, 273, 259, 23, 260, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, 237, 272, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 314, 87, 88, 89, 12, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 51, 316, 13, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, 258, + 262, 263, 264, 265, 275, 276, 270, 271, 266, 267, + nil, 251, 252, nil, nil, 268, 269, nil, 43, nil, + nil, 36, nil, nil, 64, 65, nil, nil, 66, nil, + 38, 255, nil, 261, 50, 257, 256, 253, 254, 274, + 273, 259, 23, 260, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, 272, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 314, 87, 88, + 89, 12, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 51, 316, 13, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, 258, 262, 263, 264, 265, 275, 276, + 270, 271, 266, 267, nil, 251, 252, nil, nil, 268, + 269, nil, 43, nil, nil, 36, nil, nil, 64, 65, + nil, nil, 66, nil, 38, 255, nil, 261, 50, 257, + 256, 253, 254, 274, 273, 259, 23, 260, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, 272, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 314, 87, 88, 89, 12, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 51, 316, 13, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, 258, 262, 263, + 264, 265, 275, 276, 270, 271, 266, 267, nil, 251, + 252, nil, nil, 268, 269, nil, 43, nil, nil, 36, + nil, nil, 64, 65, nil, nil, 66, nil, 38, 255, + nil, 261, 50, 257, 256, 253, 254, 274, 273, 259, + 23, 260, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, 272, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 314, 87, 88, 89, 12, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, 629, 22, 626, 625, 624, nil, 627, 11, 51, + 316, 13, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, 629, nil, 626, 625, 624, nil, 627, nil, 831, + nil, nil, nil, nil, nil, nil, nil, nil, 835, nil, + 43, nil, nil, 36, nil, nil, 64, 65, nil, nil, + 66, nil, 38, nil, nil, nil, 50, nil, nil, 831, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 314, + 87, 88, 89, 12, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 51, 316, 13, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, 258, 262, 263, 264, 265, + 275, 276, 270, 271, 266, 267, nil, -754, -754, nil, + nil, 268, 269, nil, 43, nil, nil, 36, nil, nil, + 64, 65, nil, nil, 66, nil, 38, 255, nil, 261, + 50, 257, 256, 253, 254, 274, 273, 259, 23, 260, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 314, 87, 88, 89, 12, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 51, 316, 13, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, 258, + 262, 263, 264, 265, 275, 276, 270, 271, 266, 267, + nil, -754, -754, nil, nil, 268, 269, nil, 43, nil, + nil, 36, nil, nil, 64, 65, nil, nil, 66, nil, + 38, 255, nil, 261, 50, 257, 256, 253, 254, 274, + 273, 259, 23, 260, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 8, 87, 88, + 89, 12, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 51, 10, 13, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, 258, 262, 263, 264, 265, 275, 276, + 270, 271, 266, 267, nil, -754, -754, nil, nil, 268, + 269, nil, 43, nil, nil, 36, nil, nil, 64, 65, + nil, nil, 66, nil, 38, 255, nil, 261, 50, 257, + 256, 253, 254, 274, 273, 259, 23, 260, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 314, 87, 88, 89, 12, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 51, 316, 13, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, 258, 262, 263, + 264, 265, 275, 276, 270, 271, 266, 267, nil, -754, + -754, nil, nil, 268, 269, nil, 43, nil, nil, 36, + nil, nil, 64, 65, nil, nil, 66, nil, 38, 255, + nil, 261, 50, 257, 256, 253, 254, 274, 273, 259, + 23, 260, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 314, 87, 88, 89, 12, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 51, + 316, 13, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, 258, -754, -754, -754, -754, 275, 276, nil, nil, + -754, -754, nil, nil, nil, nil, nil, 268, 269, nil, + 43, nil, nil, 36, nil, nil, 64, 65, nil, nil, + 66, nil, 38, 255, nil, 261, 50, 257, 256, 253, + 254, 274, 273, 259, 23, 260, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 314, + 87, 88, 89, 12, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 51, 316, 13, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, 258, -754, -754, -754, -754, + 275, 276, nil, nil, -754, -754, nil, nil, nil, nil, + nil, 268, 269, nil, 43, nil, nil, 36, nil, nil, + 64, 65, nil, nil, 66, nil, 38, 255, nil, 261, + 50, 257, 256, 253, 254, 274, 273, 259, 23, 260, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 314, 87, 88, 89, 12, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 51, 316, 13, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, 258, + -754, -754, -754, -754, 275, 276, nil, nil, -754, -754, + nil, nil, nil, nil, nil, 268, 269, nil, 43, nil, + nil, 36, nil, nil, 64, 65, nil, nil, 66, nil, + 38, 255, nil, 261, 50, 257, 256, 253, 254, 274, + 273, 259, 23, 260, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 314, 87, 88, + 89, 12, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 51, 316, 13, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, 258, -754, -754, -754, -754, 275, 276, + nil, nil, -754, -754, nil, nil, nil, nil, nil, 268, + 269, nil, 43, nil, nil, 36, nil, nil, 64, 65, + nil, nil, 66, nil, 38, 255, nil, 261, 50, 257, + 256, 253, 254, 274, 273, 259, 23, 260, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 314, 87, 88, 89, 12, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 51, 316, 13, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, 258, -754, -754, + -754, -754, 275, 276, nil, nil, -754, -754, nil, nil, + nil, nil, nil, 268, 269, nil, 43, nil, nil, 36, + nil, nil, 64, 65, nil, nil, 66, nil, 38, 255, + nil, 261, 50, 257, 256, 253, 254, 274, 273, 259, + 23, 260, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 314, 87, 88, 89, 12, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 51, + 316, 13, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, 258, -754, -754, -754, -754, 275, 276, nil, nil, + -754, -754, nil, nil, nil, nil, nil, 268, 269, nil, + 43, nil, nil, 36, nil, nil, 64, 65, nil, nil, + 66, nil, 38, 255, nil, 261, 50, 257, 256, 253, + 254, 274, 273, 259, 23, 260, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 314, + 87, 88, 89, 12, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 51, 316, 13, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, 258, 262, 263, 264, 265, + 275, 276, nil, nil, 266, 267, nil, nil, nil, nil, + nil, 268, 269, nil, 43, nil, nil, 36, nil, nil, + 64, 65, nil, nil, 66, nil, 38, 255, nil, 261, + 50, 257, 256, 253, 254, 274, 273, 259, 23, 260, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 314, 87, 88, 89, 12, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 51, 316, 13, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, 258, + 262, 263, 264, 265, 275, 276, 270, nil, 266, 267, + nil, nil, nil, nil, nil, 268, 269, nil, 43, nil, + nil, 36, nil, nil, 64, 65, nil, nil, 66, nil, + 38, 255, nil, 261, 50, 257, 256, 253, 254, 274, + 273, 259, 23, 260, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 314, 87, 88, + 89, 12, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 51, 316, 13, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, 258, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 268, + 269, nil, 43, nil, nil, 36, nil, nil, 64, 65, + nil, nil, 66, nil, 38, 255, nil, 261, 50, 257, + 256, 253, 254, nil, nil, 259, 23, 260, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 314, 87, 88, 89, 12, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 51, 316, 13, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, 258, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 268, 269, nil, 43, nil, nil, 36, + nil, nil, 64, 65, nil, nil, 66, nil, 38, 255, + nil, 261, 50, 257, 256, 253, 254, nil, nil, 259, + 23, 260, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 314, 87, 88, 89, 12, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 51, + 316, 13, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, 258, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 268, 269, nil, + 43, nil, nil, 36, nil, nil, 64, 65, nil, nil, + 66, nil, 38, 255, nil, 261, 50, 257, 256, 253, + 254, nil, nil, nil, 23, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 314, + 87, 88, 89, 12, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 51, 316, 13, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, 258, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 268, 269, nil, 43, nil, nil, 36, nil, nil, + 64, 65, nil, nil, 66, nil, 38, 255, nil, 261, + 50, 257, 256, 253, 254, nil, nil, nil, 23, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 314, 87, 88, 89, 12, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 51, 316, 13, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 64, 65, nil, nil, 66, nil, + 38, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 314, 87, 88, + 89, 12, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 51, 316, 13, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 64, 65, + nil, nil, 66, nil, 38, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 314, 87, 88, 89, 12, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 51, 316, 13, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 43, nil, nil, 36, + nil, nil, 64, 65, nil, nil, 66, nil, 38, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 314, 87, 88, 89, 12, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 51, + 316, 13, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, 36, nil, nil, 64, 65, nil, nil, + 66, nil, 38, nil, nil, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, 12, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 33, 34, 78, + 79, nil, nil, nil, nil, nil, 90, 31, 30, 120, + 119, 121, 122, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 51, 10, 13, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 64, + 65, nil, nil, 66, nil, 38, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, -445, 112, + 113, nil, nil, 44, 45, -445, -445, -445, nil, nil, + -445, -445, -445, 629, -445, 626, 625, 624, 634, 627, + nil, nil, -445, -445, -445, -445, nil, nil, nil, 637, + nil, nil, nil, nil, -445, -445, nil, -445, -445, -445, + -445, -445, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 632, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 645, 644, nil, -445, -445, -445, -445, -445, + -445, -445, -445, -445, -445, -445, -445, -445, -445, nil, + nil, -445, -445, -445, nil, nil, -445, nil, 285, -445, + nil, nil, -445, -445, nil, -445, 638, -445, nil, -445, + nil, -445, -445, -445, -445, -445, -445, -445, nil, -445, + -445, -445, 629, nil, 626, 625, 624, 634, 627, nil, + nil, nil, nil, nil, -445, -445, nil, -445, 637, -445, + -319, nil, nil, nil, nil, nil, -445, -319, -319, -319, + -445, nil, -319, -319, -319, nil, -319, nil, nil, nil, + 632, nil, nil, nil, -319, nil, -319, -319, nil, 642, + 641, 645, 644, nil, nil, nil, -319, -319, nil, -319, + -319, -319, -319, -319, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 237, nil, nil, + nil, nil, nil, nil, nil, 638, nil, -319, -319, -319, + -319, -319, -319, -319, -319, -319, -319, -319, -319, -319, + -319, nil, nil, -319, -319, -319, nil, nil, -319, nil, + 295, -319, nil, nil, -319, -319, nil, -319, nil, -319, + nil, -319, nil, -319, -319, -319, -319, -319, -319, -319, + nil, -319, nil, -319, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, -319, -319, nil, -319, + nil, -319, 87, 88, 89, nil, 80, nil, -319, nil, + 81, 82, -319, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, 307, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, 304, nil, + 302, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 305, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, 308, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 33, 34, 78, 79, nil, nil, nil, + nil, nil, 90, 31, 30, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, 307, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, 304, nil, 302, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 305, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, 308, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, 307, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, 304, nil, 302, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 305, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + 308, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 333, + 334, 78, 79, nil, nil, nil, nil, nil, 90, 330, + 336, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 333, 334, 78, 79, nil, nil, nil, nil, + nil, 90, 330, 336, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + nil, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 333, 334, 78, 79, nil, + nil, nil, nil, nil, 90, 330, 336, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 333, 334, + 78, 79, nil, nil, nil, nil, nil, 90, 330, 336, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, -302, + 112, 113, nil, nil, 44, 45, -302, -302, -302, nil, + nil, -302, -302, -302, 629, -302, 626, 625, 624, 634, + 627, nil, nil, -302, nil, -302, -302, -302, nil, nil, + 637, 120, 119, 121, 122, -302, -302, nil, -302, -302, + -302, -302, -302, nil, nil, nil, nil, 124, 123, 125, + nil, nil, 632, nil, nil, nil, nil, nil, nil, nil, + 110, 111, nil, 645, 644, 337, -302, -302, -302, -302, + -302, -302, -302, -302, -302, -302, -302, -302, -302, -302, + nil, nil, -302, -302, -302, nil, nil, -302, nil, nil, + -302, nil, nil, -302, -302, nil, -302, 638, -302, nil, + -302, nil, -302, -302, -302, -302, -302, -302, -302, nil, + -302, nil, -302, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, -302, -302, -302, -302, nil, + -302, 91, -302, nil, 95, 102, 104, -302, 112, 113, + -753, -302, 87, 88, 89, 12, 80, -753, -753, -753, + 81, 82, -753, -753, -753, 85, -753, 83, 84, 86, + 33, 34, 78, 79, -753, -753, -753, -753, nil, 90, + 31, 30, 120, 119, 121, 122, -753, -753, 22, -753, + -753, -753, -753, -753, 11, 51, nil, 13, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, -753, -753, -753, + -753, -753, -753, -753, -753, -753, -753, -753, -753, -753, + -753, nil, nil, -753, -753, -753, 43, nil, -753, 36, + 285, -753, 64, 65, -753, -753, 66, -753, 38, -753, + nil, -753, 50, -753, -753, -753, -753, -753, -753, -753, + 23, -753, -753, -753, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, -753, -753, nil, -753, + nil, -753, 91, nil, nil, 95, 102, 104, -753, 112, + 113, nil, -753, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 33, 34, 78, 79, nil, nil, nil, + nil, nil, 90, 31, 30, 120, 119, 121, 122, nil, + nil, 22, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 33, + 34, 78, 79, nil, nil, nil, nil, nil, 90, 31, + 30, 120, 119, 121, 122, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, 132, nil, nil, nil, nil, + 131, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, 12, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 51, 10, 13, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, 36, nil, nil, 64, 65, nil, nil, 66, nil, + 38, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, 425, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 33, 34, 78, 79, nil, + nil, nil, nil, nil, 90, 31, 30, 120, 119, 121, + 122, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 33, 34, 78, 79, nil, nil, nil, nil, nil, + 90, 31, 30, 120, 119, 121, 122, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, nil, nil, nil, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, 12, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 33, 34, 78, + 79, nil, nil, nil, nil, nil, 90, 31, 30, 120, + 119, 121, 122, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 51, nil, 13, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, 36, nil, nil, 64, + 65, nil, nil, 66, nil, 38, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, 442, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 33, 34, 78, 79, nil, nil, nil, + nil, nil, 90, 31, 30, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, 442, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 33, + 34, 78, 79, nil, nil, nil, nil, nil, 90, 31, + 30, 120, 119, 121, 122, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + nil, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 33, 34, 78, 79, nil, + nil, nil, nil, nil, 90, 31, 30, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, 307, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, 304, nil, 302, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 305, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, 308, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 33, 34, 78, 79, nil, nil, nil, nil, nil, + 90, 31, 30, 120, 119, 121, 122, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, nil, nil, nil, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + 237, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 333, 334, 78, 79, nil, nil, nil, nil, nil, 90, + 330, 336, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 333, + 334, 78, 79, nil, nil, nil, nil, nil, 90, 330, + 336, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 333, 334, 78, 79, nil, nil, nil, nil, + nil, 90, 330, 336, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + nil, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 333, 334, 78, 79, nil, + nil, nil, nil, nil, 90, 330, 336, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 333, 334, + 78, 79, nil, nil, nil, nil, nil, 90, 330, 336, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 333, 334, 78, 79, nil, nil, + nil, nil, nil, 90, 330, 336, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, nil, nil, nil, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 333, 334, 78, 79, nil, nil, nil, nil, nil, 90, + 330, 336, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 333, + 334, 78, 79, nil, nil, nil, nil, nil, 90, 330, + 336, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 333, 334, 78, 79, nil, nil, nil, nil, + nil, 90, 330, 336, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + nil, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 333, 334, 78, 79, nil, + nil, nil, nil, nil, 90, 330, 336, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 333, 334, + 78, 79, nil, nil, nil, nil, nil, 90, 330, 336, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 333, 334, 78, 79, nil, nil, + nil, nil, nil, 90, 330, 336, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, nil, nil, nil, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 333, 334, 78, 79, nil, nil, nil, nil, nil, 90, + 330, 336, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 33, + 34, 78, 79, nil, nil, nil, nil, nil, 90, 31, + 30, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, 307, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, 304, nil, 302, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 305, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, 308, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 522, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, 307, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + 304, nil, 302, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 305, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, 308, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 33, 34, 78, 79, nil, + nil, nil, nil, nil, 90, 31, 30, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, 307, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, 304, nil, 302, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 305, 99, 100, 101, 103, nil, nil, nil, 98, + 108, 237, nil, nil, nil, nil, nil, 91, nil, 308, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 333, 334, + 78, 79, nil, nil, nil, nil, nil, 90, 330, 336, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 333, 334, 78, 79, nil, nil, + nil, nil, nil, 90, 330, 336, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, nil, nil, nil, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, 12, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 51, nil, 13, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 43, nil, nil, 36, + nil, nil, 64, 65, nil, nil, 66, nil, 38, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, 568, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 333, + 334, 78, 79, nil, nil, nil, nil, nil, 90, 330, + 336, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, 307, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, 304, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 305, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, 308, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 333, 334, 78, 79, nil, nil, nil, nil, + nil, 90, 330, 336, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, 307, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + nil, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 305, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, 308, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 33, 34, 78, 79, nil, + nil, nil, nil, nil, 90, 31, 30, 120, 119, 121, + 122, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, -731, + 112, 113, nil, nil, 44, 45, -731, -731, -731, nil, + nil, -731, -731, -731, 629, -731, 626, 625, 624, 634, + 627, nil, nil, -731, -731, -731, -731, -731, nil, nil, + 637, nil, nil, nil, nil, -731, -731, nil, -731, -731, + -731, -731, -731, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 632, nil, nil, nil, nil, nil, nil, nil, + nil, 642, 641, 645, 644, nil, -731, -731, -731, -731, + -731, -731, -731, -731, -731, -731, -731, -731, -731, -731, + nil, nil, -731, -731, -731, nil, nil, -731, nil, nil, + -731, nil, nil, -731, -731, nil, -731, 638, -731, nil, + -731, nil, -731, -731, -731, -731, -731, -731, -731, nil, + -731, -731, -731, 629, nil, 626, 625, 624, 634, 627, + nil, nil, nil, nil, nil, -731, -731, -731, -731, 637, + -731, -732, -731, nil, nil, nil, nil, -731, -732, -732, + -732, -731, nil, -732, -732, -732, nil, -732, nil, nil, + nil, 632, nil, nil, nil, -732, -732, -732, -732, -732, + nil, nil, 645, 644, nil, nil, nil, -732, -732, nil, + -732, -732, -732, -732, -732, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 638, nil, -732, -732, + -732, -732, -732, -732, -732, -732, -732, -732, -732, -732, + -732, -732, nil, nil, -732, -732, -732, nil, nil, -732, + nil, nil, -732, nil, nil, -732, -732, nil, -732, nil, + -732, nil, -732, nil, -732, -732, -732, -732, -732, -732, + -732, nil, -732, -732, -732, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, -732, -732, -732, + -732, nil, -732, nil, -732, nil, 87, 88, 89, -732, + 80, nil, nil, -732, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + 307, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, 304, nil, 302, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 305, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, 308, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 333, 334, 78, 79, nil, nil, nil, nil, nil, 90, + 330, 336, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, -753, 112, 113, nil, nil, 44, 45, -753, -753, + -753, nil, nil, -753, -753, -753, nil, -753, 120, 119, + 121, 122, nil, nil, nil, -753, -753, -753, nil, nil, + nil, nil, nil, nil, 124, 123, 125, -753, -753, nil, + -753, -753, -753, -753, -753, nil, nil, 110, 111, nil, + nil, nil, 337, nil, nil, nil, nil, nil, 629, nil, + 626, 625, 624, 634, 627, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 637, nil, nil, nil, nil, -753, + nil, nil, nil, nil, nil, nil, -753, nil, nil, nil, + nil, 285, -753, nil, nil, nil, 632, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, 645, 644, nil, + 98, 108, nil, -753, -753, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, -753, nil, 87, + 88, 89, -753, 80, nil, nil, nil, 81, 82, -753, + nil, 638, 85, -753, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 333, 334, 78, 79, nil, nil, nil, nil, nil, 90, + 330, 336, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, 307, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, 748, nil, + 302, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 305, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, 308, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, 307, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, 302, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 305, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, 308, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, 12, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 33, + 34, 78, 79, nil, nil, nil, nil, nil, 90, 31, + 30, 120, 119, 121, 122, nil, nil, 22, nil, nil, + nil, nil, nil, 11, 51, 316, 13, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 43, nil, nil, 36, nil, + nil, 64, 65, nil, nil, 66, nil, 38, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + 425, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, 307, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + 304, nil, 302, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 305, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, 308, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 333, 334, 78, 79, nil, + nil, nil, nil, nil, 90, 330, 336, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 333, 334, + 78, 79, nil, nil, nil, nil, nil, 90, 330, 336, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 33, 34, 78, 79, nil, nil, nil, nil, nil, + 90, 31, 30, 120, 119, 121, 122, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + 307, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, 304, nil, 302, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 305, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, 308, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 33, 34, 78, + 79, nil, nil, nil, nil, nil, 90, 31, 30, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, 307, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, 304, nil, 302, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 305, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, 308, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, 12, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 51, nil, 13, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, 36, nil, nil, 64, 65, + nil, nil, 66, nil, 38, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 333, + 334, 78, 79, nil, nil, nil, nil, nil, 90, 330, + 336, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, 853, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + nil, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 33, 34, 78, 79, nil, + nil, nil, nil, nil, 90, 31, 30, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, 307, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, 304, nil, 302, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 305, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, 308, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, 12, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 51, nil, 13, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43, nil, nil, 36, nil, nil, + 64, 65, nil, nil, 66, nil, 38, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 333, 334, 78, 79, nil, nil, + nil, nil, nil, 90, 330, 336, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + 307, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, 748, nil, 302, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 305, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, 308, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, 307, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, 302, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 305, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, 308, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 33, 34, 78, 79, nil, nil, nil, + nil, nil, 90, 31, 30, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 33, 34, 78, 79, + nil, nil, nil, nil, nil, 90, 31, 30, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 33, + 34, 78, 79, nil, nil, nil, nil, nil, 90, 31, + 30, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 333, 334, 78, 79, nil, nil, nil, nil, + nil, 90, 330, 336, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, 307, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + 748, nil, 302, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 305, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, 308, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 522, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 333, 334, 78, 79, nil, + nil, nil, nil, nil, 90, 330, 336, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 333, 334, + 78, 79, nil, nil, nil, nil, nil, 90, 330, 336, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, 442, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 333, 334, 78, 79, nil, nil, + nil, nil, nil, 90, 330, 336, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + 307, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, 748, nil, nil, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 305, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, 308, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, 307, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 305, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, 308, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 333, 334, 78, 79, nil, nil, nil, nil, nil, 90, + 330, 336, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, 942, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 247, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 33, 34, 78, 79, nil, nil, nil, + nil, nil, 90, 31, 30, 120, 119, 121, 122, nil, + nil, 22, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 333, + 334, 78, 79, nil, nil, nil, nil, nil, 90, 330, + 336, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 33, 34, 78, 79, nil, nil, nil, nil, + nil, 90, 31, 30, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + nil, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 333, 334, 78, 79, nil, + nil, nil, nil, nil, 90, 330, 336, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 247, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 333, 334, + 78, 79, nil, nil, nil, nil, nil, 90, 330, 336, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 247, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 333, 334, 78, 79, nil, nil, + nil, nil, nil, 90, 330, 336, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, nil, nil, nil, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 51, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, 47, 48, 46, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 242, nil, nil, 248, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 44, 45, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 33, 34, 78, 79, nil, nil, nil, nil, nil, 90, + 31, 30, 120, 119, 121, 122, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 51, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, 47, 48, 46, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 242, nil, nil, 248, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, 50, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 44, 45, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, nil, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 51, nil, + nil, 124, 123, 125, 114, 62, 116, 115, 117, nil, + 118, 126, 127, nil, 110, 111, nil, 47, 48, 46, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 242, + nil, nil, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 44, 45, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 51, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, 307, 118, 126, 127, nil, 110, 111, nil, + 47, 48, 46, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 242, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, 302, nil, 50, nil, + nil, nil, nil, nil, nil, nil, 247, nil, nil, nil, + nil, 107, 305, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + 308, 95, 102, 104, nil, 112, 113, nil, nil, 44, + 45, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 333, + 334, 78, 79, nil, nil, nil, nil, nil, 90, 330, + 336, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, 47, 48, 46, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 242, nil, nil, 248, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 44, 45, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, nil, 83, + 84, 86, 333, 334, 78, 79, nil, nil, nil, nil, + nil, 90, 330, 336, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, 47, 48, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 242, nil, + nil, 248, nil, nil, 64, 65, nil, nil, 66, nil, + 1137, nil, nil, nil, 50, nil, nil, nil, nil, nil, + nil, nil, 247, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 44, 45, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 33, 34, 78, 79, nil, + nil, nil, nil, nil, 90, 31, 30, 120, 119, 121, + 122, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, 47, + 48, 46, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 44, 45, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 33, 34, + 78, 79, nil, nil, nil, nil, nil, 90, 31, 30, + 120, 119, 121, 122, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, 47, 48, 46, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 242, nil, nil, 248, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 44, 45, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, nil, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, 47, 48, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 242, nil, nil, + 248, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 247, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 44, 45, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 33, 34, 78, 79, nil, nil, + nil, nil, nil, 90, 31, 30, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 51, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + 307, 118, 126, 127, nil, 110, 111, nil, 47, 48, + 46, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 242, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, 304, nil, 302, nil, 50, nil, nil, nil, + nil, nil, nil, nil, 247, nil, nil, nil, nil, 107, + 305, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, 308, 95, + 102, 104, nil, 112, 113, nil, nil, 44, 45, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 331, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, nil, nil, 337, nil, nil, nil, nil, nil, 629, + nil, 626, 625, 624, 634, 627, nil, nil, nil, nil, + nil, nil, nil, 327, nil, 637, 323, nil, nil, 64, + 65, nil, nil, 66, nil, 322, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 632, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, 645, 644, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, 638, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 331, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + nil, nil, 337, nil, nil, nil, nil, nil, 629, nil, + 626, 625, 624, 634, 627, nil, nil, nil, nil, nil, + nil, nil, 327, nil, 637, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 632, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, 645, 644, nil, + 98, 108, nil, nil, nil, 339, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, 638, 83, 84, 86, 333, 334, 78, 79, nil, + nil, nil, nil, nil, 90, 330, 336, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 331, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, nil, + nil, 337, nil, nil, nil, nil, nil, 629, nil, 626, + 625, 624, 634, 627, nil, nil, nil, nil, nil, nil, + nil, 369, nil, 637, 36, nil, nil, 64, 65, nil, + nil, 66, nil, 38, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 632, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, 645, 644, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + 638, 83, 84, 86, 333, 334, 78, 79, nil, nil, + nil, nil, nil, 90, 330, 336, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 331, + nil, nil, 124, 123, 125, 374, 62, 116, 115, 375, + nil, 118, 126, 127, nil, 110, 111, nil, nil, nil, + 337, nil, nil, nil, nil, nil, 629, nil, 626, 625, + 624, 634, 627, nil, nil, nil, nil, 381, nil, nil, + 376, nil, 637, 248, nil, nil, 64, 65, nil, nil, + 66, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 632, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, 645, 644, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, 87, 88, 89, nil, 80, + nil, nil, nil, 81, 82, nil, nil, nil, 85, 638, + 83, 84, 86, 333, 334, 78, 79, nil, nil, nil, + nil, nil, 90, 330, 336, 120, 119, 121, 122, nil, + nil, 249, nil, nil, nil, nil, nil, nil, 331, nil, + nil, 124, 123, 125, 374, 62, 116, 115, 375, nil, + 118, 126, 127, nil, 110, 111, nil, nil, nil, 337, + nil, nil, nil, nil, nil, 629, nil, 626, 625, 624, + 634, 627, nil, nil, nil, nil, nil, nil, nil, 376, + nil, 637, 248, nil, nil, 64, 65, nil, nil, 66, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 632, nil, nil, nil, nil, 107, 97, + 99, 100, 101, 103, 645, 644, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, 87, 88, 89, nil, 80, nil, + nil, nil, 81, 82, nil, nil, nil, 85, 638, 83, + 84, 86, 333, 334, 78, 79, nil, nil, nil, nil, + nil, 90, 330, 336, 120, 119, 121, 122, nil, nil, + 249, nil, nil, nil, nil, nil, nil, 331, nil, nil, + 124, 123, 125, 114, 62, 116, 115, 117, nil, 118, + 126, 127, nil, 110, 111, nil, nil, nil, 337, nil, + nil, nil, nil, nil, 629, nil, 626, 625, 624, 634, + 627, nil, nil, nil, nil, nil, nil, nil, 327, nil, + 637, 248, nil, nil, 64, 65, nil, nil, 66, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 632, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, 645, 644, nil, 98, 108, nil, nil, + nil, 551, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, 87, 88, 89, nil, 80, nil, nil, + nil, 81, 82, nil, nil, nil, 85, 638, 83, 84, + 86, 333, 334, 78, 79, nil, nil, nil, nil, nil, + 90, 330, 336, 120, 119, 121, 122, nil, nil, 249, + nil, nil, nil, nil, nil, nil, 331, nil, nil, 124, + 123, 125, 114, 62, 116, 115, 117, nil, 118, 126, + 127, nil, 110, 111, nil, nil, nil, 337, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 327, nil, nil, + 323, nil, nil, 64, 65, nil, nil, 66, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, 87, 88, 89, nil, 80, nil, nil, nil, + 81, 82, nil, nil, nil, 85, nil, 83, 84, 86, + 333, 334, 78, 79, nil, nil, nil, nil, nil, 90, + 330, 336, 120, 119, 121, 122, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 331, nil, nil, 124, 123, + 125, 114, 62, 116, 115, 117, nil, 118, 126, 127, + nil, 110, 111, nil, nil, nil, 337, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 327, nil, nil, 323, + nil, nil, 64, 65, nil, nil, 66, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, 87, 88, 89, nil, 80, nil, nil, nil, 81, + 82, nil, nil, nil, 85, nil, 83, 84, 86, 333, + 334, 78, 79, nil, nil, nil, nil, nil, 90, 330, + 336, 120, 119, 121, 122, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 331, nil, nil, 124, 123, 125, + 114, 62, 116, 115, 117, nil, 118, 126, 127, nil, + 110, 111, nil, nil, nil, 337, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 327, nil, nil, 323, nil, + nil, 64, 65, nil, nil, 66, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + 87, 88, 89, nil, 80, nil, nil, nil, 81, 82, + nil, nil, nil, 85, nil, 83, 84, 86, 333, 334, + 78, 79, nil, nil, nil, nil, nil, 90, 330, 336, + 120, 119, 121, 122, nil, nil, 249, nil, nil, nil, + nil, nil, nil, 331, nil, nil, 124, 123, 125, 114, + 62, 116, 115, 117, nil, 118, 126, 127, nil, 110, + 111, nil, nil, nil, 337, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 327, nil, nil, 323, nil, nil, + 64, 65, nil, nil, 66, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, 87, + 88, 89, nil, 80, nil, nil, nil, 81, 82, nil, + nil, nil, 85, nil, 83, 84, 86, 333, 334, 78, + 79, nil, nil, nil, nil, nil, 90, 330, 336, 120, + 119, 121, 122, nil, nil, 249, nil, nil, nil, nil, + nil, nil, 331, nil, nil, 124, 123, 125, 114, 62, + 116, 115, 117, nil, 118, 126, 127, nil, 110, 111, + nil, nil, nil, 337, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 327, nil, nil, 323, nil, nil, 64, + 65, nil, nil, 66, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, 87, 88, + 89, nil, 80, nil, nil, nil, 81, 82, nil, nil, + nil, 85, nil, 83, 84, 86, 333, 334, 78, 79, + nil, nil, nil, nil, nil, 90, 330, 336, 120, 119, + 121, 122, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 331, nil, nil, 124, 123, 125, 114, 62, 116, + 115, 117, nil, 118, 126, 127, nil, 110, 111, nil, + nil, nil, 337, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1121, nil, nil, 248, nil, nil, 64, 65, + nil, nil, 66, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + nil, 95, 102, 104, nil, 112, 113, 87, 88, 89, + nil, 80, nil, nil, nil, 81, 82, nil, nil, nil, + 85, nil, 83, 84, 86, 333, 334, 78, 79, nil, + nil, nil, nil, nil, 90, 330, 336, 120, 119, 121, + 122, nil, nil, 249, nil, nil, nil, nil, nil, nil, + 331, nil, nil, 124, 123, 125, 114, 62, 116, 115, + 117, nil, 118, 126, 127, nil, 110, 111, nil, nil, + nil, 337, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1128, nil, nil, 248, nil, nil, 64, 65, nil, + nil, 66, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, 87, 88, 89, nil, + 80, nil, nil, nil, 81, 82, nil, nil, nil, 85, + nil, 83, 84, 86, 333, 334, 78, 79, nil, nil, + nil, nil, nil, 90, 330, 336, 120, 119, 121, 122, + nil, nil, 249, nil, nil, nil, nil, nil, nil, 331, + nil, nil, 124, 123, 125, 114, 62, 116, 115, 117, + nil, 118, 126, 127, nil, 110, 111, nil, nil, nil, + 337, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1121, nil, nil, 248, nil, nil, 64, 65, nil, nil, + 66, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, 190, 201, 191, 214, 187, + 207, 197, 196, 217, 218, 212, 195, 194, 189, 215, + 219, 220, 199, 188, 202, 206, 208, 200, 193, nil, + nil, nil, 209, 216, 211, 210, 203, 213, 198, 186, + 205, 204, nil, nil, nil, nil, nil, 185, 192, 183, + 184, 180, 181, 182, 143, 145, 142, nil, 144, nil, + nil, nil, nil, nil, nil, nil, nil, 175, 176, nil, + 171, 153, 154, 155, 162, 159, 161, nil, nil, 156, + 157, nil, nil, nil, 177, 178, 163, 164, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 168, 167, nil, 152, 174, 170, 169, 165, 166, + 160, 158, 150, 173, 151, nil, nil, 179, 107, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 108, nil, + nil, nil, nil, nil, nil, nil, nil, 172, 190, 201, + 191, 214, 187, 207, 197, 196, 217, 218, 212, 195, + 194, 189, 215, 219, 220, 199, 188, 202, 206, 208, + 200, 193, nil, nil, nil, 209, 216, 211, 210, 203, + 213, 198, 186, 205, 204, nil, nil, nil, nil, nil, + 185, 192, 183, 184, 180, 181, 182, 143, 145, nil, + nil, 144, nil, nil, nil, nil, nil, nil, nil, nil, + 175, 176, nil, 171, 153, 154, 155, 162, 159, 161, + nil, nil, 156, 157, nil, nil, nil, 177, 178, 163, + 164, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 168, 167, nil, 152, 174, 170, + 169, 165, 166, 160, 158, 150, 173, 151, nil, nil, + 179, 107, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 108, nil, nil, nil, nil, nil, nil, nil, nil, + 172, 190, 201, 191, 214, 187, 207, 197, 196, 217, + 218, 212, 195, 194, 189, 215, 219, 220, 199, 188, + 202, 206, 208, 200, 193, nil, nil, nil, 209, 216, + 211, 392, 391, 393, 390, 186, 205, 204, nil, nil, + nil, nil, nil, 185, 192, 183, 184, 387, 388, 389, + 385, 145, 116, 115, 386, nil, 118, nil, nil, nil, + nil, nil, nil, 175, 176, nil, 171, 153, 154, 155, + 162, 159, 161, nil, nil, 156, 157, nil, nil, nil, + 177, 178, 163, 164, nil, nil, nil, nil, nil, 397, + nil, nil, nil, nil, nil, nil, nil, 168, 167, nil, + 152, 174, 170, 169, 165, 166, 160, 158, 150, 173, + 151, nil, nil, 179, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 172, 190, 201, 191, 214, 187, 207, + 197, 196, 217, 218, 212, 195, 194, 189, 215, 219, + 220, 199, 188, 202, 206, 208, 200, 193, nil, nil, + nil, 209, 216, 211, 210, 203, 213, 198, 186, 205, + 204, nil, nil, nil, nil, nil, 185, 192, 183, 184, + 180, 181, 182, 143, 145, 422, 421, 144, nil, 423, + nil, nil, nil, nil, nil, nil, 175, 176, nil, 171, + 153, 154, 155, 162, 159, 161, nil, nil, 156, 157, + nil, nil, nil, 177, 178, 163, 164, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 168, 167, nil, 152, 174, 170, 169, 165, 166, 160, + 158, 150, 173, 151, nil, nil, 179, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 172, 190, 201, 191, + 214, 187, 207, 197, 196, 217, 218, 212, 195, 194, + 189, 215, 219, 220, 199, 188, 202, 206, 208, 200, + 193, nil, nil, nil, 209, 216, 211, 210, 203, 213, + 198, 186, 205, 204, nil, nil, nil, nil, nil, 185, + 192, 183, 184, 180, 181, 182, 143, 145, nil, nil, + 144, nil, nil, nil, nil, nil, nil, nil, nil, 175, + 176, nil, 171, 153, 154, 155, 162, 159, 161, nil, + nil, 156, 157, nil, nil, nil, 177, 178, 163, 164, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 168, 167, nil, 152, 174, 170, 169, + 165, 166, 160, 158, 150, 173, 151, nil, nil, 179, + 107, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 108, nil, nil, nil, nil, nil, nil, nil, nil, 172, + 190, 201, 191, 214, 187, 207, 197, 196, 217, 218, + 212, 195, 194, 189, 215, 219, 220, 199, 188, 202, + 206, 208, 200, 193, nil, nil, nil, 209, 216, 211, + 210, 203, 213, 198, 186, 205, 204, nil, nil, nil, + nil, nil, 185, 192, 183, 184, 180, 181, 182, 143, + 145, nil, nil, 144, nil, nil, nil, nil, nil, nil, + nil, nil, 175, 176, nil, 171, 153, 154, 155, 162, + 159, 161, nil, nil, 156, 157, nil, nil, nil, 177, + 178, 163, 164, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 168, 167, nil, 152, + 174, 170, 169, 165, 166, 160, 158, 150, 173, 151, + nil, nil, 179, 107, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 108, nil, nil, nil, nil, nil, nil, + nil, nil, 172, 190, 201, 191, 214, 187, 207, 197, + 196, 217, 218, 212, 195, 194, 189, 215, 219, 220, + 199, 188, 202, 206, 208, 200, 193, nil, nil, nil, + 209, 216, 211, 210, 203, 213, 198, 186, 205, 204, + nil, nil, nil, nil, nil, 185, 192, 183, 184, 180, + 181, 182, 143, 145, nil, nil, 144, nil, nil, nil, + nil, nil, nil, nil, nil, 175, 176, nil, 171, 153, + 154, 155, 162, 159, 161, nil, nil, 156, 157, nil, + nil, nil, 177, 178, 163, 164, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 168, + 167, nil, 152, 174, 170, 169, 165, 166, 160, 158, + 150, 173, 151, nil, nil, 179, nil, nil, nil, nil, + 120, 119, 121, 122, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 172, 124, 123, 125, 728, + nil, nil, nil, 731, nil, nil, nil, nil, nil, 110, + 111, nil, nil, nil, 337, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 730, nil, nil, 712, nil, nil, + nil, 710, nil, nil, 711, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 729, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 716, 717, 120, 119, 121, 122, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 124, + 123, 125, 728, nil, nil, nil, 731, nil, nil, nil, + nil, nil, 110, 111, nil, nil, nil, 337, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 730, nil, nil, + 712, nil, nil, nil, 710, nil, nil, 711, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 729, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 716, 717, 120, 119, 121, 122, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 124, 123, 125, 728, nil, nil, nil, 731, + 1012, nil, nil, nil, nil, 110, 111, nil, nil, nil, + 337, 637, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 730, nil, nil, 712, nil, nil, nil, 710, nil, nil, + 711, nil, 1006, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 729, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, 638, 95, + 102, 104, nil, 112, 113, nil, nil, 716, 717, 120, + 119, 121, 122, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 124, 123, 125, 728, nil, + nil, nil, 731, 1012, nil, nil, nil, nil, 110, 111, + nil, nil, nil, 337, 637, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 730, nil, nil, 712, nil, nil, nil, + 710, nil, nil, 711, nil, 1006, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 729, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, 638, 95, 102, 104, nil, 112, 113, nil, nil, + 716, 717, 120, 119, 121, 122, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 124, 123, + 125, 728, nil, nil, nil, 731, nil, nil, nil, nil, + nil, 110, 111, nil, nil, nil, 337, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 730, nil, nil, 712, + nil, nil, nil, 710, nil, nil, 711, nil, 1006, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 729, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 716, 717, 120, 119, 121, 122, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 124, 123, 125, 728, nil, nil, nil, 731, nil, + nil, nil, nil, nil, 110, 111, nil, nil, nil, 337, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 730, + nil, nil, 712, nil, nil, nil, 710, nil, nil, 711, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 729, nil, nil, nil, 107, 97, + 99, 100, 101, 103, nil, nil, nil, 98, 108, nil, + nil, nil, nil, nil, nil, 91, nil, nil, 95, 102, + 104, nil, 112, 113, nil, nil, 716, 717, 120, 119, + 121, 122, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 124, 123, 125, 728, nil, nil, + nil, 731, 1012, nil, nil, nil, nil, 110, 111, nil, + nil, nil, 337, 637, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 730, nil, nil, 712, nil, nil, nil, 710, + nil, nil, 711, nil, 1006, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 729, nil, nil, + nil, 107, 97, 99, 100, 101, 103, nil, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + 638, 95, 102, 104, nil, 112, 113, nil, nil, 716, + 717, 120, 119, 121, 122, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 124, 123, 125, + 728, nil, nil, nil, 731, nil, nil, nil, nil, nil, + 110, 111, nil, nil, nil, 337, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 730, nil, nil, 712, nil, + nil, nil, 710, nil, nil, 711, nil, 1093, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 729, nil, nil, nil, 107, 97, 99, 100, 101, 103, + nil, nil, nil, 98, 108, nil, nil, nil, nil, nil, + nil, 91, nil, nil, 95, 102, 104, nil, 112, 113, + nil, nil, 716, 717, 120, 119, 121, 122, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 124, 123, 125, 728, nil, nil, nil, 731, nil, nil, + nil, nil, nil, 110, 111, nil, nil, nil, 337, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 730, nil, + nil, 712, nil, nil, nil, 710, nil, nil, 711, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 729, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, nil, nil, + nil, nil, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, nil, 716, 717, 120, 119, 121, + 122, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 124, 123, 125, 728, nil, nil, nil, + 731, nil, nil, nil, nil, nil, 110, 111, nil, nil, + nil, 337, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 730, nil, nil, 712, nil, nil, nil, 710, nil, + nil, 711, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 729, nil, nil, nil, + 107, 97, 99, 100, 101, 103, nil, nil, nil, 98, + 108, nil, nil, nil, nil, nil, nil, 91, nil, nil, + 95, 102, 104, nil, 112, 113, nil, nil, 716, 717, + 120, 119, 121, 122, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 124, 123, 125, 728, + nil, nil, nil, 731, nil, nil, nil, nil, nil, 110, + 111, nil, nil, nil, 337, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 730, nil, nil, 712, nil, nil, + nil, 710, nil, nil, 711, nil, 1006, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 729, + nil, nil, nil, 107, 97, 99, 100, 101, 103, nil, + nil, nil, 98, 108, nil, nil, nil, nil, nil, nil, + 91, nil, nil, 95, 102, 104, nil, 112, 113, nil, + nil, 716, 717, 120, 119, 121, 122, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 124, + 123, 125, 728, nil, nil, nil, 731, nil, nil, nil, + nil, nil, 110, 111, nil, nil, nil, 337, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 730, nil, nil, + 712, nil, nil, nil, 710, nil, nil, 711, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 729, nil, nil, nil, 107, 97, 99, 100, + 101, 103, nil, nil, nil, 98, 108, nil, nil, nil, + nil, nil, nil, 91, nil, nil, 95, 102, 104, nil, + 112, 113, nil, nil, 716, 717, 120, 119, 121, 122, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 124, 123, 125, 728, nil, nil, nil, 731, + nil, nil, nil, nil, nil, 110, 111, nil, nil, nil, + 337, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 730, nil, nil, 712, nil, nil, nil, 710, nil, nil, + 711, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 729, nil, nil, nil, 107, + 97, 99, 100, 101, 103, nil, nil, nil, 98, 108, + nil, nil, nil, nil, nil, nil, 91, nil, nil, 95, + 102, 104, nil, 112, 113, nil, nil, 716, 717, 120, + 119, 121, 122, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 124, 123, 125, 728, nil, + nil, nil, 731, nil, nil, nil, nil, nil, 110, 111, + nil, nil, nil, 337, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 730, nil, nil, 712, nil, nil, nil, + 710, nil, nil, 711, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 729, nil, + nil, nil, 107, 97, 99, 100, 101, 103, nil, nil, + nil, 98, 108, nil, nil, nil, nil, nil, nil, 91, + nil, nil, 95, 102, 104, nil, 112, 113, nil, nil, + 716, 717, 120, 119, 121, 122, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 124, 123, + 125, 728, nil, nil, nil, 731, nil, nil, nil, nil, + nil, 110, 111, nil, nil, nil, 337, nil, nil, nil, + nil, nil, nil, nil, 120, 119, 121, 122, nil, nil, + nil, nil, nil, nil, nil, nil, 730, nil, nil, 712, + 124, 123, 125, 710, nil, nil, 711, nil, nil, nil, + nil, nil, nil, 110, 111, nil, nil, nil, 337, nil, + nil, 729, nil, nil, nil, 107, 97, 99, 100, 101, + 103, nil, nil, nil, 98, 108, nil, nil, nil, nil, + nil, nil, 91, nil, nil, 95, 102, 104, nil, 112, + 113, nil, nil, 716, 717, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 107, 97, 99, + 100, 101, 103, nil, nil, nil, 98, 108, 120, 119, + 121, 122, nil, nil, 91, nil, nil, 95, 102, 104, + nil, 112, 113, nil, 124, 123, 125, 629, nil, 626, + 625, 624, 634, 627, nil, nil, nil, 110, 111, nil, + nil, nil, 337, 637, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 632, nil, nil, nil, nil, + nil, nil, nil, nil, 642, 641, 645, 644, nil, nil, + nil, 629, nil, 626, 625, 624, 634, 627, nil, nil, + nil, 107, 97, 99, 100, 101, 103, 637, nil, nil, + 98, 108, nil, nil, nil, nil, nil, nil, 91, nil, + 638, 95, 102, 104, nil, 112, 113, nil, nil, 632, + 955, nil, nil, nil, nil, nil, nil, nil, 642, 641, + 645, 644, nil, nil, nil, nil, 465, 469, nil, nil, + 466, nil, nil, nil, nil, nil, nil, nil, nil, 175, + 176, nil, 171, 153, 154, 155, 162, 159, 161, nil, + nil, 156, 157, nil, 638, nil, 177, 178, 163, 164, + nil, nil, nil, nil, 955, 285, nil, nil, nil, nil, + nil, nil, nil, 168, 167, nil, 152, 174, 170, 169, + 165, 166, 160, 158, 150, 173, 151, nil, nil, 179, + nil, nil, nil, nil, 472, 476, nil, nil, 471, nil, + nil, nil, nil, nil, nil, nil, nil, 175, 176, 172, + 171, 153, 154, 155, 162, 159, 161, nil, nil, 156, + 157, nil, nil, nil, 177, 178, 163, 164, nil, nil, + nil, nil, nil, 285, nil, nil, nil, nil, nil, nil, + nil, 168, 167, nil, 152, 174, 170, 169, 165, 166, + 160, 158, 150, 173, 151, nil, nil, 179, nil, nil, + nil, nil, 518, 469, nil, nil, 519, nil, nil, nil, + nil, nil, nil, nil, nil, 175, 176, 172, 171, 153, + 154, 155, 162, 159, 161, nil, nil, 156, 157, nil, + nil, nil, 177, 178, 163, 164, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 168, + 167, nil, 152, 174, 170, 169, 165, 166, 160, 158, + 150, 173, 151, nil, nil, 179, nil, nil, nil, nil, + 699, 469, nil, nil, 700, nil, nil, nil, nil, nil, + nil, nil, nil, 175, 176, 172, 171, 153, 154, 155, + 162, 159, 161, nil, nil, 156, 157, nil, nil, nil, + 177, 178, 163, 164, nil, nil, nil, nil, nil, 285, + nil, nil, nil, nil, nil, nil, nil, 168, 167, nil, + 152, 174, 170, 169, 165, 166, 160, 158, 150, 173, + 151, nil, nil, 179, nil, nil, nil, nil, 701, 476, + nil, nil, 702, nil, nil, nil, nil, nil, nil, nil, + nil, 175, 176, 172, 171, 153, 154, 155, 162, 159, + 161, nil, nil, 156, 157, nil, nil, nil, 177, 178, + 163, 164, nil, nil, nil, nil, nil, 285, nil, nil, + nil, nil, nil, nil, nil, 168, 167, nil, 152, 174, + 170, 169, 165, 166, 160, 158, 150, 173, 151, nil, + nil, 179, nil, nil, nil, nil, 759, 469, nil, nil, + 760, nil, nil, nil, nil, nil, nil, nil, nil, 175, + 176, 172, 171, 153, 154, 155, 162, 159, 161, nil, + nil, 156, 157, nil, nil, nil, 177, 178, 163, 164, + nil, nil, nil, nil, nil, 285, nil, nil, nil, nil, + nil, nil, nil, 168, 167, nil, 152, 174, 170, 169, + 165, 166, 160, 158, 150, 173, 151, nil, nil, 179, + nil, nil, nil, nil, 762, 476, nil, nil, 763, nil, + nil, nil, nil, nil, nil, nil, nil, 175, 176, 172, + 171, 153, 154, 155, 162, 159, 161, nil, nil, 156, + 157, nil, nil, nil, 177, 178, 163, 164, nil, nil, + nil, nil, nil, 285, nil, nil, nil, nil, nil, nil, + nil, 168, 167, nil, 152, 174, 170, 169, 165, 166, + 160, 158, 150, 173, 151, nil, nil, 179, nil, nil, + nil, nil, 699, 469, nil, nil, 700, nil, nil, nil, + nil, nil, nil, nil, nil, 175, 176, 172, 171, 153, + 154, 155, 162, 159, 161, nil, nil, 156, 157, nil, + nil, nil, 177, 178, 163, 164, nil, nil, nil, nil, + nil, 285, nil, nil, nil, nil, nil, nil, nil, 168, + 167, nil, 152, 174, 170, 169, 165, 166, 160, 158, + 150, 173, 151, nil, nil, 179, nil, nil, nil, nil, + 701, 476, nil, nil, 702, nil, nil, nil, nil, nil, + nil, nil, nil, 175, 176, 172, 171, 153, 154, 155, + 162, 159, 161, nil, nil, 156, 157, nil, nil, nil, + 177, 178, 163, 164, nil, nil, nil, nil, nil, 285, + nil, nil, nil, nil, nil, nil, nil, 168, 167, nil, + 152, 174, 170, 169, 165, 166, 160, 158, 150, 173, + 151, nil, nil, 179, nil, nil, nil, nil, 798, 469, + nil, nil, 799, nil, nil, nil, nil, nil, nil, nil, + nil, 175, 176, 172, 171, 153, 154, 155, 162, 159, + 161, nil, nil, 156, 157, nil, nil, nil, 177, 178, + 163, 164, nil, nil, nil, nil, nil, 285, nil, nil, + nil, nil, nil, nil, nil, 168, 167, nil, 152, 174, + 170, 169, 165, 166, 160, 158, 150, 173, 151, nil, + nil, 179, nil, nil, nil, nil, 800, 476, nil, nil, + 801, nil, nil, nil, nil, nil, nil, nil, nil, 175, + 176, 172, 171, 153, 154, 155, 162, 159, 161, nil, + nil, 156, 157, nil, nil, nil, 177, 178, 163, 164, + nil, nil, nil, nil, nil, 285, nil, nil, nil, nil, + nil, nil, nil, 168, 167, nil, 152, 174, 170, 169, + 165, 166, 160, 158, 150, 173, 151, nil, nil, 179, + nil, nil, nil, nil, 803, 476, nil, nil, 804, nil, + nil, nil, nil, nil, nil, nil, nil, 175, 176, 172, + 171, 153, 154, 155, 162, 159, 161, nil, nil, 156, + 157, nil, nil, nil, 177, 178, 163, 164, nil, nil, + nil, nil, nil, 285, nil, nil, nil, nil, nil, nil, + nil, 168, 167, nil, 152, 174, 170, 169, 165, 166, + 160, 158, 150, 173, 151, nil, nil, 179, nil, nil, + nil, nil, 518, 469, nil, nil, 519, nil, nil, nil, + nil, nil, nil, nil, nil, 175, 176, 172, 171, 153, + 154, 155, 162, 159, 161, nil, nil, 156, 157, nil, + nil, nil, 177, 178, 163, 164, nil, nil, nil, nil, + nil, 285, nil, nil, nil, nil, nil, nil, nil, 168, + 167, nil, 152, 174, 170, 169, 165, 166, 160, 158, + 150, 173, 151, nil, nil, 179, nil, nil, nil, nil, + 855, 469, nil, nil, 856, nil, nil, nil, nil, nil, + nil, nil, nil, 175, 176, 172, 171, 153, 154, 155, + 162, 159, 161, nil, nil, 156, 157, nil, nil, nil, + 177, 178, 163, 164, nil, nil, nil, nil, nil, 285, + nil, nil, nil, nil, nil, nil, nil, 168, 167, nil, + 152, 174, 170, 169, 165, 166, 160, 158, 150, 173, + 151, nil, nil, 179, nil, nil, nil, nil, 858, 476, + nil, nil, 857, nil, nil, nil, nil, nil, nil, nil, + nil, 175, 176, 172, 171, 153, 154, 155, 162, 159, + 161, nil, nil, 156, 157, nil, nil, nil, 177, 178, + 163, 164, nil, nil, nil, nil, nil, 285, nil, nil, + nil, nil, nil, nil, nil, 168, 167, nil, 152, 174, + 170, 169, 165, 166, 160, 158, 150, 173, 151, nil, + 629, 179, 626, 625, 624, 634, 627, 629, nil, 626, + 625, 624, 634, 627, nil, nil, 637, nil, nil, nil, + nil, 172, nil, 637, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 632, nil, + nil, nil, nil, nil, nil, 632, nil, 642, 641, 645, + 644, nil, nil, nil, 642, 641, 645, 644, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1217, 476, nil, nil, 1216, + nil, nil, nil, 638, nil, nil, nil, nil, 175, 176, + 638, 171, 153, 154, 155, 162, 159, 161, nil, nil, + 156, 157, nil, nil, nil, 177, 178, 163, 164, nil, + nil, nil, nil, nil, 285, nil, nil, nil, nil, nil, + nil, nil, 168, 167, nil, 152, 174, 170, 169, 165, + 166, 160, 158, 150, 173, 151, nil, nil, 179, nil, + nil, nil, nil, 1220, 469, nil, nil, 1221, nil, nil, + nil, nil, nil, nil, nil, nil, 175, 176, 172, 171, + 153, 154, 155, 162, 159, 161, nil, nil, 156, 157, + nil, nil, nil, 177, 178, 163, 164, nil, nil, nil, + nil, nil, 285, nil, nil, nil, nil, nil, nil, nil, + 168, 167, nil, 152, 174, 170, 169, 165, 166, 160, + 158, 150, 173, 151, nil, nil, 179, nil, nil, nil, + nil, 1222, 476, nil, nil, 1223, nil, nil, nil, nil, + nil, nil, nil, nil, 175, 176, 172, 171, 153, 154, + 155, 162, 159, 161, nil, nil, 156, 157, nil, nil, + nil, 177, 178, 163, 164, nil, nil, nil, nil, nil, + 285, nil, nil, nil, nil, nil, nil, nil, 168, 167, + nil, 152, 174, 170, 169, 165, 166, 160, 158, 150, + 173, 151, nil, 629, 179, 626, 625, 624, 634, 627, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 637, + nil, nil, nil, nil, 172, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 632, nil, nil, nil, nil, nil, nil, nil, nil, + 642, 641, 645, 644, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 638 ] + +racc_action_check = [ + 114, 413, 416, 67, 358, 366, 736, 114, 114, 114, + 481, 481, 114, 114, 114, 759, 114, 367, 1006, 760, + 359, 1044, 769, 769, 114, 1000, 114, 114, 114, 815, + 815, 376, 1, 639, 1013, 376, 114, 114, 27, 114, + 114, 114, 114, 114, 754, 27, 711, 1049, 370, 762, + 595, 639, 1013, 798, 799, 1052, 730, 1054, 3, 711, + 730, 754, 816, 916, 413, 416, 1000, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 943, 759, 114, 114, 114, 760, 114, 114, 585, + 67, 114, 944, 736, 114, 114, 1006, 114, 1054, 114, + 481, 114, 27, 114, 114, 114, 114, 114, 114, 114, + 366, 114, 769, 114, 888, 762, 762, 759, 358, 815, + 759, 760, 367, 358, 760, 888, 114, 114, 114, 114, + 916, 114, 1125, 114, 359, 1044, 117, 759, 114, 359, + 1044, 760, 114, 117, 117, 117, 114, 1126, 117, 117, + 117, 762, 117, 370, 762, 595, 1129, 1181, 798, 799, + 117, 1049, 117, 117, 117, 916, 1049, 816, 916, 1052, + 1220, 762, 117, 117, 1052, 117, 117, 117, 117, 117, + 1221, 1222, 1093, 1235, 13, 916, 800, 801, 734, 585, + 29, 240, 888, 94, 585, 943, 22, 944, 943, 241, + 943, 94, 910, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 15, 332, 117, + 117, 117, 734, 117, 117, 46, 46, 117, 337, 337, + 117, 117, 22, 117, 243, 117, 910, 117, 16, 117, + 117, 117, 117, 117, 117, 117, 1125, 117, 1223, 117, + 240, 1125, 800, 801, 18, 29, 539, 1097, 241, 1222, + 1093, 1126, 117, 117, 117, 117, 1126, 117, 1097, 117, + 1129, 1181, 471, 25, 117, 1129, 1181, 29, 117, 471, + 471, 471, 117, 332, 1220, 471, 471, 818, 471, 1220, + 710, 800, 801, 243, 1221, 1222, 471, 1235, 818, 1221, + 1222, 449, 1235, 46, 46, 332, 337, 337, 471, 471, + 487, 471, 471, 471, 471, 471, 40, 539, 539, 539, + 19, 710, 385, 699, 1225, 658, 1223, 19, 5, 385, + 700, 818, 818, 5, 1225, 1097, 19, 539, 855, 471, + 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 471, 856, 20, 471, 471, 471, 661, 471, + 449, 1106, 1223, 471, 878, 818, 471, 1223, 400, 487, + 885, 471, 1106, 471, 885, 471, 471, 471, 471, 471, + 471, 471, 699, 471, 19, 471, 658, 658, 398, 700, + 398, 398, 398, 398, 398, 658, 20, 855, 471, 471, + 991, 471, 709, 471, 398, 1106, 1106, 709, 472, 882, + 471, 709, 856, 20, 471, 472, 472, 472, 471, 661, + 661, 472, 472, 878, 472, 43, 398, 398, 661, 400, + 400, 400, 472, 472, 386, 398, 398, 398, 398, 1106, + 882, 386, 402, 51, 472, 472, 52, 472, 472, 472, + 472, 472, 588, 52, 239, 1138, 101, 1138, 324, 991, + 588, 239, 52, 404, 41, 324, 404, 142, 17, 17, + 239, 398, 142, 142, 324, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, 472, 102, + 387, 472, 472, 472, 388, 472, 42, 387, 103, 472, + 407, 388, 472, 402, 402, 402, 41, 472, 104, 472, + 52, 472, 472, 472, 472, 472, 472, 472, 239, 472, + 472, 472, 324, 41, 404, 404, 614, 140, 614, 614, + 614, 614, 614, 325, 472, 472, 341, 472, 42, 472, + 325, 410, 614, 311, 701, 418, 472, 221, 311, 325, + 472, 701, 701, 701, 472, 42, 701, 701, 701, 389, + 701, 407, 407, 407, 614, 242, 389, 244, 701, 701, + 701, 701, 701, 614, 614, 614, 614, 245, 341, 249, + 701, 701, 326, 701, 701, 701, 701, 701, 363, 326, + 49, 49, 390, 363, 328, 341, 284, 325, 326, 390, + 465, 328, 410, 410, 410, 299, 418, 418, 418, 614, + 328, 701, 701, 701, 701, 701, 701, 701, 701, 701, + 701, 701, 701, 701, 701, 49, 49, 701, 701, 701, + 391, 701, 701, 392, 300, 701, 303, 391, 701, 701, + 392, 701, 465, 701, 317, 701, 326, 701, 701, 701, + 701, 701, 701, 701, 393, 701, 701, 701, 328, 465, + 574, 393, 813, 574, 813, 813, 813, 813, 813, 342, + 701, 701, 701, 701, 395, 701, 342, 701, 813, 319, + 702, 395, 701, 320, 466, 342, 701, 702, 702, 702, + 701, 770, 702, 702, 702, 321, 702, 770, 368, 575, + 813, 327, 575, 330, 702, 368, 702, 702, 702, 813, + 813, 813, 813, 331, 368, 336, 702, 702, 378, 702, + 702, 702, 702, 702, 809, 378, 466, 948, 448, 809, + 556, 683, 948, 342, 378, 448, 835, 556, 835, 835, + 835, 338, 835, 466, 448, 813, 556, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 956, 368, 702, 702, 702, 956, 702, 702, 579, + 345, 702, 579, 683, 702, 702, 347, 702, 353, 702, + 364, 702, 378, 702, 702, 702, 702, 702, 702, 702, + 683, 702, 448, 702, 556, 365, 823, 369, 823, 823, + 823, 823, 823, 598, 357, 357, 702, 702, 702, 702, + 598, 702, 823, 702, 929, 371, 857, 929, 702, 598, + 606, 606, 702, 857, 857, 857, 702, 380, 1020, 857, + 857, 1020, 857, 1144, 823, 632, 1144, 632, 632, 632, + 857, 632, 406, 823, 823, 823, 823, 9, 9, 9, + 9, 9, 857, 857, 763, 857, 857, 857, 857, 857, + 409, 763, 804, 412, 1120, 415, 763, 598, 438, 804, + 763, 1120, 494, 632, 804, 713, 713, 440, 804, 823, + 1120, 441, 632, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 784, 784, 857, + 857, 857, 443, 857, 494, 821, 821, 857, 494, 494, + 857, 1053, 1053, 1182, 1182, 857, 446, 857, 763, 857, + 857, 857, 857, 857, 857, 857, 804, 857, 1120, 857, + 450, 460, 463, 464, 825, 473, 825, 825, 825, 825, + 825, 1127, 857, 857, 483, 857, 496, 857, 1127, 497, + 825, 498, 858, 499, 857, 515, 523, 1127, 857, 858, + 858, 858, 857, 524, 509, 858, 858, 1072, 858, 1072, + 1072, 1072, 825, 1072, 525, 510, 858, 858, 529, 545, + 374, 825, 825, 825, 825, 546, 547, 550, 858, 858, + 1173, 858, 858, 858, 858, 858, 509, 1173, 552, 557, + 509, 509, 509, 509, 560, 1127, 1173, 510, 569, 570, + 571, 510, 510, 510, 510, 576, 577, 825, 580, 858, + 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, + 858, 858, 858, 374, 582, 858, 858, 858, 586, 858, + 374, 587, 589, 858, 608, 374, 858, 616, 617, 374, + 618, 858, 620, 858, 1173, 858, 858, 858, 858, 858, + 858, 858, 621, 858, 858, 858, 622, 374, 980, 631, + 980, 980, 980, 643, 980, 646, 665, 668, 858, 858, + 675, 858, 684, 858, 689, 1152, 695, 1152, 1152, 1152, + 858, 1152, 703, 704, 858, 706, 729, 374, 858, 2, + 2, 2, 2, 2, 2, 732, 980, 735, 2, 2, + 741, 743, 375, 2, 803, 2, 2, 2, 2, 2, + 2, 2, 745, 1152, 747, 756, 758, 2, 2, 2, + 2, 2, 2, 2, 495, 831, 2, 831, 831, 831, + 761, 831, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 764, 2, 2, 2, 765, 2, + 2, 768, 2, 2, 2, 375, 495, 803, 786, 792, + 495, 495, 375, 831, 803, 793, 797, 375, 806, 803, + 810, 375, 831, 803, 2, 817, 833, 2, 502, 834, + 2, 2, 836, 849, 2, 852, 2, 854, 863, 375, + 2, 803, 879, 881, 502, 502, 842, 842, 2, 890, + 842, 842, 842, 2, 2, 2, 2, 2, 2, 907, + 502, 908, 2, 2, 502, 502, 502, 502, 915, 375, + 2, 803, 925, 2, 2, 2, 926, 2, 2, 930, + 936, 2, 2, 36, 36, 36, 36, 36, 36, 945, + 947, 951, 36, 36, 952, 953, 954, 36, 962, 36, + 36, 36, 36, 36, 36, 36, 24, 963, 964, 966, + 969, 36, 36, 36, 36, 36, 36, 36, 970, 1195, + 36, 1195, 1195, 1195, 972, 1195, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 973, 36, + 36, 36, 975, 36, 36, 978, 36, 36, 36, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 988, 24, 24, 990, 1001, 24, 24, 1002, 36, 1005, + 1007, 36, 1014, 1015, 36, 36, 1017, 1018, 36, 1024, + 36, 24, 1025, 24, 36, 24, 24, 24, 24, 24, + 24, 24, 36, 24, 1026, 1028, 1029, 36, 36, 36, + 36, 36, 36, 1030, 1032, 1033, 36, 36, 1034, 24, + 1069, 1070, 1071, 1086, 36, 1087, 1091, 36, 36, 36, + 1092, 36, 36, 1095, 1098, 36, 36, 223, 223, 223, + 223, 223, 223, 1118, 1121, 1123, 223, 223, 1128, 1139, + 1140, 223, 1148, 223, 223, 223, 223, 223, 223, 223, + 315, 315, 315, 315, 315, 223, 223, 223, 223, 223, + 223, 223, 1149, 1150, 223, 1151, 1155, 1158, 1163, 453, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 1166, 223, 223, 223, 1167, 223, 223, 1168, + 223, 223, 223, 453, 453, 453, 453, 453, 453, 453, + 453, 453, 453, 453, 1169, 453, 453, 1171, 1177, 453, + 453, 1193, 223, 1201, 1203, 223, 1204, 1216, 223, 223, + 1217, 1219, 223, 1228, 223, 453, 1229, 453, 223, 453, + 453, 453, 453, 453, 453, 453, 223, 453, 1231, 1232, + 1233, 223, 223, 223, 223, 223, 223, 1234, 1245, nil, + 223, 223, nil, 453, nil, 453, nil, nil, 223, nil, + nil, 223, 223, 223, nil, 223, 223, nil, nil, 223, + 223, 248, 248, 248, 248, 248, 248, nil, nil, nil, + 248, 248, nil, nil, nil, 248, nil, 248, 248, 248, + 248, 248, 248, 248, 352, 352, 352, 352, 352, 248, + 248, 248, 248, 248, 248, 248, nil, nil, 248, nil, + nil, nil, nil, 459, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, nil, 248, 248, 248, + nil, 248, 248, nil, 248, 248, 248, 459, 459, 459, + 459, 459, 459, 459, 459, 459, 459, 459, nil, 459, + 459, nil, nil, 459, 459, nil, 248, nil, nil, 248, + nil, nil, 248, 248, nil, nil, 248, nil, 248, 459, + nil, 459, 248, 459, 459, 459, 459, 459, 459, 459, + 248, 459, nil, nil, nil, 248, 248, 248, 248, 248, + 248, nil, nil, nil, 248, 248, nil, 459, nil, nil, + nil, nil, 248, nil, nil, 248, 248, 248, nil, 248, + 248, nil, nil, 248, 248, 318, 318, 318, 318, 318, + 318, nil, nil, nil, 318, 318, nil, nil, nil, 318, + nil, 318, 318, 318, 318, 318, 318, 318, 544, 544, + 544, 544, 544, 318, 318, 318, 318, 318, 318, 318, + nil, nil, 318, nil, nil, nil, nil, nil, 318, 318, + 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, + nil, 318, 318, 318, nil, 318, 318, nil, 318, 318, + 318, 297, 297, 297, 297, 297, 297, 297, 297, 297, + 297, 297, nil, 297, 297, nil, nil, 297, 297, nil, + 318, nil, nil, 318, nil, nil, 318, 318, nil, nil, + 318, nil, 318, 297, nil, 297, 318, 297, 297, 297, + 297, 297, 297, 297, 318, 297, nil, nil, nil, 318, + 318, 318, 318, 318, 318, nil, nil, nil, 318, 318, + nil, 297, nil, nil, nil, nil, 318, nil, nil, 318, + 318, 318, nil, 318, 318, nil, nil, 318, 318, 323, + 323, 323, 323, 323, 323, nil, nil, nil, 323, 323, + nil, nil, nil, 323, nil, 323, 323, 323, 323, 323, + 323, 323, nil, nil, nil, nil, nil, 323, 323, 323, + 323, 323, 323, 323, nil, nil, 323, nil, nil, nil, + nil, nil, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, nil, 323, 323, 323, nil, 323, + 323, nil, 323, 323, 323, 513, 513, 513, 513, 513, + 513, 513, 513, 513, 513, 513, nil, 513, 513, nil, + nil, 513, 513, nil, 323, nil, nil, 323, nil, nil, + 323, 323, nil, nil, 323, nil, 323, 513, nil, 513, + 323, 513, 513, 513, 513, 513, 513, 513, 323, 513, + nil, nil, nil, 323, 323, 323, 323, 323, 323, nil, + nil, nil, 323, 323, 513, 513, nil, nil, nil, nil, + 323, nil, nil, 323, 323, 323, nil, 323, 323, nil, + nil, 323, 323, 351, 351, 351, 351, 351, 351, nil, + nil, nil, 351, 351, nil, nil, nil, 351, nil, 351, + 351, 351, 351, 351, 351, 351, nil, nil, nil, nil, + nil, 351, 351, 351, 351, 351, 351, 351, nil, nil, + 351, nil, nil, nil, nil, nil, 351, 351, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 351, nil, 351, + 351, 351, nil, 351, 351, nil, 351, 351, 351, 567, + 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, + nil, 567, 567, nil, nil, 567, 567, nil, 351, nil, + nil, 351, nil, nil, 351, 351, nil, nil, 351, nil, + 351, 567, nil, 567, 351, 567, 567, 567, 567, 567, + 567, 567, 351, 567, nil, nil, nil, 351, 351, 351, + 351, 351, 351, nil, nil, nil, 351, 351, nil, 567, + nil, nil, nil, nil, 351, nil, nil, 351, 351, 351, + nil, 351, 351, nil, nil, 351, 351, 361, 361, 361, + 361, 361, 361, nil, nil, nil, 361, 361, nil, nil, + nil, 361, nil, 361, 361, 361, 361, 361, 361, 361, + nil, nil, nil, nil, nil, 361, 361, 361, 361, 361, + 361, 361, nil, nil, 361, nil, nil, nil, nil, nil, + 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, nil, 361, 361, 361, nil, 361, 361, nil, + 361, 361, 361, 860, 860, 860, 860, 860, 860, 860, + 860, 860, 860, 860, nil, 860, 860, nil, nil, 860, + 860, nil, 361, nil, nil, 361, nil, nil, 361, 361, + nil, nil, 361, nil, 361, 860, nil, 860, 361, 860, + 860, 860, 860, 860, 860, 860, 361, 860, nil, nil, + nil, 361, 361, 361, 361, 361, 361, nil, nil, nil, + 361, 361, nil, 860, nil, nil, nil, nil, 361, nil, + nil, 361, 361, 361, nil, 361, 361, nil, nil, 361, + 361, 362, 362, 362, 362, 362, 362, nil, nil, nil, + 362, 362, nil, nil, nil, 362, nil, 362, 362, 362, + 362, 362, 362, 362, nil, nil, nil, nil, nil, 362, + 362, 362, 362, 362, 362, 362, nil, nil, 362, nil, + nil, nil, nil, nil, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, nil, 362, 362, 362, + nil, 362, 362, nil, 362, 362, 362, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, nil, 1023, + 1023, nil, nil, 1023, 1023, nil, 362, nil, nil, 362, + nil, nil, 362, 362, nil, nil, 362, nil, 362, 1023, + nil, 1023, 362, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 362, 1023, nil, nil, nil, 362, 362, 362, 362, 362, + 362, nil, nil, nil, 362, 362, nil, 1023, nil, nil, + nil, nil, 362, nil, nil, 362, 362, 362, nil, 362, + 362, nil, nil, 362, 362, 581, 581, 581, 581, 581, + 581, nil, nil, nil, 581, 581, nil, nil, nil, 581, + nil, 581, 581, 581, 581, 581, 581, 581, nil, nil, + nil, nil, nil, 581, 581, 581, 581, 581, 581, 581, + nil, 979, 581, 979, 979, 979, nil, 979, 581, 581, + 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, + nil, 581, 581, 581, nil, 581, 581, nil, 581, 581, + 581, 1153, nil, 1153, 1153, 1153, nil, 1153, nil, 979, + nil, nil, nil, nil, nil, nil, nil, nil, 979, nil, + 581, nil, nil, 581, nil, nil, 581, 581, nil, nil, + 581, nil, 581, nil, nil, nil, 581, nil, nil, 1153, + nil, nil, nil, nil, 581, nil, nil, nil, nil, 581, + 581, 581, 581, 581, 581, nil, nil, nil, 581, 581, + nil, nil, nil, nil, nil, nil, 581, nil, nil, 581, + 581, 581, nil, 581, 581, nil, nil, 581, 581, 584, + 584, 584, 584, 584, 584, nil, nil, nil, 584, 584, + nil, nil, nil, 584, nil, 584, 584, 584, 584, 584, + 584, 584, nil, nil, nil, nil, nil, 584, 584, 584, + 584, 584, 584, 584, nil, nil, 584, nil, nil, nil, + nil, nil, 584, 584, 584, 584, 584, 584, 584, 584, + 584, 584, 584, 584, nil, 584, 584, 584, nil, 584, + 584, nil, 584, 584, 584, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, nil, 343, 343, nil, + nil, 343, 343, nil, 584, nil, nil, 584, nil, nil, + 584, 584, nil, nil, 584, nil, 584, 343, nil, 343, + 584, 343, 343, 343, 343, 343, 343, 343, 584, 343, + nil, nil, nil, 584, 584, 584, 584, 584, 584, nil, + nil, nil, 584, 584, nil, nil, nil, nil, nil, nil, + 584, nil, nil, 584, 584, 584, nil, 584, 584, nil, + nil, 584, 584, 607, 607, 607, 607, 607, 607, nil, + nil, nil, 607, 607, nil, nil, nil, 607, nil, 607, + 607, 607, 607, 607, 607, 607, nil, nil, nil, nil, + nil, 607, 607, 607, 607, 607, 607, 607, nil, nil, + 607, nil, nil, nil, nil, nil, 607, 607, 607, 607, + 607, 607, 607, 607, 607, 607, 607, 607, nil, 607, + 607, 607, nil, 607, 607, nil, 607, 607, 607, 344, + 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, + nil, 344, 344, nil, nil, 344, 344, nil, 607, nil, + nil, 607, nil, nil, 607, 607, nil, nil, 607, nil, + 607, 344, nil, 344, 607, 344, 344, 344, 344, 344, + 344, 344, 607, 344, nil, nil, nil, 607, 607, 607, + 607, 607, 607, nil, nil, nil, 607, 607, nil, nil, + nil, nil, nil, nil, 607, nil, nil, 607, 607, 607, + nil, 607, 607, nil, nil, 607, 607, 670, 670, 670, + 670, 670, 670, nil, nil, nil, 670, 670, nil, nil, + nil, 670, nil, 670, 670, 670, 670, 670, 670, 670, + nil, nil, nil, nil, nil, 670, 670, 670, 670, 670, + 670, 670, nil, nil, 670, nil, nil, nil, nil, nil, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 670, nil, 670, 670, 670, nil, 670, 670, nil, + 670, 670, 670, 492, 492, 492, 492, 492, 492, 492, + 492, 492, 492, 492, nil, 492, 492, nil, nil, 492, + 492, nil, 670, nil, nil, 670, nil, nil, 670, 670, + nil, nil, 670, nil, 670, 492, nil, 492, 670, 492, + 492, 492, 492, 492, 492, 492, 670, 492, nil, nil, + nil, 670, 670, 670, 670, 670, 670, nil, nil, nil, + 670, 670, nil, nil, nil, nil, nil, nil, 670, nil, + nil, 670, 670, 670, nil, 670, 670, nil, nil, 670, + 670, 802, 802, 802, 802, 802, 802, nil, nil, nil, + 802, 802, nil, nil, nil, 802, nil, 802, 802, 802, + 802, 802, 802, 802, nil, nil, nil, nil, nil, 802, + 802, 802, 802, 802, 802, 802, nil, nil, 802, nil, + nil, nil, nil, nil, 802, 802, 802, 802, 802, 802, + 802, 802, 802, 802, 802, 802, nil, 802, 802, 802, + nil, 802, 802, nil, 802, 802, 802, 493, 493, 493, + 493, 493, 493, 493, 493, 493, 493, 493, nil, 493, + 493, nil, nil, 493, 493, nil, 802, nil, nil, 802, + nil, nil, 802, 802, nil, nil, 802, nil, 802, 493, + nil, 493, 802, 493, 493, 493, 493, 493, 493, 493, + 802, 493, nil, nil, nil, 802, 802, 802, 802, 802, + 802, nil, nil, nil, 802, 802, nil, nil, nil, nil, + nil, nil, 802, nil, nil, 802, 802, 802, nil, 802, + 802, nil, nil, 802, 802, 807, 807, 807, 807, 807, + 807, nil, nil, nil, 807, 807, nil, nil, nil, 807, + nil, 807, 807, 807, 807, 807, 807, 807, nil, nil, + nil, nil, nil, 807, 807, 807, 807, 807, 807, 807, + nil, nil, 807, nil, nil, nil, nil, nil, 807, 807, + 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, + nil, 807, 807, 807, nil, 807, 807, nil, 807, 807, + 807, 503, 503, 503, 503, 503, 503, 503, nil, nil, + 503, 503, nil, nil, nil, nil, nil, 503, 503, nil, + 807, nil, nil, 807, nil, nil, 807, 807, nil, nil, + 807, nil, 807, 503, nil, 503, 807, 503, 503, 503, + 503, 503, 503, 503, 807, 503, nil, nil, nil, 807, + 807, 807, 807, 807, 807, nil, nil, nil, 807, 807, + nil, nil, nil, nil, nil, nil, 807, nil, nil, 807, + 807, 807, nil, 807, 807, nil, nil, 807, 807, 811, + 811, 811, 811, 811, 811, nil, nil, nil, 811, 811, + nil, nil, nil, 811, nil, 811, 811, 811, 811, 811, + 811, 811, nil, nil, nil, nil, nil, 811, 811, 811, + 811, 811, 811, 811, nil, nil, 811, nil, nil, nil, + nil, nil, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, nil, 811, 811, 811, nil, 811, + 811, nil, 811, 811, 811, 504, 504, 504, 504, 504, + 504, 504, nil, nil, 504, 504, nil, nil, nil, nil, + nil, 504, 504, nil, 811, nil, nil, 811, nil, nil, + 811, 811, nil, nil, 811, nil, 811, 504, nil, 504, + 811, 504, 504, 504, 504, 504, 504, 504, 811, 504, + nil, nil, nil, 811, 811, 811, 811, 811, 811, nil, + nil, nil, 811, 811, nil, nil, nil, nil, nil, nil, + 811, nil, nil, 811, 811, 811, nil, 811, 811, nil, + nil, 811, 811, 843, 843, 843, 843, 843, 843, nil, + nil, nil, 843, 843, nil, nil, nil, 843, nil, 843, + 843, 843, 843, 843, 843, 843, nil, nil, nil, nil, + nil, 843, 843, 843, 843, 843, 843, 843, nil, nil, + 843, nil, nil, nil, nil, nil, 843, 843, 843, 843, + 843, 843, 843, 843, 843, 843, 843, 843, nil, 843, + 843, 843, nil, 843, 843, nil, 843, 843, 843, 505, + 505, 505, 505, 505, 505, 505, nil, nil, 505, 505, + nil, nil, nil, nil, nil, 505, 505, nil, 843, nil, + nil, 843, nil, nil, 843, 843, nil, nil, 843, nil, + 843, 505, nil, 505, 843, 505, 505, 505, 505, 505, + 505, 505, 843, 505, nil, nil, nil, 843, 843, 843, + 843, 843, 843, nil, nil, nil, 843, 843, nil, nil, + nil, nil, nil, nil, 843, nil, nil, 843, 843, 843, + nil, 843, 843, nil, nil, 843, 843, 904, 904, 904, + 904, 904, 904, nil, nil, nil, 904, 904, nil, nil, + nil, 904, nil, 904, 904, 904, 904, 904, 904, 904, + nil, nil, nil, nil, nil, 904, 904, 904, 904, 904, + 904, 904, nil, nil, 904, nil, nil, nil, nil, nil, + 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, + 904, 904, nil, 904, 904, 904, nil, 904, 904, nil, + 904, 904, 904, 506, 506, 506, 506, 506, 506, 506, + nil, nil, 506, 506, nil, nil, nil, nil, nil, 506, + 506, nil, 904, nil, nil, 904, nil, nil, 904, 904, + nil, nil, 904, nil, 904, 506, nil, 506, 904, 506, + 506, 506, 506, 506, 506, 506, 904, 506, nil, nil, + nil, 904, 904, 904, 904, 904, 904, nil, nil, nil, + 904, 904, nil, nil, nil, nil, nil, nil, 904, nil, + nil, 904, 904, 904, nil, 904, 904, nil, nil, 904, + 904, 923, 923, 923, 923, 923, 923, nil, nil, nil, + 923, 923, nil, nil, nil, 923, nil, 923, 923, 923, + 923, 923, 923, 923, nil, nil, nil, nil, nil, 923, + 923, 923, 923, 923, 923, 923, nil, nil, 923, nil, + nil, nil, nil, nil, 923, 923, 923, 923, 923, 923, + 923, 923, 923, 923, 923, 923, nil, 923, 923, 923, + nil, 923, 923, nil, 923, 923, 923, 507, 507, 507, + 507, 507, 507, 507, nil, nil, 507, 507, nil, nil, + nil, nil, nil, 507, 507, nil, 923, nil, nil, 923, + nil, nil, 923, 923, nil, nil, 923, nil, 923, 507, + nil, 507, 923, 507, 507, 507, 507, 507, 507, 507, + 923, 507, nil, nil, nil, 923, 923, 923, 923, 923, + 923, nil, nil, nil, 923, 923, nil, nil, nil, nil, + nil, nil, 923, nil, nil, 923, 923, 923, nil, 923, + 923, nil, nil, 923, 923, 935, 935, 935, 935, 935, + 935, nil, nil, nil, 935, 935, nil, nil, nil, 935, + nil, 935, 935, 935, 935, 935, 935, 935, nil, nil, + nil, nil, nil, 935, 935, 935, 935, 935, 935, 935, + nil, nil, 935, nil, nil, nil, nil, nil, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + nil, 935, 935, 935, nil, 935, 935, nil, 935, 935, + 935, 508, 508, 508, 508, 508, 508, 508, nil, nil, + 508, 508, nil, nil, nil, nil, nil, 508, 508, nil, + 935, nil, nil, 935, nil, nil, 935, 935, nil, nil, + 935, nil, 935, 508, nil, 508, 935, 508, 508, 508, + 508, 508, 508, 508, 935, 508, nil, nil, nil, 935, + 935, 935, 935, 935, 935, nil, nil, nil, 935, 935, + nil, nil, nil, nil, nil, nil, 935, nil, nil, 935, + 935, 935, nil, 935, 935, nil, nil, 935, 935, 960, + 960, 960, 960, 960, 960, nil, nil, nil, 960, 960, + nil, nil, nil, 960, nil, 960, 960, 960, 960, 960, + 960, 960, nil, nil, nil, nil, nil, 960, 960, 960, + 960, 960, 960, 960, nil, nil, 960, nil, nil, nil, + nil, nil, 960, 960, 960, 960, 960, 960, 960, 960, + 960, 960, 960, 960, nil, 960, 960, 960, nil, 960, + 960, nil, 960, 960, 960, 511, 511, 511, 511, 511, + 511, 511, nil, nil, 511, 511, nil, nil, nil, nil, + nil, 511, 511, nil, 960, nil, nil, 960, nil, nil, + 960, 960, nil, nil, 960, nil, 960, 511, nil, 511, + 960, 511, 511, 511, 511, 511, 511, 511, 960, 511, + nil, nil, nil, 960, 960, 960, 960, 960, 960, nil, + nil, nil, 960, 960, nil, nil, nil, nil, nil, nil, + 960, nil, nil, 960, 960, 960, nil, 960, 960, nil, + nil, 960, 960, 961, 961, 961, 961, 961, 961, nil, + nil, nil, 961, 961, nil, nil, nil, 961, nil, 961, + 961, 961, 961, 961, 961, 961, nil, nil, nil, nil, + nil, 961, 961, 961, 961, 961, 961, 961, nil, nil, + 961, nil, nil, nil, nil, nil, 961, 961, 961, 961, + 961, 961, 961, 961, 961, 961, 961, 961, nil, 961, + 961, 961, nil, 961, 961, nil, 961, 961, 961, 512, + 512, 512, 512, 512, 512, 512, 512, nil, 512, 512, + nil, nil, nil, nil, nil, 512, 512, nil, 961, nil, + nil, 961, nil, nil, 961, 961, nil, nil, 961, nil, + 961, 512, nil, 512, 961, 512, 512, 512, 512, 512, + 512, 512, 961, 512, nil, nil, nil, 961, 961, 961, + 961, 961, 961, nil, nil, nil, 961, 961, nil, nil, + nil, nil, nil, nil, 961, nil, nil, 961, 961, 961, + nil, 961, 961, nil, nil, 961, 961, 1041, 1041, 1041, + 1041, 1041, 1041, nil, nil, nil, 1041, 1041, nil, nil, + nil, 1041, nil, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + nil, nil, nil, nil, nil, 1041, 1041, 1041, 1041, 1041, + 1041, 1041, nil, nil, 1041, nil, nil, nil, nil, nil, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1041, nil, 1041, 1041, 1041, nil, 1041, 1041, nil, + 1041, 1041, 1041, 514, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 514, + 514, nil, 1041, nil, nil, 1041, nil, nil, 1041, 1041, + nil, nil, 1041, nil, 1041, 514, nil, 514, 1041, 514, + 514, 514, 514, nil, nil, 514, 1041, 514, nil, nil, + nil, 1041, 1041, 1041, 1041, 1041, 1041, nil, nil, nil, + 1041, 1041, nil, nil, nil, nil, nil, nil, 1041, nil, + nil, 1041, 1041, 1041, nil, 1041, 1041, nil, nil, 1041, + 1041, 1042, 1042, 1042, 1042, 1042, 1042, nil, nil, nil, + 1042, 1042, nil, nil, nil, 1042, nil, 1042, 1042, 1042, + 1042, 1042, 1042, 1042, nil, nil, nil, nil, nil, 1042, + 1042, 1042, 1042, 1042, 1042, 1042, nil, nil, 1042, nil, + nil, nil, nil, nil, 1042, 1042, 1042, 1042, 1042, 1042, + 1042, 1042, 1042, 1042, 1042, 1042, nil, 1042, 1042, 1042, + nil, 1042, 1042, nil, 1042, 1042, 1042, 566, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 566, 566, nil, 1042, nil, nil, 1042, + nil, nil, 1042, 1042, nil, nil, 1042, nil, 1042, 566, + nil, 566, 1042, 566, 566, 566, 566, nil, nil, 566, + 1042, 566, nil, nil, nil, 1042, 1042, 1042, 1042, 1042, + 1042, nil, nil, nil, 1042, 1042, nil, nil, nil, nil, + nil, nil, 1042, nil, nil, 1042, 1042, 1042, nil, 1042, + 1042, nil, nil, 1042, 1042, 1059, 1059, 1059, 1059, 1059, + 1059, nil, nil, nil, 1059, 1059, nil, nil, nil, 1059, + nil, 1059, 1059, 1059, 1059, 1059, 1059, 1059, nil, nil, + nil, nil, nil, 1059, 1059, 1059, 1059, 1059, 1059, 1059, + nil, nil, 1059, nil, nil, nil, nil, nil, 1059, 1059, + 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, + nil, 1059, 1059, 1059, nil, 1059, 1059, nil, 1059, 1059, + 1059, 500, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 500, 500, nil, + 1059, nil, nil, 1059, nil, nil, 1059, 1059, nil, nil, + 1059, nil, 1059, 500, nil, 500, 1059, 500, 500, 500, + 500, nil, nil, nil, 1059, nil, nil, nil, nil, 1059, + 1059, 1059, 1059, 1059, 1059, nil, nil, nil, 1059, 1059, + nil, nil, nil, nil, nil, nil, 1059, nil, nil, 1059, + 1059, 1059, nil, 1059, 1059, nil, nil, 1059, 1059, 1063, + 1063, 1063, 1063, 1063, 1063, nil, nil, nil, 1063, 1063, + nil, nil, nil, 1063, nil, 1063, 1063, 1063, 1063, 1063, + 1063, 1063, nil, nil, nil, nil, nil, 1063, 1063, 1063, + 1063, 1063, 1063, 1063, nil, nil, 1063, nil, nil, nil, + nil, nil, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, + 1063, 1063, 1063, 1063, nil, 1063, 1063, 1063, nil, 1063, + 1063, nil, 1063, 1063, 1063, 501, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 501, 501, nil, 1063, nil, nil, 1063, nil, nil, + 1063, 1063, nil, nil, 1063, nil, 1063, 501, nil, 501, + 1063, 501, 501, 501, 501, nil, nil, nil, 1063, nil, + nil, nil, nil, 1063, 1063, 1063, 1063, 1063, 1063, nil, + nil, nil, 1063, 1063, nil, nil, nil, nil, nil, nil, + 1063, nil, nil, 1063, 1063, 1063, nil, 1063, 1063, nil, + nil, 1063, 1063, 1124, 1124, 1124, 1124, 1124, 1124, nil, + nil, nil, 1124, 1124, nil, nil, nil, 1124, nil, 1124, + 1124, 1124, 1124, 1124, 1124, 1124, nil, nil, nil, nil, + nil, 1124, 1124, 1124, 1124, 1124, 1124, 1124, nil, nil, + 1124, nil, nil, nil, nil, nil, 1124, 1124, 1124, 1124, + 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, nil, 1124, + 1124, 1124, nil, 1124, 1124, nil, 1124, 1124, 1124, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1124, nil, + nil, 1124, nil, nil, 1124, 1124, nil, nil, 1124, nil, + 1124, nil, nil, nil, 1124, nil, nil, nil, nil, nil, + nil, nil, 1124, nil, nil, nil, nil, 1124, 1124, 1124, + 1124, 1124, 1124, nil, nil, nil, 1124, 1124, nil, nil, + nil, nil, nil, nil, 1124, nil, nil, 1124, 1124, 1124, + nil, 1124, 1124, nil, nil, 1124, 1124, 1131, 1131, 1131, + 1131, 1131, 1131, nil, nil, nil, 1131, 1131, nil, nil, + nil, 1131, nil, 1131, 1131, 1131, 1131, 1131, 1131, 1131, + nil, nil, nil, nil, nil, 1131, 1131, 1131, 1131, 1131, + 1131, 1131, nil, nil, 1131, nil, nil, nil, nil, nil, + 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, + 1131, 1131, nil, 1131, 1131, 1131, nil, 1131, 1131, nil, + 1131, 1131, 1131, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1131, nil, nil, 1131, nil, nil, 1131, 1131, + nil, nil, 1131, nil, 1131, nil, nil, nil, 1131, nil, + nil, nil, nil, nil, nil, nil, 1131, nil, nil, nil, + nil, 1131, 1131, 1131, 1131, 1131, 1131, nil, nil, nil, + 1131, 1131, nil, nil, nil, nil, nil, nil, 1131, nil, + nil, 1131, 1131, 1131, nil, 1131, 1131, nil, nil, 1131, + 1131, 1141, 1141, 1141, 1141, 1141, 1141, nil, nil, nil, + 1141, 1141, nil, nil, nil, 1141, nil, 1141, 1141, 1141, + 1141, 1141, 1141, 1141, nil, nil, nil, nil, nil, 1141, + 1141, 1141, 1141, 1141, 1141, 1141, nil, nil, 1141, nil, + nil, nil, nil, nil, 1141, 1141, 1141, 1141, 1141, 1141, + 1141, 1141, 1141, 1141, 1141, 1141, nil, 1141, 1141, 1141, + nil, 1141, 1141, nil, 1141, 1141, 1141, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1141, nil, nil, 1141, + nil, nil, 1141, 1141, nil, nil, 1141, nil, 1141, nil, + nil, nil, 1141, nil, nil, nil, nil, nil, nil, nil, + 1141, nil, nil, nil, nil, 1141, 1141, 1141, 1141, 1141, + 1141, nil, nil, nil, 1141, 1141, nil, nil, nil, nil, + nil, nil, 1141, nil, nil, 1141, 1141, 1141, nil, 1141, + 1141, nil, nil, 1141, 1141, 1183, 1183, 1183, 1183, 1183, + 1183, nil, nil, nil, 1183, 1183, nil, nil, nil, 1183, + nil, 1183, 1183, 1183, 1183, 1183, 1183, 1183, nil, nil, + nil, nil, nil, 1183, 1183, 1183, 1183, 1183, 1183, 1183, + nil, nil, 1183, nil, nil, nil, nil, nil, 1183, 1183, + 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, + nil, 1183, 1183, 1183, nil, 1183, 1183, nil, 1183, 1183, + 1183, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1183, nil, nil, 1183, nil, nil, 1183, 1183, nil, nil, + 1183, nil, 1183, nil, nil, nil, 1183, nil, nil, nil, + nil, nil, nil, nil, 1183, nil, nil, nil, nil, 1183, + 1183, 1183, 1183, 1183, 1183, nil, nil, nil, 1183, 1183, + nil, nil, nil, nil, nil, nil, 1183, nil, nil, 1183, + 1183, 1183, nil, 1183, 1183, nil, nil, 1183, 1183, 8, + 8, 8, 8, 8, nil, nil, nil, 8, 8, nil, + nil, nil, 8, nil, 8, 8, 8, 8, 8, 8, + 8, nil, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, 8, nil, nil, 8, nil, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, nil, 8, 8, 8, nil, 8, 8, + nil, 8, 8, 8, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 8, nil, nil, 8, nil, nil, 8, + 8, nil, nil, 8, nil, 8, nil, nil, nil, 8, + nil, nil, nil, nil, nil, nil, nil, 8, nil, nil, + nil, nil, 8, 8, 8, 8, 8, 8, nil, nil, + nil, 8, 8, nil, nil, nil, nil, nil, nil, 8, + nil, nil, 8, 8, 8, nil, 8, 8, nil, nil, + 8, 8, 23, 23, 23, nil, 23, nil, nil, nil, + 23, 23, nil, nil, nil, 23, nil, 23, 23, 23, + 23, 23, 23, 23, nil, nil, nil, nil, nil, 23, + 23, 23, 23, 23, 23, 23, nil, nil, 23, nil, + nil, nil, nil, nil, nil, 23, nil, nil, 23, 23, + 23, 23, 23, 23, 23, 23, nil, 23, 23, 23, + nil, 23, 23, nil, 23, 23, 23, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, 23, + nil, nil, 23, 23, nil, nil, 23, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 23, 23, 23, 23, 23, + 23, nil, nil, nil, 23, 23, nil, nil, nil, nil, + nil, nil, 23, nil, nil, 23, 23, 23, 30, 23, + 23, nil, nil, 23, 23, 30, 30, 30, nil, nil, + 30, 30, 30, 827, 30, 827, 827, 827, 827, 827, + nil, nil, 30, 30, 30, 30, nil, nil, nil, 827, + nil, nil, nil, nil, 30, 30, nil, 30, 30, 30, + 30, 30, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 827, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 827, 827, nil, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, nil, + nil, 30, 30, 30, nil, nil, 30, nil, 30, 30, + nil, nil, 30, 30, nil, 30, 827, 30, nil, 30, + nil, 30, 30, 30, 30, 30, 30, 30, nil, 30, + 30, 30, 902, nil, 902, 902, 902, 902, 902, nil, + nil, nil, nil, nil, 30, 30, nil, 30, 902, 30, + 31, nil, nil, nil, nil, nil, 30, 31, 31, 31, + 30, nil, 31, 31, 31, nil, 31, nil, nil, nil, + 902, nil, nil, nil, 31, nil, 31, 31, nil, 902, + 902, 902, 902, nil, nil, nil, 31, 31, nil, 31, + 31, 31, 31, 31, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 902, nil, nil, + nil, nil, nil, nil, nil, 902, nil, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, nil, nil, 31, 31, 31, nil, nil, 31, nil, + 31, 31, nil, nil, 31, 31, nil, 31, nil, 31, + nil, 31, nil, 31, 31, 31, 31, 31, 31, 31, + nil, 31, nil, 31, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 31, 31, nil, 31, + nil, 31, 32, 32, 32, nil, 32, nil, 31, nil, + 32, 32, 31, nil, nil, 32, nil, 32, 32, 32, + 32, 32, 32, 32, nil, nil, nil, nil, nil, 32, + 32, 32, 32, 32, 32, 32, nil, nil, 32, nil, + nil, nil, nil, nil, nil, 32, nil, nil, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + nil, 32, 32, nil, 32, 32, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 32, nil, nil, 32, + nil, nil, 32, 32, nil, nil, 32, nil, 32, nil, + 32, nil, 32, nil, nil, nil, nil, nil, nil, nil, + 32, nil, nil, nil, nil, 32, 32, 32, 32, 32, + 32, nil, nil, nil, 32, 32, nil, nil, nil, nil, + nil, nil, 32, nil, 32, 32, 32, 32, nil, 32, + 32, nil, nil, 32, 32, 33, 33, 33, nil, 33, + nil, nil, nil, 33, 33, nil, nil, nil, 33, nil, + 33, 33, 33, 33, 33, 33, 33, nil, nil, nil, + nil, nil, 33, 33, 33, 33, 33, 33, 33, nil, + nil, 33, nil, nil, nil, nil, nil, nil, 33, nil, + nil, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, nil, 33, 33, nil, 33, 33, 33, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 33, + nil, nil, 33, nil, nil, 33, 33, nil, nil, 33, + nil, 33, nil, 33, nil, 33, nil, nil, nil, nil, + nil, nil, nil, 33, nil, nil, nil, nil, 33, 33, + 33, 33, 33, 33, nil, nil, nil, 33, 33, nil, + nil, nil, nil, nil, nil, 33, nil, 33, 33, 33, + 33, nil, 33, 33, nil, nil, 33, 33, 34, 34, + 34, nil, 34, nil, nil, nil, 34, 34, nil, nil, + nil, 34, nil, 34, 34, 34, 34, 34, 34, 34, + nil, nil, nil, nil, nil, 34, 34, 34, 34, 34, + 34, 34, nil, nil, 34, nil, nil, nil, nil, nil, + nil, 34, nil, nil, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, nil, 34, 34, nil, + 34, 34, 34, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 34, nil, nil, 34, nil, nil, 34, 34, + nil, nil, 34, nil, 34, nil, 34, nil, 34, nil, + nil, nil, nil, nil, nil, nil, 34, nil, nil, nil, + nil, 34, 34, 34, 34, 34, 34, nil, nil, nil, + 34, 34, nil, nil, nil, nil, nil, nil, 34, nil, + 34, 34, 34, 34, nil, 34, 34, nil, nil, 34, + 34, 44, 44, 44, nil, 44, nil, nil, nil, 44, + 44, nil, nil, nil, 44, nil, 44, 44, 44, 44, + 44, 44, 44, nil, nil, nil, nil, nil, 44, 44, + 44, 44, 44, 44, 44, nil, nil, 44, nil, nil, + nil, nil, nil, nil, 44, nil, nil, 44, 44, 44, + 44, 44, 44, 44, 44, nil, 44, 44, 44, nil, + 44, 44, nil, 44, 44, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 44, nil, nil, 44, nil, + nil, 44, 44, nil, nil, 44, nil, nil, nil, nil, + nil, 44, nil, nil, nil, nil, nil, nil, nil, 44, + nil, nil, nil, nil, 44, 44, 44, 44, 44, 44, + nil, nil, nil, 44, 44, nil, nil, nil, nil, nil, + nil, 44, nil, nil, 44, 44, 44, nil, 44, 44, + nil, nil, 44, 44, 45, 45, 45, nil, 45, nil, + nil, nil, 45, 45, nil, nil, nil, 45, nil, 45, + 45, 45, 45, 45, 45, 45, nil, nil, nil, nil, + nil, 45, 45, 45, 45, 45, 45, 45, nil, nil, + 45, nil, nil, nil, nil, nil, nil, 45, nil, nil, + 45, 45, 45, 45, 45, 45, 45, 45, nil, 45, + 45, 45, nil, 45, 45, nil, 45, 45, 45, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 45, nil, + nil, 45, nil, nil, 45, 45, nil, nil, 45, nil, + nil, nil, nil, nil, 45, nil, nil, nil, nil, nil, + nil, nil, 45, nil, nil, nil, nil, 45, 45, 45, + 45, 45, 45, nil, nil, nil, 45, 45, nil, nil, + nil, nil, nil, nil, 45, nil, nil, 45, 45, 45, + nil, 45, 45, nil, nil, 45, 45, 47, 47, 47, + nil, 47, nil, nil, nil, 47, 47, nil, nil, nil, + 47, nil, 47, 47, 47, 47, 47, 47, 47, nil, + nil, nil, nil, nil, 47, 47, 47, 47, 47, 47, + 47, nil, nil, 47, nil, nil, nil, nil, nil, nil, + 47, nil, nil, 47, 47, 47, 47, 47, 47, 47, + 47, nil, 47, 47, 47, nil, 47, 47, nil, 47, + 47, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 47, nil, nil, 47, nil, nil, 47, 47, nil, + nil, 47, nil, nil, nil, nil, nil, 47, nil, nil, + nil, nil, nil, nil, nil, 47, nil, nil, nil, nil, + 47, 47, 47, 47, 47, 47, nil, nil, nil, 47, + 47, nil, nil, nil, nil, nil, nil, 47, nil, nil, + 47, 47, 47, nil, 47, 47, nil, nil, 47, 47, + 48, 48, 48, nil, 48, nil, nil, nil, 48, 48, + nil, nil, nil, 48, nil, 48, 48, 48, 48, 48, + 48, 48, nil, nil, nil, nil, nil, 48, 48, 48, + 48, 48, 48, 48, nil, nil, 48, nil, nil, nil, + nil, nil, nil, 48, nil, nil, 48, 48, 48, 48, + 48, 48, 48, 48, nil, 48, 48, 48, nil, 48, + 48, nil, 48, 48, 48, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 48, nil, nil, 48, nil, nil, + 48, 48, nil, nil, 48, nil, nil, nil, nil, nil, + 48, nil, nil, nil, nil, nil, nil, nil, 48, nil, + nil, nil, nil, 48, 48, 48, 48, 48, 48, nil, + nil, nil, 48, 48, nil, nil, nil, nil, nil, nil, + 48, nil, nil, 48, 48, 48, nil, 48, 48, nil, + nil, 48, 48, 50, 50, 50, nil, 50, nil, nil, + nil, 50, 50, nil, nil, nil, 50, nil, 50, 50, + 50, 50, 50, 50, 50, nil, nil, nil, nil, nil, + 50, 50, 50, 50, 50, 50, 50, nil, nil, 50, + nil, nil, nil, nil, nil, nil, 50, nil, nil, 50, + 50, 50, 50, 50, 50, 50, 50, nil, 50, 50, + 50, nil, 50, 50, nil, 50, 50, 50, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 50, nil, nil, + 50, nil, nil, 50, 50, nil, nil, 50, nil, nil, + nil, nil, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 50, nil, nil, nil, nil, 50, 50, 50, 50, + 50, 50, nil, nil, nil, 50, 50, nil, nil, nil, + nil, nil, nil, 50, nil, nil, 50, 50, 50, 62, + 50, 50, nil, nil, 50, 50, 62, 62, 62, nil, + nil, 62, 62, 62, 1077, 62, 1077, 1077, 1077, 1077, + 1077, nil, nil, 62, nil, 62, 62, 62, nil, nil, + 1077, 716, 716, 716, 716, 62, 62, nil, 62, 62, + 62, 62, 62, nil, nil, nil, nil, 716, 716, 716, + nil, nil, 1077, nil, nil, nil, nil, nil, nil, nil, + 716, 716, nil, 1077, 1077, 716, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + nil, nil, 62, 62, 62, nil, nil, 62, nil, nil, + 62, nil, nil, 62, 62, nil, 62, 1077, 62, nil, + 62, nil, 62, 62, 62, 62, 62, 62, 62, nil, + 62, nil, 62, nil, 716, 716, 716, 716, 716, 716, + nil, nil, nil, 716, 716, 62, 62, 62, 62, nil, + 62, 716, 62, nil, 716, 716, 716, 62, 716, 716, + 467, 62, 64, 64, 64, 64, 64, 467, 467, 467, + 64, 64, 467, 467, 467, 64, 467, 64, 64, 64, + 64, 64, 64, 64, 467, 467, 467, 467, nil, 64, + 64, 64, 64, 64, 64, 64, 467, 467, 64, 467, + 467, 467, 467, 467, 64, 64, nil, 64, 64, 64, + 64, 64, 64, 64, 64, 64, nil, 64, 64, 64, + nil, 64, 64, nil, 64, 64, 64, 467, 467, 467, + 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, + 467, nil, nil, 467, 467, 467, 64, nil, 467, 64, + 467, 467, 64, 64, 467, 467, 64, 467, 64, 467, + nil, 467, 64, 467, 467, 467, 467, 467, 467, 467, + 64, 467, 467, 467, nil, 64, 64, 64, 64, 64, + 64, nil, nil, nil, 64, 64, 467, 467, nil, 467, + nil, 467, 64, nil, nil, 64, 64, 64, 467, 64, + 64, nil, 467, 64, 64, 69, 69, 69, nil, 69, + nil, nil, nil, 69, 69, nil, nil, nil, 69, nil, + 69, 69, 69, 69, 69, 69, 69, nil, nil, nil, + nil, nil, 69, 69, 69, 69, 69, 69, 69, nil, + nil, 69, nil, nil, nil, nil, nil, nil, 69, nil, + nil, 69, 69, 69, 69, 69, 69, 69, 69, nil, + 69, 69, 69, nil, 69, 69, nil, 69, 69, 69, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 69, + nil, nil, 69, nil, nil, 69, 69, nil, nil, 69, + nil, nil, nil, nil, nil, 69, nil, nil, nil, nil, + nil, nil, nil, 69, nil, nil, nil, nil, 69, 69, + 69, 69, 69, 69, nil, nil, nil, 69, 69, nil, + nil, nil, nil, nil, nil, 69, nil, nil, 69, 69, + 69, nil, 69, 69, nil, nil, 69, 69, 70, 70, + 70, nil, 70, nil, nil, nil, 70, 70, nil, nil, + nil, 70, nil, 70, 70, 70, 70, 70, 70, 70, + nil, nil, nil, nil, nil, 70, 70, 70, 70, 70, + 70, 70, nil, nil, 70, nil, nil, nil, nil, nil, + nil, 70, nil, nil, 70, 70, 70, 70, 70, 70, + 70, 70, nil, 70, 70, 70, nil, 70, 70, nil, + 70, 70, 70, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 70, nil, nil, 70, nil, nil, 70, 70, + nil, nil, 70, nil, nil, nil, nil, nil, 70, nil, + nil, nil, nil, nil, nil, nil, 70, nil, nil, nil, + nil, 70, 70, 70, 70, 70, 70, nil, nil, nil, + 70, 70, nil, nil, nil, nil, nil, nil, 70, nil, + nil, 70, 70, 70, nil, 70, 70, nil, nil, 70, + 70, 73, 73, 73, nil, 73, nil, nil, nil, 73, + 73, nil, nil, nil, 73, nil, 73, 73, 73, 73, + 73, 73, 73, nil, nil, nil, nil, nil, 73, 73, + 73, 73, 73, 73, 73, nil, nil, 73, nil, nil, + nil, nil, nil, nil, 73, nil, nil, 73, 73, 73, + 73, 73, 73, 73, 73, nil, 73, 73, 73, nil, + 73, 73, nil, 73, 73, 73, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 73, nil, nil, 73, nil, + nil, 73, 73, nil, nil, 73, nil, nil, nil, nil, + nil, 73, nil, nil, nil, nil, nil, nil, nil, 73, + nil, nil, nil, nil, 73, 73, 73, 73, 73, 73, + nil, nil, nil, 73, 73, 73, nil, nil, nil, nil, + 73, 73, nil, nil, 73, 73, 73, nil, 73, 73, + nil, nil, 73, 73, 130, 130, 130, 130, 130, nil, + nil, nil, 130, 130, nil, nil, nil, 130, nil, 130, + 130, 130, 130, 130, 130, 130, nil, nil, nil, nil, + nil, 130, 130, 130, 130, 130, 130, 130, nil, nil, + 130, nil, nil, nil, nil, nil, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, nil, 130, + 130, 130, nil, 130, 130, nil, 130, 130, 130, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 130, nil, + nil, 130, nil, nil, 130, 130, nil, nil, 130, nil, + 130, nil, nil, nil, 130, nil, nil, nil, nil, nil, + nil, nil, 130, nil, nil, nil, nil, 130, 130, 130, + 130, 130, 130, nil, nil, nil, 130, 130, nil, nil, + nil, nil, nil, 130, 130, nil, nil, 130, 130, 130, + nil, 130, 130, nil, nil, 130, 130, 135, 135, 135, + nil, 135, nil, nil, nil, 135, 135, nil, nil, nil, + 135, nil, 135, 135, 135, 135, 135, 135, 135, nil, + nil, nil, nil, nil, 135, 135, 135, 135, 135, 135, + 135, nil, nil, 135, nil, nil, nil, nil, nil, nil, + 135, nil, nil, 135, 135, 135, 135, 135, 135, 135, + 135, nil, 135, 135, 135, nil, 135, 135, nil, 135, + 135, 135, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 135, nil, nil, 135, nil, nil, 135, 135, nil, + nil, 135, nil, nil, nil, nil, nil, 135, nil, nil, + nil, nil, nil, nil, nil, 135, nil, nil, nil, nil, + 135, 135, 135, 135, 135, 135, nil, nil, nil, 135, + 135, nil, nil, nil, nil, nil, nil, 135, nil, nil, + 135, 135, 135, nil, 135, 135, nil, nil, 135, 135, + 136, 136, 136, nil, 136, nil, nil, nil, 136, 136, + nil, nil, nil, 136, nil, 136, 136, 136, 136, 136, + 136, 136, nil, nil, nil, nil, nil, 136, 136, 136, + 136, 136, 136, 136, nil, nil, 136, nil, nil, nil, + nil, nil, nil, 136, nil, nil, 136, 136, 136, 136, + 136, 136, 136, 136, nil, 136, 136, 136, nil, 136, + 136, nil, 136, 136, 136, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 136, nil, nil, 136, nil, nil, + 136, 136, nil, nil, 136, nil, nil, nil, nil, nil, + 136, nil, nil, nil, nil, nil, nil, nil, 136, nil, + nil, nil, nil, 136, 136, 136, 136, 136, 136, nil, + nil, nil, 136, 136, nil, nil, nil, nil, nil, nil, + 136, nil, nil, 136, 136, 136, nil, 136, 136, nil, + nil, 136, 136, 137, 137, 137, nil, 137, nil, nil, + nil, 137, 137, nil, nil, nil, 137, nil, 137, 137, + 137, 137, 137, 137, 137, nil, nil, nil, nil, nil, + 137, 137, 137, 137, 137, 137, 137, nil, nil, 137, + nil, nil, nil, nil, nil, nil, 137, nil, nil, 137, + 137, 137, 137, 137, 137, 137, 137, nil, 137, 137, + 137, nil, 137, 137, nil, 137, 137, 137, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 137, nil, nil, + 137, nil, nil, 137, 137, nil, nil, 137, nil, nil, + nil, nil, nil, 137, nil, nil, nil, nil, nil, nil, + nil, 137, nil, nil, nil, nil, 137, 137, 137, 137, + 137, 137, nil, nil, nil, 137, 137, nil, nil, nil, + nil, nil, nil, 137, nil, nil, 137, 137, 137, nil, + 137, 137, nil, nil, 137, 137, 138, 138, 138, nil, + 138, nil, nil, nil, 138, 138, nil, nil, nil, 138, + nil, 138, 138, 138, 138, 138, 138, 138, nil, nil, + nil, nil, nil, 138, 138, 138, 138, 138, 138, 138, + nil, nil, 138, nil, nil, nil, nil, nil, nil, 138, + nil, nil, 138, 138, 138, 138, 138, 138, 138, 138, + nil, 138, 138, 138, nil, 138, 138, nil, 138, 138, + 138, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 138, nil, nil, 138, nil, nil, 138, 138, nil, nil, + 138, nil, nil, nil, nil, nil, 138, nil, nil, nil, + nil, nil, nil, nil, 138, nil, nil, nil, nil, 138, + 138, 138, 138, 138, 138, nil, nil, nil, 138, 138, + nil, nil, nil, nil, nil, nil, 138, nil, nil, 138, + 138, 138, nil, 138, 138, nil, nil, 138, 138, 139, + 139, 139, 139, 139, nil, nil, nil, 139, 139, nil, + nil, nil, 139, nil, 139, 139, 139, 139, 139, 139, + 139, nil, nil, nil, nil, nil, 139, 139, 139, 139, + 139, 139, 139, nil, nil, 139, nil, nil, nil, nil, + nil, 139, 139, nil, 139, 139, 139, 139, 139, 139, + 139, 139, 139, nil, 139, 139, 139, nil, 139, 139, + nil, 139, 139, 139, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 139, nil, nil, 139, nil, nil, 139, + 139, nil, nil, 139, nil, 139, nil, nil, nil, 139, + nil, nil, nil, nil, nil, nil, nil, 139, nil, nil, + nil, nil, 139, 139, 139, 139, 139, 139, nil, nil, + nil, 139, 139, nil, nil, nil, nil, nil, nil, 139, + nil, nil, 139, 139, 139, nil, 139, 139, nil, nil, + 139, 139, 224, 224, 224, nil, 224, nil, nil, nil, + 224, 224, nil, nil, nil, 224, nil, 224, 224, 224, + 224, 224, 224, 224, nil, nil, nil, nil, nil, 224, + 224, 224, 224, 224, 224, 224, nil, nil, 224, nil, + nil, nil, nil, nil, nil, 224, nil, nil, 224, 224, + 224, 224, 224, 224, 224, 224, nil, 224, 224, 224, + nil, 224, 224, nil, 224, 224, 224, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 224, nil, nil, 224, + nil, nil, 224, 224, nil, nil, 224, nil, 224, nil, + nil, nil, 224, nil, nil, nil, nil, nil, nil, nil, + 224, nil, nil, nil, nil, 224, 224, 224, 224, 224, + 224, nil, nil, nil, 224, 224, nil, nil, nil, nil, + nil, nil, 224, nil, nil, 224, 224, 224, nil, 224, + 224, nil, nil, 224, 224, 225, 225, 225, nil, 225, + nil, nil, nil, 225, 225, nil, nil, nil, 225, nil, + 225, 225, 225, 225, 225, 225, 225, nil, nil, nil, + nil, nil, 225, 225, 225, 225, 225, 225, 225, nil, + nil, 225, nil, nil, nil, nil, nil, nil, 225, nil, + nil, 225, 225, 225, 225, 225, 225, 225, 225, nil, + 225, 225, 225, nil, 225, 225, nil, 225, 225, 225, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 225, + nil, nil, 225, nil, nil, 225, 225, nil, nil, 225, + nil, 225, nil, nil, nil, 225, nil, nil, nil, nil, + nil, nil, nil, 225, nil, nil, nil, nil, 225, 225, + 225, 225, 225, 225, nil, nil, nil, 225, 225, nil, + nil, nil, nil, nil, nil, 225, nil, nil, 225, 225, + 225, nil, 225, 225, nil, nil, 225, 225, 226, 226, + 226, nil, 226, nil, nil, nil, 226, 226, nil, nil, + nil, 226, nil, 226, 226, 226, 226, 226, 226, 226, + nil, nil, nil, nil, nil, 226, 226, 226, 226, 226, + 226, 226, nil, nil, 226, nil, nil, nil, nil, nil, + nil, 226, nil, nil, 226, 226, 226, 226, 226, 226, + 226, 226, nil, 226, 226, 226, nil, 226, 226, nil, + 226, 226, 226, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 226, nil, nil, 226, nil, nil, 226, 226, + nil, nil, 226, nil, nil, nil, nil, nil, 226, nil, + nil, nil, nil, nil, nil, nil, 226, nil, nil, nil, + nil, 226, 226, 226, 226, 226, 226, nil, nil, nil, + 226, 226, nil, nil, nil, nil, nil, nil, 226, nil, + nil, 226, 226, 226, nil, 226, 226, nil, nil, 226, + 226, 227, 227, 227, nil, 227, nil, nil, nil, 227, + 227, nil, nil, nil, 227, nil, 227, 227, 227, 227, + 227, 227, 227, nil, nil, nil, nil, nil, 227, 227, + 227, 227, 227, 227, 227, nil, nil, 227, nil, nil, + nil, nil, nil, nil, 227, nil, nil, 227, 227, 227, + 227, 227, 227, 227, 227, nil, 227, 227, 227, nil, + 227, 227, nil, 227, 227, 227, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 227, nil, nil, 227, nil, + nil, 227, 227, nil, nil, 227, nil, nil, nil, nil, + nil, 227, nil, nil, nil, nil, nil, nil, nil, 227, + nil, nil, nil, nil, 227, 227, 227, 227, 227, 227, + nil, nil, nil, 227, 227, nil, nil, nil, nil, nil, + nil, 227, nil, nil, 227, 227, 227, nil, 227, 227, + nil, nil, 227, 227, 228, 228, 228, nil, 228, nil, + nil, nil, 228, 228, nil, nil, nil, 228, nil, 228, + 228, 228, 228, 228, 228, 228, nil, nil, nil, nil, + nil, 228, 228, 228, 228, 228, 228, 228, nil, nil, + 228, nil, nil, nil, nil, nil, nil, 228, nil, nil, + 228, 228, 228, 228, 228, 228, 228, 228, nil, 228, + 228, 228, nil, 228, 228, nil, 228, 228, 228, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 228, nil, + nil, 228, nil, nil, 228, 228, nil, nil, 228, nil, + nil, nil, nil, nil, 228, nil, nil, nil, nil, nil, + nil, nil, 228, nil, nil, nil, nil, 228, 228, 228, + 228, 228, 228, nil, nil, nil, 228, 228, nil, nil, + nil, nil, nil, nil, 228, nil, nil, 228, 228, 228, + nil, 228, 228, nil, nil, 228, 228, 229, 229, 229, + nil, 229, nil, nil, nil, 229, 229, nil, nil, nil, + 229, nil, 229, 229, 229, 229, 229, 229, 229, nil, + nil, nil, nil, nil, 229, 229, 229, 229, 229, 229, + 229, nil, nil, 229, nil, nil, nil, nil, nil, nil, + 229, nil, nil, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, nil, 229, 229, nil, 229, + 229, 229, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 229, nil, nil, 229, nil, nil, 229, 229, nil, + nil, 229, nil, 229, nil, 229, nil, 229, nil, nil, + nil, nil, nil, nil, nil, 229, nil, nil, nil, nil, + 229, 229, 229, 229, 229, 229, nil, nil, nil, 229, + 229, nil, nil, nil, nil, nil, nil, 229, nil, 229, + 229, 229, 229, nil, 229, 229, nil, nil, 229, 229, + 234, 234, 234, nil, 234, nil, nil, nil, 234, 234, + nil, nil, nil, 234, nil, 234, 234, 234, 234, 234, + 234, 234, nil, nil, nil, nil, nil, 234, 234, 234, + 234, 234, 234, 234, nil, nil, 234, nil, nil, nil, + nil, nil, nil, 234, nil, nil, 234, 234, 234, 234, + 234, 234, 234, 234, nil, 234, 234, 234, nil, 234, + 234, nil, 234, 234, 234, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 234, nil, nil, 234, nil, nil, + 234, 234, nil, nil, 234, nil, nil, nil, nil, nil, + 234, nil, nil, nil, nil, nil, nil, nil, 234, nil, + nil, nil, nil, 234, 234, 234, 234, 234, 234, nil, + nil, nil, 234, 234, nil, nil, nil, nil, nil, nil, + 234, nil, nil, 234, 234, 234, nil, 234, 234, nil, + nil, 234, 234, 235, 235, 235, nil, 235, nil, nil, + nil, 235, 235, nil, nil, nil, 235, nil, 235, 235, + 235, 235, 235, 235, 235, nil, nil, nil, nil, nil, + 235, 235, 235, 235, 235, 235, 235, nil, nil, 235, + nil, nil, nil, nil, nil, nil, 235, nil, nil, 235, + 235, 235, 235, 235, 235, 235, 235, nil, 235, 235, + 235, nil, 235, 235, nil, 235, 235, 235, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 235, nil, nil, + 235, nil, nil, 235, 235, nil, nil, 235, nil, nil, + nil, nil, nil, 235, nil, nil, nil, nil, nil, nil, + nil, 235, nil, nil, nil, nil, 235, 235, 235, 235, + 235, 235, nil, nil, nil, 235, 235, nil, nil, nil, + nil, nil, nil, 235, nil, nil, 235, 235, 235, nil, + 235, 235, nil, nil, 235, 235, 236, 236, 236, nil, + 236, nil, nil, nil, 236, 236, nil, nil, nil, 236, + nil, 236, 236, 236, 236, 236, 236, 236, nil, nil, + nil, nil, nil, 236, 236, 236, 236, 236, 236, 236, + nil, nil, 236, nil, nil, nil, nil, nil, nil, 236, + nil, nil, 236, 236, 236, 236, 236, 236, 236, 236, + nil, 236, 236, 236, nil, 236, 236, nil, 236, 236, + 236, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 236, nil, nil, 236, nil, nil, 236, 236, nil, nil, + 236, nil, nil, nil, nil, nil, 236, nil, nil, nil, + nil, nil, nil, nil, 236, nil, nil, nil, nil, 236, + 236, 236, 236, 236, 236, nil, nil, nil, 236, 236, + 236, nil, nil, nil, nil, nil, 236, nil, nil, 236, + 236, 236, nil, 236, 236, nil, nil, 236, 236, 247, + 247, 247, nil, 247, nil, nil, nil, 247, 247, nil, + nil, nil, 247, nil, 247, 247, 247, 247, 247, 247, + 247, nil, nil, nil, nil, nil, 247, 247, 247, 247, + 247, 247, 247, nil, nil, 247, nil, nil, nil, nil, + nil, nil, 247, nil, nil, 247, 247, 247, 247, 247, + 247, 247, 247, nil, 247, 247, 247, nil, 247, 247, + nil, 247, 247, 247, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 247, nil, nil, 247, nil, nil, 247, + 247, nil, nil, 247, nil, nil, nil, nil, nil, 247, + nil, nil, nil, nil, nil, nil, nil, 247, nil, nil, + nil, nil, 247, 247, 247, 247, 247, 247, nil, nil, + nil, 247, 247, nil, nil, nil, nil, nil, nil, 247, + nil, nil, 247, 247, 247, nil, 247, 247, nil, nil, + 247, 247, 251, 251, 251, nil, 251, nil, nil, nil, + 251, 251, nil, nil, nil, 251, nil, 251, 251, 251, + 251, 251, 251, 251, nil, nil, nil, nil, nil, 251, + 251, 251, 251, 251, 251, 251, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 251, nil, nil, 251, 251, + 251, 251, 251, 251, 251, 251, nil, 251, 251, 251, + nil, 251, 251, nil, 251, 251, 251, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 251, nil, nil, 251, + nil, nil, 251, 251, nil, nil, 251, nil, nil, nil, + nil, nil, 251, nil, nil, nil, nil, nil, nil, nil, + 251, nil, nil, nil, nil, 251, 251, 251, 251, 251, + 251, nil, nil, nil, 251, 251, nil, nil, nil, nil, + nil, nil, 251, nil, nil, 251, 251, 251, nil, 251, + 251, nil, nil, 251, 251, 252, 252, 252, nil, 252, + nil, nil, nil, 252, 252, nil, nil, nil, 252, nil, + 252, 252, 252, 252, 252, 252, 252, nil, nil, nil, + nil, nil, 252, 252, 252, 252, 252, 252, 252, nil, + nil, 252, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 252, 252, 252, 252, 252, 252, 252, 252, nil, + 252, 252, 252, nil, 252, 252, nil, 252, 252, 252, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 252, nil, nil, 252, 252, nil, nil, 252, + nil, nil, nil, nil, nil, 252, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, nil, nil, 252, 252, + 252, 252, 252, 252, nil, nil, nil, 252, 252, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 252, 252, + 252, nil, 252, 252, nil, nil, 252, 252, 253, 253, + 253, nil, 253, nil, nil, nil, 253, 253, nil, nil, + nil, 253, nil, 253, 253, 253, 253, 253, 253, 253, + nil, nil, nil, nil, nil, 253, 253, 253, 253, 253, + 253, 253, nil, nil, 253, nil, nil, nil, nil, nil, + nil, 253, nil, nil, 253, 253, 253, 253, 253, 253, + 253, 253, nil, 253, 253, 253, nil, 253, 253, nil, + 253, 253, 253, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 253, nil, nil, 253, nil, nil, 253, 253, + nil, nil, 253, nil, nil, nil, nil, nil, 253, nil, + nil, nil, nil, nil, nil, nil, 253, nil, nil, nil, + nil, 253, 253, 253, 253, 253, 253, nil, nil, nil, + 253, 253, nil, nil, nil, nil, nil, nil, 253, nil, + nil, 253, 253, 253, nil, 253, 253, nil, nil, 253, + 253, 254, 254, 254, nil, 254, nil, nil, nil, 254, + 254, nil, nil, nil, 254, nil, 254, 254, 254, 254, + 254, 254, 254, nil, nil, nil, nil, nil, 254, 254, + 254, 254, 254, 254, 254, nil, nil, 254, nil, nil, + nil, nil, nil, nil, 254, nil, nil, 254, 254, 254, + 254, 254, 254, 254, 254, nil, 254, 254, 254, nil, + 254, 254, nil, 254, 254, 254, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 254, nil, nil, 254, nil, + nil, 254, 254, nil, nil, 254, nil, nil, nil, nil, + nil, 254, nil, nil, nil, nil, nil, nil, nil, 254, + nil, nil, nil, nil, 254, 254, 254, 254, 254, 254, + nil, nil, nil, 254, 254, nil, nil, nil, nil, nil, + nil, 254, nil, nil, 254, 254, 254, nil, 254, 254, + nil, nil, 254, 254, 255, 255, 255, nil, 255, nil, + nil, nil, 255, 255, nil, nil, nil, 255, nil, 255, + 255, 255, 255, 255, 255, 255, nil, nil, nil, nil, + nil, 255, 255, 255, 255, 255, 255, 255, nil, nil, + 255, nil, nil, nil, nil, nil, nil, 255, nil, nil, + 255, 255, 255, 255, 255, 255, 255, 255, nil, 255, + 255, 255, nil, 255, 255, nil, 255, 255, 255, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 255, nil, + nil, 255, nil, nil, 255, 255, nil, nil, 255, nil, + nil, nil, nil, nil, 255, nil, nil, nil, nil, nil, + nil, nil, 255, nil, nil, nil, nil, 255, 255, 255, + 255, 255, 255, nil, nil, nil, 255, 255, nil, nil, + nil, nil, nil, nil, 255, nil, nil, 255, 255, 255, + nil, 255, 255, nil, nil, 255, 255, 256, 256, 256, + nil, 256, nil, nil, nil, 256, 256, nil, nil, nil, + 256, nil, 256, 256, 256, 256, 256, 256, 256, nil, + nil, nil, nil, nil, 256, 256, 256, 256, 256, 256, + 256, nil, nil, 256, nil, nil, nil, nil, nil, nil, + 256, nil, nil, 256, 256, 256, 256, 256, 256, 256, + 256, nil, 256, 256, 256, nil, 256, 256, nil, 256, + 256, 256, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 256, nil, nil, 256, nil, nil, 256, 256, nil, + nil, 256, nil, nil, nil, nil, nil, 256, nil, nil, + nil, nil, nil, nil, nil, 256, nil, nil, nil, nil, + 256, 256, 256, 256, 256, 256, nil, nil, nil, 256, + 256, nil, nil, nil, nil, nil, nil, 256, nil, nil, + 256, 256, 256, nil, 256, 256, nil, nil, 256, 256, + 257, 257, 257, nil, 257, nil, nil, nil, 257, 257, + nil, nil, nil, 257, nil, 257, 257, 257, 257, 257, + 257, 257, nil, nil, nil, nil, nil, 257, 257, 257, + 257, 257, 257, 257, nil, nil, 257, nil, nil, nil, + nil, nil, nil, 257, nil, nil, 257, 257, 257, 257, + 257, 257, 257, 257, nil, 257, 257, 257, nil, 257, + 257, nil, 257, 257, 257, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, 257, nil, nil, + 257, 257, nil, nil, 257, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 257, 257, 257, 257, 257, 257, nil, + nil, nil, 257, 257, nil, nil, nil, nil, nil, nil, + 257, nil, nil, 257, 257, 257, nil, 257, 257, nil, + nil, 257, 257, 258, 258, 258, nil, 258, nil, nil, + nil, 258, 258, nil, nil, nil, 258, nil, 258, 258, + 258, 258, 258, 258, 258, nil, nil, nil, nil, nil, + 258, 258, 258, 258, 258, 258, 258, nil, nil, 258, + nil, nil, nil, nil, nil, nil, 258, nil, nil, 258, + 258, 258, 258, 258, 258, 258, 258, nil, 258, 258, + 258, nil, 258, 258, nil, 258, 258, 258, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 258, nil, nil, + 258, nil, nil, 258, 258, nil, nil, 258, nil, nil, + nil, nil, nil, 258, nil, nil, nil, nil, nil, nil, + nil, 258, nil, nil, nil, nil, 258, 258, 258, 258, + 258, 258, nil, nil, nil, 258, 258, nil, nil, nil, + nil, nil, nil, 258, nil, nil, 258, 258, 258, nil, + 258, 258, nil, nil, 258, 258, 259, 259, 259, nil, + 259, nil, nil, nil, 259, 259, nil, nil, nil, 259, + nil, 259, 259, 259, 259, 259, 259, 259, nil, nil, + nil, nil, nil, 259, 259, 259, 259, 259, 259, 259, + nil, nil, 259, nil, nil, nil, nil, nil, nil, 259, + nil, nil, 259, 259, 259, 259, 259, 259, 259, 259, + nil, 259, 259, 259, nil, 259, 259, nil, 259, 259, + 259, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 259, nil, nil, 259, nil, nil, 259, 259, nil, nil, + 259, nil, nil, nil, nil, nil, 259, nil, nil, nil, + nil, nil, nil, nil, 259, nil, nil, nil, nil, 259, + 259, 259, 259, 259, 259, nil, nil, nil, 259, 259, + nil, nil, nil, nil, nil, nil, 259, nil, nil, 259, + 259, 259, nil, 259, 259, nil, nil, 259, 259, 260, + 260, 260, nil, 260, nil, nil, nil, 260, 260, nil, + nil, nil, 260, nil, 260, 260, 260, 260, 260, 260, + 260, nil, nil, nil, nil, nil, 260, 260, 260, 260, + 260, 260, 260, nil, nil, 260, nil, nil, nil, nil, + nil, nil, 260, nil, nil, 260, 260, 260, 260, 260, + 260, 260, 260, nil, 260, 260, 260, nil, 260, 260, + nil, 260, 260, 260, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 260, nil, nil, 260, nil, nil, 260, + 260, nil, nil, 260, nil, nil, nil, nil, nil, 260, + nil, nil, nil, nil, nil, nil, nil, 260, nil, nil, + nil, nil, 260, 260, 260, 260, 260, 260, nil, nil, + nil, 260, 260, nil, nil, nil, nil, nil, nil, 260, + nil, nil, 260, 260, 260, nil, 260, 260, nil, nil, + 260, 260, 261, 261, 261, nil, 261, nil, nil, nil, + 261, 261, nil, nil, nil, 261, nil, 261, 261, 261, + 261, 261, 261, 261, nil, nil, nil, nil, nil, 261, + 261, 261, 261, 261, 261, 261, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 261, nil, nil, 261, 261, + 261, 261, 261, 261, 261, 261, nil, 261, 261, 261, + nil, 261, 261, nil, 261, 261, 261, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 261, nil, nil, 261, + nil, nil, 261, 261, nil, nil, 261, nil, nil, nil, + nil, nil, 261, nil, nil, nil, nil, nil, nil, nil, + 261, nil, nil, nil, nil, 261, 261, 261, 261, 261, + 261, nil, nil, nil, 261, 261, nil, nil, nil, nil, + nil, nil, 261, nil, nil, 261, 261, 261, nil, 261, + 261, nil, nil, 261, 261, 262, 262, 262, nil, 262, + nil, nil, nil, 262, 262, nil, nil, nil, 262, nil, + 262, 262, 262, 262, 262, 262, 262, nil, nil, nil, + nil, nil, 262, 262, 262, 262, 262, 262, 262, nil, + nil, 262, nil, nil, nil, nil, nil, nil, 262, nil, + nil, 262, 262, 262, 262, 262, 262, 262, 262, nil, + 262, 262, 262, nil, 262, 262, nil, 262, 262, 262, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 262, + nil, nil, 262, nil, nil, 262, 262, nil, nil, 262, + nil, nil, nil, nil, nil, 262, nil, nil, nil, nil, + nil, nil, nil, 262, nil, nil, nil, nil, 262, 262, + 262, 262, 262, 262, nil, nil, nil, 262, 262, nil, + nil, nil, nil, nil, nil, 262, nil, nil, 262, 262, + 262, nil, 262, 262, nil, nil, 262, 262, 263, 263, + 263, nil, 263, nil, nil, nil, 263, 263, nil, nil, + nil, 263, nil, 263, 263, 263, 263, 263, 263, 263, + nil, nil, nil, nil, nil, 263, 263, 263, 263, 263, + 263, 263, nil, nil, 263, nil, nil, nil, nil, nil, + nil, 263, nil, nil, 263, 263, 263, 263, 263, 263, + 263, 263, nil, 263, 263, 263, nil, 263, 263, nil, + 263, 263, 263, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 263, nil, nil, 263, nil, nil, 263, 263, + nil, nil, 263, nil, nil, nil, nil, nil, 263, nil, + nil, nil, nil, nil, nil, nil, 263, nil, nil, nil, + nil, 263, 263, 263, 263, 263, 263, nil, nil, nil, + 263, 263, nil, nil, nil, nil, nil, nil, 263, nil, + nil, 263, 263, 263, nil, 263, 263, nil, nil, 263, + 263, 264, 264, 264, nil, 264, nil, nil, nil, 264, + 264, nil, nil, nil, 264, nil, 264, 264, 264, 264, + 264, 264, 264, nil, nil, nil, nil, nil, 264, 264, + 264, 264, 264, 264, 264, nil, nil, 264, nil, nil, + nil, nil, nil, nil, 264, nil, nil, 264, 264, 264, + 264, 264, 264, 264, 264, nil, 264, 264, 264, nil, + 264, 264, nil, 264, 264, 264, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 264, nil, nil, 264, nil, + nil, 264, 264, nil, nil, 264, nil, nil, nil, nil, + nil, 264, nil, nil, nil, nil, nil, nil, nil, 264, + nil, nil, nil, nil, 264, 264, 264, 264, 264, 264, + nil, nil, nil, 264, 264, nil, nil, nil, nil, nil, + nil, 264, nil, nil, 264, 264, 264, nil, 264, 264, + nil, nil, 264, 264, 265, 265, 265, nil, 265, nil, + nil, nil, 265, 265, nil, nil, nil, 265, nil, 265, + 265, 265, 265, 265, 265, 265, nil, nil, nil, nil, + nil, 265, 265, 265, 265, 265, 265, 265, nil, nil, + 265, nil, nil, nil, nil, nil, nil, 265, nil, nil, + 265, 265, 265, 265, 265, 265, 265, 265, nil, 265, + 265, 265, nil, 265, 265, nil, 265, 265, 265, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 265, nil, + nil, 265, nil, nil, 265, 265, nil, nil, 265, nil, + nil, nil, nil, nil, 265, nil, nil, nil, nil, nil, + nil, nil, 265, nil, nil, nil, nil, 265, 265, 265, + 265, 265, 265, nil, nil, nil, 265, 265, nil, nil, + nil, nil, nil, nil, 265, nil, nil, 265, 265, 265, + nil, 265, 265, nil, nil, 265, 265, 266, 266, 266, + nil, 266, nil, nil, nil, 266, 266, nil, nil, nil, + 266, nil, 266, 266, 266, 266, 266, 266, 266, nil, + nil, nil, nil, nil, 266, 266, 266, 266, 266, 266, + 266, nil, nil, 266, nil, nil, nil, nil, nil, nil, + 266, nil, nil, 266, 266, 266, 266, 266, 266, 266, + 266, nil, 266, 266, 266, nil, 266, 266, nil, 266, + 266, 266, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 266, nil, nil, 266, nil, nil, 266, 266, nil, + nil, 266, nil, nil, nil, nil, nil, 266, nil, nil, + nil, nil, nil, nil, nil, 266, nil, nil, nil, nil, + 266, 266, 266, 266, 266, 266, nil, nil, nil, 266, + 266, nil, nil, nil, nil, nil, nil, 266, nil, nil, + 266, 266, 266, nil, 266, 266, nil, nil, 266, 266, + 267, 267, 267, nil, 267, nil, nil, nil, 267, 267, + nil, nil, nil, 267, nil, 267, 267, 267, 267, 267, + 267, 267, nil, nil, nil, nil, nil, 267, 267, 267, + 267, 267, 267, 267, nil, nil, 267, nil, nil, nil, + nil, nil, nil, 267, nil, nil, 267, 267, 267, 267, + 267, 267, 267, 267, nil, 267, 267, 267, nil, 267, + 267, nil, 267, 267, 267, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 267, nil, nil, 267, nil, nil, + 267, 267, nil, nil, 267, nil, nil, nil, nil, nil, + 267, nil, nil, nil, nil, nil, nil, nil, 267, nil, + nil, nil, nil, 267, 267, 267, 267, 267, 267, nil, + nil, nil, 267, 267, nil, nil, nil, nil, nil, nil, + 267, nil, nil, 267, 267, 267, nil, 267, 267, nil, + nil, 267, 267, 268, 268, 268, nil, 268, nil, nil, + nil, 268, 268, nil, nil, nil, 268, nil, 268, 268, + 268, 268, 268, 268, 268, nil, nil, nil, nil, nil, + 268, 268, 268, 268, 268, 268, 268, nil, nil, 268, + nil, nil, nil, nil, nil, nil, 268, nil, nil, 268, + 268, 268, 268, 268, 268, 268, 268, nil, 268, 268, + 268, nil, 268, 268, nil, 268, 268, 268, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 268, nil, nil, + 268, nil, nil, 268, 268, nil, nil, 268, nil, nil, + nil, nil, nil, 268, nil, nil, nil, nil, nil, nil, + nil, 268, nil, nil, nil, nil, 268, 268, 268, 268, + 268, 268, nil, nil, nil, 268, 268, nil, nil, nil, + nil, nil, nil, 268, nil, nil, 268, 268, 268, nil, + 268, 268, nil, nil, 268, 268, 269, 269, 269, nil, + 269, nil, nil, nil, 269, 269, nil, nil, nil, 269, + nil, 269, 269, 269, 269, 269, 269, 269, nil, nil, + nil, nil, nil, 269, 269, 269, 269, 269, 269, 269, + nil, nil, 269, nil, nil, nil, nil, nil, nil, 269, + nil, nil, 269, 269, 269, 269, 269, 269, 269, 269, + nil, 269, 269, 269, nil, 269, 269, nil, 269, 269, + 269, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 269, nil, nil, 269, nil, nil, 269, 269, nil, nil, + 269, nil, nil, nil, nil, nil, 269, nil, nil, nil, + nil, nil, nil, nil, 269, nil, nil, nil, nil, 269, + 269, 269, 269, 269, 269, nil, nil, nil, 269, 269, + nil, nil, nil, nil, nil, nil, 269, nil, nil, 269, + 269, 269, nil, 269, 269, nil, nil, 269, 269, 270, + 270, 270, nil, 270, nil, nil, nil, 270, 270, nil, + nil, nil, 270, nil, 270, 270, 270, 270, 270, 270, + 270, nil, nil, nil, nil, nil, 270, 270, 270, 270, + 270, 270, 270, nil, nil, 270, nil, nil, nil, nil, + nil, nil, 270, nil, nil, 270, 270, 270, 270, 270, + 270, 270, 270, nil, 270, 270, 270, nil, 270, 270, + nil, 270, 270, 270, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 270, nil, nil, 270, nil, nil, 270, + 270, nil, nil, 270, nil, nil, nil, nil, nil, 270, + nil, nil, nil, nil, nil, nil, nil, 270, nil, nil, + nil, nil, 270, 270, 270, 270, 270, 270, nil, nil, + nil, 270, 270, nil, nil, nil, nil, nil, nil, 270, + nil, nil, 270, 270, 270, nil, 270, 270, nil, nil, + 270, 270, 271, 271, 271, nil, 271, nil, nil, nil, + 271, 271, nil, nil, nil, 271, nil, 271, 271, 271, + 271, 271, 271, 271, nil, nil, nil, nil, nil, 271, + 271, 271, 271, 271, 271, 271, nil, nil, 271, nil, + nil, nil, nil, nil, nil, 271, nil, nil, 271, 271, + 271, 271, 271, 271, 271, 271, nil, 271, 271, 271, + nil, 271, 271, nil, 271, 271, 271, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 271, nil, nil, 271, + nil, nil, 271, 271, nil, nil, 271, nil, nil, nil, + nil, nil, 271, nil, nil, nil, nil, nil, nil, nil, + 271, nil, nil, nil, nil, 271, 271, 271, 271, 271, + 271, nil, nil, nil, 271, 271, nil, nil, nil, nil, + nil, nil, 271, nil, nil, 271, 271, 271, nil, 271, + 271, nil, nil, 271, 271, 272, 272, 272, nil, 272, + nil, nil, nil, 272, 272, nil, nil, nil, 272, nil, + 272, 272, 272, 272, 272, 272, 272, nil, nil, nil, + nil, nil, 272, 272, 272, 272, 272, 272, 272, nil, + nil, 272, nil, nil, nil, nil, nil, nil, 272, nil, + nil, 272, 272, 272, 272, 272, 272, 272, 272, nil, + 272, 272, 272, nil, 272, 272, nil, 272, 272, 272, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 272, + nil, nil, 272, nil, nil, 272, 272, nil, nil, 272, + nil, nil, nil, nil, nil, 272, nil, nil, nil, nil, + nil, nil, nil, 272, nil, nil, nil, nil, 272, 272, + 272, 272, 272, 272, nil, nil, nil, 272, 272, nil, + nil, nil, nil, nil, nil, 272, nil, nil, 272, 272, + 272, nil, 272, 272, nil, nil, 272, 272, 277, 277, + 277, nil, 277, nil, nil, nil, 277, 277, nil, nil, + nil, 277, nil, 277, 277, 277, 277, 277, 277, 277, + nil, nil, nil, nil, nil, 277, 277, 277, 277, 277, + 277, 277, nil, nil, 277, nil, nil, nil, nil, nil, + nil, 277, nil, nil, 277, 277, 277, 277, 277, 277, + 277, 277, nil, 277, 277, 277, nil, 277, 277, nil, + 277, 277, 277, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 277, nil, nil, 277, nil, nil, 277, 277, + nil, nil, 277, nil, nil, nil, nil, nil, 277, nil, + nil, nil, nil, nil, nil, nil, 277, nil, nil, nil, + nil, 277, 277, 277, 277, 277, 277, nil, nil, nil, + 277, 277, nil, nil, nil, nil, nil, nil, 277, nil, + nil, 277, 277, 277, nil, 277, 277, nil, nil, 277, + 277, 285, 285, 285, nil, 285, nil, nil, nil, 285, + 285, nil, nil, nil, 285, nil, 285, 285, 285, 285, + 285, 285, 285, nil, nil, nil, nil, nil, 285, 285, + 285, 285, 285, 285, 285, nil, nil, 285, nil, nil, + nil, nil, nil, nil, 285, nil, nil, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, nil, + 285, 285, nil, 285, 285, 285, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 285, nil, nil, 285, nil, + nil, 285, 285, nil, nil, 285, nil, 285, nil, 285, + nil, 285, nil, nil, nil, nil, nil, nil, nil, 285, + nil, nil, nil, nil, 285, 285, 285, 285, 285, 285, + nil, nil, nil, 285, 285, nil, nil, nil, nil, nil, + nil, 285, nil, 285, 285, 285, 285, nil, 285, 285, + nil, nil, 285, 285, 286, 286, 286, nil, 286, nil, + nil, nil, 286, 286, nil, nil, nil, 286, nil, 286, + 286, 286, 286, 286, 286, 286, nil, nil, nil, nil, + nil, 286, 286, 286, 286, 286, 286, 286, nil, nil, + 286, nil, nil, nil, nil, nil, nil, 286, nil, nil, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, nil, 286, 286, nil, 286, 286, 286, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 286, nil, + nil, 286, nil, nil, 286, 286, nil, nil, 286, nil, + 286, nil, 286, nil, 286, nil, nil, nil, nil, nil, + nil, nil, 286, nil, nil, nil, nil, 286, 286, 286, + 286, 286, 286, nil, nil, nil, 286, 286, nil, nil, + nil, nil, nil, nil, 286, nil, 286, 286, 286, 286, + nil, 286, 286, nil, nil, 286, 286, 295, 295, 295, + nil, 295, nil, nil, nil, 295, 295, nil, nil, nil, + 295, nil, 295, 295, 295, 295, 295, 295, 295, nil, + nil, nil, nil, nil, 295, 295, 295, 295, 295, 295, + 295, nil, nil, 295, nil, nil, nil, nil, nil, nil, + 295, nil, nil, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, nil, 295, 295, nil, 295, + 295, 295, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 295, nil, nil, 295, nil, nil, 295, 295, nil, + nil, 295, nil, 295, nil, 295, nil, 295, nil, nil, + nil, nil, nil, nil, nil, 295, nil, nil, nil, nil, + 295, 295, 295, 295, 295, 295, nil, nil, nil, 295, + 295, 295, nil, nil, nil, nil, nil, 295, nil, 295, + 295, 295, 295, nil, 295, 295, nil, nil, 295, 295, + 302, 302, 302, nil, 302, nil, nil, nil, 302, 302, + nil, nil, nil, 302, nil, 302, 302, 302, 302, 302, + 302, 302, nil, nil, nil, nil, nil, 302, 302, 302, + 302, 302, 302, 302, nil, nil, 302, nil, nil, nil, + nil, nil, nil, 302, nil, nil, 302, 302, 302, 302, + 302, 302, 302, 302, nil, 302, 302, 302, nil, 302, + 302, nil, 302, 302, 302, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 302, nil, nil, 302, nil, nil, + 302, 302, nil, nil, 302, nil, nil, nil, nil, nil, + 302, nil, nil, nil, nil, nil, nil, nil, 302, nil, + nil, nil, nil, 302, 302, 302, 302, 302, 302, nil, + nil, nil, 302, 302, nil, nil, nil, nil, nil, nil, + 302, nil, nil, 302, 302, 302, nil, 302, 302, nil, + nil, 302, 302, 304, 304, 304, nil, 304, nil, nil, + nil, 304, 304, nil, nil, nil, 304, nil, 304, 304, + 304, 304, 304, 304, 304, nil, nil, nil, nil, nil, + 304, 304, 304, 304, 304, 304, 304, nil, nil, 304, + nil, nil, nil, nil, nil, nil, 304, nil, nil, 304, + 304, 304, 304, 304, 304, 304, 304, nil, 304, 304, + 304, nil, 304, 304, nil, 304, 304, 304, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 304, nil, nil, + 304, nil, nil, 304, 304, nil, nil, 304, nil, nil, + nil, nil, nil, 304, nil, nil, nil, nil, nil, nil, + nil, 304, nil, nil, nil, nil, 304, 304, 304, 304, + 304, 304, nil, nil, nil, 304, 304, nil, nil, nil, + nil, nil, nil, 304, nil, nil, 304, 304, 304, nil, + 304, 304, nil, nil, 304, 304, 307, 307, 307, nil, + 307, nil, nil, nil, 307, 307, nil, nil, nil, 307, + nil, 307, 307, 307, 307, 307, 307, 307, nil, nil, + nil, nil, nil, 307, 307, 307, 307, 307, 307, 307, + nil, nil, 307, nil, nil, nil, nil, nil, nil, 307, + nil, nil, 307, 307, 307, 307, 307, 307, 307, 307, + nil, 307, 307, 307, nil, 307, 307, nil, 307, 307, + 307, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 307, nil, nil, 307, nil, nil, 307, 307, nil, nil, + 307, nil, nil, nil, nil, nil, 307, nil, nil, nil, + nil, nil, nil, nil, 307, nil, nil, nil, nil, 307, + 307, 307, 307, 307, 307, nil, nil, nil, 307, 307, + nil, nil, nil, nil, nil, nil, 307, nil, nil, 307, + 307, 307, nil, 307, 307, nil, nil, 307, 307, 308, + 308, 308, nil, 308, nil, nil, nil, 308, 308, nil, + nil, nil, 308, nil, 308, 308, 308, 308, 308, 308, + 308, nil, nil, nil, nil, nil, 308, 308, 308, 308, + 308, 308, 308, nil, nil, 308, nil, nil, nil, nil, + nil, nil, 308, nil, nil, 308, 308, 308, 308, 308, + 308, 308, 308, nil, 308, 308, 308, nil, 308, 308, + nil, 308, 308, 308, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 308, nil, nil, 308, nil, nil, 308, + 308, nil, nil, 308, nil, nil, nil, nil, nil, 308, + nil, nil, nil, nil, nil, nil, nil, 308, nil, nil, + nil, nil, 308, 308, 308, 308, 308, 308, nil, nil, + nil, 308, 308, nil, nil, nil, nil, nil, nil, 308, + nil, nil, 308, 308, 308, nil, 308, 308, nil, nil, + 308, 308, 314, 314, 314, 314, 314, nil, nil, nil, + 314, 314, nil, nil, nil, 314, nil, 314, 314, 314, + 314, 314, 314, 314, nil, nil, nil, nil, nil, 314, + 314, 314, 314, 314, 314, 314, nil, nil, 314, nil, + nil, nil, nil, nil, 314, 314, nil, 314, 314, 314, + 314, 314, 314, 314, 314, 314, nil, 314, 314, 314, + nil, 314, 314, nil, 314, 314, 314, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 314, nil, nil, 314, + nil, nil, 314, 314, nil, nil, 314, nil, 314, nil, + nil, nil, 314, nil, nil, nil, nil, nil, nil, nil, + 314, nil, nil, nil, nil, 314, 314, 314, 314, 314, + 314, nil, nil, nil, 314, 314, nil, nil, nil, nil, + nil, nil, 314, nil, nil, 314, 314, 314, nil, 314, + 314, nil, nil, 314, 314, 348, 348, 348, nil, 348, + nil, nil, nil, 348, 348, nil, nil, nil, 348, nil, + 348, 348, 348, 348, 348, 348, 348, nil, nil, nil, + nil, nil, 348, 348, 348, 348, 348, 348, 348, nil, + nil, 348, nil, nil, nil, nil, nil, nil, 348, nil, + nil, 348, 348, 348, 348, 348, 348, 348, 348, nil, + 348, 348, 348, nil, 348, 348, nil, 348, 348, 348, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 348, + nil, nil, 348, nil, nil, 348, 348, nil, nil, 348, + nil, nil, nil, nil, nil, 348, nil, nil, nil, nil, + nil, nil, nil, 348, nil, nil, nil, nil, 348, 348, + 348, 348, 348, 348, nil, nil, nil, 348, 348, nil, + nil, nil, nil, nil, nil, 348, nil, nil, 348, 348, + 348, nil, 348, 348, nil, nil, 348, 348, 350, 350, + 350, nil, 350, nil, nil, nil, 350, 350, nil, nil, + nil, 350, nil, 350, 350, 350, 350, 350, 350, 350, + nil, nil, nil, nil, nil, 350, 350, 350, 350, 350, + 350, 350, nil, nil, 350, nil, nil, nil, nil, nil, + nil, 350, nil, nil, 350, 350, 350, 350, 350, 350, + 350, 350, nil, 350, 350, 350, nil, 350, 350, nil, + 350, 350, 350, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 350, nil, nil, 350, 350, nil, 350, 350, + nil, nil, 350, nil, nil, nil, nil, nil, 350, nil, + nil, nil, nil, nil, nil, nil, 350, nil, nil, nil, + nil, 350, 350, 350, 350, 350, 350, nil, nil, nil, + 350, 350, nil, nil, nil, nil, nil, nil, 350, nil, + nil, 350, 350, 350, nil, 350, 350, nil, nil, 350, + 350, 354, 354, 354, nil, 354, nil, nil, nil, 354, + 354, nil, nil, nil, 354, nil, 354, 354, 354, 354, + 354, 354, 354, nil, nil, nil, nil, nil, 354, 354, + 354, 354, 354, 354, 354, nil, nil, 354, nil, nil, + nil, nil, nil, nil, 354, nil, nil, 354, 354, 354, + 354, 354, 354, 354, 354, 354, 354, 354, 354, nil, + 354, 354, nil, 354, 354, 354, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 354, nil, nil, 354, nil, + nil, 354, 354, nil, nil, 354, nil, 354, nil, nil, + nil, 354, nil, nil, nil, nil, nil, nil, nil, 354, + nil, nil, nil, nil, 354, 354, 354, 354, 354, 354, + nil, nil, nil, 354, 354, nil, nil, nil, nil, nil, + nil, 354, nil, 354, 354, 354, 354, nil, 354, 354, + nil, nil, 354, 354, 355, 355, 355, nil, 355, nil, + nil, nil, 355, 355, nil, nil, nil, 355, nil, 355, + 355, 355, 355, 355, 355, 355, nil, nil, nil, nil, + nil, 355, 355, 355, 355, 355, 355, 355, nil, nil, + 355, nil, nil, nil, nil, nil, nil, 355, nil, nil, + 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, nil, 355, 355, nil, 355, 355, 355, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 355, nil, + nil, 355, nil, nil, 355, 355, nil, nil, 355, nil, + nil, nil, nil, nil, 355, nil, nil, nil, nil, nil, + nil, nil, 355, nil, nil, nil, nil, 355, 355, 355, + 355, 355, 355, nil, nil, nil, 355, 355, nil, nil, + nil, nil, nil, nil, 355, nil, 355, 355, 355, 355, + nil, 355, 355, nil, nil, 355, 355, 360, 360, 360, + nil, 360, nil, nil, nil, 360, 360, nil, nil, nil, + 360, nil, 360, 360, 360, 360, 360, 360, 360, nil, + nil, nil, nil, nil, 360, 360, 360, 360, 360, 360, + 360, nil, nil, 360, nil, nil, nil, nil, nil, nil, + 360, nil, nil, 360, 360, 360, 360, 360, 360, 360, + 360, nil, 360, 360, 360, nil, 360, 360, nil, 360, + 360, 360, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 360, nil, nil, 360, nil, nil, 360, 360, nil, + nil, 360, nil, nil, nil, nil, nil, 360, nil, nil, + nil, nil, nil, nil, nil, 360, nil, nil, nil, nil, + 360, 360, 360, 360, 360, 360, nil, nil, nil, 360, + 360, nil, nil, nil, nil, nil, nil, 360, nil, nil, + 360, 360, 360, nil, 360, 360, nil, nil, 360, 360, + 381, 381, 381, nil, 381, nil, nil, nil, 381, 381, + nil, nil, nil, 381, nil, 381, 381, 381, 381, 381, + 381, 381, nil, nil, nil, nil, nil, 381, 381, 381, + 381, 381, 381, 381, nil, nil, 381, nil, nil, nil, + nil, nil, nil, 381, nil, nil, 381, 381, 381, 381, + 381, 381, 381, 381, nil, 381, 381, 381, nil, 381, + 381, nil, 381, 381, 381, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 381, nil, nil, 381, nil, nil, + 381, 381, nil, nil, 381, nil, nil, nil, nil, nil, + 381, nil, nil, nil, nil, nil, nil, nil, 381, nil, + nil, nil, nil, 381, 381, 381, 381, 381, 381, nil, + nil, nil, 381, 381, nil, nil, nil, nil, nil, nil, + 381, nil, nil, 381, 381, 381, nil, 381, 381, nil, + nil, 381, 381, 442, 442, 442, nil, 442, nil, nil, + nil, 442, 442, nil, nil, nil, 442, nil, 442, 442, + 442, 442, 442, 442, 442, nil, nil, nil, nil, nil, + 442, 442, 442, 442, 442, 442, 442, nil, nil, 442, + nil, nil, nil, nil, nil, nil, 442, nil, nil, 442, + 442, 442, 442, 442, 442, 442, 442, nil, 442, 442, + 442, nil, 442, 442, nil, 442, 442, 442, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 442, nil, nil, + 442, nil, nil, 442, 442, nil, nil, 442, nil, nil, + nil, nil, nil, 442, nil, nil, nil, nil, nil, nil, + nil, 442, nil, nil, nil, nil, 442, 442, 442, 442, + 442, 442, nil, nil, nil, 442, 442, nil, nil, nil, + nil, nil, nil, 442, nil, nil, 442, 442, 442, 476, + 442, 442, nil, nil, 442, 442, 476, 476, 476, nil, + nil, 476, 476, 476, 1075, 476, 1075, 1075, 1075, 1075, + 1075, nil, nil, 476, 476, 476, 476, 476, nil, nil, + 1075, nil, nil, nil, nil, 476, 476, nil, 476, 476, + 476, 476, 476, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1075, nil, nil, nil, nil, nil, nil, nil, + nil, 1075, 1075, 1075, 1075, nil, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + nil, nil, 476, 476, 476, nil, nil, 476, nil, nil, + 476, nil, nil, 476, 476, nil, 476, 1075, 476, nil, + 476, nil, 476, 476, 476, 476, 476, 476, 476, nil, + 476, 476, 476, 1079, nil, 1079, 1079, 1079, 1079, 1079, + nil, nil, nil, nil, nil, 476, 476, 476, 476, 1079, + 476, 477, 476, nil, nil, nil, nil, 476, 477, 477, + 477, 476, nil, 477, 477, 477, nil, 477, nil, nil, + nil, 1079, nil, nil, nil, 477, 477, 477, 477, 477, + nil, nil, 1079, 1079, nil, nil, nil, 477, 477, nil, + 477, 477, 477, 477, 477, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1079, nil, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, nil, nil, 477, 477, 477, nil, nil, 477, + nil, nil, 477, nil, nil, 477, 477, nil, 477, nil, + 477, nil, 477, nil, 477, 477, 477, 477, 477, 477, + 477, nil, 477, 477, 477, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 477, 477, 477, + 477, nil, 477, nil, 477, nil, 486, 486, 486, 477, + 486, nil, nil, 477, 486, 486, nil, nil, nil, 486, + nil, 486, 486, 486, 486, 486, 486, 486, nil, nil, + nil, nil, nil, 486, 486, 486, 486, 486, 486, 486, + nil, nil, 486, nil, nil, nil, nil, nil, nil, 486, + nil, nil, 486, 486, 486, 486, 486, 486, 486, 486, + 486, 486, 486, 486, nil, 486, 486, nil, 486, 486, + 486, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 486, nil, nil, 486, nil, nil, 486, 486, nil, nil, + 486, nil, 486, nil, 486, nil, 486, nil, nil, nil, + nil, nil, nil, nil, 486, nil, nil, nil, nil, 486, + 486, 486, 486, 486, 486, nil, nil, nil, 486, 486, + nil, nil, nil, nil, nil, nil, 486, nil, 486, 486, + 486, 486, nil, 486, 486, nil, nil, 486, 486, 488, + 488, 488, nil, 488, nil, nil, nil, 488, 488, nil, + nil, nil, 488, nil, 488, 488, 488, 488, 488, 488, + 488, nil, nil, nil, nil, nil, 488, 488, 488, 488, + 488, 488, 488, nil, nil, 488, nil, nil, nil, nil, + nil, nil, 488, nil, nil, 488, 488, 488, 488, 488, + 488, 488, 488, nil, 488, 488, 488, nil, 488, 488, + nil, 488, 488, 488, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 488, nil, nil, 488, nil, nil, 488, + 488, nil, nil, 488, nil, nil, nil, nil, nil, 488, + nil, nil, nil, nil, nil, nil, nil, 488, nil, nil, + nil, nil, 488, 488, 488, 488, 488, 488, nil, nil, + nil, 488, 488, nil, nil, nil, nil, nil, nil, 488, + nil, nil, 488, 488, 488, nil, 488, 488, nil, nil, + 488, 488, 489, 489, 489, nil, 489, nil, nil, nil, + 489, 489, nil, nil, nil, 489, nil, 489, 489, 489, + 489, 489, 489, 489, nil, nil, nil, nil, nil, 489, + 489, 489, 489, 489, 489, 489, nil, nil, 489, nil, + nil, nil, nil, nil, nil, 489, nil, nil, 489, 489, + 489, 489, 489, 489, 489, 489, nil, 489, 489, 489, + nil, 489, 489, nil, 489, 489, 489, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 489, nil, nil, 489, + nil, nil, 489, 489, nil, nil, 489, nil, nil, nil, + nil, nil, 489, nil, nil, nil, nil, nil, nil, nil, + 489, nil, nil, nil, nil, 489, 489, 489, 489, 489, + 489, nil, nil, nil, 489, 489, nil, nil, nil, nil, + nil, nil, 489, nil, nil, 489, 489, 489, nil, 489, + 489, nil, nil, 489, 489, 490, 490, 490, nil, 490, + nil, nil, nil, 490, 490, nil, nil, nil, 490, nil, + 490, 490, 490, 490, 490, 490, 490, nil, nil, nil, + nil, nil, 490, 490, 490, 490, 490, 490, 490, nil, + nil, 490, nil, nil, nil, nil, nil, nil, 490, nil, + nil, 490, 490, 490, 490, 490, 490, 490, 490, nil, + 490, 490, 490, nil, 490, 490, nil, 490, 490, 490, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 490, + nil, nil, 490, nil, nil, 490, 490, nil, nil, 490, + nil, nil, nil, nil, nil, 490, nil, nil, nil, nil, + nil, nil, nil, 490, nil, nil, nil, nil, 490, 490, + 490, 490, 490, 490, nil, nil, nil, 490, 490, nil, + nil, nil, nil, nil, nil, 490, nil, nil, 490, 490, + 490, 517, 490, 490, nil, nil, 490, 490, 517, 517, + 517, nil, nil, 517, 517, 517, nil, 517, 717, 717, + 717, 717, nil, nil, nil, 517, 517, 517, nil, nil, + nil, nil, nil, nil, 717, 717, 717, 517, 517, nil, + 517, 517, 517, 517, 517, nil, nil, 717, 717, nil, + nil, nil, 717, nil, nil, nil, nil, nil, 1081, nil, + 1081, 1081, 1081, 1081, 1081, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1081, nil, nil, nil, nil, 517, + nil, nil, nil, nil, nil, nil, 517, nil, nil, nil, + nil, 517, 517, nil, nil, nil, 1081, nil, nil, nil, + nil, 717, 717, 717, 717, 717, 717, 1081, 1081, nil, + 717, 717, nil, 517, 517, nil, nil, nil, 717, nil, + nil, 717, 717, 717, nil, 717, 717, 517, nil, 522, + 522, 522, 517, 522, nil, nil, nil, 522, 522, 517, + nil, 1081, 522, 517, 522, 522, 522, 522, 522, 522, + 522, nil, nil, nil, nil, nil, 522, 522, 522, 522, + 522, 522, 522, nil, nil, 522, nil, nil, nil, nil, + nil, nil, 522, nil, nil, 522, 522, 522, 522, 522, + 522, 522, 522, nil, 522, 522, 522, nil, 522, 522, + nil, 522, 522, 522, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 522, nil, nil, 522, nil, nil, 522, + 522, nil, nil, 522, nil, nil, nil, nil, nil, 522, + nil, nil, nil, nil, nil, nil, nil, 522, nil, nil, + nil, nil, 522, 522, 522, 522, 522, 522, nil, nil, + nil, 522, 522, nil, nil, nil, nil, nil, nil, 522, + nil, nil, 522, 522, 522, nil, 522, 522, nil, nil, + 522, 522, 532, 532, 532, nil, 532, nil, nil, nil, + 532, 532, nil, nil, nil, 532, nil, 532, 532, 532, + 532, 532, 532, 532, nil, nil, nil, nil, nil, 532, + 532, 532, 532, 532, 532, 532, nil, nil, 532, nil, + nil, nil, nil, nil, nil, 532, nil, nil, 532, 532, + 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, + nil, 532, 532, nil, 532, 532, 532, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 532, nil, nil, 532, + nil, nil, 532, 532, nil, nil, 532, nil, 532, nil, + 532, nil, 532, nil, nil, nil, nil, nil, nil, nil, + 532, nil, nil, nil, nil, 532, 532, 532, 532, 532, + 532, nil, nil, nil, 532, 532, nil, nil, nil, nil, + nil, nil, 532, nil, 532, 532, 532, 532, nil, 532, + 532, nil, nil, 532, 532, 535, 535, 535, nil, 535, + nil, nil, nil, 535, 535, nil, nil, nil, 535, nil, + 535, 535, 535, 535, 535, 535, 535, nil, nil, nil, + nil, nil, 535, 535, 535, 535, 535, 535, 535, nil, + nil, 535, nil, nil, nil, nil, nil, nil, 535, nil, + nil, 535, 535, 535, 535, 535, 535, 535, 535, 535, + 535, 535, 535, nil, 535, 535, nil, 535, 535, 535, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 535, + nil, nil, 535, nil, nil, 535, 535, nil, nil, 535, + nil, nil, nil, 535, nil, 535, nil, nil, nil, nil, + nil, nil, nil, 535, nil, nil, nil, nil, 535, 535, + 535, 535, 535, 535, nil, nil, nil, 535, 535, nil, + nil, nil, nil, nil, nil, 535, nil, 535, 535, 535, + 535, nil, 535, 535, nil, nil, 535, 535, 537, 537, + 537, nil, 537, nil, nil, nil, 537, 537, nil, nil, + nil, 537, nil, 537, 537, 537, 537, 537, 537, 537, + nil, nil, nil, nil, nil, 537, 537, 537, 537, 537, + 537, 537, nil, nil, 537, nil, nil, nil, nil, nil, + nil, 537, nil, nil, 537, 537, 537, 537, 537, 537, + 537, 537, nil, 537, 537, 537, nil, 537, 537, nil, + 537, 537, 537, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 537, nil, nil, 537, nil, nil, 537, 537, + nil, nil, 537, nil, nil, nil, nil, nil, 537, nil, + nil, nil, nil, nil, nil, nil, 537, nil, nil, nil, + nil, 537, 537, 537, 537, 537, 537, nil, nil, nil, + 537, 537, nil, nil, nil, nil, nil, nil, 537, nil, + nil, 537, 537, 537, nil, 537, 537, nil, nil, 537, + 537, 543, 543, 543, 543, 543, nil, nil, nil, 543, + 543, nil, nil, nil, 543, nil, 543, 543, 543, 543, + 543, 543, 543, nil, nil, nil, nil, nil, 543, 543, + 543, 543, 543, 543, 543, nil, nil, 543, nil, nil, + nil, nil, nil, 543, 543, 543, 543, 543, 543, 543, + 543, 543, 543, 543, 543, nil, 543, 543, 543, nil, + 543, 543, nil, 543, 543, 543, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 543, nil, nil, 543, nil, + nil, 543, 543, nil, nil, 543, nil, 543, nil, nil, + nil, 543, nil, nil, nil, nil, nil, nil, nil, 543, + nil, nil, nil, nil, 543, 543, 543, 543, 543, 543, + nil, nil, nil, 543, 543, nil, nil, nil, nil, nil, + 543, 543, nil, nil, 543, 543, 543, nil, 543, 543, + nil, nil, 543, 543, 553, 553, 553, nil, 553, nil, + nil, nil, 553, 553, nil, nil, nil, 553, nil, 553, + 553, 553, 553, 553, 553, 553, nil, nil, nil, nil, + nil, 553, 553, 553, 553, 553, 553, 553, nil, nil, + 553, nil, nil, nil, nil, nil, nil, 553, nil, nil, + 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, nil, 553, 553, nil, 553, 553, 553, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 553, nil, + nil, 553, nil, nil, 553, 553, nil, nil, 553, nil, + 553, nil, 553, nil, 553, nil, nil, nil, nil, nil, + nil, nil, 553, nil, nil, nil, nil, 553, 553, 553, + 553, 553, 553, nil, nil, nil, 553, 553, nil, nil, + nil, nil, nil, nil, 553, nil, 553, 553, 553, 553, + nil, 553, 553, nil, nil, 553, 553, 562, 562, 562, + nil, 562, nil, nil, nil, 562, 562, nil, nil, nil, + 562, nil, 562, 562, 562, 562, 562, 562, 562, nil, + nil, nil, nil, nil, 562, 562, 562, 562, 562, 562, + 562, nil, nil, 562, nil, nil, nil, nil, nil, nil, + 562, nil, nil, 562, 562, 562, 562, 562, 562, 562, + 562, nil, 562, 562, 562, nil, 562, 562, nil, 562, + 562, 562, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 562, nil, nil, 562, nil, nil, 562, 562, nil, + nil, 562, nil, nil, nil, nil, nil, 562, nil, nil, + nil, nil, nil, nil, nil, 562, nil, nil, nil, nil, + 562, 562, 562, 562, 562, 562, nil, nil, nil, 562, + 562, nil, nil, nil, nil, nil, nil, 562, nil, nil, + 562, 562, 562, nil, 562, 562, nil, nil, 562, 562, + 565, 565, 565, nil, 565, nil, nil, nil, 565, 565, + nil, nil, nil, 565, nil, 565, 565, 565, 565, 565, + 565, 565, nil, nil, nil, nil, nil, 565, 565, 565, + 565, 565, 565, 565, nil, nil, 565, nil, nil, nil, + nil, nil, nil, 565, nil, nil, 565, 565, 565, 565, + 565, 565, 565, 565, nil, 565, 565, 565, nil, 565, + 565, nil, 565, 565, 565, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 565, nil, nil, 565, nil, nil, + 565, 565, nil, nil, 565, nil, nil, nil, nil, nil, + 565, nil, nil, nil, nil, nil, nil, nil, 565, nil, + nil, nil, nil, 565, 565, 565, 565, 565, 565, nil, + nil, nil, 565, 565, nil, nil, nil, nil, nil, nil, + 565, nil, nil, 565, 565, 565, nil, 565, 565, nil, + nil, 565, 565, 568, 568, 568, nil, 568, nil, nil, + nil, 568, 568, nil, nil, nil, 568, nil, 568, 568, + 568, 568, 568, 568, 568, nil, nil, nil, nil, nil, + 568, 568, 568, 568, 568, 568, 568, nil, nil, 568, + nil, nil, nil, nil, nil, nil, 568, nil, nil, 568, + 568, 568, 568, 568, 568, 568, 568, nil, 568, 568, + 568, nil, 568, 568, nil, 568, 568, 568, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 568, nil, nil, + 568, nil, nil, 568, 568, nil, nil, 568, nil, nil, + nil, nil, nil, 568, nil, nil, nil, nil, nil, nil, + nil, 568, nil, nil, nil, nil, 568, 568, 568, 568, + 568, 568, nil, nil, nil, 568, 568, nil, nil, nil, + nil, nil, nil, 568, nil, nil, 568, 568, 568, nil, + 568, 568, nil, nil, 568, 568, 592, 592, 592, nil, + 592, nil, nil, nil, 592, 592, nil, nil, nil, 592, + nil, 592, 592, 592, 592, 592, 592, 592, nil, nil, + nil, nil, nil, 592, 592, 592, 592, 592, 592, 592, + nil, nil, 592, nil, nil, nil, nil, nil, nil, 592, + nil, nil, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, nil, 592, 592, nil, 592, 592, + 592, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 592, nil, nil, 592, nil, nil, 592, 592, nil, nil, + 592, nil, 592, nil, 592, nil, 592, nil, nil, nil, + nil, nil, nil, nil, 592, nil, nil, nil, nil, 592, + 592, 592, 592, 592, 592, nil, nil, nil, 592, 592, + nil, nil, nil, nil, nil, nil, 592, nil, 592, 592, + 592, 592, nil, 592, 592, nil, nil, 592, 592, 602, + 602, 602, nil, 602, nil, nil, nil, 602, 602, nil, + nil, nil, 602, nil, 602, 602, 602, 602, 602, 602, + 602, nil, nil, nil, nil, nil, 602, 602, 602, 602, + 602, 602, 602, nil, nil, 602, nil, nil, nil, nil, + nil, nil, 602, nil, nil, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, 602, 602, nil, 602, 602, + nil, 602, 602, 602, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 602, nil, nil, 602, nil, nil, 602, + 602, nil, nil, 602, nil, 602, nil, 602, nil, 602, + nil, nil, nil, nil, nil, nil, nil, 602, nil, nil, + nil, nil, 602, 602, 602, 602, 602, 602, nil, nil, + nil, 602, 602, nil, nil, nil, nil, nil, nil, 602, + nil, 602, 602, 602, 602, nil, 602, 602, nil, nil, + 602, 602, 612, 612, 612, nil, 612, nil, nil, nil, + 612, 612, nil, nil, nil, 612, nil, 612, 612, 612, + 612, 612, 612, 612, nil, nil, nil, nil, nil, 612, + 612, 612, 612, 612, 612, 612, nil, nil, 612, nil, + nil, nil, nil, nil, nil, 612, nil, nil, 612, 612, + 612, 612, 612, 612, 612, 612, nil, 612, 612, 612, + nil, 612, 612, nil, 612, 612, 612, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 612, nil, nil, 612, + nil, nil, 612, 612, nil, nil, 612, nil, nil, nil, + nil, nil, 612, nil, nil, nil, nil, nil, nil, nil, + 612, nil, nil, nil, nil, 612, 612, 612, 612, 612, + 612, nil, nil, nil, 612, 612, nil, nil, nil, nil, + nil, nil, 612, nil, nil, 612, 612, 612, nil, 612, + 612, nil, nil, 612, 612, 635, 635, 635, nil, 635, + nil, nil, nil, 635, 635, nil, nil, nil, 635, nil, + 635, 635, 635, 635, 635, 635, 635, nil, nil, nil, + nil, nil, 635, 635, 635, 635, 635, 635, 635, nil, + nil, 635, nil, nil, nil, nil, nil, nil, 635, nil, + nil, 635, 635, 635, 635, 635, 635, 635, 635, nil, + 635, 635, 635, nil, 635, 635, nil, 635, 635, 635, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 635, + nil, nil, 635, nil, nil, 635, 635, nil, nil, 635, + nil, nil, nil, nil, nil, 635, nil, nil, nil, nil, + nil, nil, nil, 635, nil, nil, nil, nil, 635, 635, + 635, 635, 635, 635, nil, nil, nil, 635, 635, nil, + nil, nil, nil, nil, nil, 635, nil, nil, 635, 635, + 635, nil, 635, 635, nil, nil, 635, 635, 674, 674, + 674, 674, 674, nil, nil, nil, 674, 674, nil, nil, + nil, 674, nil, 674, 674, 674, 674, 674, 674, 674, + nil, nil, nil, nil, nil, 674, 674, 674, 674, 674, + 674, 674, nil, nil, 674, nil, nil, nil, nil, nil, + 674, 674, nil, 674, 674, 674, 674, 674, 674, 674, + 674, 674, nil, 674, 674, 674, nil, 674, 674, nil, + 674, 674, 674, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 674, nil, nil, 674, nil, nil, 674, 674, + nil, nil, 674, nil, 674, nil, nil, nil, 674, nil, + nil, nil, nil, nil, nil, nil, 674, nil, nil, nil, + nil, 674, 674, 674, 674, 674, 674, nil, nil, nil, + 674, 674, nil, nil, nil, nil, nil, nil, 674, nil, + nil, 674, 674, 674, nil, 674, 674, nil, nil, 674, + 674, 676, 676, 676, nil, 676, nil, nil, nil, 676, + 676, nil, nil, nil, 676, nil, 676, 676, 676, 676, + 676, 676, 676, nil, nil, nil, nil, nil, 676, 676, + 676, 676, 676, 676, 676, nil, nil, 676, nil, nil, + nil, nil, nil, nil, 676, nil, nil, 676, 676, 676, + 676, 676, 676, 676, 676, nil, 676, 676, 676, nil, + 676, 676, nil, 676, 676, 676, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 676, nil, nil, 676, nil, + nil, 676, 676, nil, nil, 676, nil, 676, nil, nil, + nil, 676, nil, nil, nil, nil, nil, nil, nil, 676, + nil, nil, nil, nil, 676, 676, 676, 676, 676, 676, + nil, nil, nil, 676, 676, nil, nil, nil, nil, nil, + nil, 676, nil, nil, 676, 676, 676, nil, 676, 676, + nil, nil, 676, 676, 677, 677, 677, nil, 677, nil, + nil, nil, 677, 677, nil, nil, nil, 677, nil, 677, + 677, 677, 677, 677, 677, 677, nil, nil, nil, nil, + nil, 677, 677, 677, 677, 677, 677, 677, nil, nil, + 677, nil, nil, nil, nil, nil, nil, 677, nil, nil, + 677, 677, 677, 677, 677, 677, 677, 677, nil, 677, + 677, 677, nil, 677, 677, nil, 677, 677, 677, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 677, nil, + nil, 677, nil, nil, 677, 677, nil, nil, 677, nil, + nil, nil, nil, nil, 677, nil, nil, nil, nil, nil, + nil, nil, 677, nil, nil, nil, nil, 677, 677, 677, + 677, 677, 677, nil, nil, nil, 677, 677, nil, nil, + nil, nil, nil, nil, 677, nil, nil, 677, 677, 677, + nil, 677, 677, nil, nil, 677, 677, 678, 678, 678, + nil, 678, nil, nil, nil, 678, 678, nil, nil, nil, + 678, nil, 678, 678, 678, 678, 678, 678, 678, nil, + nil, nil, nil, nil, 678, 678, 678, 678, 678, 678, + 678, nil, nil, 678, nil, nil, nil, nil, nil, nil, + 678, nil, nil, 678, 678, 678, 678, 678, 678, 678, + 678, 678, 678, 678, 678, nil, 678, 678, nil, 678, + 678, 678, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 678, nil, nil, 678, nil, nil, 678, 678, nil, + nil, 678, nil, 678, nil, 678, nil, 678, nil, nil, + nil, nil, nil, nil, nil, 678, nil, nil, nil, nil, + 678, 678, 678, 678, 678, 678, nil, nil, nil, 678, + 678, nil, nil, nil, nil, nil, nil, 678, nil, 678, + 678, 678, 678, nil, 678, 678, nil, nil, 678, 678, + 681, 681, 681, 681, 681, nil, nil, nil, 681, 681, + nil, nil, nil, 681, nil, 681, 681, 681, 681, 681, + 681, 681, nil, nil, nil, nil, nil, 681, 681, 681, + 681, 681, 681, 681, nil, nil, 681, nil, nil, nil, + nil, nil, 681, 681, nil, 681, 681, 681, 681, 681, + 681, 681, 681, 681, nil, 681, 681, 681, nil, 681, + 681, nil, 681, 681, 681, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 681, nil, nil, 681, nil, nil, + 681, 681, nil, nil, 681, nil, 681, nil, nil, nil, + 681, nil, nil, nil, nil, nil, nil, nil, 681, nil, + nil, nil, nil, 681, 681, 681, 681, 681, 681, nil, + nil, nil, 681, 681, nil, nil, nil, nil, nil, nil, + 681, nil, nil, 681, 681, 681, nil, 681, 681, nil, + nil, 681, 681, 682, 682, 682, nil, 682, nil, nil, + nil, 682, 682, nil, nil, nil, 682, nil, 682, 682, + 682, 682, 682, 682, 682, nil, nil, nil, nil, nil, + 682, 682, 682, 682, 682, 682, 682, nil, nil, 682, + nil, nil, nil, nil, nil, nil, 682, nil, nil, 682, + 682, 682, 682, 682, 682, 682, 682, nil, 682, 682, + 682, nil, 682, 682, nil, 682, 682, 682, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 682, nil, nil, + 682, nil, nil, 682, 682, nil, nil, 682, nil, nil, + nil, nil, nil, 682, nil, nil, nil, nil, nil, nil, + nil, 682, nil, nil, nil, nil, 682, 682, 682, 682, + 682, 682, nil, nil, nil, 682, 682, nil, nil, nil, + nil, nil, nil, 682, nil, nil, 682, 682, 682, nil, + 682, 682, nil, nil, 682, 682, 685, 685, 685, nil, + 685, nil, nil, nil, 685, 685, nil, nil, nil, 685, + nil, 685, 685, 685, 685, 685, 685, 685, nil, nil, + nil, nil, nil, 685, 685, 685, 685, 685, 685, 685, + nil, nil, 685, nil, nil, nil, nil, nil, nil, 685, + nil, nil, 685, 685, 685, 685, 685, 685, 685, 685, + 685, 685, 685, 685, nil, 685, 685, nil, 685, 685, + 685, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 685, nil, nil, 685, nil, nil, 685, 685, nil, nil, + 685, nil, 685, nil, 685, nil, 685, nil, nil, nil, + nil, nil, nil, nil, 685, nil, nil, nil, nil, 685, + 685, 685, 685, 685, 685, nil, nil, nil, 685, 685, + nil, nil, nil, nil, nil, nil, 685, nil, 685, 685, + 685, 685, nil, 685, 685, nil, nil, 685, 685, 686, + 686, 686, nil, 686, nil, nil, nil, 686, 686, nil, + nil, nil, 686, nil, 686, 686, 686, 686, 686, 686, + 686, nil, nil, nil, nil, nil, 686, 686, 686, 686, + 686, 686, 686, nil, nil, 686, nil, nil, nil, nil, + nil, nil, 686, nil, nil, 686, 686, 686, 686, 686, + 686, 686, 686, 686, 686, 686, 686, nil, 686, 686, + nil, 686, 686, 686, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 686, nil, nil, 686, nil, nil, 686, + 686, nil, nil, 686, nil, nil, nil, 686, nil, 686, + nil, nil, nil, nil, nil, nil, nil, 686, nil, nil, + nil, nil, 686, 686, 686, 686, 686, 686, nil, nil, + nil, 686, 686, nil, nil, nil, nil, nil, nil, 686, + nil, 686, 686, 686, 686, nil, 686, 686, nil, nil, + 686, 686, 687, 687, 687, nil, 687, nil, nil, nil, + 687, 687, nil, nil, nil, 687, nil, 687, 687, 687, + 687, 687, 687, 687, nil, nil, nil, nil, nil, 687, + 687, 687, 687, 687, 687, 687, nil, nil, 687, nil, + nil, nil, nil, nil, nil, 687, nil, nil, 687, 687, + 687, 687, 687, 687, 687, 687, nil, 687, 687, 687, + nil, 687, 687, nil, 687, 687, 687, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 687, nil, nil, 687, + nil, nil, 687, 687, nil, nil, 687, nil, nil, nil, + nil, nil, 687, nil, nil, nil, nil, nil, nil, nil, + 687, nil, nil, nil, nil, 687, 687, 687, 687, 687, + 687, nil, nil, nil, 687, 687, nil, nil, nil, nil, + nil, nil, 687, nil, nil, 687, 687, 687, nil, 687, + 687, nil, nil, 687, 687, 688, 688, 688, nil, 688, + nil, nil, nil, 688, 688, nil, nil, nil, 688, nil, + 688, 688, 688, 688, 688, 688, 688, nil, nil, nil, + nil, nil, 688, 688, 688, 688, 688, 688, 688, nil, + nil, 688, nil, nil, nil, nil, nil, nil, 688, nil, + nil, 688, 688, 688, 688, 688, 688, 688, 688, nil, + 688, 688, 688, nil, 688, 688, nil, 688, 688, 688, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 688, + nil, nil, 688, nil, nil, 688, 688, nil, nil, 688, + nil, nil, nil, nil, nil, 688, nil, nil, nil, nil, + nil, nil, nil, 688, nil, nil, nil, nil, 688, 688, + 688, 688, 688, 688, nil, nil, nil, 688, 688, nil, + nil, nil, nil, nil, nil, 688, nil, nil, 688, 688, + 688, nil, 688, 688, nil, nil, 688, 688, 693, 693, + 693, nil, 693, nil, nil, nil, 693, 693, nil, nil, + nil, 693, nil, 693, 693, 693, 693, 693, 693, 693, + nil, nil, nil, nil, nil, 693, 693, 693, 693, 693, + 693, 693, nil, nil, 693, nil, nil, nil, nil, nil, + nil, 693, nil, nil, 693, 693, 693, 693, 693, 693, + 693, 693, nil, 693, 693, 693, nil, 693, 693, nil, + 693, 693, 693, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 693, nil, nil, 693, nil, nil, 693, 693, + nil, nil, 693, nil, nil, nil, nil, nil, 693, nil, + nil, nil, nil, nil, nil, nil, 693, nil, nil, nil, + nil, 693, 693, 693, 693, 693, 693, nil, nil, nil, + 693, 693, nil, nil, nil, nil, nil, nil, 693, nil, + nil, 693, 693, 693, nil, 693, 693, nil, nil, 693, + 693, 694, 694, 694, nil, 694, nil, nil, nil, 694, + 694, nil, nil, nil, 694, nil, 694, 694, 694, 694, + 694, 694, 694, nil, nil, nil, nil, nil, 694, 694, + 694, 694, 694, 694, 694, nil, nil, 694, nil, nil, + nil, nil, nil, nil, 694, nil, nil, 694, 694, 694, + 694, 694, 694, 694, 694, nil, 694, 694, 694, nil, + 694, 694, nil, 694, 694, 694, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 694, nil, nil, 694, nil, + nil, 694, 694, nil, nil, 694, nil, nil, nil, nil, + nil, 694, nil, nil, nil, nil, nil, nil, nil, 694, + nil, nil, nil, nil, 694, 694, 694, 694, 694, 694, + nil, nil, nil, 694, 694, nil, nil, nil, nil, nil, + nil, 694, nil, nil, 694, 694, 694, nil, 694, 694, + nil, nil, 694, 694, 739, 739, 739, nil, 739, nil, + nil, nil, 739, 739, nil, nil, nil, 739, nil, 739, + 739, 739, 739, 739, 739, 739, nil, nil, nil, nil, + nil, 739, 739, 739, 739, 739, 739, 739, nil, nil, + 739, nil, nil, nil, nil, nil, nil, 739, nil, nil, + 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, + 739, 739, nil, 739, 739, nil, 739, 739, 739, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 739, nil, + nil, 739, nil, nil, 739, 739, nil, nil, 739, nil, + 739, nil, 739, nil, 739, nil, nil, nil, nil, nil, + nil, nil, 739, nil, nil, nil, nil, 739, 739, 739, + 739, 739, 739, nil, nil, nil, 739, 739, nil, nil, + nil, nil, nil, nil, 739, nil, 739, 739, 739, 739, + nil, 739, 739, nil, nil, 739, 739, 748, 748, 748, + nil, 748, nil, nil, nil, 748, 748, nil, nil, nil, + 748, nil, 748, 748, 748, 748, 748, 748, 748, nil, + nil, nil, nil, nil, 748, 748, 748, 748, 748, 748, + 748, nil, nil, 748, nil, nil, nil, nil, nil, nil, + 748, nil, nil, 748, 748, 748, 748, 748, 748, 748, + 748, nil, 748, 748, 748, nil, 748, 748, nil, 748, + 748, 748, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 748, nil, nil, 748, nil, nil, 748, 748, nil, + nil, 748, nil, nil, nil, nil, nil, 748, nil, nil, + nil, nil, nil, nil, nil, 748, nil, nil, nil, nil, + 748, 748, 748, 748, 748, 748, nil, nil, nil, 748, + 748, nil, nil, nil, nil, nil, nil, 748, nil, nil, + 748, 748, 748, nil, 748, 748, nil, nil, 748, 748, + 751, 751, 751, nil, 751, nil, nil, nil, 751, 751, + nil, nil, nil, 751, nil, 751, 751, 751, 751, 751, + 751, 751, nil, nil, nil, nil, nil, 751, 751, 751, + 751, 751, 751, 751, nil, nil, 751, nil, nil, nil, + nil, nil, nil, 751, nil, nil, 751, 751, 751, 751, + 751, 751, 751, 751, nil, 751, 751, 751, nil, 751, + 751, nil, 751, 751, 751, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 751, nil, nil, 751, nil, nil, + 751, 751, nil, nil, 751, nil, nil, nil, nil, nil, + 751, nil, nil, nil, nil, nil, nil, nil, 751, nil, + nil, nil, nil, 751, 751, 751, 751, 751, 751, nil, + nil, nil, 751, 751, nil, nil, nil, nil, nil, nil, + 751, nil, nil, 751, 751, 751, nil, 751, 751, nil, + nil, 751, 751, 772, 772, 772, nil, 772, nil, nil, + nil, 772, 772, nil, nil, nil, 772, nil, 772, 772, + 772, 772, 772, 772, 772, nil, nil, nil, nil, nil, + 772, 772, 772, 772, 772, 772, 772, nil, nil, 772, + nil, nil, nil, nil, nil, nil, 772, nil, nil, 772, + 772, 772, 772, 772, 772, 772, 772, nil, 772, 772, + 772, nil, 772, 772, nil, 772, 772, 772, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 772, nil, nil, + 772, nil, nil, 772, 772, nil, nil, 772, nil, 772, + nil, nil, nil, 772, nil, nil, nil, nil, nil, nil, + nil, 772, nil, nil, nil, nil, 772, 772, 772, 772, + 772, 772, nil, nil, nil, 772, 772, nil, nil, nil, + nil, nil, nil, 772, nil, nil, 772, 772, 772, nil, + 772, 772, nil, nil, 772, 772, 777, 777, 777, nil, + 777, nil, nil, nil, 777, 777, nil, nil, nil, 777, + nil, 777, 777, 777, 777, 777, 777, 777, nil, nil, + nil, nil, nil, 777, 777, 777, 777, 777, 777, 777, + nil, nil, 777, nil, nil, nil, nil, nil, nil, 777, + nil, nil, 777, 777, 777, 777, 777, 777, 777, 777, + 777, 777, 777, 777, nil, 777, 777, nil, 777, 777, + 777, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 777, nil, nil, 777, nil, nil, 777, 777, nil, nil, + 777, nil, 777, nil, nil, nil, 777, nil, nil, nil, + nil, nil, nil, nil, 777, nil, nil, nil, nil, 777, + 777, 777, 777, 777, 777, nil, nil, nil, 777, 777, + nil, nil, nil, nil, nil, nil, 777, nil, 777, 777, + 777, 777, nil, 777, 777, nil, nil, 777, 777, 780, + 780, 780, nil, 780, nil, nil, nil, 780, 780, nil, + nil, nil, 780, nil, 780, 780, 780, 780, 780, 780, + 780, nil, nil, nil, nil, nil, 780, 780, 780, 780, + 780, 780, 780, nil, nil, 780, nil, nil, nil, nil, + nil, nil, 780, nil, nil, 780, 780, 780, 780, 780, + 780, 780, 780, 780, 780, 780, 780, nil, 780, 780, + nil, 780, 780, 780, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 780, nil, nil, 780, nil, nil, 780, + 780, nil, nil, 780, nil, nil, nil, nil, nil, 780, + nil, nil, nil, nil, nil, nil, nil, 780, nil, nil, + nil, nil, 780, 780, 780, 780, 780, 780, nil, nil, + nil, 780, 780, nil, nil, nil, nil, nil, nil, 780, + nil, 780, 780, 780, 780, nil, 780, 780, nil, nil, + 780, 780, 796, 796, 796, nil, 796, nil, nil, nil, + 796, 796, nil, nil, nil, 796, nil, 796, 796, 796, + 796, 796, 796, 796, nil, nil, nil, nil, nil, 796, + 796, 796, 796, 796, 796, 796, nil, nil, 796, nil, + nil, nil, nil, nil, nil, 796, nil, nil, 796, 796, + 796, 796, 796, 796, 796, 796, nil, 796, 796, 796, + nil, 796, 796, nil, 796, 796, 796, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 796, nil, nil, 796, + nil, nil, 796, 796, nil, nil, 796, nil, 796, nil, + nil, nil, 796, nil, nil, nil, nil, nil, nil, nil, + 796, nil, nil, nil, nil, 796, 796, 796, 796, 796, + 796, nil, nil, nil, 796, 796, nil, nil, nil, nil, + nil, nil, 796, nil, nil, 796, 796, 796, nil, 796, + 796, nil, nil, 796, 796, 808, 808, 808, nil, 808, + nil, nil, nil, 808, 808, nil, nil, nil, 808, nil, + 808, 808, 808, 808, 808, 808, 808, nil, nil, nil, + nil, nil, 808, 808, 808, 808, 808, 808, 808, nil, + nil, 808, nil, nil, nil, nil, nil, nil, 808, nil, + nil, 808, 808, 808, 808, 808, 808, 808, 808, nil, + 808, 808, 808, nil, 808, 808, nil, 808, 808, 808, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 808, + nil, nil, 808, nil, nil, 808, 808, nil, nil, 808, + nil, nil, nil, nil, nil, 808, nil, nil, nil, nil, + nil, nil, nil, 808, nil, nil, nil, nil, 808, 808, + 808, 808, 808, 808, nil, nil, nil, 808, 808, nil, + nil, nil, nil, nil, nil, 808, nil, nil, 808, 808, + 808, nil, 808, 808, nil, nil, 808, 808, 829, 829, + 829, nil, 829, nil, nil, nil, 829, 829, nil, nil, + nil, 829, nil, 829, 829, 829, 829, 829, 829, 829, + nil, nil, nil, nil, nil, 829, 829, 829, 829, 829, + 829, 829, nil, nil, 829, nil, nil, nil, nil, nil, + nil, 829, nil, nil, 829, 829, 829, 829, 829, 829, + 829, 829, nil, 829, 829, 829, nil, 829, 829, nil, + 829, 829, 829, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 829, nil, nil, 829, nil, nil, 829, 829, + nil, nil, 829, nil, nil, nil, nil, nil, 829, nil, + nil, nil, nil, nil, nil, nil, 829, nil, nil, nil, + nil, 829, 829, 829, 829, 829, 829, nil, nil, nil, + 829, 829, nil, nil, nil, nil, nil, nil, 829, nil, + nil, 829, 829, 829, nil, 829, 829, nil, nil, 829, + 829, 853, 853, 853, nil, 853, nil, nil, nil, 853, + 853, nil, nil, nil, 853, nil, 853, 853, 853, 853, + 853, 853, 853, nil, nil, nil, nil, nil, 853, 853, + 853, 853, 853, 853, 853, nil, nil, 853, nil, nil, + nil, nil, nil, nil, 853, nil, nil, 853, 853, 853, + 853, 853, 853, 853, 853, nil, 853, 853, 853, nil, + 853, 853, nil, 853, 853, 853, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 853, nil, nil, 853, nil, + nil, 853, 853, nil, nil, 853, nil, nil, nil, nil, + nil, 853, nil, nil, nil, nil, nil, nil, nil, 853, + nil, nil, nil, nil, 853, 853, 853, 853, 853, 853, + nil, nil, nil, 853, 853, nil, nil, nil, nil, nil, + nil, 853, nil, nil, 853, 853, 853, nil, 853, 853, + nil, nil, 853, 853, 861, 861, 861, nil, 861, nil, + nil, nil, 861, 861, nil, nil, nil, 861, nil, 861, + 861, 861, 861, 861, 861, 861, nil, nil, nil, nil, + nil, 861, 861, 861, 861, 861, 861, 861, nil, nil, + 861, nil, nil, nil, nil, nil, nil, 861, nil, nil, + 861, 861, 861, 861, 861, 861, 861, 861, nil, 861, + 861, 861, nil, 861, 861, nil, 861, 861, 861, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 861, nil, + nil, 861, nil, nil, 861, 861, nil, nil, 861, nil, + nil, nil, nil, nil, 861, nil, nil, nil, nil, nil, + nil, nil, 861, nil, nil, nil, nil, 861, 861, 861, + 861, 861, 861, nil, nil, nil, 861, 861, nil, nil, + nil, nil, nil, nil, 861, nil, nil, 861, 861, 861, + nil, 861, 861, nil, nil, 861, 861, 874, 874, 874, + nil, 874, nil, nil, nil, 874, 874, nil, nil, nil, + 874, nil, 874, 874, 874, 874, 874, 874, 874, nil, + nil, nil, nil, nil, 874, 874, 874, 874, 874, 874, + 874, nil, nil, 874, nil, nil, nil, nil, nil, nil, + 874, nil, nil, 874, 874, 874, 874, 874, 874, 874, + 874, nil, 874, 874, 874, nil, 874, 874, nil, 874, + 874, 874, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 874, nil, nil, 874, nil, nil, 874, 874, nil, + nil, 874, nil, nil, nil, nil, nil, 874, nil, nil, + nil, nil, nil, nil, nil, 874, nil, nil, nil, nil, + 874, 874, 874, 874, 874, 874, nil, nil, nil, 874, + 874, nil, nil, nil, nil, nil, nil, 874, nil, nil, + 874, 874, 874, nil, 874, 874, nil, nil, 874, 874, + 875, 875, 875, nil, 875, nil, nil, nil, 875, 875, + nil, nil, nil, 875, nil, 875, 875, 875, 875, 875, + 875, 875, nil, nil, nil, nil, nil, 875, 875, 875, + 875, 875, 875, 875, nil, nil, 875, nil, nil, nil, + nil, nil, nil, 875, nil, nil, 875, 875, 875, 875, + 875, 875, 875, 875, nil, 875, 875, 875, nil, 875, + 875, nil, 875, 875, 875, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 875, nil, nil, 875, nil, nil, + 875, 875, nil, nil, 875, nil, nil, nil, nil, nil, + 875, nil, nil, nil, nil, nil, nil, nil, 875, nil, + nil, nil, nil, 875, 875, 875, 875, 875, 875, nil, + nil, nil, 875, 875, nil, nil, nil, nil, nil, nil, + 875, nil, nil, 875, 875, 875, nil, 875, 875, nil, + nil, 875, 875, 876, 876, 876, nil, 876, nil, nil, + nil, 876, 876, nil, nil, nil, 876, nil, 876, 876, + 876, 876, 876, 876, 876, nil, nil, nil, nil, nil, + 876, 876, 876, 876, 876, 876, 876, nil, nil, 876, + nil, nil, nil, nil, nil, nil, 876, nil, nil, 876, + 876, 876, 876, 876, 876, 876, 876, nil, 876, 876, + 876, nil, 876, 876, nil, 876, 876, 876, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 876, nil, nil, + 876, nil, nil, 876, 876, nil, nil, 876, nil, nil, + nil, nil, nil, 876, nil, nil, nil, nil, nil, nil, + nil, 876, nil, nil, nil, nil, 876, 876, 876, 876, + 876, 876, nil, nil, nil, 876, 876, nil, nil, nil, + nil, nil, nil, 876, nil, nil, 876, 876, 876, nil, + 876, 876, nil, nil, 876, 876, 877, 877, 877, nil, + 877, nil, nil, nil, 877, 877, nil, nil, nil, 877, + nil, 877, 877, 877, 877, 877, 877, 877, nil, nil, + nil, nil, nil, 877, 877, 877, 877, 877, 877, 877, + nil, nil, 877, nil, nil, nil, nil, nil, nil, 877, + nil, nil, 877, 877, 877, 877, 877, 877, 877, 877, + nil, 877, 877, 877, nil, 877, 877, nil, 877, 877, + 877, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 877, nil, nil, 877, nil, nil, 877, 877, nil, nil, + 877, nil, nil, nil, nil, nil, 877, nil, nil, nil, + nil, nil, nil, nil, 877, nil, nil, nil, nil, 877, + 877, 877, 877, 877, 877, nil, nil, nil, 877, 877, + nil, nil, nil, nil, nil, nil, 877, nil, nil, 877, + 877, 877, nil, 877, 877, nil, nil, 877, 877, 899, + 899, 899, nil, 899, nil, nil, nil, 899, 899, nil, + nil, nil, 899, nil, 899, 899, 899, 899, 899, 899, + 899, nil, nil, nil, nil, nil, 899, 899, 899, 899, + 899, 899, 899, nil, nil, 899, nil, nil, nil, nil, + nil, nil, 899, nil, nil, 899, 899, 899, 899, 899, + 899, 899, 899, nil, 899, 899, 899, nil, 899, 899, + nil, 899, 899, 899, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 899, nil, nil, 899, nil, nil, 899, + 899, nil, nil, 899, nil, nil, nil, nil, nil, 899, + nil, nil, nil, nil, nil, nil, nil, 899, nil, nil, + nil, nil, 899, 899, 899, 899, 899, 899, nil, nil, + nil, 899, 899, nil, nil, nil, nil, nil, nil, 899, + nil, nil, 899, 899, 899, nil, 899, 899, nil, nil, + 899, 899, 933, 933, 933, nil, 933, nil, nil, nil, + 933, 933, nil, nil, nil, 933, nil, 933, 933, 933, + 933, 933, 933, 933, nil, nil, nil, nil, nil, 933, + 933, 933, 933, 933, 933, 933, nil, nil, 933, nil, + nil, nil, nil, nil, nil, 933, nil, nil, 933, 933, + 933, 933, 933, 933, 933, 933, nil, 933, 933, 933, + nil, 933, 933, nil, 933, 933, 933, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 933, nil, nil, 933, + nil, nil, 933, 933, nil, nil, 933, nil, nil, nil, + nil, nil, 933, nil, nil, nil, nil, nil, nil, nil, + 933, nil, nil, nil, nil, 933, 933, 933, 933, 933, + 933, nil, nil, nil, 933, 933, nil, nil, nil, nil, + nil, nil, 933, nil, nil, 933, 933, 933, nil, 933, + 933, nil, nil, 933, 933, 942, 942, 942, nil, 942, + nil, nil, nil, 942, 942, nil, nil, nil, 942, nil, + 942, 942, 942, 942, 942, 942, 942, nil, nil, nil, + nil, nil, 942, 942, 942, 942, 942, 942, 942, nil, + nil, 942, nil, nil, nil, nil, nil, nil, 942, nil, + nil, 942, 942, 942, 942, 942, 942, 942, 942, nil, + 942, 942, 942, nil, 942, 942, nil, 942, 942, 942, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 942, + nil, nil, 942, nil, nil, 942, 942, nil, nil, 942, + nil, nil, nil, nil, nil, 942, nil, nil, nil, nil, + nil, nil, nil, 942, nil, nil, nil, nil, 942, 942, + 942, 942, 942, 942, nil, nil, nil, 942, 942, nil, + nil, nil, nil, nil, nil, 942, nil, nil, 942, 942, + 942, nil, 942, 942, nil, nil, 942, 942, 994, 994, + 994, nil, 994, nil, nil, nil, 994, 994, nil, nil, + nil, 994, nil, 994, 994, 994, 994, 994, 994, 994, + nil, nil, nil, nil, nil, 994, 994, 994, 994, 994, + 994, 994, nil, nil, 994, nil, nil, nil, nil, nil, + nil, 994, nil, nil, 994, 994, 994, 994, 994, 994, + 994, 994, 994, 994, 994, 994, nil, 994, 994, nil, + 994, 994, 994, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 994, nil, nil, 994, nil, nil, 994, 994, + nil, nil, 994, nil, nil, nil, 994, nil, 994, nil, + nil, nil, nil, nil, nil, nil, 994, nil, nil, nil, + nil, 994, 994, 994, 994, 994, 994, nil, nil, nil, + 994, 994, nil, nil, nil, nil, nil, nil, 994, nil, + 994, 994, 994, 994, nil, 994, 994, nil, nil, 994, + 994, 995, 995, 995, nil, 995, nil, nil, nil, 995, + 995, nil, nil, nil, 995, nil, 995, 995, 995, 995, + 995, 995, 995, nil, nil, nil, nil, nil, 995, 995, + 995, 995, 995, 995, 995, nil, nil, 995, nil, nil, + nil, nil, nil, nil, 995, nil, nil, 995, 995, 995, + 995, 995, 995, 995, 995, nil, 995, 995, 995, nil, + 995, 995, nil, 995, 995, 995, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 995, nil, nil, 995, nil, + nil, 995, 995, nil, nil, 995, nil, nil, nil, nil, + nil, 995, nil, nil, nil, nil, nil, nil, nil, 995, + nil, nil, nil, nil, 995, 995, 995, 995, 995, 995, + nil, nil, nil, 995, 995, nil, nil, nil, nil, nil, + nil, 995, nil, nil, 995, 995, 995, nil, 995, 995, + nil, nil, 995, 995, 1058, 1058, 1058, nil, 1058, nil, + nil, nil, 1058, 1058, nil, nil, nil, 1058, nil, 1058, + 1058, 1058, 1058, 1058, 1058, 1058, nil, nil, nil, nil, + nil, 1058, 1058, 1058, 1058, 1058, 1058, 1058, nil, nil, + 1058, nil, nil, nil, nil, nil, nil, 1058, nil, nil, + 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, nil, 1058, + 1058, 1058, nil, 1058, 1058, nil, 1058, 1058, 1058, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1058, nil, + nil, 1058, nil, nil, 1058, 1058, nil, nil, 1058, nil, + 1058, nil, nil, nil, 1058, nil, nil, nil, nil, nil, + nil, nil, 1058, nil, nil, nil, nil, 1058, 1058, 1058, + 1058, 1058, 1058, nil, nil, nil, 1058, 1058, nil, nil, + nil, nil, nil, nil, 1058, nil, nil, 1058, 1058, 1058, + nil, 1058, 1058, nil, nil, 1058, 1058, 1133, 1133, 1133, + nil, 1133, nil, nil, nil, 1133, 1133, nil, nil, nil, + 1133, nil, 1133, 1133, 1133, 1133, 1133, 1133, 1133, nil, + nil, nil, nil, nil, 1133, 1133, 1133, 1133, 1133, 1133, + 1133, nil, nil, 1133, nil, nil, nil, nil, nil, nil, + 1133, nil, nil, 1133, 1133, 1133, 1133, 1133, 1133, 1133, + 1133, nil, 1133, 1133, 1133, nil, 1133, 1133, nil, 1133, + 1133, 1133, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1133, nil, nil, 1133, nil, nil, 1133, 1133, nil, + nil, 1133, nil, nil, nil, nil, nil, 1133, nil, nil, + nil, nil, nil, nil, nil, 1133, nil, nil, nil, nil, + 1133, 1133, 1133, 1133, 1133, 1133, nil, nil, nil, 1133, + 1133, nil, nil, nil, nil, nil, nil, 1133, nil, nil, + 1133, 1133, 1133, nil, 1133, 1133, nil, nil, 1133, 1133, + 1134, 1134, 1134, nil, 1134, nil, nil, nil, 1134, 1134, + nil, nil, nil, 1134, nil, 1134, 1134, 1134, 1134, 1134, + 1134, 1134, nil, nil, nil, nil, nil, 1134, 1134, 1134, + 1134, 1134, 1134, 1134, nil, nil, 1134, nil, nil, nil, + nil, nil, nil, 1134, nil, nil, 1134, 1134, 1134, 1134, + 1134, 1134, 1134, 1134, nil, 1134, 1134, 1134, nil, 1134, + 1134, nil, 1134, 1134, 1134, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1134, nil, nil, 1134, nil, nil, + 1134, 1134, nil, nil, 1134, nil, nil, nil, nil, nil, + 1134, nil, nil, nil, nil, nil, nil, nil, 1134, nil, + nil, nil, nil, 1134, 1134, 1134, 1134, 1134, 1134, nil, + nil, nil, 1134, 1134, nil, nil, nil, nil, nil, nil, + 1134, nil, nil, 1134, 1134, 1134, nil, 1134, 1134, nil, + nil, 1134, 1134, 1137, 1137, 1137, nil, 1137, nil, nil, + nil, 1137, 1137, nil, nil, nil, 1137, nil, 1137, 1137, + 1137, 1137, 1137, 1137, 1137, nil, nil, nil, nil, nil, + 1137, 1137, 1137, 1137, 1137, 1137, 1137, nil, nil, 1137, + nil, nil, nil, nil, nil, nil, 1137, nil, nil, 1137, + 1137, 1137, 1137, 1137, 1137, 1137, 1137, nil, 1137, 1137, + 1137, nil, 1137, 1137, nil, 1137, 1137, 1137, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1137, nil, nil, + 1137, nil, nil, 1137, 1137, nil, nil, 1137, nil, nil, + nil, nil, nil, 1137, nil, nil, nil, nil, nil, nil, + nil, 1137, nil, nil, nil, nil, 1137, 1137, 1137, 1137, + 1137, 1137, nil, nil, nil, 1137, 1137, nil, nil, nil, + nil, nil, nil, 1137, nil, nil, 1137, 1137, 1137, nil, + 1137, 1137, nil, nil, 1137, 1137, 1178, 1178, 1178, nil, + 1178, nil, nil, nil, 1178, 1178, nil, nil, nil, 1178, + nil, 1178, 1178, 1178, 1178, 1178, 1178, 1178, nil, nil, + nil, nil, nil, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + nil, nil, 1178, nil, nil, nil, nil, nil, nil, 1178, + nil, nil, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, nil, 1178, 1178, nil, 1178, 1178, + 1178, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1178, nil, nil, 1178, nil, nil, 1178, 1178, nil, nil, + 1178, nil, 1178, nil, 1178, nil, 1178, nil, nil, nil, + nil, nil, nil, nil, 1178, nil, nil, nil, nil, 1178, + 1178, 1178, 1178, 1178, 1178, nil, nil, nil, 1178, 1178, + nil, nil, nil, nil, nil, nil, 1178, nil, 1178, 1178, + 1178, 1178, nil, 1178, 1178, nil, nil, 1178, 1178, 37, + 37, 37, nil, 37, nil, nil, nil, 37, 37, nil, + nil, nil, 37, nil, 37, 37, 37, 37, 37, 37, + 37, nil, nil, nil, nil, nil, 37, 37, 37, 37, + 37, 37, 37, nil, nil, 37, nil, nil, nil, nil, + nil, nil, 37, nil, nil, 37, 37, 37, 37, 37, + 37, 37, 37, nil, 37, 37, 37, nil, 37, 37, + nil, nil, nil, 37, nil, nil, nil, nil, nil, 1115, + nil, 1115, 1115, 1115, 1115, 1115, nil, nil, nil, nil, + nil, nil, nil, 37, nil, 1115, 37, nil, nil, 37, + 37, nil, nil, 37, nil, 37, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1115, nil, nil, + nil, nil, 37, 37, 37, 37, 37, 37, 1115, 1115, + nil, 37, 37, nil, nil, nil, nil, nil, nil, 37, + nil, nil, 37, 37, 37, nil, 37, 37, 38, 38, + 38, nil, 38, nil, nil, nil, 38, 38, nil, nil, + nil, 38, 1115, 38, 38, 38, 38, 38, 38, 38, + nil, nil, nil, nil, nil, 38, 38, 38, 38, 38, + 38, 38, nil, nil, 38, nil, nil, nil, nil, nil, + nil, 38, nil, nil, 38, 38, 38, 38, 38, 38, + 38, 38, nil, 38, 38, 38, nil, 38, 38, nil, + nil, nil, 38, nil, nil, nil, nil, nil, 1196, nil, + 1196, 1196, 1196, 1196, 1196, nil, nil, nil, nil, nil, + nil, nil, 38, nil, 1196, 38, nil, nil, 38, 38, + nil, nil, 38, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1196, nil, nil, nil, + nil, 38, 38, 38, 38, 38, 38, 1196, 1196, nil, + 38, 38, nil, nil, nil, 38, nil, nil, 38, nil, + nil, 38, 38, 38, nil, 38, 38, 74, 74, 74, + nil, 74, nil, nil, nil, 74, 74, nil, nil, nil, + 74, 1196, 74, 74, 74, 74, 74, 74, 74, nil, + nil, nil, nil, nil, 74, 74, 74, 74, 74, 74, + 74, nil, nil, 74, nil, nil, nil, nil, nil, nil, + 74, nil, nil, 74, 74, 74, 74, 74, 74, 74, + 74, nil, 74, 74, 74, nil, 74, 74, nil, nil, + nil, 74, nil, nil, nil, nil, nil, 1209, nil, 1209, + 1209, 1209, 1209, 1209, nil, nil, nil, nil, nil, nil, + nil, 74, nil, 1209, 74, nil, nil, 74, 74, nil, + nil, 74, nil, 74, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1209, nil, nil, nil, nil, + 74, 74, 74, 74, 74, 74, 1209, 1209, nil, 74, + 74, nil, nil, nil, nil, nil, nil, 74, nil, nil, + 74, 74, 74, nil, 74, 74, 75, 75, 75, nil, + 75, nil, nil, nil, 75, 75, nil, nil, nil, 75, + 1209, 75, 75, 75, 75, 75, 75, 75, nil, nil, + nil, nil, nil, 75, 75, 75, 75, 75, 75, 75, + nil, nil, 75, nil, nil, nil, nil, nil, nil, 75, + nil, nil, 75, 75, 75, 75, 75, 75, 75, 75, + nil, 75, 75, 75, nil, 75, 75, nil, nil, nil, + 75, nil, nil, nil, nil, nil, 1211, nil, 1211, 1211, + 1211, 1211, 1211, nil, nil, nil, nil, 75, nil, nil, + 75, nil, 1211, 75, nil, nil, 75, 75, nil, nil, + 75, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1211, nil, nil, nil, nil, 75, + 75, 75, 75, 75, 75, 1211, 1211, nil, 75, 75, + nil, nil, nil, nil, nil, nil, 75, nil, nil, 75, + 75, 75, nil, 75, 75, 76, 76, 76, nil, 76, + nil, nil, nil, 76, 76, nil, nil, nil, 76, 1211, + 76, 76, 76, 76, 76, 76, 76, nil, nil, nil, + nil, nil, 76, 76, 76, 76, 76, 76, 76, nil, + nil, 76, nil, nil, nil, nil, nil, nil, 76, nil, + nil, 76, 76, 76, 76, 76, 76, 76, 76, nil, + 76, 76, 76, nil, 76, 76, nil, nil, nil, 76, + nil, nil, nil, nil, nil, 1213, nil, 1213, 1213, 1213, + 1213, 1213, nil, nil, nil, nil, nil, nil, nil, 76, + nil, 1213, 76, nil, nil, 76, 76, nil, nil, 76, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1213, nil, nil, nil, nil, 76, 76, + 76, 76, 76, 76, 1213, 1213, nil, 76, 76, nil, + nil, nil, nil, nil, nil, 76, nil, nil, 76, 76, + 76, nil, 76, 76, 322, 322, 322, nil, 322, nil, + nil, nil, 322, 322, nil, nil, nil, 322, 1213, 322, + 322, 322, 322, 322, 322, 322, nil, nil, nil, nil, + nil, 322, 322, 322, 322, 322, 322, 322, nil, nil, + 322, nil, nil, nil, nil, nil, nil, 322, nil, nil, + 322, 322, 322, 322, 322, 322, 322, 322, nil, 322, + 322, 322, nil, 322, 322, nil, nil, nil, 322, nil, + nil, nil, nil, nil, 1240, nil, 1240, 1240, 1240, 1240, + 1240, nil, nil, nil, nil, nil, nil, nil, 322, nil, + 1240, 322, nil, nil, 322, 322, nil, nil, 322, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1240, nil, nil, nil, nil, 322, 322, 322, + 322, 322, 322, 1240, 1240, nil, 322, 322, nil, nil, + nil, 322, nil, nil, 322, nil, nil, 322, 322, 322, + nil, 322, 322, 339, 339, 339, nil, 339, nil, nil, + nil, 339, 339, nil, nil, nil, 339, 1240, 339, 339, + 339, 339, 339, 339, 339, nil, nil, nil, nil, nil, + 339, 339, 339, 339, 339, 339, 339, nil, nil, 339, + nil, nil, nil, nil, nil, nil, 339, nil, nil, 339, + 339, 339, 339, 339, 339, 339, 339, nil, 339, 339, + 339, nil, 339, 339, nil, nil, nil, 339, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 339, nil, nil, + 339, nil, nil, 339, 339, nil, nil, 339, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 339, 339, 339, 339, + 339, 339, nil, nil, nil, 339, 339, nil, nil, nil, + nil, nil, nil, 339, nil, nil, 339, 339, 339, nil, + 339, 339, 551, 551, 551, nil, 551, nil, nil, nil, + 551, 551, nil, nil, nil, 551, nil, 551, 551, 551, + 551, 551, 551, 551, nil, nil, nil, nil, nil, 551, + 551, 551, 551, 551, 551, 551, nil, nil, 551, nil, + nil, nil, nil, nil, nil, 551, nil, nil, 551, 551, + 551, 551, 551, 551, 551, 551, nil, 551, 551, 551, + nil, 551, 551, nil, nil, nil, 551, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 551, nil, nil, 551, + nil, nil, 551, 551, nil, nil, 551, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 551, 551, 551, 551, 551, + 551, nil, nil, nil, 551, 551, nil, nil, nil, nil, + nil, nil, 551, nil, nil, 551, 551, 551, nil, 551, + 551, 559, 559, 559, nil, 559, nil, nil, nil, 559, + 559, nil, nil, nil, 559, nil, 559, 559, 559, 559, + 559, 559, 559, nil, nil, nil, nil, nil, 559, 559, + 559, 559, 559, 559, 559, nil, nil, 559, nil, nil, + nil, nil, nil, nil, 559, nil, nil, 559, 559, 559, + 559, 559, 559, 559, 559, nil, 559, 559, 559, nil, + 559, 559, nil, nil, nil, 559, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 559, nil, nil, 559, nil, + nil, 559, 559, nil, nil, 559, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 559, 559, 559, 559, 559, 559, + nil, nil, nil, 559, 559, nil, nil, nil, nil, nil, + nil, 559, nil, nil, 559, 559, 559, nil, 559, 559, + 755, 755, 755, nil, 755, nil, nil, nil, 755, 755, + nil, nil, nil, 755, nil, 755, 755, 755, 755, 755, + 755, 755, nil, nil, nil, nil, nil, 755, 755, 755, + 755, 755, 755, 755, nil, nil, 755, nil, nil, nil, + nil, nil, nil, 755, nil, nil, 755, 755, 755, 755, + 755, 755, 755, 755, nil, 755, 755, 755, nil, 755, + 755, nil, nil, nil, 755, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 755, nil, nil, 755, nil, nil, + 755, 755, nil, nil, 755, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 755, 755, 755, 755, 755, 755, nil, + nil, nil, 755, 755, nil, nil, nil, nil, nil, nil, + 755, nil, nil, 755, 755, 755, nil, 755, 755, 766, + 766, 766, nil, 766, nil, nil, nil, 766, 766, nil, + nil, nil, 766, nil, 766, 766, 766, 766, 766, 766, + 766, nil, nil, nil, nil, nil, 766, 766, 766, 766, + 766, 766, 766, nil, nil, 766, nil, nil, nil, nil, + nil, nil, 766, nil, nil, 766, 766, 766, 766, 766, + 766, 766, 766, nil, 766, 766, 766, nil, 766, 766, + nil, nil, nil, 766, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 766, nil, nil, 766, nil, nil, 766, + 766, nil, nil, 766, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 766, 766, 766, 766, 766, 766, nil, nil, + nil, 766, 766, nil, nil, nil, nil, nil, nil, 766, + nil, nil, 766, 766, 766, nil, 766, 766, 1035, 1035, + 1035, nil, 1035, nil, nil, nil, 1035, 1035, nil, nil, + nil, 1035, nil, 1035, 1035, 1035, 1035, 1035, 1035, 1035, + nil, nil, nil, nil, nil, 1035, 1035, 1035, 1035, 1035, + 1035, 1035, nil, nil, 1035, nil, nil, nil, nil, nil, + nil, 1035, nil, nil, 1035, 1035, 1035, 1035, 1035, 1035, + 1035, 1035, nil, 1035, 1035, 1035, nil, 1035, 1035, nil, + nil, nil, 1035, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1035, nil, nil, 1035, nil, nil, 1035, 1035, + nil, nil, 1035, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1035, 1035, 1035, 1035, 1035, 1035, nil, nil, nil, + 1035, 1035, nil, nil, nil, nil, nil, nil, 1035, nil, + nil, 1035, 1035, 1035, nil, 1035, 1035, 1045, 1045, 1045, + nil, 1045, nil, nil, nil, 1045, 1045, nil, nil, nil, + 1045, nil, 1045, 1045, 1045, 1045, 1045, 1045, 1045, nil, + nil, nil, nil, nil, 1045, 1045, 1045, 1045, 1045, 1045, + 1045, nil, nil, 1045, nil, nil, nil, nil, nil, nil, + 1045, nil, nil, 1045, 1045, 1045, 1045, 1045, 1045, 1045, + 1045, nil, 1045, 1045, 1045, nil, 1045, 1045, nil, nil, + nil, 1045, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1045, nil, nil, 1045, nil, nil, 1045, 1045, nil, + nil, 1045, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1045, 1045, 1045, 1045, 1045, 1045, nil, nil, nil, 1045, + 1045, nil, nil, nil, nil, nil, nil, 1045, nil, nil, + 1045, 1045, 1045, nil, 1045, 1045, 1119, 1119, 1119, nil, + 1119, nil, nil, nil, 1119, 1119, nil, nil, nil, 1119, + nil, 1119, 1119, 1119, 1119, 1119, 1119, 1119, nil, nil, + nil, nil, nil, 1119, 1119, 1119, 1119, 1119, 1119, 1119, + nil, nil, 1119, nil, nil, nil, nil, nil, nil, 1119, + nil, nil, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, + nil, 1119, 1119, 1119, nil, 1119, 1119, nil, nil, nil, + 1119, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1119, nil, nil, 1119, nil, nil, 1119, 1119, nil, nil, + 1119, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1119, + 1119, 1119, 1119, 1119, 1119, nil, nil, nil, 1119, 1119, + nil, nil, nil, nil, nil, nil, 1119, nil, nil, 1119, + 1119, 1119, nil, 1119, 1119, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, nil, + nil, nil, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, nil, nil, nil, nil, nil, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, nil, 11, nil, + nil, nil, nil, nil, nil, nil, nil, 11, 11, nil, + 11, 11, 11, 11, 11, 11, 11, nil, nil, 11, + 11, nil, nil, nil, 11, 11, 11, 11, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 11, 11, nil, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, nil, nil, 11, 11, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 11, nil, + nil, nil, nil, nil, nil, nil, nil, 11, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, nil, nil, nil, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, nil, nil, nil, nil, nil, + 12, 12, 12, 12, 12, 12, 12, 12, 12, nil, + nil, 12, nil, nil, nil, nil, nil, nil, nil, nil, + 12, 12, nil, 12, 12, 12, 12, 12, 12, 12, + nil, nil, 12, 12, nil, nil, nil, 12, 12, 12, + 12, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 12, 12, nil, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, nil, nil, + 12, 12, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 12, nil, nil, nil, nil, nil, nil, nil, nil, + 12, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, nil, nil, nil, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, nil, nil, + nil, nil, nil, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, nil, 77, nil, nil, nil, + nil, nil, nil, 77, 77, nil, 77, 77, 77, 77, + 77, 77, 77, nil, nil, 77, 77, nil, nil, nil, + 77, 77, 77, 77, nil, nil, nil, nil, nil, 77, + nil, nil, nil, nil, nil, nil, nil, 77, 77, nil, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, nil, nil, 77, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 77, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, nil, nil, + nil, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, nil, nil, nil, nil, nil, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, nil, 107, + nil, nil, nil, nil, nil, nil, 107, 107, nil, 107, + 107, 107, 107, 107, 107, 107, nil, nil, 107, 107, + nil, nil, nil, 107, 107, 107, 107, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 107, 107, nil, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, nil, nil, 107, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 107, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, + 433, nil, nil, nil, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, nil, nil, nil, nil, nil, 433, + 433, 433, 433, 433, 433, 433, 433, 433, nil, nil, + 433, nil, nil, nil, nil, nil, nil, nil, nil, 433, + 433, nil, 433, 433, 433, 433, 433, 433, 433, nil, + nil, 433, 433, nil, nil, nil, 433, 433, 433, 433, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 433, 433, nil, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, nil, nil, 433, + 433, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 433, nil, nil, nil, nil, nil, nil, nil, nil, 433, + 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, nil, nil, nil, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, nil, nil, nil, + nil, nil, 672, 672, 672, 672, 672, 672, 672, 672, + 672, nil, nil, 672, nil, nil, nil, nil, nil, nil, + nil, nil, 672, 672, nil, 672, 672, 672, 672, 672, + 672, 672, nil, nil, 672, 672, nil, nil, nil, 672, + 672, 672, 672, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 672, 672, nil, 672, + 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, + nil, nil, 672, 672, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 672, nil, nil, nil, nil, nil, nil, + nil, nil, 672, 814, 814, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 814, nil, nil, nil, + 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, + nil, nil, nil, nil, nil, 814, 814, 814, 814, 814, + 814, 814, 814, 814, nil, nil, 814, nil, nil, nil, + nil, nil, nil, nil, nil, 814, 814, nil, 814, 814, + 814, 814, 814, 814, 814, nil, nil, 814, 814, nil, + nil, nil, 814, 814, 814, 814, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 814, + 814, nil, 814, 814, 814, 814, 814, 814, 814, 814, + 814, 814, 814, nil, nil, 814, nil, nil, nil, nil, + 491, 491, 491, 491, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 814, 491, 491, 491, 491, + nil, nil, nil, 491, nil, nil, nil, nil, nil, 491, + 491, nil, nil, nil, 491, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 491, nil, nil, 491, nil, nil, + nil, 491, nil, nil, 491, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 491, + nil, nil, nil, 491, 491, 491, 491, 491, 491, nil, + nil, nil, 491, 491, nil, nil, nil, nil, nil, nil, + 491, nil, nil, 491, 491, 491, nil, 491, 491, nil, + nil, 491, 491, 880, 880, 880, 880, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 880, + 880, 880, 880, nil, nil, nil, 880, nil, nil, nil, + nil, nil, 880, 880, nil, nil, nil, 880, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 880, nil, nil, + 880, nil, nil, nil, 880, nil, nil, 880, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 880, nil, nil, nil, 880, 880, 880, 880, + 880, 880, nil, nil, nil, 880, 880, nil, nil, nil, + nil, nil, nil, 880, nil, nil, 880, 880, 880, nil, + 880, 880, nil, nil, 880, 880, 883, 883, 883, 883, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 883, 883, 883, 883, nil, nil, nil, 883, + 883, nil, nil, nil, nil, 883, 883, nil, nil, nil, + 883, 883, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 883, nil, nil, 883, nil, nil, nil, 883, nil, nil, + 883, nil, 883, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 883, nil, nil, nil, 883, + 883, 883, 883, 883, 883, nil, nil, nil, 883, 883, + nil, nil, nil, nil, nil, nil, 883, nil, 883, 883, + 883, 883, nil, 883, 883, nil, nil, 883, 883, 884, + 884, 884, 884, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 884, 884, 884, 884, nil, + nil, nil, 884, 884, nil, nil, nil, nil, 884, 884, + nil, nil, nil, 884, 884, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 884, nil, nil, 884, nil, nil, nil, + 884, nil, nil, 884, nil, 884, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 884, nil, + nil, nil, 884, 884, 884, 884, 884, 884, nil, nil, + nil, 884, 884, nil, nil, nil, nil, nil, nil, 884, + nil, 884, 884, 884, 884, nil, 884, 884, nil, nil, + 884, 884, 886, 886, 886, 886, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 886, 886, + 886, 886, nil, nil, nil, 886, nil, nil, nil, nil, + nil, 886, 886, nil, nil, nil, 886, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 886, nil, nil, 886, + nil, nil, nil, 886, nil, nil, 886, nil, 886, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 886, nil, nil, nil, 886, 886, 886, 886, 886, + 886, nil, nil, nil, 886, 886, nil, nil, nil, nil, + nil, nil, 886, nil, nil, 886, 886, 886, nil, 886, + 886, nil, nil, 886, 886, 891, 891, 891, 891, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 891, 891, 891, 891, nil, nil, nil, 891, nil, + nil, nil, nil, nil, 891, 891, nil, nil, nil, 891, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 891, + nil, nil, 891, nil, nil, nil, 891, nil, nil, 891, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 891, nil, nil, nil, 891, 891, + 891, 891, 891, 891, nil, nil, nil, 891, 891, nil, + nil, nil, nil, nil, nil, 891, nil, nil, 891, 891, + 891, nil, 891, 891, nil, nil, 891, 891, 940, 940, + 940, 940, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 940, 940, 940, 940, nil, nil, + nil, 940, 940, nil, nil, nil, nil, 940, 940, nil, + nil, nil, 940, 940, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 940, nil, nil, 940, nil, nil, nil, 940, + nil, nil, 940, nil, 940, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 940, nil, nil, + nil, 940, 940, 940, 940, 940, 940, nil, nil, nil, + 940, 940, nil, nil, nil, nil, nil, nil, 940, nil, + 940, 940, 940, 940, nil, 940, 940, nil, nil, 940, + 940, 1003, 1003, 1003, 1003, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1003, 1003, 1003, + 1003, nil, nil, nil, 1003, nil, nil, nil, nil, nil, + 1003, 1003, nil, nil, nil, 1003, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1003, nil, nil, 1003, nil, + nil, nil, 1003, nil, nil, 1003, nil, 1003, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1003, nil, nil, nil, 1003, 1003, 1003, 1003, 1003, 1003, + nil, nil, nil, 1003, 1003, nil, nil, nil, nil, nil, + nil, 1003, nil, nil, 1003, 1003, 1003, nil, 1003, 1003, + nil, nil, 1003, 1003, 1011, 1011, 1011, 1011, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1011, 1011, 1011, 1011, nil, nil, nil, 1011, nil, nil, + nil, nil, nil, 1011, 1011, nil, nil, nil, 1011, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1011, nil, + nil, 1011, nil, nil, nil, 1011, nil, nil, 1011, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1011, nil, nil, nil, 1011, 1011, 1011, + 1011, 1011, 1011, nil, nil, nil, 1011, 1011, nil, nil, + nil, nil, nil, nil, 1011, nil, nil, 1011, 1011, 1011, + nil, 1011, 1011, nil, nil, 1011, 1011, 1096, 1096, 1096, + 1096, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1096, 1096, 1096, 1096, nil, nil, nil, + 1096, nil, nil, nil, nil, nil, 1096, 1096, nil, nil, + nil, 1096, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1096, nil, nil, 1096, nil, nil, nil, 1096, nil, + nil, 1096, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1096, nil, nil, nil, + 1096, 1096, 1096, 1096, 1096, 1096, nil, nil, nil, 1096, + 1096, nil, nil, nil, nil, nil, nil, 1096, nil, nil, + 1096, 1096, 1096, nil, 1096, 1096, nil, nil, 1096, 1096, + 1135, 1135, 1135, 1135, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1135, 1135, 1135, 1135, + nil, nil, nil, 1135, nil, nil, nil, nil, nil, 1135, + 1135, nil, nil, nil, 1135, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1135, nil, nil, 1135, nil, nil, + nil, 1135, nil, nil, 1135, nil, 1135, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1135, + nil, nil, nil, 1135, 1135, 1135, 1135, 1135, 1135, nil, + nil, nil, 1135, 1135, nil, nil, nil, nil, nil, nil, + 1135, nil, nil, 1135, 1135, 1135, nil, 1135, 1135, nil, + nil, 1135, 1135, 1156, 1156, 1156, 1156, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1156, + 1156, 1156, 1156, nil, nil, nil, 1156, nil, nil, nil, + nil, nil, 1156, 1156, nil, nil, nil, 1156, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1156, nil, nil, + 1156, nil, nil, nil, 1156, nil, nil, 1156, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1156, nil, nil, nil, 1156, 1156, 1156, 1156, + 1156, 1156, nil, nil, nil, 1156, 1156, nil, nil, nil, + nil, nil, nil, 1156, nil, nil, 1156, 1156, 1156, nil, + 1156, 1156, nil, nil, 1156, 1156, 1157, 1157, 1157, 1157, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1157, 1157, 1157, 1157, nil, nil, nil, 1157, + nil, nil, nil, nil, nil, 1157, 1157, nil, nil, nil, + 1157, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1157, nil, nil, 1157, nil, nil, nil, 1157, nil, nil, + 1157, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1157, nil, nil, nil, 1157, + 1157, 1157, 1157, 1157, 1157, nil, nil, nil, 1157, 1157, + nil, nil, nil, nil, nil, nil, 1157, nil, nil, 1157, + 1157, 1157, nil, 1157, 1157, nil, nil, 1157, 1157, 1202, + 1202, 1202, 1202, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1202, 1202, 1202, 1202, nil, + nil, nil, 1202, nil, nil, nil, nil, nil, 1202, 1202, + nil, nil, nil, 1202, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1202, nil, nil, 1202, nil, nil, nil, + 1202, nil, nil, 1202, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1202, nil, + nil, nil, 1202, 1202, 1202, 1202, 1202, 1202, nil, nil, + nil, 1202, 1202, nil, nil, nil, nil, nil, nil, 1202, + nil, nil, 1202, 1202, 1202, nil, 1202, 1202, nil, nil, + 1202, 1202, 1205, 1205, 1205, 1205, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1205, 1205, + 1205, 1205, nil, nil, nil, 1205, nil, nil, nil, nil, + nil, 1205, 1205, nil, nil, nil, 1205, nil, nil, nil, + nil, nil, nil, nil, 892, 892, 892, 892, nil, nil, + nil, nil, nil, nil, nil, nil, 1205, nil, nil, 1205, + 892, 892, 892, 1205, nil, nil, 1205, nil, nil, nil, + nil, nil, nil, 892, 892, nil, nil, nil, 892, nil, + nil, 1205, nil, nil, nil, 1205, 1205, 1205, 1205, 1205, + 1205, nil, nil, nil, 1205, 1205, nil, nil, nil, nil, + nil, nil, 1205, nil, nil, 1205, 1205, 1205, nil, 1205, + 1205, nil, nil, 1205, 1205, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 892, 892, 892, + 892, 892, 892, nil, nil, nil, 892, 892, 893, 893, + 893, 893, nil, nil, 892, nil, nil, 892, 892, 892, + nil, 892, 892, nil, 893, 893, 893, 812, nil, 812, + 812, 812, 812, 812, nil, nil, nil, 893, 893, nil, + nil, nil, 893, 812, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 812, nil, nil, nil, nil, + nil, nil, nil, nil, 812, 812, 812, 812, nil, nil, + nil, 1066, nil, 1066, 1066, 1066, 1066, 1066, nil, nil, + nil, 893, 893, 893, 893, 893, 893, 1066, nil, nil, + 893, 893, nil, nil, nil, nil, nil, nil, 893, nil, + 812, 893, 893, 893, nil, 893, 893, nil, nil, 1066, + 812, nil, nil, nil, nil, nil, nil, nil, 1066, 1066, + 1066, 1066, nil, nil, nil, nil, 230, 230, nil, nil, + 230, nil, nil, nil, nil, nil, nil, nil, nil, 230, + 230, nil, 230, 230, 230, 230, 230, 230, 230, nil, + nil, 230, 230, nil, 1066, nil, 230, 230, 230, 230, + nil, nil, nil, nil, 1066, 230, nil, nil, nil, nil, + nil, nil, nil, 230, 230, nil, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, nil, nil, 230, + nil, nil, nil, nil, 231, 231, nil, nil, 231, nil, + nil, nil, nil, nil, nil, nil, nil, 231, 231, 230, + 231, 231, 231, 231, 231, 231, 231, nil, nil, 231, + 231, nil, nil, nil, 231, 231, 231, 231, nil, nil, + nil, nil, nil, 231, nil, nil, nil, nil, nil, nil, + nil, 231, 231, nil, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, nil, nil, 231, nil, nil, + nil, nil, 281, 281, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, nil, 281, 281, 231, 281, 281, + 281, 281, 281, 281, 281, nil, nil, 281, 281, nil, + nil, nil, 281, 281, 281, 281, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 281, + 281, nil, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, nil, nil, 281, nil, nil, nil, nil, + 484, 484, nil, nil, 484, nil, nil, nil, nil, nil, + nil, nil, nil, 484, 484, 281, 484, 484, 484, 484, + 484, 484, 484, nil, nil, 484, 484, nil, nil, nil, + 484, 484, 484, 484, nil, nil, nil, nil, nil, 484, + nil, nil, nil, nil, nil, nil, nil, 484, 484, nil, + 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, + 484, nil, nil, 484, nil, nil, nil, nil, 485, 485, + nil, nil, 485, nil, nil, nil, nil, nil, nil, nil, + nil, 485, 485, 484, 485, 485, 485, 485, 485, 485, + 485, nil, nil, 485, 485, nil, nil, nil, 485, 485, + 485, 485, nil, nil, nil, nil, nil, 485, nil, nil, + nil, nil, nil, nil, nil, 485, 485, nil, 485, 485, + 485, 485, 485, 485, 485, 485, 485, 485, 485, nil, + nil, 485, nil, nil, nil, nil, 554, 554, nil, nil, + 554, nil, nil, nil, nil, nil, nil, nil, nil, 554, + 554, 485, 554, 554, 554, 554, 554, 554, 554, nil, + nil, 554, 554, nil, nil, nil, 554, 554, 554, 554, + nil, nil, nil, nil, nil, 554, nil, nil, nil, nil, + nil, nil, nil, 554, 554, nil, 554, 554, 554, 554, + 554, 554, 554, 554, 554, 554, 554, nil, nil, 554, + nil, nil, nil, nil, 555, 555, nil, nil, 555, nil, + nil, nil, nil, nil, nil, nil, nil, 555, 555, 554, + 555, 555, 555, 555, 555, 555, 555, nil, nil, 555, + 555, nil, nil, nil, 555, 555, 555, 555, nil, nil, + nil, nil, nil, 555, nil, nil, nil, nil, nil, nil, + nil, 555, 555, nil, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, 555, nil, nil, 555, nil, nil, + nil, nil, 563, 563, nil, nil, 563, nil, nil, nil, + nil, nil, nil, nil, nil, 563, 563, 555, 563, 563, + 563, 563, 563, 563, 563, nil, nil, 563, 563, nil, + nil, nil, 563, 563, 563, 563, nil, nil, nil, nil, + nil, 563, nil, nil, nil, nil, nil, nil, nil, 563, + 563, nil, 563, 563, 563, 563, 563, 563, 563, 563, + 563, 563, 563, nil, nil, 563, nil, nil, nil, nil, + 564, 564, nil, nil, 564, nil, nil, nil, nil, nil, + nil, nil, nil, 564, 564, 563, 564, 564, 564, 564, + 564, 564, 564, nil, nil, 564, 564, nil, nil, nil, + 564, 564, 564, 564, nil, nil, nil, nil, nil, 564, + nil, nil, nil, nil, nil, nil, nil, 564, 564, nil, + 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, + 564, nil, nil, 564, nil, nil, nil, nil, 593, 593, + nil, nil, 593, nil, nil, nil, nil, nil, nil, nil, + nil, 593, 593, 564, 593, 593, 593, 593, 593, 593, + 593, nil, nil, 593, 593, nil, nil, nil, 593, 593, + 593, 593, nil, nil, nil, nil, nil, 593, nil, nil, + nil, nil, nil, nil, nil, 593, 593, nil, 593, 593, + 593, 593, 593, 593, 593, 593, 593, 593, 593, nil, + nil, 593, nil, nil, nil, nil, 594, 594, nil, nil, + 594, nil, nil, nil, nil, nil, nil, nil, nil, 594, + 594, 593, 594, 594, 594, 594, 594, 594, 594, nil, + nil, 594, 594, nil, nil, nil, 594, 594, 594, 594, + nil, nil, nil, nil, nil, 594, nil, nil, nil, nil, + nil, nil, nil, 594, 594, nil, 594, 594, 594, 594, + 594, 594, 594, 594, 594, 594, 594, nil, nil, 594, + nil, nil, nil, nil, 600, 600, nil, nil, 600, nil, + nil, nil, nil, nil, nil, nil, nil, 600, 600, 594, + 600, 600, 600, 600, 600, 600, 600, nil, nil, 600, + 600, nil, nil, nil, 600, 600, 600, 600, nil, nil, + nil, nil, nil, 600, nil, nil, nil, nil, nil, nil, + nil, 600, 600, nil, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, nil, nil, 600, nil, nil, + nil, nil, 601, 601, nil, nil, 601, nil, nil, nil, + nil, nil, nil, nil, nil, 601, 601, 600, 601, 601, + 601, 601, 601, 601, 601, nil, nil, 601, 601, nil, + nil, nil, 601, 601, 601, 601, nil, nil, nil, nil, + nil, 601, nil, nil, nil, nil, nil, nil, nil, 601, + 601, nil, 601, 601, 601, 601, 601, 601, 601, 601, + 601, 601, 601, nil, nil, 601, nil, nil, nil, nil, + 679, 679, nil, nil, 679, nil, nil, nil, nil, nil, + nil, nil, nil, 679, 679, 601, 679, 679, 679, 679, + 679, 679, 679, nil, nil, 679, 679, nil, nil, nil, + 679, 679, 679, 679, nil, nil, nil, nil, nil, 679, + nil, nil, nil, nil, nil, nil, nil, 679, 679, nil, + 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, + 679, nil, nil, 679, nil, nil, nil, nil, 680, 680, + nil, nil, 680, nil, nil, nil, nil, nil, nil, nil, + nil, 680, 680, 679, 680, 680, 680, 680, 680, 680, + 680, nil, nil, 680, 680, nil, nil, nil, 680, 680, + 680, 680, nil, nil, nil, nil, nil, 680, nil, nil, + nil, nil, nil, nil, nil, 680, 680, nil, 680, 680, + 680, 680, 680, 680, 680, 680, 680, 680, 680, nil, + 1110, 680, 1110, 1110, 1110, 1110, 1110, 1113, nil, 1113, + 1113, 1113, 1113, 1113, nil, nil, 1110, nil, nil, nil, + nil, 680, nil, 1113, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1110, nil, + nil, nil, nil, nil, nil, 1113, nil, 1110, 1110, 1110, + 1110, nil, nil, nil, 1113, 1113, 1113, 1113, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1174, 1174, nil, nil, 1174, + nil, nil, nil, 1110, nil, nil, nil, nil, 1174, 1174, + 1113, 1174, 1174, 1174, 1174, 1174, 1174, 1174, nil, nil, + 1174, 1174, nil, nil, nil, 1174, 1174, 1174, 1174, nil, + nil, nil, nil, nil, 1174, nil, nil, nil, nil, nil, + nil, nil, 1174, 1174, nil, 1174, 1174, 1174, 1174, 1174, + 1174, 1174, 1174, 1174, 1174, 1174, nil, nil, 1174, nil, + nil, nil, nil, 1179, 1179, nil, nil, 1179, nil, nil, + nil, nil, nil, nil, nil, nil, 1179, 1179, 1174, 1179, + 1179, 1179, 1179, 1179, 1179, 1179, nil, nil, 1179, 1179, + nil, nil, nil, 1179, 1179, 1179, 1179, nil, nil, nil, + nil, nil, 1179, nil, nil, nil, nil, nil, nil, nil, + 1179, 1179, nil, 1179, 1179, 1179, 1179, 1179, 1179, 1179, + 1179, 1179, 1179, 1179, nil, nil, 1179, nil, nil, nil, + nil, 1180, 1180, nil, nil, 1180, nil, nil, nil, nil, + nil, nil, nil, nil, 1180, 1180, 1179, 1180, 1180, 1180, + 1180, 1180, 1180, 1180, nil, nil, 1180, 1180, nil, nil, + nil, 1180, 1180, 1180, 1180, nil, nil, nil, nil, nil, + 1180, nil, nil, nil, nil, nil, nil, nil, 1180, 1180, + nil, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, + 1180, 1180, nil, 1207, 1180, 1207, 1207, 1207, 1207, 1207, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1207, + nil, nil, nil, nil, 1180, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1207, nil, nil, nil, nil, nil, nil, nil, nil, + 1207, 1207, 1207, 1207, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1207 ] + +racc_action_pointer = [ + nil, 32, 1098, 58, nil, 202, nil, nil, 5417, 808, + nil, 25583, 25716, 72, nil, 71, 92, 432, 167, 242, + 267, nil, 106, 5560, 1242, 246, nil, -40, nil, 165, + 5698, 5830, 5960, 6103, 6246, nil, 1242, 23637, 23776, nil, + 187, 377, 409, 370, 6389, 6532, 164, 6675, 6818, 518, + 6961, 317, 368, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 7099, nil, 7240, nil, nil, -22, nil, 7383, + 7526, nil, nil, 7669, 23915, 24054, 24193, 25849, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 77, nil, nil, nil, nil, nil, + nil, 326, 359, 368, 378, nil, nil, 25982, nil, nil, + nil, nil, nil, nil, 0, nil, nil, 136, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 7812, nil, nil, nil, nil, 7955, 8098, 8241, 8384, 8527, + 415, nil, 414, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 418, nil, 1386, 8670, 8813, 8956, 9099, 9242, 9385, + 28295, 28363, nil, nil, 9528, 9671, 9814, nil, nil, 376, + 104, 112, 510, 147, 421, 490, nil, 9957, 1530, 489, + nil, 10100, 10243, 10386, 10529, 10672, 10815, 10958, 11101, 11244, + 11387, 11530, 11673, 11816, 11959, 12102, 12245, 12388, 12531, 12674, + 12817, 12960, 13103, nil, nil, nil, nil, 13246, nil, nil, + nil, 28431, nil, nil, 499, 13389, 13532, nil, nil, nil, + nil, nil, nil, nil, nil, 13675, nil, 1674, nil, 476, + 505, nil, 13818, 548, 13961, nil, nil, 14104, 14247, nil, + nil, 417, nil, nil, 14390, 1371, nil, 498, 1674, 553, + 592, 566, 24332, 1818, 380, 455, 504, 646, 516, nil, + 613, 587, 193, nil, nil, nil, 625, 167, 612, 24471, + nil, 449, 591, 2538, 2682, 703, nil, 709, 14533, nil, + 14676, 1962, 1515, 652, 14819, 14962, nil, 768, -8, 8, + 15105, 2106, 2250, 462, 764, 664, -19, -7, 620, 742, + 24, 791, nil, nil, 955, 1087, -20, nil, 640, nil, + 720, 15248, nil, nil, nil, 244, 356, 412, 416, 481, + 514, 552, 555, 576, nil, 596, nil, nil, 337, nil, + 308, nil, 382, nil, 403, nil, 719, 440, nil, 737, + 481, nil, 740, -59, nil, 742, -58, nil, 485, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 26115, nil, nil, nil, nil, 755, nil, + 834, 752, 15391, 773, nil, nil, 770, nil, 650, 214, + 887, nil, nil, 1386, nil, nil, nil, nil, nil, 1530, + 805, nil, nil, 803, 804, 513, 597, 7240, nil, nil, + nil, 272, 408, 845, nil, nil, 15529, 15661, nil, nil, + nil, -26, nil, 853, 28499, 28567, 15794, 223, 15937, 16080, + 16223, 26468, 2826, 2970, 805, 1067, 879, 882, 884, 886, + 4554, 4698, 1121, 3114, 3258, 3402, 3546, 3690, 3834, 897, + 908, 3978, 4122, 1818, 4266, 946, nil, 16361, nil, nil, + nil, nil, 16487, 830, 834, 848, nil, nil, nil, 852, + nil, nil, 16630, nil, nil, 16773, nil, 16916, nil, 196, + nil, nil, nil, 17059, 1659, 867, 859, 857, nil, nil, + 858, 24610, 872, 17202, 28635, 28703, 652, 909, nil, 24749, + 875, nil, 17345, 28771, 28839, 17488, 4410, 1962, 17631, 1001, + 1000, 884, nil, nil, 534, 573, 889, 903, nil, 643, + 930, 2394, 1022, nil, 2538, 63, 1029, 1032, 436, 1033, + nil, nil, 17774, 28907, 28975, 26, nil, nil, 725, nil, + 29043, 29111, 17917, nil, nil, nil, 784, 2682, 954, nil, + nil, nil, 18060, nil, 475, nil, 918, 919, 921, nil, + 923, 933, 937, nil, nil, nil, nil, nil, nil, nil, + nil, 923, 784, nil, nil, 18203, nil, nil, nil, 0, + nil, nil, nil, 1022, nil, nil, 1024, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 265, nil, + nil, 298, nil, nil, nil, 946, nil, nil, 947, nil, + 2826, nil, 26248, nil, 18346, 951, 18489, 18632, 18775, 29179, + 29247, 18918, 19061, 644, 987, 19204, 19347, 19490, 19633, 987, + nil, nil, nil, 19776, 19919, 989, nil, nil, nil, 236, + 243, 544, 680, 966, 1005, nil, 986, nil, nil, 317, + 195, -67, nil, 796, nil, nil, 7099, 16346, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1045, + 5, nil, 977, nil, 113, 1080, -19, nil, nil, 20062, + nil, 997, nil, 1102, nil, 993, nil, 1036, 20205, nil, + nil, 20348, nil, nil, -85, 24888, 996, nil, 1000, -9, + -5, 1050, 25, 776, 1064, 1029, 25027, nil, 1094, -14, + 683, nil, 20491, nil, nil, nil, nil, 20634, nil, nil, + 20777, nil, nil, nil, 884, nil, 1154, nil, nil, nil, + nil, nil, 1160, 1166, nil, nil, 20920, 1050, 29, 30, + 162, 163, 2970, 1089, 784, nil, 1052, 3114, 21063, 598, + 1171, 3258, 28186, 611, 26381, -7, 34, 1059, 231, nil, + nil, 805, nil, 745, nil, 883, nil, 5662, nil, 21206, + nil, 1084, nil, 1057, 1060, 685, 1066, nil, nil, nil, + nil, nil, 1153, 3402, nil, nil, nil, nil, nil, 1080, + nil, nil, 1066, 21349, 1071, 251, 266, 816, 952, nil, + 2106, 21492, nil, 1069, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 21635, 21778, 21921, 22064, 277, 1151, + 26581, 1112, 314, 26694, 26807, 319, 26920, nil, 58, nil, + 1096, 27033, 28092, 28186, nil, nil, nil, nil, nil, 22207, + nil, nil, 5761, nil, 3546, nil, nil, 1106, 1095, nil, + 127, nil, nil, nil, nil, 1099, 39, nil, nil, nil, + nil, nil, nil, 3690, nil, 1103, 1148, nil, nil, 688, + 1230, nil, nil, 22350, nil, 3834, 1231, nil, nil, nil, + 27146, nil, 22493, 69, 68, 1240, nil, 1241, 601, nil, + nil, 1242, 1128, 1126, 1130, nil, 635, nil, nil, nil, + 3978, 4122, 1127, 1141, 1139, nil, 1218, nil, nil, 1141, + 1149, nil, 1155, 1169, nil, 1173, nil, nil, 1179, 2380, + 1017, nil, nil, nil, nil, nil, nil, nil, 1182, nil, + 1194, 313, nil, nil, 22636, 22779, nil, nil, nil, nil, + -63, 1233, 1236, 27259, nil, 1200, -33, 1201, nil, nil, + nil, 27372, nil, 1, 1206, 1207, nil, 1210, 1211, nil, + 740, nil, nil, 2250, 1210, 1213, 1225, nil, 1226, 1227, + 1234, nil, 1255, 1239, 1222, 25166, nil, nil, nil, nil, + nil, 4266, 4410, nil, 9, 25305, nil, nil, nil, 35, + nil, nil, 43, 872, -31, nil, nil, nil, 22922, 4554, + nil, nil, nil, 4698, nil, nil, 28240, nil, nil, 1280, + 1258, 1363, 916, nil, nil, 15493, nil, 7063, nil, 15592, + nil, 16367, nil, nil, nil, nil, 1244, 1246, nil, nil, + nil, 1288, 1251, 131, nil, 1254, 27485, 201, 1296, nil, + nil, nil, nil, nil, nil, nil, 305, nil, nil, nil, + 29309, nil, nil, 29316, nil, 23658, nil, nil, 1284, 25444, + 786, 1339, nil, 1387, 4842, 120, 135, 863, 1343, 144, + nil, 4986, nil, 23065, 23208, 27598, nil, 23351, 441, 1390, + 1274, 5130, nil, nil, 707, nil, nil, nil, 1273, 1293, + 1294, 1296, 1034, 2410, nil, 1297, 27711, 27824, 1298, nil, + nil, nil, nil, 1299, nil, nil, 1313, 1317, 1320, 1335, + nil, 1338, nil, 912, 29384, nil, nil, 1461, 23494, 29452, + 29520, 145, 900, 5274, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1462, nil, 1228, 23797, nil, nil, nil, + nil, 1344, 27937, 1345, 1347, 28050, nil, 29582, nil, 23936, + nil, 24075, nil, 24214, nil, nil, 1387, 1390, nil, 1355, + 158, 168, 169, 236, nil, 310, nil, nil, 1354, 1357, + nil, 1369, 1370, 1371, 1378, 171, nil, nil, nil, nil, + 24353, nil, nil, nil, nil, 1379, nil ] + +racc_action_default = [ + -1, -754, -753, -754, -2, -739, -4, -5, -754, -8, + -9, -754, -754, -754, -36, -754, -754, -41, -754, -754, + -301, -53, -741, -754, -60, -65, -66, -67, -71, -278, + -278, -278, -316, -347, -348, -83, -753, -87, -95, -97, + -754, -635, -636, -754, -754, -754, -754, -754, -754, -235, + -754, -741, -249, -292, -293, -294, -295, -296, -297, -298, + -299, -300, -725, -303, -305, -312, -314, -324, -326, -754, + -754, -62, -62, -739, -754, -754, -754, -754, -349, -350, + -352, -353, -354, -355, -356, -357, -358, -359, -360, -361, + -370, -426, -565, -566, -567, -568, -569, -753, -572, -753, + -753, -753, -753, -753, -753, -608, -609, -753, -611, -617, + -619, -620, -621, -622, -723, -624, -625, -724, -627, -628, + -629, -630, -631, -632, -633, -634, -639, -640, 1247, -3, + -740, -749, -750, -751, -7, -754, -754, -754, -754, -754, + -754, -24, -754, -126, -127, -128, -129, -130, -131, -132, + -136, -137, -138, -139, -140, -141, -142, -143, -144, -145, + -146, -147, -148, -149, -150, -151, -152, -153, -154, -155, + -156, -157, -158, -159, -160, -161, -162, -163, -164, -165, + -166, -167, -168, -169, -170, -171, -172, -173, -174, -175, + -176, -177, -178, -179, -180, -181, -182, -183, -184, -185, + -186, -187, -188, -189, -190, -191, -192, -193, -194, -195, + -196, -197, -198, -199, -200, -201, -202, -203, -204, -205, + -206, -29, -133, -753, -754, -754, -754, -754, -754, -753, + -754, -754, -735, -736, -754, -754, -741, -742, -57, -754, + -635, -636, -754, -301, -754, -754, -241, -754, -753, -754, + -58, -218, -219, -754, -754, -754, -754, -754, -754, -754, + -754, -754, -754, -754, -754, -754, -754, -754, -754, -754, + -754, -754, -754, -250, -251, -252, -253, -754, -363, -454, + -434, -754, -737, -738, -72, -753, -754, -323, -362, -438, + -447, -449, -78, -444, -79, -741, -80, -256, -273, -753, + -753, -277, -754, -283, -754, -753, -717, -754, -754, -81, + -82, -739, -17, -18, -754, -21, -22, -85, -753, -741, + -754, -88, -91, -753, -103, -104, -754, -754, -111, -316, + -319, -741, -754, -347, -348, -351, -445, -754, -93, -754, + -99, -311, -754, -220, -221, -618, -229, -230, -754, -242, + -754, -753, -307, -741, -753, -753, -325, -61, -754, -754, + -754, -753, -753, -739, -754, -740, -635, -636, -754, -754, + -301, -754, -380, -381, -121, -122, -754, -124, -754, -301, + -753, -754, -635, -636, -340, -126, -127, -166, -167, -168, + -184, -189, -196, -199, -342, -754, -712, -713, -670, -570, + -754, -593, -754, -595, -754, -597, -754, -754, -577, -754, + -754, -583, -754, -754, -589, -754, -754, -591, -754, -610, + -612, -613, -614, -615, -6, -752, -30, -31, -32, -33, + -34, -10, -11, -754, -26, -27, -28, -134, -754, -37, + -40, -288, -754, -754, -287, -38, -754, -42, -754, -301, + -50, -52, -207, -261, -283, -54, -55, -43, -208, -261, + -741, -268, -269, -753, -753, -726, -727, -278, -442, -728, + -729, -727, -726, -278, -441, -443, -728, -729, -49, -215, + -56, -741, -322, -754, -754, -754, -753, -311, -754, -754, + -754, -754, -216, -217, -222, -223, -224, -225, -226, -227, + -231, -232, -233, -234, -236, -237, -238, -239, -240, -243, + -244, -245, -246, -741, -254, -754, -455, -278, -726, -727, + -69, -73, -671, -741, -753, -741, -279, -451, -454, -741, + -318, -274, -754, -282, -275, -754, -280, -754, -284, -754, + -720, -722, -16, -740, -20, -754, -741, -84, -309, -100, + -89, -754, -741, -753, -754, -754, -110, -754, -618, -754, + -96, -101, -754, -754, -754, -754, -255, -247, -754, -557, + -754, -741, -306, -257, -746, -746, -741, -754, -715, -746, + -754, -753, -371, -372, -753, -754, -754, -754, -754, -754, + -366, -461, -753, -754, -754, -311, -62, -121, -122, -123, + -754, -754, -753, -335, -641, -643, -337, -753, -647, -344, + -733, -734, -754, -427, -670, -430, -711, -711, -711, -653, + -655, -655, -655, -669, -672, -673, -674, -675, -676, -677, + -678, -679, -754, -681, -683, -685, -690, -692, -693, -696, + -701, -703, -704, -706, -707, -708, -754, -571, -594, -599, + -600, -602, -573, -596, -574, -598, -575, -576, -754, -579, + -581, -754, -582, -585, -586, -754, -587, -588, -754, -616, + -753, -25, -754, -35, -754, -291, -754, -754, -753, -754, + -754, -754, -754, -446, -754, -270, -272, -754, -754, -74, + -266, -267, -439, -754, -754, -76, -440, -321, -743, -726, + -727, -726, -727, -741, -59, -478, -480, -482, -485, -538, + -492, -495, -498, -531, -536, -537, -754, -754, -541, -542, + -543, -544, -545, -546, -547, -548, -549, -550, -551, -754, + -754, -555, -754, -433, -753, -68, -435, -451, -263, -270, + -265, -754, -452, -754, -317, -753, -281, -285, -754, -718, + -719, -754, -19, -23, -86, -754, -92, -98, -741, -726, + -727, -753, -730, -109, -754, -94, -754, -214, -228, -741, + -753, -364, -753, -304, -369, -308, -258, -748, -747, -260, + -748, -313, -315, -716, -753, -373, -753, -63, -374, -375, + -329, -330, -754, -754, -465, -332, -754, -741, -726, -727, + -730, -310, -753, -121, -122, -125, -741, -753, -754, -754, + -754, -753, -670, -670, -754, -741, -754, -741, -754, -650, + -651, -754, -652, -754, -662, -754, -665, -754, -667, -754, + -382, -754, -384, -386, -389, -392, -741, -684, -694, -695, + -705, -709, -754, -753, -578, -580, -584, -590, -592, -754, + -135, -39, -289, -754, -741, -726, -727, -727, -726, -51, + -262, -754, -744, -753, -45, -210, -46, -211, -75, -47, + -213, -48, -212, -77, -754, -754, -754, -754, -446, -754, + -754, -483, -484, -754, -754, -754, -754, -494, -754, -497, + -754, -754, -534, -535, -539, -540, -552, -122, -553, -754, + -415, -416, -741, -418, -753, -437, -436, -754, -741, -448, + -753, -450, -276, -286, -721, -90, -446, -102, -320, -13, + -15, -365, -367, -753, -564, -558, -753, -559, -560, -746, + -754, -368, -376, -754, -378, -753, -754, -64, -331, -333, + -754, -457, -754, -754, -446, -754, -446, -754, -754, -338, + -341, -754, -741, -655, -741, -671, -754, -345, -714, -428, + -753, -753, -420, -741, -711, -691, -696, -710, -654, -655, + -655, -682, -655, -655, -702, -655, -679, -697, -741, -754, + -754, -391, -680, -601, -604, -605, -606, -607, -754, -12, + -290, -446, -44, -209, -271, -754, -479, -481, -488, -491, + -500, -754, -754, -501, -507, -754, -512, -518, -520, -522, + -523, -526, -527, -529, -741, -741, -554, -741, -741, -745, + -754, -532, -533, -248, -711, -711, -711, -397, -753, -753, + -753, -414, -754, -741, -679, -687, -688, -699, -456, -70, + -264, -753, -753, -563, -754, -754, -562, -259, -327, -754, + -379, -328, -754, -470, -473, -476, -477, -458, -754, -753, + -334, -336, -642, -753, -343, -644, -754, -646, -648, -647, + -754, -754, -754, -429, -649, -754, -658, -754, -660, -754, + -663, -754, -666, -668, -383, -385, -387, -390, -603, -486, + -487, -516, -502, -505, -508, -510, -754, -519, -525, -528, + -530, -489, -490, -493, -496, -499, -754, -394, -395, -396, + -405, -399, -407, -754, -410, -754, -412, -417, -754, -754, + -686, -754, -453, -753, -753, -635, -636, -754, -754, -301, + -561, -753, -466, -754, -754, -474, -459, -754, -753, -754, + -741, -753, -431, -432, -741, -422, -424, -425, -655, -655, + -655, -655, -754, -754, -509, -503, -754, -754, -513, -514, + -517, -521, -524, -711, -689, -398, -753, -753, -753, -753, + -700, -753, -419, -698, -754, -311, -14, -557, -753, -754, + -754, -311, -753, -753, -471, -472, -475, -460, -462, -463, + -464, -339, -645, -754, -421, -754, -754, -656, -659, -661, + -664, -388, -754, -506, -511, -754, -393, -754, -402, -754, + -404, -754, -408, -754, -411, -413, -310, -730, -556, -741, + -726, -727, -730, -310, -377, -753, -346, -423, -655, -504, + -515, -753, -753, -753, -753, -446, -467, -468, -469, -657, + -754, -400, -403, -406, -409, -753, -401 ] + +racc_goto_table = [ + 6, 42, 298, 298, 298, 525, 321, 42, 230, 589, + 280, 770, 394, 289, 293, 356, 282, 4, 133, 793, + 235, 683, 460, 444, 445, 599, 146, 146, 704, 238, + 811, 141, 222, 457, 431, 42, 325, 325, 930, 478, + 581, 584, 420, 920, 534, 335, 335, 936, 130, 350, + 149, 149, 615, 129, 345, 889, 361, 362, 515, 746, + 749, 317, 746, 42, 358, 359, 623, 969, 363, 570, + 1029, 830, 338, 367, 383, 383, 383, 741, 523, 560, + 963, 319, 335, 335, 335, 974, 133, 836, 299, 299, + 299, 904, 146, 441, 454, 401, 134, 403, 405, 408, + 411, 414, 417, 1085, 400, 401, 971, 521, 284, 292, + 294, 467, 473, 1145, 418, 1147, 1087, 1, 296, 309, + 310, 364, 146, 300, 300, 300, 2, 1170, 140, 42, + 426, 427, 428, 429, 670, 357, 357, 781, 42, 357, + 970, 658, 972, 919, 661, 458, 1001, 1014, 16, 1017, + 1042, 479, 380, 384, 16, 776, 779, 894, 895, 752, + 783, 545, 517, 221, 373, 1032, 440, 433, 491, 1002, + 1015, 536, 787, 538, 1018, 937, 540, 541, 819, 820, + 822, 281, 16, 1158, 737, 672, 348, 631, 320, 576, + 9, 736, 396, 577, 371, 603, 9, 395, 609, 298, + 351, 357, 357, 357, 357, 353, 571, 354, 534, 355, + 16, 749, 746, 746, 468, 807, 809, 1063, 424, 1030, + 372, 1170, 42, 607, 580, 608, 1056, 461, 484, 814, + 439, 450, 1069, 792, 450, 1086, 1227, 1031, 1147, 1033, + 450, 1144, 613, 1203, 1204, 959, 477, 42, 398, 805, + 451, 816, 352, 451, 527, 298, 298, 528, 910, 451, + 943, 734, 1188, 796, 878, 298, 746, 1041, 817, 1052, + 830, 887, 1236, 940, 981, 1183, 16, 1085, 1166, 703, + 443, 443, 623, 461, 1053, 16, 978, 907, 1201, 1229, + 1055, 756, 455, 456, 996, 997, 1118, 533, 533, 765, + 883, 480, 481, 401, 884, 749, 886, 743, 561, 888, + 969, 675, 539, 42, 891, 554, 289, 42, 9, 916, + 293, 325, 42, 1160, 133, 810, 1161, 430, 1162, 557, + 335, 563, 926, 1021, 1022, 974, 1044, 399, 325, 402, + 404, 524, 299, 317, 407, 558, 758, 335, 317, 971, + 42, 299, 573, 578, 543, 585, 550, 593, 944, 542, + 42, 42, 1104, 546, 971, 467, 473, 946, 552, 16, + 410, 446, 526, 413, 446, 438, 133, 300, 605, 898, + 446, 529, 416, 970, 983, 797, 300, 842, 843, 419, + 826, 828, 1148, 971, 16, 806, 1176, 808, 1186, 1189, + 320, 747, 965, 631, 580, 479, 750, 458, 1164, 612, + 574, 588, nil, nil, nil, 991, nil, nil, 830, 830, + 1000, 1000, nil, 1000, nil, nil, 357, 1167, 1020, nil, + 1168, nil, nil, nil, nil, 761, 1224, 679, nil, 753, + nil, nil, nil, 999, 761, 575, 579, 606, 146, nil, + nil, 691, nil, 671, nil, nil, 298, 696, 684, 908, + 16, 533, 533, nil, 16, 690, 952, 956, 468, 16, + 320, 854, 149, nil, 761, 320, nil, 1054, nil, 767, + 623, 623, 761, nil, 461, nil, 1237, nil, nil, 912, + 726, 1141, 864, 866, nil, 915, 971, 16, 869, 871, + 477, 691, 544, nil, 837, nil, nil, 16, 16, nil, + 1047, 732, 868, 586, 587, 690, nil, nil, 873, 749, + 561, 746, 533, 298, 1231, 947, 1074, nil, 561, 951, + nil, 653, 954, 655, 1016, nil, 659, nil, 468, 659, + nil, nil, 42, nil, nil, 852, 689, 468, 1098, nil, + 325, 461, 695, nil, 747, 580, nil, nil, 325, 335, + 467, 473, 298, nil, nil, nil, nil, 335, nil, nil, + 477, 927, 298, nil, 684, 1101, 1102, 468, 1103, 477, + 42, 802, nil, 42, nil, 468, 1107, 1108, 1109, nil, + 461, 830, 830, nil, nil, nil, 735, nil, 788, nil, + 461, 631, 631, nil, 865, 867, 42, 912, 747, 477, + 870, 872, 631, nil, 631, 477, nil, 913, nil, 1218, + 914, nil, 1038, 745, nil, 1059, nil, nil, nil, nil, + nil, nil, nil, nil, 769, nil, nil, nil, nil, nil, + nil, 925, nil, nil, 1092, nil, 747, nil, 298, 580, + nil, nil, nil, nil, nil, nil, 1238, nil, nil, nil, + nil, nil, nil, 468, nil, 941, 992, nil, 6, 42, + nil, nil, 1000, 42, nil, nil, 461, nil, 815, 1071, + 42, nil, nil, 450, 906, 849, nil, 146, 482, 16, + nil, 1034, 850, 450, 450, 477, nil, nil, 977, 450, + 450, 684, 451, nil, nil, nil, nil, nil, 684, 890, + nil, 149, 451, 451, nil, 726, 726, 18, 451, 451, + 905, nil, 990, 18, 561, 1206, 1124, 16, nil, nil, + 16, 1131, 900, 784, 1132, 917, 786, 1159, 1076, 1078, + nil, 1080, 1082, 533, 1083, 691, nil, 530, 696, 957, + nil, 18, nil, 16, 325, nil, 684, nil, nil, 690, + nil, nil, nil, 335, nil, 325, 966, nil, 924, nil, + 928, 547, nil, nil, 335, nil, 863, nil, 993, 18, + 1235, 1139, 934, 1190, 934, nil, 1140, 845, nil, nil, + 845, 865, 867, 872, 870, 684, nil, 1159, 1159, nil, + nil, 42, 773, 948, 684, 572, 42, nil, nil, nil, + 42, 1057, nil, nil, nil, 962, 16, nil, 790, 791, + 16, 795, 949, 446, nil, nil, nil, 16, 443, 146, + 863, 1013, 1013, 446, 446, nil, 1013, nil, nil, 446, + 446, nil, 42, 1159, nil, 18, 1230, nil, nil, nil, + nil, nil, 684, nil, 18, 631, nil, 953, 9, 1193, + nil, 533, 851, 580, 631, nil, nil, 450, 929, 859, + 973, nil, 975, nil, 357, nil, nil, nil, nil, 726, + 684, nil, 726, 726, nil, 726, 451, nil, 1013, nil, + 726, 726, 726, nil, nil, nil, nil, nil, nil, 1034, + 962, nil, 1034, 42, nil, nil, nil, nil, 900, nil, + nil, nil, 993, nil, nil, nil, nil, 1197, 1198, 1199, + 1200, nil, 42, nil, 1046, nil, nil, 1136, 1049, nil, + nil, nil, nil, 697, 42, nil, nil, nil, 18, 726, + 18, nil, nil, 18, nil, 718, 1026, 1028, 16, 18, + nil, nil, nil, 16, 945, nil, nil, 16, nil, 42, + 42, 1062, nil, 18, nil, nil, nil, nil, nil, 1068, + nil, 1219, nil, nil, nil, 738, nil, 740, nil, nil, + nil, 744, nil, nil, nil, nil, nil, nil, nil, 16, + nil, nil, nil, nil, nil, 988, 1034, 1239, 754, 357, + nil, nil, 726, nil, 757, nil, 1187, 446, nil, nil, + 726, nil, 684, 684, nil, 684, 890, nil, nil, nil, + nil, nil, nil, 775, 938, 939, 1111, 1111, 1111, 18, + nil, 962, nil, 18, 383, nil, nil, nil, 18, nil, + 42, 42, 950, 335, 1126, 1013, nil, nil, nil, nil, + 16, nil, nil, 335, 966, nil, nil, nil, 42, nil, + 761, nil, 42, nil, nil, nil, 18, nil, nil, 16, + nil, nil, nil, nil, nil, 1043, 18, 18, nil, 19, + nil, 16, nil, nil, nil, 19, nil, 1050, nil, 964, + nil, nil, nil, nil, 719, 726, nil, nil, nil, nil, + 239, nil, nil, nil, nil, nil, 16, 16, nil, 239, + 239, 239, 1070, 19, 326, 326, 1179, nil, 383, nil, + 1149, 924, 1150, 42, 1151, nil, nil, 335, 1184, 1185, + 42, nil, nil, nil, 726, nil, 934, nil, nil, nil, + 42, 19, 1194, nil, nil, nil, 239, 239, 298, nil, + 239, 368, 378, 378, 1026, 726, 726, 1026, 1169, 1026, + 1171, nil, 1048, 468, 1111, 1111, 1111, 1111, 1051, 1111, + 718, 718, nil, 1025, nil, 967, 461, 1060, 967, 1061, + 934, nil, 42, 1064, nil, 720, nil, 16, 16, 477, + nil, 1130, nil, 1122, 1123, 477, nil, nil, nil, 357, + 357, 726, nil, nil, 726, 16, nil, 19, nil, 16, + nil, 1138, 239, 239, 239, 239, 19, 684, 1112, 1114, + 1116, 918, nil, 934, nil, nil, nil, nil, nil, 1111, + 1111, 1111, 1111, nil, nil, nil, nil, 1035, nil, nil, + nil, 1228, nil, 1111, nil, nil, nil, nil, nil, nil, + nil, 1026, 1232, 1026, 1233, 1026, 1234, 1026, 18, 1027, + nil, nil, nil, nil, nil, nil, nil, 958, nil, nil, + 16, nil, nil, nil, nil, nil, 1177, 16, nil, nil, + nil, nil, nil, 1182, 1026, 1245, nil, 16, 982, nil, + nil, nil, 20, nil, nil, nil, 18, nil, 20, 18, + 19, 239, 448, 239, 239, 448, 239, nil, nil, nil, + nil, 448, 239, 239, nil, nil, nil, nil, nil, 719, + 719, nil, 18, nil, nil, 19, 20, 328, 328, 16, + nil, nil, nil, nil, 718, 1225, nil, 718, 718, nil, + 718, nil, nil, nil, nil, 718, 718, 718, nil, nil, + nil, nil, nil, nil, 20, nil, 1208, 1210, 1212, 1214, + 1040, 1215, 239, 239, 370, 379, 379, nil, nil, nil, + nil, 1191, 239, nil, nil, nil, nil, 1163, nil, nil, + nil, 1025, nil, nil, 1025, 18, 1025, nil, nil, 18, + nil, 19, 18, nil, 718, 19, 18, nil, nil, 326, + 19, nil, 18, 18, 1065, nil, 1067, nil, 18, 18, + 720, 720, nil, nil, nil, 1073, 326, nil, nil, nil, + 20, 1241, 1242, 1243, 1244, 1226, nil, nil, 19, 20, + 1084, nil, nil, nil, nil, 1246, nil, 239, 19, 19, + nil, 1035, nil, nil, nil, 1035, nil, nil, 1035, nil, + 1035, nil, nil, nil, nil, nil, nil, 718, 239, nil, + nil, nil, nil, 967, nil, 718, nil, 1027, nil, nil, + 1027, nil, 1027, nil, nil, nil, nil, nil, 1025, nil, + 1025, nil, 1025, 719, 1025, nil, 719, 719, nil, 719, + nil, nil, nil, nil, 719, 719, 719, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1025, nil, 20, nil, 449, nil, 18, 449, nil, + nil, nil, 18, nil, 449, nil, 18, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, 1035, 719, 1035, nil, 1035, nil, 1035, nil, + 718, nil, nil, nil, nil, 721, nil, nil, 18, nil, + nil, nil, nil, 239, 1027, nil, 1027, nil, 1027, nil, + 1027, nil, nil, nil, 720, 1035, 18, 720, 720, nil, + 720, nil, nil, nil, nil, 720, 720, 720, nil, 718, + nil, nil, 1192, nil, nil, nil, nil, 1027, nil, nil, + nil, nil, nil, nil, 20, nil, 719, nil, 20, nil, + 718, 718, 328, 20, 719, nil, nil, nil, nil, 18, + 19, nil, nil, nil, nil, nil, nil, nil, 326, 328, + 239, nil, nil, nil, 720, nil, 326, nil, 18, nil, + nil, 20, nil, nil, nil, 239, nil, nil, nil, nil, + 18, 20, 20, nil, nil, nil, 718, nil, 19, 718, + nil, 19, nil, nil, nil, nil, nil, nil, nil, 239, + nil, nil, nil, nil, nil, 18, 18, nil, nil, 239, + nil, nil, 29, nil, 19, nil, nil, nil, 29, 239, + nil, nil, nil, nil, nil, nil, nil, 720, nil, 719, + nil, nil, nil, 29, nil, 720, nil, nil, nil, nil, + nil, nil, 29, 29, 29, nil, 29, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 719, nil, + nil, nil, nil, nil, 29, nil, nil, 19, nil, 29, + 29, 19, nil, 29, 448, 239, 18, 18, 19, 719, + 719, nil, nil, nil, 448, 448, nil, nil, nil, nil, + 448, 448, nil, nil, 18, nil, nil, nil, 18, nil, + 721, 721, nil, nil, nil, nil, nil, nil, 722, nil, + 720, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 719, nil, nil, 719, nil, + 29, nil, nil, nil, nil, 29, 29, 29, 29, 29, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 720, + nil, nil, 326, 20, nil, nil, nil, nil, nil, 18, + nil, 328, nil, 326, nil, nil, 18, nil, nil, 328, + 720, 720, nil, nil, nil, nil, 18, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 20, nil, nil, 20, nil, nil, nil, nil, 19, + nil, nil, nil, nil, 19, 239, nil, nil, 19, nil, + nil, nil, nil, nil, nil, nil, 720, 20, 18, 720, + nil, nil, nil, 29, 29, 29, 29, 29, 29, 29, + nil, nil, nil, nil, 29, 29, 29, nil, nil, nil, + 19, nil, 723, nil, nil, nil, nil, nil, 29, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 448, nil, + nil, nil, nil, nil, 721, nil, nil, 721, 721, nil, + 721, nil, nil, nil, nil, 721, 721, 721, nil, nil, + 20, nil, nil, nil, 20, 29, 29, 449, nil, nil, + nil, 20, nil, nil, nil, 29, nil, 449, 449, nil, + nil, 19, nil, 449, 449, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, nil, nil, nil, 29, nil, + 19, nil, 724, 29, 721, nil, nil, nil, nil, nil, + 239, nil, 19, 722, 722, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, 19, 19, nil, + 29, 29, 29, nil, nil, 328, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 328, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, 721, nil, nil, + 725, nil, nil, nil, nil, 721, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 20, nil, nil, nil, nil, 20, nil, nil, + nil, 20, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1120, nil, nil, nil, nil, nil, 19, 19, + nil, nil, 1127, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 987, 20, nil, nil, 19, nil, nil, nil, + 19, nil, nil, nil, nil, nil, nil, 723, 723, nil, + nil, 449, nil, nil, nil, nil, nil, nil, nil, nil, + 721, nil, 727, nil, nil, nil, 29, nil, nil, 41, + nil, nil, nil, nil, nil, 41, nil, 722, nil, nil, + 722, 722, nil, 722, nil, nil, nil, nil, 722, 722, + 722, nil, nil, nil, 20, nil, 1173, nil, nil, 721, + nil, 19, nil, 41, 324, 324, nil, nil, 19, nil, + 239, 239, nil, 20, nil, nil, nil, nil, 19, nil, + 721, 721, nil, 29, nil, 20, nil, 724, 724, nil, + nil, 41, nil, 29, nil, nil, nil, 722, nil, nil, + nil, 366, 382, 382, 382, nil, nil, nil, 29, nil, + 20, 20, nil, nil, nil, 239, nil, nil, nil, nil, + 19, 29, nil, nil, 29, nil, 721, nil, nil, 721, + nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 29, nil, nil, nil, nil, 29, nil, nil, + nil, nil, 29, nil, nil, 725, 725, 41, nil, nil, + 722, nil, nil, nil, nil, nil, 41, nil, 722, nil, + nil, 723, nil, 32, 723, 723, nil, 723, nil, 32, + nil, nil, 723, 723, 723, 379, nil, nil, nil, nil, + nil, 20, 20, nil, 32, 1129, nil, nil, nil, nil, + nil, nil, nil, 32, 32, 32, nil, 32, nil, 20, + 29, nil, nil, 20, 29, nil, nil, 29, 29, nil, + nil, 29, nil, nil, nil, nil, nil, 29, 29, nil, + nil, 723, nil, 29, 29, 32, nil, nil, nil, nil, + 32, 32, nil, nil, 32, nil, nil, 727, 727, nil, + 41, 724, nil, 722, 724, 724, nil, 724, nil, nil, + nil, nil, 724, 724, 724, nil, nil, nil, nil, 379, + nil, nil, nil, nil, 20, 41, nil, nil, nil, nil, + nil, 20, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 20, 722, nil, 723, nil, nil, nil, nil, nil, + nil, 32, 723, nil, nil, nil, 32, 32, 32, 32, + 32, 724, nil, 722, 722, nil, nil, nil, nil, 725, + nil, nil, 725, 725, nil, 725, nil, nil, nil, nil, + 725, 725, 725, 20, nil, nil, nil, nil, nil, nil, + nil, 41, 29, nil, nil, 41, nil, 29, 29, 324, + 41, 29, nil, nil, nil, nil, nil, nil, nil, 722, + nil, nil, 722, nil, nil, nil, 324, nil, nil, nil, + nil, nil, nil, nil, 724, nil, nil, nil, 41, 725, + nil, nil, 724, 29, nil, nil, nil, 723, 41, 41, + nil, nil, nil, nil, 32, 32, 32, 32, 32, 32, + 32, 29, nil, nil, nil, 32, 32, 32, nil, nil, + nil, 727, nil, nil, 727, 727, nil, 727, nil, 32, + nil, nil, 727, 727, 727, nil, 723, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 725, nil, 29, nil, nil, 723, 723, nil, + 725, nil, nil, nil, nil, nil, 32, 32, nil, nil, + nil, nil, nil, 29, nil, nil, 32, 724, nil, nil, + nil, 727, nil, 29, nil, 29, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, 32, + nil, nil, nil, 723, 32, nil, 723, nil, nil, nil, + 29, 29, nil, nil, nil, nil, 724, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, 724, 724, nil, + nil, 32, 32, 32, 727, 725, nil, nil, nil, nil, + nil, nil, 727, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, 724, 725, nil, 724, nil, 324, nil, + nil, 29, 29, nil, nil, nil, 324, nil, nil, nil, + nil, nil, nil, nil, nil, 725, 725, nil, nil, 29, + nil, nil, nil, 29, nil, nil, nil, nil, 41, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 727, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, 725, nil, nil, 725, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 32, nil, nil, + nil, nil, nil, nil, 29, nil, 727, nil, nil, nil, + nil, 29, nil, 29, 29, nil, nil, nil, nil, nil, + nil, 29, nil, nil, nil, nil, nil, 727, 727, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, 32, nil, nil, nil, 29, nil, + nil, nil, nil, 29, 32, nil, nil, nil, nil, nil, + nil, nil, nil, 727, nil, nil, 727, nil, nil, 32, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 32, nil, nil, nil, nil, 32, nil, + nil, nil, 324, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 324, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, 41, nil, nil, nil, 41, nil, + nil, 32, nil, nil, nil, 32, nil, nil, 32, 32, + nil, nil, 32, nil, nil, nil, nil, nil, 32, 32, + nil, nil, nil, nil, 32, 32, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 246, nil, nil, nil, nil, nil, nil, nil, + 41, 297, 297, 297, nil, nil, nil, nil, nil, nil, + nil, nil, 41, 343, 344, nil, 346, 347, nil, 349, + nil, nil, nil, 32, nil, nil, nil, nil, 32, 32, + nil, nil, 32, nil, nil, nil, nil, 41, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 382, nil, nil, nil, nil, nil, 41, 41, + nil, nil, 1125, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + 41, nil, nil, nil, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 32, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 32, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 297, 453, nil, 382, 459, 297, nil, + nil, 41, nil, 459, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, 246, nil, 41, nil, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, nil, nil, nil, nil, 514, nil, nil, nil, + nil, nil, nil, nil, 297, 297, nil, nil, nil, nil, + 41, nil, 32, 32, 297, nil, nil, nil, nil, nil, + nil, 297, nil, 297, nil, nil, 297, 297, nil, nil, + 32, nil, nil, nil, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 566, nil, 567, + nil, nil, nil, 297, 297, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, nil, 32, nil, 32, 32, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 32, + nil, nil, nil, nil, 32, nil, nil, nil, nil, nil, + nil, 297, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 297, nil, 459, 459, 459, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 344, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 297, nil, nil, 297, nil, 297, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 297, nil, nil, nil, nil, nil, nil, nil, + nil, 459, nil, nil, 768, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 297, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 297, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 297, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 297, 459, 297, nil, nil, + nil, 860, nil, nil, 297, 297, 459, 459, nil, nil, + nil, nil, 459, 459, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 297, nil, + nil, nil, nil, nil, nil, nil, nil, 297, nil, nil, + 297, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 297, nil, nil, nil, nil, 297, nil, nil, 297, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 297, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 297, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 297, nil, nil, nil, nil, nil, nil, nil, + 459, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 459, 459, 459, 459, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1023, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 297, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 297, 459, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 297, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 297, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 297 ] + +racc_goto_check = [ + 6, 69, 48, 48, 48, 88, 65, 69, 38, 116, + 173, 15, 72, 87, 87, 105, 38, 2, 122, 117, + 40, 37, 36, 29, 29, 70, 73, 73, 42, 27, + 125, 22, 22, 33, 10, 69, 69, 69, 110, 33, + 109, 109, 72, 17, 90, 80, 80, 112, 8, 40, + 75, 75, 172, 5, 78, 201, 44, 44, 174, 91, + 252, 61, 91, 69, 24, 24, 237, 241, 24, 12, + 160, 147, 66, 69, 69, 69, 69, 55, 36, 67, + 164, 62, 80, 80, 80, 247, 122, 148, 84, 84, + 84, 162, 73, 82, 82, 6, 7, 6, 6, 6, + 6, 6, 6, 146, 221, 6, 243, 54, 53, 53, + 53, 52, 52, 166, 221, 167, 149, 1, 60, 60, + 60, 5, 73, 86, 86, 86, 3, 248, 11, 69, + 24, 24, 24, 24, 13, 31, 31, 37, 69, 31, + 161, 225, 161, 16, 225, 77, 190, 190, 28, 190, + 18, 77, 71, 71, 28, 85, 85, 214, 214, 20, + 85, 21, 52, 23, 26, 164, 30, 32, 43, 192, + 192, 82, 45, 82, 192, 47, 82, 82, 154, 154, + 154, 51, 28, 207, 57, 76, 81, 242, 14, 83, + 9, 89, 101, 104, 119, 121, 9, 126, 127, 48, + 128, 31, 31, 31, 31, 129, 130, 131, 90, 132, + 28, 252, 91, 91, 87, 133, 134, 135, 7, 161, + 28, 248, 69, 136, 82, 137, 192, 6, 38, 138, + 27, 27, 139, 116, 27, 150, 166, 151, 167, 158, + 27, 165, 168, 207, 207, 169, 73, 69, 170, 70, + 25, 171, 9, 25, 176, 48, 48, 177, 179, 25, + 180, 182, 183, 184, 37, 48, 91, 162, 172, 185, + 147, 37, 186, 187, 147, 188, 28, 146, 160, 36, + 84, 84, 237, 6, 189, 28, 148, 55, 149, 207, + 191, 67, 31, 31, 194, 196, 164, 6, 6, 67, + 197, 31, 31, 6, 198, 252, 202, 174, 65, 203, + 241, 82, 221, 69, 204, 38, 87, 69, 9, 37, + 87, 69, 69, 209, 122, 12, 210, 9, 211, 40, + 80, 38, 216, 214, 214, 247, 217, 220, 69, 222, + 223, 84, 84, 61, 224, 78, 36, 80, 61, 243, + 69, 84, 6, 6, 8, 24, 66, 38, 37, 5, + 69, 69, 201, 62, 243, 52, 52, 37, 62, 28, + 227, 28, 60, 228, 28, 14, 122, 86, 6, 70, + 28, 60, 229, 161, 230, 36, 86, 231, 232, 235, + 240, 240, 161, 243, 28, 36, 17, 236, 190, 112, + 14, 82, 245, 242, 82, 77, 82, 77, 246, 251, + 84, 5, nil, nil, nil, 37, nil, nil, 147, 147, + 42, 42, nil, 42, nil, nil, 31, 161, 42, nil, + 161, nil, nil, nil, nil, 52, 110, 38, nil, 10, + nil, nil, nil, 37, 52, 86, 86, 31, 73, nil, + nil, 87, nil, 22, nil, nil, 48, 87, 40, 88, + 28, 6, 6, nil, 28, 6, 172, 172, 87, 28, + 14, 36, 75, nil, 52, 14, nil, 42, nil, 77, + 237, 237, 52, nil, 6, nil, 112, nil, nil, 90, + 69, 125, 33, 33, nil, 67, 243, 28, 33, 33, + 73, 87, 9, nil, 82, nil, nil, 28, 28, nil, + 85, 40, 54, 14, 14, 6, nil, nil, 54, 252, + 65, 91, 6, 48, 161, 12, 154, nil, 65, 12, + nil, 226, 88, 226, 70, nil, 226, nil, 87, 226, + nil, nil, 69, nil, nil, 82, 53, 87, 42, nil, + 69, 6, 53, nil, 82, 82, nil, nil, 69, 80, + 52, 52, 48, nil, nil, nil, nil, 80, nil, nil, + 73, 29, 48, nil, 40, 37, 37, 87, 37, 73, + 69, 44, nil, 69, nil, 87, 154, 154, 154, nil, + 6, 147, 147, nil, nil, nil, 53, nil, 122, nil, + 6, 242, 242, nil, 77, 77, 69, 90, 82, 73, + 77, 77, 242, nil, 242, 73, nil, 82, nil, 15, + 82, nil, 12, 86, nil, 109, nil, nil, nil, nil, + nil, nil, nil, nil, 31, nil, nil, nil, nil, nil, + nil, 82, nil, nil, 206, nil, 82, nil, 48, 82, + nil, nil, nil, nil, nil, nil, 117, nil, nil, nil, + nil, nil, nil, 87, nil, 82, 33, nil, 6, 69, + nil, nil, 42, 69, nil, nil, 6, nil, 31, 12, + 69, nil, nil, 27, 105, 2, nil, 73, 63, 28, + nil, 242, 22, 27, 27, 73, nil, nil, 82, 27, + 27, 40, 25, nil, nil, nil, nil, nil, 40, 40, + nil, 75, 25, 25, nil, 69, 69, 34, 25, 25, + 173, nil, 82, 34, 65, 154, 109, 28, nil, nil, + 28, 109, 6, 14, 109, 65, 14, 206, 240, 240, + nil, 240, 240, 6, 240, 87, nil, 63, 87, 72, + nil, 34, nil, 28, 69, nil, 40, nil, nil, 6, + nil, nil, nil, 80, nil, 69, 213, nil, 6, nil, + 6, 63, nil, nil, 80, nil, 86, nil, 77, 34, + 37, 12, 6, 116, 6, nil, 88, 226, nil, nil, + 226, 77, 77, 77, 77, 40, nil, 206, 206, nil, + nil, 69, 103, 24, 40, 63, 69, nil, nil, nil, + 69, 82, nil, nil, nil, 40, 28, nil, 103, 103, + 28, 103, 122, 28, nil, nil, nil, 28, 84, 73, + 86, 213, 213, 28, 28, nil, 213, nil, nil, 28, + 28, nil, 69, 206, nil, 34, 206, nil, nil, nil, + nil, nil, 40, nil, 34, 242, nil, 159, 9, 12, + nil, 6, 9, 82, 242, nil, nil, 27, 86, 9, + 159, nil, 159, nil, 31, nil, nil, nil, nil, 69, + 40, nil, 69, 69, nil, 69, 25, nil, 213, nil, + 69, 69, 69, nil, nil, nil, nil, nil, nil, 242, + 40, nil, 242, 69, nil, nil, nil, nil, 6, nil, + nil, nil, 77, nil, nil, nil, nil, 240, 240, 240, + 240, nil, 69, nil, 6, nil, nil, 82, 24, nil, + nil, nil, nil, 63, 69, nil, nil, nil, 34, 69, + 34, nil, nil, 34, nil, 93, 155, 159, 28, 34, + nil, nil, nil, 28, 14, nil, nil, 28, nil, 69, + 69, 122, nil, 34, nil, nil, nil, nil, nil, 122, + nil, 36, nil, nil, nil, 63, nil, 63, nil, nil, + nil, 63, nil, nil, nil, nil, nil, nil, nil, 28, + nil, nil, nil, nil, nil, 14, 242, 240, 63, 31, + nil, nil, 69, nil, 63, nil, 82, 28, nil, nil, + 69, nil, 40, 40, nil, 40, 40, nil, nil, nil, + nil, nil, nil, 63, 103, 103, 6, 6, 6, 34, + nil, 40, nil, 34, 69, nil, nil, nil, 34, nil, + 69, 69, 103, 80, 69, 213, nil, nil, nil, nil, + 28, nil, nil, 80, 213, nil, nil, nil, 69, nil, + 52, nil, 69, nil, nil, nil, 34, nil, nil, 28, + nil, nil, nil, nil, nil, 14, 34, 34, nil, 35, + nil, 28, nil, nil, nil, 35, nil, 14, nil, 153, + nil, nil, nil, nil, 94, 69, nil, nil, nil, nil, + 35, nil, nil, nil, nil, nil, 28, 28, nil, 35, + 35, 35, 14, 35, 35, 35, 38, nil, 69, nil, + 159, 6, 159, 69, 159, nil, nil, 80, 24, 24, + 69, nil, nil, nil, 69, nil, 6, nil, nil, nil, + 69, 35, 40, nil, nil, nil, 35, 35, 48, nil, + 35, 35, 35, 35, 155, 69, 69, 155, 159, 155, + 159, nil, 103, 87, 6, 6, 6, 6, 103, 6, + 93, 93, nil, 153, nil, 156, 6, 103, 156, 103, + 6, nil, 69, 103, nil, 95, nil, 28, 28, 73, + nil, 28, nil, 14, 14, 73, nil, nil, nil, 31, + 31, 69, nil, nil, 69, 28, nil, 35, nil, 28, + nil, 14, 35, 35, 35, 35, 35, 40, 157, 157, + 157, 63, nil, 6, nil, nil, nil, nil, nil, 6, + 6, 6, 6, nil, nil, nil, nil, 244, nil, nil, + nil, 159, nil, 6, nil, nil, nil, nil, nil, nil, + nil, 155, 159, 155, 159, 155, 159, 155, 34, 156, + nil, nil, nil, nil, nil, nil, nil, 63, nil, nil, + 28, nil, nil, nil, nil, nil, 14, 28, nil, nil, + nil, nil, nil, 14, 155, 159, nil, 28, 63, nil, + nil, nil, 39, nil, nil, nil, 34, nil, 39, 34, + 35, 35, 35, 35, 35, 35, 35, nil, nil, nil, + nil, 35, 35, 35, nil, nil, nil, nil, nil, 94, + 94, nil, 34, nil, nil, 35, 39, 39, 39, 28, + nil, nil, nil, nil, 93, 14, nil, 93, 93, nil, + 93, nil, nil, nil, nil, 93, 93, 93, nil, nil, + nil, nil, nil, nil, 39, nil, 157, 157, 157, 157, + 63, 157, 35, 35, 39, 39, 39, nil, nil, nil, + nil, 103, 35, nil, nil, nil, nil, 153, nil, nil, + nil, 153, nil, nil, 153, 34, 153, nil, nil, 34, + nil, 35, 34, nil, 93, 35, 34, nil, nil, 35, + 35, nil, 34, 34, 63, nil, 63, nil, 34, 34, + 95, 95, nil, nil, nil, 63, 35, nil, nil, nil, + 39, 157, 157, 157, 157, 103, nil, nil, 35, 39, + 63, nil, nil, nil, nil, 157, nil, 35, 35, 35, + nil, 244, nil, nil, nil, 244, nil, nil, 244, nil, + 244, nil, nil, nil, nil, nil, nil, 93, 35, nil, + nil, nil, nil, 156, nil, 93, nil, 156, nil, nil, + 156, nil, 156, nil, nil, nil, nil, nil, 153, nil, + 153, nil, 153, 94, 153, nil, 94, 94, nil, 94, + nil, nil, nil, nil, 94, 94, 94, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 153, nil, 39, nil, 39, nil, 34, 39, nil, + nil, nil, 34, nil, 39, nil, 34, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 39, nil, + nil, nil, 244, 94, 244, nil, 244, nil, 244, nil, + 93, nil, nil, nil, nil, 96, nil, nil, 34, nil, + nil, nil, nil, 35, 156, nil, 156, nil, 156, nil, + 156, nil, nil, nil, 95, 244, 34, 95, 95, nil, + 95, nil, nil, nil, nil, 95, 95, 95, nil, 93, + nil, nil, 63, nil, nil, nil, nil, 156, nil, nil, + nil, nil, nil, nil, 39, nil, 94, nil, 39, nil, + 93, 93, 39, 39, 94, nil, nil, nil, nil, 34, + 35, nil, nil, nil, nil, nil, nil, nil, 35, 39, + 35, nil, nil, nil, 95, nil, 35, nil, 34, nil, + nil, 39, nil, nil, nil, 35, nil, nil, nil, nil, + 34, 39, 39, nil, nil, nil, 93, nil, 35, 93, + nil, 35, nil, nil, nil, nil, nil, nil, nil, 35, + nil, nil, nil, nil, nil, 34, 34, nil, nil, 35, + nil, nil, 56, nil, 35, nil, nil, nil, 56, 35, + nil, nil, nil, nil, nil, nil, nil, 95, nil, 94, + nil, nil, nil, 56, nil, 95, nil, nil, nil, nil, + nil, nil, 56, 56, 56, nil, 56, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 94, nil, + nil, nil, nil, nil, 56, nil, nil, 35, nil, 56, + 56, 35, nil, 56, 35, 35, 34, 34, 35, 94, + 94, nil, nil, nil, 35, 35, nil, nil, nil, nil, + 35, 35, nil, nil, 34, nil, nil, nil, 34, nil, + 96, 96, nil, nil, nil, nil, nil, nil, 97, nil, + 95, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 94, nil, nil, 94, nil, + 56, nil, nil, nil, nil, 56, 56, 56, 56, 56, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 95, + nil, nil, 35, 39, nil, nil, nil, nil, nil, 34, + nil, 39, nil, 35, nil, nil, 34, nil, nil, 39, + 95, 95, nil, nil, nil, nil, 34, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 39, nil, nil, 39, nil, nil, nil, nil, 35, + nil, nil, nil, nil, 35, 35, nil, nil, 35, nil, + nil, nil, nil, nil, nil, nil, 95, 39, 34, 95, + nil, nil, nil, 56, 56, 56, 56, 56, 56, 56, + nil, nil, nil, nil, 56, 56, 56, nil, nil, nil, + 35, nil, 98, nil, nil, nil, nil, nil, 56, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 35, nil, + nil, nil, nil, nil, 96, nil, nil, 96, 96, nil, + 96, nil, nil, nil, nil, 96, 96, 96, nil, nil, + 39, nil, nil, nil, 39, 56, 56, 39, nil, nil, + nil, 39, nil, nil, nil, 56, nil, 39, 39, nil, + nil, 35, nil, 39, 39, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 56, nil, nil, nil, 56, nil, + 35, nil, 99, 56, 96, nil, nil, nil, nil, nil, + 35, nil, 35, 97, 97, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 56, nil, nil, nil, nil, nil, 35, 35, nil, + 56, 56, 56, nil, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 39, nil, nil, nil, + nil, 56, nil, nil, nil, nil, nil, 96, nil, nil, + 100, nil, nil, nil, nil, 96, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, nil, nil, nil, nil, 39, nil, nil, + nil, 39, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 35, nil, nil, nil, nil, nil, 35, 35, + nil, nil, 35, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 39, 39, nil, nil, 35, nil, nil, nil, + 35, nil, nil, nil, nil, nil, nil, 98, 98, nil, + nil, 39, nil, nil, nil, nil, nil, nil, nil, nil, + 96, nil, 107, nil, nil, nil, 56, nil, nil, 68, + nil, nil, nil, nil, nil, 68, nil, 97, nil, nil, + 97, 97, nil, 97, nil, nil, nil, nil, 97, 97, + 97, nil, nil, nil, 39, nil, 35, nil, nil, 96, + nil, 35, nil, 68, 68, 68, nil, nil, 35, nil, + 35, 35, nil, 39, nil, nil, nil, nil, 35, nil, + 96, 96, nil, 56, nil, 39, nil, 99, 99, nil, + nil, 68, nil, 56, nil, nil, nil, 97, nil, nil, + nil, 68, 68, 68, 68, nil, nil, nil, 56, nil, + 39, 39, nil, nil, nil, 35, nil, nil, nil, nil, + 35, 56, nil, nil, 56, nil, 96, nil, nil, 96, + nil, nil, 56, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 56, nil, nil, nil, nil, 56, nil, nil, + nil, nil, 56, nil, nil, 100, 100, 68, nil, nil, + 97, nil, nil, nil, nil, nil, 68, nil, 97, nil, + nil, 98, nil, 59, 98, 98, nil, 98, nil, 59, + nil, nil, 98, 98, 98, 39, nil, nil, nil, nil, + nil, 39, 39, nil, 59, 39, nil, nil, nil, nil, + nil, nil, nil, 59, 59, 59, nil, 59, nil, 39, + 56, nil, nil, 39, 56, nil, nil, 56, 56, nil, + nil, 56, nil, nil, nil, nil, nil, 56, 56, nil, + nil, 98, nil, 56, 56, 59, nil, nil, nil, nil, + 59, 59, nil, nil, 59, nil, nil, 107, 107, nil, + 68, 99, nil, 97, 99, 99, nil, 99, nil, nil, + nil, nil, 99, 99, 99, nil, nil, nil, nil, 39, + nil, nil, nil, nil, 39, 68, nil, nil, nil, nil, + nil, 39, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 39, 97, nil, 98, nil, nil, nil, nil, nil, + nil, 59, 98, nil, nil, nil, 59, 59, 59, 59, + 59, 99, nil, 97, 97, nil, nil, nil, nil, 100, + nil, nil, 100, 100, nil, 100, nil, nil, nil, nil, + 100, 100, 100, 39, nil, nil, nil, nil, nil, nil, + nil, 68, 56, nil, nil, 68, nil, 56, 56, 68, + 68, 56, nil, nil, nil, nil, nil, nil, nil, 97, + nil, nil, 97, nil, nil, nil, 68, nil, nil, nil, + nil, nil, nil, nil, 99, nil, nil, nil, 68, 100, + nil, nil, 99, 56, nil, nil, nil, 98, 68, 68, + nil, nil, nil, nil, 59, 59, 59, 59, 59, 59, + 59, 56, nil, nil, nil, 59, 59, 59, nil, nil, + nil, 107, nil, nil, 107, 107, nil, 107, nil, 59, + nil, nil, 107, 107, 107, nil, 98, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 100, nil, 56, nil, nil, 98, 98, nil, + 100, nil, nil, nil, nil, nil, 59, 59, nil, nil, + nil, nil, nil, 56, nil, nil, 59, 99, nil, nil, + nil, 107, nil, 56, nil, 56, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 59, nil, nil, nil, 59, + nil, nil, nil, 98, 59, nil, 98, nil, nil, nil, + 56, 56, nil, nil, nil, nil, 99, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 59, nil, nil, nil, nil, 99, 99, nil, + nil, 59, 59, 59, 107, 100, nil, nil, nil, nil, + nil, nil, 107, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 59, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 68, nil, nil, 99, 100, nil, 99, nil, 68, nil, + nil, 56, 56, nil, nil, nil, 68, nil, nil, nil, + nil, nil, nil, nil, nil, 100, 100, nil, nil, 56, + nil, nil, nil, 56, nil, nil, nil, nil, 68, nil, + nil, 68, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 107, nil, nil, + nil, nil, nil, nil, 68, nil, nil, nil, nil, nil, + nil, 100, nil, nil, 100, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 59, nil, nil, + nil, nil, nil, nil, 56, nil, 107, nil, nil, nil, + nil, 56, nil, 56, 56, nil, nil, nil, nil, nil, + nil, 56, nil, nil, nil, nil, nil, 107, 107, nil, + nil, nil, nil, nil, nil, nil, nil, 68, nil, nil, + nil, 68, nil, nil, nil, nil, nil, nil, 68, nil, + nil, nil, nil, nil, 59, nil, nil, nil, 56, nil, + nil, nil, nil, 56, 59, nil, nil, nil, nil, nil, + nil, nil, nil, 107, nil, nil, 107, nil, nil, 59, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 59, nil, nil, 59, nil, nil, nil, nil, + nil, nil, nil, 59, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 59, nil, nil, nil, nil, 59, nil, + nil, nil, 68, 59, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 68, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 68, + nil, nil, nil, nil, 68, nil, nil, nil, 68, nil, + nil, 59, nil, nil, nil, 59, nil, nil, 59, 59, + nil, nil, 59, nil, nil, nil, nil, nil, 59, 59, + nil, nil, nil, nil, 59, 59, nil, nil, nil, nil, + 68, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 68, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 41, nil, nil, nil, nil, nil, nil, nil, + 68, 41, 41, 41, nil, nil, nil, nil, nil, nil, + nil, nil, 68, 41, 41, nil, 41, 41, nil, 41, + nil, nil, nil, 59, nil, nil, nil, nil, 59, 59, + nil, nil, 59, nil, nil, nil, nil, 68, 68, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 59, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 59, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 68, nil, nil, nil, nil, nil, 68, 68, + nil, nil, 68, nil, nil, 59, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 68, nil, nil, nil, + 68, nil, nil, nil, 59, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 59, nil, 59, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 59, 59, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 41, 41, nil, 68, 41, 41, nil, + nil, 68, nil, 41, nil, nil, nil, nil, 68, nil, + nil, nil, nil, nil, nil, nil, 41, nil, 68, nil, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, 41, 41, nil, nil, nil, nil, + 68, nil, 59, 59, 41, nil, nil, nil, nil, nil, + nil, 41, nil, 41, nil, nil, 41, 41, nil, nil, + 59, nil, nil, nil, 59, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, 41, + nil, nil, nil, 41, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 59, nil, nil, nil, nil, + nil, nil, 59, nil, 59, 59, nil, nil, nil, nil, + nil, nil, 59, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 59, + nil, nil, nil, nil, 59, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 41, 41, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, 41, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 41, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, 41, 41, nil, nil, + nil, 41, nil, nil, 41, 41, 41, 41, nil, nil, + nil, nil, 41, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, 41, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 41, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 41, 41, 41, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 41, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41 ] + +racc_goto_pointer = [ + nil, 117, 15, 126, nil, 48, -2, 88, 43, 188, + -106, 118, -282, -298, 152, -558, -627, -727, -769, nil, + -384, -155, 20, 151, -5, 25, 90, 6, 146, -201, + -58, 66, 26, -195, 715, 1077, -207, -439, -11, 1290, + -2, 3059, -463, -82, -15, -413, nil, -612, -30, nil, + nil, 154, -119, 79, -177, -450, 1680, -336, nil, 2311, + 86, 25, 45, 452, nil, -31, 34, -260, 2167, -1, + -351, 77, -65, 15, nil, 39, -252, -83, 8, nil, + 8, 137, -131, -165, 56, -419, 91, -16, -280, -326, + -256, -473, nil, 454, 603, 694, 1064, 1297, 1431, 1511, + 1579, 115, nil, 232, -162, -52, nil, 1671, nil, -318, + -746, nil, -739, nil, nil, nil, -355, -569, nil, 120, + nil, -185, 13, nil, nil, -578, 120, -197, 137, 141, + -146, 142, 143, -388, -390, -732, -161, -169, -380, -725, + nil, nil, nil, nil, nil, nil, -876, -561, -545, -864, + -744, -665, nil, 271, -438, 44, 357, 190, -663, 45, + -832, -683, -643, nil, -737, -831, -959, -957, -156, -571, + 157, -362, -346, -15, -221, nil, -36, -34, nil, -484, + -536, nil, -255, -876, -328, -671, -953, -521, -857, -656, + -737, -650, -714, nil, -585, nil, -585, -409, -405, nil, + nil, -656, -404, -402, -398, nil, -359, -913, nil, -774, + -771, -769, nil, -52, -559, nil, -440, -590, nil, nil, + 243, 7, 240, 240, 243, -266, 129, 268, 270, 278, + -458, -263, -263, nil, nil, 282, -207, -332, nil, nil, + -231, -756, -211, -717, 335, -416, -698, -740, -986, nil, + nil, 12, -475 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 312, 7, 365, 315, + nil, nil, nil, nil, 569, nil, nil, nil, nil, 311, + 313, nil, nil, nil, nil, 14, 15, 21, 244, nil, + nil, 17, nil, 447, 245, 342, nil, nil, 601, 243, + 483, 24, 1091, nil, nil, nil, 360, nil, 25, 26, + 27, nil, 764, nil, nil, nil, 332, nil, 28, 329, + 462, 35, nil, nil, 37, 40, 39, nil, 240, 241, + 377, nil, 148, 470, 147, 93, nil, 452, 109, 49, + 52, 277, 303, nil, 463, nil, 464, 475, nil, 692, + 531, 301, 286, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 63, nil, nil, 287, 67, 68, 69, nil, + nil, 70, 932, 71, 72, 73, nil, nil, 74, nil, + 75, nil, 582, 76, 77, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 291, 279, 772, 923, 591, 933, 832, 630, nil, 833, + 834, 1165, 1024, 617, nil, 618, 619, nil, nil, 620, + nil, 622, nil, 901, nil, nil, nil, 628, nil, nil, + nil, nil, nil, nil, nil, 474, nil, nil, 742, nil, + nil, 516, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1004, nil, 705, 714, 706, 707, nil, nil, 708, + 709, nil, nil, nil, nil, 1003, 1005, nil, 1007, 1008, + 1009, 1010, 1011, 639, 713, 715, nil, nil, 92, 94, + 96, nil, nil, nil, nil, nil, 648, nil, nil, nil, + nil, nil, nil, 105, 106, nil, nil, 968, 813, 616, + 824, 621, 976, 633, 635, 636, 1036, 640, 1037, 643, + 646, nil, 306 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 3, 151, :_reduce_6, + 2, 151, :_reduce_none, + 1, 154, :_reduce_none, + 0, 158, :_reduce_9, + 3, 154, :_reduce_10, + 0, 160, :_reduce_11, + 4, 157, :_reduce_12, + 0, 165, :_reduce_13, + 6, 159, :_reduce_14, + 3, 159, :_reduce_15, + 2, 161, :_reduce_16, + 1, 166, :_reduce_none, + 1, 166, :_reduce_none, + 3, 166, :_reduce_19, + 2, 166, :_reduce_20, + 1, 167, :_reduce_none, + 0, 168, :_reduce_22, + 3, 167, :_reduce_23, + 0, 179, :_reduce_24, + 4, 156, :_reduce_25, + 3, 156, :_reduce_26, + 3, 156, :_reduce_27, + 3, 156, :_reduce_28, + 2, 156, :_reduce_29, + 3, 156, :_reduce_30, + 3, 156, :_reduce_31, + 3, 156, :_reduce_32, + 3, 156, :_reduce_33, + 3, 156, :_reduce_34, + 4, 156, :_reduce_35, + 1, 156, :_reduce_none, + 3, 156, :_reduce_37, + 3, 156, :_reduce_38, + 5, 156, :_reduce_39, + 3, 156, :_reduce_40, + 1, 156, :_reduce_none, + 3, 172, :_reduce_42, + 3, 172, :_reduce_43, + 6, 172, :_reduce_44, + 5, 172, :_reduce_45, + 5, 172, :_reduce_46, + 5, 172, :_reduce_47, + 5, 172, :_reduce_48, + 3, 172, :_reduce_49, + 1, 180, :_reduce_50, + 3, 180, :_reduce_51, + 1, 180, :_reduce_none, + 1, 178, :_reduce_none, + 3, 178, :_reduce_54, + 3, 178, :_reduce_55, + 3, 178, :_reduce_56, + 2, 178, :_reduce_57, + 0, 190, :_reduce_58, + 4, 178, :_reduce_59, + 1, 178, :_reduce_none, + 1, 171, :_reduce_61, + 0, 193, :_reduce_62, + 0, 194, :_reduce_63, + 4, 191, :_reduce_64, + 1, 174, :_reduce_none, + 1, 174, :_reduce_none, + 1, 196, :_reduce_none, + 4, 196, :_reduce_68, + 0, 204, :_reduce_69, + 4, 201, :_reduce_70, + 1, 203, :_reduce_71, + 2, 195, :_reduce_72, + 3, 195, :_reduce_73, + 4, 195, :_reduce_74, + 5, 195, :_reduce_75, + 4, 195, :_reduce_76, + 5, 195, :_reduce_77, + 2, 195, :_reduce_78, + 2, 195, :_reduce_79, + 2, 195, :_reduce_80, + 2, 195, :_reduce_81, + 2, 195, :_reduce_82, + 1, 173, :_reduce_none, + 3, 173, :_reduce_84, + 1, 209, :_reduce_none, + 3, 209, :_reduce_86, + 1, 208, :_reduce_87, + 2, 208, :_reduce_88, + 3, 208, :_reduce_89, + 5, 208, :_reduce_90, + 2, 208, :_reduce_91, + 4, 208, :_reduce_92, + 2, 208, :_reduce_93, + 4, 208, :_reduce_94, + 1, 208, :_reduce_95, + 3, 208, :_reduce_96, + 1, 212, :_reduce_none, + 3, 212, :_reduce_98, + 2, 211, :_reduce_99, + 3, 211, :_reduce_100, + 1, 214, :_reduce_101, + 3, 214, :_reduce_102, + 1, 213, :_reduce_103, + 1, 213, :_reduce_104, + 4, 213, :_reduce_105, + 3, 213, :_reduce_106, + 3, 213, :_reduce_107, + 3, 213, :_reduce_108, + 3, 213, :_reduce_109, + 2, 213, :_reduce_110, + 1, 213, :_reduce_111, + 1, 175, :_reduce_112, + 1, 175, :_reduce_113, + 4, 175, :_reduce_114, + 3, 175, :_reduce_115, + 3, 175, :_reduce_116, + 3, 175, :_reduce_117, + 3, 175, :_reduce_118, + 2, 175, :_reduce_119, + 1, 175, :_reduce_120, + 1, 217, :_reduce_121, + 1, 217, :_reduce_none, + 2, 218, :_reduce_123, + 1, 218, :_reduce_124, + 3, 218, :_reduce_125, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_129, + 1, 219, :_reduce_none, + 1, 169, :_reduce_131, + 1, 169, :_reduce_none, + 1, 170, :_reduce_133, + 0, 223, :_reduce_134, + 4, 170, :_reduce_135, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 220, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 3, 188, :_reduce_207, + 3, 188, :_reduce_208, + 6, 188, :_reduce_209, + 5, 188, :_reduce_210, + 5, 188, :_reduce_211, + 5, 188, :_reduce_212, + 5, 188, :_reduce_213, + 4, 188, :_reduce_214, + 3, 188, :_reduce_215, + 3, 188, :_reduce_216, + 3, 188, :_reduce_217, + 2, 188, :_reduce_218, + 2, 188, :_reduce_219, + 2, 188, :_reduce_220, + 2, 188, :_reduce_221, + 3, 188, :_reduce_222, + 3, 188, :_reduce_223, + 3, 188, :_reduce_224, + 3, 188, :_reduce_225, + 3, 188, :_reduce_226, + 3, 188, :_reduce_227, + 4, 188, :_reduce_228, + 2, 188, :_reduce_229, + 2, 188, :_reduce_230, + 3, 188, :_reduce_231, + 3, 188, :_reduce_232, + 3, 188, :_reduce_233, + 3, 188, :_reduce_234, + 1, 188, :_reduce_none, + 3, 188, :_reduce_236, + 3, 188, :_reduce_237, + 3, 188, :_reduce_238, + 3, 188, :_reduce_239, + 3, 188, :_reduce_240, + 2, 188, :_reduce_241, + 2, 188, :_reduce_242, + 3, 188, :_reduce_243, + 3, 188, :_reduce_244, + 3, 188, :_reduce_245, + 3, 188, :_reduce_246, + 3, 188, :_reduce_247, + 6, 188, :_reduce_248, + 1, 188, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 3, 226, :_reduce_254, + 3, 226, :_reduce_255, + 1, 229, :_reduce_256, + 1, 230, :_reduce_none, + 2, 230, :_reduce_258, + 4, 230, :_reduce_259, + 2, 230, :_reduce_260, + 1, 224, :_reduce_none, + 3, 224, :_reduce_262, + 3, 234, :_reduce_263, + 5, 234, :_reduce_264, + 3, 234, :_reduce_265, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 183, :_reduce_none, + 1, 183, :_reduce_none, + 2, 183, :_reduce_270, + 4, 183, :_reduce_271, + 2, 183, :_reduce_272, + 1, 207, :_reduce_273, + 2, 207, :_reduce_274, + 2, 207, :_reduce_275, + 4, 207, :_reduce_276, + 1, 207, :_reduce_277, + 0, 239, :_reduce_278, + 2, 200, :_reduce_279, + 2, 238, :_reduce_280, + 2, 237, :_reduce_281, + 1, 237, :_reduce_none, + 1, 231, :_reduce_283, + 2, 231, :_reduce_284, + 3, 231, :_reduce_285, + 4, 231, :_reduce_286, + 1, 177, :_reduce_287, + 1, 177, :_reduce_288, + 3, 176, :_reduce_289, + 4, 176, :_reduce_290, + 2, 176, :_reduce_291, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_302, + 0, 275, :_reduce_303, + 4, 227, :_reduce_304, + 0, 276, :_reduce_305, + 3, 227, :_reduce_306, + 0, 277, :_reduce_307, + 4, 227, :_reduce_308, + 3, 227, :_reduce_309, + 3, 227, :_reduce_310, + 2, 227, :_reduce_311, + 0, 278, :_reduce_312, + 4, 227, :_reduce_313, + 0, 279, :_reduce_314, + 4, 227, :_reduce_315, + 1, 227, :_reduce_316, + 4, 227, :_reduce_317, + 3, 227, :_reduce_318, + 1, 227, :_reduce_319, + 5, 227, :_reduce_320, + 4, 227, :_reduce_321, + 3, 227, :_reduce_322, + 2, 227, :_reduce_323, + 1, 227, :_reduce_none, + 2, 227, :_reduce_325, + 1, 227, :_reduce_326, + 6, 227, :_reduce_327, + 6, 227, :_reduce_328, + 4, 227, :_reduce_329, + 4, 227, :_reduce_330, + 5, 227, :_reduce_331, + 4, 227, :_reduce_332, + 5, 227, :_reduce_333, + 6, 227, :_reduce_334, + 0, 280, :_reduce_335, + 6, 227, :_reduce_336, + 0, 281, :_reduce_337, + 0, 282, :_reduce_338, + 8, 227, :_reduce_339, + 0, 283, :_reduce_340, + 5, 227, :_reduce_341, + 0, 284, :_reduce_342, + 6, 227, :_reduce_343, + 0, 285, :_reduce_344, + 0, 286, :_reduce_345, + 9, 227, :_reduce_346, + 1, 227, :_reduce_347, + 1, 227, :_reduce_348, + 1, 227, :_reduce_349, + 1, 227, :_reduce_350, + 1, 182, :_reduce_351, + 1, 249, :_reduce_none, + 1, 255, :_reduce_none, + 1, 258, :_reduce_none, + 1, 260, :_reduce_none, + 1, 261, :_reduce_none, + 1, 262, :_reduce_none, + 1, 265, :_reduce_none, + 1, 267, :_reduce_359, + 1, 270, :_reduce_360, + 1, 271, :_reduce_361, + 1, 287, :_reduce_none, + 1, 288, :_reduce_none, + 1, 289, :_reduce_none, + 1, 290, :_reduce_none, + 1, 291, :_reduce_none, + 1, 163, :_reduce_none, + 1, 292, :_reduce_none, + 1, 250, :_reduce_none, + 1, 206, :_reduce_none, + 1, 256, :_reduce_none, + 1, 256, :_reduce_none, + 2, 256, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 257, :_reduce_none, + 5, 257, :_reduce_377, + 1, 259, :_reduce_none, + 2, 259, :_reduce_379, + 1, 266, :_reduce_none, + 1, 266, :_reduce_381, + 1, 293, :_reduce_none, + 3, 293, :_reduce_383, + 1, 296, :_reduce_384, + 3, 296, :_reduce_385, + 1, 295, :_reduce_386, + 3, 295, :_reduce_387, + 5, 295, :_reduce_388, + 1, 295, :_reduce_389, + 3, 295, :_reduce_390, + 2, 297, :_reduce_391, + 1, 297, :_reduce_392, + 4, 298, :_reduce_393, + 2, 298, :_reduce_394, + 2, 298, :_reduce_395, + 2, 298, :_reduce_396, + 1, 298, :_reduce_397, + 2, 304, :_reduce_398, + 1, 304, :_reduce_none, + 6, 305, :_reduce_400, + 8, 305, :_reduce_401, + 4, 305, :_reduce_402, + 6, 305, :_reduce_403, + 4, 305, :_reduce_404, + 2, 305, :_reduce_405, + 6, 305, :_reduce_406, + 2, 305, :_reduce_407, + 4, 305, :_reduce_408, + 6, 305, :_reduce_409, + 2, 305, :_reduce_410, + 4, 305, :_reduce_411, + 2, 305, :_reduce_412, + 4, 305, :_reduce_413, + 1, 305, :_reduce_414, + 1, 309, :_reduce_415, + 1, 309, :_reduce_416, + 3, 310, :_reduce_417, + 1, 310, :_reduce_418, + 4, 310, :_reduce_419, + 1, 311, :_reduce_none, + 4, 311, :_reduce_421, + 1, 312, :_reduce_422, + 3, 312, :_reduce_423, + 1, 313, :_reduce_424, + 1, 313, :_reduce_none, + 0, 317, :_reduce_426, + 0, 318, :_reduce_427, + 5, 254, :_reduce_428, + 4, 315, :_reduce_429, + 1, 315, :_reduce_430, + 3, 316, :_reduce_431, + 3, 316, :_reduce_432, + 3, 320, :_reduce_433, + 2, 197, :_reduce_434, + 4, 197, :_reduce_435, + 5, 197, :_reduce_436, + 5, 197, :_reduce_437, + 2, 253, :_reduce_438, + 4, 253, :_reduce_439, + 4, 253, :_reduce_440, + 3, 253, :_reduce_441, + 3, 253, :_reduce_442, + 3, 253, :_reduce_443, + 2, 253, :_reduce_444, + 1, 253, :_reduce_445, + 4, 253, :_reduce_446, + 0, 323, :_reduce_447, + 4, 252, :_reduce_448, + 0, 324, :_reduce_449, + 4, 252, :_reduce_450, + 0, 325, :_reduce_451, + 0, 326, :_reduce_452, + 4, 202, :_reduce_453, + 0, 328, :_reduce_454, + 0, 329, :_reduce_455, + 4, 321, :_reduce_456, + 1, 327, :_reduce_457, + 2, 327, :_reduce_458, + 3, 327, :_reduce_459, + 4, 327, :_reduce_460, + 0, 331, :_reduce_461, + 6, 263, :_reduce_462, + 1, 330, :_reduce_none, + 1, 330, :_reduce_none, + 0, 334, :_reduce_465, + 0, 335, :_reduce_466, + 7, 264, :_reduce_467, + 1, 333, :_reduce_none, + 1, 333, :_reduce_none, + 1, 332, :_reduce_none, + 3, 332, :_reduce_471, + 3, 332, :_reduce_472, + 1, 336, :_reduce_none, + 2, 336, :_reduce_474, + 3, 336, :_reduce_475, + 1, 336, :_reduce_476, + 1, 336, :_reduce_477, + 1, 189, :_reduce_none, + 3, 340, :_reduce_479, + 1, 340, :_reduce_none, + 3, 342, :_reduce_481, + 1, 342, :_reduce_none, + 1, 344, :_reduce_483, + 1, 345, :_reduce_484, + 1, 343, :_reduce_none, + 4, 343, :_reduce_486, + 4, 343, :_reduce_487, + 3, 343, :_reduce_488, + 4, 343, :_reduce_489, + 4, 343, :_reduce_490, + 3, 343, :_reduce_491, + 0, 349, :_reduce_492, + 4, 343, :_reduce_493, + 2, 343, :_reduce_494, + 0, 350, :_reduce_495, + 4, 343, :_reduce_496, + 2, 343, :_reduce_497, + 0, 351, :_reduce_498, + 4, 343, :_reduce_499, + 1, 337, :_reduce_500, + 1, 337, :_reduce_501, + 2, 337, :_reduce_502, + 3, 337, :_reduce_503, + 5, 337, :_reduce_504, + 2, 337, :_reduce_505, + 4, 337, :_reduce_506, + 1, 337, :_reduce_none, + 2, 352, :_reduce_508, + 3, 352, :_reduce_509, + 2, 338, :_reduce_510, + 4, 338, :_reduce_511, + 1, 338, :_reduce_512, + 3, 338, :_reduce_513, + 1, 354, :_reduce_none, + 3, 354, :_reduce_515, + 1, 353, :_reduce_516, + 3, 339, :_reduce_517, + 1, 339, :_reduce_518, + 2, 339, :_reduce_519, + 1, 339, :_reduce_520, + 3, 339, :_reduce_521, + 1, 339, :_reduce_522, + 1, 355, :_reduce_none, + 3, 355, :_reduce_524, + 2, 358, :_reduce_525, + 1, 358, :_reduce_526, + 1, 359, :_reduce_527, + 2, 356, :_reduce_528, + 1, 356, :_reduce_529, + 2, 357, :_reduce_530, + 1, 346, :_reduce_none, + 3, 346, :_reduce_532, + 3, 346, :_reduce_533, + 2, 346, :_reduce_534, + 2, 346, :_reduce_535, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 1, 346, :_reduce_none, + 2, 346, :_reduce_539, + 2, 346, :_reduce_540, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 1, 361, :_reduce_545, + 1, 361, :_reduce_546, + 1, 361, :_reduce_547, + 1, 361, :_reduce_548, + 1, 361, :_reduce_549, + 1, 361, :_reduce_none, + 1, 341, :_reduce_551, + 2, 362, :_reduce_552, + 2, 347, :_reduce_553, + 3, 347, :_reduce_554, + 1, 347, :_reduce_555, + 6, 162, :_reduce_556, + 0, 162, :_reduce_557, + 1, 363, :_reduce_558, + 1, 363, :_reduce_none, + 1, 363, :_reduce_none, + 2, 364, :_reduce_561, + 1, 364, :_reduce_none, + 2, 164, :_reduce_563, + 1, 164, :_reduce_none, + 1, 240, :_reduce_565, + 1, 240, :_reduce_none, + 1, 241, :_reduce_567, + 1, 366, :_reduce_568, + 1, 366, :_reduce_none, + 2, 366, :_reduce_570, + 3, 367, :_reduce_571, + 1, 367, :_reduce_572, + 3, 242, :_reduce_573, + 3, 243, :_reduce_574, + 3, 244, :_reduce_575, + 3, 244, :_reduce_576, + 1, 371, :_reduce_577, + 3, 371, :_reduce_578, + 1, 372, :_reduce_none, + 2, 372, :_reduce_580, + 3, 246, :_reduce_581, + 3, 246, :_reduce_582, + 1, 374, :_reduce_583, + 3, 374, :_reduce_584, + 3, 245, :_reduce_585, + 3, 245, :_reduce_586, + 3, 247, :_reduce_587, + 3, 247, :_reduce_588, + 1, 375, :_reduce_589, + 3, 375, :_reduce_590, + 1, 376, :_reduce_591, + 3, 376, :_reduce_592, + 1, 368, :_reduce_593, + 2, 368, :_reduce_594, + 1, 369, :_reduce_595, + 2, 369, :_reduce_596, + 1, 370, :_reduce_597, + 2, 370, :_reduce_598, + 1, 373, :_reduce_599, + 0, 378, :_reduce_600, + 3, 373, :_reduce_601, + 0, 379, :_reduce_602, + 4, 373, :_reduce_603, + 1, 377, :_reduce_604, + 1, 377, :_reduce_605, + 1, 377, :_reduce_606, + 1, 377, :_reduce_none, + 1, 222, :_reduce_none, + 1, 222, :_reduce_none, + 2, 380, :_reduce_610, + 1, 380, :_reduce_611, + 1, 382, :_reduce_none, + 1, 382, :_reduce_none, + 1, 382, :_reduce_none, + 1, 382, :_reduce_none, + 3, 381, :_reduce_616, + 1, 365, :_reduce_none, + 2, 365, :_reduce_618, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 215, :_reduce_none, + 1, 216, :_reduce_628, + 1, 216, :_reduce_629, + 1, 216, :_reduce_630, + 1, 216, :_reduce_631, + 1, 216, :_reduce_632, + 1, 216, :_reduce_633, + 1, 216, :_reduce_634, + 1, 248, :_reduce_635, + 1, 248, :_reduce_636, + 1, 181, :_reduce_637, + 1, 181, :_reduce_638, + 1, 186, :_reduce_639, + 1, 186, :_reduce_640, + 0, 383, :_reduce_641, + 4, 268, :_reduce_642, + 1, 268, :_reduce_643, + 3, 272, :_reduce_644, + 5, 272, :_reduce_645, + 3, 272, :_reduce_646, + 0, 385, :_reduce_647, + 3, 272, :_reduce_648, + 4, 384, :_reduce_649, + 2, 384, :_reduce_650, + 2, 384, :_reduce_651, + 2, 384, :_reduce_652, + 1, 384, :_reduce_none, + 2, 387, :_reduce_654, + 0, 387, :_reduce_655, + 6, 319, :_reduce_656, + 8, 319, :_reduce_657, + 4, 319, :_reduce_658, + 6, 319, :_reduce_659, + 4, 319, :_reduce_660, + 6, 319, :_reduce_661, + 2, 319, :_reduce_662, + 4, 319, :_reduce_663, + 6, 319, :_reduce_664, + 2, 319, :_reduce_665, + 4, 319, :_reduce_666, + 2, 319, :_reduce_667, + 4, 319, :_reduce_668, + 1, 319, :_reduce_669, + 0, 319, :_reduce_670, + 1, 235, :_reduce_671, + 1, 314, :_reduce_672, + 1, 314, :_reduce_673, + 1, 314, :_reduce_674, + 1, 314, :_reduce_675, + 1, 294, :_reduce_none, + 1, 294, :_reduce_677, + 1, 389, :_reduce_none, + 1, 390, :_reduce_none, + 3, 390, :_reduce_680, + 1, 306, :_reduce_681, + 3, 306, :_reduce_682, + 1, 391, :_reduce_none, + 2, 392, :_reduce_684, + 1, 392, :_reduce_685, + 2, 393, :_reduce_686, + 1, 393, :_reduce_687, + 1, 299, :_reduce_none, + 3, 299, :_reduce_689, + 1, 386, :_reduce_none, + 3, 386, :_reduce_691, + 1, 360, :_reduce_none, + 1, 360, :_reduce_none, + 2, 302, :_reduce_694, + 2, 300, :_reduce_695, + 1, 300, :_reduce_696, + 3, 394, :_reduce_697, + 3, 395, :_reduce_698, + 1, 307, :_reduce_699, + 3, 307, :_reduce_700, + 1, 388, :_reduce_701, + 3, 388, :_reduce_702, + 1, 396, :_reduce_none, + 1, 396, :_reduce_none, + 2, 308, :_reduce_705, + 1, 308, :_reduce_706, + 1, 397, :_reduce_none, + 1, 397, :_reduce_none, + 2, 303, :_reduce_709, + 2, 301, :_reduce_710, + 0, 301, :_reduce_711, + 1, 273, :_reduce_none, + 0, 398, :_reduce_713, + 4, 273, :_reduce_714, + 1, 251, :_reduce_715, + 2, 251, :_reduce_none, + 1, 233, :_reduce_none, + 3, 233, :_reduce_718, + 3, 399, :_reduce_719, + 2, 399, :_reduce_720, + 4, 399, :_reduce_721, + 2, 399, :_reduce_722, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 205, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 322, :_reduce_none, + 1, 322, :_reduce_none, + 1, 322, :_reduce_none, + 1, 274, :_reduce_none, + 1, 274, :_reduce_none, + 1, 185, :_reduce_none, + 1, 185, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 187, :_reduce_none, + 1, 187, :_reduce_none, + 2, 210, :_reduce_743, + 2, 184, :_reduce_744, + 2, 348, :_reduce_none, + 0, 232, :_reduce_none, + 1, 232, :_reduce_none, + 1, 232, :_reduce_none, + 1, 269, :_reduce_749, + 1, 269, :_reduce_none, + 1, 155, :_reduce_none, + 2, 155, :_reduce_752, + 0, 153, :_reduce_753 ] + +racc_reduce_n = 754 + +racc_shift_n = 1247 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLONELY => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tLOWEST => 145, + :tEQL => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLONELY", + "tBDOT2", + "tBDOT3", + "tLOWEST", + "tEQL", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "@3", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@4", + "stmts", + "stmt_or_begin", + "@5", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@6", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "p_expr", + "@7", + "expr_value_do", + "do", + "@8", + "@9", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@10", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "@11", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@12", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "p_case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "k_def", + "f_arglist", + "singleton", + "dot_or_colon", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "@23", + "@24", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_no_kwarg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@25", + "@26", + "f_args", + "do_block", + "do_body", + "operation3", + "@27", + "@28", + "@29", + "@30", + "case_args", + "@31", + "@32", + "cases", + "@33", + "p_top_expr", + "p_cases", + "@34", + "@35", + "p_top_expr_body", + "p_args", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@36", + "@37", + "@38", + "p_args_head", + "p_arg", + "p_args_post", + "p_kwarg", + "p_kwrest", + "p_kwnorest", + "p_kw", + "p_kw_label", + "kwrest_mark", + "p_primitive", + "p_var_ref", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@39", + "@40", + "ssym", + "dsym", + "sym", + "@41", + "args_tail", + "@42", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@43", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_12(val, _values, result) + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_13(val, _values, result) + res = _values[-2] + # TODO: move down to main match so I can just use val + + yyerror "else without rescue is useless" unless res + + result +end + +def _reduce_14(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_15(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_16(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 17 omitted + +# reduce 18 omitted + +def _reduce_19(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_20(val, _values, result) + result = val[1] + debug 12 + + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_23(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_24(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_25(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_27(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_28(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_29(val, _values, result) + result = val[1] + + result +end + +def _reduce_30(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_31(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_33(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_34(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_35(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 36 omitted + +def _reduce_37(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_38(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_39(val, _values, result) + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + + result +end + +def _reduce_40(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 41 omitted + +def _reduce_42(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_44(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_49(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_50(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +def _reduce_51(val, _values, result) + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + + result +end + +# reduce 52 omitted + +# reduce 53 omitted + +def _reduce_54(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_55(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_56(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_57(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +def _reduce_58(val, _values, result) + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + + result +end + +def _reduce_59(val, _values, result) + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + + result +end + +# reduce 60 omitted + +def _reduce_61(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_62(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_63(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_64(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 65 omitted + +# reduce 66 omitted + +# reduce 67 omitted + +def _reduce_68(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_69(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_70(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_71(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_72(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_73(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_74(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_75(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_76(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_77(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_78(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_79(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_80(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_81(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_82(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 83 omitted + +def _reduce_84(val, _values, result) + result = val[1] + + result +end + +# reduce 85 omitted + +def _reduce_86(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_87(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_88(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_89(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_90(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_91(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_92(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_93(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_94(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_95(val, _values, result) + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_96(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 97 omitted + +def _reduce_98(val, _values, result) + result = val[1] + + result +end + +def _reduce_99(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_100(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_101(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_102(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_103(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_104(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_105(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_106(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_107(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_108(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_109(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_110(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_111(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_112(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_113(val, _values, result) + var, = val + + result = self.assignable var + + debug 16 + + result +end + +def _reduce_114(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_115(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_116(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_117(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_118(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_119(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_120(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_121(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 122 omitted + +def _reduce_123(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_124(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_125(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +def _reduce_129(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 130 omitted + +def _reduce_131(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 132 omitted + +def _reduce_133(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_134(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_135(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +# reduce 204 omitted + +# reduce 205 omitted + +# reduce 206 omitted + +def _reduce_207(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_208(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_209(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_210(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_211(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_212(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_213(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_214(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_215(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_216(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_217(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_218(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + + result +end + +def _reduce_219(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + + result +end + +def _reduce_220(val, _values, result) + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + + result +end + +def _reduce_221(val, _values, result) + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + + result +end + +def _reduce_222(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_223(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_224(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_225(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_226(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_227(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_228(val, _values, result) + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_229(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_230(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_231(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 235 omitted + +def _reduce_236(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_238(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_239(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_240(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_241(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_242(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_243(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_244(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_245(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_246(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_247(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_248(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +# reduce 249 omitted + +# reduce 250 omitted + +# reduce 251 omitted + +# reduce 252 omitted + +# reduce 253 omitted + +def _reduce_254(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_255(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_256(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 257 omitted + +def _reduce_258(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_259(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_260(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 261 omitted + +def _reduce_262(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_263(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +def _reduce_264(val, _values, result) + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + + result +end + +def _reduce_265(val, _values, result) + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + + result +end + +# reduce 266 omitted + +# reduce 267 omitted + +# reduce 268 omitted + +# reduce 269 omitted + +def _reduce_270(val, _values, result) + result = args val + + result +end + +def _reduce_271(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_272(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_273(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_274(val, _values, result) + result = call_args val + + result +end + +def _reduce_275(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_276(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_277(val, _values, result) + result = call_args val + + result +end + +def _reduce_278(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_279(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_280(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_281(val, _values, result) + result = val[1] + + result +end + +# reduce 282 omitted + +def _reduce_283(val, _values, result) + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + + result +end + +def _reduce_284(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_285(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_286(val, _values, result) + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_287(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_288(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_289(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_290(val, _values, result) + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_291(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 292 omitted + +# reduce 293 omitted + +# reduce 294 omitted + +# reduce 295 omitted + +# reduce 296 omitted + +# reduce 297 omitted + +# reduce 298 omitted + +# reduce 299 omitted + +# reduce 300 omitted + +# reduce 301 omitted + +def _reduce_302(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_303(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_304(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_305(val, _values, result) + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + + result +end + +def _reduce_306(val, _values, result) + _, line, _ = val + result = s(:begin).line line + + result +end + +def _reduce_307(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_308(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_309(val, _values, result) + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + + result +end + +def _reduce_310(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_311(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_312(val, _values, result) + result = lexer.lineno + result +end + +def _reduce_313(val, _values, result) + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_314(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_315(val, _values, result) + result = new_hash val + + result +end + +def _reduce_316(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_317(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_318(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_319(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_320(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_321(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_322(val, _values, result) + debug 20 + + result +end + +def _reduce_323(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 324 omitted + +def _reduce_325(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_326(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_327(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_328(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_329(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_330(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_331(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_332(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_333(val, _values, result) + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + + result +end + +def _reduce_334(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_335(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_336(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_337(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_338(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_339(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_340(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_341(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_342(val, _values, result) + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result +end + +def _reduce_343(val, _values, result) + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_344(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_345(val, _values, result) + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + + result +end + +def _reduce_346(val, _values, result) + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_347(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_348(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_349(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_350(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_351(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 352 omitted + +# reduce 353 omitted + +# reduce 354 omitted + +# reduce 355 omitted + +# reduce 356 omitted + +# reduce 357 omitted + +# reduce 358 omitted + +def _reduce_359(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_360(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_361(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +# reduce 366 omitted + +# reduce 367 omitted + +# reduce 368 omitted + +# reduce 369 omitted + +# reduce 370 omitted + +# reduce 371 omitted + +# reduce 372 omitted + +# reduce 373 omitted + +# reduce 374 omitted + +# reduce 375 omitted + +# reduce 376 omitted + +def _reduce_377(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 378 omitted + +def _reduce_379(val, _values, result) + result = val[1] + + result +end + +# reduce 380 omitted + +def _reduce_381(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +# reduce 382 omitted + +def _reduce_383(val, _values, result) + result = val[1] + + result +end + +def _reduce_384(val, _values, result) + sym, = val + + result = s(:array, sym).line lexer.lineno + + result +end + +def _reduce_385(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_386(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_387(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_388(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_389(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_390(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_391(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_392(val, _values, result) + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + + result +end + +def _reduce_393(val, _values, result) + result = call_args val + + result +end + +def _reduce_394(val, _values, result) + result = call_args val + + result +end + +def _reduce_395(val, _values, result) + result = call_args val + + result +end + +def _reduce_396(val, _values, result) + result = args val + + result +end + +def _reduce_397(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_398(val, _values, result) + result = args val + + result +end + +# reduce 399 omitted + +def _reduce_400(val, _values, result) + result = args val + + result +end + +def _reduce_401(val, _values, result) + result = args val + + result +end + +def _reduce_402(val, _values, result) + result = args val + + result +end + +def _reduce_403(val, _values, result) + result = args val + + result +end + +def _reduce_404(val, _values, result) + result = args val + + result +end + +def _reduce_405(val, _values, result) + result = args(val) << nil + + result +end + +def _reduce_406(val, _values, result) + result = args val + + result +end + +def _reduce_407(val, _values, result) + result = args val + + result +end + +def _reduce_408(val, _values, result) + result = args val + + result +end + +def _reduce_409(val, _values, result) + result = args val + + result +end + +def _reduce_410(val, _values, result) + result = args val + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +def _reduce_412(val, _values, result) + result = args val + + result +end + +def _reduce_413(val, _values, result) + result = args val + + result +end + +def _reduce_414(val, _values, result) + result = args val + + result +end + +def _reduce_415(val, _values, result) + result = 0 + result +end + +def _reduce_416(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_417(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +def _reduce_418(val, _values, result) + result = s(:args).line lexer.lineno + + result +end + +def _reduce_419(val, _values, result) + # TODO: current_arg = 0 + result = args val + + result +end + +# reduce 420 omitted + +def _reduce_421(val, _values, result) + result = args val + + result +end + +def _reduce_422(val, _values, result) + result = args val + + result +end + +def _reduce_423(val, _values, result) + result = args val + + result +end + +def _reduce_424(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 425 omitted + +def _reduce_426(val, _values, result) + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_427(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_428(val, _values, result) + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_429(val, _values, result) + result = args val + + result +end + +def _reduce_430(val, _values, result) + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_431(val, _values, result) + result = val[1] + + result +end + +def _reduce_432(val, _values, result) + result = val[1] + + result +end + +def _reduce_433(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_434(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_435(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_436(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_437(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_438(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_439(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_440(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_441(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_442(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_443(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_444(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_445(val, _values, result) + result = s(:zsuper).line lexer.lineno + + result +end + +def _reduce_446(val, _values, result) + result = new_aref val + + result +end + +def _reduce_447(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_448(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_449(val, _values, result) + self.env.extend :dynamic + result = self.lexer.lineno + + result +end + +def _reduce_450(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_451(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_452(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_453(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_454(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_455(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_456(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_457(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_458(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_459(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_460(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_461(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_462(val, _values, result) + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + + result +end + +# reduce 463 omitted + +# reduce 464 omitted + +def _reduce_465(val, _values, result) + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + + result +end + +def _reduce_466(val, _values, result) + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + + result +end + +def _reduce_467(val, _values, result) + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + + result +end + +# reduce 468 omitted + +# reduce 469 omitted + +# reduce 470 omitted + +def _reduce_471(val, _values, result) + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + + result +end + +def _reduce_472(val, _values, result) + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + + result +end + +# reduce 473 omitted + +def _reduce_474(val, _values, result) + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + + result +end + +def _reduce_475(val, _values, result) + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + + result +end + +def _reduce_476(val, _values, result) + args, = val + result = new_array_pattern nil, nil, args, args.line + + result +end + +def _reduce_477(val, _values, result) + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + + result +end + +# reduce 478 omitted + +def _reduce_479(val, _values, result) + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + + result +end + +# reduce 480 omitted + +def _reduce_481(val, _values, result) + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + + result +end + +# reduce 482 omitted + +def _reduce_483(val, _values, result) + push_pktbl + result +end + +def _reduce_484(val, _values, result) + push_pktbl + result +end + +# reduce 485 omitted + +def _reduce_486(val, _values, result) + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + + result +end + +def _reduce_487(val, _values, result) + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + + result +end + +def _reduce_488(val, _values, result) + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + + result +end + +def _reduce_489(val, _values, result) + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + + result +end + +def _reduce_490(val, _values, result) + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + + result +end + +def _reduce_491(val, _values, result) + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + + result +end + +def _reduce_492(val, _values, result) + push_pktbl + result +end + +def _reduce_493(val, _values, result) + _, _, pat, _ = val + + pop_pktbl + result = new_array_pattern nil, nil, pat, pat.line + + result +end + +def _reduce_494(val, _values, result) + (_, line), _ = val + + result = s(:array_pat).line line + + result +end + +def _reduce_495(val, _values, result) + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + + result +end + +def _reduce_496(val, _values, result) + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + + result +end + +def _reduce_497(val, _values, result) + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + + result +end + +def _reduce_498(val, _values, result) + push_pktbl + result +end + +def _reduce_499(val, _values, result) + _, _, expr, _ = val + + pop_pktbl + result = expr + + result +end + +def _reduce_500(val, _values, result) + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + + result +end + +def _reduce_501(val, _values, result) + head, = val + + result = new_array_pattern_tail head, true, nil, nil + + result +end + +def _reduce_502(val, _values, result) + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + + result +end + +def _reduce_503(val, _values, result) + head, _, (id, _line) = val + + result = new_array_pattern_tail head, true, id.to_sym, nil + result.line head.line + + result +end + +def _reduce_504(val, _values, result) + head, _, (id, _line), _, post = val + + result = new_array_pattern_tail head, true, id.to_sym, post + result.line head.line + + result +end + +def _reduce_505(val, _values, result) + expr, _ = val + + result = new_array_pattern_tail(expr, true, nil, nil).line expr.line + + result +end + +def _reduce_506(val, _values, result) + head, _, _, post = val + + result = new_array_pattern_tail(head, true, nil, post).line head.line + + result +end + +# reduce 507 omitted + +def _reduce_508(val, _values, result) + arg, _ = val + result = arg + + result +end + +def _reduce_509(val, _values, result) + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + + result +end + +def _reduce_510(val, _values, result) + _, (id, line) = val + + result = new_array_pattern_tail nil, true, id.to_sym, nil + result.line line + + result +end + +def _reduce_511(val, _values, result) + _, (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id.to_sym, rhs + result.line line + + result +end + +def _reduce_512(val, _values, result) + (_, line), = val + + result = new_array_pattern_tail nil, true, nil, nil + result.line line + + result +end + +def _reduce_513(val, _values, result) + (_, line), _, args = val + + result = new_array_pattern_tail nil, true, nil, args + result.line line + + result +end + +# reduce 514 omitted + +def _reduce_515(val, _values, result) + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + + result +end + +def _reduce_516(val, _values, result) + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + + result +end + +def _reduce_517(val, _values, result) + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + + result +end + +def _reduce_518(val, _values, result) + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + + result +end + +def _reduce_519(val, _values, result) + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + + result +end + +def _reduce_520(val, _values, result) + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + + result +end + +def _reduce_521(val, _values, result) + kwarg, _, norest = val + + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, norest, kwarg.line + + result +end + +def _reduce_522(val, _values, result) + norest, = val + + result = new_hash_pattern_tail nil, norest, norest.line + + result +end + +# reduce 523 omitted + +def _reduce_524(val, _values, result) + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + + result +end + +def _reduce_525(val, _values, result) + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + + result +end + +def _reduce_526(val, _values, result) + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 666 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + + result +end + +def _reduce_527(val, _values, result) + result = wrap :lit, val[0] + + result +end + +def _reduce_528(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + + result +end + +def _reduce_529(val, _values, result) + (_, line), = val + + result = s(:kwrest, :"**").line line + + result +end + +def _reduce_530(val, _values, result) + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + + result +end + +# reduce 531 omitted + +def _reduce_532(val, _values, result) + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + + result +end + +def _reduce_533(val, _values, result) + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + + result +end + +def _reduce_534(val, _values, result) + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + + result +end + +def _reduce_535(val, _values, result) + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + + result +end + +# reduce 536 omitted + +# reduce 537 omitted + +# reduce 538 omitted + +def _reduce_539(val, _values, result) + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + + result +end + +def _reduce_540(val, _values, result) + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + + result +end + +# reduce 541 omitted + +# reduce 542 omitted + +# reduce 543 omitted + +# reduce 544 omitted + +def _reduce_545(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_546(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_547(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_548(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_549(val, _values, result) + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + + result +end + +# reduce 550 omitted + +def _reduce_551(val, _values, result) + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + + result +end + +def _reduce_552(val, _values, result) + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + + result +end + +def _reduce_553(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_554(val, _values, result) + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + + result +end + +def _reduce_555(val, _values, result) + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + + result +end + +def _reduce_556(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_557(val, _values, result) + result = nil + + result +end + +def _reduce_558(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 559 omitted + +# reduce 560 omitted + +def _reduce_561(val, _values, result) + result = val[1] + + result +end + +# reduce 562 omitted + +def _reduce_563(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 564 omitted + +def _reduce_565(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 566 omitted + +def _reduce_567(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_568(val, _values, result) + debug 37 + + result +end + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_571(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_572(val, _values, result) + result = new_string val + + result +end + +def _reduce_573(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_574(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_575(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_576(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_577(val, _values, result) + result = new_word_list + + result +end + +def _reduce_578(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 579 omitted + +def _reduce_580(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_581(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_582(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_583(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_584(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_585(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_586(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_587(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_588(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_589(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_590(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_591(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_592(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_593(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_594(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_595(val, _values, result) + result = nil + + result +end + +def _reduce_596(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_597(val, _values, result) + result = nil + + result +end + +def _reduce_598(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_599(val, _values, result) + result = new_string val + + result +end + +def _reduce_600(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_601(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_602(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_603(val, _values, result) + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_604(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_605(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_606(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 607 omitted + +# reduce 608 omitted + +# reduce 609 omitted + +def _reduce_610(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_611(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 612 omitted + +# reduce 613 omitted + +# reduce 614 omitted + +# reduce 615 omitted + +def _reduce_616(val, _values, result) + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + + result +end + +# reduce 617 omitted + +def _reduce_618(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 619 omitted + +# reduce 620 omitted + +# reduce 621 omitted + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +# reduce 626 omitted + +# reduce 627 omitted + +def _reduce_628(val, _values, result) + result = s(:nil).line lexer.lineno + result +end + +def _reduce_629(val, _values, result) + result = s(:self).line lexer.lineno + result +end + +def _reduce_630(val, _values, result) + result = s(:true).line lexer.lineno + result +end + +def _reduce_631(val, _values, result) + result = s(:false).line lexer.lineno + result +end + +def _reduce_632(val, _values, result) + result = s(:str, self.file).line lexer.lineno + result +end + +def _reduce_633(val, _values, result) + result = s(:lit, lexer.lineno).line lexer.lineno + result +end + +def _reduce_634(val, _values, result) + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_635(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + + result +end + +def _reduce_636(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_637(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_638(val, _values, result) + result = self.assignable val[0] + debug 40 + + result +end + +def _reduce_639(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_640(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_641(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_642(val, _values, result) + result = val[2] + + result +end + +def _reduce_643(val, _values, result) + result = nil + + result +end + +def _reduce_644(val, _values, result) + result = end_args val + + result +end + +def _reduce_645(val, _values, result) + result = end_args val + + result +end + +def _reduce_646(val, _values, result) + result = end_args val + + result +end + +def _reduce_647(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_648(val, _values, result) + result = end_args val + + result +end + +def _reduce_649(val, _values, result) + result = args val + + result +end + +def _reduce_650(val, _values, result) + result = args val + + result +end + +def _reduce_651(val, _values, result) + result = args val + + result +end + +def _reduce_652(val, _values, result) + result = args val + + result +end + +# reduce 653 omitted + +def _reduce_654(val, _values, result) + result = val[1] + + result +end + +def _reduce_655(val, _values, result) + result = nil + + result +end + +def _reduce_656(val, _values, result) + result = args val + + result +end + +def _reduce_657(val, _values, result) + result = args val + + result +end + +def _reduce_658(val, _values, result) + result = args val + + result +end + +def _reduce_659(val, _values, result) + result = args val + + result +end + +def _reduce_660(val, _values, result) + result = args val + + result +end + +def _reduce_661(val, _values, result) + result = args val + + result +end + +def _reduce_662(val, _values, result) + result = args val + + result +end + +def _reduce_663(val, _values, result) + result = args val + + result +end + +def _reduce_664(val, _values, result) + result = args val + + result +end + +def _reduce_665(val, _values, result) + result = args val + + result +end + +def _reduce_666(val, _values, result) + result = args val + + result +end + +def _reduce_667(val, _values, result) + result = args val + + result +end + +def _reduce_668(val, _values, result) + result = args val + + result +end + +def _reduce_669(val, _values, result) + result = args val + + result +end + +def _reduce_670(val, _values, result) + result = args val + # result.line lexer.lineno + + result +end + +def _reduce_671(val, _values, result) + result = s(:forward_args).line lexer.lineno + + result +end + +def _reduce_672(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_673(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_674(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_675(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 676 omitted + +def _reduce_677(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 678 omitted + +# reduce 679 omitted + +def _reduce_680(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_681(val, _values, result) + result = new_arg val + + result +end + +def _reduce_682(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +# reduce 683 omitted + +def _reduce_684(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_685(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_686(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_687(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 688 omitted + +def _reduce_689(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 690 omitted + +def _reduce_691(val, _values, result) + result = args val + + result +end + +# reduce 692 omitted + +# reduce 693 omitted + +def _reduce_694(val, _values, result) + result = :"**nil" + + result +end + +def _reduce_695(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_696(val, _values, result) + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + + result +end + +def _reduce_697(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + + result +end + +def _reduce_698(val, _values, result) + lhs, _, rhs = val + result = self.assignable lhs, rhs + + result +end + +def _reduce_699(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_700(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_701(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_702(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 703 omitted + +# reduce 704 omitted + +def _reduce_705(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_706(val, _values, result) + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + + result +end + +# reduce 707 omitted + +# reduce 708 omitted + +def _reduce_709(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_710(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_711(val, _values, result) + result = nil + + result +end + +# reduce 712 omitted + +def _reduce_713(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_714(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_715(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 716 omitted + +# reduce 717 omitted + +def _reduce_718(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_719(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_720(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_721(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_722(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 723 omitted + +# reduce 724 omitted + +# reduce 725 omitted + +# reduce 726 omitted + +# reduce 727 omitted + +# reduce 728 omitted + +# reduce 729 omitted + +# reduce 730 omitted + +# reduce 731 omitted + +# reduce 732 omitted + +# reduce 733 omitted + +# reduce 734 omitted + +# reduce 735 omitted + +# reduce 736 omitted + +# reduce 737 omitted + +# reduce 738 omitted + +# reduce 739 omitted + +# reduce 740 omitted + +# reduce 741 omitted + +# reduce 742 omitted + +def _reduce_743(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_744(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 745 omitted + +# reduce 746 omitted + +# reduce 747 omitted + +# reduce 748 omitted + +def _reduce_749(val, _values, result) + yyerrok + result +end + +# reduce 750 omitted + +# reduce 751 omitted + +def _reduce_752(val, _values, result) + yyerrok + result +end + +def _reduce_753(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby27Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby27_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby27_parser.y new file mode 100644 index 000000000..25abba083 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby27_parser.y @@ -0,0 +1,3360 @@ +# -*- racc -*- + +class Ruby27Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + tBDOT2 tBDOT3 + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + + yyerror "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg kRESCUE_MOD stmt + { + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg + kIN + { + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } + p_expr + { + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + } + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + | arg tDOT2 + { + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + } + | arg tDOT3 + { + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + } + + | tBDOT2 arg + { + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + } + | tBDOT3 arg + { + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + } + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + | tLPAREN2 args tCOMMA args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + | tLPAREN2 args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_case expr_value opt_terms p_case_body k_end + { + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_no_kwarg opt_f_block_arg + { + result = args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + bodystmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body +###################################################################### + + p_case_body: kIN + { + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + } + p_top_expr then + { + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + } + compstmt + p_cases + { + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + } + + p_cases: opt_else + | p_case_body + + p_top_expr: p_top_expr_body + | p_top_expr_body kIF_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + } + | p_top_expr_body kUNLESS_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + } + + p_top_expr_body: p_expr + | p_expr tCOMMA + { + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + } + | p_expr tCOMMA p_args + { + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + } + | p_args_tail + { + args, = val + result = new_array_pattern nil, nil, args, args.line + } + | p_kwargs + { + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + } + + p_expr: p_as + + p_as: p_expr tASSOC p_variable + { + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + } + | p_alt + + p_alt: p_alt tPIPE p_expr_basic + { + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + } + | p_expr_basic + + p_lparen: tLPAREN2 { push_pktbl } + p_lbracket: tLBRACK2 { push_pktbl } + + p_expr_basic: p_value + | p_const p_lparen p_args tRPAREN + { + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + } + | p_const p_lparen p_kwargs tRPAREN + { + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + } + | p_const tLPAREN2 tRPAREN + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | p_const p_lbracket p_args rbracket + { + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + } + | p_const p_lbracket p_kwargs rbracket + { + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + } + | p_const tLBRACK2 rbracket + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | tLBRACK { push_pktbl } p_args rbracket + { + _, _, pat, _ = val + + pop_pktbl + result = new_array_pattern nil, nil, pat, pat.line + } + | tLBRACK rbracket + { + (_, line), _ = val + + result = s(:array_pat).line line + } + | tLBRACE + { + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + } + p_kwargs rbrace + { + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + } + | tLBRACE rbrace + { + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + } + | tLPAREN { push_pktbl } p_expr tRPAREN + { + _, _, expr, _ = val + + pop_pktbl + result = expr + } + + p_args: p_expr + { + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + } + | p_args_head + { + head, = val + + result = new_array_pattern_tail head, true, nil, nil + } + | p_args_head p_arg + { + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER + { + head, _, (id, _line) = val + + result = new_array_pattern_tail head, true, id.to_sym, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post + { + head, _, (id, _line), _, post = val + + result = new_array_pattern_tail head, true, id.to_sym, post + result.line head.line + } + | p_args_head tSTAR + { + expr, _ = val + + result = new_array_pattern_tail(expr, true, nil, nil).line expr.line + } + | p_args_head tSTAR tCOMMA p_args_post + { + head, _, _, post = val + + result = new_array_pattern_tail(head, true, nil, post).line head.line + } + | p_args_tail + + p_args_head: p_arg tCOMMA + { + arg, _ = val + result = arg + } + | p_args_head p_arg tCOMMA + { + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + } + + p_args_tail: tSTAR tIDENTIFIER + { + _, (id, line) = val + + result = new_array_pattern_tail nil, true, id.to_sym, nil + result.line line + } + | tSTAR tIDENTIFIER tCOMMA p_args_post + { + _, (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id.to_sym, rhs + result.line line + } + | tSTAR + { + (_, line), = val + + result = new_array_pattern_tail nil, true, nil, nil + result.line line + } + | tSTAR tCOMMA p_args_post + { + (_, line), _, args = val + + result = new_array_pattern_tail nil, true, nil, args + result.line line + } + + p_args_post: p_arg + | p_args_post tCOMMA p_arg + { + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + } + + p_arg: p_expr + { + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + } + + p_kwargs: p_kwarg tCOMMA p_kwrest + { + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + } + | p_kwarg + { + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_kwarg tCOMMA + { + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_kwrest + { + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + } + | p_kwarg tCOMMA p_kwnorest + { + kwarg, _, norest = val + + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, norest, kwarg.line + } + | p_kwnorest + { + norest, = val + + result = new_hash_pattern_tail nil, norest, norest.line + } + + p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1) + | p_kwarg tCOMMA p_kw + { + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + } + + p_kw: p_kw_label p_expr + { + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + } + | p_kw_label + { + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 666 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + } + + p_kw_label: tLABEL + { + result = wrap :lit, val[0] + } + + p_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + } + | kwrest_mark + { + (_, line), = val + + result = s(:kwrest, :"**").line line + } + + p_kwnorest: kwrest_mark kNIL + { + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + } + + p_value: p_primitive + | p_primitive tDOT2 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + } + | p_primitive tDOT3 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + } + | p_primitive tDOT2 + { + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + } + | p_primitive tDOT3 + { + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + } + | p_variable + | p_var_ref + | p_const + | tBDOT2 p_primitive + { + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + } + | tBDOT3 p_primitive + { + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + } + + p_primitive: literal + | strings + | xstring + | regexp + | words + { + result = ary_to_pat val[0] + } + | qwords + { + result = ary_to_pat val[0] + } + | symbols + { + result = ary_to_pat val[0] + } + | qsymbols + { + result = ary_to_pat val[0] + } + | keyword_variable + { + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + } + | lambda + + p_variable: tIDENTIFIER + { + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + } + + p_var_ref: tCARET tIDENTIFIER + { + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + } + + p_const: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | p_const tCOLON2 cname + { + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + } + | tCONSTANT + { + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + } +###################################################################### + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } + | tLPAREN2 f_arg tCOMMA args_forward rparen + { + result = end_args val + } + | tLPAREN2 args_forward rparen + { + result = end_args val + } + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } + | f_no_kwarg opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + + args_forward: tBDOT3 + { + result = s(:forward_args).line lexer.lineno + } + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + f_no_kwarg: kwrest_mark kNIL + { + result = :"**nil" + } + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + + f_opt: f_arg_asgn tEQL arg_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + + f_block_opt: f_arg_asgn tEQL primary_value + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + rbrace: opt_nl tRCURLY + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby30_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby30_parser.rb new file mode 100644 index 000000000..ea58a4876 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby30_parser.rb @@ -0,0 +1,13316 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby30Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -633, 696, 699, 307, 650, -117, 307, -633, -633, -633, + 228, 229, -633, -633, -633, -111, -633, -118, 1136, -113, + 650, 650, 228, 229, -633, 911, -633, -633, -633, 228, + 229, 664, 3, 830, 1131, 665, -633, -633, 234, -633, + -633, -633, -633, -633, -103, 302, -755, 650, -125, -112, + -124, 831, 1130, -120, -122, 650, 664, 911, 130, 239, + 936, -89, 1016, -110, 695, 698, -526, -633, -633, -633, + -633, -633, -633, -633, -633, -633, -633, -633, -633, -633, + -633, 650, -111, -633, -633, -633, -113, -633, -633, 849, + 309, -633, -119, 309, -633, -633, 1137, -633, 1177, -633, + 239, -633, 235, -633, -633, -633, -633, -633, -633, -633, + -108, -633, 239, -633, 1042, -740, -112, -111, 134, 239, + -111, -113, -109, 133, -113, 620, -633, -633, -633, -633, + -110, -633, -117, -633, 134, 134, -636, -111, -633, 133, + 133, -113, -633, -636, -636, -636, -633, -118, -636, -636, + -636, -112, -636, -116, -112, -115, -125, -124, -111, -113, + -636, 134, -636, -636, -636, -110, 133, 1015, -110, 134, + -120, -112, -636, -636, 133, -636, -636, -636, -636, -636, + -122, -121, 1042, -119, 225, -110, -121, -123, 944, 134, + 307, -647, 621, 620, 133, 134, 680, -110, 1005, 685, + 133, -755, 238, -636, -636, -636, -636, -636, -636, -636, + -636, -636, -636, -636, -636, -636, -636, 376, 307, -636, + -636, -636, 943, -636, -636, 112, 113, -636, 112, 113, + -636, -636, 239, -636, -648, -636, 226, -636, 239, -636, + -636, -636, -636, -636, -636, -636, -117, -636, -123, -636, + -117, -117, -740, -741, 376, 304, 680, 682, 681, -740, + 621, -118, -636, -636, -636, -636, -118, -636, 680, -636, + -125, -124, -319, -767, -636, -125, -124, 309, -636, -319, + -319, -319, -636, 304, -120, -319, -319, 617, -319, -120, + 617, -112, -114, -118, -122, -121, -319, -119, 620, -122, + -121, 620, -119, 114, 115, 309, 114, 115, -319, -319, + -767, -319, -319, -319, -319, -319, 963, 682, 681, 678, + 234, 534, 964, 505, 944, 680, -741, 233, 535, 682, + 681, 628, 627, 227, 628, 627, 231, 784, 877, -319, + -319, -319, -319, -319, -319, -319, -319, -319, -319, -319, + -319, -319, -319, 230, 236, -319, -319, -319, 943, 723, + -319, 585, -123, -319, 906, 621, -319, -123, 621, 236, + -647, -319, 998, -319, 657, -319, -319, -319, -319, -319, + -319, -319, -125, -319, 235, -319, 682, 681, 612, -356, + 609, 608, 607, 617, 610, 879, -356, 907, -319, -319, + -648, -114, 297, -319, 620, -356, 680, 717, -744, 998, + -319, -116, -108, -125, -319, -744, -744, -744, -123, 854, + -124, -744, -744, -120, -744, 361, 615, -633, -125, -117, + 585, 717, -744, -744, -633, 625, 624, 628, 627, 234, + 228, 229, -109, 680, -744, -744, 502, -744, -744, -744, + -744, -744, 99, -356, -645, 503, -122, -636, -646, -118, + 100, -645, 680, 362, -636, -646, -120, 682, 681, 678, + -645, 621, -115, -111, -646, -744, -744, -744, -744, -744, + -744, -744, -744, -744, -744, -744, -744, -744, -744, -124, + -120, -744, -744, -744, -643, 724, -744, 228, 229, -744, + 680, -643, -744, 235, 682, 681, 683, -744, 718, -744, + 239, -744, -744, -744, -744, -744, -744, -744, -645, -744, + -744, -744, -646, 682, 681, 688, 612, 423, 609, 608, + 607, 617, 610, 234, -744, -744, 718, -112, -642, -744, + 577, 680, 620, 426, -744, -642, -744, 1030, 894, 575, + -744, -744, -744, -744, -121, 664, -744, -744, -744, 936, + -744, 682, 681, 693, 615, 676, 894, -122, -744, -744, + -744, -744, -744, 625, 624, 628, 627, 429, -113, 432, + -744, -744, -310, -744, -744, -744, -744, -744, 134, -310, + -110, 917, -644, 133, 234, -122, 913, 235, -310, -644, + 914, 587, 682, 681, 700, 639, -119, -119, 638, 621, + 503, -744, -744, -744, -744, -744, -744, -744, -744, -744, + -744, -744, -744, -744, -744, -119, 657, -744, -744, -744, + -641, 908, -744, -638, 854, -744, 449, -641, -744, -744, + -638, -744, 454, -744, 504, -744, -310, -744, -744, -744, + -744, -744, -744, -744, -639, -744, -744, -744, 235, 506, + 639, -639, 612, 641, 609, 608, 607, 617, 610, 234, + -744, -744, -744, -744, -640, -744, 661, -744, 620, 134, + -319, -640, -744, 507, 133, 659, -744, -319, -319, -319, + -121, 238, -319, -319, -319, 261, -319, 451, 234, 542, + 615, 554, 453, 452, -319, 667, -319, -319, -319, 625, + 624, 628, 627, 557, 669, 559, -319, -319, 234, -319, + -319, -319, -319, -319, 134, 711, -88, 258, -320, 133, + -320, 260, 259, 235, 709, -320, 612, -320, 609, 608, + 607, 239, 610, 570, -320, 621, -320, -319, -319, -319, + -319, -319, -319, -319, -319, -319, -319, -319, -319, -319, + -319, 134, 235, -319, -319, -319, 133, 909, -319, 278, + 279, -319, 571, 134, -319, -319, 578, -319, 133, -319, + 314, -319, 235, -319, -319, -319, -319, -319, -319, -319, + 134, -319, -320, -319, -320, 133, 612, 239, 609, 608, + 607, 617, 610, -319, 277, 276, -319, -319, -319, -319, + -319, -319, 620, -319, 639, -741, -319, 641, -319, -319, + 228, 229, -319, -319, -319, -319, -123, 376, 639, -319, + -319, 641, -319, 911, 615, 612, 1141, 609, 608, 607, + -319, 610, 376, 625, 624, 628, 627, 137, 138, 139, + 140, 141, -319, -319, -319, -319, -319, -319, -319, -319, + 239, -319, 234, 1227, 234, 304, -741, -319, 582, 1205, + -319, 1211, 588, 823, 931, 932, 261, 261, 669, 621, + 1209, 592, 827, -319, -319, -319, -319, -319, -319, -319, + -319, -319, -319, -319, -319, -319, -319, 628, 627, -319, + -319, -319, -654, 723, -319, 994, 998, -319, 258, 632, + -319, 239, 260, 259, 239, -319, 657, -319, -319, -319, + -319, -319, -319, -319, -319, -319, 235, -319, 235, -319, + 1175, 1176, 612, 234, 609, 608, 607, 617, 610, 442, + 1205, 662, -319, -319, 663, -319, 671, -319, 620, 669, + 994, 998, -744, 687, -319, 691, 694, 697, -319, -744, + -744, -744, -123, 704, 705, -744, -744, 261, -744, 612, + 615, 609, 608, 607, -292, 610, -744, -744, 707, 708, + 712, 628, 627, 239, 122, 121, 123, 124, -744, -744, + 715, -744, -744, -744, -744, -744, 716, 235, 304, 258, + 126, 125, 127, 260, 259, 256, 257, 823, 137, 138, + 139, 140, 141, 112, 113, 621, 827, 728, 358, -744, + -744, -744, -744, -744, -744, -744, -744, -744, -744, -744, + -744, -744, -744, 261, 261, -744, -744, -744, 261, 724, + -744, 261, 766, -744, 1020, 1021, -744, 239, 1022, 128, + 129, -744, 772, -744, 239, -744, -744, -744, -744, -744, + -744, -744, 239, -744, -744, -744, 449, 109, 99, 101, + 102, 103, 105, 239, -103, 788, 100, 110, -744, -744, + 239, -744, 591, -744, 93, 799, 805, 97, 104, 106, + -744, 114, 115, 808, -744, 239, 810, 239, -121, 8, + 89, 90, 91, 12, 82, 813, 816, 817, 83, 84, + 819, 821, -737, 87, -738, 85, 86, 88, 34, 35, + 80, 81, 137, 138, 139, 140, 141, 92, 32, 31, + 122, 121, 123, 124, 832, 612, 22, 609, 608, 607, + 833, 610, 11, 52, 10, 13, 126, 125, 127, 116, + 65, 118, 117, 119, 835, 120, 128, 129, 808, 112, + 113, 808, 48, 49, 47, -633, 239, -636, 841, 842, + 559, 845, -633, 823, -636, 808, 808, -737, 808, -738, + 880, -633, 827, -636, 44, 881, 882, 37, 261, -293, + 67, 68, 542, 542, 69, 239, 39, 911, 912, -737, + 51, -738, 935, 911, 271, 272, 938, 297, 23, 950, + 952, 557, 559, 109, 99, 101, 102, 103, 105, 799, + 258, 239, 100, 110, 260, 259, 256, 257, 304, -633, + 93, -636, 304, 97, 104, 106, 799, 114, 115, 261, + 987, 45, 46, 333, 89, 90, 91, 12, 82, 988, + 239, 998, 83, 84, 808, 808, -744, 87, 239, 85, + 86, 88, 34, 35, 80, 81, 137, 138, 139, 140, + 141, 92, 32, 31, 122, 121, 123, 124, 239, 808, + 22, 261, 239, -294, 239, 1029, 11, 52, 335, 13, + 126, 125, 127, 116, 65, 118, 117, 119, 758, 120, + 128, 129, 1033, 112, 113, 239, 48, 49, 47, -744, + 239, 1055, 1056, 258, 1057, 1059, -744, 260, 259, 256, + 257, -740, 1078, 239, 799, -744, -292, 1085, 44, 239, + 1088, 337, 1090, 816, 67, 68, 831, 1093, 69, 1095, + 39, 1095, 239, -744, 51, 612, 808, 609, 608, 607, + 808, 610, 23, 808, 808, 1122, 239, 109, 99, 101, + 102, 103, 105, 1124, -295, 1125, 100, 110, 1126, 1127, + 1128, 239, 239, -744, 93, 239, 911, 97, 104, 106, + 1135, 114, 115, 823, 239, 45, 46, 333, 89, 90, + 91, 12, 82, 1142, 816, 1145, 83, 84, 1149, 1151, + 1153, 87, 239, 85, 86, 88, 34, 35, 80, 81, + 253, 1155, 1171, 1172, 1183, 92, 32, 31, 122, 121, + 123, 124, 1184, 1187, 22, 609, 608, 607, 911, 610, + 11, 52, 335, 13, 126, 125, 127, 116, 65, 118, + 117, 119, 1191, 120, 128, 129, 1193, 112, 113, 1203, + 48, 49, 47, 261, 265, 266, 267, 268, 278, 279, + 273, 274, 269, 270, 1206, 254, 255, 963, 1212, 271, + 272, 1213, 44, 1095, 252, 37, 1095, 1095, 67, 68, + 808, 1229, 69, 816, 39, 258, 1233, 264, 51, 260, + 259, 256, 257, 277, 276, 262, 23, 263, 1235, 1237, + 1239, 109, 99, 101, 102, 103, 105, 1239, 805, 1172, + 100, 110, 1253, 275, 1229, -741, -740, 239, 93, 1095, + 1265, 97, 104, 106, 1239, 114, 115, 1239, 1239, 45, + 46, 333, 89, 90, 91, 12, 82, 1229, 1239, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 22, nil, + nil, nil, nil, 713, 11, 52, 335, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, 261, 265, 266, + 267, 268, 278, 279, 273, 274, 269, 270, nil, 254, + 255, nil, nil, 271, 272, nil, 44, nil, nil, 37, + nil, nil, 67, 68, nil, nil, 69, nil, 39, 258, + nil, 264, 51, 260, 259, 256, 257, 277, 276, 262, + 23, 263, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, 275, nil, -265, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 333, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 22, nil, nil, nil, nil, 713, 11, 52, + 335, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, 261, 265, 266, 267, 268, 278, 279, 273, 274, + 269, 270, nil, 254, 255, nil, nil, 271, 272, nil, + 44, nil, nil, 337, nil, nil, 67, 68, nil, nil, + 69, nil, 39, 258, nil, 264, 51, 260, 259, 256, + 257, 277, 276, 262, 23, 263, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, 275, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 333, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 22, nil, nil, nil, + nil, 960, 11, 52, 335, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, 261, 265, 266, 267, 268, + 278, 279, 273, 274, 269, 270, nil, 254, 255, nil, + nil, 271, 272, nil, 44, nil, nil, 337, nil, nil, + 67, 68, nil, nil, 69, nil, 39, 258, nil, 264, + 51, 260, 259, 256, 257, 277, 276, 262, 23, 263, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, 275, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 333, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 22, nil, nil, nil, nil, 991, 11, 52, 335, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, 261, + 265, 266, 267, 268, 278, 279, 273, 274, 269, 270, + nil, 254, 255, nil, nil, 271, 272, nil, 44, nil, + nil, 37, nil, nil, 67, 68, nil, nil, 69, nil, + 39, 258, nil, 264, 51, 260, 259, 256, 257, 277, + 276, 262, 23, 263, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, 275, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 333, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, 1187, 22, 609, 608, 607, nil, 610, + 11, 52, 335, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, 261, 265, 266, 267, 268, 278, 279, + 273, 274, 269, 270, nil, 254, 255, nil, nil, 271, + 272, nil, 44, nil, nil, 37, nil, nil, 67, 68, + nil, nil, 69, nil, 39, 258, nil, 264, 51, 260, + 259, 256, 257, 277, 276, 262, 23, 263, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, 275, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 333, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 52, 335, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, 261, 265, 266, + 267, 268, 278, 279, 273, 274, 269, 270, nil, 254, + 255, nil, nil, 271, 272, nil, 44, nil, nil, 37, + nil, nil, 67, 68, nil, nil, 69, nil, 39, 258, + nil, 264, 51, 260, 259, 256, 257, 277, 276, 262, + 23, 263, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, 239, 275, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 333, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 52, + 335, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, 261, 265, 266, 267, 268, 278, 279, 273, 274, + 269, 270, nil, 254, 255, nil, nil, 271, 272, nil, + 44, nil, nil, 37, nil, nil, 67, 68, nil, nil, + 69, nil, 39, 258, nil, 264, 51, 260, 259, 256, + 257, 277, 276, 262, 23, 263, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, 275, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 333, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 52, 335, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, 261, 265, 266, 267, 268, + 278, 279, 273, 274, 269, 270, nil, 254, 255, nil, + nil, 271, 272, nil, 44, nil, nil, 37, nil, nil, + 67, 68, nil, nil, 69, nil, 39, 258, nil, 264, + 51, 260, 259, 256, 257, 277, 276, 262, 23, 263, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, 275, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 8, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 52, 10, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, 261, + 265, 266, 267, 268, 278, 279, 273, 274, 269, 270, + nil, 254, 255, nil, nil, 271, 272, nil, 44, nil, + nil, 37, nil, nil, 67, 68, nil, nil, 69, nil, + 39, 258, nil, 264, 51, 260, 259, 256, 257, 277, + 276, 262, 23, 263, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, 275, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 333, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 52, 335, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, 261, 265, 266, 267, 268, 278, 279, + 273, 274, 269, 270, nil, 254, 255, nil, nil, 271, + 272, nil, 44, nil, nil, 37, nil, nil, 67, 68, + nil, nil, 69, nil, 39, 258, nil, 264, 51, 260, + 259, 256, 257, 277, 276, 262, 23, 263, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, 275, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 333, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 52, 335, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, 261, 265, 266, + 267, 268, 278, 279, 273, 274, 269, 270, nil, 254, + 255, nil, nil, 271, 272, nil, 44, nil, nil, 37, + nil, nil, 67, 68, nil, nil, 69, nil, 39, 258, + nil, 264, 51, 260, 259, 256, 257, 277, 276, 262, + 23, 263, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, 275, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 333, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 52, + 335, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, 261, 265, 266, 267, 268, 278, 279, 273, 274, + 269, 270, nil, -768, -768, nil, nil, 271, 272, nil, + 44, nil, nil, 37, nil, nil, 67, 68, nil, nil, + 69, nil, 39, 258, nil, 264, 51, 260, 259, 256, + 257, 277, 276, 262, 23, 263, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 333, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 52, 335, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, 261, 265, 266, 267, 268, + 278, 279, 273, 274, 269, 270, nil, -768, -768, nil, + nil, 271, 272, nil, 44, nil, nil, 37, nil, nil, + 67, 68, nil, nil, 69, nil, 39, 258, nil, 264, + 51, 260, 259, 256, 257, 277, 276, 262, 23, 263, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 333, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 52, 335, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, 261, + 265, 266, 267, 268, 278, 279, 273, 274, 269, 270, + nil, -768, -768, nil, nil, 271, 272, nil, 44, nil, + nil, 37, nil, nil, 67, 68, nil, nil, 69, nil, + 39, 258, nil, 264, 51, 260, 259, 256, 257, 277, + 276, 262, 23, 263, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 333, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 52, 335, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, 261, 265, 266, 267, 268, 278, 279, + 273, 274, 269, 270, nil, -768, -768, nil, nil, 271, + 272, nil, 44, nil, nil, 37, nil, nil, 67, 68, + nil, nil, 69, nil, 39, 258, nil, 264, 51, 260, + 259, 256, 257, 277, 276, 262, 23, 263, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 333, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, 612, 22, 609, + 608, 607, nil, 610, 11, 52, 335, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, 261, -768, -768, + -768, -768, 278, 279, nil, 823, -768, -768, nil, nil, + nil, nil, nil, 271, 272, nil, 44, nil, nil, 37, + nil, nil, 67, 68, nil, nil, 69, nil, 39, 258, + nil, 264, 51, 260, 259, 256, 257, 277, 276, 262, + 23, 263, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 333, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, 612, 22, 609, 608, 607, nil, 610, 11, 52, + 335, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, 261, -768, -768, -768, -768, 278, 279, nil, 823, + -768, -768, nil, nil, nil, nil, nil, 271, 272, nil, + 44, nil, nil, 37, nil, nil, 67, 68, nil, nil, + 69, nil, 39, 258, nil, 264, 51, 260, 259, 256, + 257, 277, 276, 262, 23, 263, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 333, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 52, 335, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, 261, -768, -768, -768, -768, + 278, 279, nil, nil, -768, -768, nil, nil, nil, nil, + nil, 271, 272, nil, 44, nil, nil, 37, nil, nil, + 67, 68, nil, nil, 69, nil, 39, 258, nil, 264, + 51, 260, 259, 256, 257, 277, 276, 262, 23, 263, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 333, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 52, 335, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, 261, + -768, -768, -768, -768, 278, 279, nil, nil, -768, -768, + nil, nil, nil, nil, nil, 271, 272, nil, 44, nil, + nil, 37, nil, nil, 67, 68, nil, nil, 69, nil, + 39, 258, nil, 264, 51, 260, 259, 256, 257, 277, + 276, 262, 23, 263, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 333, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 52, 335, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, 261, -768, -768, -768, -768, 278, 279, + nil, nil, -768, -768, nil, nil, nil, nil, nil, 271, + 272, nil, 44, nil, nil, 37, nil, nil, 67, 68, + nil, nil, 69, nil, 39, 258, nil, 264, 51, 260, + 259, 256, 257, 277, 276, 262, 23, 263, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 333, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 52, 335, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, 261, -768, -768, + -768, -768, 278, 279, nil, nil, -768, -768, nil, nil, + nil, nil, nil, 271, 272, nil, 44, nil, nil, 37, + nil, nil, 67, 68, nil, nil, 69, nil, 39, 258, + nil, 264, 51, 260, 259, 256, 257, 277, 276, 262, + 23, 263, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 333, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 52, + 335, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, 261, 265, 266, 267, 268, 278, 279, nil, nil, + 269, 270, nil, nil, nil, nil, nil, 271, 272, nil, + 44, nil, nil, 37, nil, nil, 67, 68, nil, nil, + 69, nil, 39, 258, nil, 264, 51, 260, 259, 256, + 257, 277, 276, 262, 23, 263, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 333, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 22, nil, nil, nil, + nil, nil, 11, 52, 335, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, 261, 265, 266, 267, 268, + 278, 279, 273, nil, 269, 270, nil, nil, nil, nil, + nil, 271, 272, nil, 44, nil, nil, 37, nil, nil, + 67, 68, nil, nil, 69, nil, 39, 258, nil, 264, + 51, 260, 259, 256, 257, 277, 276, 262, 23, 263, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 333, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 52, 335, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, 261, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 271, 272, nil, 44, nil, + nil, 37, nil, nil, 67, 68, nil, nil, 69, nil, + 39, 258, nil, 264, 51, 260, 259, 256, 257, nil, + nil, 262, 23, 263, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 333, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 22, nil, nil, nil, nil, nil, + 11, 52, 335, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, 261, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 271, + 272, nil, 44, nil, nil, 37, nil, nil, 67, 68, + nil, nil, 69, nil, 39, 258, nil, 264, 51, 260, + 259, 256, 257, nil, nil, 262, 23, 263, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 333, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 52, 335, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, 261, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 271, 272, nil, 44, nil, nil, 37, + nil, nil, 67, 68, nil, nil, 69, nil, 39, 258, + nil, 264, 51, 260, 259, 256, 257, nil, nil, nil, + 23, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 333, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 22, nil, nil, nil, nil, nil, 11, 52, + 335, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, 261, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 271, 272, nil, + 44, nil, nil, 37, nil, nil, 67, 68, nil, nil, + 69, nil, 39, 258, nil, 264, 51, 260, 259, 256, + 257, nil, nil, nil, 23, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, 12, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 34, 35, 80, + 81, nil, nil, nil, nil, nil, 92, 32, 31, 122, + 121, 123, 124, nil, nil, 22, nil, nil, nil, nil, + nil, 11, 52, 10, 13, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 44, nil, nil, 37, nil, nil, 67, + 68, nil, nil, 69, nil, 39, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, -452, 114, + 115, nil, nil, 45, 46, -452, -452, -452, nil, nil, + -452, -452, -452, 612, -452, 609, 608, 607, 617, 610, + nil, nil, -452, -452, -452, -452, nil, nil, nil, 620, + nil, nil, nil, nil, -452, -452, nil, -452, -452, -452, + -452, -452, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 615, nil, nil, nil, nil, nil, nil, nil, nil, + 625, 624, 628, 627, nil, -452, -452, -452, -452, -452, + -452, -452, -452, -452, -452, -452, -452, -452, -452, nil, + nil, -452, -452, -452, nil, nil, -452, nil, 304, -452, + nil, nil, -452, -452, nil, -452, 621, -452, nil, -452, + nil, -452, -452, -452, -452, -452, -452, -452, nil, -452, + -452, -452, 612, nil, 609, 608, 607, 617, 610, nil, + nil, nil, nil, nil, -452, -452, nil, -452, 620, -452, + -327, nil, nil, nil, nil, nil, -452, -327, -327, -327, + -452, nil, -327, -327, -327, nil, -327, nil, nil, nil, + 615, nil, nil, nil, -327, nil, -327, -327, nil, 625, + 624, 628, 627, nil, nil, nil, -327, -327, nil, -327, + -327, -327, -327, -327, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 239, nil, nil, + nil, nil, nil, nil, nil, 621, nil, -327, -327, -327, + -327, -327, -327, -327, -327, -327, -327, -327, -327, -327, + -327, nil, nil, -327, -327, -327, nil, nil, -327, nil, + 314, -327, nil, nil, -327, -327, nil, -327, nil, -327, + nil, -327, nil, -327, -327, -327, -327, -327, -327, -327, + nil, -327, nil, -327, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, -327, -327, nil, -327, + nil, -327, 89, 90, 91, nil, 82, nil, -327, nil, + 83, 84, -327, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, 326, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, 323, nil, + 321, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 324, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, 327, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 34, 35, 80, 81, nil, nil, nil, + nil, nil, 92, 32, 31, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 326, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, 323, nil, 321, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 324, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 327, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 326, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, 323, nil, 321, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 324, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 327, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 354, 355, 80, 81, nil, + nil, nil, nil, nil, 92, 349, 357, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 354, 355, + 80, 81, nil, nil, nil, nil, nil, 92, 349, 357, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 354, 355, 80, 81, nil, nil, nil, nil, nil, + 92, 349, 357, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, -311, + 114, 115, nil, nil, 45, 46, -311, -311, -311, nil, + nil, -311, -311, -311, 612, -311, 609, 608, 607, 617, + 610, nil, nil, -311, nil, -311, -311, -311, nil, nil, + 620, 122, 121, 123, 124, -311, -311, nil, -311, -311, + -311, -311, -311, nil, nil, nil, nil, 126, 125, 127, + nil, nil, 615, nil, nil, nil, nil, nil, nil, nil, + 112, 113, nil, 628, 627, 358, -311, -311, -311, -311, + -311, -311, -311, -311, -311, -311, -311, -311, -311, -311, + nil, nil, -311, -311, -311, nil, nil, -311, nil, nil, + -311, nil, nil, -311, -311, nil, -311, 621, -311, nil, + -311, nil, -311, -311, -311, -311, -311, -311, -311, nil, + -311, nil, -311, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, -311, -311, -311, -311, nil, + -311, 93, -311, nil, 97, 104, 106, -311, 114, 115, + -767, -311, 89, 90, 91, 12, 82, -767, -767, -767, + 83, 84, -767, -767, -767, 87, -767, 85, 86, 88, + 34, 35, 80, 81, -767, -767, -767, -767, nil, 92, + 32, 31, 122, 121, 123, 124, -767, -767, 22, -767, + -767, -767, -767, -767, 11, 52, nil, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, -767, -767, -767, + -767, -767, -767, -767, -767, -767, -767, -767, -767, -767, + -767, nil, nil, -767, -767, -767, 44, nil, -767, 37, + 304, -767, 67, 68, -767, -767, 69, -767, 39, -767, + nil, -767, 51, -767, -767, -767, -767, -767, -767, -767, + 23, -767, -767, -767, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, -767, -767, nil, -767, + nil, -767, 93, nil, nil, 97, 104, 106, -767, 114, + 115, nil, -767, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 326, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, 323, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 324, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 327, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 34, + 35, 80, 81, nil, nil, nil, nil, nil, 92, 32, + 31, 122, 121, 123, 124, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, 134, nil, + nil, nil, nil, 133, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + 12, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 22, nil, nil, nil, nil, nil, 11, + 52, 10, 13, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 44, nil, nil, 37, nil, nil, 67, 68, nil, + nil, 69, nil, 39, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, 442, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 34, 35, 80, 81, nil, nil, nil, nil, nil, + 92, 32, 31, 122, 121, 123, 124, nil, nil, 22, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 34, 35, 80, + 81, nil, nil, nil, nil, nil, 92, 32, 31, 122, + 121, 123, 124, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 22, nil, + nil, nil, nil, nil, 11, 52, nil, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 44, nil, nil, 37, + nil, nil, 67, 68, nil, nil, 69, nil, 39, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 34, 35, 80, 81, nil, nil, nil, + nil, nil, 92, 32, 31, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, 459, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, 459, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 34, + 35, 80, 81, nil, nil, nil, nil, nil, 92, 32, + 31, 122, 121, 123, 124, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 22, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 326, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, 323, nil, 321, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 324, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 327, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 34, 35, 80, 81, nil, nil, nil, nil, nil, + 92, 32, 31, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 34, 35, 80, + 81, nil, nil, nil, nil, nil, 92, 32, 31, 122, + 121, 123, 124, nil, nil, 22, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, 239, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 354, 355, 80, 81, nil, + nil, nil, nil, nil, 92, 349, 357, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 354, 355, + 80, 81, nil, nil, nil, nil, nil, 92, 349, 357, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 354, 355, 80, 81, nil, nil, nil, nil, nil, + 92, 349, 357, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 354, 355, 80, 81, nil, nil, + nil, nil, nil, 92, 349, 357, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 354, 355, 80, 81, nil, + nil, nil, nil, nil, 92, 349, 357, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 354, 355, + 80, 81, nil, nil, nil, nil, nil, 92, 349, 357, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 354, 355, 80, 81, nil, nil, nil, nil, nil, + 92, 349, 357, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 354, 355, 80, 81, nil, nil, + nil, nil, nil, 92, 349, 357, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 326, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + 323, nil, 321, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 324, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 327, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 544, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 326, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, 323, nil, 321, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 109, 324, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 327, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 326, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, 323, nil, 321, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 324, 101, 102, 103, 105, nil, + nil, nil, 100, 110, 239, nil, nil, nil, nil, nil, + 93, nil, 327, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 354, 355, 80, 81, nil, nil, nil, nil, nil, + 92, 349, 357, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 354, 355, 80, 81, nil, nil, + nil, nil, nil, 92, 349, 357, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, 12, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 34, 35, 80, 81, nil, nil, nil, + nil, nil, 92, 32, 31, 122, 121, 123, 124, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 52, nil, + 13, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 44, + nil, nil, 37, nil, nil, 67, 68, nil, nil, 69, + nil, 39, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, 591, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 326, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 324, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 327, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 22, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 354, 355, 80, 81, nil, nil, nil, nil, nil, + 92, 349, 357, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, -745, + 114, 115, nil, nil, 45, 46, -745, -745, -745, nil, + nil, -745, -745, -745, 612, -745, 609, 608, 607, 617, + 610, nil, nil, -745, -745, -745, -745, -745, nil, nil, + 620, nil, nil, nil, nil, -745, -745, nil, -745, -745, + -745, -745, -745, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 615, nil, nil, nil, nil, nil, nil, nil, + nil, 625, 624, 628, 627, nil, -745, -745, -745, -745, + -745, -745, -745, -745, -745, -745, -745, -745, -745, -745, + nil, nil, -745, -745, -745, nil, nil, -745, nil, nil, + -745, nil, nil, -745, -745, nil, -745, 621, -745, nil, + -745, nil, -745, -745, -745, -745, -745, -745, -745, nil, + -745, -745, -745, 612, nil, 609, 608, 607, 617, 610, + nil, nil, nil, nil, nil, -745, -745, -745, -745, 620, + -745, -746, -745, nil, nil, nil, nil, -745, -746, -746, + -746, -745, nil, -746, -746, -746, nil, -746, nil, nil, + nil, 615, nil, nil, nil, -746, -746, -746, -746, -746, + nil, nil, 628, 627, nil, nil, nil, -746, -746, nil, + -746, -746, -746, -746, -746, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 621, nil, -746, -746, + -746, -746, -746, -746, -746, -746, -746, -746, -746, -746, + -746, -746, nil, nil, -746, -746, -746, nil, nil, -746, + nil, nil, -746, nil, nil, -746, -746, nil, -746, nil, + -746, nil, -746, nil, -746, -746, -746, -746, -746, -746, + -746, nil, -746, -746, -746, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, -746, -746, -746, + -746, nil, -746, nil, -746, nil, 89, 90, 91, -746, + 82, nil, nil, -746, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + 326, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, 323, nil, 321, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 109, + 324, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, 327, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 22, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, -767, 114, 115, nil, nil, 45, + 46, -767, -767, -767, nil, nil, -767, -767, -767, nil, + -767, 122, 121, 123, 124, nil, nil, nil, -767, -767, + -767, nil, nil, nil, nil, nil, nil, 126, 125, 127, + -767, -767, nil, -767, -767, -767, -767, -767, nil, nil, + 112, 113, nil, nil, nil, 358, nil, nil, nil, nil, + nil, 612, nil, 609, 608, 607, 617, 610, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 620, nil, nil, + nil, nil, -767, nil, nil, nil, nil, nil, nil, -767, + nil, nil, nil, nil, 304, -767, nil, nil, nil, 615, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + 628, 627, nil, 100, 110, nil, -767, -767, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + -767, nil, 89, 90, 91, -767, 82, nil, nil, nil, + 83, 84, -767, nil, 621, 87, -767, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 326, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, 781, nil, 321, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 324, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 327, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 326, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, 321, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 324, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 327, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 34, 35, 80, 81, nil, nil, nil, nil, + nil, 92, 32, 31, 122, 121, 123, 124, nil, nil, + 22, nil, nil, nil, nil, nil, 11, 52, 335, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 44, nil, + nil, 37, nil, nil, 67, 68, nil, nil, 69, nil, + 39, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, 442, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 326, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, 323, nil, 321, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 109, 324, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 327, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 354, 355, + 80, 81, nil, nil, nil, nil, nil, 92, 349, 357, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 354, 355, 80, 81, nil, nil, nil, nil, nil, + 92, 349, 357, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 22, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 23, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 326, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, 781, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 324, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 327, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, 326, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 324, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, 327, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + 857, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 326, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, 323, nil, 321, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 109, 324, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 327, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 326, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, 323, nil, 321, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 324, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 327, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, 12, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 34, 35, 80, 81, nil, nil, nil, nil, nil, + 92, 32, 31, 122, 121, 123, 124, nil, nil, 22, + nil, nil, nil, nil, nil, 11, 52, nil, 13, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 44, nil, nil, + 37, nil, nil, 67, 68, nil, nil, 69, nil, 39, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 23, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 354, 355, 80, 81, nil, nil, + nil, nil, nil, 92, 349, 357, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, 886, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 34, 35, 80, + 81, nil, nil, nil, nil, nil, 92, 32, 31, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, 326, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, 323, nil, + 321, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 324, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, 327, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, 12, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 34, 35, 80, 81, nil, nil, nil, + nil, nil, 92, 32, 31, 122, 121, 123, 124, nil, + nil, 22, nil, nil, nil, nil, nil, 11, 52, nil, + 13, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 44, + nil, nil, 37, nil, nil, 67, 68, nil, nil, 69, + nil, 39, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, 326, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, 781, nil, 321, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 324, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, 327, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 326, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, 321, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 324, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 327, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 34, 35, + 80, 81, nil, nil, nil, nil, nil, 92, 32, 31, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 34, 35, 80, 81, nil, nil, nil, nil, nil, + 92, 32, 31, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 34, 35, 80, 81, nil, nil, + nil, nil, nil, 92, 32, 31, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, 326, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, 781, nil, 321, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 324, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, 327, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 544, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, 459, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 354, 355, + 80, 81, nil, nil, nil, nil, nil, 92, 349, 357, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 34, 35, 80, 81, nil, nil, nil, nil, nil, + 92, 32, 31, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 354, 355, 80, 81, nil, nil, + nil, nil, nil, 92, 349, 357, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 249, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 52, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 48, 49, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 244, nil, nil, 250, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, nil, nil, nil, 249, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 45, 46, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 52, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 48, 49, 47, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 244, nil, + nil, 250, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 51, nil, nil, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 45, 46, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 34, 35, 80, 81, nil, + nil, nil, nil, nil, 92, 32, 31, 122, 121, 123, + 124, nil, nil, 22, nil, nil, nil, nil, nil, nil, + 52, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 48, + 49, 47, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 45, 46, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 354, 355, + 80, 81, nil, nil, nil, nil, nil, 92, 349, 357, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 52, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 48, 49, 47, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 244, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, 1114, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 45, 46, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 354, 355, 80, 81, nil, nil, nil, nil, nil, + 92, 349, 357, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 52, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, 326, 120, 128, + 129, nil, 112, 113, nil, 48, 49, 47, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 250, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, 321, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 109, 324, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, 327, 97, 104, 106, nil, + 114, 115, nil, nil, 45, 46, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 354, 355, 80, 81, nil, nil, + nil, nil, nil, 92, 349, 357, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 52, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 48, 49, + 47, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 244, nil, nil, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 249, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 45, 46, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 52, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 48, 49, 47, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 51, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 45, 46, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 34, 35, 80, 81, nil, nil, nil, nil, nil, 92, + 32, 31, 122, 121, 123, 124, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 52, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 48, 49, 47, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 250, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 51, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 45, 46, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 34, 35, 80, 81, nil, nil, nil, + nil, nil, 92, 32, 31, 122, 121, 123, 124, nil, + nil, 22, nil, nil, nil, nil, nil, nil, 52, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 48, 49, 47, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 244, + nil, nil, 250, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, + nil, nil, nil, 23, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 45, 46, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 34, 35, 80, 81, + nil, nil, nil, nil, nil, 92, 32, 31, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 52, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 326, 120, 128, 129, nil, 112, 113, nil, + 48, 49, 47, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 244, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, 323, nil, 321, nil, 51, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, nil, + nil, 109, 324, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 327, 97, 104, 106, nil, 114, 115, nil, nil, 45, + 46, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 350, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, nil, nil, 358, nil, nil, nil, nil, + nil, 612, nil, 609, 608, 607, 617, 610, nil, nil, + nil, nil, nil, nil, nil, 346, nil, 620, 342, nil, + nil, 67, 68, nil, nil, 69, nil, 341, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 615, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + 628, 627, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, 621, 85, 86, 88, 354, 355, + 80, 81, nil, nil, nil, nil, nil, 92, 349, 357, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 350, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, nil, nil, 358, nil, nil, nil, nil, nil, + 612, nil, 609, 608, 607, 617, 610, nil, nil, nil, + nil, nil, nil, nil, 346, nil, 620, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 615, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, 628, + 627, nil, 100, 110, nil, nil, nil, 360, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, 621, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 350, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, nil, nil, 358, nil, nil, nil, nil, nil, 612, + nil, 609, 608, 607, 617, 610, nil, nil, nil, nil, + nil, nil, nil, 401, nil, 620, 37, nil, nil, 67, + 68, nil, nil, 69, nil, 39, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 615, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, 628, 627, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, 621, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 350, nil, nil, 126, 125, 127, 406, 65, 118, + 117, 407, nil, 120, 128, 129, nil, 112, 113, nil, + nil, nil, 358, nil, nil, nil, nil, nil, 612, nil, + 609, 608, 607, 617, 610, nil, nil, nil, nil, 413, + nil, nil, 408, nil, 620, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 615, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, 628, 627, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, 621, 85, 86, 88, 354, 355, 80, 81, nil, + nil, nil, nil, nil, 92, 349, 357, 122, 121, 123, + 124, nil, nil, 251, nil, nil, nil, nil, nil, nil, + 350, nil, nil, 126, 125, 127, 406, 65, 118, 117, + 407, nil, 120, 128, 129, nil, 112, 113, nil, nil, + nil, 358, nil, nil, nil, nil, nil, 612, nil, 609, + 608, 607, 617, 610, nil, nil, nil, nil, nil, nil, + nil, 408, nil, 620, 250, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 615, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, 628, 627, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + 621, 85, 86, 88, 354, 355, 80, 81, nil, nil, + nil, nil, nil, 92, 349, 357, 122, 121, 123, 124, + nil, nil, 251, nil, nil, nil, nil, nil, nil, 350, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, nil, nil, + 358, nil, nil, nil, nil, nil, 612, nil, 609, 608, + 607, 617, 610, nil, nil, nil, nil, nil, nil, nil, + 346, nil, 620, 250, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 615, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, 628, 627, nil, 100, 110, + nil, nil, nil, 573, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, 621, + 85, 86, 88, 354, 355, 80, 81, nil, nil, nil, + nil, nil, 92, 349, 357, 122, 121, 123, 124, nil, + nil, 251, nil, nil, nil, nil, nil, nil, 350, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, nil, nil, 358, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 346, + nil, nil, 342, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 354, 355, 80, 81, nil, nil, nil, nil, + nil, 92, 349, 357, 122, 121, 123, 124, nil, nil, + 251, nil, nil, nil, nil, nil, nil, 350, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, nil, nil, 358, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 346, nil, + nil, 342, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 354, 355, 80, 81, nil, nil, nil, nil, nil, + 92, 349, 357, 122, 121, 123, 124, nil, nil, 251, + nil, nil, nil, nil, nil, nil, 350, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, nil, nil, 358, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 346, nil, nil, + 342, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 354, 355, 80, 81, nil, nil, nil, nil, nil, 92, + 349, 357, 122, 121, 123, 124, nil, nil, 251, nil, + nil, nil, nil, nil, nil, 350, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, nil, nil, 358, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 346, nil, nil, 342, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 354, + 355, 80, 81, nil, nil, nil, nil, nil, 92, 349, + 357, 122, 121, 123, 124, nil, nil, 251, nil, nil, + nil, nil, nil, nil, 350, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, nil, nil, 358, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 346, nil, nil, 342, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 354, 355, + 80, 81, nil, nil, nil, nil, nil, 92, 349, 357, + 122, 121, 123, 124, nil, nil, 251, nil, nil, nil, + nil, nil, nil, 350, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, nil, nil, 358, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1157, nil, nil, 250, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 354, 355, 80, + 81, nil, nil, nil, nil, nil, 92, 349, 357, 122, + 121, 123, 124, nil, nil, 251, nil, nil, nil, nil, + nil, nil, 350, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, nil, nil, 358, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1164, nil, nil, 250, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 354, 355, 80, 81, + nil, nil, nil, nil, nil, 92, 349, 357, 122, 121, + 123, 124, nil, nil, 251, nil, nil, nil, nil, nil, + nil, 350, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + nil, nil, 358, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1157, nil, nil, 250, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, 192, 203, 193, + 216, 189, 209, 199, 198, 219, 220, 214, 197, 196, + 191, 217, 221, 222, 201, 190, 204, 208, 210, 202, + 195, nil, nil, nil, 211, 218, 213, 212, 205, 215, + 200, 188, 207, 206, nil, nil, nil, nil, nil, 187, + 194, 185, 186, 182, 183, 184, 145, 147, 144, nil, + 146, nil, nil, nil, nil, nil, nil, nil, nil, 177, + 178, nil, 173, 155, 156, 157, 164, 161, 163, nil, + nil, 158, 159, nil, nil, nil, 179, 180, 165, 166, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 170, 169, nil, 154, 176, 172, 171, + 167, 168, 162, 160, 152, 175, 153, nil, nil, 181, + 109, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 110, nil, nil, nil, nil, nil, nil, nil, nil, 174, + 192, 203, 193, 216, 189, 209, 199, 198, 219, 220, + 214, 197, 196, 191, 217, 221, 222, 201, 190, 204, + 208, 210, 202, 195, nil, nil, nil, 211, 218, 213, + 212, 205, 215, 200, 188, 207, 206, nil, nil, nil, + nil, nil, 187, 194, 185, 186, 182, 183, 184, 145, + 147, nil, nil, 146, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, nil, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, 109, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 110, nil, nil, nil, nil, nil, nil, + nil, nil, 174, 192, 203, 193, 216, 189, 209, 199, + 198, 219, 220, 214, 197, 196, 191, 217, 221, 222, + 201, 190, 204, 208, 210, 202, 195, nil, nil, nil, + 211, 218, 213, 291, 290, 292, 289, 188, 207, 206, + nil, nil, nil, nil, nil, 187, 194, 185, 186, 286, + 287, 288, 284, 147, 118, 117, 285, nil, 120, nil, + nil, nil, nil, nil, nil, 177, 178, nil, 173, 155, + 156, 157, 164, 161, 163, nil, nil, 158, 159, nil, + nil, nil, 179, 180, 165, 166, nil, nil, nil, nil, + nil, 296, nil, nil, nil, nil, nil, nil, nil, 170, + 169, nil, 154, 176, 172, 171, 167, 168, 162, 160, + 152, 175, 153, nil, nil, 181, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 174, 192, 203, 193, 216, + 189, 209, 199, 198, 219, 220, 214, 197, 196, 191, + 217, 221, 222, 201, 190, 204, 208, 210, 202, 195, + nil, nil, nil, 211, 218, 213, 212, 205, 215, 200, + 188, 207, 206, nil, nil, nil, nil, nil, 187, 194, + 185, 186, 182, 183, 184, 145, 147, 439, 438, 146, + nil, 440, nil, nil, nil, nil, nil, nil, 177, 178, + nil, 173, 155, 156, 157, 164, 161, 163, nil, nil, + 158, 159, nil, nil, nil, 179, 180, 165, 166, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 170, 169, nil, 154, 176, 172, 171, 167, + 168, 162, 160, 152, 175, 153, nil, nil, 181, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 174, 192, + 203, 193, 216, 189, 209, 199, 198, 219, 220, 214, + 197, 196, 191, 217, 221, 222, 201, 190, 204, 208, + 210, 202, 195, nil, nil, nil, 211, 218, 213, 212, + 205, 215, 200, 188, 207, 206, nil, nil, nil, nil, + nil, 187, 194, 185, 186, 182, 183, 184, 145, 147, + nil, nil, 146, nil, nil, nil, nil, nil, nil, nil, + nil, 177, 178, nil, 173, 155, 156, 157, 164, 161, + 163, nil, nil, 158, 159, nil, nil, nil, 179, 180, + 165, 166, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 170, 169, nil, 154, 176, + 172, 171, 167, 168, 162, 160, 152, 175, 153, nil, + nil, 181, 109, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 110, nil, nil, nil, nil, nil, nil, nil, + nil, 174, 192, 203, 193, 216, 189, 209, 199, 198, + 219, 220, 214, 197, 196, 191, 217, 221, 222, 201, + 190, 204, 208, 210, 202, 195, nil, nil, nil, 211, + 218, 213, 212, 205, 215, 200, 188, 207, 206, nil, + nil, nil, nil, nil, 187, 194, 185, 186, 182, 183, + 184, 145, 147, nil, nil, 146, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, nil, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, 109, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 110, nil, nil, nil, nil, + nil, nil, nil, nil, 174, 192, 203, 193, 216, 189, + 209, 199, 198, 219, 220, 214, 197, 196, 191, 217, + 221, 222, 201, 190, 204, 208, 210, 202, 195, nil, + nil, nil, 211, 218, 213, 212, 205, 215, 200, 188, + 207, 206, nil, nil, nil, nil, nil, 187, 194, 185, + 186, 182, 183, 184, 145, 147, nil, nil, 146, nil, + nil, nil, nil, nil, nil, nil, nil, 177, 178, nil, + 173, 155, 156, 157, 164, 161, 163, nil, nil, 158, + 159, nil, nil, nil, 179, 180, 165, 166, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 169, nil, 154, 176, 172, 171, 167, 168, + 162, 160, 152, 175, 153, nil, nil, 181, nil, nil, + nil, nil, 122, 121, 123, 124, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 174, 126, 125, + 127, 758, nil, nil, nil, 761, nil, nil, nil, nil, + nil, 112, 113, nil, nil, nil, 358, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 760, nil, nil, 742, + nil, nil, nil, 740, nil, nil, 741, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 759, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 746, 747, 122, 121, 123, 124, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 126, 125, 127, 758, nil, nil, nil, 761, nil, + nil, nil, nil, nil, 112, 113, nil, nil, nil, 358, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 760, + nil, nil, 742, nil, nil, nil, 740, nil, nil, 741, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 759, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 746, 747, 122, 121, + 123, 124, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 126, 125, 127, 758, nil, nil, + nil, 761, nil, nil, nil, nil, nil, 112, 113, nil, + nil, nil, 358, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 760, nil, nil, 742, nil, nil, nil, 740, + nil, nil, 741, nil, 926, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 759, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, 239, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 746, + 747, 122, 121, 123, 124, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 126, 125, 127, + 758, nil, nil, nil, 761, nil, nil, nil, nil, nil, + 112, 113, nil, nil, nil, 358, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 760, nil, nil, 742, nil, + nil, nil, 740, nil, nil, 741, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 759, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 746, 747, 122, 121, 123, 124, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 126, 125, 127, 758, nil, nil, nil, 761, 1042, nil, + nil, nil, nil, 112, 113, nil, nil, nil, 358, 620, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 760, nil, + nil, 742, nil, nil, nil, 740, nil, nil, 741, nil, + 926, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 759, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 621, 97, 104, 106, + nil, 114, 115, nil, nil, 746, 747, 122, 121, 123, + 124, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 126, 125, 127, 758, nil, nil, nil, + 761, 1042, nil, nil, nil, nil, 112, 113, nil, nil, + nil, 358, 620, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 760, nil, nil, 742, nil, nil, nil, 740, nil, + nil, 741, nil, 926, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 759, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 621, + 97, 104, 106, nil, 114, 115, nil, nil, 746, 747, + 122, 121, 123, 124, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 126, 125, 127, 758, + nil, nil, nil, 761, nil, nil, nil, nil, nil, 112, + 113, nil, nil, nil, 358, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 760, nil, nil, 742, nil, nil, + nil, 740, nil, nil, 741, nil, 1054, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 759, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 746, 747, 122, 121, 123, 124, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 126, + 125, 127, 758, nil, nil, nil, 761, nil, nil, nil, + nil, nil, 112, 113, nil, nil, nil, 358, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 760, nil, nil, + 742, nil, nil, nil, 740, nil, nil, 741, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 759, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 746, 747, 122, 121, 123, 124, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 126, 125, 127, 758, nil, nil, nil, 761, + 1042, nil, nil, nil, nil, 112, 113, nil, nil, nil, + 358, 620, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 760, nil, nil, 742, nil, nil, nil, 740, nil, nil, + 741, nil, 926, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 759, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, 621, 97, + 104, 106, nil, 114, 115, nil, nil, 746, 747, 122, + 121, 123, 124, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 126, 125, 127, 758, nil, + nil, nil, 761, nil, nil, nil, nil, nil, 112, 113, + nil, nil, nil, 358, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 760, nil, nil, 742, nil, nil, nil, + 740, nil, nil, 741, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 759, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 746, 747, 122, 121, 123, 124, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 126, 125, + 127, 758, nil, nil, nil, 761, nil, nil, nil, nil, + nil, 112, 113, nil, nil, nil, 358, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 760, nil, nil, 742, + nil, nil, nil, 740, nil, nil, 741, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 759, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 746, 747, 122, 121, 123, 124, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 126, 125, 127, 758, nil, nil, nil, 761, nil, + nil, nil, nil, nil, 112, 113, nil, nil, nil, 358, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 760, + nil, nil, 742, nil, nil, nil, 740, nil, nil, 741, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 759, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 746, 747, 122, 121, + 123, 124, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 126, 125, 127, 758, nil, nil, + nil, 761, nil, nil, nil, nil, nil, 112, 113, nil, + nil, nil, 358, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 760, nil, nil, 742, nil, nil, nil, 740, + nil, nil, 741, nil, 926, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 759, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 746, + 747, 122, 121, 123, 124, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 126, 125, 127, + 758, nil, nil, nil, 761, nil, nil, nil, nil, nil, + 112, 113, nil, nil, nil, 358, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 760, nil, nil, 742, nil, + nil, nil, 740, nil, nil, 741, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 759, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 746, 747, 122, 121, 123, 124, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 126, 125, 127, 758, nil, nil, nil, 761, nil, nil, + nil, nil, nil, 112, 113, nil, nil, nil, 358, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 760, nil, + nil, 742, nil, nil, nil, 740, nil, nil, 741, nil, + 926, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 759, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 746, 747, 122, 121, 123, + 124, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 126, 125, 127, 758, nil, nil, nil, + 761, nil, nil, nil, nil, nil, 112, 113, nil, nil, + nil, 358, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 760, nil, nil, 742, nil, nil, nil, 740, nil, + nil, 741, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 759, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 746, 747, + 122, 121, 123, 124, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 126, 125, 127, 758, + nil, nil, nil, 761, nil, nil, nil, nil, nil, 112, + 113, nil, nil, nil, 358, nil, nil, nil, nil, nil, + nil, nil, 122, 121, 123, 124, nil, nil, nil, nil, + nil, nil, nil, nil, 760, nil, nil, 742, 126, 125, + 127, 740, nil, nil, 741, nil, nil, nil, nil, nil, + nil, 112, 113, nil, nil, nil, 358, nil, nil, 759, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 746, 747, nil, nil, 612, nil, 609, 608, 607, + 617, 610, nil, nil, nil, 109, 99, 101, 102, 103, + 105, 620, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, 612, 615, 609, 608, 607, 617, 610, nil, + nil, nil, 625, 624, 628, 627, nil, nil, 620, 612, + nil, 609, 608, 607, 617, 610, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 620, nil, nil, nil, nil, + 615, nil, nil, nil, nil, nil, nil, nil, 621, 625, + 624, 628, 627, nil, nil, nil, nil, 615, 606, nil, + nil, 482, 486, nil, nil, 483, 625, 624, 628, 627, + nil, nil, nil, nil, 177, 178, nil, 173, 155, 156, + 157, 164, 161, 163, nil, 621, 158, 159, nil, nil, + nil, 179, 180, 165, 166, 606, nil, nil, nil, nil, + 304, nil, 621, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, nil, nil, nil, nil, 489, + 493, nil, nil, 488, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, 174, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, 304, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, nil, nil, nil, nil, 540, 486, nil, + nil, 541, nil, nil, nil, nil, nil, nil, nil, nil, + 177, 178, 174, 173, 155, 156, 157, 164, 161, 163, + nil, nil, 158, 159, nil, nil, nil, 179, 180, 165, + 166, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 170, 169, nil, 154, 176, 172, + 171, 167, 168, 162, 160, 152, 175, 153, nil, nil, + 181, nil, nil, nil, nil, 729, 486, nil, nil, 730, + nil, nil, nil, nil, nil, nil, nil, nil, 177, 178, + 174, 173, 155, 156, 157, 164, 161, 163, nil, nil, + 158, 159, nil, nil, nil, 179, 180, 165, 166, nil, + nil, nil, nil, nil, 304, nil, nil, nil, nil, nil, + nil, nil, 170, 169, nil, 154, 176, 172, 171, 167, + 168, 162, 160, 152, 175, 153, nil, nil, 181, nil, + nil, nil, nil, 731, 493, nil, nil, 732, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, 174, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, 304, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, nil, 181, nil, nil, nil, + nil, 792, 486, nil, nil, 793, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, 174, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + 304, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, nil, nil, nil, nil, 795, + 493, nil, nil, 796, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, 174, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, 304, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, nil, nil, nil, nil, 729, 486, nil, + nil, 730, nil, nil, nil, nil, nil, nil, nil, nil, + 177, 178, 174, 173, 155, 156, 157, 164, 161, 163, + nil, nil, 158, 159, nil, nil, nil, 179, 180, 165, + 166, nil, nil, nil, nil, nil, 304, nil, nil, nil, + nil, nil, nil, nil, 170, 169, nil, 154, 176, 172, + 171, 167, 168, 162, 160, 152, 175, 153, nil, nil, + 181, nil, nil, nil, nil, 731, 493, nil, nil, 732, + nil, nil, nil, nil, nil, nil, nil, nil, 177, 178, + 174, 173, 155, 156, 157, 164, 161, 163, nil, nil, + 158, 159, nil, nil, nil, 179, 180, 165, 166, nil, + nil, nil, nil, nil, 304, nil, nil, nil, nil, nil, + nil, nil, 170, 169, nil, 154, 176, 172, 171, 167, + 168, 162, 160, 152, 175, 153, nil, nil, 181, nil, + nil, nil, nil, 860, 486, nil, nil, 861, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, 174, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, 304, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, nil, 181, nil, nil, nil, + nil, 862, 493, nil, nil, 863, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, 174, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + 304, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, nil, nil, nil, nil, 865, + 493, nil, nil, 866, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, 174, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, 304, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, nil, nil, nil, nil, 540, 486, nil, + nil, 541, nil, nil, nil, nil, nil, nil, nil, nil, + 177, 178, 174, 173, 155, 156, 157, 164, 161, 163, + nil, nil, 158, 159, nil, nil, nil, 179, 180, 165, + 166, nil, nil, nil, nil, nil, 304, nil, nil, nil, + nil, nil, nil, nil, 170, 169, nil, 154, 176, 172, + 171, 167, 168, 162, 160, 152, 175, 153, nil, nil, + 181, nil, nil, nil, nil, 888, 486, nil, nil, 889, + nil, nil, nil, nil, nil, nil, nil, nil, 177, 178, + 174, 173, 155, 156, 157, 164, 161, 163, nil, nil, + 158, 159, nil, nil, nil, 179, 180, 165, 166, nil, + nil, nil, nil, nil, 304, nil, nil, nil, nil, nil, + nil, nil, 170, 169, nil, 154, 176, 172, 171, 167, + 168, 162, 160, 152, 175, 153, nil, nil, 181, nil, + nil, nil, nil, 891, 493, nil, nil, 890, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, 174, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, 304, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, 612, 181, 609, 608, 607, + 617, 610, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 620, nil, nil, nil, nil, 174, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 615, 1243, 493, nil, nil, 1242, nil, + nil, nil, 625, 624, 628, 627, nil, 177, 178, nil, + 173, 155, 156, 157, 164, 161, 163, nil, nil, 158, + 159, nil, nil, nil, 179, 180, 165, 166, nil, nil, + nil, nil, nil, 304, nil, nil, nil, nil, 621, nil, + nil, 170, 169, nil, 154, 176, 172, 171, 167, 168, + 162, 160, 152, 175, 153, nil, nil, 181, nil, nil, + nil, nil, 1246, 486, nil, nil, 1247, nil, nil, nil, + nil, nil, nil, nil, nil, 177, 178, 174, 173, 155, + 156, 157, 164, 161, 163, nil, nil, 158, 159, nil, + nil, nil, 179, 180, 165, 166, nil, nil, nil, nil, + nil, 304, nil, nil, nil, nil, nil, nil, nil, 170, + 169, nil, 154, 176, 172, 171, 167, 168, 162, 160, + 152, 175, 153, nil, nil, 181, nil, nil, nil, nil, + 1248, 493, nil, nil, 1249, nil, nil, nil, nil, nil, + nil, nil, nil, 177, 178, 174, 173, 155, 156, 157, + 164, 161, 163, nil, nil, 158, 159, nil, nil, nil, + 179, 180, 165, 166, nil, nil, nil, nil, nil, 304, + nil, nil, nil, nil, nil, nil, nil, 170, 169, nil, + 154, 176, 172, 171, 167, 168, 162, 160, 152, 175, + 153, nil, 612, 181, 609, 608, 607, 617, 610, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 620, nil, + nil, nil, nil, 174, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 615, nil, nil, nil, nil, nil, nil, nil, nil, 625, + 624, 628, 627, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 621 ] + +racc_action_check = [ + 116, 430, 433, 70, 390, 398, 769, 116, 116, 116, + 498, 498, 116, 116, 116, 792, 116, 399, 1054, 793, + 391, 1084, 765, 765, 116, 918, 116, 116, 116, 802, + 802, 408, 1, 622, 1043, 408, 116, 116, 28, 116, + 116, 116, 116, 116, 787, 28, 741, 1104, 402, 795, + 662, 622, 1043, 860, 861, 1107, 760, 1109, 3, 741, + 760, 787, 873, 957, 430, 433, 918, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 858, 792, 116, 116, 116, 793, 116, 116, 652, + 70, 116, 1007, 769, 116, 116, 1054, 116, 1109, 116, + 498, 116, 28, 116, 116, 116, 116, 116, 116, 116, + 398, 116, 765, 116, 927, 795, 795, 792, 390, 802, + 792, 793, 399, 390, 793, 927, 116, 116, 116, 116, + 957, 116, 1161, 116, 391, 1084, 119, 792, 116, 391, + 1084, 793, 116, 119, 119, 119, 116, 1162, 119, 119, + 119, 795, 119, 402, 795, 662, 1165, 1212, 860, 861, + 119, 1104, 119, 119, 119, 957, 1104, 873, 957, 1107, + 1246, 795, 119, 119, 1107, 119, 119, 119, 119, 119, + 1247, 1248, 1128, 1259, 13, 957, 862, 863, 767, 652, + 30, 242, 927, 1128, 652, 858, 421, 1007, 858, 421, + 858, 914, 22, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 53, 351, 119, + 119, 119, 767, 119, 119, 47, 47, 119, 358, 358, + 119, 119, 914, 119, 243, 119, 15, 119, 22, 119, + 119, 119, 119, 119, 119, 119, 1161, 119, 1249, 119, + 242, 1161, 862, 863, 54, 30, 561, 421, 421, 1248, + 1128, 1162, 119, 119, 119, 119, 1162, 119, 689, 119, + 1165, 1212, 488, 53, 119, 1165, 1212, 30, 119, 488, + 488, 488, 119, 351, 1246, 488, 488, 813, 488, 1246, + 1142, 862, 863, 243, 1247, 1248, 488, 1259, 813, 1247, + 1248, 1142, 1259, 47, 47, 351, 358, 358, 488, 488, + 54, 488, 488, 488, 488, 488, 804, 561, 561, 561, + 19, 283, 804, 245, 951, 692, 1249, 19, 283, 689, + 689, 813, 813, 16, 1142, 1142, 19, 561, 689, 488, + 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, + 488, 488, 488, 18, 466, 488, 488, 488, 951, 488, + 488, 504, 1249, 488, 729, 813, 488, 1249, 1142, 20, + 42, 488, 1115, 488, 1115, 488, 488, 488, 488, 488, + 488, 488, 245, 488, 19, 488, 692, 692, 377, 55, + 377, 377, 377, 377, 377, 692, 55, 730, 488, 488, + 43, 488, 26, 488, 377, 55, 417, 888, 489, 1252, + 488, 20, 42, 466, 488, 489, 489, 489, 488, 1252, + 504, 489, 489, 729, 489, 41, 377, 284, 20, 42, + 362, 482, 489, 489, 284, 377, 377, 377, 377, 241, + 17, 17, 43, 419, 489, 489, 241, 489, 489, 489, + 489, 489, 96, 55, 343, 241, 730, 285, 344, 43, + 96, 343, 424, 44, 285, 344, 888, 417, 417, 417, + 343, 377, 362, 482, 344, 489, 489, 489, 489, 489, + 489, 489, 489, 489, 489, 489, 489, 489, 489, 362, + 482, 489, 489, 489, 286, 489, 489, 389, 389, 489, + 427, 286, 489, 241, 419, 419, 419, 489, 889, 489, + 52, 489, 489, 489, 489, 489, 489, 489, 343, 489, + 489, 489, 344, 424, 424, 424, 415, 103, 415, 415, + 415, 415, 415, 345, 489, 489, 483, 489, 287, 489, + 345, 435, 415, 104, 731, 287, 489, 910, 714, 345, + 489, 731, 731, 731, 489, 917, 731, 731, 731, 917, + 731, 427, 427, 427, 415, 415, 1026, 889, 731, 731, + 731, 731, 731, 415, 415, 415, 415, 105, 483, 106, + 731, 731, 347, 731, 731, 731, 731, 731, 5, 347, + 714, 739, 288, 5, 363, 483, 739, 345, 347, 288, + 739, 363, 435, 435, 435, 384, 910, 714, 384, 415, + 363, 731, 731, 731, 731, 731, 731, 731, 731, 731, + 731, 731, 731, 731, 731, 1026, 655, 731, 731, 731, + 289, 731, 731, 290, 655, 731, 142, 289, 731, 731, + 290, 731, 223, 731, 244, 731, 347, 731, 731, 731, + 731, 731, 731, 731, 291, 731, 731, 731, 363, 246, + 385, 291, 676, 385, 676, 676, 676, 676, 676, 400, + 731, 731, 731, 731, 292, 731, 400, 731, 676, 330, + 732, 292, 731, 247, 330, 400, 731, 732, 732, 732, + 731, 251, 732, 732, 732, 512, 732, 144, 410, 303, + 676, 318, 144, 144, 732, 410, 732, 732, 732, 676, + 676, 676, 676, 319, 410, 322, 732, 732, 465, 732, + 732, 732, 732, 732, 395, 465, 336, 512, 578, 395, + 665, 512, 512, 400, 465, 578, 827, 665, 827, 827, + 827, 338, 827, 339, 578, 676, 665, 732, 732, 732, + 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, + 732, 630, 410, 732, 732, 732, 630, 732, 732, 50, + 50, 732, 340, 871, 732, 732, 346, 732, 871, 732, + 349, 732, 465, 732, 732, 732, 732, 732, 732, 732, + 1011, 732, 578, 732, 665, 1011, 817, 350, 817, 817, + 817, 817, 817, 796, 50, 50, 732, 732, 732, 732, + 796, 732, 817, 732, 646, 796, 890, 646, 732, 796, + 673, 673, 732, 890, 890, 890, 732, 352, 840, 890, + 890, 840, 890, 1060, 817, 615, 1060, 615, 615, 615, + 890, 615, 353, 817, 817, 817, 817, 9, 9, 9, + 9, 9, 890, 890, 866, 890, 890, 890, 890, 890, + 1185, 866, 1156, 1185, 1163, 357, 866, 796, 359, 1156, + 866, 1163, 366, 615, 743, 743, 513, 368, 1156, 817, + 1163, 372, 615, 890, 890, 890, 890, 890, 890, 890, + 890, 890, 890, 890, 890, 890, 890, 816, 816, 890, + 890, 890, 374, 890, 890, 844, 844, 890, 513, 378, + 890, 382, 513, 513, 386, 890, 396, 890, 866, 890, + 890, 890, 890, 890, 890, 890, 1156, 890, 1163, 890, + 1108, 1108, 819, 1204, 819, 819, 819, 819, 819, 397, + 1204, 401, 890, 890, 403, 890, 412, 890, 819, 1204, + 1219, 1219, 891, 423, 890, 426, 429, 432, 890, 891, + 891, 891, 890, 455, 457, 891, 891, 527, 891, 823, + 819, 823, 823, 823, 458, 823, 891, 891, 460, 463, + 467, 819, 819, 477, 746, 746, 746, 746, 891, 891, + 480, 891, 891, 891, 891, 891, 481, 1204, 490, 527, + 746, 746, 746, 527, 527, 527, 527, 823, 334, 334, + 334, 334, 334, 746, 746, 819, 823, 500, 746, 891, + 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, + 891, 891, 891, 514, 515, 891, 891, 891, 516, 891, + 891, 517, 537, 891, 875, 875, 891, 545, 875, 875, + 875, 891, 546, 891, 547, 891, 891, 891, 891, 891, + 891, 891, 551, 891, 891, 891, 567, 746, 746, 746, + 746, 746, 746, 568, 569, 572, 746, 746, 891, 891, + 574, 891, 579, 891, 746, 583, 593, 746, 746, 746, + 891, 746, 746, 594, 891, 597, 598, 599, 891, 2, + 2, 2, 2, 2, 2, 600, 601, 603, 2, 2, + 604, 614, 406, 2, 407, 2, 2, 2, 2, 2, + 2, 2, 381, 381, 381, 381, 381, 2, 2, 2, + 2, 2, 2, 2, 626, 987, 2, 987, 987, 987, + 629, 987, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 631, 2, 2, 2, 633, 2, + 2, 634, 2, 2, 2, 406, 635, 407, 643, 644, + 647, 649, 406, 987, 407, 653, 654, 406, 656, 407, + 696, 406, 987, 407, 2, 699, 701, 2, 520, 706, + 2, 2, 719, 725, 2, 733, 2, 734, 736, 406, + 2, 407, 759, 762, 520, 520, 763, 768, 2, 774, + 776, 778, 780, 2, 2, 2, 2, 2, 2, 789, + 520, 791, 2, 2, 520, 520, 520, 520, 794, 406, + 2, 407, 797, 2, 2, 2, 798, 2, 2, 801, + 825, 2, 2, 37, 37, 37, 37, 37, 37, 826, + 828, 846, 37, 37, 852, 853, 865, 37, 859, 37, + 37, 37, 37, 37, 37, 37, 566, 566, 566, 566, + 566, 37, 37, 37, 37, 37, 37, 37, 868, 872, + 37, 528, 874, 885, 887, 895, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 911, 37, + 37, 37, 913, 37, 37, 919, 37, 37, 37, 865, + 920, 924, 925, 528, 926, 929, 865, 528, 528, 528, + 528, 865, 948, 949, 956, 865, 967, 968, 37, 971, + 973, 37, 974, 976, 37, 37, 978, 980, 37, 981, + 37, 983, 986, 865, 37, 988, 993, 988, 988, 988, + 999, 988, 37, 1008, 1010, 1017, 1018, 37, 37, 37, + 37, 37, 37, 1024, 1025, 1035, 37, 37, 1036, 1037, + 1038, 1046, 1047, 865, 37, 1048, 1052, 37, 37, 37, + 1053, 37, 37, 988, 1058, 37, 37, 225, 225, 225, + 225, 225, 225, 1064, 1065, 1067, 225, 225, 1068, 1069, + 1071, 225, 1072, 225, 225, 225, 225, 225, 225, 225, + 24, 1073, 1100, 1101, 1120, 225, 225, 225, 225, 225, + 225, 225, 1121, 1122, 225, 1122, 1122, 1122, 1129, 1122, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 1136, 225, 225, 225, 1138, 225, 225, 1154, + 225, 225, 225, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 1157, 24, 24, 1159, 1164, 24, + 24, 1167, 225, 1168, 24, 225, 1169, 1170, 225, 225, + 1182, 1192, 225, 1194, 225, 24, 1197, 24, 225, 24, + 24, 24, 24, 24, 24, 24, 225, 24, 1198, 1199, + 1200, 225, 225, 225, 225, 225, 225, 1202, 1208, 1218, + 225, 225, 1224, 24, 1228, 1242, 1243, 1245, 225, 1250, + 1255, 225, 225, 225, 1256, 225, 225, 1257, 1258, 225, + 225, 250, 250, 250, 250, 250, 250, 1264, 1270, nil, + 250, 250, nil, nil, nil, 250, nil, 250, 250, 250, + 250, 250, 250, 250, nil, nil, nil, nil, nil, 250, + 250, 250, 250, 250, 250, 250, nil, nil, 250, nil, + nil, nil, nil, 470, 250, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, nil, 250, 250, 250, + nil, 250, 250, nil, 250, 250, 250, 470, 470, 470, + 470, 470, 470, 470, 470, 470, 470, 470, nil, 470, + 470, nil, nil, 470, 470, nil, 250, nil, nil, 250, + nil, nil, 250, 250, nil, nil, 250, nil, 250, 470, + nil, 470, 250, 470, 470, 470, 470, 470, 470, 470, + 250, 470, nil, nil, nil, 250, 250, 250, 250, 250, + 250, nil, nil, nil, 250, 250, nil, 470, nil, 470, + nil, nil, 250, nil, nil, 250, 250, 250, nil, 250, + 250, nil, nil, 250, 250, 337, 337, 337, 337, 337, + 337, nil, nil, nil, 337, 337, nil, nil, nil, 337, + nil, 337, 337, 337, 337, 337, 337, 337, nil, nil, + nil, nil, nil, 337, 337, 337, 337, 337, 337, 337, + nil, nil, 337, nil, nil, nil, nil, 476, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, + nil, 337, 337, 337, nil, 337, 337, nil, 337, 337, + 337, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, nil, 476, 476, nil, nil, 476, 476, nil, + 337, nil, nil, 337, nil, nil, 337, 337, nil, nil, + 337, nil, 337, 476, nil, 476, 337, 476, 476, 476, + 476, 476, 476, 476, 337, 476, nil, nil, nil, 337, + 337, 337, 337, 337, 337, nil, nil, nil, 337, 337, + nil, 476, nil, nil, nil, nil, 337, nil, nil, 337, + 337, 337, nil, 337, 337, nil, nil, 337, 337, 342, + 342, 342, 342, 342, 342, nil, nil, nil, 342, 342, + nil, nil, nil, 342, nil, 342, 342, 342, 342, 342, + 342, 342, nil, nil, nil, nil, nil, 342, 342, 342, + 342, 342, 342, 342, nil, nil, 342, nil, nil, nil, + nil, 803, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, nil, 342, 342, 342, nil, 342, + 342, nil, 342, 342, 342, 803, 803, 803, 803, 803, + 803, 803, 803, 803, 803, 803, nil, 803, 803, nil, + nil, 803, 803, nil, 342, nil, nil, 342, nil, nil, + 342, 342, nil, nil, 342, nil, 342, 803, nil, 803, + 342, 803, 803, 803, 803, 803, 803, 803, 342, 803, + nil, nil, nil, 342, 342, 342, 342, 342, 342, nil, + nil, nil, 342, 342, nil, 803, nil, nil, nil, nil, + 342, nil, nil, 342, 342, 342, nil, 342, 342, nil, + nil, 342, 342, 373, 373, 373, 373, 373, 373, nil, + nil, nil, 373, 373, nil, nil, nil, 373, nil, 373, + 373, 373, 373, 373, 373, 373, nil, nil, nil, nil, + nil, 373, 373, 373, 373, 373, 373, 373, nil, nil, + 373, nil, nil, nil, nil, 836, 373, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 373, 373, nil, 373, + 373, 373, nil, 373, 373, nil, 373, 373, 373, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + nil, 836, 836, nil, nil, 836, 836, nil, 373, nil, + nil, 373, nil, nil, 373, 373, nil, nil, 373, nil, + 373, 836, nil, 836, 373, 836, 836, 836, 836, 836, + 836, 836, 373, 836, nil, nil, nil, 373, 373, 373, + 373, 373, 373, nil, nil, nil, 373, 373, nil, 836, + nil, nil, nil, nil, 373, nil, nil, 373, 373, 373, + nil, 373, 373, nil, nil, 373, 373, 379, 379, 379, + 379, 379, 379, nil, nil, nil, 379, 379, nil, nil, + nil, 379, nil, 379, 379, 379, 379, 379, 379, 379, + nil, nil, nil, nil, nil, 379, 379, 379, 379, 379, + 379, 379, nil, 1227, 379, 1227, 1227, 1227, nil, 1227, + 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, + 379, 379, nil, 379, 379, 379, nil, 379, 379, nil, + 379, 379, 379, 316, 316, 316, 316, 316, 316, 316, + 316, 316, 316, 316, nil, 316, 316, nil, nil, 316, + 316, nil, 379, nil, nil, 379, nil, nil, 379, 379, + nil, nil, 379, nil, 379, 316, nil, 316, 379, 316, + 316, 316, 316, 316, 316, 316, 379, 316, nil, nil, + nil, 379, 379, 379, 379, 379, 379, nil, nil, nil, + 379, 379, nil, 316, nil, nil, nil, nil, 379, nil, + nil, 379, 379, 379, nil, 379, 379, nil, nil, 379, + 379, 380, 380, 380, 380, 380, 380, nil, nil, nil, + 380, 380, nil, nil, nil, 380, nil, 380, 380, 380, + 380, 380, 380, 380, nil, nil, nil, nil, nil, 380, + 380, 380, 380, 380, 380, 380, nil, nil, 380, nil, + nil, nil, nil, nil, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, nil, 380, 380, 380, + nil, 380, 380, nil, 380, 380, 380, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 531, nil, 531, + 531, nil, nil, 531, 531, nil, 380, nil, nil, 380, + nil, nil, 380, 380, nil, nil, 380, nil, 380, 531, + nil, 531, 380, 531, 531, 531, 531, 531, 531, 531, + 380, 531, nil, nil, nil, 380, 380, 380, 380, 380, + 380, nil, nil, nil, 380, 380, 531, 531, nil, nil, + nil, nil, 380, nil, nil, 380, 380, 380, nil, 380, + 380, nil, nil, 380, 380, 393, 393, 393, 393, 393, + 393, nil, nil, nil, 393, 393, nil, nil, nil, 393, + nil, 393, 393, 393, 393, 393, 393, 393, nil, nil, + nil, nil, nil, 393, 393, 393, 393, 393, 393, 393, + nil, nil, 393, nil, nil, nil, nil, nil, 393, 393, + 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, + nil, 393, 393, 393, nil, 393, 393, nil, 393, 393, + 393, 590, 590, 590, 590, 590, 590, 590, 590, 590, + 590, 590, nil, 590, 590, nil, nil, 590, 590, nil, + 393, nil, nil, 393, nil, nil, 393, 393, nil, nil, + 393, nil, 393, 590, nil, 590, 393, 590, 590, 590, + 590, 590, 590, 590, 393, 590, nil, nil, nil, 393, + 393, 393, 393, 393, 393, nil, nil, nil, 393, 393, + nil, 590, nil, nil, nil, nil, 393, nil, nil, 393, + 393, 393, nil, 393, 393, nil, nil, 393, 393, 394, + 394, 394, 394, 394, 394, nil, nil, nil, 394, 394, + nil, nil, nil, 394, nil, 394, 394, 394, 394, 394, + 394, 394, nil, nil, nil, nil, nil, 394, 394, 394, + 394, 394, 394, 394, nil, nil, 394, nil, nil, nil, + nil, nil, 394, 394, 394, 394, 394, 394, 394, 394, + 394, 394, 394, 394, nil, 394, 394, 394, nil, 394, + 394, nil, 394, 394, 394, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, nil, 893, 893, nil, + nil, 893, 893, nil, 394, nil, nil, 394, nil, nil, + 394, 394, nil, nil, 394, nil, 394, 893, nil, 893, + 394, 893, 893, 893, 893, 893, 893, 893, 394, 893, + nil, nil, nil, 394, 394, 394, 394, 394, 394, nil, + nil, nil, 394, 394, nil, 893, nil, nil, nil, nil, + 394, nil, nil, 394, 394, 394, nil, 394, 394, nil, + nil, 394, 394, 449, 449, 449, 449, 449, 449, nil, + nil, nil, 449, 449, nil, nil, nil, 449, nil, 449, + 449, 449, 449, 449, 449, 449, nil, nil, nil, nil, + nil, 449, 449, 449, 449, 449, 449, 449, nil, nil, + 449, nil, nil, nil, nil, nil, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, nil, 449, + 449, 449, nil, 449, 449, nil, 449, 449, 449, 1063, + 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, + nil, 1063, 1063, nil, nil, 1063, 1063, nil, 449, nil, + nil, 449, nil, nil, 449, 449, nil, nil, 449, nil, + 449, 1063, nil, 1063, 449, 1063, 1063, 1063, 1063, 1063, + 1063, 1063, 449, 1063, nil, nil, nil, 449, 449, 449, + 449, 449, 449, nil, nil, nil, 449, 449, nil, 1063, + nil, nil, nil, nil, 449, nil, nil, 449, 449, 449, + nil, 449, 449, nil, nil, 449, 449, 648, 648, 648, + 648, 648, 648, nil, nil, nil, 648, 648, nil, nil, + nil, 648, nil, 648, 648, 648, 648, 648, 648, 648, + nil, nil, nil, nil, nil, 648, 648, 648, 648, 648, + 648, 648, nil, nil, 648, nil, nil, nil, nil, nil, + 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, + 648, 648, nil, 648, 648, 648, nil, 648, 648, nil, + 648, 648, 648, 1081, 1081, 1081, 1081, 1081, 1081, 1081, + 1081, 1081, 1081, 1081, nil, 1081, 1081, nil, nil, 1081, + 1081, nil, 648, nil, nil, 648, nil, nil, 648, 648, + nil, nil, 648, nil, 648, 1081, nil, 1081, 648, 1081, + 1081, 1081, 1081, 1081, 1081, 1081, 648, 1081, nil, nil, + nil, 648, 648, 648, 648, 648, 648, nil, nil, nil, + 648, 648, nil, 1081, nil, nil, nil, nil, 648, nil, + nil, 648, 648, 648, nil, 648, 648, nil, nil, 648, + 648, 651, 651, 651, 651, 651, 651, nil, nil, nil, + 651, 651, nil, nil, nil, 651, nil, 651, 651, 651, + 651, 651, 651, 651, nil, nil, nil, nil, nil, 651, + 651, 651, 651, 651, 651, 651, nil, nil, 651, nil, + nil, nil, nil, nil, 651, 651, 651, 651, 651, 651, + 651, 651, 651, 651, 651, 651, nil, 651, 651, 651, + nil, 651, 651, nil, 651, 651, 651, 1102, 1102, 1102, + 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, nil, 1102, + 1102, nil, nil, 1102, 1102, nil, 651, nil, nil, 651, + nil, nil, 651, 651, nil, nil, 651, nil, 651, 1102, + nil, 1102, 651, 1102, 1102, 1102, 1102, 1102, 1102, 1102, + 651, 1102, nil, nil, nil, 651, 651, 651, 651, 651, + 651, nil, nil, nil, 651, 651, nil, 1102, nil, nil, + nil, nil, 651, nil, nil, 651, 651, 651, nil, 651, + 651, nil, nil, 651, 651, 674, 674, 674, 674, 674, + 674, nil, nil, nil, 674, 674, nil, nil, nil, 674, + nil, 674, 674, 674, 674, 674, 674, 674, nil, nil, + nil, nil, nil, 674, 674, 674, 674, 674, 674, 674, + nil, nil, 674, nil, nil, nil, nil, nil, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + nil, 674, 674, 674, nil, 674, 674, nil, 674, 674, + 674, 364, 364, 364, 364, 364, 364, 364, 364, 364, + 364, 364, nil, 364, 364, nil, nil, 364, 364, nil, + 674, nil, nil, 674, nil, nil, 674, 674, nil, nil, + 674, nil, 674, 364, nil, 364, 674, 364, 364, 364, + 364, 364, 364, 364, 674, 364, nil, nil, nil, 674, + 674, 674, 674, 674, 674, nil, nil, nil, 674, 674, + nil, nil, nil, nil, nil, nil, 674, nil, nil, 674, + 674, 674, nil, 674, 674, nil, nil, 674, 674, 864, + 864, 864, 864, 864, 864, nil, nil, nil, 864, 864, + nil, nil, nil, 864, nil, 864, 864, 864, 864, 864, + 864, 864, nil, nil, nil, nil, nil, 864, 864, 864, + 864, 864, 864, 864, nil, nil, 864, nil, nil, nil, + nil, nil, 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, nil, 864, 864, 864, nil, 864, + 864, nil, 864, 864, 864, 365, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, nil, 365, 365, nil, + nil, 365, 365, nil, 864, nil, nil, 864, nil, nil, + 864, 864, nil, nil, 864, nil, 864, 365, nil, 365, + 864, 365, 365, 365, 365, 365, 365, 365, 864, 365, + nil, nil, nil, 864, 864, 864, 864, 864, 864, nil, + nil, nil, 864, 864, nil, nil, nil, nil, nil, nil, + 864, nil, nil, 864, 864, 864, nil, 864, 864, nil, + nil, 864, 864, 869, 869, 869, 869, 869, 869, nil, + nil, nil, 869, 869, nil, nil, nil, 869, nil, 869, + 869, 869, 869, 869, 869, 869, nil, nil, nil, nil, + nil, 869, 869, 869, 869, 869, 869, 869, nil, nil, + 869, nil, nil, nil, nil, nil, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 869, 869, 869, nil, 869, + 869, 869, nil, 869, 869, nil, 869, 869, 869, 510, + 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, + nil, 510, 510, nil, nil, 510, 510, nil, 869, nil, + nil, 869, nil, nil, 869, 869, nil, nil, 869, nil, + 869, 510, nil, 510, 869, 510, 510, 510, 510, 510, + 510, 510, 869, 510, nil, nil, nil, 869, 869, 869, + 869, 869, 869, nil, nil, nil, 869, 869, nil, nil, + nil, nil, nil, nil, 869, nil, nil, 869, 869, 869, + nil, 869, 869, nil, nil, 869, 869, 876, 876, 876, + 876, 876, 876, nil, nil, nil, 876, 876, nil, nil, + nil, 876, nil, 876, 876, 876, 876, 876, 876, 876, + nil, nil, nil, nil, nil, 876, 876, 876, 876, 876, + 876, 876, nil, nil, 876, nil, nil, nil, nil, nil, + 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, + 876, 876, nil, 876, 876, 876, nil, 876, 876, nil, + 876, 876, 876, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, nil, 511, 511, nil, nil, 511, + 511, nil, 876, nil, nil, 876, nil, nil, 876, 876, + nil, nil, 876, nil, 876, 511, nil, 511, 876, 511, + 511, 511, 511, 511, 511, 511, 876, 511, nil, nil, + nil, 876, 876, 876, 876, 876, 876, nil, nil, nil, + 876, 876, nil, nil, nil, nil, nil, nil, 876, nil, + nil, 876, 876, 876, nil, 876, 876, nil, nil, 876, + 876, 945, 945, 945, 945, 945, 945, nil, nil, nil, + 945, 945, nil, nil, nil, 945, nil, 945, 945, 945, + 945, 945, 945, 945, nil, nil, nil, nil, nil, 945, + 945, 945, 945, 945, 945, 945, nil, 1171, 945, 1171, + 1171, 1171, nil, 1171, 945, 945, 945, 945, 945, 945, + 945, 945, 945, 945, 945, 945, nil, 945, 945, 945, + nil, 945, 945, nil, 945, 945, 945, 521, 521, 521, + 521, 521, 521, 521, nil, 1171, 521, 521, nil, nil, + nil, nil, nil, 521, 521, nil, 945, nil, nil, 945, + nil, nil, 945, 945, nil, nil, 945, nil, 945, 521, + nil, 521, 945, 521, 521, 521, 521, 521, 521, 521, + 945, 521, nil, nil, nil, 945, 945, 945, 945, 945, + 945, nil, nil, nil, 945, 945, nil, nil, nil, nil, + nil, nil, 945, nil, nil, 945, 945, 945, nil, 945, + 945, nil, nil, 945, 945, 965, 965, 965, 965, 965, + 965, nil, nil, nil, 965, 965, nil, nil, nil, 965, + nil, 965, 965, 965, 965, 965, 965, 965, nil, nil, + nil, nil, nil, 965, 965, 965, 965, 965, 965, 965, + nil, 1172, 965, 1172, 1172, 1172, nil, 1172, 965, 965, + 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, + nil, 965, 965, 965, nil, 965, 965, nil, 965, 965, + 965, 522, 522, 522, 522, 522, 522, 522, nil, 1172, + 522, 522, nil, nil, nil, nil, nil, 522, 522, nil, + 965, nil, nil, 965, nil, nil, 965, 965, nil, nil, + 965, nil, 965, 522, nil, 522, 965, 522, 522, 522, + 522, 522, 522, 522, 965, 522, nil, nil, nil, 965, + 965, 965, 965, 965, 965, nil, nil, nil, 965, 965, + nil, nil, nil, nil, nil, nil, 965, nil, nil, 965, + 965, 965, nil, 965, 965, nil, nil, 965, 965, 998, + 998, 998, 998, 998, 998, nil, nil, nil, 998, 998, + nil, nil, nil, 998, nil, 998, 998, 998, 998, 998, + 998, 998, nil, nil, nil, nil, nil, 998, 998, 998, + 998, 998, 998, 998, nil, nil, 998, nil, nil, nil, + nil, nil, 998, 998, 998, 998, 998, 998, 998, 998, + 998, 998, 998, 998, nil, 998, 998, 998, nil, 998, + 998, nil, 998, 998, 998, 523, 523, 523, 523, 523, + 523, 523, nil, nil, 523, 523, nil, nil, nil, nil, + nil, 523, 523, nil, 998, nil, nil, 998, nil, nil, + 998, 998, nil, nil, 998, nil, 998, 523, nil, 523, + 998, 523, 523, 523, 523, 523, 523, 523, 998, 523, + nil, nil, nil, 998, 998, 998, 998, 998, 998, nil, + nil, nil, 998, 998, nil, nil, nil, nil, nil, nil, + 998, nil, nil, 998, 998, 998, nil, 998, 998, nil, + nil, 998, 998, 1006, 1006, 1006, 1006, 1006, 1006, nil, + nil, nil, 1006, 1006, nil, nil, nil, 1006, nil, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, nil, nil, nil, nil, + nil, 1006, 1006, 1006, 1006, 1006, 1006, 1006, nil, nil, + 1006, nil, nil, nil, nil, nil, 1006, 1006, 1006, 1006, + 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, nil, 1006, + 1006, 1006, nil, 1006, 1006, nil, 1006, 1006, 1006, 524, + 524, 524, 524, 524, 524, 524, nil, nil, 524, 524, + nil, nil, nil, nil, nil, 524, 524, nil, 1006, nil, + nil, 1006, nil, nil, 1006, 1006, nil, nil, 1006, nil, + 1006, 524, nil, 524, 1006, 524, 524, 524, 524, 524, + 524, 524, 1006, 524, nil, nil, nil, 1006, 1006, 1006, + 1006, 1006, 1006, nil, nil, nil, 1006, 1006, nil, nil, + nil, nil, nil, nil, 1006, nil, nil, 1006, 1006, 1006, + nil, 1006, 1006, nil, nil, 1006, 1006, 1015, 1015, 1015, + 1015, 1015, 1015, nil, nil, nil, 1015, 1015, nil, nil, + nil, 1015, nil, 1015, 1015, 1015, 1015, 1015, 1015, 1015, + nil, nil, nil, nil, nil, 1015, 1015, 1015, 1015, 1015, + 1015, 1015, nil, nil, 1015, nil, nil, nil, nil, nil, + 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, + 1015, 1015, nil, 1015, 1015, 1015, nil, 1015, 1015, nil, + 1015, 1015, 1015, 525, 525, 525, 525, 525, 525, 525, + nil, nil, 525, 525, nil, nil, nil, nil, nil, 525, + 525, nil, 1015, nil, nil, 1015, nil, nil, 1015, 1015, + nil, nil, 1015, nil, 1015, 525, nil, 525, 1015, 525, + 525, 525, 525, 525, 525, 525, 1015, 525, nil, nil, + nil, 1015, 1015, 1015, 1015, 1015, 1015, nil, nil, nil, + 1015, 1015, nil, nil, nil, nil, nil, nil, 1015, nil, + nil, 1015, 1015, 1015, nil, 1015, 1015, nil, nil, 1015, + 1015, 1016, 1016, 1016, 1016, 1016, 1016, nil, nil, nil, + 1016, 1016, nil, nil, nil, 1016, nil, 1016, 1016, 1016, + 1016, 1016, 1016, 1016, nil, nil, nil, nil, nil, 1016, + 1016, 1016, 1016, 1016, 1016, 1016, nil, nil, 1016, nil, + nil, nil, nil, nil, 1016, 1016, 1016, 1016, 1016, 1016, + 1016, 1016, 1016, 1016, 1016, 1016, nil, 1016, 1016, 1016, + nil, 1016, 1016, nil, 1016, 1016, 1016, 526, 526, 526, + 526, 526, 526, 526, nil, nil, 526, 526, nil, nil, + nil, nil, nil, 526, 526, nil, 1016, nil, nil, 1016, + nil, nil, 1016, 1016, nil, nil, 1016, nil, 1016, 526, + nil, 526, 1016, 526, 526, 526, 526, 526, 526, 526, + 1016, 526, nil, nil, nil, 1016, 1016, 1016, 1016, 1016, + 1016, nil, nil, nil, 1016, 1016, nil, nil, nil, nil, + nil, nil, 1016, nil, nil, 1016, 1016, 1016, nil, 1016, + 1016, nil, nil, 1016, 1016, 1080, 1080, 1080, 1080, 1080, + 1080, nil, nil, nil, 1080, 1080, nil, nil, nil, 1080, + nil, 1080, 1080, 1080, 1080, 1080, 1080, 1080, nil, nil, + nil, nil, nil, 1080, 1080, 1080, 1080, 1080, 1080, 1080, + nil, nil, 1080, nil, nil, nil, nil, nil, 1080, 1080, + 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, + nil, 1080, 1080, 1080, nil, 1080, 1080, nil, 1080, 1080, + 1080, 529, 529, 529, 529, 529, 529, 529, nil, nil, + 529, 529, nil, nil, nil, nil, nil, 529, 529, nil, + 1080, nil, nil, 1080, nil, nil, 1080, 1080, nil, nil, + 1080, nil, 1080, 529, nil, 529, 1080, 529, 529, 529, + 529, 529, 529, 529, 1080, 529, nil, nil, nil, 1080, + 1080, 1080, 1080, 1080, 1080, nil, nil, nil, 1080, 1080, + nil, nil, nil, nil, nil, nil, 1080, nil, nil, 1080, + 1080, 1080, nil, 1080, 1080, nil, nil, 1080, 1080, 1082, + 1082, 1082, 1082, 1082, 1082, nil, nil, nil, 1082, 1082, + nil, nil, nil, 1082, nil, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, nil, nil, nil, nil, nil, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, nil, nil, 1082, nil, nil, nil, + nil, nil, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, + 1082, 1082, 1082, 1082, nil, 1082, 1082, 1082, nil, 1082, + 1082, nil, 1082, 1082, 1082, 530, 530, 530, 530, 530, + 530, 530, 530, nil, 530, 530, nil, nil, nil, nil, + nil, 530, 530, nil, 1082, nil, nil, 1082, nil, nil, + 1082, 1082, nil, nil, 1082, nil, 1082, 530, nil, 530, + 1082, 530, 530, 530, 530, 530, 530, 530, 1082, 530, + nil, nil, nil, 1082, 1082, 1082, 1082, 1082, 1082, nil, + nil, nil, 1082, 1082, nil, nil, nil, nil, nil, nil, + 1082, nil, nil, 1082, 1082, 1082, nil, 1082, 1082, nil, + nil, 1082, 1082, 1119, 1119, 1119, 1119, 1119, 1119, nil, + nil, nil, 1119, 1119, nil, nil, nil, 1119, nil, 1119, + 1119, 1119, 1119, 1119, 1119, 1119, nil, nil, nil, nil, + nil, 1119, 1119, 1119, 1119, 1119, 1119, 1119, nil, nil, + 1119, nil, nil, nil, nil, nil, 1119, 1119, 1119, 1119, + 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, nil, 1119, + 1119, 1119, nil, 1119, 1119, nil, 1119, 1119, 1119, 532, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 532, 532, nil, 1119, nil, + nil, 1119, nil, nil, 1119, 1119, nil, nil, 1119, nil, + 1119, 532, nil, 532, 1119, 532, 532, 532, 532, nil, + nil, 532, 1119, 532, nil, nil, nil, 1119, 1119, 1119, + 1119, 1119, 1119, nil, nil, nil, 1119, 1119, nil, nil, + nil, nil, nil, nil, 1119, nil, nil, 1119, 1119, 1119, + nil, 1119, 1119, nil, nil, 1119, 1119, 1160, 1160, 1160, + 1160, 1160, 1160, nil, nil, nil, 1160, 1160, nil, nil, + nil, 1160, nil, 1160, 1160, 1160, 1160, 1160, 1160, 1160, + nil, nil, nil, nil, nil, 1160, 1160, 1160, 1160, 1160, + 1160, 1160, nil, nil, 1160, nil, nil, nil, nil, nil, + 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, + 1160, 1160, nil, 1160, 1160, 1160, nil, 1160, 1160, nil, + 1160, 1160, 1160, 589, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 589, + 589, nil, 1160, nil, nil, 1160, nil, nil, 1160, 1160, + nil, nil, 1160, nil, 1160, 589, nil, 589, 1160, 589, + 589, 589, 589, nil, nil, 589, 1160, 589, nil, nil, + nil, 1160, 1160, 1160, 1160, 1160, 1160, nil, nil, nil, + 1160, 1160, nil, nil, nil, nil, nil, nil, 1160, nil, + nil, 1160, 1160, 1160, nil, 1160, 1160, nil, nil, 1160, + 1160, 1173, 1173, 1173, 1173, 1173, 1173, nil, nil, nil, + 1173, 1173, nil, nil, nil, 1173, nil, 1173, 1173, 1173, + 1173, 1173, 1173, 1173, nil, nil, nil, nil, nil, 1173, + 1173, 1173, 1173, 1173, 1173, 1173, nil, nil, 1173, nil, + nil, nil, nil, nil, 1173, 1173, 1173, 1173, 1173, 1173, + 1173, 1173, 1173, 1173, 1173, 1173, nil, 1173, 1173, 1173, + nil, 1173, 1173, nil, 1173, 1173, 1173, 518, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 518, 518, nil, 1173, nil, nil, 1173, + nil, nil, 1173, 1173, nil, nil, 1173, nil, 1173, 518, + nil, 518, 1173, 518, 518, 518, 518, nil, nil, nil, + 1173, nil, nil, nil, nil, 1173, 1173, 1173, 1173, 1173, + 1173, nil, nil, nil, 1173, 1173, nil, nil, nil, nil, + nil, nil, 1173, nil, nil, 1173, 1173, 1173, nil, 1173, + 1173, nil, nil, 1173, 1173, 1220, 1220, 1220, 1220, 1220, + 1220, nil, nil, nil, 1220, 1220, nil, nil, nil, 1220, + nil, 1220, 1220, 1220, 1220, 1220, 1220, 1220, nil, nil, + nil, nil, nil, 1220, 1220, 1220, 1220, 1220, 1220, 1220, + nil, nil, 1220, nil, nil, nil, nil, nil, 1220, 1220, + 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, + nil, 1220, 1220, 1220, nil, 1220, 1220, nil, 1220, 1220, + 1220, 519, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 519, 519, nil, + 1220, nil, nil, 1220, nil, nil, 1220, 1220, nil, nil, + 1220, nil, 1220, 519, nil, 519, 1220, 519, 519, 519, + 519, nil, nil, nil, 1220, nil, nil, nil, nil, 1220, + 1220, 1220, 1220, 1220, 1220, nil, nil, nil, 1220, 1220, + nil, nil, nil, nil, nil, nil, 1220, nil, nil, 1220, + 1220, 1220, nil, 1220, 1220, nil, nil, 1220, 1220, 8, + 8, 8, 8, 8, nil, nil, nil, 8, 8, nil, + nil, nil, 8, nil, 8, 8, 8, 8, 8, 8, + 8, nil, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, 8, nil, nil, 8, nil, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, nil, 8, 8, 8, nil, 8, 8, + nil, 8, 8, 8, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 8, nil, nil, 8, nil, nil, 8, + 8, nil, nil, 8, nil, 8, nil, nil, nil, 8, + nil, nil, nil, nil, nil, nil, nil, 8, nil, nil, + nil, nil, 8, 8, 8, 8, 8, 8, nil, nil, + nil, 8, 8, nil, nil, nil, nil, nil, nil, 8, + nil, nil, 8, 8, 8, nil, 8, 8, nil, nil, + 8, 8, 23, 23, 23, nil, 23, nil, nil, nil, + 23, 23, nil, nil, nil, 23, nil, 23, 23, 23, + 23, 23, 23, 23, nil, nil, nil, nil, nil, 23, + 23, 23, 23, 23, 23, 23, nil, nil, 23, nil, + nil, nil, nil, nil, nil, 23, nil, nil, 23, 23, + 23, 23, 23, 23, 23, 23, nil, 23, 23, 23, + nil, 23, 23, nil, 23, 23, 23, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 23, nil, nil, 23, + nil, nil, 23, 23, nil, nil, 23, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, nil, nil, nil, + 23, nil, nil, nil, nil, 23, 23, 23, 23, 23, + 23, nil, nil, nil, 23, 23, nil, nil, nil, nil, + nil, nil, 23, nil, nil, 23, 23, 23, 31, 23, + 23, nil, nil, 23, 23, 31, 31, 31, nil, nil, + 31, 31, 31, 835, 31, 835, 835, 835, 835, 835, + nil, nil, 31, 31, 31, 31, nil, nil, nil, 835, + nil, nil, nil, nil, 31, 31, nil, 31, 31, 31, + 31, 31, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 835, nil, nil, nil, nil, nil, nil, nil, nil, + 835, 835, 835, 835, nil, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, nil, + nil, 31, 31, 31, nil, nil, 31, nil, 31, 31, + nil, nil, 31, 31, nil, 31, 835, 31, nil, 31, + nil, 31, 31, 31, 31, 31, 31, 31, nil, 31, + 31, 31, 943, nil, 943, 943, 943, 943, 943, nil, + nil, nil, nil, nil, 31, 31, nil, 31, 943, 31, + 32, nil, nil, nil, nil, nil, 31, 32, 32, 32, + 31, nil, 32, 32, 32, nil, 32, nil, nil, nil, + 943, nil, nil, nil, 32, nil, 32, 32, nil, 943, + 943, 943, 943, nil, nil, nil, 32, 32, nil, 32, + 32, 32, 32, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 943, nil, nil, + nil, nil, nil, nil, nil, 943, nil, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, nil, nil, 32, 32, 32, nil, nil, 32, nil, + 32, 32, nil, nil, 32, 32, nil, 32, nil, 32, + nil, 32, nil, 32, 32, 32, 32, 32, 32, 32, + nil, 32, nil, 32, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 32, 32, nil, 32, + nil, 32, 33, 33, 33, nil, 33, nil, 32, nil, + 33, 33, 32, nil, nil, 33, nil, 33, 33, 33, + 33, 33, 33, 33, nil, nil, nil, nil, nil, 33, + 33, 33, 33, 33, 33, 33, nil, nil, 33, nil, + nil, nil, nil, nil, nil, 33, nil, nil, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + nil, 33, 33, nil, 33, 33, 33, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 33, nil, nil, 33, + nil, nil, 33, 33, nil, nil, 33, nil, 33, nil, + 33, nil, 33, nil, nil, nil, nil, nil, nil, nil, + 33, nil, nil, nil, nil, 33, 33, 33, 33, 33, + 33, nil, nil, nil, 33, 33, nil, nil, nil, nil, + nil, nil, 33, nil, 33, 33, 33, 33, nil, 33, + 33, nil, nil, 33, 33, 34, 34, 34, nil, 34, + nil, nil, nil, 34, 34, nil, nil, nil, 34, nil, + 34, 34, 34, 34, 34, 34, 34, nil, nil, nil, + nil, nil, 34, 34, 34, 34, 34, 34, 34, nil, + nil, 34, nil, nil, nil, nil, nil, nil, 34, nil, + nil, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, nil, 34, 34, nil, 34, 34, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, 34, nil, nil, 34, 34, nil, nil, 34, + nil, 34, nil, 34, nil, 34, nil, nil, nil, nil, + nil, nil, nil, 34, nil, nil, nil, nil, 34, 34, + 34, 34, 34, 34, nil, nil, nil, 34, 34, nil, + nil, nil, nil, nil, nil, 34, nil, 34, 34, 34, + 34, nil, 34, 34, nil, nil, 34, 34, 35, 35, + 35, nil, 35, nil, nil, nil, 35, 35, nil, nil, + nil, 35, nil, 35, 35, 35, 35, 35, 35, 35, + nil, nil, nil, nil, nil, 35, 35, 35, 35, 35, + 35, 35, nil, nil, 35, nil, nil, nil, nil, nil, + nil, 35, nil, nil, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, nil, 35, 35, nil, + 35, 35, 35, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 35, nil, nil, 35, nil, nil, 35, 35, + nil, nil, 35, nil, 35, nil, 35, nil, 35, nil, + nil, nil, nil, nil, nil, nil, 35, nil, nil, nil, + nil, 35, 35, 35, 35, 35, 35, nil, nil, nil, + 35, 35, nil, nil, nil, nil, nil, nil, 35, nil, + 35, 35, 35, 35, nil, 35, 35, nil, nil, 35, + 35, 45, 45, 45, nil, 45, nil, nil, nil, 45, + 45, nil, nil, nil, 45, nil, 45, 45, 45, 45, + 45, 45, 45, nil, nil, nil, nil, nil, 45, 45, + 45, 45, 45, 45, 45, nil, nil, 45, nil, nil, + nil, nil, nil, nil, 45, nil, nil, 45, 45, 45, + 45, 45, 45, 45, 45, nil, 45, 45, 45, nil, + 45, 45, nil, 45, 45, 45, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 45, nil, nil, 45, nil, + nil, 45, 45, nil, nil, 45, nil, nil, nil, nil, + nil, 45, nil, nil, nil, nil, nil, nil, nil, 45, + nil, nil, nil, nil, 45, 45, 45, 45, 45, 45, + nil, nil, nil, 45, 45, nil, nil, nil, nil, nil, + nil, 45, nil, nil, 45, 45, 45, nil, 45, 45, + nil, nil, 45, 45, 46, 46, 46, nil, 46, nil, + nil, nil, 46, 46, nil, nil, nil, 46, nil, 46, + 46, 46, 46, 46, 46, 46, nil, nil, nil, nil, + nil, 46, 46, 46, 46, 46, 46, 46, nil, nil, + 46, nil, nil, nil, nil, nil, nil, 46, nil, nil, + 46, 46, 46, 46, 46, 46, 46, 46, nil, 46, + 46, 46, nil, 46, 46, nil, 46, 46, 46, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 46, nil, + nil, 46, nil, nil, 46, 46, nil, nil, 46, nil, + nil, nil, nil, nil, 46, nil, nil, nil, nil, nil, + nil, nil, 46, nil, nil, nil, nil, 46, 46, 46, + 46, 46, 46, nil, nil, nil, 46, 46, nil, nil, + nil, nil, nil, nil, 46, nil, nil, 46, 46, 46, + nil, 46, 46, nil, nil, 46, 46, 48, 48, 48, + nil, 48, nil, nil, nil, 48, 48, nil, nil, nil, + 48, nil, 48, 48, 48, 48, 48, 48, 48, nil, + nil, nil, nil, nil, 48, 48, 48, 48, 48, 48, + 48, nil, nil, 48, nil, nil, nil, nil, nil, nil, + 48, nil, nil, 48, 48, 48, 48, 48, 48, 48, + 48, nil, 48, 48, 48, nil, 48, 48, nil, 48, + 48, 48, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 48, nil, nil, 48, nil, nil, 48, 48, nil, + nil, 48, nil, nil, nil, nil, nil, 48, nil, nil, + nil, nil, nil, nil, nil, 48, nil, nil, nil, nil, + 48, 48, 48, 48, 48, 48, nil, nil, nil, 48, + 48, nil, nil, nil, nil, nil, nil, 48, nil, nil, + 48, 48, 48, nil, 48, 48, nil, nil, 48, 48, + 49, 49, 49, nil, 49, nil, nil, nil, 49, 49, + nil, nil, nil, 49, nil, 49, 49, 49, 49, 49, + 49, 49, nil, nil, nil, nil, nil, 49, 49, 49, + 49, 49, 49, 49, nil, nil, 49, nil, nil, nil, + nil, nil, nil, 49, nil, nil, 49, 49, 49, 49, + 49, 49, 49, 49, nil, 49, 49, 49, nil, 49, + 49, nil, 49, 49, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 49, nil, nil, 49, nil, nil, + 49, 49, nil, nil, 49, nil, nil, nil, nil, nil, + 49, nil, nil, nil, nil, nil, nil, nil, 49, nil, + nil, nil, nil, 49, 49, 49, 49, 49, 49, nil, + nil, nil, 49, 49, nil, nil, nil, nil, nil, nil, + 49, nil, nil, 49, 49, 49, nil, 49, 49, nil, + nil, 49, 49, 51, 51, 51, nil, 51, nil, nil, + nil, 51, 51, nil, nil, nil, 51, nil, 51, 51, + 51, 51, 51, 51, 51, nil, nil, nil, nil, nil, + 51, 51, 51, 51, 51, 51, 51, nil, nil, 51, + nil, nil, nil, nil, nil, nil, 51, nil, nil, 51, + 51, 51, 51, 51, 51, 51, 51, nil, 51, 51, + 51, nil, 51, 51, nil, 51, 51, 51, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 51, nil, nil, + 51, nil, nil, 51, 51, nil, nil, 51, nil, nil, + nil, nil, nil, 51, nil, nil, nil, nil, nil, nil, + nil, 51, nil, nil, nil, nil, 51, 51, 51, 51, + 51, 51, nil, nil, nil, 51, 51, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 51, 51, 51, 65, + 51, 51, nil, nil, 51, 51, 65, 65, 65, nil, + nil, 65, 65, 65, 1090, 65, 1090, 1090, 1090, 1090, + 1090, nil, nil, 65, nil, 65, 65, 65, nil, nil, + 1090, 747, 747, 747, 747, 65, 65, nil, 65, 65, + 65, 65, 65, nil, nil, nil, nil, 747, 747, 747, + nil, nil, 1090, nil, nil, nil, nil, nil, nil, nil, + 747, 747, nil, 1090, 1090, 747, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + nil, nil, 65, 65, 65, nil, nil, 65, nil, nil, + 65, nil, nil, 65, 65, nil, 65, 1090, 65, nil, + 65, nil, 65, 65, 65, 65, 65, 65, 65, nil, + 65, nil, 65, nil, 747, 747, 747, 747, 747, 747, + nil, nil, nil, 747, 747, 65, 65, 65, 65, nil, + 65, 747, 65, nil, 747, 747, 747, 65, 747, 747, + 484, 65, 67, 67, 67, 67, 67, 484, 484, 484, + 67, 67, 484, 484, 484, 67, 484, 67, 67, 67, + 67, 67, 67, 67, 484, 484, 484, 484, nil, 67, + 67, 67, 67, 67, 67, 67, 484, 484, 67, 484, + 484, 484, 484, 484, 67, 67, nil, 67, 67, 67, + 67, 67, 67, 67, 67, 67, nil, 67, 67, 67, + nil, 67, 67, nil, 67, 67, 67, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, + 484, nil, nil, 484, 484, 484, 67, nil, 484, 67, + 484, 484, 67, 67, 484, 484, 67, 484, 67, 484, + nil, 484, 67, 484, 484, 484, 484, 484, 484, 484, + 67, 484, 484, 484, nil, 67, 67, 67, 67, 67, + 67, nil, nil, nil, 67, 67, 484, 484, nil, 484, + nil, 484, 67, nil, nil, 67, 67, 67, 484, 67, + 67, nil, 484, 67, 67, 68, 68, 68, nil, 68, + nil, nil, nil, 68, 68, nil, nil, nil, 68, nil, + 68, 68, 68, 68, 68, 68, 68, nil, nil, nil, + nil, nil, 68, 68, 68, 68, 68, 68, 68, nil, + nil, 68, nil, nil, nil, nil, nil, nil, 68, nil, + nil, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, nil, 68, 68, nil, 68, 68, 68, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 68, + nil, nil, 68, nil, nil, 68, 68, nil, nil, 68, + nil, 68, nil, nil, nil, 68, nil, nil, nil, nil, + nil, nil, nil, 68, nil, nil, nil, nil, 68, 68, + 68, 68, 68, 68, nil, nil, nil, 68, 68, nil, + nil, nil, nil, nil, nil, 68, nil, 68, 68, 68, + 68, nil, 68, 68, nil, nil, 68, 68, 72, 72, + 72, nil, 72, nil, nil, nil, 72, 72, nil, nil, + nil, 72, nil, 72, 72, 72, 72, 72, 72, 72, + nil, nil, nil, nil, nil, 72, 72, 72, 72, 72, + 72, 72, nil, nil, 72, nil, nil, nil, nil, nil, + nil, 72, nil, nil, 72, 72, 72, 72, 72, 72, + 72, 72, nil, 72, 72, 72, nil, 72, 72, nil, + 72, 72, 72, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 72, nil, nil, 72, nil, nil, 72, 72, + nil, nil, 72, nil, nil, nil, nil, nil, 72, nil, + nil, nil, nil, nil, nil, nil, 72, nil, nil, nil, + nil, 72, 72, 72, 72, 72, 72, nil, nil, nil, + 72, 72, nil, nil, nil, nil, nil, nil, 72, nil, + nil, 72, 72, 72, nil, 72, 72, nil, nil, 72, + 72, 73, 73, 73, nil, 73, nil, nil, nil, 73, + 73, nil, nil, nil, 73, nil, 73, 73, 73, 73, + 73, 73, 73, nil, nil, nil, nil, nil, 73, 73, + 73, 73, 73, 73, 73, nil, nil, 73, nil, nil, + nil, nil, nil, nil, 73, nil, nil, 73, 73, 73, + 73, 73, 73, 73, 73, nil, 73, 73, 73, nil, + 73, 73, nil, 73, 73, 73, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 73, nil, nil, 73, nil, + nil, 73, 73, nil, nil, 73, nil, nil, nil, nil, + nil, 73, nil, nil, nil, nil, nil, nil, nil, 73, + nil, nil, nil, nil, 73, 73, 73, 73, 73, 73, + nil, nil, nil, 73, 73, nil, nil, nil, nil, nil, + nil, 73, nil, nil, 73, 73, 73, nil, 73, 73, + nil, nil, 73, 73, 76, 76, 76, nil, 76, nil, + nil, nil, 76, 76, nil, nil, nil, 76, nil, 76, + 76, 76, 76, 76, 76, 76, nil, nil, nil, nil, + nil, 76, 76, 76, 76, 76, 76, 76, nil, nil, + 76, nil, nil, nil, nil, nil, nil, 76, nil, nil, + 76, 76, 76, 76, 76, 76, 76, 76, nil, 76, + 76, 76, nil, 76, 76, nil, 76, 76, 76, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 76, nil, + nil, 76, nil, nil, 76, 76, nil, nil, 76, nil, + nil, nil, nil, nil, 76, nil, nil, nil, nil, nil, + nil, nil, 76, nil, nil, nil, nil, 76, 76, 76, + 76, 76, 76, nil, nil, nil, 76, 76, 76, nil, + nil, nil, nil, 76, 76, nil, nil, 76, 76, 76, + nil, 76, 76, nil, nil, 76, 76, 132, 132, 132, + 132, 132, nil, nil, nil, 132, 132, nil, nil, nil, + 132, nil, 132, 132, 132, 132, 132, 132, 132, nil, + nil, nil, nil, nil, 132, 132, 132, 132, 132, 132, + 132, nil, nil, 132, nil, nil, nil, nil, nil, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, nil, 132, 132, 132, nil, 132, 132, nil, 132, + 132, 132, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 132, nil, nil, 132, nil, nil, 132, 132, nil, + nil, 132, nil, 132, nil, nil, nil, 132, nil, nil, + nil, nil, nil, nil, nil, 132, nil, nil, nil, nil, + 132, 132, 132, 132, 132, 132, nil, nil, nil, 132, + 132, nil, nil, nil, nil, nil, 132, 132, nil, nil, + 132, 132, 132, nil, 132, 132, nil, nil, 132, 132, + 137, 137, 137, nil, 137, nil, nil, nil, 137, 137, + nil, nil, nil, 137, nil, 137, 137, 137, 137, 137, + 137, 137, nil, nil, nil, nil, nil, 137, 137, 137, + 137, 137, 137, 137, nil, nil, 137, nil, nil, nil, + nil, nil, nil, 137, nil, nil, 137, 137, 137, 137, + 137, 137, 137, 137, nil, 137, 137, 137, nil, 137, + 137, nil, 137, 137, 137, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 137, nil, nil, 137, nil, nil, + 137, 137, nil, nil, 137, nil, nil, nil, nil, nil, + 137, nil, nil, nil, nil, nil, nil, nil, 137, nil, + nil, nil, nil, 137, 137, 137, 137, 137, 137, nil, + nil, nil, 137, 137, nil, nil, nil, nil, nil, nil, + 137, nil, nil, 137, 137, 137, nil, 137, 137, nil, + nil, 137, 137, 138, 138, 138, nil, 138, nil, nil, + nil, 138, 138, nil, nil, nil, 138, nil, 138, 138, + 138, 138, 138, 138, 138, nil, nil, nil, nil, nil, + 138, 138, 138, 138, 138, 138, 138, nil, nil, 138, + nil, nil, nil, nil, nil, nil, 138, nil, nil, 138, + 138, 138, 138, 138, 138, 138, 138, nil, 138, 138, + 138, nil, 138, 138, nil, 138, 138, 138, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 138, nil, nil, + 138, nil, nil, 138, 138, nil, nil, 138, nil, nil, + nil, nil, nil, 138, nil, nil, nil, nil, nil, nil, + nil, 138, nil, nil, nil, nil, 138, 138, 138, 138, + 138, 138, nil, nil, nil, 138, 138, nil, nil, nil, + nil, nil, nil, 138, nil, nil, 138, 138, 138, nil, + 138, 138, nil, nil, 138, 138, 139, 139, 139, nil, + 139, nil, nil, nil, 139, 139, nil, nil, nil, 139, + nil, 139, 139, 139, 139, 139, 139, 139, nil, nil, + nil, nil, nil, 139, 139, 139, 139, 139, 139, 139, + nil, nil, 139, nil, nil, nil, nil, nil, nil, 139, + nil, nil, 139, 139, 139, 139, 139, 139, 139, 139, + nil, 139, 139, 139, nil, 139, 139, nil, 139, 139, + 139, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 139, nil, nil, 139, nil, nil, 139, 139, nil, nil, + 139, nil, nil, nil, nil, nil, 139, nil, nil, nil, + nil, nil, nil, nil, 139, nil, nil, nil, nil, 139, + 139, 139, 139, 139, 139, nil, nil, nil, 139, 139, + nil, nil, nil, nil, nil, nil, 139, nil, nil, 139, + 139, 139, nil, 139, 139, nil, nil, 139, 139, 140, + 140, 140, nil, 140, nil, nil, nil, 140, 140, nil, + nil, nil, 140, nil, 140, 140, 140, 140, 140, 140, + 140, nil, nil, nil, nil, nil, 140, 140, 140, 140, + 140, 140, 140, nil, nil, 140, nil, nil, nil, nil, + nil, nil, 140, nil, nil, 140, 140, 140, 140, 140, + 140, 140, 140, nil, 140, 140, 140, nil, 140, 140, + nil, 140, 140, 140, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 140, nil, nil, 140, nil, nil, 140, + 140, nil, nil, 140, nil, nil, nil, nil, nil, 140, + nil, nil, nil, nil, nil, nil, nil, 140, nil, nil, + nil, nil, 140, 140, 140, 140, 140, 140, nil, nil, + nil, 140, 140, nil, nil, nil, nil, nil, nil, 140, + nil, nil, 140, 140, 140, nil, 140, 140, nil, nil, + 140, 140, 141, 141, 141, 141, 141, nil, nil, nil, + 141, 141, nil, nil, nil, 141, nil, 141, 141, 141, + 141, 141, 141, 141, nil, nil, nil, nil, nil, 141, + 141, 141, 141, 141, 141, 141, nil, nil, 141, nil, + nil, nil, nil, nil, 141, 141, nil, 141, 141, 141, + 141, 141, 141, 141, 141, 141, nil, 141, 141, 141, + nil, 141, 141, nil, 141, 141, 141, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 141, nil, nil, 141, + nil, nil, 141, 141, nil, nil, 141, nil, 141, nil, + nil, nil, 141, nil, nil, nil, nil, nil, nil, nil, + 141, nil, nil, nil, nil, 141, 141, 141, 141, 141, + 141, nil, nil, nil, 141, 141, nil, nil, nil, nil, + nil, nil, 141, nil, nil, 141, 141, 141, nil, 141, + 141, nil, nil, 141, 141, 226, 226, 226, nil, 226, + nil, nil, nil, 226, 226, nil, nil, nil, 226, nil, + 226, 226, 226, 226, 226, 226, 226, nil, nil, nil, + nil, nil, 226, 226, 226, 226, 226, 226, 226, nil, + nil, 226, nil, nil, nil, nil, nil, nil, 226, nil, + nil, 226, 226, 226, 226, 226, 226, 226, 226, nil, + 226, 226, 226, nil, 226, 226, nil, 226, 226, 226, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 226, + nil, nil, 226, nil, nil, 226, 226, nil, nil, 226, + nil, 226, nil, nil, nil, 226, nil, nil, nil, nil, + nil, nil, nil, 226, nil, nil, nil, nil, 226, 226, + 226, 226, 226, 226, nil, nil, nil, 226, 226, nil, + nil, nil, nil, nil, nil, 226, nil, nil, 226, 226, + 226, nil, 226, 226, nil, nil, 226, 226, 227, 227, + 227, nil, 227, nil, nil, nil, 227, 227, nil, nil, + nil, 227, nil, 227, 227, 227, 227, 227, 227, 227, + nil, nil, nil, nil, nil, 227, 227, 227, 227, 227, + 227, 227, nil, nil, 227, nil, nil, nil, nil, nil, + nil, 227, nil, nil, 227, 227, 227, 227, 227, 227, + 227, 227, nil, 227, 227, 227, nil, 227, 227, nil, + 227, 227, 227, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 227, nil, nil, 227, nil, nil, 227, 227, + nil, nil, 227, nil, 227, nil, nil, nil, 227, nil, + nil, nil, nil, nil, nil, nil, 227, nil, nil, nil, + nil, 227, 227, 227, 227, 227, 227, nil, nil, nil, + 227, 227, nil, nil, nil, nil, nil, nil, 227, nil, + nil, 227, 227, 227, nil, 227, 227, nil, nil, 227, + 227, 228, 228, 228, nil, 228, nil, nil, nil, 228, + 228, nil, nil, nil, 228, nil, 228, 228, 228, 228, + 228, 228, 228, nil, nil, nil, nil, nil, 228, 228, + 228, 228, 228, 228, 228, nil, nil, 228, nil, nil, + nil, nil, nil, nil, 228, nil, nil, 228, 228, 228, + 228, 228, 228, 228, 228, nil, 228, 228, 228, nil, + 228, 228, nil, 228, 228, 228, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 228, nil, nil, 228, nil, + nil, 228, 228, nil, nil, 228, nil, nil, nil, nil, + nil, 228, nil, nil, nil, nil, nil, nil, nil, 228, + nil, nil, nil, nil, 228, 228, 228, 228, 228, 228, + nil, nil, nil, 228, 228, nil, nil, nil, nil, nil, + nil, 228, nil, nil, 228, 228, 228, nil, 228, 228, + nil, nil, 228, 228, 229, 229, 229, nil, 229, nil, + nil, nil, 229, 229, nil, nil, nil, 229, nil, 229, + 229, 229, 229, 229, 229, 229, nil, nil, nil, nil, + nil, 229, 229, 229, 229, 229, 229, 229, nil, nil, + 229, nil, nil, nil, nil, nil, nil, 229, nil, nil, + 229, 229, 229, 229, 229, 229, 229, 229, nil, 229, + 229, 229, nil, 229, 229, nil, 229, 229, 229, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 229, nil, + nil, 229, nil, nil, 229, 229, nil, nil, 229, nil, + nil, nil, nil, nil, 229, nil, nil, nil, nil, nil, + nil, nil, 229, nil, nil, nil, nil, 229, 229, 229, + 229, 229, 229, nil, nil, nil, 229, 229, nil, nil, + nil, nil, nil, nil, 229, nil, nil, 229, 229, 229, + nil, 229, 229, nil, nil, 229, 229, 230, 230, 230, + nil, 230, nil, nil, nil, 230, 230, nil, nil, nil, + 230, nil, 230, 230, 230, 230, 230, 230, 230, nil, + nil, nil, nil, nil, 230, 230, 230, 230, 230, 230, + 230, nil, nil, 230, nil, nil, nil, nil, nil, nil, + 230, nil, nil, 230, 230, 230, 230, 230, 230, 230, + 230, nil, 230, 230, 230, nil, 230, 230, nil, 230, + 230, 230, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 230, nil, nil, 230, nil, nil, 230, 230, nil, + nil, 230, nil, nil, nil, nil, nil, 230, nil, nil, + nil, nil, nil, nil, nil, 230, nil, nil, nil, nil, + 230, 230, 230, 230, 230, 230, nil, nil, nil, 230, + 230, nil, nil, nil, nil, nil, nil, 230, nil, nil, + 230, 230, 230, nil, 230, 230, nil, nil, 230, 230, + 231, 231, 231, nil, 231, nil, nil, nil, 231, 231, + nil, nil, nil, 231, nil, 231, 231, 231, 231, 231, + 231, 231, nil, nil, nil, nil, nil, 231, 231, 231, + 231, 231, 231, 231, nil, nil, 231, nil, nil, nil, + nil, nil, nil, 231, nil, nil, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, nil, 231, + 231, nil, 231, 231, 231, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 231, nil, nil, 231, nil, nil, + 231, 231, nil, nil, 231, nil, 231, nil, 231, nil, + 231, nil, nil, nil, nil, nil, nil, nil, 231, nil, + nil, nil, nil, 231, 231, 231, 231, 231, 231, nil, + nil, nil, 231, 231, nil, nil, nil, nil, nil, nil, + 231, nil, 231, 231, 231, 231, nil, 231, 231, nil, + nil, 231, 231, 236, 236, 236, nil, 236, nil, nil, + nil, 236, 236, nil, nil, nil, 236, nil, 236, 236, + 236, 236, 236, 236, 236, nil, nil, nil, nil, nil, + 236, 236, 236, 236, 236, 236, 236, nil, nil, 236, + nil, nil, nil, nil, nil, nil, 236, nil, nil, 236, + 236, 236, 236, 236, 236, 236, 236, nil, 236, 236, + 236, nil, 236, 236, nil, 236, 236, 236, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 236, nil, nil, + 236, nil, nil, 236, 236, nil, nil, 236, nil, nil, + nil, nil, nil, 236, nil, nil, nil, nil, nil, nil, + nil, 236, nil, nil, nil, nil, 236, 236, 236, 236, + 236, 236, nil, nil, nil, 236, 236, nil, nil, nil, + nil, nil, nil, 236, nil, nil, 236, 236, 236, nil, + 236, 236, nil, nil, 236, 236, 237, 237, 237, nil, + 237, nil, nil, nil, 237, 237, nil, nil, nil, 237, + nil, 237, 237, 237, 237, 237, 237, 237, nil, nil, + nil, nil, nil, 237, 237, 237, 237, 237, 237, 237, + nil, nil, 237, nil, nil, nil, nil, nil, nil, 237, + nil, nil, 237, 237, 237, 237, 237, 237, 237, 237, + nil, 237, 237, 237, nil, 237, 237, nil, 237, 237, + 237, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 237, nil, nil, 237, nil, nil, 237, 237, nil, nil, + 237, nil, nil, nil, nil, nil, 237, nil, nil, nil, + nil, nil, nil, nil, 237, nil, nil, nil, nil, 237, + 237, 237, 237, 237, 237, nil, nil, nil, 237, 237, + nil, nil, nil, nil, nil, nil, 237, nil, nil, 237, + 237, 237, nil, 237, 237, nil, nil, 237, 237, 238, + 238, 238, nil, 238, nil, nil, nil, 238, 238, nil, + nil, nil, 238, nil, 238, 238, 238, 238, 238, 238, + 238, nil, nil, nil, nil, nil, 238, 238, 238, 238, + 238, 238, 238, nil, nil, 238, nil, nil, nil, nil, + nil, nil, 238, nil, nil, 238, 238, 238, 238, 238, + 238, 238, 238, nil, 238, 238, 238, nil, 238, 238, + nil, 238, 238, 238, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 238, nil, nil, 238, nil, nil, 238, + 238, nil, nil, 238, nil, nil, nil, nil, nil, 238, + nil, nil, nil, nil, nil, nil, nil, 238, nil, nil, + nil, nil, 238, 238, 238, 238, 238, 238, nil, nil, + nil, 238, 238, 238, nil, nil, nil, nil, nil, 238, + nil, nil, 238, 238, 238, nil, 238, 238, nil, nil, + 238, 238, 249, 249, 249, nil, 249, nil, nil, nil, + 249, 249, nil, nil, nil, 249, nil, 249, 249, 249, + 249, 249, 249, 249, nil, nil, nil, nil, nil, 249, + 249, 249, 249, 249, 249, 249, nil, nil, 249, nil, + nil, nil, nil, nil, nil, 249, nil, nil, 249, 249, + 249, 249, 249, 249, 249, 249, nil, 249, 249, 249, + nil, 249, 249, nil, 249, 249, 249, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 249, nil, nil, 249, + nil, nil, 249, 249, nil, nil, 249, nil, nil, nil, + nil, nil, 249, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, nil, nil, 249, 249, 249, 249, 249, + 249, nil, nil, nil, 249, 249, nil, nil, nil, nil, + nil, nil, 249, nil, nil, 249, 249, 249, nil, 249, + 249, nil, nil, 249, 249, 254, 254, 254, nil, 254, + nil, nil, nil, 254, 254, nil, nil, nil, 254, nil, + 254, 254, 254, 254, 254, 254, 254, nil, nil, nil, + nil, nil, 254, 254, 254, 254, 254, 254, 254, nil, + nil, 254, nil, nil, nil, nil, nil, nil, 254, nil, + nil, 254, 254, 254, 254, 254, 254, 254, 254, nil, + 254, 254, 254, nil, 254, 254, nil, 254, 254, 254, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 254, + nil, nil, 254, nil, nil, 254, 254, nil, nil, 254, + nil, nil, nil, nil, nil, 254, nil, nil, nil, nil, + nil, nil, nil, 254, nil, nil, nil, nil, 254, 254, + 254, 254, 254, 254, nil, nil, nil, 254, 254, nil, + nil, nil, nil, nil, nil, 254, nil, nil, 254, 254, + 254, nil, 254, 254, nil, nil, 254, 254, 255, 255, + 255, nil, 255, nil, nil, nil, 255, 255, nil, nil, + nil, 255, nil, 255, 255, 255, 255, 255, 255, 255, + nil, nil, nil, nil, nil, 255, 255, 255, 255, 255, + 255, 255, nil, nil, 255, nil, nil, nil, nil, nil, + nil, 255, nil, nil, 255, 255, 255, 255, 255, 255, + 255, 255, nil, 255, 255, 255, nil, 255, 255, nil, + 255, 255, 255, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 255, nil, nil, 255, nil, nil, 255, 255, + nil, nil, 255, nil, nil, nil, nil, nil, 255, nil, + nil, nil, nil, nil, nil, nil, 255, nil, nil, nil, + nil, 255, 255, 255, 255, 255, 255, nil, nil, nil, + 255, 255, nil, nil, nil, nil, nil, nil, 255, nil, + nil, 255, 255, 255, nil, 255, 255, nil, nil, 255, + 255, 256, 256, 256, nil, 256, nil, nil, nil, 256, + 256, nil, nil, nil, 256, nil, 256, 256, 256, 256, + 256, 256, 256, nil, nil, nil, nil, nil, 256, 256, + 256, 256, 256, 256, 256, nil, nil, 256, nil, nil, + nil, nil, nil, nil, 256, nil, nil, 256, 256, 256, + 256, 256, 256, 256, 256, nil, 256, 256, 256, nil, + 256, 256, nil, 256, 256, 256, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 256, nil, nil, 256, nil, + nil, 256, 256, nil, nil, 256, nil, nil, nil, nil, + nil, 256, nil, nil, nil, nil, nil, nil, nil, 256, + nil, nil, nil, nil, 256, 256, 256, 256, 256, 256, + nil, nil, nil, 256, 256, nil, nil, nil, nil, nil, + nil, 256, nil, nil, 256, 256, 256, nil, 256, 256, + nil, nil, 256, 256, 257, 257, 257, nil, 257, nil, + nil, nil, 257, 257, nil, nil, nil, 257, nil, 257, + 257, 257, 257, 257, 257, 257, nil, nil, nil, nil, + nil, 257, 257, 257, 257, 257, 257, 257, nil, nil, + 257, nil, nil, nil, nil, nil, nil, 257, nil, nil, + 257, 257, 257, 257, 257, 257, 257, 257, nil, 257, + 257, 257, nil, 257, 257, nil, 257, 257, 257, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, 257, nil, nil, 257, 257, nil, nil, 257, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 257, 257, 257, + 257, 257, 257, nil, nil, nil, 257, 257, nil, nil, + nil, nil, nil, nil, 257, nil, nil, 257, 257, 257, + nil, 257, 257, nil, nil, 257, 257, 258, 258, 258, + nil, 258, nil, nil, nil, 258, 258, nil, nil, nil, + 258, nil, 258, 258, 258, 258, 258, 258, 258, nil, + nil, nil, nil, nil, 258, 258, 258, 258, 258, 258, + 258, nil, nil, 258, nil, nil, nil, nil, nil, nil, + 258, nil, nil, 258, 258, 258, 258, 258, 258, 258, + 258, nil, 258, 258, 258, nil, 258, 258, nil, 258, + 258, 258, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 258, nil, nil, 258, nil, nil, 258, 258, nil, + nil, 258, nil, nil, nil, nil, nil, 258, nil, nil, + nil, nil, nil, nil, nil, 258, nil, nil, nil, nil, + 258, 258, 258, 258, 258, 258, nil, nil, nil, 258, + 258, nil, nil, nil, nil, nil, nil, 258, nil, nil, + 258, 258, 258, nil, 258, 258, nil, nil, 258, 258, + 259, 259, 259, nil, 259, nil, nil, nil, 259, 259, + nil, nil, nil, 259, nil, 259, 259, 259, 259, 259, + 259, 259, nil, nil, nil, nil, nil, 259, 259, 259, + 259, 259, 259, 259, nil, nil, 259, nil, nil, nil, + nil, nil, nil, 259, nil, nil, 259, 259, 259, 259, + 259, 259, 259, 259, nil, 259, 259, 259, nil, 259, + 259, nil, 259, 259, 259, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 259, nil, nil, 259, nil, nil, + 259, 259, nil, nil, 259, nil, nil, nil, nil, nil, + 259, nil, nil, nil, nil, nil, nil, nil, 259, nil, + nil, nil, nil, 259, 259, 259, 259, 259, 259, nil, + nil, nil, 259, 259, nil, nil, nil, nil, nil, nil, + 259, nil, nil, 259, 259, 259, nil, 259, 259, nil, + nil, 259, 259, 260, 260, 260, nil, 260, nil, nil, + nil, 260, 260, nil, nil, nil, 260, nil, 260, 260, + 260, 260, 260, 260, 260, nil, nil, nil, nil, nil, + 260, 260, 260, 260, 260, 260, 260, nil, nil, 260, + nil, nil, nil, nil, nil, nil, 260, nil, nil, 260, + 260, 260, 260, 260, 260, 260, 260, nil, 260, 260, + 260, nil, 260, 260, nil, 260, 260, 260, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 260, nil, nil, + 260, nil, nil, 260, 260, nil, nil, 260, nil, nil, + nil, nil, nil, 260, nil, nil, nil, nil, nil, nil, + nil, 260, nil, nil, nil, nil, 260, 260, 260, 260, + 260, 260, nil, nil, nil, 260, 260, nil, nil, nil, + nil, nil, nil, 260, nil, nil, 260, 260, 260, nil, + 260, 260, nil, nil, 260, 260, 261, 261, 261, nil, + 261, nil, nil, nil, 261, 261, nil, nil, nil, 261, + nil, 261, 261, 261, 261, 261, 261, 261, nil, nil, + nil, nil, nil, 261, 261, 261, 261, 261, 261, 261, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 261, + nil, nil, 261, 261, 261, 261, 261, 261, 261, 261, + nil, 261, 261, 261, nil, 261, 261, nil, 261, 261, + 261, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 261, nil, nil, 261, nil, nil, 261, 261, nil, nil, + 261, nil, nil, nil, nil, nil, 261, nil, nil, nil, + nil, nil, nil, nil, 261, nil, nil, nil, nil, 261, + 261, 261, 261, 261, 261, nil, nil, nil, 261, 261, + nil, nil, nil, nil, nil, nil, 261, nil, nil, 261, + 261, 261, nil, 261, 261, nil, nil, 261, 261, 262, + 262, 262, nil, 262, nil, nil, nil, 262, 262, nil, + nil, nil, 262, nil, 262, 262, 262, 262, 262, 262, + 262, nil, nil, nil, nil, nil, 262, 262, 262, 262, + 262, 262, 262, nil, nil, 262, nil, nil, nil, nil, + nil, nil, 262, nil, nil, 262, 262, 262, 262, 262, + 262, 262, 262, nil, 262, 262, 262, nil, 262, 262, + nil, 262, 262, 262, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 262, nil, nil, 262, nil, nil, 262, + 262, nil, nil, 262, nil, nil, nil, nil, nil, 262, + nil, nil, nil, nil, nil, nil, nil, 262, nil, nil, + nil, nil, 262, 262, 262, 262, 262, 262, nil, nil, + nil, 262, 262, nil, nil, nil, nil, nil, nil, 262, + nil, nil, 262, 262, 262, nil, 262, 262, nil, nil, + 262, 262, 263, 263, 263, nil, 263, nil, nil, nil, + 263, 263, nil, nil, nil, 263, nil, 263, 263, 263, + 263, 263, 263, 263, nil, nil, nil, nil, nil, 263, + 263, 263, 263, 263, 263, 263, nil, nil, 263, nil, + nil, nil, nil, nil, nil, 263, nil, nil, 263, 263, + 263, 263, 263, 263, 263, 263, nil, 263, 263, 263, + nil, 263, 263, nil, 263, 263, 263, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 263, nil, nil, 263, + nil, nil, 263, 263, nil, nil, 263, nil, nil, nil, + nil, nil, 263, nil, nil, nil, nil, nil, nil, nil, + 263, nil, nil, nil, nil, 263, 263, 263, 263, 263, + 263, nil, nil, nil, 263, 263, nil, nil, nil, nil, + nil, nil, 263, nil, nil, 263, 263, 263, nil, 263, + 263, nil, nil, 263, 263, 264, 264, 264, nil, 264, + nil, nil, nil, 264, 264, nil, nil, nil, 264, nil, + 264, 264, 264, 264, 264, 264, 264, nil, nil, nil, + nil, nil, 264, 264, 264, 264, 264, 264, 264, nil, + nil, 264, nil, nil, nil, nil, nil, nil, 264, nil, + nil, 264, 264, 264, 264, 264, 264, 264, 264, nil, + 264, 264, 264, nil, 264, 264, nil, 264, 264, 264, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 264, + nil, nil, 264, nil, nil, 264, 264, nil, nil, 264, + nil, nil, nil, nil, nil, 264, nil, nil, nil, nil, + nil, nil, nil, 264, nil, nil, nil, nil, 264, 264, + 264, 264, 264, 264, nil, nil, nil, 264, 264, nil, + nil, nil, nil, nil, nil, 264, nil, nil, 264, 264, + 264, nil, 264, 264, nil, nil, 264, 264, 265, 265, + 265, nil, 265, nil, nil, nil, 265, 265, nil, nil, + nil, 265, nil, 265, 265, 265, 265, 265, 265, 265, + nil, nil, nil, nil, nil, 265, 265, 265, 265, 265, + 265, 265, nil, nil, 265, nil, nil, nil, nil, nil, + nil, 265, nil, nil, 265, 265, 265, 265, 265, 265, + 265, 265, nil, 265, 265, 265, nil, 265, 265, nil, + 265, 265, 265, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 265, nil, nil, 265, nil, nil, 265, 265, + nil, nil, 265, nil, nil, nil, nil, nil, 265, nil, + nil, nil, nil, nil, nil, nil, 265, nil, nil, nil, + nil, 265, 265, 265, 265, 265, 265, nil, nil, nil, + 265, 265, nil, nil, nil, nil, nil, nil, 265, nil, + nil, 265, 265, 265, nil, 265, 265, nil, nil, 265, + 265, 266, 266, 266, nil, 266, nil, nil, nil, 266, + 266, nil, nil, nil, 266, nil, 266, 266, 266, 266, + 266, 266, 266, nil, nil, nil, nil, nil, 266, 266, + 266, 266, 266, 266, 266, nil, nil, 266, nil, nil, + nil, nil, nil, nil, 266, nil, nil, 266, 266, 266, + 266, 266, 266, 266, 266, nil, 266, 266, 266, nil, + 266, 266, nil, 266, 266, 266, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 266, nil, nil, 266, nil, + nil, 266, 266, nil, nil, 266, nil, nil, nil, nil, + nil, 266, nil, nil, nil, nil, nil, nil, nil, 266, + nil, nil, nil, nil, 266, 266, 266, 266, 266, 266, + nil, nil, nil, 266, 266, nil, nil, nil, nil, nil, + nil, 266, nil, nil, 266, 266, 266, nil, 266, 266, + nil, nil, 266, 266, 267, 267, 267, nil, 267, nil, + nil, nil, 267, 267, nil, nil, nil, 267, nil, 267, + 267, 267, 267, 267, 267, 267, nil, nil, nil, nil, + nil, 267, 267, 267, 267, 267, 267, 267, nil, nil, + 267, nil, nil, nil, nil, nil, nil, 267, nil, nil, + 267, 267, 267, 267, 267, 267, 267, 267, nil, 267, + 267, 267, nil, 267, 267, nil, 267, 267, 267, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 267, nil, + nil, 267, nil, nil, 267, 267, nil, nil, 267, nil, + nil, nil, nil, nil, 267, nil, nil, nil, nil, nil, + nil, nil, 267, nil, nil, nil, nil, 267, 267, 267, + 267, 267, 267, nil, nil, nil, 267, 267, nil, nil, + nil, nil, nil, nil, 267, nil, nil, 267, 267, 267, + nil, 267, 267, nil, nil, 267, 267, 268, 268, 268, + nil, 268, nil, nil, nil, 268, 268, nil, nil, nil, + 268, nil, 268, 268, 268, 268, 268, 268, 268, nil, + nil, nil, nil, nil, 268, 268, 268, 268, 268, 268, + 268, nil, nil, 268, nil, nil, nil, nil, nil, nil, + 268, nil, nil, 268, 268, 268, 268, 268, 268, 268, + 268, nil, 268, 268, 268, nil, 268, 268, nil, 268, + 268, 268, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 268, nil, nil, 268, nil, nil, 268, 268, nil, + nil, 268, nil, nil, nil, nil, nil, 268, nil, nil, + nil, nil, nil, nil, nil, 268, nil, nil, nil, nil, + 268, 268, 268, 268, 268, 268, nil, nil, nil, 268, + 268, nil, nil, nil, nil, nil, nil, 268, nil, nil, + 268, 268, 268, nil, 268, 268, nil, nil, 268, 268, + 269, 269, 269, nil, 269, nil, nil, nil, 269, 269, + nil, nil, nil, 269, nil, 269, 269, 269, 269, 269, + 269, 269, nil, nil, nil, nil, nil, 269, 269, 269, + 269, 269, 269, 269, nil, nil, 269, nil, nil, nil, + nil, nil, nil, 269, nil, nil, 269, 269, 269, 269, + 269, 269, 269, 269, nil, 269, 269, 269, nil, 269, + 269, nil, 269, 269, 269, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 269, nil, nil, 269, nil, nil, + 269, 269, nil, nil, 269, nil, nil, nil, nil, nil, + 269, nil, nil, nil, nil, nil, nil, nil, 269, nil, + nil, nil, nil, 269, 269, 269, 269, 269, 269, nil, + nil, nil, 269, 269, nil, nil, nil, nil, nil, nil, + 269, nil, nil, 269, 269, 269, nil, 269, 269, nil, + nil, 269, 269, 270, 270, 270, nil, 270, nil, nil, + nil, 270, 270, nil, nil, nil, 270, nil, 270, 270, + 270, 270, 270, 270, 270, nil, nil, nil, nil, nil, + 270, 270, 270, 270, 270, 270, 270, nil, nil, 270, + nil, nil, nil, nil, nil, nil, 270, nil, nil, 270, + 270, 270, 270, 270, 270, 270, 270, nil, 270, 270, + 270, nil, 270, 270, nil, 270, 270, 270, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 270, nil, nil, + 270, nil, nil, 270, 270, nil, nil, 270, nil, nil, + nil, nil, nil, 270, nil, nil, nil, nil, nil, nil, + nil, 270, nil, nil, nil, nil, 270, 270, 270, 270, + 270, 270, nil, nil, nil, 270, 270, nil, nil, nil, + nil, nil, nil, 270, nil, nil, 270, 270, 270, nil, + 270, 270, nil, nil, 270, 270, 271, 271, 271, nil, + 271, nil, nil, nil, 271, 271, nil, nil, nil, 271, + nil, 271, 271, 271, 271, 271, 271, 271, nil, nil, + nil, nil, nil, 271, 271, 271, 271, 271, 271, 271, + nil, nil, 271, nil, nil, nil, nil, nil, nil, 271, + nil, nil, 271, 271, 271, 271, 271, 271, 271, 271, + nil, 271, 271, 271, nil, 271, 271, nil, 271, 271, + 271, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 271, nil, nil, 271, nil, nil, 271, 271, nil, nil, + 271, nil, nil, nil, nil, nil, 271, nil, nil, nil, + nil, nil, nil, nil, 271, nil, nil, nil, nil, 271, + 271, 271, 271, 271, 271, nil, nil, nil, 271, 271, + nil, nil, nil, nil, nil, nil, 271, nil, nil, 271, + 271, 271, nil, 271, 271, nil, nil, 271, 271, 272, + 272, 272, nil, 272, nil, nil, nil, 272, 272, nil, + nil, nil, 272, nil, 272, 272, 272, 272, 272, 272, + 272, nil, nil, nil, nil, nil, 272, 272, 272, 272, + 272, 272, 272, nil, nil, 272, nil, nil, nil, nil, + nil, nil, 272, nil, nil, 272, 272, 272, 272, 272, + 272, 272, 272, nil, 272, 272, 272, nil, 272, 272, + nil, 272, 272, 272, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 272, nil, nil, 272, nil, nil, 272, + 272, nil, nil, 272, nil, nil, nil, nil, nil, 272, + nil, nil, nil, nil, nil, nil, nil, 272, nil, nil, + nil, nil, 272, 272, 272, 272, 272, 272, nil, nil, + nil, 272, 272, nil, nil, nil, nil, nil, nil, 272, + nil, nil, 272, 272, 272, nil, 272, 272, nil, nil, + 272, 272, 273, 273, 273, nil, 273, nil, nil, nil, + 273, 273, nil, nil, nil, 273, nil, 273, 273, 273, + 273, 273, 273, 273, nil, nil, nil, nil, nil, 273, + 273, 273, 273, 273, 273, 273, nil, nil, 273, nil, + nil, nil, nil, nil, nil, 273, nil, nil, 273, 273, + 273, 273, 273, 273, 273, 273, nil, 273, 273, 273, + nil, 273, 273, nil, 273, 273, 273, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 273, nil, nil, 273, + nil, nil, 273, 273, nil, nil, 273, nil, nil, nil, + nil, nil, 273, nil, nil, nil, nil, nil, nil, nil, + 273, nil, nil, nil, nil, 273, 273, 273, 273, 273, + 273, nil, nil, nil, 273, 273, nil, nil, nil, nil, + nil, nil, 273, nil, nil, 273, 273, 273, nil, 273, + 273, nil, nil, 273, 273, 274, 274, 274, nil, 274, + nil, nil, nil, 274, 274, nil, nil, nil, 274, nil, + 274, 274, 274, 274, 274, 274, 274, nil, nil, nil, + nil, nil, 274, 274, 274, 274, 274, 274, 274, nil, + nil, 274, nil, nil, nil, nil, nil, nil, 274, nil, + nil, 274, 274, 274, 274, 274, 274, 274, 274, nil, + 274, 274, 274, nil, 274, 274, nil, 274, 274, 274, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 274, + nil, nil, 274, nil, nil, 274, 274, nil, nil, 274, + nil, nil, nil, nil, nil, 274, nil, nil, nil, nil, + nil, nil, nil, 274, nil, nil, nil, nil, 274, 274, + 274, 274, 274, 274, nil, nil, nil, 274, 274, nil, + nil, nil, nil, nil, nil, 274, nil, nil, 274, 274, + 274, nil, 274, 274, nil, nil, 274, 274, 275, 275, + 275, nil, 275, nil, nil, nil, 275, 275, nil, nil, + nil, 275, nil, 275, 275, 275, 275, 275, 275, 275, + nil, nil, nil, nil, nil, 275, 275, 275, 275, 275, + 275, 275, nil, nil, 275, nil, nil, nil, nil, nil, + nil, 275, nil, nil, 275, 275, 275, 275, 275, 275, + 275, 275, nil, 275, 275, 275, nil, 275, 275, nil, + 275, 275, 275, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 275, nil, nil, 275, nil, nil, 275, 275, + nil, nil, 275, nil, nil, nil, nil, nil, 275, nil, + nil, nil, nil, nil, nil, nil, 275, nil, nil, nil, + nil, 275, 275, 275, 275, 275, 275, nil, nil, nil, + 275, 275, nil, nil, nil, nil, nil, nil, 275, nil, + nil, 275, 275, 275, nil, 275, 275, nil, nil, 275, + 275, 280, 280, 280, nil, 280, nil, nil, nil, 280, + 280, nil, nil, nil, 280, nil, 280, 280, 280, 280, + 280, 280, 280, nil, nil, nil, nil, nil, 280, 280, + 280, 280, 280, 280, 280, nil, nil, 280, nil, nil, + nil, nil, nil, nil, 280, nil, nil, 280, 280, 280, + 280, 280, 280, 280, 280, nil, 280, 280, 280, nil, + 280, 280, nil, 280, 280, 280, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 280, nil, nil, 280, nil, + nil, 280, 280, nil, nil, 280, nil, nil, nil, nil, + nil, 280, nil, nil, nil, nil, nil, nil, nil, 280, + nil, nil, nil, nil, 280, 280, 280, 280, 280, 280, + nil, nil, nil, 280, 280, nil, nil, nil, nil, nil, + nil, 280, nil, nil, 280, 280, 280, nil, 280, 280, + nil, nil, 280, 280, 304, 304, 304, nil, 304, nil, + nil, nil, 304, 304, nil, nil, nil, 304, nil, 304, + 304, 304, 304, 304, 304, 304, nil, nil, nil, nil, + nil, 304, 304, 304, 304, 304, 304, 304, nil, nil, + 304, nil, nil, nil, nil, nil, nil, 304, nil, nil, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, nil, 304, 304, nil, 304, 304, 304, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 304, nil, + nil, 304, nil, nil, 304, 304, nil, nil, 304, nil, + 304, nil, 304, nil, 304, nil, nil, nil, nil, nil, + nil, nil, 304, nil, nil, nil, nil, 304, 304, 304, + 304, 304, 304, nil, nil, nil, 304, 304, nil, nil, + nil, nil, nil, nil, 304, nil, 304, 304, 304, 304, + nil, 304, 304, nil, nil, 304, 304, 305, 305, 305, + nil, 305, nil, nil, nil, 305, 305, nil, nil, nil, + 305, nil, 305, 305, 305, 305, 305, 305, 305, nil, + nil, nil, nil, nil, 305, 305, 305, 305, 305, 305, + 305, nil, nil, 305, nil, nil, nil, nil, nil, nil, + 305, nil, nil, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, nil, 305, 305, nil, 305, + 305, 305, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 305, nil, nil, 305, nil, nil, 305, 305, nil, + nil, 305, nil, 305, nil, 305, nil, 305, nil, nil, + nil, nil, nil, nil, nil, 305, nil, nil, nil, nil, + 305, 305, 305, 305, 305, 305, nil, nil, nil, 305, + 305, nil, nil, nil, nil, nil, nil, 305, nil, 305, + 305, 305, 305, nil, 305, 305, nil, nil, 305, 305, + 314, 314, 314, nil, 314, nil, nil, nil, 314, 314, + nil, nil, nil, 314, nil, 314, 314, 314, 314, 314, + 314, 314, nil, nil, nil, nil, nil, 314, 314, 314, + 314, 314, 314, 314, nil, nil, 314, nil, nil, nil, + nil, nil, nil, 314, nil, nil, 314, 314, 314, 314, + 314, 314, 314, 314, 314, 314, 314, 314, nil, 314, + 314, nil, 314, 314, 314, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 314, nil, nil, 314, nil, nil, + 314, 314, nil, nil, 314, nil, 314, nil, 314, nil, + 314, nil, nil, nil, nil, nil, nil, nil, 314, nil, + nil, nil, nil, 314, 314, 314, 314, 314, 314, nil, + nil, nil, 314, 314, 314, nil, nil, nil, nil, nil, + 314, nil, 314, 314, 314, 314, nil, 314, 314, nil, + nil, 314, 314, 321, 321, 321, nil, 321, nil, nil, + nil, 321, 321, nil, nil, nil, 321, nil, 321, 321, + 321, 321, 321, 321, 321, nil, nil, nil, nil, nil, + 321, 321, 321, 321, 321, 321, 321, nil, nil, 321, + nil, nil, nil, nil, nil, nil, 321, nil, nil, 321, + 321, 321, 321, 321, 321, 321, 321, nil, 321, 321, + 321, nil, 321, 321, nil, 321, 321, 321, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 321, nil, nil, + 321, nil, nil, 321, 321, nil, nil, 321, nil, nil, + nil, nil, nil, 321, nil, nil, nil, nil, nil, nil, + nil, 321, nil, nil, nil, nil, 321, 321, 321, 321, + 321, 321, nil, nil, nil, 321, 321, nil, nil, nil, + nil, nil, nil, 321, nil, nil, 321, 321, 321, nil, + 321, 321, nil, nil, 321, 321, 323, 323, 323, nil, + 323, nil, nil, nil, 323, 323, nil, nil, nil, 323, + nil, 323, 323, 323, 323, 323, 323, 323, nil, nil, + nil, nil, nil, 323, 323, 323, 323, 323, 323, 323, + nil, nil, 323, nil, nil, nil, nil, nil, nil, 323, + nil, nil, 323, 323, 323, 323, 323, 323, 323, 323, + nil, 323, 323, 323, nil, 323, 323, nil, 323, 323, + 323, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 323, nil, nil, 323, nil, nil, 323, 323, nil, nil, + 323, nil, nil, nil, nil, nil, 323, nil, nil, nil, + nil, nil, nil, nil, 323, nil, nil, nil, nil, 323, + 323, 323, 323, 323, 323, nil, nil, nil, 323, 323, + nil, nil, nil, nil, nil, nil, 323, nil, nil, 323, + 323, 323, nil, 323, 323, nil, nil, 323, 323, 326, + 326, 326, nil, 326, nil, nil, nil, 326, 326, nil, + nil, nil, 326, nil, 326, 326, 326, 326, 326, 326, + 326, nil, nil, nil, nil, nil, 326, 326, 326, 326, + 326, 326, 326, nil, nil, 326, nil, nil, nil, nil, + nil, nil, 326, nil, nil, 326, 326, 326, 326, 326, + 326, 326, 326, nil, 326, 326, 326, nil, 326, 326, + nil, 326, 326, 326, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 326, nil, nil, 326, nil, nil, 326, + 326, nil, nil, 326, nil, nil, nil, nil, nil, 326, + nil, nil, nil, nil, nil, nil, nil, 326, nil, nil, + nil, nil, 326, 326, 326, 326, 326, 326, nil, nil, + nil, 326, 326, nil, nil, nil, nil, nil, nil, 326, + nil, nil, 326, 326, 326, nil, 326, 326, nil, nil, + 326, 326, 327, 327, 327, nil, 327, nil, nil, nil, + 327, 327, nil, nil, nil, 327, nil, 327, 327, 327, + 327, 327, 327, 327, nil, nil, nil, nil, nil, 327, + 327, 327, 327, 327, 327, 327, nil, nil, 327, nil, + nil, nil, nil, nil, nil, 327, nil, nil, 327, 327, + 327, 327, 327, 327, 327, 327, nil, 327, 327, 327, + nil, 327, 327, nil, 327, 327, 327, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 327, nil, nil, 327, + nil, nil, 327, 327, nil, nil, 327, nil, nil, nil, + nil, nil, 327, nil, nil, nil, nil, nil, nil, nil, + 327, nil, nil, nil, nil, 327, 327, 327, 327, 327, + 327, nil, nil, nil, 327, 327, nil, nil, nil, nil, + nil, nil, 327, nil, nil, 327, 327, 327, nil, 327, + 327, nil, nil, 327, 327, 333, 333, 333, 333, 333, + nil, nil, nil, 333, 333, nil, nil, nil, 333, nil, + 333, 333, 333, 333, 333, 333, 333, nil, nil, nil, + nil, nil, 333, 333, 333, 333, 333, 333, 333, nil, + nil, 333, nil, nil, nil, nil, nil, 333, 333, nil, + 333, 333, 333, 333, 333, 333, 333, 333, 333, nil, + 333, 333, 333, nil, 333, 333, nil, 333, 333, 333, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 333, + nil, nil, 333, nil, nil, 333, 333, nil, nil, 333, + nil, 333, nil, nil, nil, 333, nil, nil, nil, nil, + nil, nil, nil, 333, nil, nil, nil, nil, 333, 333, + 333, 333, 333, 333, nil, nil, nil, 333, 333, nil, + nil, nil, nil, nil, nil, 333, nil, nil, 333, 333, + 333, nil, 333, 333, nil, nil, 333, 333, 369, 369, + 369, nil, 369, nil, nil, nil, 369, 369, nil, nil, + nil, 369, nil, 369, 369, 369, 369, 369, 369, 369, + nil, nil, nil, nil, nil, 369, 369, 369, 369, 369, + 369, 369, nil, nil, 369, nil, nil, nil, nil, nil, + nil, 369, nil, nil, 369, 369, 369, 369, 369, 369, + 369, 369, nil, 369, 369, 369, nil, 369, 369, nil, + 369, 369, 369, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 369, nil, nil, 369, nil, nil, 369, 369, + nil, nil, 369, nil, nil, nil, nil, nil, 369, nil, + nil, nil, nil, nil, nil, nil, 369, nil, nil, nil, + nil, 369, 369, 369, 369, 369, 369, nil, nil, nil, + 369, 369, nil, nil, nil, nil, nil, nil, 369, nil, + nil, 369, 369, 369, nil, 369, 369, nil, nil, 369, + 369, 371, 371, 371, nil, 371, nil, nil, nil, 371, + 371, nil, nil, nil, 371, nil, 371, 371, 371, 371, + 371, 371, 371, nil, nil, nil, nil, nil, 371, 371, + 371, 371, 371, 371, 371, nil, nil, 371, nil, nil, + nil, nil, nil, nil, 371, nil, nil, 371, 371, 371, + 371, 371, 371, 371, 371, nil, 371, 371, 371, nil, + 371, 371, nil, 371, 371, 371, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 371, nil, nil, 371, 371, + nil, 371, 371, nil, nil, 371, nil, nil, nil, nil, + nil, 371, nil, nil, nil, nil, nil, nil, nil, 371, + nil, nil, nil, nil, 371, 371, 371, 371, 371, 371, + nil, nil, nil, 371, 371, nil, nil, nil, nil, nil, + nil, 371, nil, nil, 371, 371, 371, nil, 371, 371, + nil, nil, 371, 371, 387, 387, 387, nil, 387, nil, + nil, nil, 387, 387, nil, nil, nil, 387, nil, 387, + 387, 387, 387, 387, 387, 387, nil, nil, nil, nil, + nil, 387, 387, 387, 387, 387, 387, 387, nil, nil, + 387, nil, nil, nil, nil, nil, nil, 387, nil, nil, + 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, + 387, 387, nil, 387, 387, nil, 387, 387, 387, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 387, nil, + nil, 387, nil, nil, 387, 387, nil, nil, 387, nil, + nil, nil, nil, nil, 387, nil, nil, nil, nil, nil, + nil, nil, 387, nil, nil, nil, nil, 387, 387, 387, + 387, 387, 387, nil, nil, nil, 387, 387, nil, nil, + nil, nil, nil, nil, 387, nil, 387, 387, 387, 387, + nil, 387, 387, nil, nil, 387, 387, 392, 392, 392, + nil, 392, nil, nil, nil, 392, 392, nil, nil, nil, + 392, nil, 392, 392, 392, 392, 392, 392, 392, nil, + nil, nil, nil, nil, 392, 392, 392, 392, 392, 392, + 392, nil, nil, 392, nil, nil, nil, nil, nil, nil, + 392, nil, nil, 392, 392, 392, 392, 392, 392, 392, + 392, nil, 392, 392, 392, nil, 392, 392, nil, 392, + 392, 392, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 392, nil, nil, 392, nil, nil, 392, 392, nil, + nil, 392, nil, nil, nil, nil, nil, 392, nil, nil, + nil, nil, nil, nil, nil, 392, nil, nil, nil, nil, + 392, 392, 392, 392, 392, 392, nil, nil, nil, 392, + 392, nil, nil, nil, nil, nil, nil, 392, nil, nil, + 392, 392, 392, nil, 392, 392, nil, nil, 392, 392, + 413, 413, 413, nil, 413, nil, nil, nil, 413, 413, + nil, nil, nil, 413, nil, 413, 413, 413, 413, 413, + 413, 413, nil, nil, nil, nil, nil, 413, 413, 413, + 413, 413, 413, 413, nil, nil, 413, nil, nil, nil, + nil, nil, nil, 413, nil, nil, 413, 413, 413, 413, + 413, 413, 413, 413, nil, 413, 413, 413, nil, 413, + 413, nil, 413, 413, 413, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 413, nil, nil, 413, nil, nil, + 413, 413, nil, nil, 413, nil, nil, nil, nil, nil, + 413, nil, nil, nil, nil, nil, nil, nil, 413, nil, + nil, nil, nil, 413, 413, 413, 413, 413, 413, nil, + nil, nil, 413, 413, nil, nil, nil, nil, nil, nil, + 413, nil, nil, 413, 413, 413, nil, 413, 413, nil, + nil, 413, 413, 459, 459, 459, nil, 459, nil, nil, + nil, 459, 459, nil, nil, nil, 459, nil, 459, 459, + 459, 459, 459, 459, 459, nil, nil, nil, nil, nil, + 459, 459, 459, 459, 459, 459, 459, nil, nil, 459, + nil, nil, nil, nil, nil, nil, 459, nil, nil, 459, + 459, 459, 459, 459, 459, 459, 459, nil, 459, 459, + 459, nil, 459, 459, nil, 459, 459, 459, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 459, nil, nil, + 459, nil, nil, 459, 459, nil, nil, 459, nil, nil, + nil, nil, nil, 459, nil, nil, nil, nil, nil, nil, + nil, 459, nil, nil, nil, nil, 459, 459, 459, 459, + 459, 459, nil, nil, nil, 459, 459, nil, nil, nil, + nil, nil, nil, 459, nil, nil, 459, 459, 459, 493, + 459, 459, nil, nil, 459, 459, 493, 493, 493, nil, + nil, 493, 493, 493, 1088, 493, 1088, 1088, 1088, 1088, + 1088, nil, nil, 493, 493, 493, 493, 493, nil, nil, + 1088, nil, nil, nil, nil, 493, 493, nil, 493, 493, + 493, 493, 493, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1088, nil, nil, nil, nil, nil, nil, nil, + nil, 1088, 1088, 1088, 1088, nil, 493, 493, 493, 493, + 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, + nil, nil, 493, 493, 493, nil, nil, 493, nil, nil, + 493, nil, nil, 493, 493, nil, 493, 1088, 493, nil, + 493, nil, 493, 493, 493, 493, 493, 493, 493, nil, + 493, 493, 493, 1093, nil, 1093, 1093, 1093, 1093, 1093, + nil, nil, nil, nil, nil, 493, 493, 493, 493, 1093, + 493, 494, 493, nil, nil, nil, nil, 493, 494, 494, + 494, 493, nil, 494, 494, 494, nil, 494, nil, nil, + nil, 1093, nil, nil, nil, 494, 494, 494, 494, 494, + nil, nil, 1093, 1093, nil, nil, nil, 494, 494, nil, + 494, 494, 494, 494, 494, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1093, nil, 494, 494, + 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, + 494, 494, nil, nil, 494, 494, 494, nil, nil, 494, + nil, nil, 494, nil, nil, 494, 494, nil, 494, nil, + 494, nil, 494, nil, 494, 494, 494, 494, 494, 494, + 494, nil, 494, 494, 494, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 494, 494, 494, + 494, nil, 494, nil, 494, nil, 503, 503, 503, 494, + 503, nil, nil, 494, 503, 503, nil, nil, nil, 503, + nil, 503, 503, 503, 503, 503, 503, 503, nil, nil, + nil, nil, nil, 503, 503, 503, 503, 503, 503, 503, + nil, nil, 503, nil, nil, nil, nil, nil, nil, 503, + nil, nil, 503, 503, 503, 503, 503, 503, 503, 503, + 503, 503, 503, 503, nil, 503, 503, nil, 503, 503, + 503, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 503, nil, nil, 503, nil, nil, 503, 503, nil, nil, + 503, nil, 503, nil, 503, nil, 503, nil, nil, nil, + nil, nil, nil, nil, 503, nil, nil, nil, nil, 503, + 503, 503, 503, 503, 503, nil, nil, nil, 503, 503, + nil, nil, nil, nil, nil, nil, 503, nil, 503, 503, + 503, 503, nil, 503, 503, nil, nil, 503, 503, 505, + 505, 505, nil, 505, nil, nil, nil, 505, 505, nil, + nil, nil, 505, nil, 505, 505, 505, 505, 505, 505, + 505, nil, nil, nil, nil, nil, 505, 505, 505, 505, + 505, 505, 505, nil, nil, 505, nil, nil, nil, nil, + nil, nil, 505, nil, nil, 505, 505, 505, 505, 505, + 505, 505, 505, nil, 505, 505, 505, nil, 505, 505, + nil, 505, 505, 505, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 505, nil, nil, 505, nil, nil, 505, + 505, nil, nil, 505, nil, nil, nil, nil, nil, 505, + nil, nil, nil, nil, nil, nil, nil, 505, nil, nil, + nil, nil, 505, 505, 505, 505, 505, 505, nil, nil, + nil, 505, 505, nil, nil, nil, nil, nil, nil, 505, + nil, nil, 505, 505, 505, nil, 505, 505, nil, nil, + 505, 505, 506, 506, 506, nil, 506, nil, nil, nil, + 506, 506, nil, nil, nil, 506, nil, 506, 506, 506, + 506, 506, 506, 506, nil, nil, nil, nil, nil, 506, + 506, 506, 506, 506, 506, 506, nil, nil, 506, nil, + nil, nil, nil, nil, nil, 506, nil, nil, 506, 506, + 506, 506, 506, 506, 506, 506, nil, 506, 506, 506, + nil, 506, 506, nil, 506, 506, 506, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 506, nil, nil, 506, + nil, nil, 506, 506, nil, nil, 506, nil, nil, nil, + nil, nil, 506, nil, nil, nil, nil, nil, nil, nil, + 506, nil, nil, nil, nil, 506, 506, 506, 506, 506, + 506, nil, nil, nil, 506, 506, nil, nil, nil, nil, + nil, nil, 506, nil, nil, 506, 506, 506, nil, 506, + 506, nil, nil, 506, 506, 507, 507, 507, nil, 507, + nil, nil, nil, 507, 507, nil, nil, nil, 507, nil, + 507, 507, 507, 507, 507, 507, 507, nil, nil, nil, + nil, nil, 507, 507, 507, 507, 507, 507, 507, nil, + nil, 507, nil, nil, nil, nil, nil, nil, 507, nil, + nil, 507, 507, 507, 507, 507, 507, 507, 507, nil, + 507, 507, 507, nil, 507, 507, nil, 507, 507, 507, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 507, + nil, nil, 507, nil, nil, 507, 507, nil, nil, 507, + nil, nil, nil, nil, nil, 507, nil, nil, nil, nil, + nil, nil, nil, 507, nil, nil, nil, nil, 507, 507, + 507, 507, 507, 507, nil, nil, nil, 507, 507, nil, + nil, nil, nil, nil, nil, 507, nil, nil, 507, 507, + 507, nil, 507, 507, nil, nil, 507, 507, 536, 536, + 536, nil, 536, nil, nil, nil, 536, 536, nil, nil, + nil, 536, nil, 536, 536, 536, 536, 536, 536, 536, + nil, nil, nil, nil, nil, 536, 536, 536, 536, 536, + 536, 536, nil, nil, 536, nil, nil, nil, nil, nil, + nil, 536, nil, nil, 536, 536, 536, 536, 536, 536, + 536, 536, nil, 536, 536, 536, nil, 536, 536, nil, + 536, 536, 536, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 536, nil, nil, 536, nil, nil, 536, 536, + nil, nil, 536, nil, nil, nil, nil, nil, 536, nil, + nil, nil, nil, nil, nil, nil, 536, nil, nil, nil, + nil, 536, 536, 536, 536, 536, 536, nil, nil, nil, + 536, 536, nil, nil, nil, nil, nil, nil, 536, nil, + nil, 536, 536, 536, 539, 536, 536, nil, nil, 536, + 536, 539, 539, 539, nil, nil, 539, 539, 539, nil, + 539, 931, 931, 931, 931, nil, nil, nil, 539, 539, + 539, nil, nil, nil, nil, nil, nil, 931, 931, 931, + 539, 539, nil, 539, 539, 539, 539, 539, nil, nil, + 931, 931, nil, nil, nil, 931, nil, nil, nil, nil, + nil, 1095, nil, 1095, 1095, 1095, 1095, 1095, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1095, nil, nil, + nil, nil, 539, nil, nil, nil, nil, nil, nil, 539, + nil, nil, nil, nil, 539, 539, nil, nil, nil, 1095, + nil, nil, nil, nil, 931, 931, 931, 931, 931, 931, + 1095, 1095, nil, 931, 931, nil, 539, 539, nil, nil, + nil, 931, nil, nil, 931, 931, 931, nil, 931, 931, + 539, nil, 544, 544, 544, 539, 544, nil, nil, nil, + 544, 544, 539, nil, 1095, 544, 539, 544, 544, 544, + 544, 544, 544, 544, nil, nil, nil, nil, nil, 544, + 544, 544, 544, 544, 544, 544, nil, nil, 544, nil, + nil, nil, nil, nil, nil, 544, nil, nil, 544, 544, + 544, 544, 544, 544, 544, 544, nil, 544, 544, 544, + nil, 544, 544, nil, 544, 544, 544, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 544, nil, nil, 544, + nil, nil, 544, 544, nil, nil, 544, nil, nil, nil, + nil, nil, 544, nil, nil, nil, nil, nil, nil, nil, + 544, nil, nil, nil, nil, 544, 544, 544, 544, 544, + 544, nil, nil, nil, 544, 544, nil, nil, nil, nil, + nil, nil, 544, nil, nil, 544, 544, 544, nil, 544, + 544, nil, nil, 544, 544, 554, 554, 554, nil, 554, + nil, nil, nil, 554, 554, nil, nil, nil, 554, nil, + 554, 554, 554, 554, 554, 554, 554, nil, nil, nil, + nil, nil, 554, 554, 554, 554, 554, 554, 554, nil, + nil, 554, nil, nil, nil, nil, nil, nil, 554, nil, + nil, 554, 554, 554, 554, 554, 554, 554, 554, 554, + 554, 554, 554, nil, 554, 554, nil, 554, 554, 554, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 554, + nil, nil, 554, nil, nil, 554, 554, nil, nil, 554, + nil, 554, nil, 554, nil, 554, nil, nil, nil, nil, + nil, nil, nil, 554, nil, nil, nil, nil, 554, 554, + 554, 554, 554, 554, nil, nil, nil, 554, 554, nil, + nil, nil, nil, nil, nil, 554, nil, 554, 554, 554, + 554, nil, 554, 554, nil, nil, 554, 554, 557, 557, + 557, nil, 557, nil, nil, nil, 557, 557, nil, nil, + nil, 557, nil, 557, 557, 557, 557, 557, 557, 557, + nil, nil, nil, nil, nil, 557, 557, 557, 557, 557, + 557, 557, nil, nil, 557, nil, nil, nil, nil, nil, + nil, 557, nil, nil, 557, 557, 557, 557, 557, 557, + 557, 557, 557, 557, 557, 557, nil, 557, 557, nil, + 557, 557, 557, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 557, nil, nil, 557, nil, nil, 557, 557, + nil, nil, 557, nil, nil, nil, 557, nil, 557, nil, + nil, nil, nil, nil, nil, nil, 557, nil, nil, nil, + nil, 557, 557, 557, 557, 557, 557, nil, nil, nil, + 557, 557, nil, nil, nil, nil, nil, nil, 557, nil, + 557, 557, 557, 557, nil, 557, 557, nil, nil, 557, + 557, 559, 559, 559, nil, 559, nil, nil, nil, 559, + 559, nil, nil, nil, 559, nil, 559, 559, 559, 559, + 559, 559, 559, nil, nil, nil, nil, nil, 559, 559, + 559, 559, 559, 559, 559, nil, nil, 559, nil, nil, + nil, nil, nil, nil, 559, nil, nil, 559, 559, 559, + 559, 559, 559, 559, 559, nil, 559, 559, 559, nil, + 559, 559, nil, 559, 559, 559, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 559, nil, nil, 559, nil, + nil, 559, 559, nil, nil, 559, nil, nil, nil, nil, + nil, 559, nil, nil, nil, nil, nil, nil, nil, 559, + nil, nil, nil, nil, 559, 559, 559, 559, 559, 559, + nil, nil, nil, 559, 559, nil, nil, nil, nil, nil, + nil, 559, nil, nil, 559, 559, 559, nil, 559, 559, + nil, nil, 559, 559, 565, 565, 565, 565, 565, nil, + nil, nil, 565, 565, nil, nil, nil, 565, nil, 565, + 565, 565, 565, 565, 565, 565, nil, nil, nil, nil, + nil, 565, 565, 565, 565, 565, 565, 565, nil, nil, + 565, nil, nil, nil, nil, nil, 565, 565, 565, 565, + 565, 565, 565, 565, 565, 565, 565, 565, nil, 565, + 565, 565, nil, 565, 565, nil, 565, 565, 565, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 565, nil, + nil, 565, nil, nil, 565, 565, nil, nil, 565, nil, + 565, nil, nil, nil, 565, nil, nil, nil, nil, nil, + nil, nil, 565, nil, nil, nil, nil, 565, 565, 565, + 565, 565, 565, nil, nil, nil, 565, 565, nil, nil, + nil, nil, nil, 565, 565, nil, nil, 565, 565, 565, + nil, 565, 565, nil, nil, 565, 565, 575, 575, 575, + nil, 575, nil, nil, nil, 575, 575, nil, nil, nil, + 575, nil, 575, 575, 575, 575, 575, 575, 575, nil, + nil, nil, nil, nil, 575, 575, 575, 575, 575, 575, + 575, nil, nil, 575, nil, nil, nil, nil, nil, nil, + 575, nil, nil, 575, 575, 575, 575, 575, 575, 575, + 575, 575, 575, 575, 575, nil, 575, 575, nil, 575, + 575, 575, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 575, nil, nil, 575, nil, nil, 575, 575, nil, + nil, 575, nil, 575, nil, 575, nil, 575, nil, nil, + nil, nil, nil, nil, nil, 575, nil, nil, nil, nil, + 575, 575, 575, 575, 575, 575, nil, nil, nil, 575, + 575, nil, nil, nil, nil, nil, nil, 575, nil, 575, + 575, 575, 575, nil, 575, 575, nil, nil, 575, 575, + 585, 585, 585, nil, 585, nil, nil, nil, 585, 585, + nil, nil, nil, 585, nil, 585, 585, 585, 585, 585, + 585, 585, nil, nil, nil, nil, nil, 585, 585, 585, + 585, 585, 585, 585, nil, nil, 585, nil, nil, nil, + nil, nil, nil, 585, nil, nil, 585, 585, 585, 585, + 585, 585, 585, 585, nil, 585, 585, 585, nil, 585, + 585, nil, 585, 585, 585, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 585, nil, nil, 585, nil, nil, + 585, 585, nil, nil, 585, nil, nil, nil, nil, nil, + 585, nil, nil, nil, nil, nil, nil, nil, 585, nil, + nil, nil, nil, 585, 585, 585, 585, 585, 585, nil, + nil, nil, 585, 585, nil, nil, nil, nil, nil, nil, + 585, nil, nil, 585, 585, 585, nil, 585, 585, nil, + nil, 585, 585, 588, 588, 588, nil, 588, nil, nil, + nil, 588, 588, nil, nil, nil, 588, nil, 588, 588, + 588, 588, 588, 588, 588, nil, nil, nil, nil, nil, + 588, 588, 588, 588, 588, 588, 588, nil, nil, 588, + nil, nil, nil, nil, nil, nil, 588, nil, nil, 588, + 588, 588, 588, 588, 588, 588, 588, nil, 588, 588, + 588, nil, 588, 588, nil, 588, 588, 588, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 588, nil, nil, + 588, nil, nil, 588, 588, nil, nil, 588, nil, nil, + nil, nil, nil, 588, nil, nil, nil, nil, nil, nil, + nil, 588, nil, nil, nil, nil, 588, 588, 588, 588, + 588, 588, nil, nil, nil, 588, 588, nil, nil, nil, + nil, nil, nil, 588, nil, nil, 588, 588, 588, nil, + 588, 588, nil, nil, 588, 588, 591, 591, 591, nil, + 591, nil, nil, nil, 591, 591, nil, nil, nil, 591, + nil, 591, 591, 591, 591, 591, 591, 591, nil, nil, + nil, nil, nil, 591, 591, 591, 591, 591, 591, 591, + nil, nil, 591, nil, nil, nil, nil, nil, nil, 591, + nil, nil, 591, 591, 591, 591, 591, 591, 591, 591, + nil, 591, 591, 591, nil, 591, 591, nil, 591, 591, + 591, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 591, nil, nil, 591, nil, nil, 591, 591, nil, nil, + 591, nil, nil, nil, nil, nil, 591, nil, nil, nil, + nil, nil, nil, nil, 591, nil, nil, nil, nil, 591, + 591, 591, 591, 591, 591, nil, nil, nil, 591, 591, + nil, nil, nil, nil, nil, nil, 591, nil, nil, 591, + 591, 591, nil, 591, 591, nil, nil, 591, 591, 592, + 592, 592, nil, 592, nil, nil, nil, 592, 592, nil, + nil, nil, 592, nil, 592, 592, 592, 592, 592, 592, + 592, nil, nil, nil, nil, nil, 592, 592, 592, 592, + 592, 592, 592, nil, nil, 592, nil, nil, nil, nil, + nil, nil, 592, nil, nil, 592, 592, 592, 592, 592, + 592, 592, 592, nil, 592, 592, 592, nil, 592, 592, + nil, 592, 592, 592, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 592, nil, nil, 592, nil, nil, 592, + 592, nil, nil, 592, nil, nil, nil, nil, nil, 592, + nil, nil, nil, nil, nil, nil, nil, 592, nil, nil, + nil, nil, 592, 592, 592, 592, 592, 592, nil, nil, + nil, 592, 592, nil, nil, nil, nil, nil, nil, 592, + nil, nil, 592, 592, 592, nil, 592, 592, nil, nil, + 592, 592, 618, 618, 618, nil, 618, nil, nil, nil, + 618, 618, nil, nil, nil, 618, nil, 618, 618, 618, + 618, 618, 618, 618, nil, nil, nil, nil, nil, 618, + 618, 618, 618, 618, 618, 618, nil, nil, 618, nil, + nil, nil, nil, nil, nil, 618, nil, nil, 618, 618, + 618, 618, 618, 618, 618, 618, nil, 618, 618, 618, + nil, 618, 618, nil, 618, 618, 618, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 618, nil, nil, 618, + nil, nil, 618, 618, nil, nil, 618, nil, nil, nil, + nil, nil, 618, nil, nil, nil, nil, nil, nil, nil, + 618, nil, nil, nil, nil, 618, 618, 618, 618, 618, + 618, nil, nil, nil, 618, 618, nil, nil, nil, nil, + nil, nil, 618, nil, nil, 618, 618, 618, nil, 618, + 618, nil, nil, 618, 618, 632, 632, 632, nil, 632, + nil, nil, nil, 632, 632, nil, nil, nil, 632, nil, + 632, 632, 632, 632, 632, 632, 632, nil, nil, nil, + nil, nil, 632, 632, 632, 632, 632, 632, 632, nil, + nil, 632, nil, nil, nil, nil, nil, nil, 632, nil, + nil, 632, 632, 632, 632, 632, 632, 632, 632, nil, + 632, 632, 632, nil, 632, 632, nil, 632, 632, 632, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 632, + nil, nil, 632, nil, nil, 632, 632, nil, nil, 632, + nil, nil, nil, nil, nil, 632, nil, nil, nil, nil, + nil, nil, nil, 632, nil, nil, nil, nil, 632, 632, + 632, 632, 632, 632, nil, nil, nil, 632, 632, nil, + nil, nil, nil, nil, nil, 632, nil, nil, 632, 632, + 632, nil, 632, 632, nil, nil, 632, 632, 638, 638, + 638, nil, 638, nil, nil, nil, 638, 638, nil, nil, + nil, 638, nil, 638, 638, 638, 638, 638, 638, 638, + nil, nil, nil, nil, nil, 638, 638, 638, 638, 638, + 638, 638, nil, nil, 638, nil, nil, nil, nil, nil, + nil, 638, nil, nil, 638, 638, 638, 638, 638, 638, + 638, 638, 638, 638, 638, 638, nil, 638, 638, nil, + 638, 638, 638, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 638, nil, nil, 638, nil, nil, 638, 638, + nil, nil, 638, nil, 638, nil, nil, nil, 638, nil, + nil, nil, nil, nil, nil, nil, 638, nil, nil, nil, + nil, 638, 638, 638, 638, 638, 638, nil, nil, nil, + 638, 638, nil, nil, nil, nil, nil, nil, 638, nil, + 638, 638, 638, 638, nil, 638, 638, nil, nil, 638, + 638, 641, 641, 641, nil, 641, nil, nil, nil, 641, + 641, nil, nil, nil, 641, nil, 641, 641, 641, 641, + 641, 641, 641, nil, nil, nil, nil, nil, 641, 641, + 641, 641, 641, 641, 641, nil, nil, 641, nil, nil, + nil, nil, nil, nil, 641, nil, nil, 641, 641, 641, + 641, 641, 641, 641, 641, 641, 641, 641, 641, nil, + 641, 641, nil, 641, 641, 641, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 641, nil, nil, 641, nil, + nil, 641, 641, nil, nil, 641, nil, nil, nil, nil, + nil, 641, nil, nil, nil, nil, nil, nil, nil, 641, + nil, nil, nil, nil, 641, 641, 641, 641, 641, 641, + nil, nil, nil, 641, 641, nil, nil, nil, nil, nil, + nil, 641, nil, 641, 641, 641, 641, nil, 641, 641, + nil, nil, 641, 641, 658, 658, 658, nil, 658, nil, + nil, nil, 658, 658, nil, nil, nil, 658, nil, 658, + 658, 658, 658, 658, 658, 658, nil, nil, nil, nil, + nil, 658, 658, 658, 658, 658, 658, 658, nil, nil, + 658, nil, nil, nil, nil, nil, nil, 658, nil, nil, + 658, 658, 658, 658, 658, 658, 658, 658, nil, 658, + 658, 658, nil, 658, 658, nil, 658, 658, 658, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 658, nil, + nil, 658, nil, nil, 658, 658, nil, nil, 658, nil, + 658, nil, nil, nil, 658, nil, nil, nil, nil, nil, + nil, nil, 658, nil, nil, nil, nil, 658, 658, 658, + 658, 658, 658, nil, nil, nil, 658, 658, nil, nil, + nil, nil, nil, nil, 658, nil, nil, 658, 658, 658, + nil, 658, 658, nil, nil, 658, 658, 659, 659, 659, + nil, 659, nil, nil, nil, 659, 659, nil, nil, nil, + 659, nil, 659, 659, 659, 659, 659, 659, 659, nil, + nil, nil, nil, nil, 659, 659, 659, 659, 659, 659, + 659, nil, nil, 659, nil, nil, nil, nil, nil, nil, + 659, nil, nil, 659, 659, 659, 659, 659, 659, 659, + 659, 659, 659, 659, 659, nil, 659, 659, nil, 659, + 659, 659, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 659, nil, nil, 659, nil, nil, 659, 659, nil, + nil, 659, nil, 659, nil, 659, nil, 659, nil, nil, + nil, nil, nil, nil, nil, 659, nil, nil, nil, nil, + 659, 659, 659, 659, 659, 659, nil, nil, nil, 659, + 659, nil, nil, nil, nil, nil, nil, 659, nil, 659, + 659, 659, 659, nil, 659, 659, nil, nil, 659, 659, + 669, 669, 669, nil, 669, nil, nil, nil, 669, 669, + nil, nil, nil, 669, nil, 669, 669, 669, 669, 669, + 669, 669, nil, nil, nil, nil, nil, 669, 669, 669, + 669, 669, 669, 669, nil, nil, 669, nil, nil, nil, + nil, nil, nil, 669, nil, nil, 669, 669, 669, 669, + 669, 669, 669, 669, 669, 669, 669, 669, nil, 669, + 669, nil, 669, 669, 669, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 669, nil, nil, 669, nil, nil, + 669, 669, nil, nil, 669, nil, 669, nil, 669, nil, + 669, nil, nil, nil, nil, nil, nil, nil, 669, nil, + nil, nil, nil, 669, 669, 669, 669, 669, 669, nil, + nil, nil, 669, 669, nil, nil, nil, nil, nil, nil, + 669, nil, 669, 669, 669, 669, nil, 669, 669, nil, + nil, 669, 669, 705, 705, 705, 705, 705, nil, nil, + nil, 705, 705, nil, nil, nil, 705, nil, 705, 705, + 705, 705, 705, 705, 705, nil, nil, nil, nil, nil, + 705, 705, 705, 705, 705, 705, 705, nil, nil, 705, + nil, nil, nil, nil, nil, 705, 705, nil, 705, 705, + 705, 705, 705, 705, 705, 705, 705, nil, 705, 705, + 705, nil, 705, 705, nil, 705, 705, 705, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 705, nil, nil, + 705, nil, nil, 705, 705, nil, nil, 705, nil, 705, + nil, nil, nil, 705, nil, nil, nil, nil, nil, nil, + nil, 705, nil, nil, nil, nil, 705, 705, 705, 705, + 705, 705, nil, nil, nil, 705, 705, nil, nil, nil, + nil, nil, nil, 705, nil, nil, 705, 705, 705, nil, + 705, 705, nil, nil, 705, 705, 707, 707, 707, nil, + 707, nil, nil, nil, 707, 707, nil, nil, nil, 707, + nil, 707, 707, 707, 707, 707, 707, 707, nil, nil, + nil, nil, nil, 707, 707, 707, 707, 707, 707, 707, + nil, nil, 707, nil, nil, nil, nil, nil, nil, 707, + nil, nil, 707, 707, 707, 707, 707, 707, 707, 707, + nil, 707, 707, 707, nil, 707, 707, nil, 707, 707, + 707, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 707, nil, nil, 707, nil, nil, 707, 707, nil, nil, + 707, nil, 707, nil, nil, nil, 707, nil, nil, nil, + nil, nil, nil, nil, 707, nil, nil, nil, nil, 707, + 707, 707, 707, 707, 707, nil, nil, nil, 707, 707, + nil, nil, nil, nil, nil, nil, 707, nil, nil, 707, + 707, 707, nil, 707, 707, nil, nil, 707, 707, 708, + 708, 708, nil, 708, nil, nil, nil, 708, 708, nil, + nil, nil, 708, nil, 708, 708, 708, 708, 708, 708, + 708, nil, nil, nil, nil, nil, 708, 708, 708, 708, + 708, 708, 708, nil, nil, 708, nil, nil, nil, nil, + nil, nil, 708, nil, nil, 708, 708, 708, 708, 708, + 708, 708, 708, nil, 708, 708, 708, nil, 708, 708, + nil, 708, 708, 708, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 708, nil, nil, 708, nil, nil, 708, + 708, nil, nil, 708, nil, nil, nil, nil, nil, 708, + nil, nil, nil, nil, nil, nil, nil, 708, nil, nil, + nil, nil, 708, 708, 708, 708, 708, 708, nil, nil, + nil, 708, 708, nil, nil, nil, nil, nil, nil, 708, + nil, nil, 708, 708, 708, nil, 708, 708, nil, nil, + 708, 708, 709, 709, 709, nil, 709, nil, nil, nil, + 709, 709, nil, nil, nil, 709, nil, 709, 709, 709, + 709, 709, 709, 709, nil, nil, nil, nil, nil, 709, + 709, 709, 709, 709, 709, 709, nil, nil, 709, nil, + nil, nil, nil, nil, nil, 709, nil, nil, 709, 709, + 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, + nil, 709, 709, nil, 709, 709, 709, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 709, nil, nil, 709, + nil, nil, 709, 709, nil, nil, 709, nil, 709, nil, + 709, nil, 709, nil, nil, nil, nil, nil, nil, nil, + 709, nil, nil, nil, nil, 709, 709, 709, 709, 709, + 709, nil, nil, nil, 709, 709, nil, nil, nil, nil, + nil, nil, 709, nil, 709, 709, 709, 709, nil, 709, + 709, nil, nil, 709, 709, 712, 712, 712, 712, 712, + nil, nil, nil, 712, 712, nil, nil, nil, 712, nil, + 712, 712, 712, 712, 712, 712, 712, nil, nil, nil, + nil, nil, 712, 712, 712, 712, 712, 712, 712, nil, + nil, 712, nil, nil, nil, nil, nil, 712, 712, nil, + 712, 712, 712, 712, 712, 712, 712, 712, 712, nil, + 712, 712, 712, nil, 712, 712, nil, 712, 712, 712, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 712, + nil, nil, 712, nil, nil, 712, 712, nil, nil, 712, + nil, 712, nil, nil, nil, 712, nil, nil, nil, nil, + nil, nil, nil, 712, nil, nil, nil, nil, 712, 712, + 712, 712, 712, 712, nil, nil, nil, 712, 712, nil, + nil, nil, nil, nil, nil, 712, nil, nil, 712, 712, + 712, nil, 712, 712, nil, nil, 712, 712, 713, 713, + 713, nil, 713, nil, nil, nil, 713, 713, nil, nil, + nil, 713, nil, 713, 713, 713, 713, 713, 713, 713, + nil, nil, nil, nil, nil, 713, 713, 713, 713, 713, + 713, 713, nil, nil, 713, nil, nil, nil, nil, nil, + nil, 713, nil, nil, 713, 713, 713, 713, 713, 713, + 713, 713, nil, 713, 713, 713, nil, 713, 713, nil, + 713, 713, 713, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 713, nil, nil, 713, nil, nil, 713, 713, + nil, nil, 713, nil, nil, nil, nil, nil, 713, nil, + nil, nil, nil, nil, nil, nil, 713, nil, nil, nil, + nil, 713, 713, 713, 713, 713, 713, nil, nil, nil, + 713, 713, nil, nil, nil, nil, nil, nil, 713, nil, + nil, 713, 713, 713, nil, 713, 713, nil, nil, 713, + 713, 715, 715, 715, nil, 715, nil, nil, nil, 715, + 715, nil, nil, nil, 715, nil, 715, 715, 715, 715, + 715, 715, 715, nil, nil, nil, nil, nil, 715, 715, + 715, 715, 715, 715, 715, nil, nil, 715, nil, nil, + nil, nil, nil, nil, 715, nil, nil, 715, 715, 715, + 715, 715, 715, 715, 715, 715, 715, 715, 715, nil, + 715, 715, nil, 715, 715, 715, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 715, nil, nil, 715, nil, + nil, 715, 715, nil, nil, 715, nil, 715, nil, 715, + nil, 715, nil, nil, nil, nil, nil, nil, nil, 715, + nil, nil, nil, nil, 715, 715, 715, 715, 715, 715, + nil, nil, nil, 715, 715, nil, nil, nil, nil, nil, + nil, 715, nil, 715, 715, 715, 715, nil, 715, 715, + nil, nil, 715, 715, 716, 716, 716, nil, 716, nil, + nil, nil, 716, 716, nil, nil, nil, 716, nil, 716, + 716, 716, 716, 716, 716, 716, nil, nil, nil, nil, + nil, 716, 716, 716, 716, 716, 716, 716, nil, nil, + 716, nil, nil, nil, nil, nil, nil, 716, nil, nil, + 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, nil, 716, 716, nil, 716, 716, 716, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 716, nil, + nil, 716, nil, nil, 716, 716, nil, nil, 716, nil, + nil, nil, 716, nil, 716, nil, nil, nil, nil, nil, + nil, nil, 716, nil, nil, nil, nil, 716, 716, 716, + 716, 716, 716, nil, nil, nil, 716, 716, nil, nil, + nil, nil, nil, nil, 716, nil, 716, 716, 716, 716, + nil, 716, 716, nil, nil, 716, 716, 717, 717, 717, + nil, 717, nil, nil, nil, 717, 717, nil, nil, nil, + 717, nil, 717, 717, 717, 717, 717, 717, 717, nil, + nil, nil, nil, nil, 717, 717, 717, 717, 717, 717, + 717, nil, nil, 717, nil, nil, nil, nil, nil, nil, + 717, nil, nil, 717, 717, 717, 717, 717, 717, 717, + 717, nil, 717, 717, 717, nil, 717, 717, nil, 717, + 717, 717, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 717, nil, nil, 717, nil, nil, 717, 717, nil, + nil, 717, nil, nil, nil, nil, nil, 717, nil, nil, + nil, nil, nil, nil, nil, 717, nil, nil, nil, nil, + 717, 717, 717, 717, 717, 717, nil, nil, nil, 717, + 717, nil, nil, nil, nil, nil, nil, 717, nil, nil, + 717, 717, 717, nil, 717, 717, nil, nil, 717, 717, + 718, 718, 718, nil, 718, nil, nil, nil, 718, 718, + nil, nil, nil, 718, nil, 718, 718, 718, 718, 718, + 718, 718, nil, nil, nil, nil, nil, 718, 718, 718, + 718, 718, 718, 718, nil, nil, 718, nil, nil, nil, + nil, nil, nil, 718, nil, nil, 718, 718, 718, 718, + 718, 718, 718, 718, nil, 718, 718, 718, nil, 718, + 718, nil, 718, 718, 718, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 718, nil, nil, 718, nil, nil, + 718, 718, nil, nil, 718, nil, nil, nil, nil, nil, + 718, nil, nil, nil, nil, nil, nil, nil, 718, nil, + nil, nil, nil, 718, 718, 718, 718, 718, 718, nil, + nil, nil, 718, 718, nil, nil, nil, nil, nil, nil, + 718, nil, nil, 718, 718, 718, nil, 718, 718, nil, + nil, 718, 718, 723, 723, 723, nil, 723, nil, nil, + nil, 723, 723, nil, nil, nil, 723, nil, 723, 723, + 723, 723, 723, 723, 723, nil, nil, nil, nil, nil, + 723, 723, 723, 723, 723, 723, 723, nil, nil, 723, + nil, nil, nil, nil, nil, nil, 723, nil, nil, 723, + 723, 723, 723, 723, 723, 723, 723, nil, 723, 723, + 723, nil, 723, 723, nil, 723, 723, 723, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 723, nil, nil, + 723, nil, nil, 723, 723, nil, nil, 723, nil, nil, + nil, nil, nil, 723, nil, nil, nil, nil, nil, nil, + nil, 723, nil, nil, nil, nil, 723, 723, 723, 723, + 723, 723, nil, nil, nil, 723, 723, nil, nil, nil, + nil, nil, nil, 723, nil, nil, 723, 723, 723, nil, + 723, 723, nil, nil, 723, 723, 724, 724, 724, nil, + 724, nil, nil, nil, 724, 724, nil, nil, nil, 724, + nil, 724, 724, 724, 724, 724, 724, 724, nil, nil, + nil, nil, nil, 724, 724, 724, 724, 724, 724, 724, + nil, nil, 724, nil, nil, nil, nil, nil, nil, 724, + nil, nil, 724, 724, 724, 724, 724, 724, 724, 724, + nil, 724, 724, 724, nil, 724, 724, nil, 724, 724, + 724, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 724, nil, nil, 724, nil, nil, 724, 724, nil, nil, + 724, nil, nil, nil, nil, nil, 724, nil, nil, nil, + nil, nil, nil, nil, 724, nil, nil, nil, nil, 724, + 724, 724, 724, 724, 724, nil, nil, nil, 724, 724, + nil, nil, nil, nil, nil, nil, 724, nil, nil, 724, + 724, 724, nil, 724, 724, nil, nil, 724, 724, 772, + 772, 772, nil, 772, nil, nil, nil, 772, 772, nil, + nil, nil, 772, nil, 772, 772, 772, 772, 772, 772, + 772, nil, nil, nil, nil, nil, 772, 772, 772, 772, + 772, 772, 772, nil, nil, 772, nil, nil, nil, nil, + nil, nil, 772, nil, nil, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 772, nil, 772, 772, + nil, 772, 772, 772, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 772, nil, nil, 772, nil, nil, 772, + 772, nil, nil, 772, nil, 772, nil, 772, nil, 772, + nil, nil, nil, nil, nil, nil, nil, 772, nil, nil, + nil, nil, 772, 772, 772, 772, 772, 772, nil, nil, + nil, 772, 772, nil, nil, nil, nil, nil, nil, 772, + nil, 772, 772, 772, 772, nil, 772, 772, nil, nil, + 772, 772, 781, 781, 781, nil, 781, nil, nil, nil, + 781, 781, nil, nil, nil, 781, nil, 781, 781, 781, + 781, 781, 781, 781, nil, nil, nil, nil, nil, 781, + 781, 781, 781, 781, 781, 781, nil, nil, 781, nil, + nil, nil, nil, nil, nil, 781, nil, nil, 781, 781, + 781, 781, 781, 781, 781, 781, nil, 781, 781, 781, + nil, 781, 781, nil, 781, 781, 781, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 781, nil, nil, 781, + nil, nil, 781, 781, nil, nil, 781, nil, nil, nil, + nil, nil, 781, nil, nil, nil, nil, nil, nil, nil, + 781, nil, nil, nil, nil, 781, 781, 781, 781, 781, + 781, nil, nil, nil, 781, 781, nil, nil, nil, nil, + nil, nil, 781, nil, nil, 781, 781, 781, nil, 781, + 781, nil, nil, 781, 781, 784, 784, 784, nil, 784, + nil, nil, nil, 784, 784, nil, nil, nil, 784, nil, + 784, 784, 784, 784, 784, 784, 784, nil, nil, nil, + nil, nil, 784, 784, 784, 784, 784, 784, 784, nil, + nil, 784, nil, nil, nil, nil, nil, nil, 784, nil, + nil, 784, 784, 784, 784, 784, 784, 784, 784, nil, + 784, 784, 784, nil, 784, 784, nil, 784, 784, 784, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 784, + nil, nil, 784, nil, nil, 784, 784, nil, nil, 784, + nil, nil, nil, nil, nil, 784, nil, nil, nil, nil, + nil, nil, nil, 784, nil, nil, nil, nil, 784, 784, + 784, 784, 784, 784, nil, nil, nil, 784, 784, nil, + nil, nil, nil, nil, nil, 784, nil, nil, 784, 784, + 784, nil, 784, 784, nil, nil, 784, 784, 806, 806, + 806, nil, 806, nil, nil, nil, 806, 806, nil, nil, + nil, 806, nil, 806, 806, 806, 806, 806, 806, 806, + nil, nil, nil, nil, nil, 806, 806, 806, 806, 806, + 806, 806, nil, nil, 806, nil, nil, nil, nil, nil, + nil, 806, nil, nil, 806, 806, 806, 806, 806, 806, + 806, 806, nil, 806, 806, 806, nil, 806, 806, nil, + 806, 806, 806, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 806, nil, nil, 806, nil, nil, 806, 806, + nil, nil, 806, nil, 806, nil, nil, nil, 806, nil, + nil, nil, nil, nil, nil, nil, 806, nil, nil, nil, + nil, 806, 806, 806, 806, 806, 806, nil, nil, nil, + 806, 806, nil, nil, nil, nil, nil, nil, 806, nil, + nil, 806, 806, 806, nil, 806, 806, nil, nil, 806, + 806, 821, 821, 821, nil, 821, nil, nil, nil, 821, + 821, nil, nil, nil, 821, nil, 821, 821, 821, 821, + 821, 821, 821, nil, nil, nil, nil, nil, 821, 821, + 821, 821, 821, 821, 821, nil, nil, 821, nil, nil, + nil, nil, nil, nil, 821, nil, nil, 821, 821, 821, + 821, 821, 821, 821, 821, nil, 821, 821, 821, nil, + 821, 821, nil, 821, 821, 821, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 821, nil, nil, 821, nil, + nil, 821, 821, nil, nil, 821, nil, nil, nil, nil, + nil, 821, nil, nil, nil, nil, nil, nil, nil, 821, + nil, nil, nil, nil, 821, 821, 821, 821, 821, 821, + nil, nil, nil, 821, 821, nil, nil, nil, nil, nil, + nil, 821, nil, nil, 821, 821, 821, nil, 821, 821, + nil, nil, 821, 821, 857, 857, 857, nil, 857, nil, + nil, nil, 857, 857, nil, nil, nil, 857, nil, 857, + 857, 857, 857, 857, 857, 857, nil, nil, nil, nil, + nil, 857, 857, 857, 857, 857, 857, 857, nil, nil, + 857, nil, nil, nil, nil, nil, nil, 857, nil, nil, + 857, 857, 857, 857, 857, 857, 857, 857, nil, 857, + 857, 857, nil, 857, 857, nil, 857, 857, 857, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 857, nil, + nil, 857, nil, nil, 857, 857, nil, nil, 857, nil, + nil, nil, nil, nil, 857, nil, nil, nil, nil, nil, + nil, nil, 857, nil, nil, nil, nil, 857, 857, 857, + 857, 857, 857, nil, nil, nil, 857, 857, nil, nil, + nil, nil, nil, nil, 857, nil, nil, 857, 857, 857, + nil, 857, 857, nil, nil, 857, 857, 870, 870, 870, + nil, 870, nil, nil, nil, 870, 870, nil, nil, nil, + 870, nil, 870, 870, 870, 870, 870, 870, 870, nil, + nil, nil, nil, nil, 870, 870, 870, 870, 870, 870, + 870, nil, nil, 870, nil, nil, nil, nil, nil, nil, + 870, nil, nil, 870, 870, 870, 870, 870, 870, 870, + 870, nil, 870, 870, 870, nil, 870, 870, nil, 870, + 870, 870, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 870, nil, nil, 870, nil, nil, 870, 870, nil, + nil, 870, nil, nil, nil, nil, nil, 870, nil, nil, + nil, nil, nil, nil, nil, 870, nil, nil, nil, nil, + 870, 870, 870, 870, 870, 870, nil, nil, nil, 870, + 870, nil, nil, nil, nil, nil, nil, 870, nil, nil, + 870, 870, 870, nil, 870, 870, nil, nil, 870, 870, + 886, 886, 886, nil, 886, nil, nil, nil, 886, 886, + nil, nil, nil, 886, nil, 886, 886, 886, 886, 886, + 886, 886, nil, nil, nil, nil, nil, 886, 886, 886, + 886, 886, 886, 886, nil, nil, 886, nil, nil, nil, + nil, nil, nil, 886, nil, nil, 886, 886, 886, 886, + 886, 886, 886, 886, nil, 886, 886, 886, nil, 886, + 886, nil, 886, 886, 886, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 886, nil, nil, 886, nil, nil, + 886, 886, nil, nil, 886, nil, nil, nil, nil, nil, + 886, nil, nil, nil, nil, nil, nil, nil, 886, nil, + nil, nil, nil, 886, 886, 886, 886, 886, 886, nil, + nil, nil, 886, 886, nil, nil, nil, nil, nil, nil, + 886, nil, nil, 886, 886, 886, nil, 886, 886, nil, + nil, 886, 886, 894, 894, 894, nil, 894, nil, nil, + nil, 894, 894, nil, nil, nil, 894, nil, 894, 894, + 894, 894, 894, 894, 894, nil, nil, nil, nil, nil, + 894, 894, 894, 894, 894, 894, 894, nil, nil, 894, + nil, nil, nil, nil, nil, nil, 894, nil, nil, 894, + 894, 894, 894, 894, 894, 894, 894, nil, 894, 894, + 894, nil, 894, 894, nil, 894, 894, 894, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 894, nil, nil, + 894, nil, nil, 894, 894, nil, nil, 894, nil, nil, + nil, nil, nil, 894, nil, nil, nil, nil, nil, nil, + nil, 894, nil, nil, nil, nil, 894, 894, 894, 894, + 894, 894, nil, nil, nil, 894, 894, nil, nil, nil, + nil, nil, nil, 894, nil, nil, 894, 894, 894, nil, + 894, 894, nil, nil, 894, 894, 906, 906, 906, nil, + 906, nil, nil, nil, 906, 906, nil, nil, nil, 906, + nil, 906, 906, 906, 906, 906, 906, 906, nil, nil, + nil, nil, nil, 906, 906, 906, 906, 906, 906, 906, + nil, nil, 906, nil, nil, nil, nil, nil, nil, 906, + nil, nil, 906, 906, 906, 906, 906, 906, 906, 906, + nil, 906, 906, 906, nil, 906, 906, nil, 906, 906, + 906, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 906, nil, nil, 906, nil, nil, 906, 906, nil, nil, + 906, nil, nil, nil, nil, nil, 906, nil, nil, nil, + nil, nil, nil, nil, 906, nil, nil, nil, nil, 906, + 906, 906, 906, 906, 906, nil, nil, nil, 906, 906, + nil, nil, nil, nil, nil, nil, 906, nil, nil, 906, + 906, 906, nil, 906, 906, nil, nil, 906, 906, 907, + 907, 907, nil, 907, nil, nil, nil, 907, 907, nil, + nil, nil, 907, nil, 907, 907, 907, 907, 907, 907, + 907, nil, nil, nil, nil, nil, 907, 907, 907, 907, + 907, 907, 907, nil, nil, 907, nil, nil, nil, nil, + nil, nil, 907, nil, nil, 907, 907, 907, 907, 907, + 907, 907, 907, nil, 907, 907, 907, nil, 907, 907, + nil, 907, 907, 907, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 907, nil, nil, 907, nil, nil, 907, + 907, nil, nil, 907, nil, nil, nil, nil, nil, 907, + nil, nil, nil, nil, nil, nil, nil, 907, nil, nil, + nil, nil, 907, 907, 907, 907, 907, 907, nil, nil, + nil, 907, 907, nil, nil, nil, nil, nil, nil, 907, + nil, nil, 907, 907, 907, nil, 907, 907, nil, nil, + 907, 907, 908, 908, 908, nil, 908, nil, nil, nil, + 908, 908, nil, nil, nil, 908, nil, 908, 908, 908, + 908, 908, 908, 908, nil, nil, nil, nil, nil, 908, + 908, 908, 908, 908, 908, 908, nil, nil, 908, nil, + nil, nil, nil, nil, nil, 908, nil, nil, 908, 908, + 908, 908, 908, 908, 908, 908, nil, 908, 908, 908, + nil, 908, 908, nil, 908, 908, 908, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 908, nil, nil, 908, + nil, nil, 908, 908, nil, nil, 908, nil, nil, nil, + nil, nil, 908, nil, nil, nil, nil, nil, nil, nil, + 908, nil, nil, nil, nil, 908, 908, 908, 908, 908, + 908, nil, nil, nil, 908, 908, nil, nil, nil, nil, + nil, nil, 908, nil, nil, 908, 908, 908, nil, 908, + 908, nil, nil, 908, 908, 909, 909, 909, nil, 909, + nil, nil, nil, 909, 909, nil, nil, nil, 909, nil, + 909, 909, 909, 909, 909, 909, 909, nil, nil, nil, + nil, nil, 909, 909, 909, 909, 909, 909, 909, nil, + nil, 909, nil, nil, nil, nil, nil, nil, 909, nil, + nil, 909, 909, 909, 909, 909, 909, 909, 909, nil, + 909, 909, 909, nil, 909, 909, nil, 909, 909, 909, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 909, + nil, nil, 909, nil, nil, 909, 909, nil, nil, 909, + nil, nil, nil, nil, nil, 909, nil, nil, nil, nil, + nil, nil, nil, 909, nil, nil, nil, nil, 909, 909, + 909, 909, 909, 909, nil, nil, nil, 909, 909, nil, + nil, nil, nil, nil, nil, 909, nil, nil, 909, 909, + 909, nil, 909, 909, nil, nil, 909, 909, 938, 938, + 938, nil, 938, nil, nil, nil, 938, 938, nil, nil, + nil, 938, nil, 938, 938, 938, 938, 938, 938, 938, + nil, nil, nil, nil, nil, 938, 938, 938, 938, 938, + 938, 938, nil, nil, 938, nil, nil, nil, nil, nil, + nil, 938, nil, nil, 938, 938, 938, 938, 938, 938, + 938, 938, nil, 938, 938, 938, nil, 938, 938, nil, + 938, 938, 938, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 938, nil, nil, 938, nil, nil, 938, 938, + nil, nil, 938, nil, nil, nil, nil, nil, 938, nil, + nil, nil, nil, nil, nil, nil, 938, nil, nil, nil, + nil, 938, 938, 938, 938, 938, 938, nil, nil, nil, + 938, 938, nil, nil, nil, nil, nil, nil, 938, nil, + nil, 938, 938, 938, nil, 938, 938, nil, nil, 938, + 938, 960, 960, 960, nil, 960, nil, nil, nil, 960, + 960, nil, nil, nil, 960, nil, 960, 960, 960, 960, + 960, 960, 960, nil, nil, nil, nil, nil, 960, 960, + 960, 960, 960, 960, 960, nil, nil, 960, nil, nil, + nil, nil, nil, nil, 960, nil, nil, 960, 960, 960, + 960, 960, 960, 960, 960, nil, 960, 960, 960, nil, + 960, 960, nil, 960, 960, 960, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 960, nil, nil, 960, nil, + nil, 960, 960, nil, nil, 960, nil, nil, nil, nil, + nil, 960, nil, nil, nil, nil, nil, nil, nil, 960, + nil, nil, nil, nil, 960, 960, 960, 960, 960, 960, + nil, nil, nil, 960, 960, nil, nil, nil, nil, nil, + nil, 960, nil, nil, 960, 960, 960, nil, 960, 960, + nil, nil, 960, 960, 991, 991, 991, nil, 991, nil, + nil, nil, 991, 991, nil, nil, nil, 991, nil, 991, + 991, 991, 991, 991, 991, 991, nil, nil, nil, nil, + nil, 991, 991, 991, 991, 991, 991, 991, nil, nil, + 991, nil, nil, nil, nil, nil, nil, 991, nil, nil, + 991, 991, 991, 991, 991, 991, 991, 991, nil, 991, + 991, 991, nil, 991, 991, nil, 991, 991, 991, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 991, nil, + nil, 991, nil, nil, 991, 991, nil, nil, 991, nil, + nil, nil, nil, nil, 991, nil, nil, nil, nil, nil, + nil, nil, 991, nil, nil, nil, nil, 991, 991, 991, + 991, 991, 991, nil, nil, nil, 991, 991, nil, nil, + nil, nil, nil, nil, 991, nil, nil, 991, 991, 991, + nil, 991, 991, nil, nil, 991, 991, 996, 996, 996, + nil, 996, nil, nil, nil, 996, 996, nil, nil, nil, + 996, nil, 996, 996, 996, 996, 996, 996, 996, nil, + nil, nil, nil, nil, 996, 996, 996, 996, 996, 996, + 996, nil, nil, 996, nil, nil, nil, nil, nil, nil, + 996, nil, nil, 996, 996, 996, 996, 996, 996, 996, + 996, nil, 996, 996, 996, nil, 996, 996, nil, 996, + 996, 996, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 996, nil, nil, 996, nil, nil, 996, 996, nil, + nil, 996, nil, nil, nil, nil, nil, 996, nil, nil, + nil, nil, nil, nil, nil, 996, nil, nil, nil, nil, + 996, 996, 996, 996, 996, 996, nil, nil, nil, 996, + 996, nil, nil, nil, nil, nil, nil, 996, nil, nil, + 996, 996, 996, nil, 996, 996, nil, nil, 996, 996, + 1005, 1005, 1005, nil, 1005, nil, nil, nil, 1005, 1005, + nil, nil, nil, 1005, nil, 1005, 1005, 1005, 1005, 1005, + 1005, 1005, nil, nil, nil, nil, nil, 1005, 1005, 1005, + 1005, 1005, 1005, 1005, nil, nil, 1005, nil, nil, nil, + nil, nil, nil, 1005, nil, nil, 1005, 1005, 1005, 1005, + 1005, 1005, 1005, 1005, nil, 1005, 1005, 1005, nil, 1005, + 1005, nil, 1005, 1005, 1005, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1005, nil, nil, 1005, nil, nil, + 1005, 1005, nil, nil, 1005, nil, 1005, nil, nil, nil, + 1005, nil, nil, nil, nil, nil, nil, nil, 1005, nil, + nil, nil, nil, 1005, 1005, 1005, 1005, 1005, 1005, nil, + nil, nil, 1005, 1005, nil, nil, nil, nil, nil, nil, + 1005, nil, nil, 1005, 1005, 1005, nil, 1005, 1005, nil, + nil, 1005, 1005, 1029, 1029, 1029, nil, 1029, nil, nil, + nil, 1029, 1029, nil, nil, nil, 1029, nil, 1029, 1029, + 1029, 1029, 1029, 1029, 1029, nil, nil, nil, nil, nil, + 1029, 1029, 1029, 1029, 1029, 1029, 1029, nil, nil, 1029, + nil, nil, nil, nil, nil, nil, 1029, nil, nil, 1029, + 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, + 1029, nil, 1029, 1029, nil, 1029, 1029, 1029, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1029, nil, nil, + 1029, nil, nil, 1029, 1029, nil, nil, 1029, nil, nil, + nil, 1029, nil, 1029, nil, nil, nil, nil, nil, nil, + nil, 1029, nil, nil, nil, nil, 1029, 1029, 1029, 1029, + 1029, 1029, nil, nil, nil, 1029, 1029, nil, nil, nil, + nil, nil, nil, 1029, nil, 1029, 1029, 1029, 1029, nil, + 1029, 1029, nil, nil, 1029, 1029, 1030, 1030, 1030, nil, + 1030, nil, nil, nil, 1030, 1030, nil, nil, nil, 1030, + nil, 1030, 1030, 1030, 1030, 1030, 1030, 1030, nil, nil, + nil, nil, nil, 1030, 1030, 1030, 1030, 1030, 1030, 1030, + nil, nil, 1030, nil, nil, nil, nil, nil, nil, 1030, + nil, nil, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, + nil, 1030, 1030, 1030, nil, 1030, 1030, nil, 1030, 1030, + 1030, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1030, nil, nil, 1030, nil, nil, 1030, 1030, nil, nil, + 1030, nil, nil, nil, nil, nil, 1030, nil, nil, nil, + nil, nil, nil, nil, 1030, nil, nil, nil, nil, 1030, + 1030, 1030, 1030, 1030, 1030, nil, nil, nil, 1030, 1030, + nil, nil, nil, nil, nil, nil, 1030, nil, nil, 1030, + 1030, 1030, nil, 1030, 1030, nil, nil, 1030, 1030, 1114, + 1114, 1114, nil, 1114, nil, nil, nil, 1114, 1114, nil, + nil, nil, 1114, nil, 1114, 1114, 1114, 1114, 1114, 1114, + 1114, nil, nil, nil, nil, nil, 1114, 1114, 1114, 1114, + 1114, 1114, 1114, nil, nil, 1114, nil, nil, nil, nil, + nil, nil, 1114, nil, nil, 1114, 1114, 1114, 1114, 1114, + 1114, 1114, 1114, nil, 1114, 1114, 1114, nil, 1114, 1114, + nil, 1114, 1114, 1114, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1114, nil, nil, 1114, nil, nil, 1114, + 1114, nil, nil, 1114, nil, nil, nil, nil, nil, 1114, + nil, nil, nil, nil, nil, nil, nil, 1114, nil, nil, + nil, nil, 1114, 1114, 1114, 1114, 1114, 1114, nil, nil, + nil, 1114, 1114, nil, nil, nil, nil, nil, nil, 1114, + nil, nil, 1114, 1114, 1114, nil, 1114, 1114, nil, nil, + 1114, 1114, 1175, 1175, 1175, nil, 1175, nil, nil, nil, + 1175, 1175, nil, nil, nil, 1175, nil, 1175, 1175, 1175, + 1175, 1175, 1175, 1175, nil, nil, nil, nil, nil, 1175, + 1175, 1175, 1175, 1175, 1175, 1175, nil, nil, 1175, nil, + nil, nil, nil, nil, nil, 1175, nil, nil, 1175, 1175, + 1175, 1175, 1175, 1175, 1175, 1175, nil, 1175, 1175, 1175, + nil, 1175, 1175, nil, 1175, 1175, 1175, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1175, nil, nil, 1175, + nil, nil, 1175, 1175, nil, nil, 1175, nil, nil, nil, + nil, nil, 1175, nil, nil, nil, nil, nil, nil, nil, + 1175, nil, nil, nil, nil, 1175, 1175, 1175, 1175, 1175, + 1175, nil, nil, nil, 1175, 1175, nil, nil, nil, nil, + nil, nil, 1175, nil, nil, 1175, 1175, 1175, nil, 1175, + 1175, nil, nil, 1175, 1175, 1176, 1176, 1176, nil, 1176, + nil, nil, nil, 1176, 1176, nil, nil, nil, 1176, nil, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, nil, nil, nil, + nil, nil, 1176, 1176, 1176, 1176, 1176, 1176, 1176, nil, + nil, 1176, nil, nil, nil, nil, nil, nil, 1176, nil, + nil, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, nil, + 1176, 1176, 1176, nil, 1176, 1176, nil, 1176, 1176, 1176, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1176, + nil, nil, 1176, nil, nil, 1176, 1176, nil, nil, 1176, + nil, nil, nil, nil, nil, 1176, nil, nil, nil, nil, + nil, nil, nil, 1176, nil, nil, nil, nil, 1176, 1176, + 1176, 1176, 1176, 1176, nil, nil, nil, 1176, 1176, nil, + nil, nil, nil, nil, nil, 1176, nil, nil, 1176, 1176, + 1176, nil, 1176, 1176, nil, nil, 1176, 1176, 1209, 1209, + 1209, nil, 1209, nil, nil, nil, 1209, 1209, nil, nil, + nil, 1209, nil, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + nil, nil, nil, nil, nil, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, nil, nil, 1209, nil, nil, nil, nil, nil, + nil, 1209, nil, nil, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, nil, 1209, 1209, nil, + 1209, 1209, 1209, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1209, nil, nil, 1209, nil, nil, 1209, 1209, + nil, nil, 1209, nil, 1209, nil, 1209, nil, 1209, nil, + nil, nil, nil, nil, nil, nil, 1209, nil, nil, nil, + nil, 1209, 1209, 1209, 1209, 1209, 1209, nil, nil, nil, + 1209, 1209, nil, nil, nil, nil, nil, nil, 1209, nil, + 1209, 1209, 1209, 1209, nil, 1209, 1209, nil, nil, 1209, + 1209, 38, 38, 38, nil, 38, nil, nil, nil, 38, + 38, nil, nil, nil, 38, nil, 38, 38, 38, 38, + 38, 38, 38, nil, nil, nil, nil, nil, 38, 38, + 38, 38, 38, 38, 38, nil, nil, 38, nil, nil, + nil, nil, nil, nil, 38, nil, nil, 38, 38, 38, + 38, 38, 38, 38, 38, nil, 38, 38, 38, nil, + 38, 38, nil, nil, nil, 38, nil, nil, nil, nil, + nil, 1151, nil, 1151, 1151, 1151, 1151, 1151, nil, nil, + nil, nil, nil, nil, nil, 38, nil, 1151, 38, nil, + nil, 38, 38, nil, nil, 38, nil, 38, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1151, + nil, nil, nil, nil, 38, 38, 38, 38, 38, 38, + 1151, 1151, nil, 38, 38, nil, nil, nil, nil, nil, + nil, 38, nil, nil, 38, 38, 38, nil, 38, 38, + 39, 39, 39, nil, 39, nil, nil, nil, 39, 39, + nil, nil, nil, 39, 1151, 39, 39, 39, 39, 39, + 39, 39, nil, nil, nil, nil, nil, 39, 39, 39, + 39, 39, 39, 39, nil, nil, 39, nil, nil, nil, + nil, nil, nil, 39, nil, nil, 39, 39, 39, 39, + 39, 39, 39, 39, nil, 39, 39, 39, nil, 39, + 39, nil, nil, nil, 39, nil, nil, nil, nil, nil, + 1213, nil, 1213, 1213, 1213, 1213, 1213, nil, nil, nil, + nil, nil, nil, nil, 39, nil, 1213, 39, nil, nil, + 39, 39, nil, nil, 39, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1213, nil, + nil, nil, nil, 39, 39, 39, 39, 39, 39, 1213, + 1213, nil, 39, 39, nil, nil, nil, 39, nil, nil, + 39, nil, nil, 39, 39, 39, nil, 39, 39, 77, + 77, 77, nil, 77, nil, nil, nil, 77, 77, nil, + nil, nil, 77, 1213, 77, 77, 77, 77, 77, 77, + 77, nil, nil, nil, nil, nil, 77, 77, 77, 77, + 77, 77, 77, nil, nil, 77, nil, nil, nil, nil, + nil, nil, 77, nil, nil, 77, 77, 77, 77, 77, + 77, 77, 77, nil, 77, 77, 77, nil, 77, 77, + nil, nil, nil, 77, nil, nil, nil, nil, nil, 1235, + nil, 1235, 1235, 1235, 1235, 1235, nil, nil, nil, nil, + nil, nil, nil, 77, nil, 1235, 77, nil, nil, 77, + 77, nil, nil, 77, nil, 77, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1235, nil, nil, + nil, nil, 77, 77, 77, 77, 77, 77, 1235, 1235, + nil, 77, 77, nil, nil, nil, nil, nil, nil, 77, + nil, nil, 77, 77, 77, nil, 77, 77, 78, 78, + 78, nil, 78, nil, nil, nil, 78, 78, nil, nil, + nil, 78, 1235, 78, 78, 78, 78, 78, 78, 78, + nil, nil, nil, nil, nil, 78, 78, 78, 78, 78, + 78, 78, nil, nil, 78, nil, nil, nil, nil, nil, + nil, 78, nil, nil, 78, 78, 78, 78, 78, 78, + 78, 78, nil, 78, 78, 78, nil, 78, 78, nil, + nil, nil, 78, nil, nil, nil, nil, nil, 1237, nil, + 1237, 1237, 1237, 1237, 1237, nil, nil, nil, nil, 78, + nil, nil, 78, nil, 1237, 78, nil, nil, 78, 78, + nil, nil, 78, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1237, nil, nil, nil, + nil, 78, 78, 78, 78, 78, 78, 1237, 1237, nil, + 78, 78, nil, nil, nil, nil, nil, nil, 78, nil, + nil, 78, 78, 78, nil, 78, 78, 79, 79, 79, + nil, 79, nil, nil, nil, 79, 79, nil, nil, nil, + 79, 1237, 79, 79, 79, 79, 79, 79, 79, nil, + nil, nil, nil, nil, 79, 79, 79, 79, 79, 79, + 79, nil, nil, 79, nil, nil, nil, nil, nil, nil, + 79, nil, nil, 79, 79, 79, 79, 79, 79, 79, + 79, nil, 79, 79, 79, nil, 79, 79, nil, nil, + nil, 79, nil, nil, nil, nil, nil, 1239, nil, 1239, + 1239, 1239, 1239, 1239, nil, nil, nil, nil, nil, nil, + nil, 79, nil, 1239, 79, nil, nil, 79, 79, nil, + nil, 79, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1239, nil, nil, nil, nil, + 79, 79, 79, 79, 79, 79, 1239, 1239, nil, 79, + 79, nil, nil, nil, nil, nil, nil, 79, nil, nil, + 79, 79, 79, nil, 79, 79, 341, 341, 341, nil, + 341, nil, nil, nil, 341, 341, nil, nil, nil, 341, + 1239, 341, 341, 341, 341, 341, 341, 341, nil, nil, + nil, nil, nil, 341, 341, 341, 341, 341, 341, 341, + nil, nil, 341, nil, nil, nil, nil, nil, nil, 341, + nil, nil, 341, 341, 341, 341, 341, 341, 341, 341, + nil, 341, 341, 341, nil, 341, 341, nil, nil, nil, + 341, nil, nil, nil, nil, nil, 1265, nil, 1265, 1265, + 1265, 1265, 1265, nil, nil, nil, nil, nil, nil, nil, + 341, nil, 1265, 341, nil, nil, 341, 341, nil, nil, + 341, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1265, nil, nil, nil, nil, 341, + 341, 341, 341, 341, 341, 1265, 1265, nil, 341, 341, + nil, nil, nil, 341, nil, nil, 341, nil, nil, 341, + 341, 341, nil, 341, 341, 360, 360, 360, nil, 360, + nil, nil, nil, 360, 360, nil, nil, nil, 360, 1265, + 360, 360, 360, 360, 360, 360, 360, nil, nil, nil, + nil, nil, 360, 360, 360, 360, 360, 360, 360, nil, + nil, 360, nil, nil, nil, nil, nil, nil, 360, nil, + nil, 360, 360, 360, 360, 360, 360, 360, 360, nil, + 360, 360, 360, nil, 360, 360, nil, nil, nil, 360, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 360, + nil, nil, 360, nil, nil, 360, 360, nil, nil, 360, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 360, 360, + 360, 360, 360, 360, nil, nil, nil, 360, 360, nil, + nil, nil, nil, nil, nil, 360, nil, nil, 360, 360, + 360, nil, 360, 360, 573, 573, 573, nil, 573, nil, + nil, nil, 573, 573, nil, nil, nil, 573, nil, 573, + 573, 573, 573, 573, 573, 573, nil, nil, nil, nil, + nil, 573, 573, 573, 573, 573, 573, 573, nil, nil, + 573, nil, nil, nil, nil, nil, nil, 573, nil, nil, + 573, 573, 573, 573, 573, 573, 573, 573, nil, 573, + 573, 573, nil, 573, 573, nil, nil, nil, 573, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 573, nil, + nil, 573, nil, nil, 573, 573, nil, nil, 573, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 573, 573, 573, + 573, 573, 573, nil, nil, nil, 573, 573, nil, nil, + nil, nil, nil, nil, 573, nil, nil, 573, 573, 573, + nil, 573, 573, 582, 582, 582, nil, 582, nil, nil, + nil, 582, 582, nil, nil, nil, 582, nil, 582, 582, + 582, 582, 582, 582, 582, nil, nil, nil, nil, nil, + 582, 582, 582, 582, 582, 582, 582, nil, nil, 582, + nil, nil, nil, nil, nil, nil, 582, nil, nil, 582, + 582, 582, 582, 582, 582, 582, 582, nil, 582, 582, + 582, nil, 582, 582, nil, nil, nil, 582, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 582, nil, nil, + 582, nil, nil, 582, 582, nil, nil, 582, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 582, 582, 582, 582, + 582, 582, nil, nil, nil, 582, 582, nil, nil, nil, + nil, nil, nil, 582, nil, nil, 582, 582, 582, nil, + 582, 582, 788, 788, 788, nil, 788, nil, nil, nil, + 788, 788, nil, nil, nil, 788, nil, 788, 788, 788, + 788, 788, 788, 788, nil, nil, nil, nil, nil, 788, + 788, 788, 788, 788, 788, 788, nil, nil, 788, nil, + nil, nil, nil, nil, nil, 788, nil, nil, 788, 788, + 788, 788, 788, 788, 788, 788, nil, 788, 788, 788, + nil, 788, 788, nil, nil, nil, 788, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 788, nil, nil, 788, + nil, nil, 788, 788, nil, nil, 788, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 788, 788, 788, 788, 788, + 788, nil, nil, nil, 788, 788, nil, nil, nil, nil, + nil, nil, 788, nil, nil, 788, 788, 788, nil, 788, + 788, 799, 799, 799, nil, 799, nil, nil, nil, 799, + 799, nil, nil, nil, 799, nil, 799, 799, 799, 799, + 799, 799, 799, nil, nil, nil, nil, nil, 799, 799, + 799, 799, 799, 799, 799, nil, nil, 799, nil, nil, + nil, nil, nil, nil, 799, nil, nil, 799, 799, 799, + 799, 799, 799, 799, 799, nil, 799, 799, 799, nil, + 799, 799, nil, nil, nil, 799, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 799, nil, nil, 799, nil, + nil, 799, 799, nil, nil, 799, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 799, 799, 799, 799, 799, 799, + nil, nil, nil, 799, 799, nil, nil, nil, nil, nil, + nil, 799, nil, nil, 799, 799, 799, nil, 799, 799, + 1074, 1074, 1074, nil, 1074, nil, nil, nil, 1074, 1074, + nil, nil, nil, 1074, nil, 1074, 1074, 1074, 1074, 1074, + 1074, 1074, nil, nil, nil, nil, nil, 1074, 1074, 1074, + 1074, 1074, 1074, 1074, nil, nil, 1074, nil, nil, nil, + nil, nil, nil, 1074, nil, nil, 1074, 1074, 1074, 1074, + 1074, 1074, 1074, 1074, nil, 1074, 1074, 1074, nil, 1074, + 1074, nil, nil, nil, 1074, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1074, nil, nil, 1074, nil, nil, + 1074, 1074, nil, nil, 1074, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1074, 1074, 1074, 1074, 1074, 1074, nil, + nil, nil, 1074, 1074, nil, nil, nil, nil, nil, nil, + 1074, nil, nil, 1074, 1074, 1074, nil, 1074, 1074, 1085, + 1085, 1085, nil, 1085, nil, nil, nil, 1085, 1085, nil, + nil, nil, 1085, nil, 1085, 1085, 1085, 1085, 1085, 1085, + 1085, nil, nil, nil, nil, nil, 1085, 1085, 1085, 1085, + 1085, 1085, 1085, nil, nil, 1085, nil, nil, nil, nil, + nil, nil, 1085, nil, nil, 1085, 1085, 1085, 1085, 1085, + 1085, 1085, 1085, nil, 1085, 1085, 1085, nil, 1085, 1085, + nil, nil, nil, 1085, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1085, nil, nil, 1085, nil, nil, 1085, + 1085, nil, nil, 1085, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1085, 1085, 1085, 1085, 1085, 1085, nil, nil, + nil, 1085, 1085, nil, nil, nil, nil, nil, nil, 1085, + nil, nil, 1085, 1085, 1085, nil, 1085, 1085, 1155, 1155, + 1155, nil, 1155, nil, nil, nil, 1155, 1155, nil, nil, + nil, 1155, nil, 1155, 1155, 1155, 1155, 1155, 1155, 1155, + nil, nil, nil, nil, nil, 1155, 1155, 1155, 1155, 1155, + 1155, 1155, nil, nil, 1155, nil, nil, nil, nil, nil, + nil, 1155, nil, nil, 1155, 1155, 1155, 1155, 1155, 1155, + 1155, 1155, nil, 1155, 1155, 1155, nil, 1155, 1155, nil, + nil, nil, 1155, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1155, nil, nil, 1155, nil, nil, 1155, 1155, + nil, nil, 1155, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1155, 1155, 1155, 1155, 1155, 1155, nil, nil, nil, + 1155, 1155, nil, nil, nil, nil, nil, nil, 1155, nil, + nil, 1155, 1155, 1155, nil, 1155, 1155, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, nil, nil, nil, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, nil, nil, nil, nil, nil, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, nil, + 11, nil, nil, nil, nil, nil, nil, nil, nil, 11, + 11, nil, 11, 11, 11, 11, 11, 11, 11, nil, + nil, 11, 11, nil, nil, nil, 11, 11, 11, 11, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 11, 11, nil, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, nil, nil, 11, + 11, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 11, nil, nil, nil, nil, nil, nil, nil, nil, 11, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, nil, nil, nil, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, nil, nil, nil, + nil, nil, 12, 12, 12, 12, 12, 12, 12, 12, + 12, nil, nil, 12, nil, nil, nil, nil, nil, nil, + nil, nil, 12, 12, nil, 12, 12, 12, 12, 12, + 12, 12, nil, nil, 12, 12, nil, nil, nil, 12, + 12, 12, 12, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 12, 12, nil, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + nil, nil, 12, 12, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 12, nil, nil, nil, nil, nil, nil, + nil, nil, 12, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, nil, nil, nil, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + nil, nil, nil, nil, nil, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, nil, 25, nil, + nil, nil, nil, nil, nil, 25, 25, nil, 25, 25, + 25, 25, 25, 25, 25, nil, nil, 25, 25, nil, + nil, nil, 25, 25, 25, 25, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, nil, nil, nil, 25, + 25, nil, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, nil, nil, 25, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 25, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + nil, nil, nil, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, nil, nil, nil, nil, nil, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + nil, 109, nil, nil, nil, nil, nil, nil, 109, 109, + nil, 109, 109, 109, 109, 109, 109, 109, nil, nil, + 109, 109, nil, nil, nil, 109, 109, 109, 109, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 109, 109, nil, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, nil, nil, 109, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 109, 450, + 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, nil, nil, nil, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 450, nil, nil, nil, nil, + nil, 450, 450, 450, 450, 450, 450, 450, 450, 450, + nil, nil, 450, nil, nil, nil, nil, nil, nil, nil, + nil, 450, 450, nil, 450, 450, 450, 450, 450, 450, + 450, nil, nil, 450, 450, nil, nil, nil, 450, 450, + 450, 450, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 450, 450, nil, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, 450, nil, + nil, 450, 450, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 450, nil, nil, nil, nil, nil, nil, nil, + nil, 450, 703, 703, 703, 703, 703, 703, 703, 703, + 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, + 703, 703, 703, 703, 703, 703, nil, nil, nil, 703, + 703, 703, 703, 703, 703, 703, 703, 703, 703, nil, + nil, nil, nil, nil, 703, 703, 703, 703, 703, 703, + 703, 703, 703, nil, nil, 703, nil, nil, nil, nil, + nil, nil, nil, nil, 703, 703, nil, 703, 703, 703, + 703, 703, 703, 703, nil, nil, 703, 703, nil, nil, + nil, 703, 703, 703, 703, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 703, 703, + nil, 703, 703, 703, 703, 703, 703, 703, 703, 703, + 703, 703, nil, nil, 703, 703, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 703, nil, nil, nil, nil, + nil, nil, nil, nil, 703, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, 764, nil, + nil, nil, 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, nil, nil, nil, nil, nil, 764, 764, 764, + 764, 764, 764, 764, 764, 764, nil, nil, 764, nil, + nil, nil, nil, nil, nil, nil, nil, 764, 764, nil, + 764, 764, 764, 764, 764, 764, 764, nil, nil, 764, + 764, nil, nil, nil, 764, 764, 764, 764, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 764, 764, nil, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, nil, nil, 764, nil, nil, + nil, nil, 508, 508, 508, 508, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 764, 508, 508, + 508, 508, nil, nil, nil, 508, nil, nil, nil, nil, + nil, 508, 508, nil, nil, nil, 508, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 508, nil, nil, 508, + nil, nil, nil, 508, nil, nil, 508, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 508, nil, nil, nil, 508, 508, 508, 508, 508, + 508, nil, nil, nil, 508, 508, nil, nil, nil, nil, + nil, nil, 508, nil, nil, 508, 508, 508, nil, 508, + 508, nil, nil, 508, 508, 509, 509, 509, 509, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 509, 509, 509, 509, nil, nil, nil, 509, nil, + nil, nil, nil, nil, 509, 509, nil, nil, nil, 509, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 509, + nil, nil, 509, nil, nil, nil, 509, nil, nil, 509, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 509, nil, nil, nil, 509, 509, + 509, 509, 509, 509, nil, nil, nil, 509, 509, nil, + nil, nil, nil, nil, nil, 509, nil, nil, 509, 509, + 509, nil, 509, 509, nil, nil, 509, 509, 740, 740, + 740, 740, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 740, 740, 740, 740, nil, nil, + nil, 740, nil, nil, nil, nil, nil, 740, 740, nil, + nil, nil, 740, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 740, nil, nil, 740, nil, nil, nil, 740, + nil, nil, 740, nil, 740, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 740, nil, nil, + nil, 740, 740, 740, 740, 740, 740, nil, nil, nil, + 740, 740, 740, nil, nil, nil, nil, nil, 740, nil, + nil, 740, 740, 740, nil, 740, 740, nil, nil, 740, + 740, 912, 912, 912, 912, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 912, 912, 912, + 912, nil, nil, nil, 912, nil, nil, nil, nil, nil, + 912, 912, nil, nil, nil, 912, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 912, nil, nil, 912, nil, + nil, nil, 912, nil, nil, 912, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 912, nil, nil, nil, 912, 912, 912, 912, 912, 912, + nil, nil, nil, 912, 912, nil, nil, nil, nil, nil, + nil, 912, nil, nil, 912, 912, 912, nil, 912, 912, + nil, nil, 912, 912, 915, 915, 915, 915, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 915, 915, 915, 915, nil, nil, nil, 915, 915, nil, + nil, nil, nil, 915, 915, nil, nil, nil, 915, 915, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 915, nil, + nil, 915, nil, nil, nil, 915, nil, nil, 915, nil, + 915, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 915, nil, nil, nil, 915, 915, 915, + 915, 915, 915, nil, nil, nil, 915, 915, nil, nil, + nil, nil, nil, nil, 915, nil, 915, 915, 915, 915, + nil, 915, 915, nil, nil, 915, 915, 916, 916, 916, + 916, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 916, 916, 916, 916, nil, nil, nil, + 916, 916, nil, nil, nil, nil, 916, 916, nil, nil, + nil, 916, 916, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 916, nil, nil, 916, nil, nil, nil, 916, nil, + nil, 916, nil, 916, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 916, nil, nil, nil, + 916, 916, 916, 916, 916, 916, nil, nil, nil, 916, + 916, nil, nil, nil, nil, nil, nil, 916, nil, 916, + 916, 916, 916, nil, 916, 916, nil, nil, 916, 916, + 922, 922, 922, 922, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 922, 922, 922, 922, + nil, nil, nil, 922, nil, nil, nil, nil, nil, 922, + 922, nil, nil, nil, 922, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 922, nil, nil, 922, nil, nil, + nil, 922, nil, nil, 922, nil, 922, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 922, + nil, nil, nil, 922, 922, 922, 922, 922, 922, nil, + nil, nil, 922, 922, nil, nil, nil, nil, nil, nil, + 922, nil, nil, 922, 922, 922, nil, 922, 922, nil, + nil, 922, 922, 930, 930, 930, 930, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 930, + 930, 930, 930, nil, nil, nil, 930, nil, nil, nil, + nil, nil, 930, 930, nil, nil, nil, 930, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 930, nil, nil, + 930, nil, nil, nil, 930, nil, nil, 930, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 930, nil, nil, nil, 930, 930, 930, 930, + 930, 930, nil, nil, nil, 930, 930, nil, nil, nil, + nil, nil, nil, 930, nil, nil, 930, 930, 930, nil, + 930, 930, nil, nil, 930, 930, 1003, 1003, 1003, 1003, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1003, 1003, 1003, 1003, nil, nil, nil, 1003, + 1003, nil, nil, nil, nil, 1003, 1003, nil, nil, nil, + 1003, 1003, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1003, nil, nil, 1003, nil, nil, nil, 1003, nil, nil, + 1003, nil, 1003, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1003, nil, nil, nil, 1003, + 1003, 1003, 1003, 1003, 1003, nil, nil, nil, 1003, 1003, + nil, nil, nil, nil, nil, nil, 1003, nil, 1003, 1003, + 1003, 1003, nil, 1003, 1003, nil, nil, 1003, 1003, 1041, + 1041, 1041, 1041, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1041, 1041, 1041, 1041, nil, + nil, nil, 1041, nil, nil, nil, nil, nil, 1041, 1041, + nil, nil, nil, 1041, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1041, nil, nil, 1041, nil, nil, nil, + 1041, nil, nil, 1041, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1041, nil, + nil, nil, 1041, 1041, 1041, 1041, 1041, 1041, nil, nil, + nil, 1041, 1041, nil, nil, nil, nil, nil, nil, 1041, + nil, nil, 1041, 1041, 1041, nil, 1041, 1041, nil, nil, + 1041, 1041, 1056, 1056, 1056, 1056, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1056, 1056, + 1056, 1056, nil, nil, nil, 1056, nil, nil, nil, nil, + nil, 1056, 1056, nil, nil, nil, 1056, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1056, nil, nil, 1056, + nil, nil, nil, 1056, nil, nil, 1056, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1056, nil, nil, nil, 1056, 1056, 1056, 1056, 1056, + 1056, nil, nil, nil, 1056, 1056, nil, nil, nil, nil, + nil, nil, 1056, nil, nil, 1056, 1056, 1056, nil, 1056, + 1056, nil, nil, 1056, 1056, 1137, 1137, 1137, 1137, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1137, 1137, 1137, 1137, nil, nil, nil, 1137, nil, + nil, nil, nil, nil, 1137, 1137, nil, nil, nil, 1137, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1137, + nil, nil, 1137, nil, nil, nil, 1137, nil, nil, 1137, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1137, nil, nil, nil, 1137, 1137, + 1137, 1137, 1137, 1137, nil, nil, nil, 1137, 1137, nil, + nil, nil, nil, nil, nil, 1137, nil, nil, 1137, 1137, + 1137, nil, 1137, 1137, nil, nil, 1137, 1137, 1177, 1177, + 1177, 1177, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1177, 1177, 1177, 1177, nil, nil, + nil, 1177, nil, nil, nil, nil, nil, 1177, 1177, nil, + nil, nil, 1177, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1177, nil, nil, 1177, nil, nil, nil, 1177, + nil, nil, 1177, nil, 1177, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1177, nil, nil, + nil, 1177, 1177, 1177, 1177, 1177, 1177, nil, nil, nil, + 1177, 1177, nil, nil, nil, nil, nil, nil, 1177, nil, + nil, 1177, 1177, 1177, nil, 1177, 1177, nil, nil, 1177, + 1177, 1191, 1191, 1191, 1191, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1191, 1191, 1191, + 1191, nil, nil, nil, 1191, nil, nil, nil, nil, nil, + 1191, 1191, nil, nil, nil, 1191, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1191, nil, nil, 1191, nil, + nil, nil, 1191, nil, nil, 1191, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1191, nil, nil, nil, 1191, 1191, 1191, 1191, 1191, 1191, + nil, nil, nil, 1191, 1191, nil, nil, nil, nil, nil, + nil, 1191, nil, nil, 1191, 1191, 1191, nil, 1191, 1191, + nil, nil, 1191, 1191, 1193, 1193, 1193, 1193, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1193, 1193, 1193, 1193, nil, nil, nil, 1193, nil, nil, + nil, nil, nil, 1193, 1193, nil, nil, nil, 1193, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1193, nil, + nil, 1193, nil, nil, nil, 1193, nil, nil, 1193, nil, + 1193, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1193, nil, nil, nil, 1193, 1193, 1193, + 1193, 1193, 1193, nil, nil, nil, 1193, 1193, nil, nil, + nil, nil, nil, nil, 1193, nil, nil, 1193, 1193, 1193, + nil, 1193, 1193, nil, nil, 1193, 1193, 1229, 1229, 1229, + 1229, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1229, 1229, 1229, 1229, nil, nil, nil, + 1229, nil, nil, nil, nil, nil, 1229, 1229, nil, nil, + nil, 1229, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1229, nil, nil, 1229, nil, nil, nil, 1229, nil, + nil, 1229, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1229, nil, nil, nil, + 1229, 1229, 1229, 1229, 1229, 1229, nil, nil, nil, 1229, + 1229, nil, nil, nil, nil, nil, nil, 1229, nil, nil, + 1229, 1229, 1229, nil, 1229, 1229, nil, nil, 1229, 1229, + 1253, 1253, 1253, 1253, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1253, 1253, 1253, 1253, + nil, nil, nil, 1253, nil, nil, nil, nil, nil, 1253, + 1253, nil, nil, nil, 1253, nil, nil, nil, nil, nil, + nil, nil, 932, 932, 932, 932, nil, nil, nil, nil, + nil, nil, nil, nil, 1253, nil, nil, 1253, 932, 932, + 932, 1253, nil, nil, 1253, nil, nil, nil, nil, nil, + nil, 932, 932, nil, nil, nil, 932, nil, nil, 1253, + nil, nil, nil, 1253, 1253, 1253, 1253, 1253, 1253, nil, + nil, nil, 1253, 1253, nil, nil, nil, nil, nil, nil, + 1253, nil, nil, 1253, 1253, 1253, nil, 1253, 1253, nil, + nil, 1253, 1253, nil, nil, 376, nil, 376, 376, 376, + 376, 376, nil, nil, nil, 932, 932, 932, 932, 932, + 932, 376, nil, nil, 932, 932, nil, nil, nil, nil, + nil, nil, 932, nil, nil, 932, 932, 932, nil, 932, + 932, nil, 810, 376, 810, 810, 810, 810, 810, nil, + nil, nil, 376, 376, 376, 376, nil, nil, 810, 1145, + nil, 1145, 1145, 1145, 1145, 1145, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1145, nil, nil, nil, nil, + 810, nil, nil, nil, nil, nil, nil, nil, 376, 810, + 810, 810, 810, nil, nil, nil, nil, 1145, 376, nil, + nil, 232, 232, nil, nil, 232, 1145, 1145, 1145, 1145, + nil, nil, nil, nil, 232, 232, nil, 232, 232, 232, + 232, 232, 232, 232, nil, 810, 232, 232, nil, nil, + nil, 232, 232, 232, 232, 810, nil, nil, nil, nil, + 232, nil, 1145, nil, nil, nil, nil, nil, 232, 232, + nil, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, nil, nil, 232, nil, nil, nil, nil, 233, + 233, nil, nil, 233, nil, nil, nil, nil, nil, nil, + nil, nil, 233, 233, 232, 233, 233, 233, 233, 233, + 233, 233, nil, nil, 233, 233, nil, nil, nil, 233, + 233, 233, 233, nil, nil, nil, nil, nil, 233, nil, + nil, nil, nil, nil, nil, nil, 233, 233, nil, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + nil, nil, 233, nil, nil, nil, nil, 300, 300, nil, + nil, 300, nil, nil, nil, nil, nil, nil, nil, nil, + 300, 300, 233, 300, 300, 300, 300, 300, 300, 300, + nil, nil, 300, 300, nil, nil, nil, 300, 300, 300, + 300, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 300, 300, nil, 300, 300, 300, + 300, 300, 300, 300, 300, 300, 300, 300, nil, nil, + 300, nil, nil, nil, nil, 501, 501, nil, nil, 501, + nil, nil, nil, nil, nil, nil, nil, nil, 501, 501, + 300, 501, 501, 501, 501, 501, 501, 501, nil, nil, + 501, 501, nil, nil, nil, 501, 501, 501, 501, nil, + nil, nil, nil, nil, 501, nil, nil, nil, nil, nil, + nil, nil, 501, 501, nil, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, nil, nil, 501, nil, + nil, nil, nil, 502, 502, nil, nil, 502, nil, nil, + nil, nil, nil, nil, nil, nil, 502, 502, 501, 502, + 502, 502, 502, 502, 502, 502, nil, nil, 502, 502, + nil, nil, nil, 502, 502, 502, 502, nil, nil, nil, + nil, nil, 502, nil, nil, nil, nil, nil, nil, nil, + 502, 502, nil, 502, 502, 502, 502, 502, 502, 502, + 502, 502, 502, 502, nil, nil, 502, nil, nil, nil, + nil, 576, 576, nil, nil, 576, nil, nil, nil, nil, + nil, nil, nil, nil, 576, 576, 502, 576, 576, 576, + 576, 576, 576, 576, nil, nil, 576, 576, nil, nil, + nil, 576, 576, 576, 576, nil, nil, nil, nil, nil, + 576, nil, nil, nil, nil, nil, nil, nil, 576, 576, + nil, 576, 576, 576, 576, 576, 576, 576, 576, 576, + 576, 576, nil, nil, 576, nil, nil, nil, nil, 577, + 577, nil, nil, 577, nil, nil, nil, nil, nil, nil, + nil, nil, 577, 577, 576, 577, 577, 577, 577, 577, + 577, 577, nil, nil, 577, 577, nil, nil, nil, 577, + 577, 577, 577, nil, nil, nil, nil, nil, 577, nil, + nil, nil, nil, nil, nil, nil, 577, 577, nil, 577, + 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, + nil, nil, 577, nil, nil, nil, nil, 586, 586, nil, + nil, 586, nil, nil, nil, nil, nil, nil, nil, nil, + 586, 586, 577, 586, 586, 586, 586, 586, 586, 586, + nil, nil, 586, 586, nil, nil, nil, 586, 586, 586, + 586, nil, nil, nil, nil, nil, 586, nil, nil, nil, + nil, nil, nil, nil, 586, 586, nil, 586, 586, 586, + 586, 586, 586, 586, 586, 586, 586, 586, nil, nil, + 586, nil, nil, nil, nil, 587, 587, nil, nil, 587, + nil, nil, nil, nil, nil, nil, nil, nil, 587, 587, + 586, 587, 587, 587, 587, 587, 587, 587, nil, nil, + 587, 587, nil, nil, nil, 587, 587, 587, 587, nil, + nil, nil, nil, nil, 587, nil, nil, nil, nil, nil, + nil, nil, 587, 587, nil, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 587, nil, nil, 587, nil, + nil, nil, nil, 660, 660, nil, nil, 660, nil, nil, + nil, nil, nil, nil, nil, nil, 660, 660, 587, 660, + 660, 660, 660, 660, 660, 660, nil, nil, 660, 660, + nil, nil, nil, 660, 660, 660, 660, nil, nil, nil, + nil, nil, 660, nil, nil, nil, nil, nil, nil, nil, + 660, 660, nil, 660, 660, 660, 660, 660, 660, 660, + 660, 660, 660, 660, nil, nil, 660, nil, nil, nil, + nil, 661, 661, nil, nil, 661, nil, nil, nil, nil, + nil, nil, nil, nil, 661, 661, 660, 661, 661, 661, + 661, 661, 661, 661, nil, nil, 661, 661, nil, nil, + nil, 661, 661, 661, 661, nil, nil, nil, nil, nil, + 661, nil, nil, nil, nil, nil, nil, nil, 661, 661, + nil, 661, 661, 661, 661, 661, 661, 661, 661, 661, + 661, 661, nil, nil, 661, nil, nil, nil, nil, 667, + 667, nil, nil, 667, nil, nil, nil, nil, nil, nil, + nil, nil, 667, 667, 661, 667, 667, 667, 667, 667, + 667, 667, nil, nil, 667, 667, nil, nil, nil, 667, + 667, 667, 667, nil, nil, nil, nil, nil, 667, nil, + nil, nil, nil, nil, nil, nil, 667, 667, nil, 667, + 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, + nil, nil, 667, nil, nil, nil, nil, 668, 668, nil, + nil, 668, nil, nil, nil, nil, nil, nil, nil, nil, + 668, 668, 667, 668, 668, 668, 668, 668, 668, 668, + nil, nil, 668, 668, nil, nil, nil, 668, 668, 668, + 668, nil, nil, nil, nil, nil, 668, nil, nil, nil, + nil, nil, nil, nil, 668, 668, nil, 668, 668, 668, + 668, 668, 668, 668, 668, 668, 668, 668, nil, nil, + 668, nil, nil, nil, nil, 710, 710, nil, nil, 710, + nil, nil, nil, nil, nil, nil, nil, nil, 710, 710, + 668, 710, 710, 710, 710, 710, 710, 710, nil, nil, + 710, 710, nil, nil, nil, 710, 710, 710, 710, nil, + nil, nil, nil, nil, 710, nil, nil, nil, nil, nil, + nil, nil, 710, 710, nil, 710, 710, 710, 710, 710, + 710, 710, 710, 710, 710, 710, nil, nil, 710, nil, + nil, nil, nil, 711, 711, nil, nil, 711, nil, nil, + nil, nil, nil, nil, nil, nil, 711, 711, 710, 711, + 711, 711, 711, 711, 711, 711, nil, nil, 711, 711, + nil, nil, nil, 711, 711, 711, 711, nil, nil, nil, + nil, nil, 711, nil, nil, nil, nil, nil, nil, nil, + 711, 711, nil, 711, 711, 711, 711, 711, 711, 711, + 711, 711, 711, 711, nil, 1149, 711, 1149, 1149, 1149, + 1149, 1149, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1149, nil, nil, nil, nil, 711, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1149, 1205, 1205, nil, nil, 1205, nil, + nil, nil, 1149, 1149, 1149, 1149, nil, 1205, 1205, nil, + 1205, 1205, 1205, 1205, 1205, 1205, 1205, nil, nil, 1205, + 1205, nil, nil, nil, 1205, 1205, 1205, 1205, nil, nil, + nil, nil, nil, 1205, nil, nil, nil, nil, 1149, nil, + nil, 1205, 1205, nil, 1205, 1205, 1205, 1205, 1205, 1205, + 1205, 1205, 1205, 1205, 1205, nil, nil, 1205, nil, nil, + nil, nil, 1210, 1210, nil, nil, 1210, nil, nil, nil, + nil, nil, nil, nil, nil, 1210, 1210, 1205, 1210, 1210, + 1210, 1210, 1210, 1210, 1210, nil, nil, 1210, 1210, nil, + nil, nil, 1210, 1210, 1210, 1210, nil, nil, nil, nil, + nil, 1210, nil, nil, nil, nil, nil, nil, nil, 1210, + 1210, nil, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, + 1210, 1210, 1210, nil, nil, 1210, nil, nil, nil, nil, + 1211, 1211, nil, nil, 1211, nil, nil, nil, nil, nil, + nil, nil, nil, 1211, 1211, 1210, 1211, 1211, 1211, 1211, + 1211, 1211, 1211, nil, nil, 1211, 1211, nil, nil, nil, + 1211, 1211, 1211, 1211, nil, nil, nil, nil, nil, 1211, + nil, nil, nil, nil, nil, nil, nil, 1211, 1211, nil, + 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, + 1211, nil, 1233, 1211, 1233, 1233, 1233, 1233, 1233, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1233, nil, + nil, nil, nil, 1211, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1233, nil, nil, nil, nil, nil, nil, nil, nil, 1233, + 1233, 1233, 1233, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1233 ] + +racc_action_pointer = [ + nil, 32, 1098, 58, nil, 462, nil, nil, 5417, 808, + nil, 26155, 26288, 72, nil, 90, 187, 404, 266, 242, + 282, nil, 112, 5560, 1386, 26421, 375, nil, -40, nil, + 165, 5698, 5830, 5960, 6103, 6246, nil, 1242, 24209, 24348, + nil, 296, 283, 313, 408, 6389, 6532, 164, 6675, 6818, + 697, 6961, 384, 127, 164, 311, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 7099, nil, 7240, 7383, nil, + -22, nil, 7526, 7669, nil, nil, 7812, 24487, 24626, 24765, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 336, nil, nil, nil, + nil, nil, nil, 397, 413, 447, 449, nil, nil, 26554, + nil, nil, nil, nil, nil, nil, 0, nil, nil, 136, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 7955, nil, nil, nil, nil, 8098, 8241, 8384, + 8527, 8670, 524, nil, 644, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 513, nil, 1386, 8813, 8956, 9099, 9242, + 9385, 9528, 29040, 29108, nil, nil, 9671, 9814, 9957, nil, + nil, 361, 104, 147, 589, 236, 513, 596, nil, 10100, + 1530, 601, nil, nil, 10243, 10386, 10529, 10672, 10815, 10958, + 11101, 11244, 11387, 11530, 11673, 11816, 11959, 12102, 12245, 12388, + 12531, 12674, 12817, 12960, 13103, 13246, nil, nil, nil, nil, + 13389, nil, nil, 243, 349, 379, 416, 460, 514, 552, + 555, 576, 596, nil, nil, nil, nil, nil, nil, nil, + 29176, nil, nil, 602, 13532, 13675, nil, nil, nil, nil, + nil, nil, nil, nil, 13818, nil, 2106, nil, 572, 584, + nil, 13961, 627, 14104, nil, nil, 14247, 14390, nil, nil, + 553, nil, nil, 14533, 969, nil, 580, 1674, 615, 652, + 643, 24904, 1818, 376, 380, 455, 721, 504, nil, 690, + 671, 193, 737, 752, nil, nil, nil, 775, 167, 739, + 25043, nil, 343, 516, 3114, 3258, 805, nil, 810, 14676, + nil, 14819, 735, 1962, 756, nil, 28944, 337, 763, 2106, + 2250, 1083, 785, nil, 479, 534, 788, 14962, nil, 461, + -8, 8, 15105, 2394, 2538, 598, 900, 808, -19, -7, + 591, 886, 24, 920, nil, nil, 1087, 1089, -20, nil, + 620, nil, 839, 15248, nil, 475, nil, 346, nil, 383, + nil, 136, nil, 830, 402, nil, 832, 440, nil, 833, + -59, nil, 834, -58, nil, 481, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 2682, + 26687, nil, nil, nil, nil, 850, nil, 921, 845, 15391, + 849, nil, nil, 833, nil, 640, 267, 937, nil, nil, + 1530, nil, nil, nil, nil, nil, 1674, 857, nil, nil, + 861, 867, 344, 449, 7240, nil, nil, nil, 272, 408, + 908, nil, nil, 15529, 15661, nil, nil, nil, -26, nil, + 926, 29244, 29312, 15794, 274, 15937, 16080, 16223, 27040, 27153, + 3402, 3546, 628, 809, 966, 967, 971, 974, 5130, 5274, + 1121, 3690, 3834, 3978, 4122, 4266, 4410, 900, 1214, 4554, + 4698, 2250, 4842, nil, nil, nil, 16366, 1033, nil, 16504, + nil, nil, nil, nil, 16630, 921, 923, 928, nil, nil, + nil, 936, nil, nil, 16773, nil, nil, 16916, nil, 17059, + nil, 196, nil, nil, nil, 17202, 1227, 954, 947, 945, + nil, nil, 946, 25182, 954, 17345, 29380, 29448, 650, 992, + nil, nil, 25321, 956, nil, 17488, 29516, 29584, 17631, 4986, + 2394, 17774, 17917, 1079, 1084, nil, nil, 969, 967, 971, + 976, 977, nil, 978, 981, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 965, 784, nil, nil, 18060, nil, + nil, nil, 0, nil, nil, nil, 1083, nil, nil, 1089, + 635, 1025, 18203, 1149, 1152, 1040, nil, nil, 18346, nil, + nil, 18489, nil, 1073, 1056, nil, 688, 1082, 2826, 1159, + nil, 2970, 63, 1166, 1167, 610, 1169, nil, 18632, 18775, + 29652, 29720, 26, nil, nil, 652, nil, 29788, 29856, 18918, + nil, nil, nil, 784, 3114, nil, 611, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 208, + nil, nil, 265, nil, nil, nil, 1050, nil, nil, 1055, + nil, 1073, nil, 26820, nil, 19061, 1060, 19204, 19347, 19490, + 29924, 29992, 19633, 19776, 461, 19919, 20062, 20205, 20348, 1095, + nil, nil, nil, 20491, 20634, 1096, nil, nil, nil, 277, + 310, 544, 680, 1069, 1109, nil, 1089, nil, nil, 506, + 27266, -67, nil, 795, nil, nil, 952, 7099, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1151, + 5, nil, 1115, 1078, 26953, -14, nil, 113, 1180, -19, + nil, nil, 20777, nil, 1096, nil, 1201, nil, 1082, nil, + 1124, 20920, nil, nil, 21063, nil, nil, -85, 25460, 1090, + nil, 1095, -9, -5, 1138, 25, 725, 1142, 1107, 25599, + nil, 1172, -7, 1818, 308, nil, 21206, nil, nil, nil, + 28981, nil, nil, 231, nil, nil, 797, 745, nil, 881, + nil, 21349, nil, 918, nil, 1111, 1120, 685, 1124, nil, + nil, nil, nil, nil, nil, 5662, 1962, nil, nil, nil, + 702, nil, nil, nil, 892, nil, 1237, nil, nil, nil, + nil, nil, 1245, 1246, nil, nil, nil, 21492, 69, 1132, + 29, 30, 162, 163, 3258, 1231, 776, nil, 1152, 3402, + 21635, 647, 1270, 34, 1156, 991, 3546, nil, nil, nil, + nil, nil, nil, nil, nil, 1154, 21778, 1158, 320, 421, + 816, 952, nil, 2538, 21921, 1156, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 22064, 22207, 22350, 22493, + 460, 1247, 27379, 1211, 106, 27492, 27605, 504, -63, 1179, + 1184, nil, 27718, nil, 1182, 1183, 1263, 58, nil, 1202, + 27831, 16489, 28890, nil, nil, nil, nil, nil, 22636, nil, + nil, nil, nil, 5761, nil, 3690, nil, nil, 1209, 1197, + nil, 249, nil, nil, nil, nil, 1195, 39, nil, nil, + 22779, nil, nil, nil, nil, 3834, nil, 1197, 1239, nil, + nil, 1203, nil, 1201, 1203, nil, 1204, nil, 1285, nil, + 1208, 1210, nil, 1212, nil, nil, 1216, 1084, 1294, nil, + nil, 22922, nil, 1337, nil, nil, 23065, nil, 3978, 1341, + nil, nil, nil, 27944, nil, 23208, 4122, 68, 1344, nil, + 1345, 664, nil, nil, nil, 4266, 4410, 1224, 1230, nil, + nil, nil, nil, nil, 1225, 1235, 479, nil, nil, 23351, + 23494, nil, nil, nil, nil, 1274, 1277, 1278, 1241, nil, + nil, 28057, nil, 1, nil, nil, 1245, 1246, 1249, nil, + nil, nil, 1288, 1251, -33, nil, 28170, nil, 1258, nil, + 745, nil, nil, 2682, 1264, 1265, nil, 1266, 1269, 1270, + nil, 1291, 1276, 1265, 25738, nil, nil, nil, nil, nil, + 4554, 2826, 4698, nil, 9, 25877, nil, nil, 15493, nil, + 7063, nil, nil, 15592, nil, 16510, nil, nil, nil, nil, + 1283, 1284, 2970, nil, 35, nil, nil, 43, 891, -31, + nil, nil, nil, nil, 23637, 358, nil, nil, nil, 4842, + 1301, 1413, 1372, nil, nil, nil, nil, nil, 126, 1340, + nil, nil, nil, nil, nil, nil, 1313, 28283, 1317, nil, + nil, nil, 234, nil, nil, 28998, nil, nil, nil, 30054, + nil, 24230, nil, nil, 1340, 26016, 784, 1409, nil, 1459, + 4986, 120, 135, 786, 1413, 144, nil, 1342, 1344, 1347, + 1348, 3676, 3820, 5130, nil, 23780, 23923, 28396, nil, nil, + nil, nil, 1471, nil, nil, 734, nil, nil, nil, nil, + nil, 28509, 1352, 28622, 1354, nil, nil, 1357, 1369, 1370, + 1371, nil, 1378, nil, 855, 30093, nil, nil, 1501, 24066, + 30161, 30229, 145, 24369, nil, nil, nil, nil, 1380, 937, + 5274, nil, nil, nil, 1383, nil, nil, 2092, 1385, 28735, + nil, nil, nil, 30291, nil, 24508, nil, 24647, nil, 24786, + nil, nil, 1425, 1426, nil, 1391, 158, 168, 169, 236, + 1390, nil, 395, 28848, nil, 1391, 1395, 1398, 1399, 171, + nil, nil, nil, nil, 1408, 24925, nil, nil, nil, nil, + 1409, nil ] + +racc_action_default = [ + -1, -768, -767, -768, -2, -753, -4, -5, -768, -8, + -9, -768, -768, -768, -35, -768, -768, -40, -768, -768, + -310, -52, -755, -768, -61, -768, -70, -71, -72, -76, + -287, -287, -287, -324, -352, -353, -88, -767, -92, -100, + -102, -768, -645, -646, -768, -768, -768, -768, -768, -768, + -240, -768, -755, -660, -660, -258, -301, -302, -303, -304, + -305, -306, -307, -308, -309, -739, -312, -314, -767, -322, + -332, -334, -768, -768, -67, -67, -753, -768, -768, -768, + -354, -355, -357, -358, -359, -360, -361, -362, -363, -364, + -365, -366, -375, -433, -575, -576, -577, -578, -579, -767, + -582, -767, -767, -767, -767, -767, -767, -618, -619, -767, + -621, -627, -629, -630, -631, -632, -737, -634, -635, -738, + -637, -638, -639, -640, -641, -642, -643, -644, -649, -650, + 1272, -3, -754, -763, -764, -765, -7, -768, -768, -768, + -768, -768, -768, -23, -768, -131, -132, -133, -134, -135, + -136, -137, -141, -142, -143, -144, -145, -146, -147, -148, + -149, -150, -151, -152, -153, -154, -155, -156, -157, -158, + -159, -160, -161, -162, -163, -164, -165, -166, -167, -168, + -169, -170, -171, -172, -173, -174, -175, -176, -177, -178, + -179, -180, -181, -182, -183, -184, -185, -186, -187, -188, + -189, -190, -191, -192, -193, -194, -195, -196, -197, -198, + -199, -200, -201, -202, -203, -204, -205, -206, -207, -208, + -209, -210, -211, -28, -138, -767, -768, -768, -768, -768, + -768, -767, -768, -768, -749, -750, -768, -768, -755, -756, + -56, -768, -645, -646, -768, -310, -768, -768, -246, -768, + -767, -768, -57, -59, -223, -224, -768, -768, -768, -768, + -768, -768, -768, -768, -768, -768, -768, -768, -768, -768, + -768, -768, -768, -768, -768, -768, -259, -260, -261, -262, + -768, -62, -63, -768, -131, -132, -171, -172, -173, -189, + -194, -201, -204, -645, -646, -725, -726, -368, -461, -441, + -768, -751, -752, -77, -767, -768, -331, -367, -445, -454, + -456, -83, -451, -84, -755, -85, -265, -282, -767, -767, + -286, -768, -292, -768, -767, -730, -734, -768, -86, -87, + -753, -16, -17, -768, -20, -21, -90, -767, -755, -768, + -93, -96, -767, -108, -109, -768, -768, -116, -324, -327, + -755, -768, -660, -660, -352, -353, -356, -452, -768, -98, + -768, -104, -320, -768, -225, -226, -628, -234, -235, -768, + -247, -768, -768, -767, -659, -655, -682, -682, -768, -767, + -767, -316, -755, -266, -760, -760, -755, -767, -333, -66, + -768, -768, -768, -767, -767, -753, -768, -754, -645, -646, + -768, -768, -310, -768, -385, -386, -126, -127, -768, -129, + -768, -310, -767, -768, -348, -682, -580, -768, -603, -768, + -605, -768, -607, -768, -768, -587, -768, -768, -593, -768, + -768, -599, -768, -768, -601, -768, -620, -622, -623, -624, + -625, -6, -766, -29, -30, -31, -32, -33, -10, -767, + -768, -25, -26, -27, -139, -768, -36, -39, -297, -768, + -768, -296, -37, -768, -41, -768, -310, -49, -51, -212, + -270, -292, -53, -54, -42, -213, -270, -755, -277, -278, + -767, -767, -740, -741, -287, -449, -742, -743, -741, -740, + -287, -448, -450, -742, -743, -48, -220, -55, -755, -330, + -768, -768, -768, -767, -320, -768, -768, -768, -768, -768, + -221, -222, -227, -228, -229, -230, -231, -232, -236, -237, + -238, -239, -241, -242, -243, -244, -245, -248, -249, -250, + -251, -755, -263, -64, -747, -748, -768, -768, -462, -287, + -740, -741, -74, -78, -683, -755, -767, -755, -288, -458, + -461, -755, -326, -283, -768, -291, -284, -768, -289, -768, + -293, -768, -733, -736, -15, -754, -19, -768, -755, -89, + -318, -105, -94, -768, -755, -767, -768, -768, -115, -768, + -659, -628, -768, -101, -106, -768, -768, -768, -768, -264, + -252, -768, -768, -567, -768, -398, -399, -755, -667, -755, + -724, -724, -665, -667, -667, -681, -683, -684, -685, -686, + -687, -688, -689, -690, -691, -768, -693, -695, -697, -702, + -704, -705, -708, -713, -715, -716, -718, -719, -720, -722, + -768, -667, -768, -768, -768, -755, -315, -267, -762, -761, + -269, -762, -321, -768, -768, -728, -760, -768, -767, -376, + -377, -767, -768, -768, -768, -768, -768, -371, -768, -767, + -768, -768, -320, -67, -126, -127, -128, -768, -768, -767, + -343, -651, -653, -345, -767, -434, -682, -437, -581, -604, + -609, -610, -612, -583, -606, -584, -608, -585, -586, -768, + -589, -591, -768, -592, -595, -596, -768, -597, -598, -768, + -626, -768, -24, -768, -34, -768, -300, -768, -768, -767, + -768, -768, -768, -768, -453, -279, -281, -768, -768, -79, + -275, -276, -446, -768, -768, -81, -447, -329, -757, -740, + -741, -740, -741, -755, -58, -485, -487, -489, -492, -548, + -755, -504, -507, -541, -546, -547, -768, -768, -551, -552, + -553, -554, -555, -556, -557, -558, -559, -560, -561, -768, + -768, -565, -60, -768, -768, -755, -440, -767, -73, -442, + -458, -272, -279, -274, -768, -459, -768, -325, -767, -290, + -294, -768, -731, -732, -768, -18, -22, -91, -768, -97, + -103, -755, -740, -741, -767, -744, -114, -768, -99, -768, + -219, -233, -755, -254, -767, -369, -767, -350, -374, -656, + -768, -674, -658, -768, -663, -664, -768, -768, -677, -768, + -679, -768, -387, -768, -389, -391, -394, -397, -755, -696, + -706, -707, -717, -721, -661, -768, -256, -351, -313, -317, + -760, -758, -323, -729, -767, -378, -767, -68, -379, -380, + -337, -338, -768, -768, -471, -340, -464, -768, -768, -755, + -740, -741, -744, -319, -767, -126, -127, -130, -755, -767, + -768, -768, -768, -768, -755, -768, -767, -588, -590, -594, + -600, -602, -11, -140, -38, -298, -768, -755, -740, -741, + -741, -740, -50, -271, -768, -767, -44, -215, -45, -216, + -80, -46, -218, -47, -217, -82, -768, -768, -768, -768, + -453, -768, -768, -490, -491, -768, -768, -768, -509, -755, + -755, -503, -510, -516, -768, -519, -523, -768, -506, -768, + -768, -544, -545, -549, -550, -562, -127, -563, -768, -65, + -727, -422, -423, -755, -425, -767, -444, -443, -768, -755, + -455, -767, -457, -285, -295, -735, -95, -453, -107, -328, + -768, -12, -14, -370, -372, -767, -574, -568, -767, -569, + -570, -755, -666, -667, -667, -694, -724, -703, -708, -723, + -667, -667, -714, -667, -691, -709, -755, -768, -768, -396, + -692, -768, -268, -768, -373, -381, -768, -383, -767, -768, + -69, -339, -341, -768, -465, -768, -767, -453, -768, -453, + -768, -768, -346, -349, -435, -767, -767, -427, -755, -611, + -614, -615, -616, -617, -768, -299, -453, -43, -214, -280, + -768, -486, -488, -496, -500, -768, -768, -768, -528, -530, + -531, -534, -535, -537, -539, -540, -755, -755, -755, -564, + -501, -502, -526, -511, -514, -517, -768, -522, -755, -759, + -768, -542, -543, -253, -724, -724, -403, -767, -767, -767, + -421, -768, -755, -691, -699, -700, -711, -463, -75, -273, + -767, -255, -767, -573, -768, -768, -572, -657, -768, -670, + -768, -672, -662, -768, -675, -768, -678, -680, -388, -390, + -392, -395, -257, -335, -768, -384, -336, -768, -476, -479, + -482, -483, -484, -466, -768, -767, -342, -344, -652, -767, + -768, -768, -768, -436, -613, -493, -494, -495, -529, -533, + -536, -538, -497, -498, -499, -518, -512, -768, -520, -524, + -505, -508, -768, -401, -402, -406, -405, -412, -414, -768, + -417, -768, -419, -424, -768, -768, -698, -768, -460, -767, + -767, -645, -646, -768, -768, -310, -571, -667, -667, -667, + -667, -768, -768, -767, -472, -768, -768, -480, -467, -468, + -469, -470, -768, -438, -439, -755, -429, -431, -432, -527, + -532, -768, -515, -768, -724, -701, -404, -767, -767, -767, + -767, -712, -767, -426, -710, -768, -320, -13, -567, -767, + -768, -768, -320, -768, -668, -671, -673, -676, -393, -767, + -767, -477, -478, -481, -519, -347, -428, -768, -513, -768, + -521, -525, -400, -768, -409, -768, -411, -768, -415, -768, + -418, -420, -319, -744, -566, -755, -740, -741, -744, -319, + -667, -382, -767, -768, -430, -767, -767, -767, -767, -453, + -669, -473, -474, -475, -520, -768, -407, -410, -413, -416, + -767, -408 ] + +racc_goto_table = [ + 6, 340, 237, 594, 317, 317, 317, 477, 299, 633, + 634, 390, 391, 282, 232, 395, 148, 148, 484, 490, + 388, 308, 312, 301, 135, 666, 318, 318, 318, 281, + 148, 853, 371, 143, 224, 962, 556, 656, 804, 814, + 815, 976, 393, 394, 547, 240, 4, 648, 651, 461, + 462, 375, 375, 993, 928, 151, 151, 637, 640, 782, + 379, 384, 132, 366, 979, 359, 383, 979, 537, 774, + 352, 352, 828, 131, 982, 448, 443, 444, 445, 446, + 545, 919, 642, 598, 336, 945, 539, 920, 319, 319, + 319, 1018, 1099, 583, 1053, 135, 1186, 418, 543, 420, + 422, 425, 428, 431, 434, 1201, 338, 418, 1068, 352, + 352, 352, 417, 437, 148, 136, 599, 597, 630, 999, + 1101, 779, 435, 385, 779, 303, 311, 313, 1188, 1138, + 474, 43, 734, 762, 975, 1, 495, 43, 974, 973, + 315, 328, 329, 782, 396, 980, 353, 353, 2, 1224, + 689, 605, 605, 692, 294, 142, 677, 412, 414, 975, + 1071, 614, 614, 974, 973, 1230, 43, 344, 344, 961, + 822, 933, 934, 714, 1082, 9, 372, 378, 389, 389, + 785, 9, 389, 580, 580, 353, 353, 353, 468, 1201, + 605, 468, 567, 223, 1066, 405, 43, 468, 556, 457, + 614, 1254, 317, 450, 508, 509, 399, 294, 294, 283, + 1192, 533, 1037, 1048, 764, 847, 16, 1000, 782, 460, + 460, 300, 16, 485, 1058, 770, 703, 369, 1139, 478, + 386, 769, 295, 1188, 644, 403, 501, 670, 494, 441, + 381, 380, 382, 389, 389, 389, 389, 635, 456, 467, + 387, 16, 467, 869, 356, 356, 1035, 1046, 467, 871, + 1119, 43, 1036, 1047, 1228, 674, 1100, 1070, 1147, 1080, + 43, 1069, 1072, 1185, 675, 317, 317, 1099, 1014, 733, + 986, 16, 779, 779, 867, 317, 415, 484, 490, 1154, + 948, 404, 873, 356, 356, 356, 852, 546, 318, 549, + 1112, 550, 478, 1218, 872, 9, 789, 318, 951, 1139, + 1197, 858, 767, 1179, 447, 798, 555, 555, 1107, 843, + 776, 1261, 418, 584, 1003, 1220, 1264, 1108, 1111, 1031, + 579, 652, 1032, 915, 472, 473, 916, 561, 927, 779, + 576, 930, 308, 497, 498, 982, 16, 339, 312, 135, + 1110, 791, 1189, 1190, 43, 16, 1061, 1062, 586, 379, + 319, 968, 794, 1139, 918, 1231, 643, 572, 1084, 319, + 1194, 1140, 794, 352, 581, 416, 419, 937, 822, 43, + 421, 424, 989, 427, 336, 645, 430, 565, 1180, 336, + 1207, 433, 352, 979, 1019, 660, 1066, 875, 564, 876, + 1066, 1231, 1066, 436, 870, 977, 568, 1195, 536, nil, + 672, 574, 548, nil, 135, 1092, 1167, 874, 684, 975, + 686, 551, nil, 690, nil, 1139, 690, nil, 1251, 910, + nil, nil, nil, nil, nil, 859, 921, nil, nil, 16, + nil, 463, 646, nil, 463, 868, 794, 6, nil, 353, + 463, 605, nil, nil, 794, 148, nil, 643, 818, 820, + 710, 614, 43, 655, 16, nil, 43, nil, 353, 975, + 344, 43, 702, 1198, 317, 721, nil, 1199, 555, 555, + nil, 726, 720, nil, 1066, 887, 1066, 957, 1066, 344, + 1066, nil, 485, 701, 151, 953, 484, 490, 389, 1010, + 786, 478, 43, 1143, 1144, nil, 566, 494, 43, 43, + nil, 763, 949, 992, 900, 1006, 1066, nil, 1223, 673, + 905, 956, 43, 43, 981, 1262, 983, nil, nil, nil, + 721, 782, nil, nil, 1049, 455, 584, 720, nil, 918, + 918, nil, 822, 822, 555, 584, 317, 16, nil, nil, + 971, 16, nil, nil, 1060, 1007, 16, 356, nil, nil, + 339, 1255, nil, 975, 1009, nil, nil, 485, nil, nil, + nil, nil, nil, 478, nil, 1077, 356, 485, 43, 719, + nil, nil, 494, 1026, nil, 725, nil, 16, nil, nil, + nil, nil, 494, 16, 16, 614, 779, nil, nil, nil, + nil, nil, 614, nil, nil, 352, nil, 16, 16, 778, + 1034, nil, 953, nil, 352, 1050, 1051, 896, 898, nil, + 614, 978, 9, 901, 903, nil, nil, 1109, 1263, 969, + 317, 864, nil, 1232, 768, nil, nil, 756, 756, nil, + 317, nil, 765, nil, nil, nil, 1121, 339, nil, 834, + 1067, 485, 339, 1244, nil, nil, nil, 478, nil, 485, + nil, nil, nil, 16, nil, 1129, 494, 478, nil, 468, + nil, 848, 494, nil, nil, nil, nil, nil, 468, 468, + 317, 353, nil, nil, 468, 468, nil, nil, 878, nil, + 353, 878, nil, 840, 43, nil, nil, 802, nil, nil, + nil, 485, 344, 653, 654, nil, nil, 478, 148, nil, + nil, 344, nil, 643, nil, nil, 494, nil, nil, 947, + 643, 929, nil, 1043, 1043, 883, 822, 822, 1073, nil, + 467, nil, 748, 748, nil, 1043, nil, nil, nil, 467, + 467, 1160, 1132, 1133, 1134, 467, 467, 151, nil, 1182, + 946, 584, 939, nil, nil, nil, 1181, nil, nil, nil, + nil, 1173, 958, nil, 1174, 941, nil, nil, 281, 148, + 895, 643, 18, nil, nil, nil, 555, 43, 18, 16, + 43, nil, nil, nil, nil, 721, nil, nil, 726, 356, + nil, nil, 720, nil, 1027, 1168, nil, 1169, 356, 460, + 1170, 918, 966, 43, 970, nil, nil, 18, nil, 1011, + nil, 1043, nil, nil, nil, nil, nil, nil, nil, nil, + 352, nil, nil, nil, nil, nil, nil, 895, 1089, 1091, + nil, 352, nil, nil, 43, 1094, 1096, 18, 1097, 643, + nil, 43, 997, nil, 997, nil, nil, nil, 643, nil, + nil, nil, nil, nil, 1017, 468, 1200, nil, 1202, 1148, + 1150, 1152, 16, nil, nil, 16, nil, 643, nil, 756, + nil, nil, nil, 614, nil, 756, 756, nil, 884, nil, + nil, nil, nil, nil, nil, 892, nil, nil, 16, nil, + 1012, nil, 475, 555, 643, nil, 353, nil, 496, 643, + 643, nil, 18, nil, nil, nil, nil, 353, nil, nil, + nil, 18, nil, nil, nil, nil, 467, 344, nil, 16, + 1250, nil, 463, 1017, nil, nil, 16, nil, 344, nil, + 1073, 463, 463, nil, 1073, 1104, 1043, 463, 463, nil, + 1256, 1259, 1257, nil, 1258, nil, nil, nil, nil, 941, + 978, nil, nil, nil, nil, nil, nil, nil, 844, nil, + nil, 846, nil, nil, 748, nil, 1086, nil, nil, nil, + 748, 748, 1270, nil, nil, nil, 389, nil, nil, nil, + nil, nil, nil, nil, nil, 1245, nil, nil, nil, 1234, + 1236, 1238, 1240, 43, 1241, 18, 794, 18, 43, nil, + 18, nil, nil, nil, 356, 43, 18, nil, nil, nil, + nil, nil, nil, nil, nil, 356, nil, nil, 1073, nil, + 18, nil, 1214, 1215, 1216, 1217, 643, 643, 643, nil, + 1118, nil, nil, nil, nil, nil, nil, nil, 929, nil, + nil, 756, nil, nil, 756, 756, nil, 1266, 1267, 1268, + 1269, 756, 1017, nil, nil, nil, nil, nil, nil, 756, + 756, 756, 1271, nil, nil, 1146, 1146, 1146, nil, nil, + nil, nil, nil, nil, 43, nil, nil, nil, 16, nil, + nil, nil, nil, 16, 499, nil, nil, nil, nil, nil, + 16, nil, nil, nil, 43, nil, nil, nil, nil, nil, + nil, nil, 389, 18, nil, 1260, 352, 18, 463, nil, + nil, nil, 18, 997, 1221, 1222, nil, 352, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, + nil, nil, 756, nil, nil, 43, 748, nil, nil, 748, + 748, nil, nil, 18, 43, 43, 748, nil, nil, 18, + 18, nil, nil, nil, 748, 748, 748, 966, 1210, 16, + 552, nil, 1065, 18, 18, 1226, nil, 496, nil, 475, + 756, nil, nil, nil, 1008, nil, nil, nil, nil, 16, + 317, nil, 353, nil, 569, 756, 1024, 352, nil, nil, + nil, nil, nil, 353, nil, 1146, 1146, 1146, 1146, nil, + 1146, 485, 19, 294, nil, nil, nil, 478, 19, 43, + 494, 43, 16, nil, 1162, nil, 494, 997, nil, 18, + 16, nil, nil, 241, nil, 643, nil, 748, 636, 16, + 16, nil, nil, 241, 241, 241, nil, 19, 345, 345, + nil, nil, nil, nil, nil, nil, nil, 800, 43, nil, + 997, nil, nil, 1146, 1146, 1146, 1146, nil, nil, 749, + 749, nil, nil, 353, nil, 748, 756, 19, 1146, nil, + nil, nil, 241, 241, nil, 1083, 241, 400, 410, 410, + 748, 389, 389, nil, 294, nil, nil, nil, 807, 43, + 356, nil, nil, 1074, 16, nil, 16, nil, nil, 1166, + nil, 356, 43, nil, nil, nil, 756, nil, 1105, nil, + nil, nil, nil, nil, nil, nil, 1115, nil, nil, nil, + 756, nil, 756, nil, nil, 1120, nil, 837, 838, nil, + 20, nil, 19, 16, nil, 18, 20, 241, 241, 241, + 241, 19, nil, nil, 727, nil, nil, 850, 851, 43, + 855, nil, nil, nil, nil, nil, nil, nil, 756, nil, + nil, 748, nil, nil, 1065, 20, 347, 347, 1065, nil, + 1065, 356, nil, nil, 16, nil, nil, nil, nil, 897, + 899, nil, 756, nil, nil, 902, 904, 16, nil, nil, + 1158, 771, 1159, 773, nil, 20, nil, 777, nil, nil, + nil, 748, nil, nil, nil, 402, 411, 411, nil, nil, + nil, nil, 750, 750, 787, 748, nil, 748, 18, nil, + 790, 18, nil, nil, nil, 19, 241, 465, 241, 241, + 465, 241, nil, nil, 16, nil, 465, 241, 241, 751, + 751, nil, nil, 809, 18, 812, nil, nil, nil, nil, + 19, nil, 1065, 748, 1065, nil, 1065, nil, 1065, nil, + 20, nil, nil, nil, nil, nil, nil, nil, nil, 20, + 1208, nil, nil, 752, 752, 18, nil, 748, 18, nil, + nil, 839, 18, 1219, 1065, nil, nil, 18, 18, nil, + nil, 749, 1074, 18, 18, 1074, nil, 749, 749, 1074, + nil, 1074, nil, nil, 241, 241, nil, nil, nil, nil, + nil, nil, nil, nil, 241, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1252, nil, nil, 19, nil, nil, nil, 19, nil, nil, + nil, 345, 19, nil, nil, nil, 1001, 1002, nil, nil, + nil, nil, nil, 20, nil, 466, 1028, nil, 466, nil, + 345, nil, nil, nil, 466, nil, 1013, nil, 897, 899, + 904, 902, nil, 19, nil, nil, nil, nil, 20, 19, + 19, nil, nil, 1074, nil, 1074, nil, 1074, nil, 1074, + nil, nil, 241, 19, 19, nil, nil, nil, nil, nil, + nil, 753, 753, nil, nil, nil, nil, nil, nil, nil, + nil, 940, nil, 241, nil, 1074, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 18, nil, nil, nil, nil, 18, + nil, nil, nil, nil, 750, nil, 18, nil, 959, 19, + 750, 750, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 20, nil, 749, 18, 20, 749, 749, nil, 347, + 20, 751, nil, 749, 990, nil, nil, 751, 751, nil, + nil, 749, 749, 749, nil, nil, nil, 1103, 347, nil, + nil, nil, 1028, 1106, nil, nil, nil, nil, nil, nil, + nil, 20, 1116, 241, 1117, 752, nil, 20, 20, nil, + nil, 752, 752, nil, nil, 18, nil, nil, nil, nil, + nil, 20, 20, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 18, 241, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 749, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 19, nil, nil, 18, nil, + nil, nil, nil, 345, nil, 241, 18, 20, nil, nil, + nil, nil, 345, nil, nil, 18, 18, nil, nil, nil, + nil, 241, 749, nil, nil, 1079, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 749, nil, nil, + nil, nil, nil, nil, nil, nil, 750, 1087, nil, 750, + 750, nil, nil, nil, nil, nil, 750, nil, nil, nil, + nil, nil, 1098, 753, 750, 750, 750, nil, nil, 753, + 753, nil, nil, 751, nil, nil, 751, 751, 19, nil, + 18, 19, 18, 751, nil, nil, nil, nil, nil, 241, + nil, 751, 751, 751, 1123, nil, nil, nil, nil, 241, + nil, nil, nil, nil, 19, nil, 1225, 752, nil, nil, + 752, 752, nil, nil, nil, nil, nil, 752, 749, 18, + nil, nil, nil, 20, nil, 752, 752, 752, nil, nil, + nil, 347, nil, nil, nil, 19, nil, 750, 465, 241, + 347, nil, 19, nil, nil, nil, nil, 465, 465, nil, + nil, nil, nil, 465, 465, nil, nil, nil, 749, nil, + 18, nil, nil, nil, 751, nil, nil, nil, nil, nil, + nil, nil, 749, 18, 749, 750, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 750, nil, nil, nil, nil, nil, nil, nil, 752, nil, + nil, nil, 751, nil, nil, nil, 20, nil, nil, 20, + 749, 754, 754, nil, nil, nil, nil, 751, 345, nil, + 18, nil, nil, nil, nil, nil, nil, nil, nil, 345, + nil, nil, 20, nil, 749, 753, 752, nil, 753, 753, + nil, nil, nil, nil, nil, 753, nil, nil, nil, nil, + nil, 752, nil, 753, 753, 753, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, 466, nil, nil, nil, + 20, 750, nil, nil, nil, 466, 466, nil, nil, nil, + nil, 466, 466, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 19, nil, nil, nil, 751, 19, + 241, nil, nil, nil, nil, nil, 19, nil, nil, nil, + nil, 750, nil, nil, nil, 755, 755, nil, nil, nil, + nil, nil, nil, nil, 465, 750, 753, 750, nil, nil, + nil, nil, 752, nil, 30, nil, nil, nil, 751, nil, + 30, nil, nil, nil, nil, nil, 347, nil, nil, nil, + nil, nil, 751, nil, 751, 30, nil, 347, nil, nil, + nil, nil, nil, 750, 753, 30, 30, 30, nil, 30, + nil, nil, 752, nil, nil, 19, nil, nil, nil, 753, + nil, nil, nil, nil, nil, nil, 752, 750, 752, nil, + 751, nil, nil, nil, nil, 19, nil, nil, nil, 30, + nil, nil, nil, nil, 30, 30, nil, nil, 30, 757, + 757, nil, nil, nil, 751, nil, nil, nil, nil, nil, + nil, nil, 20, nil, 752, nil, 241, 20, 19, nil, + nil, nil, nil, 1023, 20, nil, 19, nil, nil, nil, + nil, nil, nil, 754, nil, 19, 19, nil, 752, 754, + 754, nil, 466, nil, nil, nil, nil, nil, nil, 33, + 753, nil, nil, nil, 30, 33, nil, nil, nil, 30, + 30, 30, 30, 30, nil, nil, nil, nil, nil, nil, + 33, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 33, 33, 33, nil, 33, nil, nil, nil, nil, nil, + 753, nil, nil, 20, 1156, nil, nil, nil, nil, nil, + 19, nil, 19, nil, 753, 1163, 753, nil, nil, nil, + nil, nil, nil, 20, 33, nil, nil, nil, nil, 33, + 33, nil, nil, 33, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 755, nil, 19, + nil, nil, 753, 755, 755, nil, 20, 30, 30, 30, + 30, 30, 30, 30, 20, nil, nil, nil, 30, 30, + 30, nil, nil, 20, 20, nil, 753, nil, nil, nil, + nil, nil, 30, nil, nil, 1204, nil, nil, nil, 33, + 19, nil, nil, nil, 33, 33, 33, 33, 33, nil, + nil, nil, nil, 19, nil, 241, 241, nil, nil, nil, + nil, nil, nil, nil, nil, 754, nil, nil, 754, 754, + nil, nil, nil, nil, nil, 754, nil, nil, nil, nil, + nil, nil, 411, 754, 754, 754, 30, 30, 20, 241, + 20, 757, nil, 1165, nil, nil, 30, 757, 757, nil, + 19, nil, nil, nil, 458, 471, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 30, nil, nil, nil, 30, + nil, nil, nil, nil, 30, nil, nil, 20, nil, nil, + nil, nil, 33, 33, 33, 33, 33, 33, 33, nil, + nil, nil, nil, 33, 33, 33, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 30, 754, 33, nil, nil, + nil, 30, 30, 411, nil, nil, nil, nil, 20, 755, + nil, nil, 755, 755, 30, 30, 30, nil, nil, 755, + nil, 20, nil, nil, nil, nil, nil, 755, 755, 755, + nil, nil, nil, nil, 754, 30, nil, nil, nil, 558, + nil, 560, nil, nil, 562, 563, nil, nil, nil, 754, + nil, 33, 33, nil, nil, nil, nil, nil, nil, nil, + nil, 33, nil, nil, nil, nil, nil, nil, 20, nil, + nil, 30, nil, nil, nil, nil, nil, nil, nil, nil, + 33, nil, nil, nil, 33, nil, nil, nil, nil, 33, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 755, nil, nil, 757, nil, 647, 757, 757, nil, nil, + nil, nil, nil, 757, nil, nil, nil, nil, nil, nil, + 33, 757, 757, 757, nil, 30, 33, 33, nil, nil, + 754, nil, nil, nil, nil, nil, nil, nil, 755, 33, + 33, 33, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 755, nil, nil, nil, nil, 30, nil, + 33, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 754, nil, nil, nil, nil, nil, nil, 706, nil, 42, + nil, nil, nil, nil, 754, 42, 754, 30, nil, nil, + nil, nil, nil, nil, 757, nil, 33, 30, nil, nil, + nil, nil, 293, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 30, 42, 343, 343, nil, nil, nil, + nil, nil, 754, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 757, nil, 755, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 42, nil, 754, 757, nil, nil, + 33, nil, nil, nil, 398, 293, 293, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 30, nil, 780, 30, 755, 647, nil, 783, nil, nil, + nil, 30, nil, 33, nil, nil, nil, nil, 755, nil, + 755, 30, nil, nil, nil, nil, 30, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, nil, 33, nil, nil, nil, nil, nil, 42, nil, + nil, nil, 33, nil, nil, nil, 755, 30, 757, nil, + 30, 30, nil, nil, 30, nil, 829, nil, 33, 30, + 30, nil, nil, nil, nil, 30, 30, nil, nil, nil, + 755, nil, nil, nil, nil, nil, 780, nil, nil, 647, + nil, nil, nil, nil, nil, nil, nil, nil, 757, nil, + nil, nil, nil, nil, nil, nil, 856, nil, nil, nil, + nil, nil, 757, nil, 757, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 33, nil, nil, 33, nil, + nil, nil, 42, nil, nil, nil, 33, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 33, nil, nil, nil, + 757, 33, nil, nil, nil, 885, nil, 42, nil, nil, + nil, nil, nil, 780, 647, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 757, nil, nil, nil, nil, nil, + nil, nil, 33, nil, nil, 33, 33, nil, nil, 33, + nil, nil, nil, nil, 33, 33, nil, nil, nil, nil, + 33, 33, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 30, nil, nil, nil, + 780, 30, 30, nil, nil, nil, nil, nil, 30, 954, + nil, nil, 955, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, 42, nil, 30, nil, 343, 42, + nil, nil, nil, nil, 967, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 343, nil, 985, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, nil, nil, 42, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 30, nil, nil, + 42, 42, nil, nil, nil, 1004, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 30, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1025, nil, nil, nil, nil, nil, + nil, 33, nil, nil, nil, nil, 33, 33, 30, nil, + 30, nil, nil, 33, nil, nil, 42, nil, 30, nil, + nil, nil, nil, nil, nil, nil, nil, 30, 30, nil, + nil, 33, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 33, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 30, nil, 30, nil, nil, nil, nil, nil, + nil, nil, 33, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1113, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 30, 42, 33, nil, 33, nil, 647, nil, nil, + 343, nil, nil, 33, nil, nil, nil, nil, nil, 343, + nil, nil, 33, 33, nil, nil, 248, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 316, 316, 316, nil, + nil, nil, 30, nil, nil, nil, nil, nil, 364, 365, + nil, 367, 368, nil, 370, 30, nil, 30, 30, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 316, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 42, nil, 33, 42, 33, + nil, 30, 1178, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 30, nil, nil, nil, nil, nil, nil, nil, + nil, 42, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 33, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, nil, nil, nil, 42, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 33, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 33, nil, 33, 33, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 33, nil, nil, nil, + nil, nil, nil, nil, nil, 343, nil, 33, nil, 316, + 470, nil, nil, 476, 316, nil, 343, nil, nil, 476, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 248, nil, nil, nil, nil, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, nil, + nil, nil, nil, 532, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 42, nil, nil, nil, nil, 42, 316, 316, nil, + nil, nil, nil, 42, nil, nil, nil, 316, nil, nil, + nil, nil, nil, nil, 316, nil, 316, nil, nil, 316, + 316, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 589, nil, 590, nil, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, nil, nil, nil, nil, + 316, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 42, nil, nil, nil, nil, + nil, nil, nil, 42, nil, nil, nil, nil, nil, nil, + nil, nil, 42, 42, nil, nil, nil, nil, nil, nil, + nil, nil, 316, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 316, nil, 476, 476, + 476, 293, nil, nil, nil, nil, nil, 42, nil, 42, + nil, nil, 1161, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 365, nil, nil, + nil, nil, nil, nil, nil, nil, 42, 316, nil, nil, + 316, nil, 316, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 316, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 476, nil, + nil, 801, 293, nil, nil, 803, nil, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 316, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 836, nil, nil, nil, nil, + nil, 316, nil, nil, 316, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 42, nil, nil, + nil, 316, 316, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 316, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 316, 476, 316, nil, nil, nil, 893, nil, 316, 316, + 476, 476, nil, nil, nil, nil, 476, 476, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 316, nil, nil, nil, nil, + nil, nil, nil, nil, 316, nil, nil, 316, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 316, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 316, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 316, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 316, + nil, nil, nil, nil, nil, nil, nil, 476, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 476, + 476, 476, 476, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1063, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1081, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1102, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 316, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 316, 476, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 316, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 316 ] + +racc_goto_check = [ + 6, 73, 39, 12, 56, 56, 56, 35, 176, 12, + 12, 23, 23, 42, 37, 23, 80, 80, 60, 60, + 113, 95, 95, 37, 130, 78, 92, 92, 92, 45, + 80, 125, 39, 21, 21, 16, 98, 124, 14, 157, + 157, 153, 52, 52, 96, 26, 2, 117, 117, 28, + 28, 6, 6, 118, 204, 82, 82, 93, 93, 257, + 132, 92, 8, 85, 158, 74, 6, 158, 177, 63, + 46, 46, 149, 5, 252, 10, 23, 23, 23, 23, + 35, 192, 36, 162, 69, 165, 60, 193, 94, 94, + 94, 167, 147, 75, 208, 130, 169, 6, 62, 6, + 6, 6, 6, 6, 6, 253, 70, 6, 163, 46, + 46, 46, 225, 45, 80, 7, 96, 175, 175, 120, + 150, 99, 225, 94, 99, 61, 61, 61, 170, 209, + 32, 77, 41, 41, 248, 1, 32, 77, 164, 246, + 68, 68, 68, 257, 5, 164, 48, 48, 3, 210, + 229, 242, 242, 229, 77, 11, 175, 79, 79, 248, + 167, 247, 247, 164, 246, 210, 77, 77, 77, 15, + 148, 218, 218, 36, 17, 9, 87, 87, 30, 30, + 19, 9, 30, 241, 241, 48, 48, 48, 24, 253, + 242, 24, 20, 22, 158, 25, 77, 24, 98, 29, + 247, 169, 56, 31, 43, 44, 77, 77, 77, 49, + 209, 50, 195, 195, 51, 53, 27, 55, 257, 92, + 92, 59, 27, 95, 195, 65, 83, 89, 208, 6, + 91, 97, 109, 170, 112, 127, 37, 129, 80, 7, + 9, 133, 134, 30, 30, 30, 30, 135, 26, 26, + 136, 27, 26, 137, 88, 88, 192, 192, 26, 138, + 139, 77, 193, 193, 209, 140, 151, 155, 160, 165, + 77, 164, 161, 168, 171, 56, 56, 147, 172, 35, + 149, 27, 99, 99, 78, 56, 173, 60, 60, 167, + 63, 27, 174, 88, 88, 88, 124, 92, 92, 179, + 195, 180, 6, 150, 12, 9, 75, 92, 182, 208, + 163, 183, 185, 186, 9, 75, 6, 6, 187, 93, + 177, 188, 6, 73, 189, 190, 209, 191, 194, 197, + 39, 23, 199, 200, 30, 30, 201, 225, 205, 99, + 37, 206, 95, 30, 30, 252, 27, 13, 95, 130, + 193, 35, 212, 213, 77, 27, 218, 218, 37, 132, + 94, 220, 60, 208, 41, 208, 39, 74, 221, 94, + 153, 204, 60, 46, 85, 224, 226, 78, 148, 77, + 227, 228, 148, 231, 69, 6, 232, 8, 120, 69, + 16, 233, 46, 158, 234, 37, 158, 235, 5, 236, + 158, 208, 158, 239, 240, 250, 70, 251, 256, nil, + 6, 70, 68, nil, 130, 157, 164, 175, 230, 248, + 230, 68, nil, 230, nil, 208, 230, nil, 118, 36, + nil, nil, nil, nil, nil, 35, 36, nil, nil, 27, + nil, 27, 94, nil, 27, 35, 60, 6, nil, 48, + 27, 242, nil, nil, 60, 80, nil, 39, 245, 245, + 37, 247, 77, 5, 27, nil, 77, nil, 48, 248, + 77, 77, 21, 164, 56, 95, nil, 164, 6, 6, + nil, 95, 6, nil, 158, 35, 158, 36, 158, 77, + 158, nil, 95, 2, 82, 98, 60, 60, 30, 12, + 10, 6, 77, 157, 157, nil, 9, 80, 77, 77, + nil, 39, 96, 93, 62, 117, 158, nil, 192, 30, + 62, 75, 77, 77, 162, 120, 162, nil, nil, nil, + 95, 257, nil, nil, 78, 13, 73, 6, nil, 41, + 41, nil, 148, 148, 6, 73, 56, 27, nil, nil, + 96, 27, nil, nil, 41, 36, 27, 88, nil, nil, + 13, 164, nil, 248, 36, nil, nil, 95, nil, nil, + nil, nil, nil, 6, nil, 12, 88, 95, 77, 61, + nil, nil, 80, 36, nil, 61, nil, 27, nil, nil, + nil, nil, 80, 27, 27, 247, 99, nil, nil, nil, + nil, nil, 247, nil, nil, 46, nil, 27, 27, 94, + 36, nil, 98, nil, 46, 36, 36, 32, 32, nil, + 247, 216, 9, 32, 32, nil, nil, 41, 125, 28, + 56, 52, nil, 157, 61, nil, nil, 77, 77, nil, + 56, nil, 30, nil, nil, nil, 12, 13, nil, 130, + 162, 95, 13, 14, nil, nil, nil, 6, nil, 95, + nil, nil, nil, 27, nil, 41, 80, 6, nil, 24, + nil, 130, 80, nil, nil, nil, nil, nil, 24, 24, + 56, 48, nil, nil, 24, 24, nil, nil, 230, nil, + 48, 230, nil, 94, 77, nil, nil, 30, nil, nil, + nil, 95, 77, 13, 13, nil, nil, 6, 80, nil, + nil, 77, nil, 39, nil, nil, 80, nil, nil, 113, + 39, 39, nil, 216, 216, 21, 148, 148, 247, nil, + 26, nil, 101, 101, nil, 216, nil, nil, nil, 26, + 26, 117, 36, 36, 36, 26, 26, 82, nil, 12, + 176, 73, 42, nil, nil, nil, 124, nil, nil, nil, + nil, 117, 73, nil, 117, 6, nil, nil, 45, 80, + 94, 39, 33, nil, nil, nil, 6, 77, 33, 27, + 77, nil, nil, nil, nil, 95, nil, nil, 95, 88, + nil, nil, 6, nil, 32, 162, nil, 162, 88, 92, + 162, 41, 6, 77, 6, nil, nil, 33, nil, 23, + nil, 216, nil, nil, nil, nil, nil, nil, nil, nil, + 46, nil, nil, nil, nil, nil, nil, 94, 245, 245, + nil, 46, nil, nil, 77, 245, 245, 33, 245, 39, + nil, 77, 6, nil, 6, nil, nil, nil, 39, nil, + nil, nil, nil, nil, 39, 24, 162, nil, 162, 159, + 159, 159, 27, nil, nil, 27, nil, 39, nil, 77, + nil, nil, nil, 247, nil, 77, 77, nil, 9, nil, + nil, nil, nil, nil, nil, 9, nil, nil, 27, nil, + 130, nil, 84, 6, 39, nil, 48, nil, 84, 39, + 39, nil, 33, nil, nil, nil, nil, 48, nil, nil, + nil, 33, nil, nil, nil, nil, 26, 77, nil, 27, + 162, nil, 27, 39, nil, nil, 27, nil, 77, nil, + 247, 27, 27, nil, 247, 23, 216, 27, 27, nil, + 162, 36, 162, nil, 162, nil, nil, nil, nil, 6, + 216, nil, nil, nil, nil, nil, nil, nil, 13, nil, + nil, 13, nil, nil, 101, nil, 6, nil, nil, nil, + 101, 101, 162, nil, nil, nil, 30, nil, nil, nil, + nil, nil, nil, nil, nil, 35, nil, nil, nil, 159, + 159, 159, 159, 77, 159, 33, 60, 33, 77, nil, + 33, nil, nil, nil, 88, 77, 33, nil, nil, nil, + nil, nil, nil, nil, nil, 88, nil, nil, 247, nil, + 33, nil, 245, 245, 245, 245, 39, 39, 39, nil, + 130, nil, nil, nil, nil, nil, nil, nil, 39, nil, + nil, 77, nil, nil, 77, 77, nil, 159, 159, 159, + 159, 77, 39, nil, nil, nil, nil, nil, nil, 77, + 77, 77, 159, nil, nil, 6, 6, 6, nil, nil, + nil, nil, nil, nil, 77, nil, nil, nil, 27, nil, + nil, nil, nil, 27, 71, nil, nil, nil, nil, nil, + 27, nil, nil, nil, 77, nil, nil, nil, nil, nil, + nil, nil, 30, 33, nil, 245, 46, 33, 27, nil, + nil, nil, 33, 6, 23, 23, nil, 46, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 77, nil, nil, + nil, nil, 77, nil, nil, 77, 101, nil, nil, 101, + 101, nil, nil, 33, 77, 77, 101, nil, nil, 33, + 33, nil, nil, nil, 101, 101, 101, 6, 37, 27, + 71, nil, 152, 33, 33, 39, nil, 84, nil, 84, + 77, nil, nil, nil, 13, nil, nil, nil, nil, 27, + 56, nil, 48, nil, 71, 77, 13, 46, nil, nil, + nil, nil, nil, 48, nil, 6, 6, 6, 6, nil, + 6, 95, 34, 77, nil, nil, nil, 6, 34, 77, + 80, 77, 27, nil, 77, nil, 80, 6, nil, 33, + 27, nil, nil, 34, nil, 39, nil, 101, 71, 27, + 27, nil, nil, 34, 34, 34, nil, 34, 34, 34, + nil, nil, nil, nil, nil, nil, nil, 84, 77, nil, + 6, nil, nil, 6, 6, 6, 6, nil, nil, 102, + 102, nil, nil, 48, nil, 101, 77, 34, 6, nil, + nil, nil, 34, 34, nil, 13, 34, 34, 34, 34, + 101, 30, 30, nil, 77, nil, nil, nil, 111, 77, + 88, nil, nil, 249, 27, nil, 27, nil, nil, 27, + nil, 88, 77, nil, nil, nil, 77, nil, 13, nil, + nil, nil, nil, nil, nil, nil, 13, nil, nil, nil, + 77, nil, 77, nil, nil, 13, nil, 111, 111, nil, + 38, nil, 34, 27, nil, 33, 38, 34, 34, 34, + 34, 34, nil, nil, 71, nil, nil, 111, 111, 77, + 111, nil, nil, nil, nil, nil, nil, nil, 77, nil, + nil, 101, nil, nil, 152, 38, 38, 38, 152, nil, + 152, 88, nil, nil, 27, nil, nil, nil, nil, 84, + 84, nil, 77, nil, nil, 84, 84, 27, nil, nil, + 13, 71, 13, 71, nil, 38, nil, 71, nil, nil, + nil, 101, nil, nil, nil, 38, 38, 38, nil, nil, + nil, nil, 103, 103, 71, 101, nil, 101, 33, nil, + 71, 33, nil, nil, nil, 34, 34, 34, 34, 34, + 34, 34, nil, nil, 27, nil, 34, 34, 34, 104, + 104, nil, nil, 71, 33, 71, nil, nil, nil, nil, + 34, nil, 152, 101, 152, nil, 152, nil, 152, nil, + 38, nil, nil, nil, nil, nil, nil, nil, nil, 38, + 13, nil, nil, 105, 105, 33, nil, 101, 33, nil, + nil, 71, 33, 13, 152, nil, nil, 33, 33, nil, + nil, 102, 249, 33, 33, 249, nil, 102, 102, 249, + nil, 249, nil, nil, 34, 34, nil, nil, nil, nil, + nil, nil, nil, nil, 34, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 13, nil, nil, 34, nil, nil, nil, 34, nil, nil, + nil, 34, 34, nil, nil, nil, 111, 111, nil, nil, + nil, nil, nil, 38, nil, 38, 84, nil, 38, nil, + 34, nil, nil, nil, 38, nil, 111, nil, 84, 84, + 84, 84, nil, 34, nil, nil, nil, nil, 38, 34, + 34, nil, nil, 249, nil, 249, nil, 249, nil, 249, + nil, nil, 34, 34, 34, nil, nil, nil, nil, nil, + nil, 106, 106, nil, nil, nil, nil, nil, nil, nil, + nil, 71, nil, 34, nil, 249, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 33, nil, nil, nil, nil, 33, + nil, nil, nil, nil, 103, nil, 33, nil, 71, 34, + 103, 103, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 38, nil, 102, 33, 38, 102, 102, nil, 38, + 38, 104, nil, 102, 71, nil, nil, 104, 104, nil, + nil, 102, 102, 102, nil, nil, nil, 111, 38, nil, + nil, nil, 84, 111, nil, nil, nil, nil, nil, nil, + nil, 38, 111, 34, 111, 105, nil, 38, 38, nil, + nil, 105, 105, nil, nil, 33, nil, nil, nil, nil, + nil, 38, 38, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 33, 34, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 102, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, 33, nil, + nil, nil, nil, 34, nil, 34, 33, 38, nil, nil, + nil, nil, 34, nil, nil, 33, 33, nil, nil, nil, + nil, 34, 102, nil, nil, 71, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 102, nil, nil, + nil, nil, nil, nil, nil, nil, 103, 71, nil, 103, + 103, nil, nil, nil, nil, nil, 103, nil, nil, nil, + nil, nil, 71, 106, 103, 103, 103, nil, nil, 106, + 106, nil, nil, 104, nil, nil, 104, 104, 34, nil, + 33, 34, 33, 104, nil, nil, nil, nil, nil, 34, + nil, 104, 104, 104, 71, nil, nil, nil, nil, 34, + nil, nil, nil, nil, 34, nil, 111, 105, nil, nil, + 105, 105, nil, nil, nil, nil, nil, 105, 102, 33, + nil, nil, nil, 38, nil, 105, 105, 105, nil, nil, + nil, 38, nil, nil, nil, 34, nil, 103, 34, 34, + 38, nil, 34, nil, nil, nil, nil, 34, 34, nil, + nil, nil, nil, 34, 34, nil, nil, nil, 102, nil, + 33, nil, nil, nil, 104, nil, nil, nil, nil, nil, + nil, nil, 102, 33, 102, 103, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 103, nil, nil, nil, nil, nil, nil, nil, 105, nil, + nil, nil, 104, nil, nil, nil, 38, nil, nil, 38, + 102, 107, 107, nil, nil, nil, nil, 104, 34, nil, + 33, nil, nil, nil, nil, nil, nil, nil, nil, 34, + nil, nil, 38, nil, 102, 106, 105, nil, 106, 106, + nil, nil, nil, nil, nil, 106, nil, nil, nil, nil, + nil, 105, nil, 106, 106, 106, nil, nil, nil, nil, + nil, nil, nil, 38, nil, nil, 38, nil, nil, nil, + 38, 103, nil, nil, nil, 38, 38, nil, nil, nil, + nil, 38, 38, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 34, nil, nil, nil, 104, 34, + 34, nil, nil, nil, nil, nil, 34, nil, nil, nil, + nil, 103, nil, nil, nil, 108, 108, nil, nil, nil, + nil, nil, nil, nil, 34, 103, 106, 103, nil, nil, + nil, nil, 105, nil, 64, nil, nil, nil, 104, nil, + 64, nil, nil, nil, nil, nil, 38, nil, nil, nil, + nil, nil, 104, nil, 104, 64, nil, 38, nil, nil, + nil, nil, nil, 103, 106, 64, 64, 64, nil, 64, + nil, nil, 105, nil, nil, 34, nil, nil, nil, 106, + nil, nil, nil, nil, nil, nil, 105, 103, 105, nil, + 104, nil, nil, nil, nil, 34, nil, nil, nil, 64, + nil, nil, nil, nil, 64, 64, nil, nil, 64, 115, + 115, nil, nil, nil, 104, nil, nil, nil, nil, nil, + nil, nil, 38, nil, 105, nil, 34, 38, 34, nil, + nil, nil, nil, 38, 38, nil, 34, nil, nil, nil, + nil, nil, nil, 107, nil, 34, 34, nil, 105, 107, + 107, nil, 38, nil, nil, nil, nil, nil, nil, 67, + 106, nil, nil, nil, 64, 67, nil, nil, nil, 64, + 64, 64, 64, 64, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, 67, 67, nil, 67, nil, nil, nil, nil, nil, + 106, nil, nil, 38, 34, nil, nil, nil, nil, nil, + 34, nil, 34, nil, 106, 34, 106, nil, nil, nil, + nil, nil, nil, 38, 67, nil, nil, nil, nil, 67, + 67, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 108, nil, 34, + nil, nil, 106, 108, 108, nil, 38, 64, 64, 64, + 64, 64, 64, 64, 38, nil, nil, nil, 64, 64, + 64, nil, nil, 38, 38, nil, 106, nil, nil, nil, + nil, nil, 64, nil, nil, 34, nil, nil, nil, 67, + 34, nil, nil, nil, 67, 67, 67, 67, 67, nil, + nil, nil, nil, 34, nil, 34, 34, nil, nil, nil, + nil, nil, nil, nil, nil, 107, nil, nil, 107, 107, + nil, nil, nil, nil, nil, 107, nil, nil, nil, nil, + nil, nil, 38, 107, 107, 107, 64, 64, 38, 34, + 38, 115, nil, 38, nil, nil, 64, 115, 115, nil, + 34, nil, nil, nil, 90, 90, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 64, nil, nil, nil, 64, + nil, nil, nil, nil, 64, nil, nil, 38, nil, nil, + nil, nil, 67, 67, 67, 67, 67, 67, 67, nil, + nil, nil, nil, 67, 67, 67, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 64, 107, 67, nil, nil, + nil, 64, 64, 38, nil, nil, nil, nil, 38, 108, + nil, nil, 108, 108, 64, 64, 64, nil, nil, 108, + nil, 38, nil, nil, nil, nil, nil, 108, 108, 108, + nil, nil, nil, nil, 107, 64, nil, nil, nil, 90, + nil, 90, nil, nil, 90, 90, nil, nil, nil, 107, + nil, 67, 67, nil, nil, nil, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, nil, nil, 38, nil, + nil, 64, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, nil, nil, 67, nil, nil, nil, nil, 67, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 108, nil, nil, 115, nil, 90, 115, 115, nil, nil, + nil, nil, nil, 115, nil, nil, nil, nil, nil, nil, + 67, 115, 115, 115, nil, 64, 67, 67, nil, nil, + 107, nil, nil, nil, nil, nil, nil, nil, 108, 67, + 67, 67, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 108, nil, nil, nil, nil, 64, nil, + 67, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 107, nil, nil, nil, nil, nil, nil, 90, nil, 76, + nil, nil, nil, nil, 107, 76, 107, 64, nil, nil, + nil, nil, nil, nil, 115, nil, 67, 64, nil, nil, + nil, nil, 76, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 64, 76, 76, 76, nil, nil, nil, + nil, nil, 107, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 115, nil, 108, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 76, nil, 107, 115, nil, nil, + 67, nil, nil, nil, 76, 76, 76, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 64, nil, 90, 64, 108, 90, nil, 90, nil, nil, + nil, 64, nil, 67, nil, nil, nil, nil, 108, nil, + 108, 64, nil, nil, nil, nil, 64, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 76, + nil, nil, 67, nil, nil, nil, nil, nil, 76, nil, + nil, nil, 67, nil, nil, nil, 108, 64, 115, nil, + 64, 64, nil, nil, 64, nil, 90, nil, 67, 64, + 64, nil, nil, nil, nil, 64, 64, nil, nil, nil, + 108, nil, nil, nil, nil, nil, 90, nil, nil, 90, + nil, nil, nil, nil, nil, nil, nil, nil, 115, nil, + nil, nil, nil, nil, nil, nil, 90, nil, nil, nil, + nil, nil, 115, nil, 115, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 67, nil, nil, 67, nil, + nil, nil, 76, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + 115, 67, nil, nil, nil, 90, nil, 76, nil, nil, + nil, nil, nil, 90, 90, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 115, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, 67, 67, nil, nil, 67, + nil, nil, nil, nil, 67, 67, nil, nil, nil, nil, + 67, 67, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 64, nil, nil, nil, + 90, 64, 64, nil, nil, nil, nil, nil, 64, 90, + nil, nil, 90, nil, nil, nil, nil, nil, nil, nil, + 76, nil, nil, nil, 76, nil, 64, nil, 76, 76, + nil, nil, nil, nil, 90, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 76, nil, 90, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 76, nil, nil, nil, nil, nil, 76, 76, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 64, nil, nil, + 76, 76, nil, nil, nil, 90, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 64, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 90, nil, nil, nil, nil, nil, + nil, 67, nil, nil, nil, nil, 67, 67, 64, nil, + 64, nil, nil, 67, nil, nil, 76, nil, 64, nil, + nil, nil, nil, nil, nil, nil, nil, 64, 64, nil, + nil, 67, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 64, nil, 64, nil, nil, nil, nil, nil, + nil, nil, 67, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 90, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 64, 76, 67, nil, 67, nil, 90, nil, nil, + 76, nil, nil, 67, nil, nil, nil, nil, nil, 76, + nil, nil, 67, 67, nil, nil, 40, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 40, 40, 40, nil, + nil, nil, 64, nil, nil, nil, nil, nil, 40, 40, + nil, 40, 40, nil, 40, 64, nil, 64, 64, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 40, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 76, nil, 67, 76, 67, + nil, 64, 90, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 64, nil, nil, nil, nil, nil, nil, nil, + nil, 76, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 76, nil, nil, nil, nil, nil, nil, 76, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 67, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 67, nil, 67, 67, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 67, nil, nil, nil, + nil, nil, nil, nil, nil, 76, nil, 67, nil, 40, + 40, nil, nil, 40, 40, nil, 76, nil, nil, 40, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 40, nil, nil, nil, nil, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, nil, + nil, nil, nil, 40, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 76, nil, nil, nil, nil, 76, 40, 40, nil, + nil, nil, nil, 76, nil, nil, nil, 40, nil, nil, + nil, nil, nil, nil, 40, nil, 40, nil, nil, 40, + 40, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 40, nil, 40, nil, nil, nil, nil, nil, + nil, nil, 76, nil, nil, nil, nil, nil, nil, nil, + 40, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 76, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 76, nil, nil, nil, nil, + nil, nil, nil, 76, nil, nil, nil, nil, nil, nil, + nil, nil, 76, 76, nil, nil, nil, nil, nil, nil, + nil, nil, 40, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 40, nil, 40, 40, + 40, 76, nil, nil, nil, nil, nil, 76, nil, 76, + nil, nil, 76, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 40, nil, nil, + nil, nil, nil, nil, nil, nil, 76, 40, nil, nil, + 40, nil, 40, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 40, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 40, nil, + nil, 40, 76, nil, nil, 40, nil, 76, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 76, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 40, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 40, nil, nil, nil, nil, + nil, 40, nil, nil, 40, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 76, nil, nil, + nil, 40, 40, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 40, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 40, 40, 40, nil, nil, nil, 40, nil, 40, 40, + 40, 40, nil, nil, nil, nil, 40, 40, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 40, nil, nil, nil, nil, + nil, nil, nil, nil, 40, nil, nil, 40, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 40, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 40, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 40, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 40, + nil, nil, nil, nil, nil, nil, nil, 40, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 40, + 40, 40, 40, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 40, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 40, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 40, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 40, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 40, 40, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 40, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 40 ] + +racc_goto_pointer = [ + nil, 135, 44, 148, nil, 68, -2, 107, 57, 173, + -67, 145, -370, 310, -555, -635, -769, -787, nil, -385, + -143, 22, 181, -61, -39, 118, 22, 214, -177, -27, + 106, 60, -100, 770, 1200, -224, -304, -5, 1328, -20, + 3223, -376, -12, -48, -48, 4, 32, nil, 108, 184, + -72, -319, -32, -437, nil, -630, -29, nil, nil, 193, + -214, 95, -205, -480, 2102, -317, nil, 2227, 107, 47, + 69, 846, nil, -37, 26, -267, 2657, 129, -383, 79, + 5, nil, 44, -228, 662, 16, nil, 123, 216, 177, + 2198, 162, -7, -327, 55, -9, -260, -308, -283, -433, + nil, 224, 751, 904, 931, 965, 1093, 1473, 1577, 207, + nil, 694, -153, -50, nil, 1671, nil, -343, -791, nil, + -727, nil, nil, nil, -359, -624, nil, 158, nil, -175, + 19, nil, 6, 175, 175, -134, 181, -417, -414, -752, + -149, nil, nil, nil, nil, nil, nil, -895, -445, -543, + -868, -721, 219, -772, nil, -676, nil, -561, -749, -208, + -799, -671, -293, -835, -672, -682, nil, -783, -849, -1026, + -994, -141, -595, 193, -383, -259, -18, -230, nil, -10, + -9, nil, -467, -347, nil, -226, -802, -685, -931, -530, + -849, -676, -659, -653, -675, -703, nil, -582, nil, -580, + -406, -403, nil, nil, -687, -403, -401, nil, -828, -927, + -1028, nil, -776, -775, nil, nil, -192, nil, -575, nil, + -445, -600, nil, nil, 279, 13, 275, 278, 278, -274, + -1, 279, 281, 285, -481, -284, -283, nil, nil, 294, + -267, -169, -225, nil, nil, -145, -671, -215, -676, 350, + -408, -735, -743, -1044, nil, nil, 112, -498 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 331, 7, 397, 334, + nil, nil, nil, 593, nil, nil, nil, nil, 330, 332, + nil, nil, nil, nil, 14, 15, 21, 246, nil, nil, + 17, nil, 464, 247, 363, nil, nil, 668, 245, 500, + 24, 1052, nil, nil, nil, 150, 53, 25, 54, nil, + nil, nil, nil, nil, 392, nil, 26, 27, 28, nil, + 797, nil, nil, nil, 351, nil, 29, 348, 479, 36, + nil, nil, 38, 41, 40, nil, 242, 243, 409, nil, + 487, 149, 95, nil, 469, 111, 50, nil, 55, 280, + 322, nil, 480, nil, 481, 492, nil, 722, 553, 320, + 305, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 66, nil, nil, 306, 70, 71, 72, nil, nil, 73, + 995, 74, 75, 76, nil, nil, 77, nil, 78, nil, + 649, 79, 373, nil, nil, nil, nil, nil, nil, nil, + nil, 310, 298, 806, 965, 658, 996, 824, 613, nil, + 825, 826, 601, 595, 596, 1196, 1064, nil, 602, nil, + nil, nil, 631, nil, 604, nil, 942, nil, nil, nil, + 611, nil, nil, nil, nil, nil, nil, nil, 491, nil, + nil, 775, nil, nil, 538, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 923, nil, 735, 744, 736, 737, + nil, nil, 738, 739, nil, nil, nil, 922, 924, nil, + 925, 1038, 1039, 1040, 1041, 1044, 622, 1045, 743, 745, + nil, nil, 94, 96, 98, nil, nil, nil, nil, nil, + 679, nil, nil, nil, nil, nil, nil, 107, 108, nil, + nil, 374, 972, 377, 600, 811, 603, 984, 616, 618, + 619, 1075, 623, 1076, 626, 629, nil, 325 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 3, 151, :_reduce_6, + 2, 151, :_reduce_none, + 1, 154, :_reduce_none, + 0, 158, :_reduce_9, + 3, 154, :_reduce_10, + 3, 157, :_reduce_11, + 0, 164, :_reduce_12, + 6, 159, :_reduce_13, + 3, 159, :_reduce_14, + 2, 160, :_reduce_15, + 1, 165, :_reduce_none, + 1, 165, :_reduce_none, + 3, 165, :_reduce_18, + 2, 165, :_reduce_19, + 1, 166, :_reduce_none, + 0, 167, :_reduce_21, + 3, 166, :_reduce_22, + 0, 178, :_reduce_23, + 4, 156, :_reduce_24, + 3, 156, :_reduce_25, + 3, 156, :_reduce_26, + 3, 156, :_reduce_27, + 2, 156, :_reduce_28, + 3, 156, :_reduce_29, + 3, 156, :_reduce_30, + 3, 156, :_reduce_31, + 3, 156, :_reduce_32, + 3, 156, :_reduce_33, + 4, 156, :_reduce_34, + 1, 156, :_reduce_none, + 3, 156, :_reduce_36, + 3, 156, :_reduce_37, + 5, 156, :_reduce_38, + 3, 156, :_reduce_39, + 1, 156, :_reduce_none, + 3, 171, :_reduce_41, + 3, 171, :_reduce_42, + 6, 171, :_reduce_43, + 5, 171, :_reduce_44, + 5, 171, :_reduce_45, + 5, 171, :_reduce_46, + 5, 171, :_reduce_47, + 3, 171, :_reduce_48, + 1, 179, :_reduce_49, + 3, 179, :_reduce_50, + 1, 179, :_reduce_none, + 1, 177, :_reduce_none, + 3, 177, :_reduce_53, + 3, 177, :_reduce_54, + 3, 177, :_reduce_55, + 2, 177, :_reduce_56, + 0, 190, :_reduce_57, + 4, 177, :_reduce_58, + 0, 191, :_reduce_59, + 4, 177, :_reduce_60, + 1, 177, :_reduce_none, + 1, 189, :_reduce_62, + 2, 193, :_reduce_63, + 0, 198, :_reduce_64, + 5, 195, :_reduce_65, + 1, 170, :_reduce_66, + 0, 201, :_reduce_67, + 0, 202, :_reduce_68, + 4, 199, :_reduce_69, + 1, 173, :_reduce_none, + 1, 173, :_reduce_none, + 1, 204, :_reduce_none, + 4, 204, :_reduce_73, + 0, 212, :_reduce_74, + 4, 209, :_reduce_75, + 1, 211, :_reduce_76, + 2, 203, :_reduce_77, + 3, 203, :_reduce_78, + 4, 203, :_reduce_79, + 5, 203, :_reduce_80, + 4, 203, :_reduce_81, + 5, 203, :_reduce_82, + 2, 203, :_reduce_83, + 2, 203, :_reduce_84, + 2, 203, :_reduce_85, + 2, 203, :_reduce_86, + 2, 203, :_reduce_87, + 1, 172, :_reduce_none, + 3, 172, :_reduce_89, + 1, 217, :_reduce_none, + 3, 217, :_reduce_91, + 1, 216, :_reduce_92, + 2, 216, :_reduce_93, + 3, 216, :_reduce_94, + 5, 216, :_reduce_95, + 2, 216, :_reduce_96, + 4, 216, :_reduce_97, + 2, 216, :_reduce_98, + 4, 216, :_reduce_99, + 1, 216, :_reduce_100, + 3, 216, :_reduce_101, + 1, 220, :_reduce_none, + 3, 220, :_reduce_103, + 2, 219, :_reduce_104, + 3, 219, :_reduce_105, + 1, 222, :_reduce_106, + 3, 222, :_reduce_107, + 1, 221, :_reduce_108, + 1, 221, :_reduce_109, + 4, 221, :_reduce_110, + 3, 221, :_reduce_111, + 3, 221, :_reduce_112, + 3, 221, :_reduce_113, + 3, 221, :_reduce_114, + 2, 221, :_reduce_115, + 1, 221, :_reduce_116, + 1, 174, :_reduce_117, + 1, 174, :_reduce_118, + 4, 174, :_reduce_119, + 3, 174, :_reduce_120, + 3, 174, :_reduce_121, + 3, 174, :_reduce_122, + 3, 174, :_reduce_123, + 2, 174, :_reduce_124, + 1, 174, :_reduce_125, + 1, 225, :_reduce_126, + 1, 225, :_reduce_none, + 2, 226, :_reduce_128, + 1, 226, :_reduce_129, + 3, 226, :_reduce_130, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_none, + 1, 192, :_reduce_134, + 1, 192, :_reduce_none, + 1, 168, :_reduce_136, + 1, 168, :_reduce_none, + 1, 169, :_reduce_138, + 0, 230, :_reduce_139, + 4, 169, :_reduce_140, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 227, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 3, 187, :_reduce_212, + 3, 187, :_reduce_213, + 6, 187, :_reduce_214, + 5, 187, :_reduce_215, + 5, 187, :_reduce_216, + 5, 187, :_reduce_217, + 5, 187, :_reduce_218, + 4, 187, :_reduce_219, + 3, 187, :_reduce_220, + 3, 187, :_reduce_221, + 3, 187, :_reduce_222, + 2, 187, :_reduce_223, + 2, 187, :_reduce_224, + 2, 187, :_reduce_225, + 2, 187, :_reduce_226, + 3, 187, :_reduce_227, + 3, 187, :_reduce_228, + 3, 187, :_reduce_229, + 3, 187, :_reduce_230, + 3, 187, :_reduce_231, + 3, 187, :_reduce_232, + 4, 187, :_reduce_233, + 2, 187, :_reduce_234, + 2, 187, :_reduce_235, + 3, 187, :_reduce_236, + 3, 187, :_reduce_237, + 3, 187, :_reduce_238, + 3, 187, :_reduce_239, + 1, 187, :_reduce_none, + 3, 187, :_reduce_241, + 3, 187, :_reduce_242, + 3, 187, :_reduce_243, + 3, 187, :_reduce_244, + 3, 187, :_reduce_245, + 2, 187, :_reduce_246, + 2, 187, :_reduce_247, + 3, 187, :_reduce_248, + 3, 187, :_reduce_249, + 3, 187, :_reduce_250, + 3, 187, :_reduce_251, + 3, 187, :_reduce_252, + 6, 187, :_reduce_253, + 4, 187, :_reduce_254, + 6, 187, :_reduce_255, + 4, 187, :_reduce_256, + 6, 187, :_reduce_257, + 1, 187, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 3, 233, :_reduce_263, + 3, 233, :_reduce_264, + 1, 237, :_reduce_265, + 1, 238, :_reduce_none, + 2, 238, :_reduce_267, + 4, 238, :_reduce_268, + 2, 238, :_reduce_269, + 1, 231, :_reduce_none, + 3, 231, :_reduce_271, + 3, 242, :_reduce_272, + 5, 242, :_reduce_273, + 3, 242, :_reduce_274, + 1, 244, :_reduce_none, + 1, 244, :_reduce_none, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 2, 182, :_reduce_279, + 4, 182, :_reduce_280, + 2, 182, :_reduce_281, + 1, 215, :_reduce_282, + 2, 215, :_reduce_283, + 2, 215, :_reduce_284, + 4, 215, :_reduce_285, + 1, 215, :_reduce_286, + 0, 247, :_reduce_287, + 2, 208, :_reduce_288, + 2, 246, :_reduce_289, + 2, 245, :_reduce_290, + 1, 245, :_reduce_none, + 1, 239, :_reduce_292, + 2, 239, :_reduce_293, + 3, 239, :_reduce_294, + 4, 239, :_reduce_295, + 1, 176, :_reduce_296, + 1, 176, :_reduce_297, + 3, 175, :_reduce_298, + 4, 175, :_reduce_299, + 2, 175, :_reduce_300, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_311, + 0, 280, :_reduce_312, + 4, 235, :_reduce_313, + 0, 281, :_reduce_314, + 3, 235, :_reduce_315, + 0, 282, :_reduce_316, + 4, 235, :_reduce_317, + 3, 235, :_reduce_318, + 3, 235, :_reduce_319, + 2, 235, :_reduce_320, + 3, 235, :_reduce_321, + 0, 283, :_reduce_322, + 4, 235, :_reduce_323, + 1, 235, :_reduce_324, + 4, 235, :_reduce_325, + 3, 235, :_reduce_326, + 1, 235, :_reduce_327, + 5, 235, :_reduce_328, + 4, 235, :_reduce_329, + 3, 235, :_reduce_330, + 2, 235, :_reduce_331, + 1, 235, :_reduce_none, + 2, 235, :_reduce_333, + 1, 235, :_reduce_334, + 6, 235, :_reduce_335, + 6, 235, :_reduce_336, + 4, 235, :_reduce_337, + 4, 235, :_reduce_338, + 5, 235, :_reduce_339, + 4, 235, :_reduce_340, + 5, 235, :_reduce_341, + 6, 235, :_reduce_342, + 0, 284, :_reduce_343, + 6, 235, :_reduce_344, + 0, 285, :_reduce_345, + 0, 286, :_reduce_346, + 8, 235, :_reduce_347, + 0, 287, :_reduce_348, + 5, 235, :_reduce_349, + 4, 235, :_reduce_350, + 4, 235, :_reduce_351, + 1, 235, :_reduce_352, + 1, 235, :_reduce_353, + 1, 235, :_reduce_354, + 1, 235, :_reduce_355, + 1, 181, :_reduce_356, + 1, 257, :_reduce_none, + 1, 263, :_reduce_none, + 1, 266, :_reduce_none, + 1, 268, :_reduce_none, + 1, 269, :_reduce_none, + 1, 270, :_reduce_none, + 1, 273, :_reduce_none, + 1, 275, :_reduce_364, + 1, 278, :_reduce_365, + 1, 194, :_reduce_366, + 1, 288, :_reduce_none, + 1, 289, :_reduce_none, + 1, 290, :_reduce_none, + 1, 291, :_reduce_none, + 1, 292, :_reduce_none, + 1, 162, :_reduce_none, + 1, 293, :_reduce_none, + 1, 258, :_reduce_none, + 1, 214, :_reduce_none, + 1, 264, :_reduce_none, + 1, 264, :_reduce_none, + 2, 264, :_reduce_none, + 1, 200, :_reduce_none, + 1, 200, :_reduce_none, + 1, 265, :_reduce_none, + 5, 265, :_reduce_382, + 1, 267, :_reduce_none, + 2, 267, :_reduce_384, + 1, 274, :_reduce_none, + 1, 274, :_reduce_386, + 1, 294, :_reduce_387, + 3, 294, :_reduce_388, + 1, 297, :_reduce_389, + 3, 297, :_reduce_390, + 1, 296, :_reduce_391, + 3, 296, :_reduce_392, + 5, 296, :_reduce_393, + 1, 296, :_reduce_394, + 3, 296, :_reduce_395, + 2, 298, :_reduce_396, + 1, 298, :_reduce_397, + 1, 299, :_reduce_none, + 1, 299, :_reduce_none, + 4, 302, :_reduce_400, + 2, 302, :_reduce_401, + 2, 302, :_reduce_402, + 1, 302, :_reduce_403, + 2, 306, :_reduce_404, + 1, 306, :_reduce_none, + 1, 307, :_reduce_406, + 6, 308, :_reduce_407, + 8, 308, :_reduce_408, + 4, 308, :_reduce_409, + 6, 308, :_reduce_410, + 4, 308, :_reduce_411, + 2, 308, :_reduce_412, + 6, 308, :_reduce_413, + 2, 308, :_reduce_414, + 4, 308, :_reduce_415, + 6, 308, :_reduce_416, + 2, 308, :_reduce_417, + 4, 308, :_reduce_418, + 2, 308, :_reduce_419, + 4, 308, :_reduce_420, + 1, 308, :_reduce_421, + 1, 312, :_reduce_422, + 1, 312, :_reduce_423, + 3, 313, :_reduce_424, + 1, 313, :_reduce_425, + 4, 313, :_reduce_426, + 1, 314, :_reduce_none, + 4, 314, :_reduce_428, + 1, 315, :_reduce_429, + 3, 315, :_reduce_430, + 1, 316, :_reduce_431, + 1, 316, :_reduce_none, + 0, 320, :_reduce_433, + 0, 321, :_reduce_434, + 5, 262, :_reduce_435, + 4, 318, :_reduce_436, + 1, 318, :_reduce_437, + 3, 319, :_reduce_438, + 3, 319, :_reduce_439, + 3, 323, :_reduce_440, + 2, 205, :_reduce_441, + 4, 205, :_reduce_442, + 5, 205, :_reduce_443, + 5, 205, :_reduce_444, + 2, 261, :_reduce_445, + 4, 261, :_reduce_446, + 4, 261, :_reduce_447, + 3, 261, :_reduce_448, + 3, 261, :_reduce_449, + 3, 261, :_reduce_450, + 2, 261, :_reduce_451, + 1, 261, :_reduce_452, + 4, 261, :_reduce_453, + 0, 326, :_reduce_454, + 4, 260, :_reduce_455, + 0, 327, :_reduce_456, + 4, 260, :_reduce_457, + 0, 328, :_reduce_458, + 0, 329, :_reduce_459, + 4, 210, :_reduce_460, + 0, 331, :_reduce_461, + 0, 332, :_reduce_462, + 4, 324, :_reduce_463, + 1, 330, :_reduce_464, + 2, 330, :_reduce_465, + 3, 330, :_reduce_466, + 4, 330, :_reduce_467, + 5, 271, :_reduce_468, + 1, 333, :_reduce_none, + 1, 333, :_reduce_none, + 0, 336, :_reduce_471, + 0, 337, :_reduce_472, + 7, 272, :_reduce_473, + 1, 335, :_reduce_none, + 1, 335, :_reduce_none, + 1, 334, :_reduce_none, + 3, 334, :_reduce_477, + 3, 334, :_reduce_478, + 1, 338, :_reduce_none, + 2, 338, :_reduce_480, + 3, 338, :_reduce_481, + 1, 338, :_reduce_482, + 1, 338, :_reduce_483, + 1, 338, :_reduce_484, + 1, 188, :_reduce_none, + 3, 343, :_reduce_486, + 1, 343, :_reduce_none, + 3, 345, :_reduce_488, + 1, 345, :_reduce_none, + 1, 347, :_reduce_490, + 1, 348, :_reduce_491, + 1, 346, :_reduce_none, + 4, 346, :_reduce_493, + 4, 346, :_reduce_494, + 4, 346, :_reduce_495, + 3, 346, :_reduce_496, + 4, 346, :_reduce_497, + 4, 346, :_reduce_498, + 4, 346, :_reduce_499, + 3, 346, :_reduce_500, + 3, 346, :_reduce_501, + 3, 346, :_reduce_502, + 2, 346, :_reduce_503, + 0, 352, :_reduce_504, + 4, 346, :_reduce_505, + 2, 346, :_reduce_506, + 0, 353, :_reduce_507, + 4, 346, :_reduce_508, + 1, 339, :_reduce_509, + 1, 339, :_reduce_510, + 2, 339, :_reduce_511, + 3, 339, :_reduce_512, + 5, 339, :_reduce_513, + 2, 339, :_reduce_514, + 4, 339, :_reduce_515, + 1, 339, :_reduce_none, + 2, 354, :_reduce_517, + 3, 354, :_reduce_518, + 1, 341, :_reduce_519, + 3, 341, :_reduce_520, + 5, 340, :_reduce_521, + 2, 357, :_reduce_522, + 1, 357, :_reduce_523, + 1, 356, :_reduce_none, + 3, 356, :_reduce_525, + 1, 355, :_reduce_526, + 3, 342, :_reduce_527, + 1, 342, :_reduce_528, + 2, 342, :_reduce_529, + 1, 342, :_reduce_530, + 1, 358, :_reduce_none, + 3, 358, :_reduce_532, + 2, 360, :_reduce_533, + 1, 360, :_reduce_534, + 1, 361, :_reduce_535, + 2, 362, :_reduce_536, + 1, 362, :_reduce_537, + 2, 364, :_reduce_538, + 1, 359, :_reduce_none, + 1, 359, :_reduce_none, + 1, 349, :_reduce_none, + 3, 349, :_reduce_542, + 3, 349, :_reduce_543, + 2, 349, :_reduce_544, + 2, 349, :_reduce_545, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 1, 349, :_reduce_none, + 2, 349, :_reduce_549, + 2, 349, :_reduce_550, + 1, 365, :_reduce_none, + 1, 365, :_reduce_none, + 1, 365, :_reduce_none, + 1, 365, :_reduce_none, + 1, 365, :_reduce_555, + 1, 365, :_reduce_556, + 1, 365, :_reduce_557, + 1, 365, :_reduce_558, + 1, 365, :_reduce_559, + 1, 365, :_reduce_none, + 1, 344, :_reduce_561, + 2, 366, :_reduce_562, + 2, 350, :_reduce_563, + 3, 350, :_reduce_564, + 1, 350, :_reduce_565, + 6, 161, :_reduce_566, + 0, 161, :_reduce_567, + 1, 367, :_reduce_568, + 1, 367, :_reduce_none, + 1, 367, :_reduce_none, + 2, 368, :_reduce_571, + 1, 368, :_reduce_none, + 2, 163, :_reduce_573, + 1, 163, :_reduce_none, + 1, 248, :_reduce_575, + 1, 248, :_reduce_none, + 1, 249, :_reduce_577, + 1, 370, :_reduce_578, + 1, 370, :_reduce_none, + 2, 370, :_reduce_580, + 3, 371, :_reduce_581, + 1, 371, :_reduce_582, + 3, 250, :_reduce_583, + 3, 251, :_reduce_584, + 3, 252, :_reduce_585, + 3, 252, :_reduce_586, + 1, 375, :_reduce_587, + 3, 375, :_reduce_588, + 1, 376, :_reduce_none, + 2, 376, :_reduce_590, + 3, 254, :_reduce_591, + 3, 254, :_reduce_592, + 1, 378, :_reduce_593, + 3, 378, :_reduce_594, + 3, 253, :_reduce_595, + 3, 253, :_reduce_596, + 3, 255, :_reduce_597, + 3, 255, :_reduce_598, + 1, 379, :_reduce_599, + 3, 379, :_reduce_600, + 1, 380, :_reduce_601, + 3, 380, :_reduce_602, + 1, 372, :_reduce_603, + 2, 372, :_reduce_604, + 1, 373, :_reduce_605, + 2, 373, :_reduce_606, + 1, 374, :_reduce_607, + 2, 374, :_reduce_608, + 1, 377, :_reduce_609, + 0, 382, :_reduce_610, + 3, 377, :_reduce_611, + 0, 383, :_reduce_612, + 4, 377, :_reduce_613, + 1, 381, :_reduce_614, + 1, 381, :_reduce_615, + 1, 381, :_reduce_616, + 1, 381, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 2, 384, :_reduce_620, + 1, 384, :_reduce_621, + 1, 386, :_reduce_none, + 1, 386, :_reduce_none, + 1, 386, :_reduce_none, + 1, 386, :_reduce_none, + 3, 385, :_reduce_626, + 1, 369, :_reduce_none, + 2, 369, :_reduce_628, + 1, 232, :_reduce_none, + 1, 232, :_reduce_none, + 1, 232, :_reduce_none, + 1, 232, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 224, :_reduce_638, + 1, 224, :_reduce_639, + 1, 224, :_reduce_640, + 1, 224, :_reduce_641, + 1, 224, :_reduce_642, + 1, 224, :_reduce_643, + 1, 224, :_reduce_644, + 1, 256, :_reduce_645, + 1, 256, :_reduce_646, + 1, 180, :_reduce_647, + 1, 180, :_reduce_648, + 1, 185, :_reduce_649, + 1, 185, :_reduce_650, + 0, 387, :_reduce_651, + 4, 276, :_reduce_652, + 1, 276, :_reduce_653, + 1, 234, :_reduce_none, + 1, 234, :_reduce_655, + 3, 388, :_reduce_656, + 5, 388, :_reduce_657, + 3, 388, :_reduce_658, + 1, 279, :_reduce_none, + 0, 390, :_reduce_660, + 3, 279, :_reduce_661, + 4, 389, :_reduce_662, + 2, 389, :_reduce_663, + 2, 389, :_reduce_664, + 1, 389, :_reduce_none, + 2, 392, :_reduce_666, + 0, 392, :_reduce_667, + 6, 322, :_reduce_668, + 8, 322, :_reduce_669, + 4, 322, :_reduce_670, + 6, 322, :_reduce_671, + 4, 322, :_reduce_672, + 6, 322, :_reduce_673, + 2, 322, :_reduce_674, + 4, 322, :_reduce_675, + 6, 322, :_reduce_676, + 2, 322, :_reduce_677, + 4, 322, :_reduce_678, + 2, 322, :_reduce_679, + 4, 322, :_reduce_680, + 1, 322, :_reduce_681, + 0, 322, :_reduce_682, + 1, 243, :_reduce_683, + 1, 317, :_reduce_684, + 1, 317, :_reduce_685, + 1, 317, :_reduce_686, + 1, 317, :_reduce_687, + 1, 295, :_reduce_none, + 1, 295, :_reduce_689, + 1, 394, :_reduce_none, + 1, 395, :_reduce_none, + 3, 395, :_reduce_692, + 1, 309, :_reduce_693, + 3, 309, :_reduce_694, + 1, 396, :_reduce_695, + 2, 397, :_reduce_696, + 1, 397, :_reduce_697, + 2, 398, :_reduce_698, + 1, 398, :_reduce_699, + 1, 303, :_reduce_none, + 3, 303, :_reduce_701, + 1, 391, :_reduce_none, + 3, 391, :_reduce_703, + 1, 363, :_reduce_none, + 1, 363, :_reduce_none, + 2, 301, :_reduce_706, + 2, 300, :_reduce_707, + 1, 300, :_reduce_708, + 3, 399, :_reduce_709, + 3, 400, :_reduce_710, + 1, 310, :_reduce_711, + 3, 310, :_reduce_712, + 1, 393, :_reduce_713, + 3, 393, :_reduce_714, + 1, 401, :_reduce_none, + 1, 401, :_reduce_none, + 2, 311, :_reduce_717, + 1, 311, :_reduce_718, + 1, 402, :_reduce_none, + 1, 402, :_reduce_none, + 2, 305, :_reduce_721, + 1, 305, :_reduce_722, + 2, 304, :_reduce_723, + 0, 304, :_reduce_724, + 1, 196, :_reduce_none, + 0, 403, :_reduce_726, + 4, 196, :_reduce_727, + 1, 259, :_reduce_728, + 2, 259, :_reduce_none, + 1, 241, :_reduce_none, + 3, 241, :_reduce_731, + 3, 404, :_reduce_732, + 2, 404, :_reduce_733, + 1, 404, :_reduce_734, + 4, 404, :_reduce_735, + 2, 404, :_reduce_736, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 213, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 1, 325, :_reduce_none, + 1, 325, :_reduce_none, + 1, 325, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 206, :_reduce_none, + 1, 206, :_reduce_none, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 186, :_reduce_none, + 1, 186, :_reduce_none, + 2, 218, :_reduce_757, + 2, 183, :_reduce_758, + 2, 351, :_reduce_759, + 0, 240, :_reduce_none, + 1, 240, :_reduce_none, + 1, 240, :_reduce_none, + 1, 277, :_reduce_763, + 1, 277, :_reduce_none, + 1, 155, :_reduce_none, + 2, 155, :_reduce_766, + 0, 153, :_reduce_767 ] + +racc_reduce_n = 768 + +racc_shift_n = 1272 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLONELY => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tLOWEST => 145, + :tEQL => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLONELY", + "tBDOT2", + "tBDOT3", + "tLOWEST", + "tEQL", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@3", + "stmts", + "stmt_or_begin", + "@4", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@5", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "backref", + "opt_nl", + "arg", + "p_expr", + "def_name", + "@6", + "@7", + "fname", + "defn_head", + "k_def", + "defs_head", + "singleton", + "dot_or_colon", + "@8", + "expr_value_do", + "do", + "@9", + "@10", + "command", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@11", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "op", + "reswords", + "symbol", + "@12", + "arg_rhs", + "simple_numeric", + "rel_expr", + "f_opt_paren_args", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@13", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "p_case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "f_any_kwrest", + "f_kwrest", + "f_no_kwarg", + "block_args_tail", + "f_block_kwarg", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "excessed_comma", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@22", + "@23", + "f_args", + "do_block", + "do_body", + "operation3", + "@24", + "@25", + "@26", + "@27", + "case_args", + "@28", + "@29", + "cases", + "p_top_expr", + "p_cases", + "@30", + "@31", + "p_top_expr_body", + "p_args", + "p_find", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@32", + "@33", + "p_args_head", + "p_arg", + "p_args_post", + "p_rest", + "p_kwarg", + "p_any_kwrest", + "p_kw", + "p_kw_label", + "p_kwrest", + "kwrest_mark", + "p_kwnorest", + "p_primitive", + "p_var_ref", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@34", + "@35", + "ssym", + "dsym", + "sym", + "@36", + "f_paren_args", + "args_tail", + "@37", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@38", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 1 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + (_, line), stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_12(val, _values, result) + res = _values[-2] + yyerror "else without rescue is useless" unless res + + result +end + +def _reduce_13(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_14(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_15(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 16 omitted + +# reduce 17 omitted + +def _reduce_18(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_19(val, _values, result) + result = val[1] + debug 2 + + result +end + +# reduce 20 omitted + +def _reduce_21(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_22(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_23(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_24(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_25(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_27(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_28(val, _values, result) + result = val[1] + + result +end + +def _reduce_29(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_30(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_31(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_33(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_34(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 3 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 35 omitted + +def _reduce_36(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_37(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_38(val, _values, result) + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_49(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +def _reduce_50(val, _values, result) + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + + result +end + +# reduce 51 omitted + +# reduce 52 omitted + +def _reduce_53(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_54(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_55(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_56(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +def _reduce_57(val, _values, result) + # value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + + result +end + +def _reduce_58(val, _values, result) + lhs, _, in_kwarg, rhs = val + + self.env.unextend + self.in_kwarg = in_kwarg + + rhs = new_in rhs, nil, nil, rhs.line + result = new_case lhs, rhs, rhs.line + + result +end + +def _reduce_59(val, _values, result) + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + + result +end + +def _reduce_60(val, _values, result) + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + + result +end + +# reduce 61 omitted + +def _reduce_62(val, _values, result) + # TODO: numparam_name(p, fname); + + (id, line), = val + old_in_def = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result = [id.to_sym, line, old_in_def] + + result +end + +def _reduce_63(val, _values, result) + _, name = val + result = name + + result +end + +def _reduce_64(val, _values, result) + lexer.lex_state = EXPR_FNAME + self.in_argdef = true + + result +end + +def _reduce_65(val, _values, result) + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + self.in_single += 1 # TODO: remove? + + # self.in_def = true # local_push + # self.env.extend + # lexer.cmdarg.push false + # lexer.cond.push false + + _, recv, _, _, name = val + + result = [recv, name] + + result +end + +def _reduce_66(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_67(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_68(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_69(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 70 omitted + +# reduce 71 omitted + +# reduce 72 omitted + +def _reduce_73(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_74(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_75(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_76(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_77(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_78(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_79(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_80(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_81(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_82(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_83(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_84(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_85(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_86(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_87(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 88 omitted + +def _reduce_89(val, _values, result) + result = val[1] + + result +end + +# reduce 90 omitted + +def _reduce_91(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_92(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_93(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_94(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_95(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_96(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_97(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_98(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_99(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_100(val, _values, result) + (_, l), = val + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_101(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 102 omitted + +def _reduce_103(val, _values, result) + result = val[1] + + result +end + +def _reduce_104(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_105(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_106(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_107(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_108(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_109(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_110(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_111(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_112(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_113(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_114(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 4 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_115(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 5 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_116(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_117(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_118(val, _values, result) + var, = val + + result = self.assignable var + + debug 6 + + result +end + +def _reduce_119(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_120(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_121(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_122(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_123(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 7 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_124(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 8 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_125(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_126(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 127 omitted + +def _reduce_128(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_129(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_130(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +def _reduce_134(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 135 omitted + +def _reduce_136(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 137 omitted + +def _reduce_138(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_139(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_140(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +# reduce 204 omitted + +# reduce 205 omitted + +# reduce 206 omitted + +# reduce 207 omitted + +# reduce 208 omitted + +# reduce 209 omitted + +# reduce 210 omitted + +# reduce 211 omitted + +def _reduce_212(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_213(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_214(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_215(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_216(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_217(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_218(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_219(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_220(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_221(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_222(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_223(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + + result +end + +def _reduce_224(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + + result +end + +def _reduce_225(val, _values, result) + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + + result +end + +def _reduce_226(val, _values, result) + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + + result +end + +def _reduce_227(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_228(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_229(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_230(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_231(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_233(val, _values, result) + _, num, _, arg = val + lit = wrap :lit, num + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_234(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_235(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_236(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_238(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_239(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 240 omitted + +def _reduce_241(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_242(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_243(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_244(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_245(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_246(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_247(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_248(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_249(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_250(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_251(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_252(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_253(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +def _reduce_254(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_255(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_256(val, _values, result) + result = new_endless_defs val + + result +end + +def _reduce_257(val, _values, result) + result = new_endless_defs val + + result +end + +# reduce 258 omitted + +# reduce 259 omitted + +# reduce 260 omitted + +# reduce 261 omitted + +# reduce 262 omitted + +def _reduce_263(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_264(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_265(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 266 omitted + +def _reduce_267(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_268(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_269(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 270 omitted + +def _reduce_271(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_272(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +def _reduce_273(val, _values, result) + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + + result +end + +def _reduce_274(val, _values, result) + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + + result +end + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +def _reduce_279(val, _values, result) + result = args val + + result +end + +def _reduce_280(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_281(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_282(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_283(val, _values, result) + result = call_args val + + result +end + +def _reduce_284(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_285(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_286(val, _values, result) + result = call_args val + + result +end + +def _reduce_287(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_288(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_289(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_290(val, _values, result) + result = val[1] + + result +end + +# reduce 291 omitted + +def _reduce_292(val, _values, result) + arg, = val + lineno = arg.line + + result = s(:array, arg).line lineno + + result +end + +def _reduce_293(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_294(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_295(val, _values, result) + args, _, (_, line), id = val + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_296(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_297(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_298(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_299(val, _values, result) + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_300(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 301 omitted + +# reduce 302 omitted + +# reduce 303 omitted + +# reduce 304 omitted + +# reduce 305 omitted + +# reduce 306 omitted + +# reduce 307 omitted + +# reduce 308 omitted + +# reduce 309 omitted + +# reduce 310 omitted + +def _reduce_311(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_312(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_313(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_314(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_315(val, _values, result) + (_, line), _, _ = val + result = s(:begin).line line + + result +end + +def _reduce_316(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_317(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_318(val, _values, result) + (_, line), stmt, _ = val + result = stmt || s(:nil).line(line) + result.paren = true + + result +end + +def _reduce_319(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_320(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_321(val, _values, result) + (_, line), args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_322(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_323(val, _values, result) + result = new_hash val + + result +end + +def _reduce_324(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_325(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_326(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_327(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_328(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_329(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_330(val, _values, result) + debug 9 + + result +end + +def _reduce_331(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 332 omitted + +def _reduce_333(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_334(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_335(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_336(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_337(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_338(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_339(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_340(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_341(val, _values, result) + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + + result +end + +def _reduce_342(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_343(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_344(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_345(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_346(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_347(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_348(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_349(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_350(val, _values, result) + # [ [:f, 1, false], s(:args)...] + # => + # [[:k_def, 666], [:f, 1], false, s(:args)...] + val.insert 1, val.first.pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_351(val, _values, result) + # [ [recv, [:name, 1, false]], s(:args...] + # => + # [ recv, [:name, 1, false], s(:args...] + # => + # [ recv, [:name, 1], false, s(:args...] + # => + # [ :k_def, recv, [:name, 1], false, s(:args...] + + val.prepend(*val.shift) + val.insert 2, val[1].pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_352(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_353(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_354(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_355(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_356(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 357 omitted + +# reduce 358 omitted + +# reduce 359 omitted + +# reduce 360 omitted + +# reduce 361 omitted + +# reduce 362 omitted + +# reduce 363 omitted + +def _reduce_364(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_365(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_366(val, _values, result) + self.comments.push self.lexer.comments + self.in_argdef = true + + result +end + +# reduce 367 omitted + +# reduce 368 omitted + +# reduce 369 omitted + +# reduce 370 omitted + +# reduce 371 omitted + +# reduce 372 omitted + +# reduce 373 omitted + +# reduce 374 omitted + +# reduce 375 omitted + +# reduce 376 omitted + +# reduce 377 omitted + +# reduce 378 omitted + +# reduce 379 omitted + +# reduce 380 omitted + +# reduce 381 omitted + +def _reduce_382(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 383 omitted + +def _reduce_384(val, _values, result) + result = val[1] + + result +end + +# reduce 385 omitted + +def _reduce_386(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +def _reduce_387(val, _values, result) + (sym, line), = val + + result = s(:dummy, sym).line line + + result +end + +def _reduce_388(val, _values, result) + _, args, _ = val + result = args + + result +end + +def _reduce_389(val, _values, result) + arg, = val + line = arg.line + + arg = arg.last if arg.sexp_type == :dummy + + result = s(:array, arg).line line + + result +end + +def _reduce_390(val, _values, result) + args, _, arg = val + + arg = arg.last if arg.sexp_type == :dummy + + result = list_append args, arg + + result +end + +def _reduce_391(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_392(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_393(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_394(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_395(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_396(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_397(val, _values, result) + (_, line), = val + result = args([:*]).line line + + result +end + +# reduce 398 omitted + +# reduce 399 omitted + +def _reduce_400(val, _values, result) + result = call_args val + + result +end + +def _reduce_401(val, _values, result) + result = call_args val + + result +end + +def _reduce_402(val, _values, result) + result = call_args val + + result +end + +def _reduce_403(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_404(val, _values, result) + result = args val + + result +end + +# reduce 405 omitted + +def _reduce_406(val, _values, result) + result = s(:WTF_COMMA!) + + result +end + +def _reduce_407(val, _values, result) + result = args val + + result +end + +def _reduce_408(val, _values, result) + result = args val + + result +end + +def _reduce_409(val, _values, result) + result = args val + + result +end + +def _reduce_410(val, _values, result) + result = args val + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +def _reduce_412(val, _values, result) + arg, _ = val + result = arg << nil + + result +end + +def _reduce_413(val, _values, result) + result = args val + + result +end + +def _reduce_414(val, _values, result) + result = args val + + result +end + +def _reduce_415(val, _values, result) + result = args val + + result +end + +def _reduce_416(val, _values, result) + result = args val + + result +end + +def _reduce_417(val, _values, result) + result = args val + + result +end + +def _reduce_418(val, _values, result) + result = args val + + result +end + +def _reduce_419(val, _values, result) + result = args val + + result +end + +def _reduce_420(val, _values, result) + result = args val + + result +end + +def _reduce_421(val, _values, result) + result = args val + + result +end + +def _reduce_422(val, _values, result) + result = 0 + result +end + +def _reduce_423(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_424(val, _values, result) + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + + result +end + +def _reduce_425(val, _values, result) + (_, line), = val + + result = s(:args).line line + + result +end + +def _reduce_426(val, _values, result) + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + + result +end + +# reduce 427 omitted + +def _reduce_428(val, _values, result) + result = args val + + result +end + +def _reduce_429(val, _values, result) + result = args val + + result +end + +def _reduce_430(val, _values, result) + result = args val + + result +end + +def _reduce_431(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 432 omitted + +def _reduce_433(val, _values, result) + self.env.extend :dynamic + result = lexer.lpar_beg + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_434(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_435(val, _values, result) + (_, line), lpar, args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_436(val, _values, result) + self.in_argdef = false + result = args val + + result +end + +def _reduce_437(val, _values, result) + self.in_argdef = false + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_438(val, _values, result) + result = val[1] + + result +end + +def _reduce_439(val, _values, result) + result = val[1] + + result +end + +def _reduce_440(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_441(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_442(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_443(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_444(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_445(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_446(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_447(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_448(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_449(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_450(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_451(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_452(val, _values, result) + (_, line), = val + result = s(:zsuper).line line + + result +end + +def _reduce_453(val, _values, result) + result = new_aref val + + result +end + +def _reduce_454(val, _values, result) + self.env.extend :dynamic + + result +end + +def _reduce_455(val, _values, result) + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_456(val, _values, result) + self.env.extend :dynamic + + result +end + +def _reduce_457(val, _values, result) + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_458(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_459(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_460(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_461(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_462(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_463(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_464(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_465(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_466(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_467(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_468(val, _values, result) + (_, line), case_args, _then, body, cases = val + + result = new_when case_args, body + result.line line + result << cases if cases + + result +end + +# reduce 469 omitted + +# reduce 470 omitted + +def _reduce_471(val, _values, result) + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + + result +end + +def _reduce_472(val, _values, result) + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + + result +end + +def _reduce_473(val, _values, result) + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + + result +end + +# reduce 474 omitted + +# reduce 475 omitted + +# reduce 476 omitted + +def _reduce_477(val, _values, result) + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + + result +end + +def _reduce_478(val, _values, result) + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + + result +end + +# reduce 479 omitted + +def _reduce_480(val, _values, result) + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + + result +end + +def _reduce_481(val, _values, result) + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + + result +end + +def _reduce_482(val, _values, result) + find, = val + + result = new_find_pattern nil, find + + result +end + +def _reduce_483(val, _values, result) + args, = val + result = new_array_pattern nil, nil, args, args.line + + result +end + +def _reduce_484(val, _values, result) + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + + result +end + +# reduce 485 omitted + +def _reduce_486(val, _values, result) + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + + result +end + +# reduce 487 omitted + +def _reduce_488(val, _values, result) + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + + result +end + +# reduce 489 omitted + +def _reduce_490(val, _values, result) + push_pktbl + result +end + +def _reduce_491(val, _values, result) + push_pktbl + result +end + +# reduce 492 omitted + +def _reduce_493(val, _values, result) + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + + result +end + +def _reduce_494(val, _values, result) + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + + result +end + +def _reduce_495(val, _values, result) + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + + result +end + +def _reduce_496(val, _values, result) + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + + result +end + +def _reduce_497(val, _values, result) + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + + result +end + +def _reduce_498(val, _values, result) + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + + result +end + +def _reduce_499(val, _values, result) + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + + result +end + +def _reduce_500(val, _values, result) + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + + result +end + +def _reduce_501(val, _values, result) + _, pat, _ = val + + result = new_array_pattern nil, nil, pat, pat.line + + result +end + +def _reduce_502(val, _values, result) + _, find, _ = val + + result = new_find_pattern nil, find + + result +end + +def _reduce_503(val, _values, result) + (_, line), _ = val + + result = s(:array_pat).line line + + result +end + +def _reduce_504(val, _values, result) + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + + result +end + +def _reduce_505(val, _values, result) + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + + result +end + +def _reduce_506(val, _values, result) + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + + result +end + +def _reduce_507(val, _values, result) + push_pktbl + result +end + +def _reduce_508(val, _values, result) + _, _, expr, _ = val + + pop_pktbl + result = expr + + result +end + +def _reduce_509(val, _values, result) + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + + result +end + +def _reduce_510(val, _values, result) + head, = val + + result = new_array_pattern_tail head, true, nil, nil + + result +end + +def _reduce_511(val, _values, result) + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + + result +end + +def _reduce_512(val, _values, result) + head, _, (id, _line) = val + + result = new_array_pattern_tail head, true, id.to_sym, nil + result.line head.line + + result +end + +def _reduce_513(val, _values, result) + head, _, (id, _line), _, post = val + + result = new_array_pattern_tail head, true, id.to_sym, post + result.line head.line + + result +end + +def _reduce_514(val, _values, result) + expr, _ = val + + result = new_array_pattern_tail(expr, true, nil, nil).line expr.line + + result +end + +def _reduce_515(val, _values, result) + head, _, _, post = val + + result = new_array_pattern_tail(head, true, nil, post).line head.line + + result +end + +# reduce 516 omitted + +def _reduce_517(val, _values, result) + arg, _ = val + result = arg + + result +end + +def _reduce_518(val, _values, result) + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + + result +end + +def _reduce_519(val, _values, result) + (id, line), = val + + result = new_array_pattern_tail nil, true, id, nil + result.line line + + result +end + +def _reduce_520(val, _values, result) + (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id, rhs + result.line line + + result +end + +def _reduce_521(val, _values, result) + lhs, _, mid, _, rhs = val + + result = new_find_pattern_tail lhs, mid, rhs + + result +end + +def _reduce_522(val, _values, result) + _, (id, line) = val + + result = [id.to_sym, line] + + result +end + +def _reduce_523(val, _values, result) + (_id, line), = val + + result = [nil, line] + + result +end + +# reduce 524 omitted + +def _reduce_525(val, _values, result) + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + + result +end + +def _reduce_526(val, _values, result) + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + + result +end + +def _reduce_527(val, _values, result) + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + + result +end + +def _reduce_528(val, _values, result) + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + + result +end + +def _reduce_529(val, _values, result) + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + + result +end + +def _reduce_530(val, _values, result) + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + + result +end + +# reduce 531 omitted + +def _reduce_532(val, _values, result) + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + + result +end + +def _reduce_533(val, _values, result) + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + + result +end + +def _reduce_534(val, _values, result) + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 10 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + + result +end + +def _reduce_535(val, _values, result) + result = wrap :lit, val[0] + + result +end + +def _reduce_536(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + + result +end + +def _reduce_537(val, _values, result) + (_, line), = val + + result = s(:kwrest, :"**").line line + + result +end + +def _reduce_538(val, _values, result) + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + + result +end + +# reduce 539 omitted + +# reduce 540 omitted + +# reduce 541 omitted + +def _reduce_542(val, _values, result) + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + + result +end + +def _reduce_543(val, _values, result) + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + + result +end + +def _reduce_544(val, _values, result) + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + + result +end + +def _reduce_545(val, _values, result) + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + + result +end + +# reduce 546 omitted + +# reduce 547 omitted + +# reduce 548 omitted + +def _reduce_549(val, _values, result) + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + + result +end + +def _reduce_550(val, _values, result) + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + + result +end + +# reduce 551 omitted + +# reduce 552 omitted + +# reduce 553 omitted + +# reduce 554 omitted + +def _reduce_555(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_556(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_557(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_558(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_559(val, _values, result) + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + + result +end + +# reduce 560 omitted + +def _reduce_561(val, _values, result) + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + + result +end + +def _reduce_562(val, _values, result) + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + + result +end + +def _reduce_563(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_564(val, _values, result) + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + + result +end + +def _reduce_565(val, _values, result) + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + + result +end + +def _reduce_566(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_567(val, _values, result) + result = nil + + result +end + +def _reduce_568(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 569 omitted + +# reduce 570 omitted + +def _reduce_571(val, _values, result) + result = val[1] + + result +end + +# reduce 572 omitted + +def _reduce_573(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 574 omitted + +def _reduce_575(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 576 omitted + +def _reduce_577(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_578(val, _values, result) + debug 12 + + result +end + +# reduce 579 omitted + +def _reduce_580(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_581(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_582(val, _values, result) + result = new_string val + + result +end + +def _reduce_583(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_584(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_585(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_586(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_587(val, _values, result) + result = new_word_list + + result +end + +def _reduce_588(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 589 omitted + +def _reduce_590(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_591(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_592(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_593(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_594(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_595(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_596(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_597(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_598(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_599(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_600(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_601(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_602(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_603(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_604(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_605(val, _values, result) + result = nil + + result +end + +def _reduce_606(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_607(val, _values, result) + result = nil + + result +end + +def _reduce_608(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_609(val, _values, result) + result = new_string val + + result +end + +def _reduce_610(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_611(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_612(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_613(val, _values, result) + (_, line), memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 13 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_614(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_615(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_616(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 617 omitted + +# reduce 618 omitted + +# reduce 619 omitted + +def _reduce_620(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_621(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 622 omitted + +# reduce 623 omitted + +# reduce 624 omitted + +# reduce 625 omitted + +def _reduce_626(val, _values, result) + (_, line), result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line line + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 14 + end + + result +end + +# reduce 627 omitted + +def _reduce_628(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 629 omitted + +# reduce 630 omitted + +# reduce 631 omitted + +# reduce 632 omitted + +# reduce 633 omitted + +# reduce 634 omitted + +# reduce 635 omitted + +# reduce 636 omitted + +# reduce 637 omitted + +def _reduce_638(val, _values, result) + (_, line), = val; result = s(:nil).line line + result +end + +def _reduce_639(val, _values, result) + (_, line), = val; result = s(:self).line line + result +end + +def _reduce_640(val, _values, result) + (_, line), = val; result = s(:true).line line + result +end + +def _reduce_641(val, _values, result) + (_, line), = val; result = s(:false).line line + result +end + +def _reduce_642(val, _values, result) + (_, line), = val; result = s(:str, self.file).line line + result +end + +def _reduce_643(val, _values, result) + (_, line), = val; result = s(:lit, line).line line + result +end + +def _reduce_644(val, _values, result) + (_, l), = val + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_645(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + + result.line line + + result +end + +def _reduce_646(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_647(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_648(val, _values, result) + result = self.assignable val[0] + debug 15 + + result +end + +def _reduce_649(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_650(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_651(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_652(val, _values, result) + result = val[2] + + result +end + +def _reduce_653(val, _values, result) + result = nil + + result +end + +# reduce 654 omitted + +def _reduce_655(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +def _reduce_656(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +def _reduce_657(val, _values, result) + result = end_args val + + result +end + +def _reduce_658(val, _values, result) + result = end_args val + + result +end + +# reduce 659 omitted + +def _reduce_660(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.in_argdef = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_661(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +def _reduce_662(val, _values, result) + result = args val + + result +end + +def _reduce_663(val, _values, result) + result = args val + + result +end + +def _reduce_664(val, _values, result) + result = args val + + result +end + +# reduce 665 omitted + +def _reduce_666(val, _values, result) + result = val[1] + + result +end + +def _reduce_667(val, _values, result) + result = nil + + result +end + +def _reduce_668(val, _values, result) + result = args val + + result +end + +def _reduce_669(val, _values, result) + result = args val + + result +end + +def _reduce_670(val, _values, result) + result = args val + + result +end + +def _reduce_671(val, _values, result) + result = args val + + result +end + +def _reduce_672(val, _values, result) + result = args val + + result +end + +def _reduce_673(val, _values, result) + result = args val + + result +end + +def _reduce_674(val, _values, result) + result = args val + + result +end + +def _reduce_675(val, _values, result) + result = args val + + result +end + +def _reduce_676(val, _values, result) + result = args val + + result +end + +def _reduce_677(val, _values, result) + result = args val + + result +end + +def _reduce_678(val, _values, result) + result = args val + + result +end + +def _reduce_679(val, _values, result) + result = args val + + result +end + +def _reduce_680(val, _values, result) + result = args val + + result +end + +def _reduce_681(val, _values, result) + result = args val + + result +end + +def _reduce_682(val, _values, result) + result = args val + + result +end + +def _reduce_683(val, _values, result) + (_, line), = val + result = s(:forward_args).line line + + result +end + +def _reduce_684(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_685(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_686(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_687(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 688 omitted + +def _reduce_689(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 690 omitted + +# reduce 691 omitted + +def _reduce_692(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_693(val, _values, result) + result = new_arg val + + result +end + +def _reduce_694(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +def _reduce_695(val, _values, result) + label, = val + # arg_var(p, formal_argument(p, $1)); + # p->cur_arg = get_id($1); + # p->max_numparam = ORDINAL_PARAM; + self.in_argdef = false + result = label + + result +end + +def _reduce_696(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + self.in_argdef = true + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_697(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_698(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_699(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 700 omitted + +def _reduce_701(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 702 omitted + +def _reduce_703(val, _values, result) + result = args val + + result +end + +# reduce 704 omitted + +# reduce 705 omitted + +def _reduce_706(val, _values, result) + (_, line), _ = val + result = [:"**nil", line] + + result +end + +def _reduce_707(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_708(val, _values, result) + (_, line), = val + id = :"**" + self.env[id] = :lvar + result = [id, line] + + result +end + +def _reduce_709(val, _values, result) + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO: detect duplicate names + # TODO? p->cur_arg = 0; + + result +end + +def _reduce_710(val, _values, result) + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO? p->cur_arg = 0; + + result +end + +def _reduce_711(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_712(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_713(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_714(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 715 omitted + +# reduce 716 omitted + +def _reduce_717(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_718(val, _values, result) + (_, line), = val + name = :"*" + self.env[name] = :lvar + result = [name, line] + + result +end + +# reduce 719 omitted + +# reduce 720 omitted + +def _reduce_721(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_722(val, _values, result) + (_, line), = val + + result = [:&, line] + + result +end + +def _reduce_723(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_724(val, _values, result) + result = nil + + result +end + +# reduce 725 omitted + +def _reduce_726(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_727(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_728(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 729 omitted + +# reduce 730 omitted + +def _reduce_731(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_732(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_733(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_734(val, _values, result) + lit = wrap :lit, val[0] + arg = nil + + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_735(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_736(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 737 omitted + +# reduce 738 omitted + +# reduce 739 omitted + +# reduce 740 omitted + +# reduce 741 omitted + +# reduce 742 omitted + +# reduce 743 omitted + +# reduce 744 omitted + +# reduce 745 omitted + +# reduce 746 omitted + +# reduce 747 omitted + +# reduce 748 omitted + +# reduce 749 omitted + +# reduce 750 omitted + +# reduce 751 omitted + +# reduce 752 omitted + +# reduce 753 omitted + +# reduce 754 omitted + +# reduce 755 omitted + +# reduce 756 omitted + +def _reduce_757(val, _values, result) + _, close = val # TODO: include lineno in close? + result = [close, lexer.lineno] + + result +end + +def _reduce_758(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_759(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 760 omitted + +# reduce 761 omitted + +# reduce 762 omitted + +def _reduce_763(val, _values, result) + yyerrok + result +end + +# reduce 764 omitted + +# reduce 765 omitted + +def _reduce_766(val, _values, result) + yyerrok + result +end + +def _reduce_767(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby30Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby30_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby30_parser.y new file mode 100644 index 000000000..2ed4e38c7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby30_parser.y @@ -0,0 +1,3508 @@ +# -*- racc -*- + +class Ruby30Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + tBDOT2 tBDOT3 + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 1 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY top_compstmt tRCURLY + { + (_, line), stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + yyerror "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 2 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 3 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg kRESCUE_MOD stmt + { + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg tASSOC + { + # value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } + p_expr + { + lhs, _, in_kwarg, rhs = val + + self.env.unextend + self.in_kwarg = in_kwarg + + rhs = new_in rhs, nil, nil, rhs.line + result = new_case lhs, rhs, rhs.line + } + | arg + kIN + { + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } + p_expr + { + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + } + | arg =tLBRACE_ARG + + def_name: fname + { + # TODO: numparam_name(p, fname); + + (id, line), = val + old_in_def = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result = [id.to_sym, line, old_in_def] + } + defn_head: k_def def_name + { + _, name = val + result = name + } + defs_head: k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + self.in_argdef = true + } + def_name + { + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + self.in_single += 1 # TODO: remove? + + # self.in_def = true # local_push + # self.env.extend + # lexer.cmdarg.push false + # lexer.cond.push false + + _, recv, _, _, name = val + + result = [recv, name] + } + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + (_, l), = val + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 4 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 5 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 6 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 7 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 8 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + | arg tDOT2 + { + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + } + | arg tDOT3 + { + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + } + + | tBDOT2 arg + { + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + } + | tBDOT3 arg + { + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + } + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, num, _, arg = val + lit = wrap :lit, num + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | defn_head f_opt_paren_args tEQL arg + { + result = new_endless_defn val + } + | defn_head f_opt_paren_args tEQL arg kRESCUE_MOD arg + { + result = new_endless_defn val + } + | defs_head f_opt_paren_args tEQL arg + { + result = new_endless_defs val + } + | defs_head f_opt_paren_args tEQL arg kRESCUE_MOD arg + { + result = new_endless_defs val + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + | tLPAREN2 args tCOMMA args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + | tLPAREN2 args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + args, _, (_, line), id = val + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + (_, line), _, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + (_, line), stmt, _ = val + result = stmt || s(:nil).line(line) + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK aref_args rbracket + { + (_, line), args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 9 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_case expr_value opt_terms p_case_body k_end + { + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt + k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | defn_head f_arglist bodystmt k_end + { + # [ [:f, 1, false], s(:args)...] + # => + # [[:k_def, 666], [:f, 1], false, s(:args)...] + val.insert 1, val.first.pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | defs_head f_arglist bodystmt k_end + { + # [ [recv, [:name, 1, false]], s(:args...] + # => + # [ recv, [:name, 1, false], s(:args...] + # => + # [ recv, [:name, 1], false, s(:args...] + # => + # [ :k_def, recv, [:name, 1], false, s(:args...] + + val.prepend(*val.shift) + val.insert 2, val[1].pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + self.in_argdef = true + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + { + (sym, line), = val + + result = s(:dummy, sym).line line + } + | tLPAREN f_margs rparen + { + _, args, _ = val + result = args + } + + f_marg_list: f_marg + { + arg, = val + line = arg.line + + arg = arg.last if arg.sexp_type == :dummy + + result = s(:array, arg).line line + } + | f_marg_list tCOMMA f_marg + { + args, _, arg = val + + arg = arg.last if arg.sexp_type == :dummy + + result = list_append args, arg + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + (_, line), = val + result = args([:*]).line line + } + + f_any_kwrest: f_kwrest + | f_no_kwarg + + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_any_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + excessed_comma: tCOMMA + { + result = s(:WTF_COMMA!) + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg excessed_comma + { + arg, _ = val + result = arg << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + } + | tOROP + { + (_, line), = val + + result = s(:args).line line + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = lexer.lpar_beg + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + (_, line), lpar, args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + self.in_argdef = false + result = args val + } + | f_args + { + self.in_argdef = false + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + (_, line), = val + result = s(:zsuper).line line + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + } + brace_body + tRCURLY + { + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + } + do_body + kEND + { + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + bodystmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + case_args then compstmt cases + { + (_, line), case_args, _then, body, cases = val + + result = new_when case_args, body + result.line line + result << cases if cases + } + + cases: opt_else | case_body +###################################################################### + + p_case_body: kIN + { + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + } + p_top_expr then + { + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + } + compstmt + p_cases + { + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + } + + p_cases: opt_else + | p_case_body + + p_top_expr: p_top_expr_body + | p_top_expr_body kIF_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + } + | p_top_expr_body kUNLESS_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + } + + p_top_expr_body: p_expr + | p_expr tCOMMA + { + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + } + | p_expr tCOMMA p_args + { + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + } + | p_find + { + find, = val + + result = new_find_pattern nil, find + } + | p_args_tail + { + args, = val + result = new_array_pattern nil, nil, args, args.line + } + | p_kwargs + { + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + } + + p_expr: p_as + + p_as: p_expr tASSOC p_variable + { + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + } + | p_alt + + p_alt: p_alt tPIPE p_expr_basic + { + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + } + | p_expr_basic + + p_lparen: tLPAREN2 { push_pktbl } + p_lbracket: tLBRACK2 { push_pktbl } + + p_expr_basic: p_value + | p_const p_lparen p_args tRPAREN + { + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + } + | p_const p_lparen p_find tRPAREN + { + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + } + | p_const p_lparen p_kwargs tRPAREN + { + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + } + | p_const tLPAREN2 tRPAREN + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | p_const p_lbracket p_args rbracket + { + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + } + | p_const p_lbracket p_find rbracket + { + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + } + | p_const p_lbracket p_kwargs rbracket + { + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + } + | p_const tLBRACK2 rbracket + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | tLBRACK p_args rbracket + { + _, pat, _ = val + + result = new_array_pattern nil, nil, pat, pat.line + } + | tLBRACK p_find rbracket + { + _, find, _ = val + + result = new_find_pattern nil, find + } + | tLBRACK rbracket + { + (_, line), _ = val + + result = s(:array_pat).line line + } + | tLBRACE + { + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + } + p_kwargs rbrace + { + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + } + | tLBRACE rbrace + { + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + } + | tLPAREN { push_pktbl } p_expr tRPAREN + { + _, _, expr, _ = val + + pop_pktbl + result = expr + } + + p_args: p_expr + { + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + } + | p_args_head + { + head, = val + + result = new_array_pattern_tail head, true, nil, nil + } + | p_args_head p_arg + { + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER + { + head, _, (id, _line) = val + + result = new_array_pattern_tail head, true, id.to_sym, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post + { + head, _, (id, _line), _, post = val + + result = new_array_pattern_tail head, true, id.to_sym, post + result.line head.line + } + | p_args_head tSTAR + { + expr, _ = val + + result = new_array_pattern_tail(expr, true, nil, nil).line expr.line + } + | p_args_head tSTAR tCOMMA p_args_post + { + head, _, _, post = val + + result = new_array_pattern_tail(head, true, nil, post).line head.line + } + | p_args_tail + + p_args_head: p_arg tCOMMA + { + arg, _ = val + result = arg + } + | p_args_head p_arg tCOMMA + { + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + } + + p_args_tail: p_rest + { + (id, line), = val + + result = new_array_pattern_tail nil, true, id, nil + result.line line + } + | p_rest tCOMMA p_args_post + { + (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id, rhs + result.line line + } + + p_find: p_rest tCOMMA p_args_post tCOMMA p_rest + { + lhs, _, mid, _, rhs = val + + result = new_find_pattern_tail lhs, mid, rhs + } + + p_rest: tSTAR tIDENTIFIER + { + _, (id, line) = val + + result = [id.to_sym, line] + } + | tSTAR + { + (_id, line), = val + + result = [nil, line] + } + + p_args_post: p_arg + | p_args_post tCOMMA p_arg + { + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + } + + p_arg: p_expr + { + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + } + + p_kwargs: p_kwarg tCOMMA p_any_kwrest + { + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + } + | p_kwarg + { + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_kwarg tCOMMA + { + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_any_kwrest + { + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + } + + p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1) + | p_kwarg tCOMMA p_kw + { + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + } + + p_kw: p_kw_label p_expr + { + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + } + | p_kw_label + { + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 10 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + } + + p_kw_label: tLABEL + { + result = wrap :lit, val[0] + } + + p_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + } + | kwrest_mark + { + (_, line), = val + + result = s(:kwrest, :"**").line line + } + + p_kwnorest: kwrest_mark kNIL + { + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + } + + p_any_kwrest: p_kwrest + | p_kwnorest + + p_value: p_primitive + | p_primitive tDOT2 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + } + | p_primitive tDOT3 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + } + | p_primitive tDOT2 + { + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + } + | p_primitive tDOT3 + { + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + } + | p_variable + | p_var_ref + | p_const + | tBDOT2 p_primitive + { + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + } + | tBDOT3 p_primitive + { + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + } + + p_primitive: literal + | strings + | xstring + | regexp + | words + { + result = ary_to_pat val[0] + } + | qwords + { + result = ary_to_pat val[0] + } + | symbols + { + result = ary_to_pat val[0] + } + | qsymbols + { + result = ary_to_pat val[0] + } + | keyword_variable + { + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + } + | lambda + + p_variable: tIDENTIFIER + { + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + } + + p_var_ref: tCARET tIDENTIFIER + { + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + } + + + p_const: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | p_const tCOLON2 cname + { + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + } + | tCONSTANT + { + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + } +###################################################################### + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 12 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + (_, line), memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 13 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + (_, line), result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line line + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 14 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { (_, line), = val; result = s(:nil).line line } + | kSELF { (_, line), = val; result = s(:self).line line } + | kTRUE { (_, line), = val; result = s(:true).line line } + | kFALSE { (_, line), = val; result = s(:false).line line } + | k__FILE__ { (_, line), = val; result = s(:str, self.file).line line } + | k__LINE__ { (_, line), = val; result = s(:lit, line).line line } + | k__ENCODING__ + { + (_, l), = val + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 15 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + +f_opt_paren_args: f_paren_args + | none + { + self.in_argdef = false + result = end_args val + } + + f_paren_args: tLPAREN2 f_args rparen + { + self.in_argdef = false + result = end_args val + } + | tLPAREN2 f_arg tCOMMA args_forward rparen + { + result = end_args val + } + | tLPAREN2 args_forward rparen + { + result = end_args val + } + + f_arglist: f_paren_args + | { + result = self.in_kwarg + self.in_kwarg = true + self.in_argdef = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + self.in_argdef = false + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_any_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + } + + args_forward: tBDOT3 + { + (_, line), = val + result = s(:forward_args).line line + } + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + { + label, = val + # arg_var(p, formal_argument(p, $1)); + # p->cur_arg = get_id($1); + # p->max_numparam = ORDINAL_PARAM; + self.in_argdef = false + result = label + } + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + self.in_argdef = true + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + f_no_kwarg: kwrest_mark kNIL + { + (_, line), _ = val + result = [:"**nil", line] + } + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + (_, line), = val + id = :"**" + self.env[id] = :lvar + result = [id, line] + } + + f_opt: f_arg_asgn + tEQL + arg_value + { + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO: detect duplicate names + # TODO? p->cur_arg = 0; + } + + f_block_opt: f_arg_asgn + tEQL + primary_value + { + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO? p->cur_arg = 0; + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + (_, line), = val + name = :"*" + self.env[name] = :lvar + result = [name, line] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + | blkarg_mark + { + (_, line), = val + + result = [:&, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tLABEL + { + lit = wrap :lit, val[0] + arg = nil + + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val # TODO: include lineno in close? + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + rbrace: opt_nl tRCURLY + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby31_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby31_parser.rb new file mode 100644 index 000000000..74c550c86 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby31_parser.rb @@ -0,0 +1,13649 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby31Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -647, 699, 702, 317, 653, -121, 317, -647, -647, -647, + 228, 229, -647, -647, -647, -115, -647, -122, 1178, -117, + 653, 653, 228, 229, -647, 246, -647, -647, -647, 228, + 229, -768, 642, 758, 992, 641, -647, -647, 234, -647, + -647, -647, -647, -647, 247, 312, 1033, 653, -129, -116, + -128, 759, 991, -124, -126, 653, 876, 968, 240, 228, + 229, 247, 1051, -114, 698, 701, -661, -647, -647, -647, + -647, -647, -647, -647, -647, -647, -647, -647, -647, -647, + -647, 653, -115, -647, -647, -647, -117, -647, -647, 871, + 319, -647, -123, 319, -647, -647, 1179, -647, 967, -647, + 247, -647, 235, -647, -647, -647, -647, -647, -647, -647, + -112, -647, 247, -647, -780, -753, -116, -115, 134, 247, + -115, -117, -113, 133, -117, -121, -647, -647, -647, -647, + -114, -647, -121, -647, 134, 134, -650, -115, -647, 133, + 133, -117, -647, -650, -650, -650, -647, -122, -650, -650, + -650, -116, -650, -120, -116, -119, -129, -128, -115, -117, + -650, 134, -650, -650, -650, -114, 133, 1050, -114, 134, + -124, -116, -650, -650, 133, -650, -650, -650, -650, -650, + -126, -125, 240, -123, 968, -114, -125, -127, 1011, 134, + 317, -662, 1011, 3, 133, 134, 683, -114, 1040, 688, + 133, 548, 130, -650, -650, -650, -650, -650, -650, -650, + -650, -650, -650, -650, -650, -650, -650, 225, 317, -650, + -650, -650, 1010, -650, -650, -534, 1010, -650, 112, 113, + -650, -650, 667, -650, 244, -650, 668, -650, -780, -650, + -650, -650, -650, -650, -650, -650, -121, -650, -127, -650, + -122, -121, -753, -754, 226, 314, 683, 685, 684, -753, + -129, -122, -650, -650, -650, -650, -122, -650, 683, -650, + -129, -128, -324, 683, -650, -129, -128, 319, -650, -324, + -324, -324, -650, 314, -124, -324, -324, -107, -324, -124, + -768, -116, -118, -129, -126, -125, -324, -123, 642, -126, + -125, 644, -123, 683, -93, 319, 114, 115, -324, -324, + 630, -324, -324, -324, -324, -324, 240, 685, 684, 681, + 134, 247, 795, 227, 99, 133, -754, 112, 113, 685, + 684, 240, 100, 525, 685, 684, 681, 841, 899, -324, + -324, -324, -324, -324, -324, -324, -324, -324, -324, -324, + -324, -324, -324, 660, 1116, -324, -324, -324, 683, 726, + -324, 876, -127, -324, 685, 684, -324, -127, 962, -128, + 244, -324, -780, -324, 230, -324, -324, -324, -324, -324, + -324, -324, 1109, -324, 1116, -324, 522, -780, 517, 307, + 514, 513, 512, 522, 515, 234, 795, 525, -324, -324, + 526, -118, 233, -324, 525, 114, 115, 525, -757, 371, + -324, 231, -120, 963, -324, -757, -757, -757, -127, 685, + 684, -757, -757, 522, -757, 372, 520, -124, 901, -129, + 533, 532, -757, -757, 525, 530, 529, 533, 532, -361, + 1033, 247, 660, 683, -757, -757, -361, -757, -757, -757, + -757, -757, 453, 425, 234, -361, 1109, 455, 454, 235, + 974, 545, 683, 247, 526, 970, 579, 533, 532, 971, + 546, 526, -126, 580, 526, -757, -757, -757, -757, -757, + -757, -757, -757, -757, -757, -757, -757, -757, -757, 720, + -647, -757, -757, -757, 667, 727, -757, -647, 1003, -757, + 683, 526, -757, -361, 685, 684, 681, -757, 721, -757, + 428, -757, -757, -757, -757, -757, -757, -757, 235, -757, + -757, -757, 134, 685, 684, 686, 517, 133, 514, 513, + 512, 522, 515, -659, -757, -757, -661, -116, 134, -757, + -659, 683, 525, 133, -757, 683, -757, 431, -124, -659, + -757, -757, -757, -757, -125, 434, -757, -757, -757, 932, + -757, 685, 684, 691, 520, 933, 1088, -126, -757, -757, + -757, -757, -757, 530, 529, 533, 532, 916, -112, 451, + -757, -757, -660, -757, -757, -757, -757, -757, 134, -660, + 456, 134, -650, 133, 234, -121, 133, -659, -660, -650, + -662, 622, 685, 684, 696, 497, 685, 684, 703, 526, + 620, -757, -757, -757, -757, -757, -757, -757, -757, -757, + -757, -757, -757, -757, -757, -123, -657, -757, -757, -757, + -656, 964, -757, -657, -668, -757, -123, -656, -757, -757, + 667, -757, -113, -757, 1003, -757, -660, -757, -757, -757, + -757, -757, -757, -757, -658, -757, -757, -757, 235, -122, + 642, -658, 517, 644, 514, 513, 512, 522, 515, -315, + -757, -757, -757, -757, -655, -757, -315, -757, 525, 536, + -324, -655, -757, 547, 630, -315, -757, -324, -324, -324, + -125, 549, -324, -324, -324, -652, -324, 550, 234, 246, + 520, 587, -652, 599, -324, 632, -324, -324, -324, 530, + 529, 533, 532, 602, 546, 604, -324, -324, 234, -324, + -324, -324, -324, -324, 134, 664, -119, -92, 234, 133, + 234, 720, -653, -315, 662, 670, 721, 714, 916, -653, + 228, 229, 247, -128, 672, 526, 712, -324, -324, -324, + -324, -324, -324, -324, -324, -324, -324, -324, -324, -324, + -324, 615, 235, -324, -324, -324, 616, 965, -324, 288, + 289, -324, 623, -115, -324, -324, 324, -324, -117, -324, + -114, -324, 235, -324, -324, -324, -324, -324, -324, -324, + -124, -324, 235, -324, 235, -126, 517, -123, 514, 513, + 512, 522, 515, -325, 287, 286, -324, -324, -324, -324, + -325, -324, 525, -324, -654, 247, -324, 642, -324, -325, + 644, -654, -324, -324, -324, -324, -127, 240, 968, -324, + -324, 1182, -324, 247, 520, 517, 1253, 514, 513, 512, + -324, 515, 228, 229, -325, 533, 532, 533, 532, 993, + 994, -325, -324, -324, -324, -324, -324, -324, -324, -324, + -325, -324, -324, 240, 234, 314, -754, -325, 627, -324, + -324, 1221, 633, 751, -754, 1029, 1033, 271, -324, 526, + 1219, 271, 755, -324, -324, -324, -324, -324, -324, -324, + -324, -324, -324, -324, -324, -324, -324, 1204, 1205, -324, + -324, -324, 247, 726, -324, 1029, 1033, -324, -325, 268, + -324, 247, 660, 270, 269, -324, 444, -324, -324, -324, + -324, -324, -324, -324, -324, -324, -324, -324, 235, -324, + 665, 666, 517, 234, 514, 513, 512, 522, 515, 234, + 1245, 674, -324, -324, 690, -324, 1245, -324, 525, 672, + 694, 697, -757, 700, -324, 672, 707, 708, -324, -757, + -757, -757, -127, -297, 710, -757, -757, 711, -757, 517, + 520, 514, 513, 512, 715, 515, -757, -757, 247, 530, + 529, 533, 532, 718, 122, 121, 123, 124, -757, -757, + 719, -757, -757, -757, -757, -757, 314, 235, 733, 736, + 126, 125, 127, 235, 247, 738, 997, 751, 1001, 1000, + 741, 742, 1002, 112, 113, 526, 755, 744, 368, -757, + -757, -757, -757, -757, -757, -757, -757, -757, -757, -757, + -757, -757, -757, 746, -405, -757, -757, -757, 760, 727, + -757, 761, 736, -757, 999, 767, -757, 773, 774, 271, + 271, -757, 271, -757, 271, -757, -757, -757, -757, -757, + -757, -757, 823, -757, -757, -757, 247, 109, 99, 101, + 102, 103, 105, 829, 271, 247, 100, 110, -757, -757, + 247, -757, 451, -757, 93, 247, -107, 97, 104, 106, + -757, 114, 115, 845, -757, 247, 636, 856, -125, 8, + 89, 90, 91, 12, 82, 736, 268, 247, 83, 84, + 270, 269, -750, 87, -751, 85, 86, 88, 36, 37, + 80, 81, 137, 138, 139, 140, 141, 92, 34, 33, + 122, 121, 123, 124, 863, 517, 24, 514, 513, 512, + 864, 515, 11, 54, 10, 13, 126, 125, 127, 116, + 65, 118, 117, 119, 604, 120, 128, 129, 867, 112, + 113, 736, 50, 51, 49, -647, 736, -650, 736, 902, + 903, 904, -647, 751, -650, -298, 587, -750, 587, -751, + 928, -647, 755, -650, 46, 953, 956, 39, 271, 957, + 67, 68, 247, 960, 69, 247, 41, 969, 986, -750, + 53, -751, 987, 988, 281, 282, 1055, 1056, 25, 1005, + 1057, 128, 129, 109, 99, 101, 102, 103, 105, 307, + 268, 1017, 100, 110, 270, 269, 266, 267, 1019, -647, + 93, -650, 602, 97, 104, 106, 604, 114, 115, 856, + 247, 47, 48, 343, 89, 90, 91, 12, 82, 314, + 314, 856, 83, 84, 271, 1033, -757, 87, 736, 85, + 86, 88, 36, 37, 80, 81, 137, 138, 139, 140, + 141, 92, 34, 33, 122, 121, 123, 124, 736, 247, + 24, 271, 247, 736, 247, -299, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, 247, 120, + 128, 129, 1064, 112, 113, -297, 50, 51, 49, -757, + 271, 1070, 741, 268, 759, 1073, -757, 270, 269, 266, + 267, -753, 1075, 1077, 1079, -757, 1079, 247, 46, 815, + 1093, 347, 247, 247, 67, 68, 1107, 1110, 69, 968, + 41, 1135, 268, -757, 53, 247, 270, 269, 266, 267, + 856, 736, 25, 736, 736, 736, 1153, 109, 99, 101, + 102, 103, 105, 247, 1155, -300, 100, 110, 137, 138, + 139, 140, 141, -757, 93, 1168, 1169, 97, 104, 106, + 1170, 114, 115, 1171, 1172, 47, 48, 343, 89, 90, + 91, 12, 82, 1173, 247, 247, 83, 84, 247, 968, + 1177, 87, 247, 85, 86, 88, 36, 37, 80, 81, + 263, 1183, 247, 1185, 741, 92, 34, 33, 122, 121, + 123, 124, 1188, 517, 24, 514, 513, 512, 1192, 515, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, 1194, 120, 128, 129, 1196, 112, 113, 247, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, 284, 279, 280, -405, 264, 265, 1211, 1212, 281, + 282, 932, 46, 1222, 262, 39, 1223, 1079, 67, 68, + 1079, 1079, 69, 1230, 41, 268, 1243, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, 1246, 736, + 733, 109, 99, 101, 102, 103, 105, 1169, 1261, 1261, + 100, 110, 741, 285, 1264, 1266, 1268, 1270, 93, 1270, + 247, 97, 104, 106, 1079, 114, 115, 1261, -754, 47, + 48, 343, 89, 90, 91, 12, 82, -753, 1287, 1270, + 83, 84, 1270, 1270, 1270, 87, nil, 85, 86, 88, + 36, 37, 80, 81, 137, 138, 139, 140, 141, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, 716, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, 275, 276, + 277, 278, 288, 289, 283, 284, 279, 280, nil, 264, + 265, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, 285, nil, -269, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, 716, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, 275, 276, 277, 278, 288, 289, 283, 284, + 279, 280, nil, 264, 265, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, 285, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, 929, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, 275, 276, 277, 278, + 288, 289, 283, 284, 279, 280, nil, 264, 265, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, 285, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 343, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, 961, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + 275, 276, 277, 278, 288, 289, 283, 284, 279, 280, + nil, 264, 265, nil, nil, 281, 282, nil, 46, nil, + nil, 347, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, 285, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, 1215, 24, 514, 513, 512, nil, 515, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, 284, 279, 280, nil, 264, 265, nil, nil, 281, + 282, nil, 46, nil, nil, 347, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, 285, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, 1215, 24, 514, + 513, 512, nil, 515, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, 275, 276, + 277, 278, 288, 289, 283, 284, 279, 280, nil, 264, + 265, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, 247, 285, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, 275, 276, 277, 278, 288, 289, 283, 284, + 279, 280, nil, 264, 265, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, 285, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, 275, 276, 277, 278, + 288, 289, 283, 284, 279, 280, nil, 264, 265, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, 285, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 8, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, 11, 54, 10, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + 275, 276, 277, 278, 288, 289, 283, 284, 279, 280, + nil, 264, 265, nil, nil, 281, 282, nil, 46, nil, + nil, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, 285, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 24, nil, nil, nil, nil, nil, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, 284, 279, 280, nil, 264, 265, nil, nil, 281, + 282, nil, 46, nil, nil, 39, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, 285, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, 275, 276, + 277, 278, 288, 289, 283, 284, 279, 280, nil, 264, + 265, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, 285, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, 275, 276, 277, 278, 288, 289, 283, 284, + 279, 280, nil, 264, 265, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, 285, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, 275, 276, 277, 278, + 288, 289, 283, 284, 279, 280, nil, 264, 265, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, 285, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 343, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + 275, 276, 277, 278, 288, 289, 283, 284, 279, 280, + nil, -781, -781, nil, nil, 281, 282, nil, 46, nil, + nil, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 24, nil, nil, nil, nil, nil, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, 284, 279, 280, nil, -781, -781, nil, nil, 281, + 282, nil, 46, nil, nil, 39, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, 275, 276, + 277, 278, 288, 289, 283, 284, 279, 280, nil, -781, + -781, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, 275, 276, 277, 278, 288, 289, 283, 284, + 279, 280, nil, -781, -781, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, 517, 24, 514, 513, 512, + nil, 515, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, -781, -781, -781, -781, + 288, 289, nil, 751, -781, -781, nil, nil, nil, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 343, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, 517, + 24, 514, 513, 512, nil, 515, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + -781, -781, -781, -781, 288, 289, nil, 751, -781, -781, + nil, nil, nil, nil, nil, 281, 282, nil, 46, nil, + nil, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, 517, 24, 514, 513, 512, nil, 515, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, -781, -781, -781, -781, 288, 289, + nil, 751, -781, -781, nil, nil, nil, nil, nil, 281, + 282, nil, 46, nil, nil, 39, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, -781, -781, + -781, -781, 288, 289, nil, nil, -781, -781, nil, nil, + nil, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, -781, -781, -781, -781, 288, 289, nil, nil, + -781, -781, nil, nil, nil, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, -781, -781, -781, -781, + 288, 289, nil, nil, -781, -781, nil, nil, nil, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 343, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + 275, 276, 277, 278, 288, 289, nil, nil, 279, 280, + nil, nil, nil, nil, nil, 281, 282, nil, 46, nil, + nil, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 24, nil, nil, nil, nil, nil, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, nil, 279, 280, nil, nil, nil, nil, nil, 281, + 282, nil, 46, nil, nil, 39, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, nil, nil, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, nil, nil, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, 12, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 24, nil, nil, nil, nil, + nil, 11, 54, 10, 13, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, 271, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 281, 282, nil, 46, nil, nil, 39, nil, nil, 67, + 68, nil, nil, 69, nil, 41, 268, nil, 274, 53, + 270, 269, 266, 267, nil, nil, nil, 25, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 281, 282, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, 268, + nil, 274, 53, 270, 269, 266, 267, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, -459, 114, + 115, nil, nil, 47, 48, -459, -459, -459, nil, nil, + -459, -459, -459, 517, -459, 514, 513, 512, 522, 515, + nil, nil, -459, -459, -459, -459, nil, nil, nil, 525, + nil, nil, nil, nil, -459, -459, nil, -459, -459, -459, + -459, -459, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 520, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 533, 532, nil, -459, -459, -459, -459, -459, + -459, -459, -459, -459, -459, -459, -459, -459, -459, nil, + nil, -459, -459, -459, nil, nil, -459, nil, 314, -459, + nil, nil, -459, -459, nil, -459, 526, -459, nil, -459, + nil, -459, -459, -459, -459, -459, -459, -459, nil, -459, + -459, -459, 517, nil, 514, 513, 512, 522, 515, nil, + nil, nil, nil, nil, -459, -459, nil, -459, 525, -459, + -332, nil, nil, nil, nil, nil, -459, -332, -332, -332, + -459, nil, -332, -332, -332, nil, -332, nil, nil, nil, + 520, nil, nil, nil, -332, nil, -332, -332, nil, nil, + nil, 533, 532, nil, nil, nil, -332, -332, nil, -332, + -332, -332, -332, -332, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 526, nil, -332, -332, -332, + -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, + -332, nil, nil, -332, -332, -332, nil, nil, -332, nil, + 324, -332, nil, nil, -332, -332, nil, -332, nil, -332, + nil, -332, nil, -332, -332, -332, -332, -332, -332, -332, + nil, -332, nil, -332, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, -332, -332, nil, -332, + nil, -332, 89, 90, 91, nil, 82, nil, -332, nil, + 83, 84, -332, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, 336, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, 333, nil, + 331, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 334, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, 337, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 336, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 333, nil, 331, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 334, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 337, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 336, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, 333, nil, 331, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 334, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 337, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, -316, + 114, 115, nil, nil, 47, 48, -316, -316, -316, nil, + nil, -316, -316, -316, 517, -316, 514, 513, 512, 522, + 515, nil, nil, -316, nil, -316, -316, -316, nil, nil, + 525, 122, 121, 123, 124, -316, -316, nil, -316, -316, + -316, -316, -316, nil, nil, nil, nil, 126, 125, 127, + nil, nil, 520, nil, nil, nil, nil, nil, nil, nil, + 112, 113, nil, 533, 532, 368, -316, -316, -316, -316, + -316, -316, -316, -316, -316, -316, -316, -316, -316, -316, + nil, nil, -316, -316, -316, nil, nil, -316, nil, nil, + -316, nil, nil, -316, -316, nil, -316, 526, -316, nil, + -316, nil, -316, -316, -316, -316, -316, -316, -316, nil, + -316, nil, -316, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, -316, -316, -316, -316, nil, + -316, 93, -316, nil, 97, 104, 106, -316, 114, 115, + -780, -316, 89, 90, 91, 12, 82, -780, -780, -780, + 83, 84, -780, -780, -780, 87, -780, 85, 86, 88, + 36, 37, 80, 81, -780, -780, -780, -780, nil, 92, + 34, 33, 122, 121, 123, 124, -780, -780, 24, -780, + -780, -780, -780, -780, 11, 54, nil, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, -780, -780, -780, + -780, -780, -780, -780, -780, -780, -780, -780, -780, -780, + -780, nil, nil, -780, -780, -780, 46, nil, -780, 39, + 314, -780, 67, 68, -780, -780, 69, -780, 41, -780, + nil, -780, 53, -780, -780, -780, -780, -780, -780, -780, + 25, -780, -780, -780, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, -780, -780, nil, -780, + nil, -780, 93, nil, nil, 97, 104, 106, -780, 114, + 115, nil, -780, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 336, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 333, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 334, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 337, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 24, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 25, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 36, + 37, 80, 81, nil, nil, nil, nil, nil, 92, 34, + 33, 122, 121, 123, 124, nil, nil, 24, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 25, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 25, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, 134, nil, + nil, nil, nil, 133, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + 12, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 24, nil, nil, nil, nil, nil, 11, + 54, 10, 13, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 46, nil, nil, 39, nil, nil, 67, 68, nil, + nil, 69, nil, 41, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, 444, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 25, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 24, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 25, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 24, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 25, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, nil, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 25, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 461, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, 461, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 36, + 37, 80, 81, nil, nil, nil, nil, nil, 92, 34, + 33, 122, 121, 123, 124, nil, nil, 24, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 25, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 25, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 336, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, 333, nil, 331, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 334, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 337, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 25, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 24, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 25, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, 247, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 336, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + 333, nil, 331, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 334, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 337, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 589, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 336, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, 333, nil, 331, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 334, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 337, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 336, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, 333, nil, 331, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 334, 101, 102, 103, 105, nil, + nil, nil, 100, 110, 247, nil, nil, nil, nil, nil, + 93, nil, 337, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, 12, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 24, nil, nil, nil, nil, nil, 11, 54, nil, + 13, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 46, + nil, nil, 39, nil, nil, 67, 68, nil, nil, 69, + nil, 41, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 25, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, 636, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 336, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 334, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 337, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 24, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 25, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, -758, + 114, 115, nil, nil, 47, 48, -758, -758, -758, nil, + nil, -758, -758, -758, 517, -758, 514, 513, 512, 522, + 515, nil, nil, -758, -758, -758, -758, -758, nil, nil, + 525, nil, nil, nil, nil, -758, -758, nil, -758, -758, + -758, -758, -758, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 520, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 533, 532, nil, -758, -758, -758, -758, + -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, + nil, nil, -758, -758, -758, nil, nil, -758, nil, nil, + -758, nil, nil, -758, -758, nil, -758, 526, -758, nil, + -758, nil, -758, -758, -758, -758, -758, -758, -758, nil, + -758, -758, -758, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, -758, -758, -758, -758, nil, + -758, -759, -758, nil, nil, nil, nil, -758, -759, -759, + -759, -758, nil, -759, -759, -759, nil, -759, nil, nil, + nil, nil, nil, nil, nil, -759, -759, -759, -759, -759, + nil, nil, nil, nil, nil, nil, nil, -759, -759, nil, + -759, -759, -759, -759, -759, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, nil, nil, -759, -759, -759, nil, nil, -759, + nil, nil, -759, nil, nil, -759, -759, nil, -759, nil, + -759, nil, -759, nil, -759, -759, -759, -759, -759, -759, + -759, nil, -759, -759, -759, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, -759, -759, -759, + -759, nil, -759, nil, -759, nil, 89, 90, 91, -759, + 82, nil, nil, -759, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 336, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 333, nil, 331, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 334, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 337, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 24, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, -780, 114, 115, nil, nil, 47, 48, + -780, -780, -780, nil, nil, -780, -780, -780, nil, -780, + 122, 121, 123, 124, nil, nil, nil, -780, -780, -780, + nil, nil, nil, nil, nil, nil, 126, 125, 127, -780, + -780, nil, -780, -780, -780, -780, -780, nil, nil, 112, + 113, nil, nil, nil, 368, nil, nil, nil, nil, nil, + 517, nil, 514, 513, 512, 522, 515, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 525, nil, nil, nil, + nil, -780, nil, nil, nil, nil, nil, nil, -780, nil, + nil, nil, nil, 314, -780, nil, nil, nil, 520, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, 533, + 532, nil, 100, 110, nil, -780, -780, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, -780, + nil, 89, 90, 91, -780, 82, nil, nil, nil, 83, + 84, -780, nil, 526, 87, -780, 85, 86, 88, 364, + 365, 80, 81, 511, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 336, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + 838, nil, 331, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 334, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 337, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 336, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, 331, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 334, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 337, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, 12, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 24, + nil, nil, nil, nil, nil, 11, 54, 345, 13, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 46, nil, nil, + 39, nil, nil, 67, 68, nil, nil, 69, nil, 41, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, 444, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + 336, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, 333, nil, 331, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 334, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, 337, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 24, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 25, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 336, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, 838, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 334, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 337, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, 336, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 334, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, 337, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + 879, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 336, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, 333, nil, 331, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 334, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 337, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 336, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, 333, nil, 331, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 334, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 337, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, 12, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 24, + nil, nil, nil, nil, nil, 11, 54, nil, 13, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 46, nil, nil, + 39, nil, nil, 67, 68, nil, nil, 69, nil, 41, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, 908, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, 336, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, 333, nil, + 331, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 334, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, 337, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, 12, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 24, nil, nil, nil, nil, nil, 11, 54, nil, + 13, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 46, + nil, nil, 39, nil, nil, 67, 68, nil, nil, 69, + nil, 41, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 25, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, 336, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, 838, nil, 331, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 334, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, 337, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 336, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, 331, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 334, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 337, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, 461, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, 336, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, 838, nil, 331, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 334, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, 337, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 589, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 24, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 25, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 25, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 1145, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 336, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, 331, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 334, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 337, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 24, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 25, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, 336, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, 333, + nil, 331, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 334, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, 337, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 360, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, nil, nil, + 368, nil, nil, nil, nil, nil, 517, nil, 514, 513, + 512, 522, 515, nil, nil, nil, nil, nil, nil, nil, + 356, nil, 525, 352, nil, nil, 67, 68, nil, nil, + 69, nil, 351, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 520, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, 533, 532, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, 526, + 85, 86, 88, 364, 365, 80, 81, nil, nil, 511, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 360, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, nil, nil, 368, + nil, nil, nil, nil, nil, 517, nil, 514, 513, 512, + 522, 515, nil, nil, nil, nil, nil, nil, nil, 356, + nil, 525, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 520, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, 533, 532, nil, 100, 110, nil, + nil, nil, 370, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, 526, 85, + 86, 88, 364, 365, 80, 81, nil, nil, 511, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 360, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, nil, nil, 368, nil, + nil, nil, nil, nil, 517, nil, 514, 513, 512, 522, + 515, nil, nil, nil, nil, nil, nil, nil, 403, nil, + 525, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 520, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, 533, 532, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, 526, 85, 86, + 88, 364, 365, 80, 81, nil, nil, 511, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 360, nil, nil, 126, + 125, 127, 408, 65, 118, 117, 409, nil, 120, 128, + 129, nil, 112, 113, nil, nil, nil, 368, nil, nil, + nil, nil, nil, 517, nil, 514, 513, 512, 522, 515, + nil, nil, nil, nil, 415, nil, nil, 410, nil, 525, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 520, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, 533, 532, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, 526, 85, 86, 88, + 364, 365, 80, 81, nil, nil, 511, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 360, nil, nil, 126, 125, + 127, 408, 65, 118, 117, 409, nil, 120, 128, 129, + nil, 112, 113, nil, nil, nil, 368, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 410, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 360, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, nil, nil, 368, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 356, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, 618, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 360, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, nil, nil, 368, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 356, nil, nil, 352, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 360, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, nil, nil, 368, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 356, nil, nil, 352, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 360, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + nil, nil, 368, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 356, nil, nil, 352, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 360, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, nil, + nil, 368, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 356, nil, nil, 352, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 360, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, nil, nil, + 368, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 356, nil, nil, 352, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 360, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, nil, nil, 368, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1161, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 360, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, nil, nil, 368, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1200, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 360, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, nil, nil, 368, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1200, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, 192, 203, 193, 216, 189, 209, 199, 198, + 219, 220, 214, 197, 196, 191, 217, 221, 222, 201, + 190, 204, 208, 210, 202, 195, nil, nil, nil, 211, + 218, 213, 212, 205, 215, 200, 188, 207, 206, nil, + nil, nil, nil, nil, 187, 194, 185, 186, 182, 183, + 184, 145, 147, 144, nil, 146, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, nil, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, 109, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 110, nil, nil, nil, nil, + nil, nil, nil, nil, 174, 192, 203, 193, 216, 189, + 209, 199, 198, 219, 220, 214, 197, 196, 191, 217, + 221, 222, 201, 190, 204, 208, 210, 202, 195, nil, + nil, nil, 211, 218, 213, 212, 205, 215, 200, 188, + 207, 206, nil, nil, nil, nil, nil, 187, 194, 185, + 186, 182, 183, 184, 145, 147, nil, nil, 146, nil, + nil, nil, nil, nil, nil, nil, nil, 177, 178, nil, + 173, 155, 156, 157, 164, 161, 163, nil, nil, 158, + 159, nil, nil, nil, 179, 180, 165, 166, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 169, nil, 154, 176, 172, 171, 167, 168, + 162, 160, 152, 175, 153, nil, nil, 181, 109, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 110, nil, + nil, nil, nil, nil, nil, nil, nil, 174, 192, 203, + 193, 216, 189, 209, 199, 198, 219, 220, 214, 197, + 196, 191, 217, 221, 222, 201, 190, 204, 208, 210, + 202, 195, nil, nil, nil, 211, 218, 213, 301, 300, + 302, 299, 188, 207, 206, nil, nil, nil, nil, nil, + 187, 194, 185, 186, 296, 297, 298, 294, 147, 118, + 117, 295, nil, 120, nil, nil, nil, nil, nil, nil, + 177, 178, nil, 173, 155, 156, 157, 164, 161, 163, + nil, nil, 158, 159, nil, nil, nil, 179, 180, 165, + 166, nil, nil, nil, nil, nil, 306, nil, nil, nil, + nil, nil, nil, nil, 170, 169, nil, 154, 176, 172, + 171, 167, 168, 162, 160, 152, 175, 153, nil, nil, + 181, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 174, 192, 203, 193, 216, 189, 209, 199, 198, 219, + 220, 214, 197, 196, 191, 217, 221, 222, 201, 190, + 204, 208, 210, 202, 195, nil, nil, nil, 211, 218, + 213, 212, 205, 215, 200, 188, 207, 206, nil, nil, + nil, nil, nil, 187, 194, 185, 186, 182, 183, 184, + 145, 147, 441, 440, 146, nil, 442, nil, nil, nil, + nil, nil, nil, 177, 178, nil, 173, 155, 156, 157, + 164, 161, 163, nil, nil, 158, 159, nil, nil, nil, + 179, 180, 165, 166, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 170, 169, nil, + 154, 176, 172, 171, 167, 168, 162, 160, 152, 175, + 153, nil, nil, 181, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 174, 192, 203, 193, 216, 189, 209, + 199, 198, 219, 220, 214, 197, 196, 191, 217, 221, + 222, 201, 190, 204, 208, 210, 202, 195, nil, nil, + nil, 211, 218, 213, 212, 205, 215, 200, 188, 207, + 206, nil, nil, nil, nil, nil, 187, 194, 185, 186, + 182, 183, 184, 145, 147, nil, nil, 146, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, nil, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, nil, 181, 109, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 110, nil, nil, + nil, nil, nil, nil, nil, nil, 174, 192, 203, 193, + 216, 189, 209, 199, 198, 219, 220, 214, 197, 196, + 191, 217, 221, 222, 201, 190, 204, 208, 210, 202, + 195, nil, nil, nil, 211, 218, 213, 212, 205, 215, + 200, 188, 207, 206, nil, nil, nil, nil, nil, 187, + 194, 185, 186, 182, 183, 184, 145, 147, nil, nil, + 146, nil, nil, nil, nil, nil, nil, nil, nil, 177, + 178, nil, 173, 155, 156, 157, 164, 161, 163, nil, + nil, 158, 159, nil, nil, nil, 179, 180, 165, 166, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 170, 169, nil, 154, 176, 172, 171, + 167, 168, 162, 160, 152, 175, 153, nil, nil, 181, + 109, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 110, nil, nil, nil, nil, nil, nil, nil, nil, 174, + 192, 203, 193, 216, 189, 209, 199, 198, 219, 220, + 214, 197, 196, 191, 217, 221, 222, 201, 190, 204, + 208, 210, 202, 195, nil, nil, nil, 211, 218, 213, + 212, 205, 215, 200, 188, 207, 206, nil, nil, nil, + nil, nil, 187, 194, 185, 186, 182, 183, 184, 145, + 147, nil, nil, 146, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, nil, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, nil, nil, nil, nil, 122, 121, 123, + 124, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 174, 126, 125, 127, 815, nil, nil, nil, + 818, 795, nil, nil, nil, nil, 112, 113, nil, nil, + nil, 368, 525, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 817, nil, nil, 788, nil, nil, nil, 786, nil, + nil, 787, nil, 790, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 816, nil, nil, nil, + 109, 796, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 526, + 97, 104, 106, nil, 114, 115, nil, nil, 803, 804, + 122, 121, 123, 124, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 126, 125, 127, 815, + nil, nil, nil, 818, 795, nil, nil, nil, nil, 112, + 113, nil, nil, nil, 368, 525, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 817, nil, nil, 788, nil, nil, + nil, 786, nil, nil, 787, nil, 790, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 816, + nil, nil, nil, 109, 796, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 526, 97, 104, 106, nil, 114, 115, nil, + nil, 803, 804, 122, 121, 123, 124, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 126, + 125, 127, 815, nil, nil, nil, 818, nil, nil, nil, + nil, nil, 112, 113, nil, nil, nil, 368, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 817, nil, nil, + 788, nil, nil, nil, 786, nil, nil, 787, nil, 790, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 816, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, 247, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 803, 804, 122, 121, 123, 124, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 126, 125, 127, 815, nil, nil, nil, 818, + nil, nil, nil, nil, nil, 112, 113, nil, nil, nil, + 368, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 817, nil, nil, 788, nil, nil, nil, 786, nil, nil, + 787, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 816, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 803, 804, 122, + 121, 123, 124, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 126, 125, 127, 815, nil, + nil, nil, 818, nil, nil, nil, nil, nil, 112, 113, + nil, nil, nil, 368, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 817, nil, nil, 788, nil, nil, nil, + 786, nil, nil, 787, nil, 790, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 816, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 803, 804, 122, 121, 123, 124, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 126, 125, + 127, 815, nil, nil, nil, 818, nil, nil, nil, nil, + nil, 112, 113, nil, nil, nil, 368, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 817, nil, nil, 788, + nil, nil, nil, 786, nil, nil, 787, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 816, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 803, 804, 122, 121, 123, 124, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 126, 125, 127, 815, nil, nil, nil, 818, 795, + nil, nil, nil, nil, 112, 113, nil, nil, nil, 368, + 525, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 817, + nil, nil, 788, nil, nil, nil, 786, nil, nil, 787, + nil, 790, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 816, nil, nil, nil, 109, 796, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 526, 97, 104, + 106, nil, 114, 115, nil, nil, 803, 804, 122, 121, + 123, 124, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 126, 125, 127, 815, nil, nil, + nil, 818, 795, nil, nil, nil, nil, 112, 113, nil, + nil, nil, 368, 525, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 817, nil, nil, 788, nil, nil, nil, 786, + nil, nil, 787, nil, 790, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 816, nil, nil, + nil, 109, 796, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 526, 97, 104, 106, nil, 114, 115, nil, nil, 803, + 804, 122, 121, 123, 124, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 126, 125, 127, + 815, nil, nil, nil, 818, nil, nil, nil, nil, nil, + 112, 113, nil, nil, nil, 368, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 817, nil, nil, 788, nil, + nil, nil, 786, nil, nil, 787, nil, 1106, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 816, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 803, 804, 122, 121, 123, 124, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 126, 125, 127, 815, nil, nil, nil, 818, nil, nil, + nil, nil, nil, 112, 113, nil, nil, nil, 368, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 817, nil, + nil, 788, nil, nil, nil, 786, nil, nil, 787, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 816, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 803, 804, 122, 121, 123, + 124, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 126, 125, 127, 815, nil, nil, nil, + 818, nil, nil, nil, nil, nil, 112, 113, nil, nil, + nil, 368, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 817, nil, nil, 788, nil, nil, nil, 786, nil, + nil, 787, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 816, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 803, 804, + 122, 121, 123, 124, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 126, 125, 127, 815, + nil, nil, nil, 818, 795, nil, nil, nil, nil, 112, + 113, nil, nil, nil, 368, 525, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 817, nil, nil, 788, nil, nil, + nil, 786, nil, nil, 787, nil, 790, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 816, + nil, nil, nil, 109, 796, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 526, 97, 104, 106, nil, 114, 115, nil, + nil, 803, 804, 122, 121, 123, 124, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 126, + 125, 127, 815, nil, nil, nil, 818, nil, nil, nil, + nil, nil, 112, 113, nil, nil, nil, 368, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 817, nil, nil, + 788, nil, nil, nil, 786, nil, nil, 787, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 816, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 803, 804, 122, 121, 123, 124, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 126, 125, 127, 815, nil, nil, nil, 818, + nil, nil, nil, nil, nil, 112, 113, nil, nil, nil, + 368, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 817, nil, nil, 788, nil, nil, nil, 786, nil, nil, + 787, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 816, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 803, 804, 122, + 121, 123, 124, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 126, 125, 127, 815, nil, + nil, nil, 818, nil, nil, nil, nil, nil, 112, 113, + nil, nil, nil, 368, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 817, nil, nil, 788, nil, nil, nil, + 786, nil, nil, 787, nil, 790, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 816, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 803, 804, 122, 121, 123, 124, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 126, 125, + 127, 815, nil, nil, nil, 818, nil, nil, nil, nil, + nil, 112, 113, nil, nil, nil, 368, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 817, nil, nil, 788, + nil, nil, nil, 786, nil, nil, 787, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 816, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 803, 804, 122, 121, 123, 124, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 126, 125, 127, 815, nil, nil, nil, 818, nil, + nil, nil, nil, nil, 112, 113, nil, nil, nil, 368, + nil, nil, nil, nil, nil, nil, nil, 122, 121, 123, + 124, nil, nil, nil, nil, nil, nil, nil, nil, 817, + nil, nil, 788, 126, 125, 127, 786, nil, nil, 787, + nil, nil, nil, nil, nil, nil, 112, 113, nil, nil, + nil, 368, nil, nil, 816, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 803, 804, nil, nil, + 517, nil, 514, 513, 512, 522, 515, nil, nil, nil, + 109, 99, 101, 102, 103, 105, 525, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, 517, 520, 514, + 513, 512, 522, 515, nil, nil, nil, 530, 529, 533, + 532, nil, 517, 525, 514, 513, 512, 522, 515, nil, + 517, nil, 514, 513, 512, 522, 515, nil, 525, nil, + nil, nil, nil, nil, nil, 520, 525, nil, nil, nil, + nil, nil, nil, 526, 530, 529, 533, 532, nil, nil, + 520, 679, nil, 511, nil, nil, nil, nil, 520, 530, + 529, 533, 532, nil, nil, nil, nil, 530, 529, 533, + 532, 517, nil, 514, 513, 512, 522, 515, nil, nil, + 526, nil, nil, nil, nil, nil, nil, 525, nil, nil, + 511, nil, nil, nil, 517, 526, 514, 513, 512, 522, + 515, nil, nil, 526, nil, 511, nil, nil, nil, 520, + 525, nil, nil, 511, nil, nil, nil, nil, 530, 529, + 533, 532, 517, nil, 514, 513, 512, 522, 515, nil, + nil, nil, 520, nil, nil, nil, nil, nil, 525, nil, + nil, 530, 529, 533, 532, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 526, nil, nil, nil, nil, nil, + 520, nil, nil, nil, 511, nil, nil, nil, nil, 530, + 529, 533, 532, nil, nil, nil, nil, 526, 484, 488, + nil, nil, 485, nil, nil, nil, nil, 511, nil, nil, + nil, 177, 178, nil, 173, 155, 156, 157, 164, 161, + 163, nil, nil, 158, 159, 526, nil, nil, 179, 180, + 165, 166, nil, nil, nil, 511, nil, 314, nil, nil, + nil, nil, nil, nil, nil, 170, 169, nil, 154, 176, + 172, 171, 167, 168, 162, 160, 152, 175, 153, nil, + nil, 181, nil, nil, nil, nil, 491, 495, nil, nil, + 490, nil, nil, nil, nil, nil, nil, nil, nil, 177, + 178, 174, 173, 155, 156, 157, 164, 161, 163, nil, + nil, 158, 159, nil, nil, nil, 179, 180, 165, 166, + nil, nil, nil, nil, nil, 314, nil, nil, nil, nil, + nil, nil, nil, 170, 169, nil, 154, 176, 172, 171, + 167, 168, 162, 160, 152, 175, 153, nil, nil, 181, + nil, nil, nil, nil, 585, 488, nil, nil, 586, nil, + nil, nil, nil, nil, nil, nil, nil, 177, 178, 174, + 173, 155, 156, 157, 164, 161, 163, nil, nil, 158, + 159, nil, nil, nil, 179, 180, 165, 166, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 169, nil, 154, 176, 172, 171, 167, 168, + 162, 160, 152, 175, 153, nil, nil, 181, nil, nil, + nil, nil, 768, 488, nil, nil, 769, nil, nil, nil, + nil, nil, nil, nil, nil, 177, 178, 174, 173, 155, + 156, 157, 164, 161, 163, nil, nil, 158, 159, nil, + nil, nil, 179, 180, 165, 166, nil, nil, nil, nil, + nil, 314, nil, nil, nil, nil, nil, nil, nil, 170, + 169, nil, 154, 176, 172, 171, 167, 168, 162, 160, + 152, 175, 153, nil, nil, 181, nil, nil, nil, nil, + 770, 495, nil, nil, 771, nil, nil, nil, nil, nil, + nil, nil, nil, 177, 178, 174, 173, 155, 156, 157, + 164, 161, 163, nil, nil, 158, 159, nil, nil, nil, + 179, 180, 165, 166, nil, nil, nil, nil, nil, 314, + nil, nil, nil, nil, nil, nil, nil, 170, 169, nil, + 154, 176, 172, 171, 167, 168, 162, 160, 152, 175, + 153, nil, nil, 181, nil, nil, nil, nil, 849, 488, + nil, nil, 850, nil, nil, nil, nil, nil, nil, nil, + nil, 177, 178, 174, 173, 155, 156, 157, 164, 161, + 163, nil, nil, 158, 159, nil, nil, nil, 179, 180, + 165, 166, nil, nil, nil, nil, nil, 314, nil, nil, + nil, nil, nil, nil, nil, 170, 169, nil, 154, 176, + 172, 171, 167, 168, 162, 160, 152, 175, 153, nil, + nil, 181, nil, nil, nil, nil, 852, 495, nil, nil, + 853, nil, nil, nil, nil, nil, nil, nil, nil, 177, + 178, 174, 173, 155, 156, 157, 164, 161, 163, nil, + nil, 158, 159, nil, nil, nil, 179, 180, 165, 166, + nil, nil, nil, nil, nil, 314, nil, nil, nil, nil, + nil, nil, nil, 170, 169, nil, 154, 176, 172, 171, + 167, 168, 162, 160, 152, 175, 153, nil, nil, 181, + nil, nil, nil, nil, 768, 488, nil, nil, 769, nil, + nil, nil, nil, nil, nil, nil, nil, 177, 178, 174, + 173, 155, 156, 157, 164, 161, 163, nil, nil, 158, + 159, nil, nil, nil, 179, 180, 165, 166, nil, nil, + nil, nil, nil, 314, nil, nil, nil, nil, nil, nil, + nil, 170, 169, nil, 154, 176, 172, 171, 167, 168, + 162, 160, 152, 175, 153, nil, nil, 181, nil, nil, + nil, nil, 770, 495, nil, nil, 771, nil, nil, nil, + nil, nil, nil, nil, nil, 177, 178, 174, 173, 155, + 156, 157, 164, 161, 163, nil, nil, 158, 159, nil, + nil, nil, 179, 180, 165, 166, nil, nil, nil, nil, + nil, 314, nil, nil, nil, nil, nil, nil, nil, 170, + 169, nil, 154, 176, 172, 171, 167, 168, 162, 160, + 152, 175, 153, nil, nil, 181, nil, nil, nil, nil, + 882, 488, nil, nil, 883, nil, nil, nil, nil, nil, + nil, nil, nil, 177, 178, 174, 173, 155, 156, 157, + 164, 161, 163, nil, nil, 158, 159, nil, nil, nil, + 179, 180, 165, 166, nil, nil, nil, nil, nil, 314, + nil, nil, nil, nil, nil, nil, nil, 170, 169, nil, + 154, 176, 172, 171, 167, 168, 162, 160, 152, 175, + 153, nil, nil, 181, nil, nil, nil, nil, 884, 495, + nil, nil, 885, nil, nil, nil, nil, nil, nil, nil, + nil, 177, 178, 174, 173, 155, 156, 157, 164, 161, + 163, nil, nil, 158, 159, nil, nil, nil, 179, 180, + 165, 166, nil, nil, nil, nil, nil, 314, nil, nil, + nil, nil, nil, nil, nil, 170, 169, nil, 154, 176, + 172, 171, 167, 168, 162, 160, 152, 175, 153, nil, + nil, 181, nil, nil, nil, nil, 887, 495, nil, nil, + 888, nil, nil, nil, nil, nil, nil, nil, nil, 177, + 178, 174, 173, 155, 156, 157, 164, 161, 163, nil, + nil, 158, 159, nil, nil, nil, 179, 180, 165, 166, + nil, nil, nil, nil, nil, 314, nil, nil, nil, nil, + nil, nil, nil, 170, 169, nil, 154, 176, 172, 171, + 167, 168, 162, 160, 152, 175, 153, nil, nil, 181, + nil, nil, nil, nil, 585, 488, nil, nil, 586, nil, + nil, nil, nil, nil, nil, nil, nil, 177, 178, 174, + 173, 155, 156, 157, 164, 161, 163, nil, nil, 158, + 159, nil, nil, nil, 179, 180, 165, 166, nil, nil, + nil, nil, nil, 314, nil, nil, nil, nil, nil, nil, + nil, 170, 169, nil, 154, 176, 172, 171, 167, 168, + 162, 160, 152, 175, 153, nil, nil, 181, nil, nil, + nil, nil, 910, 488, nil, nil, 911, nil, nil, nil, + nil, nil, nil, nil, nil, 177, 178, 174, 173, 155, + 156, 157, 164, 161, 163, nil, nil, 158, 159, nil, + nil, nil, 179, 180, 165, 166, nil, nil, nil, nil, + nil, 314, nil, nil, nil, nil, nil, nil, nil, 170, + 169, nil, 154, 176, 172, 171, 167, 168, 162, 160, + 152, 175, 153, nil, nil, 181, nil, nil, nil, nil, + 913, 495, nil, nil, 912, nil, nil, nil, nil, nil, + nil, nil, nil, 177, 178, 174, 173, 155, 156, 157, + 164, 161, 163, nil, nil, 158, 159, nil, nil, nil, + 179, 180, 165, 166, nil, nil, nil, nil, nil, 314, + nil, nil, nil, nil, nil, nil, nil, 170, 169, nil, + 154, 176, 172, 171, 167, 168, 162, 160, 152, 175, + 153, nil, nil, 181, nil, nil, nil, nil, 1256, 488, + nil, nil, 1257, nil, nil, nil, nil, nil, nil, nil, + nil, 177, 178, 174, 173, 155, 156, 157, 164, 161, + 163, nil, nil, 158, 159, nil, nil, nil, 179, 180, + 165, 166, nil, nil, nil, nil, nil, 314, nil, nil, + nil, nil, nil, nil, nil, 170, 169, nil, 154, 176, + 172, 171, 167, 168, 162, 160, 152, 175, 153, nil, + nil, 181, nil, nil, nil, nil, 1258, 495, nil, nil, + 1259, nil, nil, nil, nil, nil, nil, nil, nil, 177, + 178, 174, 173, 155, 156, 157, 164, 161, 163, nil, + nil, 158, 159, nil, nil, nil, 179, 180, 165, 166, + nil, nil, nil, nil, nil, 314, nil, nil, nil, nil, + nil, nil, nil, 170, 169, nil, 154, 176, 172, 171, + 167, 168, 162, 160, 152, 175, 153, nil, nil, 181, + nil, nil, nil, nil, 1274, 495, nil, nil, 1273, nil, + nil, nil, nil, nil, nil, nil, nil, 177, 178, 174, + 173, 155, 156, 157, 164, 161, 163, nil, nil, 158, + 159, nil, nil, nil, 179, 180, 165, 166, nil, nil, + nil, nil, nil, 314, nil, nil, nil, nil, nil, nil, + nil, 170, 169, nil, 154, 176, 172, 171, 167, 168, + 162, 160, 152, 175, 153, nil, nil, 181, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 174 ] + +racc_action_check = [ + 116, 432, 435, 70, 392, 400, 826, 116, 116, 116, + 541, 541, 116, 116, 116, 849, 116, 401, 1106, 850, + 393, 1069, 822, 822, 116, 24, 116, 116, 116, 859, + 859, 787, 386, 527, 797, 386, 116, 116, 30, 116, + 116, 116, 116, 116, 787, 30, 1276, 1139, 404, 852, + 665, 527, 797, 882, 883, 1142, 1276, 776, 20, 17, + 17, 24, 895, 1024, 432, 435, 250, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 880, 849, 116, 116, 116, 850, 116, 116, 655, + 70, 116, 1042, 826, 116, 116, 1106, 116, 776, 116, + 541, 116, 30, 116, 116, 116, 116, 116, 116, 116, + 400, 116, 822, 116, 20, 852, 852, 849, 392, 859, + 849, 850, 401, 392, 850, 250, 116, 116, 116, 116, + 1024, 116, 1158, 116, 393, 1069, 119, 849, 116, 393, + 1069, 850, 116, 119, 119, 119, 116, 1159, 119, 119, + 119, 852, 119, 404, 852, 665, 1162, 1222, 882, 883, + 119, 1139, 119, 119, 119, 1024, 1139, 895, 1024, 1142, + 1256, 852, 119, 119, 1142, 119, 119, 119, 119, 119, + 1257, 1258, 21, 1278, 975, 1024, 884, 885, 824, 655, + 32, 251, 1018, 1, 655, 880, 423, 1042, 880, 423, + 880, 253, 3, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 13, 361, 119, + 119, 119, 824, 119, 119, 975, 1018, 119, 49, 49, + 119, 119, 410, 119, 468, 119, 410, 119, 21, 119, + 119, 119, 119, 119, 119, 119, 1158, 119, 1259, 119, + 251, 1158, 884, 885, 15, 32, 606, 423, 423, 1258, + 253, 1159, 119, 119, 119, 119, 1159, 119, 692, 119, + 1162, 1222, 490, 990, 119, 1162, 1222, 32, 119, 490, + 490, 490, 119, 361, 1256, 490, 490, 844, 490, 1256, + 971, 884, 885, 468, 1257, 1258, 490, 1278, 387, 1257, + 1258, 387, 1278, 1181, 844, 361, 49, 49, 490, 490, + 547, 490, 490, 490, 490, 490, 258, 606, 606, 606, + 5, 971, 982, 16, 96, 5, 1259, 368, 368, 692, + 692, 259, 96, 982, 990, 990, 990, 606, 692, 490, + 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, + 490, 490, 490, 658, 990, 490, 490, 490, 695, 490, + 490, 658, 1259, 490, 1181, 1181, 490, 1259, 768, 547, + 22, 490, 258, 490, 18, 490, 490, 490, 490, 490, + 490, 490, 982, 490, 1181, 490, 738, 259, 1010, 28, + 1010, 1010, 1010, 1010, 1010, 19, 988, 738, 490, 490, + 982, 490, 19, 490, 1010, 368, 368, 988, 491, 43, + 490, 19, 22, 769, 490, 491, 491, 491, 490, 695, + 695, 491, 491, 1185, 491, 46, 1010, 768, 695, 22, + 738, 738, 491, 491, 1185, 1010, 1010, 1010, 1010, 55, + 1146, 54, 1146, 419, 491, 491, 55, 491, 491, 491, + 491, 491, 144, 103, 249, 55, 988, 144, 144, 19, + 785, 249, 421, 1010, 738, 785, 293, 1185, 1185, 785, + 249, 1010, 769, 293, 988, 491, 491, 491, 491, 491, + 491, 491, 491, 491, 491, 491, 491, 491, 491, 910, + 294, 491, 491, 491, 817, 491, 491, 294, 817, 491, + 426, 1185, 491, 55, 419, 419, 419, 491, 911, 491, + 104, 491, 491, 491, 491, 491, 491, 491, 249, 491, + 491, 491, 340, 421, 421, 421, 1188, 340, 1188, 1188, + 1188, 1188, 1188, 353, 491, 491, 44, 491, 397, 491, + 353, 429, 1188, 397, 770, 437, 491, 105, 910, 353, + 491, 770, 770, 770, 491, 106, 770, 770, 770, 732, + 770, 426, 426, 426, 1188, 732, 966, 911, 770, 770, + 770, 770, 770, 1188, 1188, 1188, 1188, 1061, 44, 142, + 770, 770, 354, 770, 770, 770, 770, 770, 535, 354, + 223, 893, 295, 535, 355, 44, 893, 353, 354, 295, + 45, 355, 429, 429, 429, 236, 437, 437, 437, 1188, + 355, 770, 770, 770, 770, 770, 770, 770, 770, 770, + 770, 770, 770, 770, 770, 966, 296, 770, 770, 770, + 297, 770, 770, 296, 238, 770, 1061, 297, 770, 770, + 974, 770, 45, 770, 974, 770, 354, 770, 770, 770, + 770, 770, 770, 770, 298, 770, 770, 770, 355, 45, + 649, 298, 1192, 649, 1192, 1192, 1192, 1192, 1192, 357, + 770, 770, 770, 770, 299, 770, 357, 770, 1192, 242, + 771, 299, 770, 252, 372, 357, 770, 771, 771, 771, + 770, 254, 771, 771, 771, 300, 771, 255, 373, 261, + 1192, 313, 300, 328, 771, 373, 771, 771, 771, 1192, + 1192, 1192, 1192, 329, 373, 332, 771, 771, 402, 771, + 771, 771, 771, 771, 1046, 402, 372, 346, 412, 1046, + 467, 484, 301, 357, 402, 412, 485, 467, 717, 301, + 391, 391, 348, 372, 412, 1192, 467, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 349, 373, 771, 771, 771, 350, 771, 771, 52, + 52, 771, 356, 484, 771, 771, 359, 771, 485, 771, + 717, 771, 402, 771, 771, 771, 771, 771, 771, 771, + 484, 771, 412, 771, 467, 485, 1194, 717, 1194, 1194, + 1194, 1194, 1194, 623, 52, 52, 771, 771, 771, 771, + 623, 771, 1194, 771, 302, 360, 912, 862, 771, 623, + 862, 302, 771, 912, 912, 912, 771, 362, 1111, 912, + 912, 1111, 912, 1213, 1194, 520, 1213, 520, 520, 520, + 912, 520, 676, 676, 668, 1194, 1194, 741, 741, 800, + 800, 668, 912, 912, 853, 912, 912, 912, 912, 912, + 668, 853, 888, 363, 1160, 367, 853, 623, 369, 888, + 853, 1160, 376, 520, 888, 866, 866, 557, 888, 1194, + 1160, 378, 520, 912, 912, 912, 912, 912, 912, 912, + 912, 912, 912, 912, 912, 912, 912, 1143, 1143, 912, + 912, 912, 384, 912, 912, 1247, 1247, 912, 668, 557, + 912, 388, 398, 557, 557, 912, 399, 912, 853, 912, + 912, 912, 912, 912, 912, 912, 888, 912, 1160, 912, + 403, 405, 1264, 1199, 1264, 1264, 1264, 1264, 1264, 1244, + 1199, 414, 912, 912, 425, 912, 1244, 912, 1264, 1199, + 428, 431, 913, 434, 912, 1244, 457, 459, 912, 913, + 913, 913, 912, 460, 462, 913, 913, 465, 913, 751, + 1264, 751, 751, 751, 469, 751, 913, 913, 479, 1264, + 1264, 1264, 1264, 482, 803, 803, 803, 803, 913, 913, + 483, 913, 913, 913, 913, 913, 492, 1199, 498, 499, + 803, 803, 803, 1244, 502, 503, 816, 751, 816, 816, + 504, 507, 816, 803, 803, 1264, 751, 508, 803, 913, + 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, + 913, 913, 913, 509, 519, 913, 913, 913, 531, 913, + 913, 534, 537, 913, 816, 543, 913, 551, 552, 559, + 560, 913, 561, 913, 562, 913, 913, 913, 913, 913, + 913, 913, 582, 913, 913, 913, 590, 803, 803, 803, + 803, 803, 803, 591, 558, 592, 803, 803, 913, 913, + 596, 913, 612, 913, 803, 613, 614, 803, 803, 803, + 913, 803, 803, 617, 913, 619, 624, 628, 913, 2, + 2, 2, 2, 2, 2, 637, 558, 638, 2, 2, + 558, 558, 408, 2, 409, 2, 2, 2, 2, 2, + 2, 2, 9, 9, 9, 9, 9, 2, 2, 2, + 2, 2, 2, 2, 646, 956, 2, 956, 956, 956, + 647, 956, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 650, 2, 2, 2, 652, 2, + 2, 656, 2, 2, 2, 408, 657, 409, 659, 699, + 702, 704, 408, 956, 409, 709, 722, 408, 728, 409, + 730, 408, 956, 409, 2, 748, 753, 2, 565, 754, + 2, 2, 756, 763, 2, 772, 2, 781, 789, 408, + 2, 409, 790, 791, 565, 565, 897, 897, 2, 820, + 897, 897, 897, 2, 2, 2, 2, 2, 2, 825, + 565, 831, 2, 2, 565, 565, 565, 565, 833, 408, + 2, 409, 835, 2, 2, 2, 837, 2, 2, 846, + 848, 2, 2, 39, 39, 39, 39, 39, 39, 851, + 854, 855, 39, 39, 858, 868, 887, 39, 874, 39, + 39, 39, 39, 39, 39, 39, 344, 344, 344, 344, + 344, 39, 39, 39, 39, 39, 39, 39, 875, 881, + 39, 572, 890, 894, 896, 907, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 909, 39, + 39, 39, 917, 39, 39, 936, 39, 39, 39, 887, + 573, 937, 940, 572, 942, 945, 887, 572, 572, 572, + 572, 887, 946, 948, 949, 887, 951, 955, 39, 968, + 970, 39, 976, 977, 39, 39, 981, 984, 39, 989, + 39, 1015, 573, 887, 39, 1016, 573, 573, 573, 573, + 1023, 1028, 39, 1034, 1043, 1045, 1052, 39, 39, 39, + 39, 39, 39, 1053, 1059, 1060, 39, 39, 383, 383, + 383, 383, 383, 887, 39, 1084, 1085, 39, 39, 39, + 1090, 39, 39, 1095, 1096, 39, 39, 225, 225, 225, + 225, 225, 225, 1097, 1098, 1099, 225, 225, 1100, 1104, + 1105, 225, 1108, 225, 225, 225, 225, 225, 225, 225, + 26, 1112, 1119, 1121, 1122, 225, 225, 225, 225, 225, + 225, 225, 1124, 755, 225, 755, 755, 755, 1125, 755, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 1126, 225, 225, 225, 1128, 225, 225, 1129, + 225, 225, 225, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 1130, 26, 26, 1151, 1152, 26, + 26, 1156, 225, 1161, 26, 225, 1164, 1165, 225, 225, + 1166, 1167, 225, 1178, 225, 26, 1197, 26, 225, 26, + 26, 26, 26, 26, 26, 26, 225, 26, 1200, 1210, + 1218, 225, 225, 225, 225, 225, 225, 1228, 1229, 1231, + 225, 225, 1234, 26, 1237, 1238, 1239, 1240, 225, 1242, + 1255, 225, 225, 225, 1260, 225, 225, 1262, 1273, 225, + 225, 237, 237, 237, 237, 237, 237, 1274, 1280, 1281, + 237, 237, 1282, 1283, 1292, 237, nil, 237, 237, 237, + 237, 237, 237, 237, 611, 611, 611, 611, 611, 237, + 237, 237, 237, 237, 237, 237, nil, nil, 237, nil, + nil, nil, nil, 472, 237, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, nil, 237, 237, 237, + nil, 237, 237, nil, 237, 237, 237, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, nil, 472, + 472, nil, nil, 472, 472, nil, 237, nil, nil, 237, + nil, nil, 237, 237, nil, nil, 237, nil, 237, 472, + nil, 472, 237, 472, 472, 472, 472, 472, 472, 472, + 237, 472, nil, nil, nil, 237, 237, 237, 237, 237, + 237, nil, nil, nil, 237, 237, nil, 472, nil, 472, + nil, nil, 237, nil, nil, 237, 237, 237, nil, 237, + 237, nil, nil, 237, 237, 243, 243, 243, 243, 243, + 243, nil, nil, nil, 243, 243, nil, nil, nil, 243, + nil, 243, 243, 243, 243, 243, 243, 243, nil, nil, + nil, nil, nil, 243, 243, 243, 243, 243, 243, 243, + nil, nil, 243, nil, nil, nil, nil, 478, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + nil, 243, 243, 243, nil, 243, 243, nil, 243, 243, + 243, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, nil, 478, 478, nil, nil, 478, 478, nil, + 243, nil, nil, 243, nil, nil, 243, 243, nil, nil, + 243, nil, 243, 478, nil, 478, 243, 478, 478, 478, + 478, 478, 478, 478, 243, 478, nil, nil, nil, 243, + 243, 243, 243, 243, 243, nil, nil, nil, 243, 243, + nil, 478, nil, nil, nil, nil, 243, nil, nil, 243, + 243, 243, nil, 243, 243, nil, nil, 243, 243, 260, + 260, 260, 260, 260, 260, nil, nil, nil, 260, 260, + nil, nil, nil, 260, nil, 260, 260, 260, 260, 260, + 260, 260, nil, nil, nil, nil, nil, 260, 260, 260, + 260, 260, 260, 260, nil, nil, 260, nil, nil, nil, + nil, 731, 260, 260, 260, 260, 260, 260, 260, 260, + 260, 260, 260, 260, nil, 260, 260, 260, nil, 260, + 260, nil, 260, 260, 260, 731, 731, 731, 731, 731, + 731, 731, 731, 731, 731, 731, nil, 731, 731, nil, + nil, 731, 731, nil, 260, nil, nil, 260, nil, nil, + 260, 260, nil, nil, 260, nil, 260, 731, nil, 731, + 260, 731, 731, 731, 731, 731, 731, 731, 260, 731, + nil, nil, nil, 260, 260, 260, 260, 260, 260, nil, + nil, nil, 260, 260, nil, 731, nil, nil, nil, nil, + 260, nil, nil, 260, 260, 260, nil, 260, 260, nil, + nil, 260, 260, 347, 347, 347, 347, 347, 347, nil, + nil, nil, 347, 347, nil, nil, nil, 347, nil, 347, + 347, 347, 347, 347, 347, 347, nil, nil, nil, nil, + nil, 347, 347, 347, 347, 347, 347, 347, nil, nil, + 347, nil, nil, nil, nil, 764, 347, 347, 347, 347, + 347, 347, 347, 347, 347, 347, 347, 347, nil, 347, + 347, 347, nil, 347, 347, nil, 347, 347, 347, 764, + 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, + nil, 764, 764, nil, nil, 764, 764, nil, 347, nil, + nil, 347, nil, nil, 347, 347, nil, nil, 347, nil, + 347, 764, nil, 764, 347, 764, 764, 764, 764, 764, + 764, 764, 347, 764, nil, nil, nil, 347, 347, 347, + 347, 347, 347, nil, nil, nil, 347, 347, nil, 764, + nil, nil, nil, nil, 347, nil, nil, 347, 347, 347, + nil, 347, 347, nil, nil, 347, 347, 352, 352, 352, + 352, 352, 352, nil, nil, nil, 352, 352, nil, nil, + nil, 352, nil, 352, 352, 352, 352, 352, 352, 352, + nil, nil, nil, nil, nil, 352, 352, 352, 352, 352, + 352, 352, nil, 1153, 352, 1153, 1153, 1153, nil, 1153, + 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, nil, 352, 352, 352, nil, 352, 352, nil, + 352, 352, 352, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, nil, 326, 326, nil, nil, 326, + 326, nil, 352, nil, nil, 352, nil, nil, 352, 352, + nil, nil, 352, nil, 352, 326, nil, 326, 352, 326, + 326, 326, 326, 326, 326, 326, 352, 326, nil, nil, + nil, 352, 352, 352, 352, 352, 352, nil, nil, nil, + 352, 352, nil, 326, nil, nil, nil, nil, 352, nil, + nil, 352, 352, 352, nil, 352, 352, nil, nil, 352, + 352, 382, 382, 382, 382, 382, 382, nil, nil, nil, + 382, 382, nil, nil, nil, 382, nil, 382, 382, 382, + 382, 382, 382, 382, nil, nil, nil, nil, nil, 382, + 382, 382, 382, 382, 382, 382, nil, 1253, 382, 1253, + 1253, 1253, nil, 1253, 382, 382, 382, 382, 382, 382, + 382, 382, 382, 382, 382, 382, nil, 382, 382, 382, + nil, 382, 382, nil, 382, 382, 382, 576, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, nil, 576, + 576, nil, nil, 576, 576, nil, 382, nil, nil, 382, + nil, nil, 382, 382, nil, nil, 382, nil, 382, 576, + nil, 576, 382, 576, 576, 576, 576, 576, 576, 576, + 382, 576, nil, nil, nil, 382, 382, 382, 382, 382, + 382, nil, nil, nil, 382, 382, 576, 576, nil, nil, + nil, nil, 382, nil, nil, 382, 382, 382, nil, 382, + 382, nil, nil, 382, 382, 395, 395, 395, 395, 395, + 395, nil, nil, nil, 395, 395, nil, nil, nil, 395, + nil, 395, 395, 395, 395, 395, 395, 395, nil, nil, + nil, nil, nil, 395, 395, 395, 395, 395, 395, 395, + nil, nil, 395, nil, nil, nil, nil, nil, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + nil, 395, 395, 395, nil, 395, 395, nil, 395, 395, + 395, 635, 635, 635, 635, 635, 635, 635, 635, 635, + 635, 635, nil, 635, 635, nil, nil, 635, 635, nil, + 395, nil, nil, 395, nil, nil, 395, 395, nil, nil, + 395, nil, 395, 635, nil, 635, 395, 635, 635, 635, + 635, 635, 635, 635, 395, 635, nil, nil, nil, 395, + 395, 395, 395, 395, 395, nil, nil, nil, 395, 395, + nil, 635, nil, nil, nil, nil, 395, nil, nil, 395, + 395, 395, nil, 395, 395, nil, nil, 395, 395, 396, + 396, 396, 396, 396, 396, nil, nil, nil, 396, 396, + nil, nil, nil, 396, nil, 396, 396, 396, 396, 396, + 396, 396, nil, nil, nil, nil, nil, 396, 396, 396, + 396, 396, 396, 396, nil, nil, 396, nil, nil, nil, + nil, nil, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, nil, 396, 396, 396, nil, 396, + 396, nil, 396, 396, 396, 915, 915, 915, 915, 915, + 915, 915, 915, 915, 915, 915, nil, 915, 915, nil, + nil, 915, 915, nil, 396, nil, nil, 396, nil, nil, + 396, 396, nil, nil, 396, nil, 396, 915, nil, 915, + 396, 915, 915, 915, 915, 915, 915, 915, 396, 915, + nil, nil, nil, 396, 396, 396, 396, 396, 396, nil, + nil, nil, 396, 396, nil, 915, nil, nil, nil, nil, + 396, nil, nil, 396, 396, 396, nil, 396, 396, nil, + nil, 396, 396, 451, 451, 451, 451, 451, 451, nil, + nil, nil, 451, 451, nil, nil, nil, 451, nil, 451, + 451, 451, 451, 451, 451, 451, nil, nil, nil, nil, + nil, 451, 451, 451, 451, 451, 451, 451, nil, nil, + 451, nil, nil, nil, nil, nil, 451, 451, 451, 451, + 451, 451, 451, 451, 451, 451, 451, 451, nil, 451, + 451, 451, nil, 451, 451, nil, 451, 451, 451, 1065, + 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, + nil, 1065, 1065, nil, nil, 1065, 1065, nil, 451, nil, + nil, 451, nil, nil, 451, 451, nil, nil, 451, nil, + 451, 1065, nil, 1065, 451, 1065, 1065, 1065, 1065, 1065, + 1065, 1065, 451, 1065, nil, nil, nil, 451, 451, 451, + 451, 451, 451, nil, nil, nil, 451, 451, nil, 1065, + nil, nil, nil, nil, 451, nil, nil, 451, 451, 451, + nil, 451, 451, nil, nil, 451, 451, 651, 651, 651, + 651, 651, 651, nil, nil, nil, 651, 651, nil, nil, + nil, 651, nil, 651, 651, 651, 651, 651, 651, 651, + nil, nil, nil, nil, nil, 651, 651, 651, 651, 651, + 651, 651, nil, nil, 651, nil, nil, nil, nil, nil, + 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, + 651, 651, nil, 651, 651, 651, nil, 651, 651, nil, + 651, 651, 651, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, 1066, nil, 1066, 1066, nil, nil, 1066, + 1066, nil, 651, nil, nil, 651, nil, nil, 651, 651, + nil, nil, 651, nil, 651, 1066, nil, 1066, 651, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 651, 1066, nil, nil, + nil, 651, 651, 651, 651, 651, 651, nil, nil, nil, + 651, 651, nil, 1066, nil, nil, nil, nil, 651, nil, + nil, 651, 651, 651, nil, 651, 651, nil, nil, 651, + 651, 654, 654, 654, 654, 654, 654, nil, nil, nil, + 654, 654, nil, nil, nil, 654, nil, 654, 654, 654, + 654, 654, 654, 654, nil, nil, nil, nil, nil, 654, + 654, 654, 654, 654, 654, 654, nil, nil, 654, nil, + nil, nil, nil, nil, 654, 654, 654, 654, 654, 654, + 654, 654, 654, 654, 654, 654, nil, 654, 654, 654, + nil, 654, 654, nil, 654, 654, 654, 1086, 1086, 1086, + 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, nil, 1086, + 1086, nil, nil, 1086, 1086, nil, 654, nil, nil, 654, + nil, nil, 654, 654, nil, nil, 654, nil, 654, 1086, + nil, 1086, 654, 1086, 1086, 1086, 1086, 1086, 1086, 1086, + 654, 1086, nil, nil, nil, 654, 654, 654, 654, 654, + 654, nil, nil, nil, 654, 654, nil, 1086, nil, nil, + nil, nil, 654, nil, nil, 654, 654, 654, nil, 654, + 654, nil, nil, 654, 654, 677, 677, 677, 677, 677, + 677, nil, nil, nil, 677, 677, nil, nil, nil, 677, + nil, 677, 677, 677, 677, 677, 677, 677, nil, nil, + nil, nil, nil, 677, 677, 677, 677, 677, 677, 677, + nil, nil, 677, nil, nil, nil, nil, nil, 677, 677, + 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, + nil, 677, 677, 677, nil, 677, 677, nil, 677, 677, + 677, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, nil, 1087, 1087, nil, nil, 1087, 1087, nil, + 677, nil, nil, 677, nil, nil, 677, 677, nil, nil, + 677, nil, 677, 1087, nil, 1087, 677, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 677, 1087, nil, nil, nil, 677, + 677, 677, 677, 677, 677, nil, nil, nil, 677, 677, + nil, 1087, nil, nil, nil, nil, 677, nil, nil, 677, + 677, 677, nil, 677, 677, nil, nil, 677, 677, 886, + 886, 886, 886, 886, 886, nil, nil, nil, 886, 886, + nil, nil, nil, 886, nil, 886, 886, 886, 886, 886, + 886, 886, nil, nil, nil, nil, nil, 886, 886, 886, + 886, 886, 886, 886, nil, nil, 886, nil, nil, nil, + nil, nil, 886, 886, 886, 886, 886, 886, 886, 886, + 886, 886, 886, 886, nil, 886, 886, 886, nil, 886, + 886, nil, 886, 886, 886, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, nil, 1120, 1120, nil, + nil, 1120, 1120, nil, 886, nil, nil, 886, nil, nil, + 886, 886, nil, nil, 886, nil, 886, 1120, nil, 1120, + 886, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 886, 1120, + nil, nil, nil, 886, 886, 886, 886, 886, 886, nil, + nil, nil, 886, 886, nil, 1120, nil, nil, nil, nil, + 886, nil, nil, 886, 886, 886, nil, 886, 886, nil, + nil, 886, 886, 891, 891, 891, 891, 891, 891, nil, + nil, nil, 891, 891, nil, nil, nil, 891, nil, 891, + 891, 891, 891, 891, 891, 891, nil, nil, nil, nil, + nil, 891, 891, 891, 891, 891, 891, 891, nil, nil, + 891, nil, nil, nil, nil, nil, 891, 891, 891, 891, + 891, 891, 891, 891, 891, 891, 891, 891, nil, 891, + 891, 891, nil, 891, 891, nil, 891, 891, 891, 374, + 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, + nil, 374, 374, nil, nil, 374, 374, nil, 891, nil, + nil, 891, nil, nil, 891, 891, nil, nil, 891, nil, + 891, 374, nil, 374, 891, 374, 374, 374, 374, 374, + 374, 374, 891, 374, nil, nil, nil, 891, 891, 891, + 891, 891, 891, nil, nil, nil, 891, 891, nil, nil, + nil, nil, nil, nil, 891, nil, nil, 891, 891, 891, + nil, 891, 891, nil, nil, 891, 891, 898, 898, 898, + 898, 898, 898, nil, nil, nil, 898, 898, nil, nil, + nil, 898, nil, 898, 898, 898, 898, 898, 898, 898, + nil, nil, nil, nil, nil, 898, 898, 898, 898, 898, + 898, 898, nil, nil, 898, nil, nil, nil, nil, nil, + 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, + 898, 898, nil, 898, 898, 898, nil, 898, 898, nil, + 898, 898, 898, 375, 375, 375, 375, 375, 375, 375, + 375, 375, 375, 375, nil, 375, 375, nil, nil, 375, + 375, nil, 898, nil, nil, 898, nil, nil, 898, 898, + nil, nil, 898, nil, 898, 375, nil, 375, 898, 375, + 375, 375, 375, 375, 375, 375, 898, 375, nil, nil, + nil, 898, 898, 898, 898, 898, 898, nil, nil, nil, + 898, 898, nil, nil, nil, nil, nil, nil, 898, nil, + nil, 898, 898, 898, nil, 898, 898, nil, nil, 898, + 898, 934, 934, 934, 934, 934, 934, nil, nil, nil, + 934, 934, nil, nil, nil, 934, nil, 934, 934, 934, + 934, 934, 934, 934, nil, nil, nil, nil, nil, 934, + 934, 934, 934, 934, 934, 934, nil, nil, 934, nil, + nil, nil, nil, nil, 934, 934, 934, 934, 934, 934, + 934, 934, 934, 934, 934, 934, nil, 934, 934, 934, + nil, 934, 934, nil, 934, 934, 934, 555, 555, 555, + 555, 555, 555, 555, 555, 555, 555, 555, nil, 555, + 555, nil, nil, 555, 555, nil, 934, nil, nil, 934, + nil, nil, 934, 934, nil, nil, 934, nil, 934, 555, + nil, 555, 934, 555, 555, 555, 555, 555, 555, 555, + 934, 555, nil, nil, nil, 934, 934, 934, 934, 934, + 934, nil, nil, nil, 934, 934, nil, nil, nil, nil, + nil, nil, 934, nil, nil, 934, 934, 934, nil, 934, + 934, nil, nil, 934, 934, 1012, 1012, 1012, 1012, 1012, + 1012, nil, nil, nil, 1012, 1012, nil, nil, nil, 1012, + nil, 1012, 1012, 1012, 1012, 1012, 1012, 1012, nil, nil, + nil, nil, nil, 1012, 1012, 1012, 1012, 1012, 1012, 1012, + nil, nil, 1012, nil, nil, nil, nil, nil, 1012, 1012, + 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, + nil, 1012, 1012, 1012, nil, 1012, 1012, nil, 1012, 1012, + 1012, 556, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, nil, 556, 556, nil, nil, 556, 556, nil, + 1012, nil, nil, 1012, nil, nil, 1012, 1012, nil, nil, + 1012, nil, 1012, 556, nil, 556, 1012, 556, 556, 556, + 556, 556, 556, 556, 1012, 556, nil, nil, nil, 1012, + 1012, 1012, 1012, 1012, 1012, nil, nil, nil, 1012, 1012, + nil, nil, nil, nil, nil, nil, 1012, nil, nil, 1012, + 1012, 1012, nil, 1012, 1012, nil, nil, 1012, 1012, 1033, + 1033, 1033, 1033, 1033, 1033, nil, nil, nil, 1033, 1033, + nil, nil, nil, 1033, nil, 1033, 1033, 1033, 1033, 1033, + 1033, 1033, nil, nil, nil, nil, nil, 1033, 1033, 1033, + 1033, 1033, 1033, 1033, nil, 957, 1033, 957, 957, 957, + nil, 957, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, + 1033, 1033, 1033, 1033, nil, 1033, 1033, 1033, nil, 1033, + 1033, nil, 1033, 1033, 1033, 566, 566, 566, 566, 566, + 566, 566, nil, 957, 566, 566, nil, nil, nil, nil, + nil, 566, 566, nil, 1033, nil, nil, 1033, nil, nil, + 1033, 1033, nil, nil, 1033, nil, 1033, 566, nil, 566, + 1033, 566, 566, 566, 566, 566, 566, 566, 1033, 566, + nil, nil, nil, 1033, 1033, 1033, 1033, 1033, 1033, nil, + nil, nil, 1033, 1033, nil, nil, nil, nil, nil, nil, + 1033, nil, nil, 1033, 1033, 1033, nil, 1033, 1033, nil, + nil, 1033, 1033, 1041, 1041, 1041, 1041, 1041, 1041, nil, + nil, nil, 1041, 1041, nil, nil, nil, 1041, nil, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, nil, nil, nil, nil, + nil, 1041, 1041, 1041, 1041, 1041, 1041, 1041, nil, 1168, + 1041, 1168, 1168, 1168, nil, 1168, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, nil, 1041, + 1041, 1041, nil, 1041, 1041, nil, 1041, 1041, 1041, 567, + 567, 567, 567, 567, 567, 567, nil, 1168, 567, 567, + nil, nil, nil, nil, nil, 567, 567, nil, 1041, nil, + nil, 1041, nil, nil, 1041, 1041, nil, nil, 1041, nil, + 1041, 567, nil, 567, 1041, 567, 567, 567, 567, 567, + 567, 567, 1041, 567, nil, nil, nil, 1041, 1041, 1041, + 1041, 1041, 1041, nil, nil, nil, 1041, 1041, nil, nil, + nil, nil, nil, nil, 1041, nil, nil, 1041, 1041, 1041, + nil, 1041, 1041, nil, nil, 1041, 1041, 1050, 1050, 1050, + 1050, 1050, 1050, nil, nil, nil, 1050, 1050, nil, nil, + nil, 1050, nil, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + nil, nil, nil, nil, nil, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, nil, 1169, 1050, 1169, 1169, 1169, nil, 1169, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, nil, 1050, 1050, 1050, nil, 1050, 1050, nil, + 1050, 1050, 1050, 568, 568, 568, 568, 568, 568, 568, + nil, 1169, 568, 568, nil, nil, nil, nil, nil, 568, + 568, nil, 1050, nil, nil, 1050, nil, nil, 1050, 1050, + nil, nil, 1050, nil, 1050, 568, nil, 568, 1050, 568, + 568, 568, 568, 568, 568, 568, 1050, 568, nil, nil, + nil, 1050, 1050, 1050, 1050, 1050, 1050, nil, nil, nil, + 1050, 1050, nil, nil, nil, nil, nil, nil, 1050, nil, + nil, 1050, 1050, 1050, nil, 1050, 1050, nil, nil, 1050, + 1050, 1051, 1051, 1051, 1051, 1051, 1051, nil, nil, nil, + 1051, 1051, nil, nil, nil, 1051, nil, 1051, 1051, 1051, + 1051, 1051, 1051, 1051, nil, nil, nil, nil, nil, 1051, + 1051, 1051, 1051, 1051, 1051, 1051, nil, nil, 1051, nil, + nil, nil, nil, nil, 1051, 1051, 1051, 1051, 1051, 1051, + 1051, 1051, 1051, 1051, 1051, 1051, nil, 1051, 1051, 1051, + nil, 1051, 1051, nil, 1051, 1051, 1051, 569, 569, 569, + 569, 569, 569, 569, nil, nil, 569, 569, nil, nil, + nil, nil, nil, 569, 569, nil, 1051, nil, nil, 1051, + nil, nil, 1051, 1051, nil, nil, 1051, nil, 1051, 569, + nil, 569, 1051, 569, 569, 569, 569, 569, 569, 569, + 1051, 569, nil, nil, nil, 1051, 1051, 1051, 1051, 1051, + 1051, nil, nil, nil, 1051, 1051, nil, nil, nil, nil, + nil, nil, 1051, nil, nil, 1051, 1051, 1051, nil, 1051, + 1051, nil, nil, 1051, 1051, 1067, 1067, 1067, 1067, 1067, + 1067, nil, nil, nil, 1067, 1067, nil, nil, nil, 1067, + nil, 1067, 1067, 1067, 1067, 1067, 1067, 1067, nil, nil, + nil, nil, nil, 1067, 1067, 1067, 1067, 1067, 1067, 1067, + nil, nil, 1067, nil, nil, nil, nil, nil, 1067, 1067, + 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, + nil, 1067, 1067, 1067, nil, 1067, 1067, nil, 1067, 1067, + 1067, 570, 570, 570, 570, 570, 570, 570, nil, nil, + 570, 570, nil, nil, nil, nil, nil, 570, 570, nil, + 1067, nil, nil, 1067, nil, nil, 1067, 1067, nil, nil, + 1067, nil, 1067, 570, nil, 570, 1067, 570, 570, 570, + 570, 570, 570, 570, 1067, 570, nil, nil, nil, 1067, + 1067, 1067, 1067, 1067, 1067, nil, nil, nil, 1067, 1067, + nil, nil, nil, nil, nil, nil, 1067, nil, nil, 1067, + 1067, 1067, nil, 1067, 1067, nil, nil, 1067, 1067, 1137, + 1137, 1137, 1137, 1137, 1137, nil, nil, nil, 1137, 1137, + nil, nil, nil, 1137, nil, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, nil, nil, nil, nil, nil, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, nil, nil, 1137, nil, nil, nil, + nil, nil, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, nil, 1137, 1137, 1137, nil, 1137, + 1137, nil, 1137, 1137, 1137, 571, 571, 571, 571, 571, + 571, 571, nil, nil, 571, 571, nil, nil, nil, nil, + nil, 571, 571, nil, 1137, nil, nil, 1137, nil, nil, + 1137, 1137, nil, nil, 1137, nil, 1137, 571, nil, 571, + 1137, 571, 571, 571, 571, 571, 571, 571, 1137, 571, + nil, nil, nil, 1137, 1137, 1137, 1137, 1137, 1137, nil, + nil, nil, 1137, 1137, nil, nil, nil, nil, nil, nil, + 1137, nil, nil, 1137, 1137, 1137, nil, 1137, 1137, nil, + nil, 1137, 1137, 1150, 1150, 1150, 1150, 1150, 1150, nil, + nil, nil, 1150, 1150, nil, nil, nil, 1150, nil, 1150, + 1150, 1150, 1150, 1150, 1150, 1150, nil, nil, nil, nil, + nil, 1150, 1150, 1150, 1150, 1150, 1150, 1150, nil, nil, + 1150, nil, nil, nil, nil, nil, 1150, 1150, 1150, 1150, + 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, nil, 1150, + 1150, 1150, nil, 1150, 1150, nil, 1150, 1150, 1150, 574, + 574, 574, 574, 574, 574, 574, nil, nil, 574, 574, + nil, nil, nil, nil, nil, 574, 574, nil, 1150, nil, + nil, 1150, nil, nil, 1150, 1150, nil, nil, 1150, nil, + 1150, 574, nil, 574, 1150, 574, 574, 574, 574, 574, + 574, 574, 1150, 574, nil, nil, nil, 1150, 1150, 1150, + 1150, 1150, 1150, nil, nil, nil, 1150, 1150, nil, nil, + nil, nil, nil, nil, 1150, nil, nil, 1150, 1150, 1150, + nil, 1150, 1150, nil, nil, 1150, 1150, 1157, 1157, 1157, + 1157, 1157, 1157, nil, nil, nil, 1157, 1157, nil, nil, + nil, 1157, nil, 1157, 1157, 1157, 1157, 1157, 1157, 1157, + nil, nil, nil, nil, nil, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, nil, nil, 1157, nil, nil, nil, nil, nil, + 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, nil, 1157, 1157, 1157, nil, 1157, 1157, nil, + 1157, 1157, 1157, 575, 575, 575, 575, 575, 575, 575, + 575, nil, 575, 575, nil, nil, nil, nil, nil, 575, + 575, nil, 1157, nil, nil, 1157, nil, nil, 1157, 1157, + nil, nil, 1157, nil, 1157, 575, nil, 575, 1157, 575, + 575, 575, 575, 575, 575, 575, 1157, 575, nil, nil, + nil, 1157, 1157, 1157, 1157, 1157, 1157, nil, nil, nil, + 1157, 1157, nil, nil, nil, nil, nil, nil, 1157, nil, + nil, 1157, 1157, 1157, nil, 1157, 1157, nil, nil, 1157, + 1157, 1202, 1202, 1202, 1202, 1202, 1202, nil, nil, nil, + 1202, 1202, nil, nil, nil, 1202, nil, 1202, 1202, 1202, + 1202, 1202, 1202, 1202, nil, nil, nil, nil, nil, 1202, + 1202, 1202, 1202, 1202, 1202, 1202, nil, nil, 1202, nil, + nil, nil, nil, nil, 1202, 1202, 1202, 1202, 1202, 1202, + 1202, 1202, 1202, 1202, 1202, 1202, nil, 1202, 1202, 1202, + nil, 1202, 1202, nil, 1202, 1202, 1202, 577, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 577, 577, nil, 1202, nil, nil, 1202, + nil, nil, 1202, 1202, nil, nil, 1202, nil, 1202, 577, + nil, 577, 1202, 577, 577, 577, 577, nil, nil, 577, + 1202, 577, nil, nil, nil, 1202, 1202, 1202, 1202, 1202, + 1202, nil, nil, nil, 1202, 1202, nil, nil, nil, nil, + nil, nil, 1202, nil, nil, 1202, 1202, 1202, nil, 1202, + 1202, nil, nil, 1202, 1202, 1248, 1248, 1248, 1248, 1248, + 1248, nil, nil, nil, 1248, 1248, nil, nil, nil, 1248, + nil, 1248, 1248, 1248, 1248, 1248, 1248, 1248, nil, nil, + nil, nil, nil, 1248, 1248, 1248, 1248, 1248, 1248, 1248, + nil, nil, 1248, nil, nil, nil, nil, nil, 1248, 1248, + 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, + nil, 1248, 1248, 1248, nil, 1248, 1248, nil, 1248, 1248, + 1248, 634, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 634, 634, nil, + 1248, nil, nil, 1248, nil, nil, 1248, 1248, nil, nil, + 1248, nil, 1248, 634, nil, 634, 1248, 634, 634, 634, + 634, nil, nil, 634, 1248, 634, nil, nil, nil, 1248, + 1248, 1248, 1248, 1248, 1248, nil, nil, nil, 1248, 1248, + nil, nil, nil, nil, nil, nil, 1248, nil, nil, 1248, + 1248, 1248, nil, 1248, 1248, nil, nil, 1248, 1248, 8, + 8, 8, 8, 8, nil, nil, nil, 8, 8, nil, + nil, nil, 8, nil, 8, 8, 8, 8, 8, 8, + 8, nil, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, 8, nil, nil, 8, nil, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, nil, 8, 8, 8, nil, 8, 8, + nil, 8, 8, 8, 563, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 563, 563, nil, 8, nil, nil, 8, nil, nil, 8, + 8, nil, nil, 8, nil, 8, 563, nil, 563, 8, + 563, 563, 563, 563, nil, nil, nil, 8, nil, nil, + nil, nil, 8, 8, 8, 8, 8, 8, nil, nil, + nil, 8, 8, nil, nil, nil, nil, nil, nil, 8, + nil, nil, 8, 8, 8, nil, 8, 8, nil, nil, + 8, 8, 25, 25, 25, nil, 25, nil, nil, nil, + 25, 25, nil, nil, nil, 25, nil, 25, 25, 25, + 25, 25, 25, 25, nil, nil, nil, nil, nil, 25, + 25, 25, 25, 25, 25, 25, nil, nil, 25, nil, + nil, nil, nil, nil, nil, 25, nil, nil, 25, 25, + 25, 25, 25, 25, 25, 25, nil, 25, 25, 25, + nil, 25, 25, nil, 25, 25, 25, 564, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 564, 564, nil, 25, nil, nil, 25, + nil, nil, 25, 25, nil, nil, 25, nil, nil, 564, + nil, 564, 25, 564, 564, 564, 564, nil, nil, nil, + 25, nil, nil, nil, nil, 25, 25, 25, 25, 25, + 25, nil, nil, nil, 25, 25, nil, nil, nil, nil, + nil, nil, 25, nil, nil, 25, 25, 25, 33, 25, + 25, nil, nil, 25, 25, 33, 33, 33, nil, nil, + 33, 33, 33, 1266, 33, 1266, 1266, 1266, 1266, 1266, + nil, nil, 33, 33, 33, 33, nil, nil, nil, 1266, + nil, nil, nil, nil, 33, 33, nil, 33, 33, 33, + 33, 33, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1266, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1266, 1266, nil, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, nil, + nil, 33, 33, 33, nil, nil, 33, nil, 33, 33, + nil, nil, 33, 33, nil, 33, 1266, 33, nil, 33, + nil, 33, 33, 33, 33, 33, 33, 33, nil, 33, + 33, 33, 1268, nil, 1268, 1268, 1268, 1268, 1268, nil, + nil, nil, nil, nil, 33, 33, nil, 33, 1268, 33, + 34, nil, nil, nil, nil, nil, 33, 34, 34, 34, + 33, nil, 34, 34, 34, nil, 34, nil, nil, nil, + 1268, nil, nil, nil, 34, nil, 34, 34, nil, nil, + nil, 1268, 1268, nil, nil, nil, 34, 34, nil, 34, + 34, 34, 34, 34, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1268, nil, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, nil, nil, 34, 34, 34, nil, nil, 34, nil, + 34, 34, nil, nil, 34, 34, nil, 34, nil, 34, + nil, 34, nil, 34, 34, 34, 34, 34, 34, 34, + nil, 34, nil, 34, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 34, 34, nil, 34, + nil, 34, 35, 35, 35, nil, 35, nil, 34, nil, + 35, 35, 34, nil, nil, 35, nil, 35, 35, 35, + 35, 35, 35, 35, nil, nil, nil, nil, nil, 35, + 35, 35, 35, 35, 35, 35, nil, nil, 35, nil, + nil, nil, nil, nil, nil, 35, nil, nil, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + nil, 35, 35, nil, 35, 35, 35, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 35, nil, nil, 35, + nil, nil, 35, 35, nil, nil, 35, nil, 35, nil, + 35, nil, 35, nil, nil, nil, nil, nil, nil, nil, + 35, nil, nil, nil, nil, 35, 35, 35, 35, 35, + 35, nil, nil, nil, 35, 35, nil, nil, nil, nil, + nil, nil, 35, nil, 35, 35, 35, 35, nil, 35, + 35, nil, nil, 35, 35, 36, 36, 36, nil, 36, + nil, nil, nil, 36, 36, nil, nil, nil, 36, nil, + 36, 36, 36, 36, 36, 36, 36, nil, nil, nil, + nil, nil, 36, 36, 36, 36, 36, 36, 36, nil, + nil, 36, nil, nil, nil, nil, nil, nil, 36, nil, + nil, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, nil, 36, 36, nil, 36, 36, 36, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 36, + nil, nil, 36, nil, nil, 36, 36, nil, nil, 36, + nil, 36, nil, 36, nil, 36, nil, nil, nil, nil, + nil, nil, nil, 36, nil, nil, nil, nil, 36, 36, + 36, 36, 36, 36, nil, nil, nil, 36, 36, nil, + nil, nil, nil, nil, nil, 36, nil, 36, 36, 36, + 36, nil, 36, 36, nil, nil, 36, 36, 37, 37, + 37, nil, 37, nil, nil, nil, 37, 37, nil, nil, + nil, 37, nil, 37, 37, 37, 37, 37, 37, 37, + nil, nil, nil, nil, nil, 37, 37, 37, 37, 37, + 37, 37, nil, nil, 37, nil, nil, nil, nil, nil, + nil, 37, nil, nil, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, nil, 37, 37, nil, + 37, 37, 37, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 37, nil, nil, 37, nil, nil, 37, 37, + nil, nil, 37, nil, 37, nil, 37, nil, 37, nil, + nil, nil, nil, nil, nil, nil, 37, nil, nil, nil, + nil, 37, 37, 37, 37, 37, 37, nil, nil, nil, + 37, 37, nil, nil, nil, nil, nil, nil, 37, nil, + 37, 37, 37, 37, nil, 37, 37, nil, nil, 37, + 37, 47, 47, 47, nil, 47, nil, nil, nil, 47, + 47, nil, nil, nil, 47, nil, 47, 47, 47, 47, + 47, 47, 47, nil, nil, nil, nil, nil, 47, 47, + 47, 47, 47, 47, 47, nil, nil, 47, nil, nil, + nil, nil, nil, nil, 47, nil, nil, 47, 47, 47, + 47, 47, 47, 47, 47, nil, 47, 47, 47, nil, + 47, 47, nil, 47, 47, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 47, nil, nil, 47, nil, + nil, 47, 47, nil, nil, 47, nil, nil, nil, nil, + nil, 47, nil, nil, nil, nil, nil, nil, nil, 47, + nil, nil, nil, nil, 47, 47, 47, 47, 47, 47, + nil, nil, nil, 47, 47, nil, nil, nil, nil, nil, + nil, 47, nil, nil, 47, 47, 47, nil, 47, 47, + nil, nil, 47, 47, 48, 48, 48, nil, 48, nil, + nil, nil, 48, 48, nil, nil, nil, 48, nil, 48, + 48, 48, 48, 48, 48, 48, nil, nil, nil, nil, + nil, 48, 48, 48, 48, 48, 48, 48, nil, nil, + 48, nil, nil, nil, nil, nil, nil, 48, nil, nil, + 48, 48, 48, 48, 48, 48, 48, 48, nil, 48, + 48, 48, nil, 48, 48, nil, 48, 48, 48, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 48, nil, + nil, 48, nil, nil, 48, 48, nil, nil, 48, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, 48, 48, 48, + 48, 48, 48, nil, nil, nil, 48, 48, nil, nil, + nil, nil, nil, nil, 48, nil, nil, 48, 48, 48, + nil, 48, 48, nil, nil, 48, 48, 50, 50, 50, + nil, 50, nil, nil, nil, 50, 50, nil, nil, nil, + 50, nil, 50, 50, 50, 50, 50, 50, 50, nil, + nil, nil, nil, nil, 50, 50, 50, 50, 50, 50, + 50, nil, nil, 50, nil, nil, nil, nil, nil, nil, + 50, nil, nil, 50, 50, 50, 50, 50, 50, 50, + 50, nil, 50, 50, 50, nil, 50, 50, nil, 50, + 50, 50, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 50, nil, nil, 50, nil, nil, 50, 50, nil, + nil, 50, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + 50, 50, 50, 50, 50, 50, nil, nil, nil, 50, + 50, nil, nil, nil, nil, nil, nil, 50, nil, nil, + 50, 50, 50, nil, 50, 50, nil, nil, 50, 50, + 51, 51, 51, nil, 51, nil, nil, nil, 51, 51, + nil, nil, nil, 51, nil, 51, 51, 51, 51, 51, + 51, 51, nil, nil, nil, nil, nil, 51, 51, 51, + 51, 51, 51, 51, nil, nil, 51, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 51, 51, 51, 51, + 51, 51, 51, 51, nil, 51, 51, 51, nil, 51, + 51, nil, 51, 51, 51, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 51, nil, nil, + 51, 51, nil, nil, 51, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, 51, 51, 51, 51, 51, 51, nil, + nil, nil, 51, 51, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 51, 51, 51, nil, 51, 51, nil, + nil, 51, 51, 53, 53, 53, nil, 53, nil, nil, + nil, 53, 53, nil, nil, nil, 53, nil, 53, 53, + 53, 53, 53, 53, 53, nil, nil, nil, nil, nil, + 53, 53, 53, 53, 53, 53, 53, nil, nil, 53, + nil, nil, nil, nil, nil, nil, 53, nil, nil, 53, + 53, 53, 53, 53, 53, 53, 53, nil, 53, 53, + 53, nil, 53, 53, nil, 53, 53, 53, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 53, nil, nil, + 53, nil, nil, 53, 53, nil, nil, 53, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, 53, 53, 53, 53, + 53, 53, nil, nil, nil, 53, 53, nil, nil, nil, + nil, nil, nil, 53, nil, nil, 53, 53, 53, 65, + 53, 53, nil, nil, 53, 53, 65, 65, 65, nil, + nil, 65, 65, 65, 1270, 65, 1270, 1270, 1270, 1270, + 1270, nil, nil, 65, nil, 65, 65, 65, nil, nil, + 1270, 804, 804, 804, 804, 65, 65, nil, 65, 65, + 65, 65, 65, nil, nil, nil, nil, 804, 804, 804, + nil, nil, 1270, nil, nil, nil, nil, nil, nil, nil, + 804, 804, nil, 1270, 1270, 804, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + nil, nil, 65, 65, 65, nil, nil, 65, nil, nil, + 65, nil, nil, 65, 65, nil, 65, 1270, 65, nil, + 65, nil, 65, 65, 65, 65, 65, 65, 65, nil, + 65, nil, 65, nil, 804, 804, 804, 804, 804, 804, + nil, nil, nil, 804, 804, 65, 65, 65, 65, nil, + 65, 804, 65, nil, 804, 804, 804, 65, 804, 804, + 486, 65, 67, 67, 67, 67, 67, 486, 486, 486, + 67, 67, 486, 486, 486, 67, 486, 67, 67, 67, + 67, 67, 67, 67, 486, 486, 486, 486, nil, 67, + 67, 67, 67, 67, 67, 67, 486, 486, 67, 486, + 486, 486, 486, 486, 67, 67, nil, 67, 67, 67, + 67, 67, 67, 67, 67, 67, nil, 67, 67, 67, + nil, 67, 67, nil, 67, 67, 67, 486, 486, 486, + 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, + 486, nil, nil, 486, 486, 486, 67, nil, 486, 67, + 486, 486, 67, 67, 486, 486, 67, 486, 67, 486, + nil, 486, 67, 486, 486, 486, 486, 486, 486, 486, + 67, 486, 486, 486, nil, 67, 67, 67, 67, 67, + 67, nil, nil, nil, 67, 67, 486, 486, nil, 486, + nil, 486, 67, nil, nil, 67, 67, 67, 486, 67, + 67, nil, 486, 67, 67, 68, 68, 68, nil, 68, + nil, nil, nil, 68, 68, nil, nil, nil, 68, nil, + 68, 68, 68, 68, 68, 68, 68, nil, nil, nil, + nil, nil, 68, 68, 68, 68, 68, 68, 68, nil, + nil, 68, nil, nil, nil, nil, nil, nil, 68, nil, + nil, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, nil, 68, 68, nil, 68, 68, 68, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 68, + nil, nil, 68, nil, nil, 68, 68, nil, nil, 68, + nil, 68, nil, nil, nil, 68, nil, nil, nil, nil, + nil, nil, nil, 68, nil, nil, nil, nil, 68, 68, + 68, 68, 68, 68, nil, nil, nil, 68, 68, nil, + nil, nil, nil, nil, nil, 68, nil, 68, 68, 68, + 68, nil, 68, 68, nil, nil, 68, 68, 72, 72, + 72, nil, 72, nil, nil, nil, 72, 72, nil, nil, + nil, 72, nil, 72, 72, 72, 72, 72, 72, 72, + nil, nil, nil, nil, nil, 72, 72, 72, 72, 72, + 72, 72, nil, nil, 72, nil, nil, nil, nil, nil, + nil, 72, nil, nil, 72, 72, 72, 72, 72, 72, + 72, 72, nil, 72, 72, 72, nil, 72, 72, nil, + 72, 72, 72, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 72, nil, nil, 72, nil, nil, 72, 72, + nil, nil, 72, nil, nil, nil, nil, nil, 72, nil, + nil, nil, nil, nil, nil, nil, 72, nil, nil, nil, + nil, 72, 72, 72, 72, 72, 72, nil, nil, nil, + 72, 72, nil, nil, nil, nil, nil, nil, 72, nil, + nil, 72, 72, 72, nil, 72, 72, nil, nil, 72, + 72, 73, 73, 73, nil, 73, nil, nil, nil, 73, + 73, nil, nil, nil, 73, nil, 73, 73, 73, 73, + 73, 73, 73, nil, nil, nil, nil, nil, 73, 73, + 73, 73, 73, 73, 73, nil, nil, 73, nil, nil, + nil, nil, nil, nil, 73, nil, nil, 73, 73, 73, + 73, 73, 73, 73, 73, nil, 73, 73, 73, nil, + 73, 73, nil, 73, 73, 73, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 73, nil, nil, 73, nil, + nil, 73, 73, nil, nil, 73, nil, nil, nil, nil, + nil, 73, nil, nil, nil, nil, nil, nil, nil, 73, + nil, nil, nil, nil, 73, 73, 73, 73, 73, 73, + nil, nil, nil, 73, 73, nil, nil, nil, nil, nil, + nil, 73, nil, nil, 73, 73, 73, nil, 73, 73, + nil, nil, 73, 73, 76, 76, 76, nil, 76, nil, + nil, nil, 76, 76, nil, nil, nil, 76, nil, 76, + 76, 76, 76, 76, 76, 76, nil, nil, nil, nil, + nil, 76, 76, 76, 76, 76, 76, 76, nil, nil, + 76, nil, nil, nil, nil, nil, nil, 76, nil, nil, + 76, 76, 76, 76, 76, 76, 76, 76, nil, 76, + 76, 76, nil, 76, 76, nil, 76, 76, 76, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 76, nil, + nil, 76, nil, nil, 76, 76, nil, nil, 76, nil, + nil, nil, nil, nil, 76, nil, nil, nil, nil, nil, + nil, nil, 76, nil, nil, nil, nil, 76, 76, 76, + 76, 76, 76, nil, nil, nil, 76, 76, 76, nil, + nil, nil, nil, 76, 76, nil, nil, 76, 76, 76, + nil, 76, 76, nil, nil, 76, 76, 132, 132, 132, + 132, 132, nil, nil, nil, 132, 132, nil, nil, nil, + 132, nil, 132, 132, 132, 132, 132, 132, 132, nil, + nil, nil, nil, nil, 132, 132, 132, 132, 132, 132, + 132, nil, nil, 132, nil, nil, nil, nil, nil, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, nil, 132, 132, 132, nil, 132, 132, nil, 132, + 132, 132, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 132, nil, nil, 132, nil, nil, 132, 132, nil, + nil, 132, nil, 132, nil, nil, nil, 132, nil, nil, + nil, nil, nil, nil, nil, 132, nil, nil, nil, nil, + 132, 132, 132, 132, 132, 132, nil, nil, nil, 132, + 132, nil, nil, nil, nil, nil, 132, 132, nil, nil, + 132, 132, 132, nil, 132, 132, nil, nil, 132, 132, + 137, 137, 137, nil, 137, nil, nil, nil, 137, 137, + nil, nil, nil, 137, nil, 137, 137, 137, 137, 137, + 137, 137, nil, nil, nil, nil, nil, 137, 137, 137, + 137, 137, 137, 137, nil, nil, 137, nil, nil, nil, + nil, nil, nil, 137, nil, nil, 137, 137, 137, 137, + 137, 137, 137, 137, nil, 137, 137, 137, nil, 137, + 137, nil, 137, 137, 137, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 137, nil, nil, 137, nil, nil, + 137, 137, nil, nil, 137, nil, nil, nil, nil, nil, + 137, nil, nil, nil, nil, nil, nil, nil, 137, nil, + nil, nil, nil, 137, 137, 137, 137, 137, 137, nil, + nil, nil, 137, 137, nil, nil, nil, nil, nil, nil, + 137, nil, nil, 137, 137, 137, nil, 137, 137, nil, + nil, 137, 137, 138, 138, 138, nil, 138, nil, nil, + nil, 138, 138, nil, nil, nil, 138, nil, 138, 138, + 138, 138, 138, 138, 138, nil, nil, nil, nil, nil, + 138, 138, 138, 138, 138, 138, 138, nil, nil, 138, + nil, nil, nil, nil, nil, nil, 138, nil, nil, 138, + 138, 138, 138, 138, 138, 138, 138, nil, 138, 138, + 138, nil, 138, 138, nil, 138, 138, 138, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 138, nil, nil, + 138, nil, nil, 138, 138, nil, nil, 138, nil, nil, + nil, nil, nil, 138, nil, nil, nil, nil, nil, nil, + nil, 138, nil, nil, nil, nil, 138, 138, 138, 138, + 138, 138, nil, nil, nil, 138, 138, nil, nil, nil, + nil, nil, nil, 138, nil, nil, 138, 138, 138, nil, + 138, 138, nil, nil, 138, 138, 139, 139, 139, nil, + 139, nil, nil, nil, 139, 139, nil, nil, nil, 139, + nil, 139, 139, 139, 139, 139, 139, 139, nil, nil, + nil, nil, nil, 139, 139, 139, 139, 139, 139, 139, + nil, nil, 139, nil, nil, nil, nil, nil, nil, 139, + nil, nil, 139, 139, 139, 139, 139, 139, 139, 139, + nil, 139, 139, 139, nil, 139, 139, nil, 139, 139, + 139, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 139, nil, nil, 139, nil, nil, 139, 139, nil, nil, + 139, nil, nil, nil, nil, nil, 139, nil, nil, nil, + nil, nil, nil, nil, 139, nil, nil, nil, nil, 139, + 139, 139, 139, 139, 139, nil, nil, nil, 139, 139, + nil, nil, nil, nil, nil, nil, 139, nil, nil, 139, + 139, 139, nil, 139, 139, nil, nil, 139, 139, 140, + 140, 140, nil, 140, nil, nil, nil, 140, 140, nil, + nil, nil, 140, nil, 140, 140, 140, 140, 140, 140, + 140, nil, nil, nil, nil, nil, 140, 140, 140, 140, + 140, 140, 140, nil, nil, 140, nil, nil, nil, nil, + nil, nil, 140, nil, nil, 140, 140, 140, 140, 140, + 140, 140, 140, nil, 140, 140, 140, nil, 140, 140, + nil, 140, 140, 140, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 140, nil, nil, 140, nil, nil, 140, + 140, nil, nil, 140, nil, nil, nil, nil, nil, 140, + nil, nil, nil, nil, nil, nil, nil, 140, nil, nil, + nil, nil, 140, 140, 140, 140, 140, 140, nil, nil, + nil, 140, 140, nil, nil, nil, nil, nil, nil, 140, + nil, nil, 140, 140, 140, nil, 140, 140, nil, nil, + 140, 140, 141, 141, 141, 141, 141, nil, nil, nil, + 141, 141, nil, nil, nil, 141, nil, 141, 141, 141, + 141, 141, 141, 141, nil, nil, nil, nil, nil, 141, + 141, 141, 141, 141, 141, 141, nil, nil, 141, nil, + nil, nil, nil, nil, 141, 141, nil, 141, 141, 141, + 141, 141, 141, 141, 141, 141, nil, 141, 141, 141, + nil, 141, 141, nil, 141, 141, 141, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 141, nil, nil, 141, + nil, nil, 141, 141, nil, nil, 141, nil, 141, nil, + nil, nil, 141, nil, nil, nil, nil, nil, nil, nil, + 141, nil, nil, nil, nil, 141, 141, 141, 141, 141, + 141, nil, nil, nil, 141, 141, nil, nil, nil, nil, + nil, nil, 141, nil, nil, 141, 141, 141, nil, 141, + 141, nil, nil, 141, 141, 226, 226, 226, nil, 226, + nil, nil, nil, 226, 226, nil, nil, nil, 226, nil, + 226, 226, 226, 226, 226, 226, 226, nil, nil, nil, + nil, nil, 226, 226, 226, 226, 226, 226, 226, nil, + nil, 226, nil, nil, nil, nil, nil, nil, 226, nil, + nil, 226, 226, 226, 226, 226, 226, 226, 226, nil, + 226, 226, 226, nil, 226, 226, nil, 226, 226, 226, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 226, + nil, nil, 226, nil, nil, 226, 226, nil, nil, 226, + nil, 226, nil, nil, nil, 226, nil, nil, nil, nil, + nil, nil, nil, 226, nil, nil, nil, nil, 226, 226, + 226, 226, 226, 226, nil, nil, nil, 226, 226, nil, + nil, nil, nil, nil, nil, 226, nil, nil, 226, 226, + 226, nil, 226, 226, nil, nil, 226, 226, 227, 227, + 227, nil, 227, nil, nil, nil, 227, 227, nil, nil, + nil, 227, nil, 227, 227, 227, 227, 227, 227, 227, + nil, nil, nil, nil, nil, 227, 227, 227, 227, 227, + 227, 227, nil, nil, 227, nil, nil, nil, nil, nil, + nil, 227, nil, nil, 227, 227, 227, 227, 227, 227, + 227, 227, nil, 227, 227, 227, nil, 227, 227, nil, + 227, 227, 227, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 227, nil, nil, 227, nil, nil, 227, 227, + nil, nil, 227, nil, 227, nil, nil, nil, 227, nil, + nil, nil, nil, nil, nil, nil, 227, nil, nil, nil, + nil, 227, 227, 227, 227, 227, 227, nil, nil, nil, + 227, 227, nil, nil, nil, nil, nil, nil, 227, nil, + nil, 227, 227, 227, nil, 227, 227, nil, nil, 227, + 227, 228, 228, 228, nil, 228, nil, nil, nil, 228, + 228, nil, nil, nil, 228, nil, 228, 228, 228, 228, + 228, 228, 228, nil, nil, nil, nil, nil, 228, 228, + 228, 228, 228, 228, 228, nil, nil, 228, nil, nil, + nil, nil, nil, nil, 228, nil, nil, 228, 228, 228, + 228, 228, 228, 228, 228, nil, 228, 228, 228, nil, + 228, 228, nil, 228, 228, 228, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 228, nil, nil, 228, nil, + nil, 228, 228, nil, nil, 228, nil, nil, nil, nil, + nil, 228, nil, nil, nil, nil, nil, nil, nil, 228, + nil, nil, nil, nil, 228, 228, 228, 228, 228, 228, + nil, nil, nil, 228, 228, nil, nil, nil, nil, nil, + nil, 228, nil, nil, 228, 228, 228, nil, 228, 228, + nil, nil, 228, 228, 229, 229, 229, nil, 229, nil, + nil, nil, 229, 229, nil, nil, nil, 229, nil, 229, + 229, 229, 229, 229, 229, 229, nil, nil, nil, nil, + nil, 229, 229, 229, 229, 229, 229, 229, nil, nil, + 229, nil, nil, nil, nil, nil, nil, 229, nil, nil, + 229, 229, 229, 229, 229, 229, 229, 229, nil, 229, + 229, 229, nil, 229, 229, nil, 229, 229, 229, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 229, nil, + nil, 229, nil, nil, 229, 229, nil, nil, 229, nil, + nil, nil, nil, nil, 229, nil, nil, nil, nil, nil, + nil, nil, 229, nil, nil, nil, nil, 229, 229, 229, + 229, 229, 229, nil, nil, nil, 229, 229, nil, nil, + nil, nil, nil, nil, 229, nil, nil, 229, 229, 229, + nil, 229, 229, nil, nil, 229, 229, 230, 230, 230, + nil, 230, nil, nil, nil, 230, 230, nil, nil, nil, + 230, nil, 230, 230, 230, 230, 230, 230, 230, nil, + nil, nil, nil, nil, 230, 230, 230, 230, 230, 230, + 230, nil, nil, 230, nil, nil, nil, nil, nil, nil, + 230, nil, nil, 230, 230, 230, 230, 230, 230, 230, + 230, nil, 230, 230, 230, nil, 230, 230, nil, 230, + 230, 230, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 230, nil, nil, 230, nil, nil, 230, 230, nil, + nil, 230, nil, nil, nil, nil, nil, 230, nil, nil, + nil, nil, nil, nil, nil, 230, nil, nil, nil, nil, + 230, 230, 230, 230, 230, 230, nil, nil, nil, 230, + 230, nil, nil, nil, nil, nil, nil, 230, nil, nil, + 230, 230, 230, nil, 230, 230, nil, nil, 230, 230, + 231, 231, 231, nil, 231, nil, nil, nil, 231, 231, + nil, nil, nil, 231, nil, 231, 231, 231, 231, 231, + 231, 231, nil, nil, nil, nil, nil, 231, 231, 231, + 231, 231, 231, 231, nil, nil, 231, nil, nil, nil, + nil, nil, nil, 231, nil, nil, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, nil, 231, + 231, nil, 231, 231, 231, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 231, nil, nil, 231, nil, nil, + 231, 231, nil, nil, 231, nil, 231, nil, 231, nil, + 231, nil, nil, nil, nil, nil, nil, nil, 231, nil, + nil, nil, nil, 231, 231, 231, 231, 231, 231, nil, + nil, nil, 231, 231, nil, nil, nil, nil, nil, nil, + 231, nil, 231, 231, 231, 231, nil, 231, 231, nil, + nil, 231, 231, 244, 244, 244, nil, 244, nil, nil, + nil, 244, 244, nil, nil, nil, 244, nil, 244, 244, + 244, 244, 244, 244, 244, nil, nil, nil, nil, nil, + 244, 244, 244, 244, 244, 244, 244, nil, nil, 244, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 244, + 244, 244, 244, 244, 244, 244, 244, nil, 244, 244, + 244, nil, 244, 244, nil, 244, 244, 244, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 244, nil, nil, 244, 244, nil, nil, 244, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 244, 244, 244, 244, + 244, 244, nil, nil, nil, 244, 244, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 244, 244, 244, nil, + 244, 244, nil, nil, 244, 244, 245, 245, 245, nil, + 245, nil, nil, nil, 245, 245, nil, nil, nil, 245, + nil, 245, 245, 245, 245, 245, 245, 245, nil, nil, + nil, nil, nil, 245, 245, 245, 245, 245, 245, 245, + nil, nil, 245, nil, nil, nil, nil, nil, nil, 245, + nil, nil, 245, 245, 245, 245, 245, 245, 245, 245, + nil, 245, 245, 245, nil, 245, 245, nil, 245, 245, + 245, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, 245, nil, nil, 245, 245, nil, nil, + 245, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 245, + 245, 245, 245, 245, 245, nil, nil, nil, 245, 245, + nil, nil, nil, nil, nil, nil, 245, nil, nil, 245, + 245, 245, nil, 245, 245, nil, nil, 245, 245, 246, + 246, 246, nil, 246, nil, nil, nil, 246, 246, nil, + nil, nil, 246, nil, 246, 246, 246, 246, 246, 246, + 246, nil, nil, nil, nil, nil, 246, 246, 246, 246, + 246, 246, 246, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 246, nil, nil, 246, 246, 246, 246, 246, + 246, 246, 246, nil, 246, 246, 246, nil, 246, 246, + nil, 246, 246, 246, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 246, nil, nil, 246, nil, nil, 246, + 246, nil, nil, 246, nil, nil, nil, nil, nil, 246, + nil, nil, nil, nil, nil, nil, nil, 246, nil, nil, + nil, nil, 246, 246, 246, 246, 246, 246, nil, nil, + nil, 246, 246, 246, nil, nil, nil, nil, nil, 246, + nil, nil, 246, 246, 246, nil, 246, 246, nil, nil, + 246, 246, 257, 257, 257, nil, 257, nil, nil, nil, + 257, 257, nil, nil, nil, 257, nil, 257, 257, 257, + 257, 257, 257, 257, nil, nil, nil, nil, nil, 257, + 257, 257, 257, 257, 257, 257, nil, nil, 257, nil, + nil, nil, nil, nil, nil, 257, nil, nil, 257, 257, + 257, 257, 257, 257, 257, 257, nil, 257, 257, 257, + nil, 257, 257, nil, 257, 257, 257, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, 257, + nil, nil, 257, 257, nil, nil, 257, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 257, 257, 257, 257, 257, + 257, nil, nil, nil, 257, 257, nil, nil, nil, nil, + nil, nil, 257, nil, nil, 257, 257, 257, nil, 257, + 257, nil, nil, 257, 257, 264, 264, 264, nil, 264, + nil, nil, nil, 264, 264, nil, nil, nil, 264, nil, + 264, 264, 264, 264, 264, 264, 264, nil, nil, nil, + nil, nil, 264, 264, 264, 264, 264, 264, 264, nil, + nil, 264, nil, nil, nil, nil, nil, nil, 264, nil, + nil, 264, 264, 264, 264, 264, 264, 264, 264, nil, + 264, 264, 264, nil, 264, 264, nil, 264, 264, 264, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 264, + nil, nil, 264, nil, nil, 264, 264, nil, nil, 264, + nil, nil, nil, nil, nil, 264, nil, nil, nil, nil, + nil, nil, nil, 264, nil, nil, nil, nil, 264, 264, + 264, 264, 264, 264, nil, nil, nil, 264, 264, nil, + nil, nil, nil, nil, nil, 264, nil, nil, 264, 264, + 264, nil, 264, 264, nil, nil, 264, 264, 265, 265, + 265, nil, 265, nil, nil, nil, 265, 265, nil, nil, + nil, 265, nil, 265, 265, 265, 265, 265, 265, 265, + nil, nil, nil, nil, nil, 265, 265, 265, 265, 265, + 265, 265, nil, nil, 265, nil, nil, nil, nil, nil, + nil, 265, nil, nil, 265, 265, 265, 265, 265, 265, + 265, 265, nil, 265, 265, 265, nil, 265, 265, nil, + 265, 265, 265, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 265, nil, nil, 265, nil, nil, 265, 265, + nil, nil, 265, nil, nil, nil, nil, nil, 265, nil, + nil, nil, nil, nil, nil, nil, 265, nil, nil, nil, + nil, 265, 265, 265, 265, 265, 265, nil, nil, nil, + 265, 265, nil, nil, nil, nil, nil, nil, 265, nil, + nil, 265, 265, 265, nil, 265, 265, nil, nil, 265, + 265, 266, 266, 266, nil, 266, nil, nil, nil, 266, + 266, nil, nil, nil, 266, nil, 266, 266, 266, 266, + 266, 266, 266, nil, nil, nil, nil, nil, 266, 266, + 266, 266, 266, 266, 266, nil, nil, 266, nil, nil, + nil, nil, nil, nil, 266, nil, nil, 266, 266, 266, + 266, 266, 266, 266, 266, nil, 266, 266, 266, nil, + 266, 266, nil, 266, 266, 266, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 266, nil, nil, 266, nil, + nil, 266, 266, nil, nil, 266, nil, nil, nil, nil, + nil, 266, nil, nil, nil, nil, nil, nil, nil, 266, + nil, nil, nil, nil, 266, 266, 266, 266, 266, 266, + nil, nil, nil, 266, 266, nil, nil, nil, nil, nil, + nil, 266, nil, nil, 266, 266, 266, nil, 266, 266, + nil, nil, 266, 266, 267, 267, 267, nil, 267, nil, + nil, nil, 267, 267, nil, nil, nil, 267, nil, 267, + 267, 267, 267, 267, 267, 267, nil, nil, nil, nil, + nil, 267, 267, 267, 267, 267, 267, 267, nil, nil, + 267, nil, nil, nil, nil, nil, nil, 267, nil, nil, + 267, 267, 267, 267, 267, 267, 267, 267, nil, 267, + 267, 267, nil, 267, 267, nil, 267, 267, 267, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 267, nil, + nil, 267, nil, nil, 267, 267, nil, nil, 267, nil, + nil, nil, nil, nil, 267, nil, nil, nil, nil, nil, + nil, nil, 267, nil, nil, nil, nil, 267, 267, 267, + 267, 267, 267, nil, nil, nil, 267, 267, nil, nil, + nil, nil, nil, nil, 267, nil, nil, 267, 267, 267, + nil, 267, 267, nil, nil, 267, 267, 268, 268, 268, + nil, 268, nil, nil, nil, 268, 268, nil, nil, nil, + 268, nil, 268, 268, 268, 268, 268, 268, 268, nil, + nil, nil, nil, nil, 268, 268, 268, 268, 268, 268, + 268, nil, nil, 268, nil, nil, nil, nil, nil, nil, + 268, nil, nil, 268, 268, 268, 268, 268, 268, 268, + 268, nil, 268, 268, 268, nil, 268, 268, nil, 268, + 268, 268, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 268, nil, nil, 268, nil, nil, 268, 268, nil, + nil, 268, nil, nil, nil, nil, nil, 268, nil, nil, + nil, nil, nil, nil, nil, 268, nil, nil, nil, nil, + 268, 268, 268, 268, 268, 268, nil, nil, nil, 268, + 268, nil, nil, nil, nil, nil, nil, 268, nil, nil, + 268, 268, 268, nil, 268, 268, nil, nil, 268, 268, + 269, 269, 269, nil, 269, nil, nil, nil, 269, 269, + nil, nil, nil, 269, nil, 269, 269, 269, 269, 269, + 269, 269, nil, nil, nil, nil, nil, 269, 269, 269, + 269, 269, 269, 269, nil, nil, 269, nil, nil, nil, + nil, nil, nil, 269, nil, nil, 269, 269, 269, 269, + 269, 269, 269, 269, nil, 269, 269, 269, nil, 269, + 269, nil, 269, 269, 269, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 269, nil, nil, 269, nil, nil, + 269, 269, nil, nil, 269, nil, nil, nil, nil, nil, + 269, nil, nil, nil, nil, nil, nil, nil, 269, nil, + nil, nil, nil, 269, 269, 269, 269, 269, 269, nil, + nil, nil, 269, 269, nil, nil, nil, nil, nil, nil, + 269, nil, nil, 269, 269, 269, nil, 269, 269, nil, + nil, 269, 269, 270, 270, 270, nil, 270, nil, nil, + nil, 270, 270, nil, nil, nil, 270, nil, 270, 270, + 270, 270, 270, 270, 270, nil, nil, nil, nil, nil, + 270, 270, 270, 270, 270, 270, 270, nil, nil, 270, + nil, nil, nil, nil, nil, nil, 270, nil, nil, 270, + 270, 270, 270, 270, 270, 270, 270, nil, 270, 270, + 270, nil, 270, 270, nil, 270, 270, 270, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 270, nil, nil, + 270, nil, nil, 270, 270, nil, nil, 270, nil, nil, + nil, nil, nil, 270, nil, nil, nil, nil, nil, nil, + nil, 270, nil, nil, nil, nil, 270, 270, 270, 270, + 270, 270, nil, nil, nil, 270, 270, nil, nil, nil, + nil, nil, nil, 270, nil, nil, 270, 270, 270, nil, + 270, 270, nil, nil, 270, 270, 271, 271, 271, nil, + 271, nil, nil, nil, 271, 271, nil, nil, nil, 271, + nil, 271, 271, 271, 271, 271, 271, 271, nil, nil, + nil, nil, nil, 271, 271, 271, 271, 271, 271, 271, + nil, nil, 271, nil, nil, nil, nil, nil, nil, 271, + nil, nil, 271, 271, 271, 271, 271, 271, 271, 271, + nil, 271, 271, 271, nil, 271, 271, nil, 271, 271, + 271, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 271, nil, nil, 271, nil, nil, 271, 271, nil, nil, + 271, nil, nil, nil, nil, nil, 271, nil, nil, nil, + nil, nil, nil, nil, 271, nil, nil, nil, nil, 271, + 271, 271, 271, 271, 271, nil, nil, nil, 271, 271, + nil, nil, nil, nil, nil, nil, 271, nil, nil, 271, + 271, 271, nil, 271, 271, nil, nil, 271, 271, 272, + 272, 272, nil, 272, nil, nil, nil, 272, 272, nil, + nil, nil, 272, nil, 272, 272, 272, 272, 272, 272, + 272, nil, nil, nil, nil, nil, 272, 272, 272, 272, + 272, 272, 272, nil, nil, 272, nil, nil, nil, nil, + nil, nil, 272, nil, nil, 272, 272, 272, 272, 272, + 272, 272, 272, nil, 272, 272, 272, nil, 272, 272, + nil, 272, 272, 272, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 272, nil, nil, 272, nil, nil, 272, + 272, nil, nil, 272, nil, nil, nil, nil, nil, 272, + nil, nil, nil, nil, nil, nil, nil, 272, nil, nil, + nil, nil, 272, 272, 272, 272, 272, 272, nil, nil, + nil, 272, 272, nil, nil, nil, nil, nil, nil, 272, + nil, nil, 272, 272, 272, nil, 272, 272, nil, nil, + 272, 272, 273, 273, 273, nil, 273, nil, nil, nil, + 273, 273, nil, nil, nil, 273, nil, 273, 273, 273, + 273, 273, 273, 273, nil, nil, nil, nil, nil, 273, + 273, 273, 273, 273, 273, 273, nil, nil, 273, nil, + nil, nil, nil, nil, nil, 273, nil, nil, 273, 273, + 273, 273, 273, 273, 273, 273, nil, 273, 273, 273, + nil, 273, 273, nil, 273, 273, 273, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 273, nil, nil, 273, + nil, nil, 273, 273, nil, nil, 273, nil, nil, nil, + nil, nil, 273, nil, nil, nil, nil, nil, nil, nil, + 273, nil, nil, nil, nil, 273, 273, 273, 273, 273, + 273, nil, nil, nil, 273, 273, nil, nil, nil, nil, + nil, nil, 273, nil, nil, 273, 273, 273, nil, 273, + 273, nil, nil, 273, 273, 274, 274, 274, nil, 274, + nil, nil, nil, 274, 274, nil, nil, nil, 274, nil, + 274, 274, 274, 274, 274, 274, 274, nil, nil, nil, + nil, nil, 274, 274, 274, 274, 274, 274, 274, nil, + nil, 274, nil, nil, nil, nil, nil, nil, 274, nil, + nil, 274, 274, 274, 274, 274, 274, 274, 274, nil, + 274, 274, 274, nil, 274, 274, nil, 274, 274, 274, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 274, + nil, nil, 274, nil, nil, 274, 274, nil, nil, 274, + nil, nil, nil, nil, nil, 274, nil, nil, nil, nil, + nil, nil, nil, 274, nil, nil, nil, nil, 274, 274, + 274, 274, 274, 274, nil, nil, nil, 274, 274, nil, + nil, nil, nil, nil, nil, 274, nil, nil, 274, 274, + 274, nil, 274, 274, nil, nil, 274, 274, 275, 275, + 275, nil, 275, nil, nil, nil, 275, 275, nil, nil, + nil, 275, nil, 275, 275, 275, 275, 275, 275, 275, + nil, nil, nil, nil, nil, 275, 275, 275, 275, 275, + 275, 275, nil, nil, 275, nil, nil, nil, nil, nil, + nil, 275, nil, nil, 275, 275, 275, 275, 275, 275, + 275, 275, nil, 275, 275, 275, nil, 275, 275, nil, + 275, 275, 275, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 275, nil, nil, 275, nil, nil, 275, 275, + nil, nil, 275, nil, nil, nil, nil, nil, 275, nil, + nil, nil, nil, nil, nil, nil, 275, nil, nil, nil, + nil, 275, 275, 275, 275, 275, 275, nil, nil, nil, + 275, 275, nil, nil, nil, nil, nil, nil, 275, nil, + nil, 275, 275, 275, nil, 275, 275, nil, nil, 275, + 275, 276, 276, 276, nil, 276, nil, nil, nil, 276, + 276, nil, nil, nil, 276, nil, 276, 276, 276, 276, + 276, 276, 276, nil, nil, nil, nil, nil, 276, 276, + 276, 276, 276, 276, 276, nil, nil, 276, nil, nil, + nil, nil, nil, nil, 276, nil, nil, 276, 276, 276, + 276, 276, 276, 276, 276, nil, 276, 276, 276, nil, + 276, 276, nil, 276, 276, 276, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 276, nil, nil, 276, nil, + nil, 276, 276, nil, nil, 276, nil, nil, nil, nil, + nil, 276, nil, nil, nil, nil, nil, nil, nil, 276, + nil, nil, nil, nil, 276, 276, 276, 276, 276, 276, + nil, nil, nil, 276, 276, nil, nil, nil, nil, nil, + nil, 276, nil, nil, 276, 276, 276, nil, 276, 276, + nil, nil, 276, 276, 277, 277, 277, nil, 277, nil, + nil, nil, 277, 277, nil, nil, nil, 277, nil, 277, + 277, 277, 277, 277, 277, 277, nil, nil, nil, nil, + nil, 277, 277, 277, 277, 277, 277, 277, nil, nil, + 277, nil, nil, nil, nil, nil, nil, 277, nil, nil, + 277, 277, 277, 277, 277, 277, 277, 277, nil, 277, + 277, 277, nil, 277, 277, nil, 277, 277, 277, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 277, nil, + nil, 277, nil, nil, 277, 277, nil, nil, 277, nil, + nil, nil, nil, nil, 277, nil, nil, nil, nil, nil, + nil, nil, 277, nil, nil, nil, nil, 277, 277, 277, + 277, 277, 277, nil, nil, nil, 277, 277, nil, nil, + nil, nil, nil, nil, 277, nil, nil, 277, 277, 277, + nil, 277, 277, nil, nil, 277, 277, 278, 278, 278, + nil, 278, nil, nil, nil, 278, 278, nil, nil, nil, + 278, nil, 278, 278, 278, 278, 278, 278, 278, nil, + nil, nil, nil, nil, 278, 278, 278, 278, 278, 278, + 278, nil, nil, 278, nil, nil, nil, nil, nil, nil, + 278, nil, nil, 278, 278, 278, 278, 278, 278, 278, + 278, nil, 278, 278, 278, nil, 278, 278, nil, 278, + 278, 278, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 278, nil, nil, 278, nil, nil, 278, 278, nil, + nil, 278, nil, nil, nil, nil, nil, 278, nil, nil, + nil, nil, nil, nil, nil, 278, nil, nil, nil, nil, + 278, 278, 278, 278, 278, 278, nil, nil, nil, 278, + 278, nil, nil, nil, nil, nil, nil, 278, nil, nil, + 278, 278, 278, nil, 278, 278, nil, nil, 278, 278, + 279, 279, 279, nil, 279, nil, nil, nil, 279, 279, + nil, nil, nil, 279, nil, 279, 279, 279, 279, 279, + 279, 279, nil, nil, nil, nil, nil, 279, 279, 279, + 279, 279, 279, 279, nil, nil, 279, nil, nil, nil, + nil, nil, nil, 279, nil, nil, 279, 279, 279, 279, + 279, 279, 279, 279, nil, 279, 279, 279, nil, 279, + 279, nil, 279, 279, 279, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 279, nil, nil, 279, nil, nil, + 279, 279, nil, nil, 279, nil, nil, nil, nil, nil, + 279, nil, nil, nil, nil, nil, nil, nil, 279, nil, + nil, nil, nil, 279, 279, 279, 279, 279, 279, nil, + nil, nil, 279, 279, nil, nil, nil, nil, nil, nil, + 279, nil, nil, 279, 279, 279, nil, 279, 279, nil, + nil, 279, 279, 280, 280, 280, nil, 280, nil, nil, + nil, 280, 280, nil, nil, nil, 280, nil, 280, 280, + 280, 280, 280, 280, 280, nil, nil, nil, nil, nil, + 280, 280, 280, 280, 280, 280, 280, nil, nil, 280, + nil, nil, nil, nil, nil, nil, 280, nil, nil, 280, + 280, 280, 280, 280, 280, 280, 280, nil, 280, 280, + 280, nil, 280, 280, nil, 280, 280, 280, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 280, nil, nil, + 280, nil, nil, 280, 280, nil, nil, 280, nil, nil, + nil, nil, nil, 280, nil, nil, nil, nil, nil, nil, + nil, 280, nil, nil, nil, nil, 280, 280, 280, 280, + 280, 280, nil, nil, nil, 280, 280, nil, nil, nil, + nil, nil, nil, 280, nil, nil, 280, 280, 280, nil, + 280, 280, nil, nil, 280, 280, 281, 281, 281, nil, + 281, nil, nil, nil, 281, 281, nil, nil, nil, 281, + nil, 281, 281, 281, 281, 281, 281, 281, nil, nil, + nil, nil, nil, 281, 281, 281, 281, 281, 281, 281, + nil, nil, 281, nil, nil, nil, nil, nil, nil, 281, + nil, nil, 281, 281, 281, 281, 281, 281, 281, 281, + nil, 281, 281, 281, nil, 281, 281, nil, 281, 281, + 281, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 281, nil, nil, 281, nil, nil, 281, 281, nil, nil, + 281, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, 281, + 281, 281, 281, 281, 281, nil, nil, nil, 281, 281, + nil, nil, nil, nil, nil, nil, 281, nil, nil, 281, + 281, 281, nil, 281, 281, nil, nil, 281, 281, 282, + 282, 282, nil, 282, nil, nil, nil, 282, 282, nil, + nil, nil, 282, nil, 282, 282, 282, 282, 282, 282, + 282, nil, nil, nil, nil, nil, 282, 282, 282, 282, + 282, 282, 282, nil, nil, 282, nil, nil, nil, nil, + nil, nil, 282, nil, nil, 282, 282, 282, 282, 282, + 282, 282, 282, nil, 282, 282, 282, nil, 282, 282, + nil, 282, 282, 282, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 282, nil, nil, 282, nil, nil, 282, + 282, nil, nil, 282, nil, nil, nil, nil, nil, 282, + nil, nil, nil, nil, nil, nil, nil, 282, nil, nil, + nil, nil, 282, 282, 282, 282, 282, 282, nil, nil, + nil, 282, 282, nil, nil, nil, nil, nil, nil, 282, + nil, nil, 282, 282, 282, nil, 282, 282, nil, nil, + 282, 282, 283, 283, 283, nil, 283, nil, nil, nil, + 283, 283, nil, nil, nil, 283, nil, 283, 283, 283, + 283, 283, 283, 283, nil, nil, nil, nil, nil, 283, + 283, 283, 283, 283, 283, 283, nil, nil, 283, nil, + nil, nil, nil, nil, nil, 283, nil, nil, 283, 283, + 283, 283, 283, 283, 283, 283, nil, 283, 283, 283, + nil, 283, 283, nil, 283, 283, 283, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 283, nil, nil, 283, + nil, nil, 283, 283, nil, nil, 283, nil, nil, nil, + nil, nil, 283, nil, nil, nil, nil, nil, nil, nil, + 283, nil, nil, nil, nil, 283, 283, 283, 283, 283, + 283, nil, nil, nil, 283, 283, nil, nil, nil, nil, + nil, nil, 283, nil, nil, 283, 283, 283, nil, 283, + 283, nil, nil, 283, 283, 284, 284, 284, nil, 284, + nil, nil, nil, 284, 284, nil, nil, nil, 284, nil, + 284, 284, 284, 284, 284, 284, 284, nil, nil, nil, + nil, nil, 284, 284, 284, 284, 284, 284, 284, nil, + nil, 284, nil, nil, nil, nil, nil, nil, 284, nil, + nil, 284, 284, 284, 284, 284, 284, 284, 284, nil, + 284, 284, 284, nil, 284, 284, nil, 284, 284, 284, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 284, + nil, nil, 284, nil, nil, 284, 284, nil, nil, 284, + nil, nil, nil, nil, nil, 284, nil, nil, nil, nil, + nil, nil, nil, 284, nil, nil, nil, nil, 284, 284, + 284, 284, 284, 284, nil, nil, nil, 284, 284, nil, + nil, nil, nil, nil, nil, 284, nil, nil, 284, 284, + 284, nil, 284, 284, nil, nil, 284, 284, 285, 285, + 285, nil, 285, nil, nil, nil, 285, 285, nil, nil, + nil, 285, nil, 285, 285, 285, 285, 285, 285, 285, + nil, nil, nil, nil, nil, 285, 285, 285, 285, 285, + 285, 285, nil, nil, 285, nil, nil, nil, nil, nil, + nil, 285, nil, nil, 285, 285, 285, 285, 285, 285, + 285, 285, nil, 285, 285, 285, nil, 285, 285, nil, + 285, 285, 285, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 285, nil, nil, 285, nil, nil, 285, 285, + nil, nil, 285, nil, nil, nil, nil, nil, 285, nil, + nil, nil, nil, nil, nil, nil, 285, nil, nil, nil, + nil, 285, 285, 285, 285, 285, 285, nil, nil, nil, + 285, 285, nil, nil, nil, nil, nil, nil, 285, nil, + nil, 285, 285, 285, nil, 285, 285, nil, nil, 285, + 285, 290, 290, 290, nil, 290, nil, nil, nil, 290, + 290, nil, nil, nil, 290, nil, 290, 290, 290, 290, + 290, 290, 290, nil, nil, nil, nil, nil, 290, 290, + 290, 290, 290, 290, 290, nil, nil, 290, nil, nil, + nil, nil, nil, nil, 290, nil, nil, 290, 290, 290, + 290, 290, 290, 290, 290, nil, 290, 290, 290, nil, + 290, 290, nil, 290, 290, 290, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 290, nil, nil, 290, nil, + nil, 290, 290, nil, nil, 290, nil, nil, nil, nil, + nil, 290, nil, nil, nil, nil, nil, nil, nil, 290, + nil, nil, nil, nil, 290, 290, 290, 290, 290, 290, + nil, nil, nil, 290, 290, nil, nil, nil, nil, nil, + nil, 290, nil, nil, 290, 290, 290, nil, 290, 290, + nil, nil, 290, 290, 314, 314, 314, nil, 314, nil, + nil, nil, 314, 314, nil, nil, nil, 314, nil, 314, + 314, 314, 314, 314, 314, 314, nil, nil, nil, nil, + nil, 314, 314, 314, 314, 314, 314, 314, nil, nil, + 314, nil, nil, nil, nil, nil, nil, 314, nil, nil, + 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, + 314, 314, nil, 314, 314, nil, 314, 314, 314, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 314, nil, + nil, 314, nil, nil, 314, 314, nil, nil, 314, nil, + 314, nil, 314, nil, 314, nil, nil, nil, nil, nil, + nil, nil, 314, nil, nil, nil, nil, 314, 314, 314, + 314, 314, 314, nil, nil, nil, 314, 314, nil, nil, + nil, nil, nil, nil, 314, nil, 314, 314, 314, 314, + nil, 314, 314, nil, nil, 314, 314, 315, 315, 315, + nil, 315, nil, nil, nil, 315, 315, nil, nil, nil, + 315, nil, 315, 315, 315, 315, 315, 315, 315, nil, + nil, nil, nil, nil, 315, 315, 315, 315, 315, 315, + 315, nil, nil, 315, nil, nil, nil, nil, nil, nil, + 315, nil, nil, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 315, 315, nil, 315, 315, nil, 315, + 315, 315, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 315, nil, nil, 315, nil, nil, 315, 315, nil, + nil, 315, nil, 315, nil, 315, nil, 315, nil, nil, + nil, nil, nil, nil, nil, 315, nil, nil, nil, nil, + 315, 315, 315, 315, 315, 315, nil, nil, nil, 315, + 315, nil, nil, nil, nil, nil, nil, 315, nil, 315, + 315, 315, 315, nil, 315, 315, nil, nil, 315, 315, + 324, 324, 324, nil, 324, nil, nil, nil, 324, 324, + nil, nil, nil, 324, nil, 324, 324, 324, 324, 324, + 324, 324, nil, nil, nil, nil, nil, 324, 324, 324, + 324, 324, 324, 324, nil, nil, 324, nil, nil, nil, + nil, nil, nil, 324, nil, nil, 324, 324, 324, 324, + 324, 324, 324, 324, 324, 324, 324, 324, nil, 324, + 324, nil, 324, 324, 324, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 324, nil, nil, 324, nil, nil, + 324, 324, nil, nil, 324, nil, 324, nil, 324, nil, + 324, nil, nil, nil, nil, nil, nil, nil, 324, nil, + nil, nil, nil, 324, 324, 324, 324, 324, 324, nil, + nil, nil, 324, 324, 324, nil, nil, nil, nil, nil, + 324, nil, 324, 324, 324, 324, nil, 324, 324, nil, + nil, 324, 324, 331, 331, 331, nil, 331, nil, nil, + nil, 331, 331, nil, nil, nil, 331, nil, 331, 331, + 331, 331, 331, 331, 331, nil, nil, nil, nil, nil, + 331, 331, 331, 331, 331, 331, 331, nil, nil, 331, + nil, nil, nil, nil, nil, nil, 331, nil, nil, 331, + 331, 331, 331, 331, 331, 331, 331, nil, 331, 331, + 331, nil, 331, 331, nil, 331, 331, 331, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 331, nil, nil, + 331, nil, nil, 331, 331, nil, nil, 331, nil, nil, + nil, nil, nil, 331, nil, nil, nil, nil, nil, nil, + nil, 331, nil, nil, nil, nil, 331, 331, 331, 331, + 331, 331, nil, nil, nil, 331, 331, nil, nil, nil, + nil, nil, nil, 331, nil, nil, 331, 331, 331, nil, + 331, 331, nil, nil, 331, 331, 333, 333, 333, nil, + 333, nil, nil, nil, 333, 333, nil, nil, nil, 333, + nil, 333, 333, 333, 333, 333, 333, 333, nil, nil, + nil, nil, nil, 333, 333, 333, 333, 333, 333, 333, + nil, nil, 333, nil, nil, nil, nil, nil, nil, 333, + nil, nil, 333, 333, 333, 333, 333, 333, 333, 333, + nil, 333, 333, 333, nil, 333, 333, nil, 333, 333, + 333, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 333, nil, nil, 333, nil, nil, 333, 333, nil, nil, + 333, nil, nil, nil, nil, nil, 333, nil, nil, nil, + nil, nil, nil, nil, 333, nil, nil, nil, nil, 333, + 333, 333, 333, 333, 333, nil, nil, nil, 333, 333, + nil, nil, nil, nil, nil, nil, 333, nil, nil, 333, + 333, 333, nil, 333, 333, nil, nil, 333, 333, 336, + 336, 336, nil, 336, nil, nil, nil, 336, 336, nil, + nil, nil, 336, nil, 336, 336, 336, 336, 336, 336, + 336, nil, nil, nil, nil, nil, 336, 336, 336, 336, + 336, 336, 336, nil, nil, 336, nil, nil, nil, nil, + nil, nil, 336, nil, nil, 336, 336, 336, 336, 336, + 336, 336, 336, nil, 336, 336, 336, nil, 336, 336, + nil, 336, 336, 336, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 336, nil, nil, 336, nil, nil, 336, + 336, nil, nil, 336, nil, nil, nil, nil, nil, 336, + nil, nil, nil, nil, nil, nil, nil, 336, nil, nil, + nil, nil, 336, 336, 336, 336, 336, 336, nil, nil, + nil, 336, 336, nil, nil, nil, nil, nil, nil, 336, + nil, nil, 336, 336, 336, nil, 336, 336, nil, nil, + 336, 336, 337, 337, 337, nil, 337, nil, nil, nil, + 337, 337, nil, nil, nil, 337, nil, 337, 337, 337, + 337, 337, 337, 337, nil, nil, nil, nil, nil, 337, + 337, 337, 337, 337, 337, 337, nil, nil, 337, nil, + nil, nil, nil, nil, nil, 337, nil, nil, 337, 337, + 337, 337, 337, 337, 337, 337, nil, 337, 337, 337, + nil, 337, 337, nil, 337, 337, 337, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 337, nil, nil, 337, + nil, nil, 337, 337, nil, nil, 337, nil, nil, nil, + nil, nil, 337, nil, nil, nil, nil, nil, nil, nil, + 337, nil, nil, nil, nil, 337, 337, 337, 337, 337, + 337, nil, nil, nil, 337, 337, nil, nil, nil, nil, + nil, nil, 337, nil, nil, 337, 337, 337, nil, 337, + 337, nil, nil, 337, 337, 343, 343, 343, 343, 343, + nil, nil, nil, 343, 343, nil, nil, nil, 343, nil, + 343, 343, 343, 343, 343, 343, 343, nil, nil, nil, + nil, nil, 343, 343, 343, 343, 343, 343, 343, nil, + nil, 343, nil, nil, nil, nil, nil, 343, 343, nil, + 343, 343, 343, 343, 343, 343, 343, 343, 343, nil, + 343, 343, 343, nil, 343, 343, nil, 343, 343, 343, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 343, + nil, nil, 343, nil, nil, 343, 343, nil, nil, 343, + nil, 343, nil, nil, nil, 343, nil, nil, nil, nil, + nil, nil, nil, 343, nil, nil, nil, nil, 343, 343, + 343, 343, 343, 343, nil, nil, nil, 343, 343, nil, + nil, nil, nil, nil, nil, 343, nil, nil, 343, 343, + 343, nil, 343, 343, nil, nil, 343, 343, 379, 379, + 379, nil, 379, nil, nil, nil, 379, 379, nil, nil, + nil, 379, nil, 379, 379, 379, 379, 379, 379, 379, + nil, nil, nil, nil, nil, 379, 379, 379, 379, 379, + 379, 379, nil, nil, 379, nil, nil, nil, nil, nil, + nil, 379, nil, nil, 379, 379, 379, 379, 379, 379, + 379, 379, nil, 379, 379, 379, nil, 379, 379, nil, + 379, 379, 379, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 379, nil, nil, 379, nil, nil, 379, 379, + nil, nil, 379, nil, nil, nil, nil, nil, 379, nil, + nil, nil, nil, nil, nil, nil, 379, nil, nil, nil, + nil, 379, 379, 379, 379, 379, 379, nil, nil, nil, + 379, 379, nil, nil, nil, nil, nil, nil, 379, nil, + nil, 379, 379, 379, nil, 379, 379, nil, nil, 379, + 379, 381, 381, 381, nil, 381, nil, nil, nil, 381, + 381, nil, nil, nil, 381, nil, 381, 381, 381, 381, + 381, 381, 381, nil, nil, nil, nil, nil, 381, 381, + 381, 381, 381, 381, 381, nil, nil, 381, nil, nil, + nil, nil, nil, nil, 381, nil, nil, 381, 381, 381, + 381, 381, 381, 381, 381, nil, 381, 381, 381, nil, + 381, 381, nil, 381, 381, 381, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 381, nil, nil, 381, 381, + nil, 381, 381, nil, nil, 381, nil, nil, nil, nil, + nil, 381, nil, nil, nil, nil, nil, nil, nil, 381, + nil, nil, nil, nil, 381, 381, 381, 381, 381, 381, + nil, nil, nil, 381, 381, nil, nil, nil, nil, nil, + nil, 381, nil, nil, 381, 381, 381, nil, 381, 381, + nil, nil, 381, 381, 389, 389, 389, nil, 389, nil, + nil, nil, 389, 389, nil, nil, nil, 389, nil, 389, + 389, 389, 389, 389, 389, 389, nil, nil, nil, nil, + nil, 389, 389, 389, 389, 389, 389, 389, nil, nil, + 389, nil, nil, nil, nil, nil, nil, 389, nil, nil, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, nil, 389, 389, nil, 389, 389, 389, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 389, nil, + nil, 389, nil, nil, 389, 389, nil, nil, 389, nil, + nil, nil, nil, nil, 389, nil, nil, nil, nil, nil, + nil, nil, 389, nil, nil, nil, nil, 389, 389, 389, + 389, 389, 389, nil, nil, nil, 389, 389, nil, nil, + nil, nil, nil, nil, 389, nil, 389, 389, 389, 389, + nil, 389, 389, nil, nil, 389, 389, 394, 394, 394, + nil, 394, nil, nil, nil, 394, 394, nil, nil, nil, + 394, nil, 394, 394, 394, 394, 394, 394, 394, nil, + nil, nil, nil, nil, 394, 394, 394, 394, 394, 394, + 394, nil, nil, 394, nil, nil, nil, nil, nil, nil, + 394, nil, nil, 394, 394, 394, 394, 394, 394, 394, + 394, nil, 394, 394, 394, nil, 394, 394, nil, 394, + 394, 394, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 394, nil, nil, 394, nil, nil, 394, 394, nil, + nil, 394, nil, nil, nil, nil, nil, 394, nil, nil, + nil, nil, nil, nil, nil, 394, nil, nil, nil, nil, + 394, 394, 394, 394, 394, 394, nil, nil, nil, 394, + 394, nil, nil, nil, nil, nil, nil, 394, nil, nil, + 394, 394, 394, nil, 394, 394, nil, nil, 394, 394, + 415, 415, 415, nil, 415, nil, nil, nil, 415, 415, + nil, nil, nil, 415, nil, 415, 415, 415, 415, 415, + 415, 415, nil, nil, nil, nil, nil, 415, 415, 415, + 415, 415, 415, 415, nil, nil, 415, nil, nil, nil, + nil, nil, nil, 415, nil, nil, 415, 415, 415, 415, + 415, 415, 415, 415, nil, 415, 415, 415, nil, 415, + 415, nil, 415, 415, 415, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 415, nil, nil, 415, nil, nil, + 415, 415, nil, nil, 415, nil, nil, nil, nil, nil, + 415, nil, nil, nil, nil, nil, nil, nil, 415, nil, + nil, nil, nil, 415, 415, 415, 415, 415, 415, nil, + nil, nil, 415, 415, nil, nil, nil, nil, nil, nil, + 415, nil, nil, 415, 415, 415, nil, 415, 415, nil, + nil, 415, 415, 461, 461, 461, nil, 461, nil, nil, + nil, 461, 461, nil, nil, nil, 461, nil, 461, 461, + 461, 461, 461, 461, 461, nil, nil, nil, nil, nil, + 461, 461, 461, 461, 461, 461, 461, nil, nil, 461, + nil, nil, nil, nil, nil, nil, 461, nil, nil, 461, + 461, 461, 461, 461, 461, 461, 461, nil, 461, 461, + 461, nil, 461, 461, nil, 461, 461, 461, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 461, nil, nil, + 461, nil, nil, 461, 461, nil, nil, 461, nil, nil, + nil, nil, nil, 461, nil, nil, nil, nil, nil, nil, + nil, 461, nil, nil, nil, nil, 461, 461, 461, 461, + 461, 461, nil, nil, nil, 461, 461, nil, nil, nil, + nil, nil, nil, 461, nil, nil, 461, 461, 461, 495, + 461, 461, nil, nil, 461, 461, 495, 495, 495, nil, + nil, 495, 495, 495, 1287, 495, 1287, 1287, 1287, 1287, + 1287, nil, nil, 495, 495, 495, 495, 495, nil, nil, + 1287, nil, nil, nil, nil, 495, 495, nil, 495, 495, + 495, 495, 495, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1287, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1287, 1287, nil, 495, 495, 495, 495, + 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, + nil, nil, 495, 495, 495, nil, nil, 495, nil, nil, + 495, nil, nil, 495, 495, nil, 495, 1287, 495, nil, + 495, nil, 495, 495, 495, 495, 495, 495, 495, nil, + 495, 495, 495, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 495, 495, 495, 495, nil, + 495, 496, 495, nil, nil, nil, nil, 495, 496, 496, + 496, 495, nil, 496, 496, 496, nil, 496, nil, nil, + nil, nil, nil, nil, nil, 496, 496, 496, 496, 496, + nil, nil, nil, nil, nil, nil, nil, 496, 496, nil, + 496, 496, 496, 496, 496, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 496, 496, + 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, + 496, 496, nil, nil, 496, 496, 496, nil, nil, 496, + nil, nil, 496, nil, nil, 496, 496, nil, 496, nil, + 496, nil, 496, nil, 496, 496, 496, 496, 496, 496, + 496, nil, 496, 496, 496, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 496, 496, 496, + 496, nil, 496, nil, 496, nil, 497, 497, 497, 496, + 497, nil, nil, 496, 497, 497, nil, nil, nil, 497, + nil, 497, 497, 497, 497, 497, 497, 497, nil, nil, + nil, nil, nil, 497, 497, 497, 497, 497, 497, 497, + nil, nil, 497, nil, nil, nil, nil, nil, nil, 497, + nil, nil, 497, 497, 497, 497, 497, 497, 497, 497, + nil, 497, 497, 497, nil, 497, 497, nil, 497, 497, + 497, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 497, nil, nil, 497, nil, nil, 497, 497, nil, nil, + 497, nil, nil, nil, nil, nil, 497, nil, nil, nil, + nil, nil, nil, nil, 497, nil, nil, nil, nil, 497, + 497, 497, 497, 497, 497, nil, nil, nil, 497, 497, + nil, nil, nil, nil, nil, nil, 497, nil, nil, 497, + 497, 497, nil, 497, 497, nil, nil, 497, 497, 523, + 523, 523, nil, 523, nil, nil, nil, 523, 523, nil, + nil, nil, 523, nil, 523, 523, 523, 523, 523, 523, + 523, nil, nil, nil, nil, nil, 523, 523, 523, 523, + 523, 523, 523, nil, nil, 523, nil, nil, nil, nil, + nil, nil, 523, nil, nil, 523, 523, 523, 523, 523, + 523, 523, 523, nil, 523, 523, 523, nil, 523, 523, + nil, 523, 523, 523, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 523, nil, nil, 523, nil, nil, 523, + 523, nil, nil, 523, nil, nil, nil, nil, nil, 523, + nil, nil, nil, nil, nil, nil, nil, 523, nil, nil, + nil, nil, 523, 523, 523, 523, 523, 523, nil, nil, + nil, 523, 523, nil, nil, nil, nil, nil, nil, 523, + nil, nil, 523, 523, 523, nil, 523, 523, nil, nil, + 523, 523, 536, 536, 536, nil, 536, nil, nil, nil, + 536, 536, nil, nil, nil, 536, nil, 536, 536, 536, + 536, 536, 536, 536, nil, nil, nil, nil, nil, 536, + 536, 536, 536, 536, 536, 536, nil, nil, 536, nil, + nil, nil, nil, nil, nil, 536, nil, nil, 536, 536, + 536, 536, 536, 536, 536, 536, nil, 536, 536, 536, + nil, 536, 536, nil, 536, 536, 536, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 536, nil, nil, 536, + nil, nil, 536, 536, nil, nil, 536, nil, nil, nil, + nil, nil, 536, nil, nil, nil, nil, nil, nil, nil, + 536, nil, nil, nil, nil, 536, 536, 536, 536, 536, + 536, nil, nil, nil, 536, 536, nil, nil, nil, nil, + nil, nil, 536, nil, nil, 536, 536, 536, nil, 536, + 536, nil, nil, 536, 536, 546, 546, 546, nil, 546, + nil, nil, nil, 546, 546, nil, nil, nil, 546, nil, + 546, 546, 546, 546, 546, 546, 546, nil, nil, nil, + nil, nil, 546, 546, 546, 546, 546, 546, 546, nil, + nil, 546, nil, nil, nil, nil, nil, nil, 546, nil, + nil, 546, 546, 546, 546, 546, 546, 546, 546, 546, + 546, 546, 546, nil, 546, 546, nil, 546, 546, 546, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 546, + nil, nil, 546, nil, nil, 546, 546, nil, nil, 546, + nil, 546, nil, 546, nil, 546, nil, nil, nil, nil, + nil, nil, nil, 546, nil, nil, nil, nil, 546, 546, + 546, 546, 546, 546, nil, nil, nil, 546, 546, nil, + nil, nil, nil, nil, nil, 546, nil, 546, 546, 546, + 546, nil, 546, 546, nil, nil, 546, 546, 548, 548, + 548, nil, 548, nil, nil, nil, 548, 548, nil, nil, + nil, 548, nil, 548, 548, 548, 548, 548, 548, 548, + nil, nil, nil, nil, nil, 548, 548, 548, 548, 548, + 548, 548, nil, nil, 548, nil, nil, nil, nil, nil, + nil, 548, nil, nil, 548, 548, 548, 548, 548, 548, + 548, 548, nil, 548, 548, 548, nil, 548, 548, nil, + 548, 548, 548, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 548, nil, nil, 548, nil, nil, 548, 548, + nil, nil, 548, nil, nil, nil, nil, nil, 548, nil, + nil, nil, nil, nil, nil, nil, 548, nil, nil, nil, + nil, 548, 548, 548, 548, 548, 548, nil, nil, nil, + 548, 548, nil, nil, nil, nil, nil, nil, 548, nil, + nil, 548, 548, 548, nil, 548, 548, nil, nil, 548, + 548, 549, 549, 549, nil, 549, nil, nil, nil, 549, + 549, nil, nil, nil, 549, nil, 549, 549, 549, 549, + 549, 549, 549, nil, nil, nil, nil, nil, 549, 549, + 549, 549, 549, 549, 549, nil, nil, 549, nil, nil, + nil, nil, nil, nil, 549, nil, nil, 549, 549, 549, + 549, 549, 549, 549, 549, nil, 549, 549, 549, nil, + 549, 549, nil, 549, 549, 549, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 549, nil, nil, 549, nil, + nil, 549, 549, nil, nil, 549, nil, nil, nil, nil, + nil, 549, nil, nil, nil, nil, nil, nil, nil, 549, + nil, nil, nil, nil, 549, 549, 549, 549, 549, 549, + nil, nil, nil, 549, 549, nil, nil, nil, nil, nil, + nil, 549, nil, nil, 549, 549, 549, nil, 549, 549, + nil, nil, 549, 549, 550, 550, 550, nil, 550, nil, + nil, nil, 550, 550, nil, nil, nil, 550, nil, 550, + 550, 550, 550, 550, 550, 550, nil, nil, nil, nil, + nil, 550, 550, 550, 550, 550, 550, 550, nil, nil, + 550, nil, nil, nil, nil, nil, nil, 550, nil, nil, + 550, 550, 550, 550, 550, 550, 550, 550, nil, 550, + 550, 550, nil, 550, 550, nil, 550, 550, 550, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 550, nil, + nil, 550, nil, nil, 550, 550, nil, nil, 550, nil, + nil, nil, nil, nil, 550, nil, nil, nil, nil, nil, + nil, nil, 550, nil, nil, nil, nil, 550, 550, 550, + 550, 550, 550, nil, nil, nil, 550, 550, nil, nil, + nil, nil, nil, nil, 550, nil, nil, 550, 550, 550, + nil, 550, 550, nil, nil, 550, 550, 581, 581, 581, + nil, 581, nil, nil, nil, 581, 581, nil, nil, nil, + 581, nil, 581, 581, 581, 581, 581, 581, 581, nil, + nil, nil, nil, nil, 581, 581, 581, 581, 581, 581, + 581, nil, nil, 581, nil, nil, nil, nil, nil, nil, + 581, nil, nil, 581, 581, 581, 581, 581, 581, 581, + 581, nil, 581, 581, 581, nil, 581, 581, nil, 581, + 581, 581, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 581, nil, nil, 581, nil, nil, 581, 581, nil, + nil, 581, nil, nil, nil, nil, nil, 581, nil, nil, + nil, nil, nil, nil, nil, 581, nil, nil, nil, nil, + 581, 581, 581, 581, 581, 581, nil, nil, nil, 581, + 581, nil, nil, nil, nil, nil, nil, 581, nil, nil, + 581, 581, 581, 584, 581, 581, nil, nil, 581, 581, + 584, 584, 584, nil, nil, 584, 584, 584, nil, 584, + 993, 993, 993, 993, nil, nil, nil, 584, 584, 584, + nil, nil, nil, nil, nil, nil, 993, 993, 993, 584, + 584, nil, 584, 584, 584, 584, 584, nil, nil, 993, + 993, nil, nil, nil, 993, nil, nil, nil, nil, nil, + 746, nil, 746, 746, 746, 746, 746, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 746, nil, nil, nil, + nil, 584, nil, nil, nil, nil, nil, nil, 584, nil, + nil, nil, nil, 584, 584, nil, nil, nil, 746, nil, + nil, nil, nil, 993, 993, 993, 993, 993, 993, 746, + 746, nil, 993, 993, nil, 584, 584, nil, nil, nil, + 993, nil, nil, 993, 993, 993, nil, 993, 993, 584, + nil, 589, 589, 589, 584, 589, nil, nil, nil, 589, + 589, 584, nil, 746, 589, 584, 589, 589, 589, 589, + 589, 589, 589, 746, nil, nil, nil, nil, 589, 589, + 589, 589, 589, 589, 589, nil, nil, 589, nil, nil, + nil, nil, nil, nil, 589, nil, nil, 589, 589, 589, + 589, 589, 589, 589, 589, nil, 589, 589, 589, nil, + 589, 589, nil, 589, 589, 589, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 589, nil, nil, 589, nil, + nil, 589, 589, nil, nil, 589, nil, nil, nil, nil, + nil, 589, nil, nil, nil, nil, nil, nil, nil, 589, + nil, nil, nil, nil, 589, 589, 589, 589, 589, 589, + nil, nil, nil, 589, 589, nil, nil, nil, nil, nil, + nil, 589, nil, nil, 589, 589, 589, nil, 589, 589, + nil, nil, 589, 589, 599, 599, 599, nil, 599, nil, + nil, nil, 599, 599, nil, nil, nil, 599, nil, 599, + 599, 599, 599, 599, 599, 599, nil, nil, nil, nil, + nil, 599, 599, 599, 599, 599, 599, 599, nil, nil, + 599, nil, nil, nil, nil, nil, nil, 599, nil, nil, + 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, nil, 599, 599, nil, 599, 599, 599, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 599, nil, + nil, 599, nil, nil, 599, 599, nil, nil, 599, nil, + 599, nil, 599, nil, 599, nil, nil, nil, nil, nil, + nil, nil, 599, nil, nil, nil, nil, 599, 599, 599, + 599, 599, 599, nil, nil, nil, 599, 599, nil, nil, + nil, nil, nil, nil, 599, nil, 599, 599, 599, 599, + nil, 599, 599, nil, nil, 599, 599, 602, 602, 602, + nil, 602, nil, nil, nil, 602, 602, nil, nil, nil, + 602, nil, 602, 602, 602, 602, 602, 602, 602, nil, + nil, nil, nil, nil, 602, 602, 602, 602, 602, 602, + 602, nil, nil, 602, nil, nil, nil, nil, nil, nil, + 602, nil, nil, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, nil, 602, 602, nil, 602, + 602, 602, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 602, nil, nil, 602, nil, nil, 602, 602, nil, + nil, 602, nil, nil, nil, 602, nil, 602, nil, nil, + nil, nil, nil, nil, nil, 602, nil, nil, nil, nil, + 602, 602, 602, 602, 602, 602, nil, nil, nil, 602, + 602, nil, nil, nil, nil, nil, nil, 602, nil, 602, + 602, 602, 602, nil, 602, 602, nil, nil, 602, 602, + 604, 604, 604, nil, 604, nil, nil, nil, 604, 604, + nil, nil, nil, 604, nil, 604, 604, 604, 604, 604, + 604, 604, nil, nil, nil, nil, nil, 604, 604, 604, + 604, 604, 604, 604, nil, nil, 604, nil, nil, nil, + nil, nil, nil, 604, nil, nil, 604, 604, 604, 604, + 604, 604, 604, 604, nil, 604, 604, 604, nil, 604, + 604, nil, 604, 604, 604, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 604, nil, nil, 604, nil, nil, + 604, 604, nil, nil, 604, nil, nil, nil, nil, nil, + 604, nil, nil, nil, nil, nil, nil, nil, 604, nil, + nil, nil, nil, 604, 604, 604, 604, 604, 604, nil, + nil, nil, 604, 604, nil, nil, nil, nil, nil, nil, + 604, nil, nil, 604, 604, 604, nil, 604, 604, nil, + nil, 604, 604, 610, 610, 610, 610, 610, nil, nil, + nil, 610, 610, nil, nil, nil, 610, nil, 610, 610, + 610, 610, 610, 610, 610, nil, nil, nil, nil, nil, + 610, 610, 610, 610, 610, 610, 610, nil, nil, 610, + nil, nil, nil, nil, nil, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 610, 610, 610, nil, 610, 610, + 610, nil, 610, 610, nil, 610, 610, 610, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 610, nil, nil, + 610, nil, nil, 610, 610, nil, nil, 610, nil, 610, + nil, nil, nil, 610, nil, nil, nil, nil, nil, nil, + nil, 610, nil, nil, nil, nil, 610, 610, 610, 610, + 610, 610, nil, nil, nil, 610, 610, nil, nil, nil, + nil, nil, 610, 610, nil, nil, 610, 610, 610, nil, + 610, 610, nil, nil, 610, 610, 620, 620, 620, nil, + 620, nil, nil, nil, 620, 620, nil, nil, nil, 620, + nil, 620, 620, 620, 620, 620, 620, 620, nil, nil, + nil, nil, nil, 620, 620, 620, 620, 620, 620, 620, + nil, nil, 620, nil, nil, nil, nil, nil, nil, 620, + nil, nil, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, nil, 620, 620, nil, 620, 620, + 620, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 620, nil, nil, 620, nil, nil, 620, 620, nil, nil, + 620, nil, 620, nil, 620, nil, 620, nil, nil, nil, + nil, nil, nil, nil, 620, nil, nil, nil, nil, 620, + 620, 620, 620, 620, 620, nil, nil, nil, 620, 620, + nil, nil, nil, nil, nil, nil, 620, nil, 620, 620, + 620, 620, nil, 620, 620, nil, nil, 620, 620, 630, + 630, 630, nil, 630, nil, nil, nil, 630, 630, nil, + nil, nil, 630, nil, 630, 630, 630, 630, 630, 630, + 630, nil, nil, nil, nil, nil, 630, 630, 630, 630, + 630, 630, 630, nil, nil, 630, nil, nil, nil, nil, + nil, nil, 630, nil, nil, 630, 630, 630, 630, 630, + 630, 630, 630, nil, 630, 630, 630, nil, 630, 630, + nil, 630, 630, 630, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 630, nil, nil, 630, nil, nil, 630, + 630, nil, nil, 630, nil, nil, nil, nil, nil, 630, + nil, nil, nil, nil, nil, nil, nil, 630, nil, nil, + nil, nil, 630, 630, 630, 630, 630, 630, nil, nil, + nil, 630, 630, nil, nil, nil, nil, nil, nil, 630, + nil, nil, 630, 630, 630, nil, 630, 630, nil, nil, + 630, 630, 633, 633, 633, nil, 633, nil, nil, nil, + 633, 633, nil, nil, nil, 633, nil, 633, 633, 633, + 633, 633, 633, 633, nil, nil, nil, nil, nil, 633, + 633, 633, 633, 633, 633, 633, nil, nil, 633, nil, + nil, nil, nil, nil, nil, 633, nil, nil, 633, 633, + 633, 633, 633, 633, 633, 633, nil, 633, 633, 633, + nil, 633, 633, nil, 633, 633, 633, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 633, nil, nil, 633, + nil, nil, 633, 633, nil, nil, 633, nil, nil, nil, + nil, nil, 633, nil, nil, nil, nil, nil, nil, nil, + 633, nil, nil, nil, nil, 633, 633, 633, 633, 633, + 633, nil, nil, nil, 633, 633, nil, nil, nil, nil, + nil, nil, 633, nil, nil, 633, 633, 633, nil, 633, + 633, nil, nil, 633, 633, 636, 636, 636, nil, 636, + nil, nil, nil, 636, 636, nil, nil, nil, 636, nil, + 636, 636, 636, 636, 636, 636, 636, nil, nil, nil, + nil, nil, 636, 636, 636, 636, 636, 636, 636, nil, + nil, 636, nil, nil, nil, nil, nil, nil, 636, nil, + nil, 636, 636, 636, 636, 636, 636, 636, 636, nil, + 636, 636, 636, nil, 636, 636, nil, 636, 636, 636, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 636, + nil, nil, 636, nil, nil, 636, 636, nil, nil, 636, + nil, nil, nil, nil, nil, 636, nil, nil, nil, nil, + nil, nil, nil, 636, nil, nil, nil, nil, 636, 636, + 636, 636, 636, 636, nil, nil, nil, 636, 636, nil, + nil, nil, nil, nil, nil, 636, nil, nil, 636, 636, + 636, nil, 636, 636, nil, nil, 636, 636, 641, 641, + 641, nil, 641, nil, nil, nil, 641, 641, nil, nil, + nil, 641, nil, 641, 641, 641, 641, 641, 641, 641, + nil, nil, nil, nil, nil, 641, 641, 641, 641, 641, + 641, 641, nil, nil, 641, nil, nil, nil, nil, nil, + nil, 641, nil, nil, 641, 641, 641, 641, 641, 641, + 641, 641, 641, 641, 641, 641, nil, 641, 641, nil, + 641, 641, 641, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 641, nil, nil, 641, nil, nil, 641, 641, + nil, nil, 641, nil, 641, nil, nil, nil, 641, nil, + nil, nil, nil, nil, nil, nil, 641, nil, nil, nil, + nil, 641, 641, 641, 641, 641, 641, nil, nil, nil, + 641, 641, nil, nil, nil, nil, nil, nil, 641, nil, + 641, 641, 641, 641, nil, 641, 641, nil, nil, 641, + 641, 644, 644, 644, nil, 644, nil, nil, nil, 644, + 644, nil, nil, nil, 644, nil, 644, 644, 644, 644, + 644, 644, 644, nil, nil, nil, nil, nil, 644, 644, + 644, 644, 644, 644, 644, nil, nil, 644, nil, nil, + nil, nil, nil, nil, 644, nil, nil, 644, 644, 644, + 644, 644, 644, 644, 644, 644, 644, 644, 644, nil, + 644, 644, nil, 644, 644, 644, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 644, nil, nil, 644, nil, + nil, 644, 644, nil, nil, 644, nil, nil, nil, nil, + nil, 644, nil, nil, nil, nil, nil, nil, nil, 644, + nil, nil, nil, nil, 644, 644, 644, 644, 644, 644, + nil, nil, nil, 644, 644, nil, nil, nil, nil, nil, + nil, 644, nil, 644, 644, 644, 644, nil, 644, 644, + nil, nil, 644, 644, 661, 661, 661, nil, 661, nil, + nil, nil, 661, 661, nil, nil, nil, 661, nil, 661, + 661, 661, 661, 661, 661, 661, nil, nil, nil, nil, + nil, 661, 661, 661, 661, 661, 661, 661, nil, nil, + 661, nil, nil, nil, nil, nil, nil, 661, nil, nil, + 661, 661, 661, 661, 661, 661, 661, 661, nil, 661, + 661, 661, nil, 661, 661, nil, 661, 661, 661, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 661, nil, + nil, 661, nil, nil, 661, 661, nil, nil, 661, nil, + 661, nil, nil, nil, 661, nil, nil, nil, nil, nil, + nil, nil, 661, nil, nil, nil, nil, 661, 661, 661, + 661, 661, 661, nil, nil, nil, 661, 661, nil, nil, + nil, nil, nil, nil, 661, nil, nil, 661, 661, 661, + nil, 661, 661, nil, nil, 661, 661, 662, 662, 662, + nil, 662, nil, nil, nil, 662, 662, nil, nil, nil, + 662, nil, 662, 662, 662, 662, 662, 662, 662, nil, + nil, nil, nil, nil, 662, 662, 662, 662, 662, 662, + 662, nil, nil, 662, nil, nil, nil, nil, nil, nil, + 662, nil, nil, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, nil, 662, 662, nil, 662, + 662, 662, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 662, nil, nil, 662, nil, nil, 662, 662, nil, + nil, 662, nil, 662, nil, 662, nil, 662, nil, nil, + nil, nil, nil, nil, nil, 662, nil, nil, nil, nil, + 662, 662, 662, 662, 662, 662, nil, nil, nil, 662, + 662, nil, nil, nil, nil, nil, nil, 662, nil, 662, + 662, 662, 662, nil, 662, 662, nil, nil, 662, 662, + 672, 672, 672, nil, 672, nil, nil, nil, 672, 672, + nil, nil, nil, 672, nil, 672, 672, 672, 672, 672, + 672, 672, nil, nil, nil, nil, nil, 672, 672, 672, + 672, 672, 672, 672, nil, nil, 672, nil, nil, nil, + nil, nil, nil, 672, nil, nil, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, nil, 672, + 672, nil, 672, 672, 672, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 672, nil, nil, 672, nil, nil, + 672, 672, nil, nil, 672, nil, 672, nil, 672, nil, + 672, nil, nil, nil, nil, nil, nil, nil, 672, nil, + nil, nil, nil, 672, 672, 672, 672, 672, 672, nil, + nil, nil, 672, 672, nil, nil, nil, nil, nil, nil, + 672, nil, 672, 672, 672, 672, nil, 672, 672, nil, + nil, 672, 672, 708, 708, 708, 708, 708, nil, nil, + nil, 708, 708, nil, nil, nil, 708, nil, 708, 708, + 708, 708, 708, 708, 708, nil, nil, nil, nil, nil, + 708, 708, 708, 708, 708, 708, 708, nil, nil, 708, + nil, nil, nil, nil, nil, 708, 708, nil, 708, 708, + 708, 708, 708, 708, 708, 708, 708, nil, 708, 708, + 708, nil, 708, 708, nil, 708, 708, 708, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 708, nil, nil, + 708, nil, nil, 708, 708, nil, nil, 708, nil, 708, + nil, nil, nil, 708, nil, nil, nil, nil, nil, nil, + nil, 708, nil, nil, nil, nil, 708, 708, 708, 708, + 708, 708, nil, nil, nil, 708, 708, nil, nil, nil, + nil, nil, nil, 708, nil, nil, 708, 708, 708, nil, + 708, 708, nil, nil, 708, 708, 710, 710, 710, nil, + 710, nil, nil, nil, 710, 710, nil, nil, nil, 710, + nil, 710, 710, 710, 710, 710, 710, 710, nil, nil, + nil, nil, nil, 710, 710, 710, 710, 710, 710, 710, + nil, nil, 710, nil, nil, nil, nil, nil, nil, 710, + nil, nil, 710, 710, 710, 710, 710, 710, 710, 710, + nil, 710, 710, 710, nil, 710, 710, nil, 710, 710, + 710, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 710, nil, nil, 710, nil, nil, 710, 710, nil, nil, + 710, nil, 710, nil, nil, nil, 710, nil, nil, nil, + nil, nil, nil, nil, 710, nil, nil, nil, nil, 710, + 710, 710, 710, 710, 710, nil, nil, nil, 710, 710, + nil, nil, nil, nil, nil, nil, 710, nil, nil, 710, + 710, 710, nil, 710, 710, nil, nil, 710, 710, 711, + 711, 711, nil, 711, nil, nil, nil, 711, 711, nil, + nil, nil, 711, nil, 711, 711, 711, 711, 711, 711, + 711, nil, nil, nil, nil, nil, 711, 711, 711, 711, + 711, 711, 711, nil, nil, 711, nil, nil, nil, nil, + nil, nil, 711, nil, nil, 711, 711, 711, 711, 711, + 711, 711, 711, nil, 711, 711, 711, nil, 711, 711, + nil, 711, 711, 711, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 711, nil, nil, 711, nil, nil, 711, + 711, nil, nil, 711, nil, nil, nil, nil, nil, 711, + nil, nil, nil, nil, nil, nil, nil, 711, nil, nil, + nil, nil, 711, 711, 711, 711, 711, 711, nil, nil, + nil, 711, 711, nil, nil, nil, nil, nil, nil, 711, + nil, nil, 711, 711, 711, nil, 711, 711, nil, nil, + 711, 711, 712, 712, 712, nil, 712, nil, nil, nil, + 712, 712, nil, nil, nil, 712, nil, 712, 712, 712, + 712, 712, 712, 712, nil, nil, nil, nil, nil, 712, + 712, 712, 712, 712, 712, 712, nil, nil, 712, nil, + nil, nil, nil, nil, nil, 712, nil, nil, 712, 712, + 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + nil, 712, 712, nil, 712, 712, 712, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 712, nil, nil, 712, + nil, nil, 712, 712, nil, nil, 712, nil, 712, nil, + 712, nil, 712, nil, nil, nil, nil, nil, nil, nil, + 712, nil, nil, nil, nil, 712, 712, 712, 712, 712, + 712, nil, nil, nil, 712, 712, nil, nil, nil, nil, + nil, nil, 712, nil, 712, 712, 712, 712, nil, 712, + 712, nil, nil, 712, 712, 715, 715, 715, 715, 715, + nil, nil, nil, 715, 715, nil, nil, nil, 715, nil, + 715, 715, 715, 715, 715, 715, 715, nil, nil, nil, + nil, nil, 715, 715, 715, 715, 715, 715, 715, nil, + nil, 715, nil, nil, nil, nil, nil, 715, 715, nil, + 715, 715, 715, 715, 715, 715, 715, 715, 715, nil, + 715, 715, 715, nil, 715, 715, nil, 715, 715, 715, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 715, + nil, nil, 715, nil, nil, 715, 715, nil, nil, 715, + nil, 715, nil, nil, nil, 715, nil, nil, nil, nil, + nil, nil, nil, 715, nil, nil, nil, nil, 715, 715, + 715, 715, 715, 715, nil, nil, nil, 715, 715, nil, + nil, nil, nil, nil, nil, 715, nil, nil, 715, 715, + 715, nil, 715, 715, nil, nil, 715, 715, 716, 716, + 716, nil, 716, nil, nil, nil, 716, 716, nil, nil, + nil, 716, nil, 716, 716, 716, 716, 716, 716, 716, + nil, nil, nil, nil, nil, 716, 716, 716, 716, 716, + 716, 716, nil, nil, 716, nil, nil, nil, nil, nil, + nil, 716, nil, nil, 716, 716, 716, 716, 716, 716, + 716, 716, nil, 716, 716, 716, nil, 716, 716, nil, + 716, 716, 716, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 716, nil, nil, 716, nil, nil, 716, 716, + nil, nil, 716, nil, nil, nil, nil, nil, 716, nil, + nil, nil, nil, nil, nil, nil, 716, nil, nil, nil, + nil, 716, 716, 716, 716, 716, 716, nil, nil, nil, + 716, 716, nil, nil, nil, nil, nil, nil, 716, nil, + nil, 716, 716, 716, nil, 716, 716, nil, nil, 716, + 716, 718, 718, 718, nil, 718, nil, nil, nil, 718, + 718, nil, nil, nil, 718, nil, 718, 718, 718, 718, + 718, 718, 718, nil, nil, nil, nil, nil, 718, 718, + 718, 718, 718, 718, 718, nil, nil, 718, nil, nil, + nil, nil, nil, nil, 718, nil, nil, 718, 718, 718, + 718, 718, 718, 718, 718, 718, 718, 718, 718, nil, + 718, 718, nil, 718, 718, 718, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 718, nil, nil, 718, nil, + nil, 718, 718, nil, nil, 718, nil, 718, nil, 718, + nil, 718, nil, nil, nil, nil, nil, nil, nil, 718, + nil, nil, nil, nil, 718, 718, 718, 718, 718, 718, + nil, nil, nil, 718, 718, nil, nil, nil, nil, nil, + nil, 718, nil, 718, 718, 718, 718, nil, 718, 718, + nil, nil, 718, 718, 719, 719, 719, nil, 719, nil, + nil, nil, 719, 719, nil, nil, nil, 719, nil, 719, + 719, 719, 719, 719, 719, 719, nil, nil, nil, nil, + nil, 719, 719, 719, 719, 719, 719, 719, nil, nil, + 719, nil, nil, nil, nil, nil, nil, 719, nil, nil, + 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, + 719, 719, nil, 719, 719, nil, 719, 719, 719, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 719, nil, + nil, 719, nil, nil, 719, 719, nil, nil, 719, nil, + nil, nil, 719, nil, 719, nil, nil, nil, nil, nil, + nil, nil, 719, nil, nil, nil, nil, 719, 719, 719, + 719, 719, 719, nil, nil, nil, 719, 719, nil, nil, + nil, nil, nil, nil, 719, nil, 719, 719, 719, 719, + nil, 719, 719, nil, nil, 719, 719, 720, 720, 720, + nil, 720, nil, nil, nil, 720, 720, nil, nil, nil, + 720, nil, 720, 720, 720, 720, 720, 720, 720, nil, + nil, nil, nil, nil, 720, 720, 720, 720, 720, 720, + 720, nil, nil, 720, nil, nil, nil, nil, nil, nil, + 720, nil, nil, 720, 720, 720, 720, 720, 720, 720, + 720, nil, 720, 720, 720, nil, 720, 720, nil, 720, + 720, 720, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 720, nil, nil, 720, nil, nil, 720, 720, nil, + nil, 720, nil, nil, nil, nil, nil, 720, nil, nil, + nil, nil, nil, nil, nil, 720, nil, nil, nil, nil, + 720, 720, 720, 720, 720, 720, nil, nil, nil, 720, + 720, nil, nil, nil, nil, nil, nil, 720, nil, nil, + 720, 720, 720, nil, 720, 720, nil, nil, 720, 720, + 721, 721, 721, nil, 721, nil, nil, nil, 721, 721, + nil, nil, nil, 721, nil, 721, 721, 721, 721, 721, + 721, 721, nil, nil, nil, nil, nil, 721, 721, 721, + 721, 721, 721, 721, nil, nil, 721, nil, nil, nil, + nil, nil, nil, 721, nil, nil, 721, 721, 721, 721, + 721, 721, 721, 721, nil, 721, 721, 721, nil, 721, + 721, nil, 721, 721, 721, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 721, nil, nil, 721, nil, nil, + 721, 721, nil, nil, 721, nil, nil, nil, nil, nil, + 721, nil, nil, nil, nil, nil, nil, nil, 721, nil, + nil, nil, nil, 721, 721, 721, 721, 721, 721, nil, + nil, nil, 721, 721, nil, nil, nil, nil, nil, nil, + 721, nil, nil, 721, 721, 721, nil, 721, 721, nil, + nil, 721, 721, 726, 726, 726, nil, 726, nil, nil, + nil, 726, 726, nil, nil, nil, 726, nil, 726, 726, + 726, 726, 726, 726, 726, nil, nil, nil, nil, nil, + 726, 726, 726, 726, 726, 726, 726, nil, nil, 726, + nil, nil, nil, nil, nil, nil, 726, nil, nil, 726, + 726, 726, 726, 726, 726, 726, 726, nil, 726, 726, + 726, nil, 726, 726, nil, 726, 726, 726, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 726, nil, nil, + 726, nil, nil, 726, 726, nil, nil, 726, nil, nil, + nil, nil, nil, 726, nil, nil, nil, nil, nil, nil, + nil, 726, nil, nil, nil, nil, 726, 726, 726, 726, + 726, 726, nil, nil, nil, 726, 726, nil, nil, nil, + nil, nil, nil, 726, nil, nil, 726, 726, 726, nil, + 726, 726, nil, nil, 726, 726, 727, 727, 727, nil, + 727, nil, nil, nil, 727, 727, nil, nil, nil, 727, + nil, 727, 727, 727, 727, 727, 727, 727, nil, nil, + nil, nil, nil, 727, 727, 727, 727, 727, 727, 727, + nil, nil, 727, nil, nil, nil, nil, nil, nil, 727, + nil, nil, 727, 727, 727, 727, 727, 727, 727, 727, + nil, 727, 727, 727, nil, 727, 727, nil, 727, 727, + 727, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 727, nil, nil, 727, nil, nil, 727, 727, nil, nil, + 727, nil, nil, nil, nil, nil, 727, nil, nil, nil, + nil, nil, nil, nil, 727, nil, nil, nil, nil, 727, + 727, 727, 727, 727, 727, nil, nil, nil, 727, 727, + nil, nil, nil, nil, nil, nil, 727, nil, nil, 727, + 727, 727, nil, 727, 727, nil, nil, 727, 727, 734, + 734, 734, nil, 734, nil, nil, nil, 734, 734, nil, + nil, nil, 734, nil, 734, 734, 734, 734, 734, 734, + 734, nil, nil, nil, nil, nil, 734, 734, 734, 734, + 734, 734, 734, nil, nil, 734, nil, nil, nil, nil, + nil, nil, 734, nil, nil, 734, 734, 734, 734, 734, + 734, 734, 734, nil, 734, 734, 734, nil, 734, 734, + nil, 734, 734, 734, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 734, nil, nil, 734, nil, nil, 734, + 734, nil, nil, 734, nil, 734, nil, nil, nil, 734, + nil, nil, nil, nil, nil, nil, nil, 734, nil, nil, + nil, nil, 734, 734, 734, 734, 734, 734, nil, nil, + nil, 734, 734, nil, nil, nil, nil, nil, nil, 734, + nil, nil, 734, 734, 734, nil, 734, 734, nil, nil, + 734, 734, 749, 749, 749, nil, 749, nil, nil, nil, + 749, 749, nil, nil, nil, 749, nil, 749, 749, 749, + 749, 749, 749, 749, nil, nil, nil, nil, nil, 749, + 749, 749, 749, 749, 749, 749, nil, nil, 749, nil, + nil, nil, nil, nil, nil, 749, nil, nil, 749, 749, + 749, 749, 749, 749, 749, 749, nil, 749, 749, 749, + nil, 749, 749, nil, 749, 749, 749, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 749, nil, nil, 749, + nil, nil, 749, 749, nil, nil, 749, nil, nil, nil, + nil, nil, 749, nil, nil, nil, nil, nil, nil, nil, + 749, nil, nil, nil, nil, 749, 749, 749, 749, 749, + 749, nil, nil, nil, 749, 749, nil, nil, nil, nil, + nil, nil, 749, nil, nil, 749, 749, 749, nil, 749, + 749, nil, nil, 749, 749, 773, 773, 773, nil, 773, + nil, nil, nil, 773, 773, nil, nil, nil, 773, nil, + 773, 773, 773, 773, 773, 773, 773, nil, nil, nil, + nil, nil, 773, 773, 773, 773, 773, 773, 773, nil, + nil, 773, nil, nil, nil, nil, nil, nil, 773, nil, + nil, 773, 773, 773, 773, 773, 773, 773, 773, nil, + 773, 773, 773, nil, 773, 773, nil, 773, 773, 773, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 773, + nil, nil, 773, nil, nil, 773, 773, nil, nil, 773, + nil, nil, nil, nil, nil, 773, nil, nil, nil, nil, + nil, nil, nil, 773, nil, nil, nil, nil, 773, 773, + 773, 773, 773, 773, nil, nil, nil, 773, 773, nil, + nil, nil, nil, nil, nil, 773, nil, nil, 773, 773, + 773, nil, 773, 773, nil, nil, 773, 773, 774, 774, + 774, nil, 774, nil, nil, nil, 774, 774, nil, nil, + nil, 774, nil, 774, 774, 774, 774, 774, 774, 774, + nil, nil, nil, nil, nil, 774, 774, 774, 774, 774, + 774, 774, nil, nil, 774, nil, nil, nil, nil, nil, + nil, 774, nil, nil, 774, 774, 774, 774, 774, 774, + 774, 774, nil, 774, 774, 774, nil, 774, 774, nil, + 774, 774, 774, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 774, nil, nil, 774, nil, nil, 774, 774, + nil, nil, 774, nil, nil, nil, nil, nil, 774, nil, + nil, nil, nil, nil, nil, nil, 774, nil, nil, nil, + nil, 774, 774, 774, 774, 774, 774, nil, nil, nil, + 774, 774, nil, nil, nil, nil, nil, nil, 774, nil, + nil, 774, 774, 774, nil, 774, 774, nil, nil, 774, + 774, 829, 829, 829, nil, 829, nil, nil, nil, 829, + 829, nil, nil, nil, 829, nil, 829, 829, 829, 829, + 829, 829, 829, nil, nil, nil, nil, nil, 829, 829, + 829, 829, 829, 829, 829, nil, nil, 829, nil, nil, + nil, nil, nil, nil, 829, nil, nil, 829, 829, 829, + 829, 829, 829, 829, 829, 829, 829, 829, 829, nil, + 829, 829, nil, 829, 829, 829, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 829, nil, nil, 829, nil, + nil, 829, 829, nil, nil, 829, nil, 829, nil, 829, + nil, 829, nil, nil, nil, nil, nil, nil, nil, 829, + nil, nil, nil, nil, 829, 829, 829, 829, 829, 829, + nil, nil, nil, 829, 829, nil, nil, nil, nil, nil, + nil, 829, nil, 829, 829, 829, 829, nil, 829, 829, + nil, nil, 829, 829, 838, 838, 838, nil, 838, nil, + nil, nil, 838, 838, nil, nil, nil, 838, nil, 838, + 838, 838, 838, 838, 838, 838, nil, nil, nil, nil, + nil, 838, 838, 838, 838, 838, 838, 838, nil, nil, + 838, nil, nil, nil, nil, nil, nil, 838, nil, nil, + 838, 838, 838, 838, 838, 838, 838, 838, nil, 838, + 838, 838, nil, 838, 838, nil, 838, 838, 838, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 838, nil, + nil, 838, nil, nil, 838, 838, nil, nil, 838, nil, + nil, nil, nil, nil, 838, nil, nil, nil, nil, nil, + nil, nil, 838, nil, nil, nil, nil, 838, 838, 838, + 838, 838, 838, nil, nil, nil, 838, 838, nil, nil, + nil, nil, nil, nil, 838, nil, nil, 838, 838, 838, + nil, 838, 838, nil, nil, 838, 838, 841, 841, 841, + nil, 841, nil, nil, nil, 841, 841, nil, nil, nil, + 841, nil, 841, 841, 841, 841, 841, 841, 841, nil, + nil, nil, nil, nil, 841, 841, 841, 841, 841, 841, + 841, nil, nil, 841, nil, nil, nil, nil, nil, nil, + 841, nil, nil, 841, 841, 841, 841, 841, 841, 841, + 841, nil, 841, 841, 841, nil, 841, 841, nil, 841, + 841, 841, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 841, nil, nil, 841, nil, nil, 841, 841, nil, + nil, 841, nil, nil, nil, nil, nil, 841, nil, nil, + nil, nil, nil, nil, nil, 841, nil, nil, nil, nil, + 841, 841, 841, 841, 841, 841, nil, nil, nil, 841, + 841, nil, nil, nil, nil, nil, nil, 841, nil, nil, + 841, 841, 841, nil, 841, 841, nil, nil, 841, 841, + 879, 879, 879, nil, 879, nil, nil, nil, 879, 879, + nil, nil, nil, 879, nil, 879, 879, 879, 879, 879, + 879, 879, nil, nil, nil, nil, nil, 879, 879, 879, + 879, 879, 879, 879, nil, nil, 879, nil, nil, nil, + nil, nil, nil, 879, nil, nil, 879, 879, 879, 879, + 879, 879, 879, 879, nil, 879, 879, 879, nil, 879, + 879, nil, 879, 879, 879, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 879, nil, nil, 879, nil, nil, + 879, 879, nil, nil, 879, nil, nil, nil, nil, nil, + 879, nil, nil, nil, nil, nil, nil, nil, 879, nil, + nil, nil, nil, 879, 879, 879, 879, 879, 879, nil, + nil, nil, 879, 879, nil, nil, nil, nil, nil, nil, + 879, nil, nil, 879, 879, 879, nil, 879, 879, nil, + nil, 879, 879, 892, 892, 892, nil, 892, nil, nil, + nil, 892, 892, nil, nil, nil, 892, nil, 892, 892, + 892, 892, 892, 892, 892, nil, nil, nil, nil, nil, + 892, 892, 892, 892, 892, 892, 892, nil, nil, 892, + nil, nil, nil, nil, nil, nil, 892, nil, nil, 892, + 892, 892, 892, 892, 892, 892, 892, nil, 892, 892, + 892, nil, 892, 892, nil, 892, 892, 892, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 892, nil, nil, + 892, nil, nil, 892, 892, nil, nil, 892, nil, nil, + nil, nil, nil, 892, nil, nil, nil, nil, nil, nil, + nil, 892, nil, nil, nil, nil, 892, 892, 892, 892, + 892, 892, nil, nil, nil, 892, 892, nil, nil, nil, + nil, nil, nil, 892, nil, nil, 892, 892, 892, nil, + 892, 892, nil, nil, 892, 892, 908, 908, 908, nil, + 908, nil, nil, nil, 908, 908, nil, nil, nil, 908, + nil, 908, 908, 908, 908, 908, 908, 908, nil, nil, + nil, nil, nil, 908, 908, 908, 908, 908, 908, 908, + nil, nil, 908, nil, nil, nil, nil, nil, nil, 908, + nil, nil, 908, 908, 908, 908, 908, 908, 908, 908, + nil, 908, 908, 908, nil, 908, 908, nil, 908, 908, + 908, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 908, nil, nil, 908, nil, nil, 908, 908, nil, nil, + 908, nil, nil, nil, nil, nil, 908, nil, nil, nil, + nil, nil, nil, nil, 908, nil, nil, nil, nil, 908, + 908, 908, 908, 908, 908, nil, nil, nil, 908, 908, + nil, nil, nil, nil, nil, nil, 908, nil, nil, 908, + 908, 908, nil, 908, 908, nil, nil, 908, 908, 916, + 916, 916, nil, 916, nil, nil, nil, 916, 916, nil, + nil, nil, 916, nil, 916, 916, 916, 916, 916, 916, + 916, nil, nil, nil, nil, nil, 916, 916, 916, 916, + 916, 916, 916, nil, nil, 916, nil, nil, nil, nil, + nil, nil, 916, nil, nil, 916, 916, 916, 916, 916, + 916, 916, 916, nil, 916, 916, 916, nil, 916, 916, + nil, 916, 916, 916, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 916, nil, nil, 916, nil, nil, 916, + 916, nil, nil, 916, nil, nil, nil, nil, nil, 916, + nil, nil, nil, nil, nil, nil, nil, 916, nil, nil, + nil, nil, 916, 916, 916, 916, 916, 916, nil, nil, + nil, 916, 916, nil, nil, nil, nil, nil, nil, 916, + nil, nil, 916, 916, 916, nil, 916, 916, nil, nil, + 916, 916, 928, 928, 928, nil, 928, nil, nil, nil, + 928, 928, nil, nil, nil, 928, nil, 928, 928, 928, + 928, 928, 928, 928, nil, nil, nil, nil, nil, 928, + 928, 928, 928, 928, 928, 928, nil, nil, 928, nil, + nil, nil, nil, nil, nil, 928, nil, nil, 928, 928, + 928, 928, 928, 928, 928, 928, nil, 928, 928, 928, + nil, 928, 928, nil, 928, 928, 928, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 928, nil, nil, 928, + nil, nil, 928, 928, nil, nil, 928, nil, nil, nil, + nil, nil, 928, nil, nil, nil, nil, nil, nil, nil, + 928, nil, nil, nil, nil, 928, 928, 928, 928, 928, + 928, nil, nil, nil, 928, 928, nil, nil, nil, nil, + nil, nil, 928, nil, nil, 928, 928, 928, nil, 928, + 928, nil, nil, 928, 928, 929, 929, 929, nil, 929, + nil, nil, nil, 929, 929, nil, nil, nil, 929, nil, + 929, 929, 929, 929, 929, 929, 929, nil, nil, nil, + nil, nil, 929, 929, 929, 929, 929, 929, 929, nil, + nil, 929, nil, nil, nil, nil, nil, nil, 929, nil, + nil, 929, 929, 929, 929, 929, 929, 929, 929, nil, + 929, 929, 929, nil, 929, 929, nil, 929, 929, 929, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 929, + nil, nil, 929, nil, nil, 929, 929, nil, nil, 929, + nil, nil, nil, nil, nil, 929, nil, nil, nil, nil, + nil, nil, nil, 929, nil, nil, nil, nil, 929, 929, + 929, 929, 929, 929, nil, nil, nil, 929, 929, nil, + nil, nil, nil, nil, nil, 929, nil, nil, 929, 929, + 929, nil, 929, 929, nil, nil, 929, 929, 960, 960, + 960, nil, 960, nil, nil, nil, 960, 960, nil, nil, + nil, 960, nil, 960, 960, 960, 960, 960, 960, 960, + nil, nil, nil, nil, nil, 960, 960, 960, 960, 960, + 960, 960, nil, nil, 960, nil, nil, nil, nil, nil, + nil, 960, nil, nil, 960, 960, 960, 960, 960, 960, + 960, 960, nil, 960, 960, 960, nil, 960, 960, nil, + 960, 960, 960, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 960, nil, nil, 960, nil, nil, 960, 960, + nil, nil, 960, nil, nil, nil, nil, nil, 960, nil, + nil, nil, nil, nil, nil, nil, 960, nil, nil, nil, + nil, 960, 960, 960, 960, 960, 960, nil, nil, nil, + 960, 960, nil, nil, nil, nil, nil, nil, 960, nil, + nil, 960, 960, 960, nil, 960, 960, nil, nil, 960, + 960, 961, 961, 961, nil, 961, nil, nil, nil, 961, + 961, nil, nil, nil, 961, nil, 961, 961, 961, 961, + 961, 961, 961, nil, nil, nil, nil, nil, 961, 961, + 961, 961, 961, 961, 961, nil, nil, 961, nil, nil, + nil, nil, nil, nil, 961, nil, nil, 961, 961, 961, + 961, 961, 961, 961, 961, nil, 961, 961, 961, nil, + 961, 961, nil, 961, 961, 961, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 961, nil, nil, 961, nil, + nil, 961, 961, nil, nil, 961, nil, nil, nil, nil, + nil, 961, nil, nil, nil, nil, nil, nil, nil, 961, + nil, nil, nil, nil, 961, 961, 961, 961, 961, 961, + nil, nil, nil, 961, 961, nil, nil, nil, nil, nil, + nil, 961, nil, nil, 961, 961, 961, nil, 961, 961, + nil, nil, 961, 961, 962, 962, 962, nil, 962, nil, + nil, nil, 962, 962, nil, nil, nil, 962, nil, 962, + 962, 962, 962, 962, 962, 962, nil, nil, nil, nil, + nil, 962, 962, 962, 962, 962, 962, 962, nil, nil, + 962, nil, nil, nil, nil, nil, nil, 962, nil, nil, + 962, 962, 962, 962, 962, 962, 962, 962, nil, 962, + 962, 962, nil, 962, 962, nil, 962, 962, 962, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 962, nil, + nil, 962, nil, nil, 962, 962, nil, nil, 962, nil, + nil, nil, nil, nil, 962, nil, nil, nil, nil, nil, + nil, nil, 962, nil, nil, nil, nil, 962, 962, 962, + 962, 962, 962, nil, nil, nil, 962, 962, nil, nil, + nil, nil, nil, nil, 962, nil, nil, 962, 962, 962, + nil, 962, 962, nil, nil, 962, 962, 963, 963, 963, + nil, 963, nil, nil, nil, 963, 963, nil, nil, nil, + 963, nil, 963, 963, 963, 963, 963, 963, 963, nil, + nil, nil, nil, nil, 963, 963, 963, 963, 963, 963, + 963, nil, nil, 963, nil, nil, nil, nil, nil, nil, + 963, nil, nil, 963, 963, 963, 963, 963, 963, 963, + 963, nil, 963, 963, 963, nil, 963, 963, nil, 963, + 963, 963, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 963, nil, nil, 963, nil, nil, 963, 963, nil, + nil, 963, nil, nil, nil, nil, nil, 963, nil, nil, + nil, nil, nil, nil, nil, 963, nil, nil, nil, nil, + 963, 963, 963, 963, 963, 963, nil, nil, nil, 963, + 963, nil, nil, nil, nil, nil, nil, 963, nil, nil, + 963, 963, 963, nil, 963, 963, nil, nil, 963, 963, + 964, 964, 964, nil, 964, nil, nil, nil, 964, 964, + nil, nil, nil, 964, nil, 964, 964, 964, 964, 964, + 964, 964, nil, nil, nil, nil, nil, 964, 964, 964, + 964, 964, 964, 964, nil, nil, 964, nil, nil, nil, + nil, nil, nil, 964, nil, nil, 964, 964, 964, 964, + 964, 964, 964, 964, nil, 964, 964, 964, nil, 964, + 964, nil, 964, 964, 964, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 964, nil, nil, 964, nil, nil, + 964, 964, nil, nil, 964, nil, nil, nil, nil, nil, + 964, nil, nil, nil, nil, nil, nil, nil, 964, nil, + nil, nil, nil, 964, 964, 964, 964, 964, 964, nil, + nil, nil, 964, 964, nil, nil, nil, nil, nil, nil, + 964, nil, nil, 964, 964, 964, nil, 964, 964, nil, + nil, 964, 964, 965, 965, 965, nil, 965, nil, nil, + nil, 965, 965, nil, nil, nil, 965, nil, 965, 965, + 965, 965, 965, 965, 965, nil, nil, nil, nil, nil, + 965, 965, 965, 965, 965, 965, 965, nil, nil, 965, + nil, nil, nil, nil, nil, nil, 965, nil, nil, 965, + 965, 965, 965, 965, 965, 965, 965, nil, 965, 965, + 965, nil, 965, 965, nil, 965, 965, 965, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 965, nil, nil, + 965, nil, nil, 965, 965, nil, nil, 965, nil, nil, + nil, nil, nil, 965, nil, nil, nil, nil, nil, nil, + nil, 965, nil, nil, nil, nil, 965, 965, 965, 965, + 965, 965, nil, nil, nil, 965, 965, nil, nil, nil, + nil, nil, nil, 965, nil, nil, 965, 965, 965, nil, + 965, 965, nil, nil, 965, 965, 999, 999, 999, nil, + 999, nil, nil, nil, 999, 999, nil, nil, nil, 999, + nil, 999, 999, 999, 999, 999, 999, 999, nil, nil, + nil, nil, nil, 999, 999, 999, 999, 999, 999, 999, + nil, nil, 999, nil, nil, nil, nil, nil, nil, 999, + nil, nil, 999, 999, 999, 999, 999, 999, 999, 999, + nil, 999, 999, 999, nil, 999, 999, nil, 999, 999, + 999, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 999, nil, nil, 999, nil, nil, 999, 999, nil, nil, + 999, nil, nil, nil, nil, nil, 999, nil, nil, nil, + nil, nil, nil, nil, 999, nil, nil, nil, nil, 999, + 999, 999, 999, 999, 999, nil, nil, nil, 999, 999, + nil, nil, nil, nil, nil, nil, 999, nil, nil, 999, + 999, 999, nil, 999, 999, nil, nil, 999, 999, 1005, + 1005, 1005, nil, 1005, nil, nil, nil, 1005, 1005, nil, + nil, nil, 1005, nil, 1005, 1005, 1005, 1005, 1005, 1005, + 1005, nil, nil, nil, nil, nil, 1005, 1005, 1005, 1005, + 1005, 1005, 1005, nil, nil, 1005, nil, nil, nil, nil, + nil, nil, 1005, nil, nil, 1005, 1005, 1005, 1005, 1005, + 1005, 1005, 1005, nil, 1005, 1005, 1005, nil, 1005, 1005, + nil, 1005, 1005, 1005, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1005, nil, nil, 1005, nil, nil, 1005, + 1005, nil, nil, 1005, nil, nil, nil, nil, nil, 1005, + nil, nil, nil, nil, nil, nil, nil, 1005, nil, nil, + nil, nil, 1005, 1005, 1005, 1005, 1005, 1005, nil, nil, + nil, 1005, 1005, nil, nil, nil, nil, nil, nil, 1005, + nil, nil, 1005, 1005, 1005, nil, 1005, 1005, nil, nil, + 1005, 1005, 1031, 1031, 1031, nil, 1031, nil, nil, nil, + 1031, 1031, nil, nil, nil, 1031, nil, 1031, 1031, 1031, + 1031, 1031, 1031, 1031, nil, nil, nil, nil, nil, 1031, + 1031, 1031, 1031, 1031, 1031, 1031, nil, nil, 1031, nil, + nil, nil, nil, nil, nil, 1031, nil, nil, 1031, 1031, + 1031, 1031, 1031, 1031, 1031, 1031, nil, 1031, 1031, 1031, + nil, 1031, 1031, nil, 1031, 1031, 1031, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1031, nil, nil, 1031, + nil, nil, 1031, 1031, nil, nil, 1031, nil, nil, nil, + nil, nil, 1031, nil, nil, nil, nil, nil, nil, nil, + 1031, nil, nil, nil, nil, 1031, 1031, 1031, 1031, 1031, + 1031, nil, nil, nil, 1031, 1031, nil, nil, nil, nil, + nil, nil, 1031, nil, nil, 1031, 1031, 1031, nil, 1031, + 1031, nil, nil, 1031, 1031, 1040, 1040, 1040, nil, 1040, + nil, nil, nil, 1040, 1040, nil, nil, nil, 1040, nil, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, nil, nil, nil, + nil, nil, 1040, 1040, 1040, 1040, 1040, 1040, 1040, nil, + nil, 1040, nil, nil, nil, nil, nil, nil, 1040, nil, + nil, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, nil, + 1040, 1040, 1040, nil, 1040, 1040, nil, 1040, 1040, 1040, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1040, + nil, nil, 1040, nil, nil, 1040, 1040, nil, nil, 1040, + nil, 1040, nil, nil, nil, 1040, nil, nil, nil, nil, + nil, nil, nil, 1040, nil, nil, nil, nil, 1040, 1040, + 1040, 1040, 1040, 1040, nil, nil, nil, 1040, 1040, nil, + nil, nil, nil, nil, nil, 1040, nil, nil, 1040, 1040, + 1040, nil, 1040, 1040, nil, nil, 1040, 1040, 1064, 1064, + 1064, nil, 1064, nil, nil, nil, 1064, 1064, nil, nil, + nil, 1064, nil, 1064, 1064, 1064, 1064, 1064, 1064, 1064, + nil, nil, nil, nil, nil, 1064, 1064, 1064, 1064, 1064, + 1064, 1064, nil, nil, 1064, nil, nil, nil, nil, nil, + nil, 1064, nil, nil, 1064, 1064, 1064, 1064, 1064, 1064, + 1064, 1064, 1064, 1064, 1064, 1064, nil, 1064, 1064, nil, + 1064, 1064, 1064, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1064, nil, nil, 1064, nil, nil, 1064, 1064, + nil, nil, 1064, nil, nil, nil, 1064, nil, 1064, nil, + nil, nil, nil, nil, nil, nil, 1064, nil, nil, nil, + nil, 1064, 1064, 1064, 1064, 1064, 1064, nil, nil, nil, + 1064, 1064, nil, nil, nil, nil, nil, nil, 1064, nil, + 1064, 1064, 1064, 1064, nil, 1064, 1064, nil, nil, 1064, + 1064, 1088, 1088, 1088, nil, 1088, nil, nil, nil, 1088, + 1088, nil, nil, nil, 1088, nil, 1088, 1088, 1088, 1088, + 1088, 1088, 1088, nil, nil, nil, nil, nil, 1088, 1088, + 1088, 1088, 1088, 1088, 1088, nil, nil, 1088, nil, nil, + nil, nil, nil, nil, 1088, nil, nil, 1088, 1088, 1088, + 1088, 1088, 1088, 1088, 1088, nil, 1088, 1088, 1088, nil, + 1088, 1088, nil, 1088, 1088, 1088, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1088, nil, nil, 1088, nil, + nil, 1088, 1088, nil, nil, 1088, nil, nil, nil, nil, + nil, 1088, nil, nil, nil, nil, nil, nil, nil, 1088, + nil, nil, nil, nil, 1088, 1088, 1088, 1088, 1088, 1088, + nil, nil, nil, 1088, 1088, nil, nil, nil, nil, nil, + nil, 1088, nil, nil, 1088, 1088, 1088, nil, 1088, 1088, + nil, nil, 1088, 1088, 1145, 1145, 1145, nil, 1145, nil, + nil, nil, 1145, 1145, nil, nil, nil, 1145, nil, 1145, + 1145, 1145, 1145, 1145, 1145, 1145, nil, nil, nil, nil, + nil, 1145, 1145, 1145, 1145, 1145, 1145, 1145, nil, nil, + 1145, nil, nil, nil, nil, nil, nil, 1145, nil, nil, + 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, nil, 1145, + 1145, 1145, nil, 1145, 1145, nil, 1145, 1145, 1145, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1145, nil, + nil, 1145, nil, nil, 1145, 1145, nil, nil, 1145, nil, + nil, nil, nil, nil, 1145, nil, nil, nil, nil, nil, + nil, nil, 1145, nil, nil, nil, nil, 1145, 1145, 1145, + 1145, 1145, 1145, nil, nil, nil, 1145, 1145, nil, nil, + nil, nil, nil, nil, 1145, nil, nil, 1145, 1145, 1145, + nil, 1145, 1145, nil, nil, 1145, 1145, 1204, 1204, 1204, + nil, 1204, nil, nil, nil, 1204, 1204, nil, nil, nil, + 1204, nil, 1204, 1204, 1204, 1204, 1204, 1204, 1204, nil, + nil, nil, nil, nil, 1204, 1204, 1204, 1204, 1204, 1204, + 1204, nil, nil, 1204, nil, nil, nil, nil, nil, nil, + 1204, nil, nil, 1204, 1204, 1204, 1204, 1204, 1204, 1204, + 1204, nil, 1204, 1204, 1204, nil, 1204, 1204, nil, 1204, + 1204, 1204, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1204, nil, nil, 1204, nil, nil, 1204, 1204, nil, + nil, 1204, nil, nil, nil, nil, nil, 1204, nil, nil, + nil, nil, nil, nil, nil, 1204, nil, nil, nil, nil, + 1204, 1204, 1204, 1204, 1204, 1204, nil, nil, nil, 1204, + 1204, nil, nil, nil, nil, nil, nil, 1204, nil, nil, + 1204, 1204, 1204, nil, 1204, 1204, nil, nil, 1204, 1204, + 1205, 1205, 1205, nil, 1205, nil, nil, nil, 1205, 1205, + nil, nil, nil, 1205, nil, 1205, 1205, 1205, 1205, 1205, + 1205, 1205, nil, nil, nil, nil, nil, 1205, 1205, 1205, + 1205, 1205, 1205, 1205, nil, nil, 1205, nil, nil, nil, + nil, nil, nil, 1205, nil, nil, 1205, 1205, 1205, 1205, + 1205, 1205, 1205, 1205, nil, 1205, 1205, 1205, nil, 1205, + 1205, nil, 1205, 1205, 1205, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1205, nil, nil, 1205, nil, nil, + 1205, 1205, nil, nil, 1205, nil, nil, nil, nil, nil, + 1205, nil, nil, nil, nil, nil, nil, nil, 1205, nil, + nil, nil, nil, 1205, 1205, 1205, 1205, 1205, 1205, nil, + nil, nil, 1205, 1205, nil, nil, nil, nil, nil, nil, + 1205, nil, nil, 1205, 1205, 1205, nil, 1205, 1205, nil, + nil, 1205, 1205, 1219, 1219, 1219, nil, 1219, nil, nil, + nil, 1219, 1219, nil, nil, nil, 1219, nil, 1219, 1219, + 1219, 1219, 1219, 1219, 1219, nil, nil, nil, nil, nil, + 1219, 1219, 1219, 1219, 1219, 1219, 1219, nil, nil, 1219, + nil, nil, nil, nil, nil, nil, 1219, nil, nil, 1219, + 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, + 1219, nil, 1219, 1219, nil, 1219, 1219, 1219, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1219, nil, nil, + 1219, nil, nil, 1219, 1219, nil, nil, 1219, nil, 1219, + nil, 1219, nil, 1219, nil, nil, nil, nil, nil, nil, + nil, 1219, nil, nil, nil, nil, 1219, 1219, 1219, 1219, + 1219, 1219, nil, nil, nil, 1219, 1219, nil, nil, nil, + nil, nil, nil, 1219, nil, 1219, 1219, 1219, 1219, nil, + 1219, 1219, nil, nil, 1219, 1219, 40, 40, 40, nil, + 40, nil, nil, nil, 40, 40, nil, nil, nil, 40, + nil, 40, 40, 40, 40, 40, 40, 40, nil, nil, + nil, nil, nil, 40, 40, 40, 40, 40, 40, 40, + nil, nil, 40, nil, nil, nil, nil, nil, nil, 40, + nil, nil, 40, 40, 40, 40, 40, 40, 40, 40, + nil, 40, 40, 40, nil, 40, 40, nil, nil, nil, + 40, nil, nil, nil, nil, nil, 1075, nil, 1075, 1075, + 1075, 1075, 1075, nil, nil, nil, nil, nil, nil, nil, + 40, nil, 1075, 40, nil, nil, 40, 40, nil, nil, + 40, nil, 40, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1075, nil, nil, nil, nil, 40, + 40, 40, 40, 40, 40, 1075, 1075, nil, 40, 40, + nil, nil, nil, nil, nil, nil, 40, nil, nil, 40, + 40, 40, nil, 40, 40, 41, 41, 41, nil, 41, + nil, nil, nil, 41, 41, nil, nil, nil, 41, 1075, + 41, 41, 41, 41, 41, 41, 41, nil, nil, 1075, + nil, nil, 41, 41, 41, 41, 41, 41, 41, nil, + nil, 41, nil, nil, nil, nil, nil, nil, 41, nil, + nil, 41, 41, 41, 41, 41, 41, 41, 41, nil, + 41, 41, 41, nil, 41, 41, nil, nil, nil, 41, + nil, nil, nil, nil, nil, 1077, nil, 1077, 1077, 1077, + 1077, 1077, nil, nil, nil, nil, nil, nil, nil, 41, + nil, 1077, 41, nil, nil, 41, 41, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1077, nil, nil, nil, nil, 41, 41, + 41, 41, 41, 41, 1077, 1077, nil, 41, 41, nil, + nil, nil, 41, nil, nil, 41, nil, nil, 41, 41, + 41, nil, 41, 41, 77, 77, 77, nil, 77, nil, + nil, nil, 77, 77, nil, nil, nil, 77, 1077, 77, + 77, 77, 77, 77, 77, 77, nil, nil, 1077, nil, + nil, 77, 77, 77, 77, 77, 77, 77, nil, nil, + 77, nil, nil, nil, nil, nil, nil, 77, nil, nil, + 77, 77, 77, 77, 77, 77, 77, 77, nil, 77, + 77, 77, nil, 77, 77, nil, nil, nil, 77, nil, + nil, nil, nil, nil, 1079, nil, 1079, 1079, 1079, 1079, + 1079, nil, nil, nil, nil, nil, nil, nil, 77, nil, + 1079, 77, nil, nil, 77, 77, nil, nil, 77, nil, + 77, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1079, nil, nil, nil, nil, 77, 77, 77, + 77, 77, 77, 1079, 1079, nil, 77, 77, nil, nil, + nil, nil, nil, nil, 77, nil, nil, 77, 77, 77, + nil, 77, 77, 78, 78, 78, nil, 78, nil, nil, + nil, 78, 78, nil, nil, nil, 78, 1079, 78, 78, + 78, 78, 78, 78, 78, nil, nil, 1079, nil, nil, + 78, 78, 78, 78, 78, 78, 78, nil, nil, 78, + nil, nil, nil, nil, nil, nil, 78, nil, nil, 78, + 78, 78, 78, 78, 78, 78, 78, nil, 78, 78, + 78, nil, 78, 78, nil, nil, nil, 78, nil, nil, + nil, nil, nil, 1223, nil, 1223, 1223, 1223, 1223, 1223, + nil, nil, nil, nil, 78, nil, nil, 78, nil, 1223, + 78, nil, nil, 78, 78, nil, nil, 78, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1223, nil, nil, nil, nil, 78, 78, 78, 78, + 78, 78, 1223, 1223, nil, 78, 78, nil, nil, nil, + nil, nil, nil, 78, nil, nil, 78, 78, 78, nil, + 78, 78, 79, 79, 79, nil, 79, nil, nil, nil, + 79, 79, nil, nil, nil, 79, 1223, 79, 79, 79, + 79, 79, 79, 79, nil, nil, 1223, nil, nil, 79, + 79, 79, 79, 79, 79, 79, nil, nil, 79, nil, + nil, nil, nil, nil, nil, 79, nil, nil, 79, 79, + 79, 79, 79, 79, 79, 79, nil, 79, 79, 79, + nil, 79, 79, nil, nil, nil, 79, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 79, nil, nil, 79, + nil, nil, 79, 79, nil, nil, 79, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 79, 79, 79, 79, 79, + 79, nil, nil, nil, 79, 79, nil, nil, nil, nil, + nil, nil, 79, nil, nil, 79, 79, 79, nil, 79, + 79, 351, 351, 351, nil, 351, nil, nil, nil, 351, + 351, nil, nil, nil, 351, nil, 351, 351, 351, 351, + 351, 351, 351, nil, nil, nil, nil, nil, 351, 351, + 351, 351, 351, 351, 351, nil, nil, 351, nil, nil, + nil, nil, nil, nil, 351, nil, nil, 351, 351, 351, + 351, 351, 351, 351, 351, nil, 351, 351, 351, nil, + 351, 351, nil, nil, nil, 351, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 351, nil, nil, 351, nil, + nil, 351, 351, nil, nil, 351, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 351, 351, 351, 351, 351, 351, + nil, nil, nil, 351, 351, nil, nil, nil, 351, nil, + nil, 351, nil, nil, 351, 351, 351, nil, 351, 351, + 370, 370, 370, nil, 370, nil, nil, nil, 370, 370, + nil, nil, nil, 370, nil, 370, 370, 370, 370, 370, + 370, 370, nil, nil, nil, nil, nil, 370, 370, 370, + 370, 370, 370, 370, nil, nil, 370, nil, nil, nil, + nil, nil, nil, 370, nil, nil, 370, 370, 370, 370, + 370, 370, 370, 370, nil, 370, 370, 370, nil, 370, + 370, nil, nil, nil, 370, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 370, nil, nil, 370, nil, nil, + 370, 370, nil, nil, 370, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 370, 370, 370, 370, 370, 370, nil, + nil, nil, 370, 370, nil, nil, nil, nil, nil, nil, + 370, nil, nil, 370, 370, 370, nil, 370, 370, 618, + 618, 618, nil, 618, nil, nil, nil, 618, 618, nil, + nil, nil, 618, nil, 618, 618, 618, 618, 618, 618, + 618, nil, nil, nil, nil, nil, 618, 618, 618, 618, + 618, 618, 618, nil, nil, 618, nil, nil, nil, nil, + nil, nil, 618, nil, nil, 618, 618, 618, 618, 618, + 618, 618, 618, nil, 618, 618, 618, nil, 618, 618, + nil, nil, nil, 618, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 618, nil, nil, 618, nil, nil, 618, + 618, nil, nil, 618, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 618, 618, 618, 618, 618, 618, nil, nil, + nil, 618, 618, nil, nil, nil, nil, nil, nil, 618, + nil, nil, 618, 618, 618, nil, 618, 618, 627, 627, + 627, nil, 627, nil, nil, nil, 627, 627, nil, nil, + nil, 627, nil, 627, 627, 627, 627, 627, 627, 627, + nil, nil, nil, nil, nil, 627, 627, 627, 627, 627, + 627, 627, nil, nil, 627, nil, nil, nil, nil, nil, + nil, 627, nil, nil, 627, 627, 627, 627, 627, 627, + 627, 627, nil, 627, 627, 627, nil, 627, 627, nil, + nil, nil, 627, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 627, nil, nil, 627, nil, nil, 627, 627, + nil, nil, 627, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 627, 627, 627, 627, 627, 627, nil, nil, nil, + 627, 627, nil, nil, nil, nil, nil, nil, 627, nil, + nil, 627, 627, 627, nil, 627, 627, 845, 845, 845, + nil, 845, nil, nil, nil, 845, 845, nil, nil, nil, + 845, nil, 845, 845, 845, 845, 845, 845, 845, nil, + nil, nil, nil, nil, 845, 845, 845, 845, 845, 845, + 845, nil, nil, 845, nil, nil, nil, nil, nil, nil, + 845, nil, nil, 845, 845, 845, 845, 845, 845, 845, + 845, nil, 845, 845, 845, nil, 845, 845, nil, nil, + nil, 845, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 845, nil, nil, 845, nil, nil, 845, 845, nil, + nil, 845, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 845, 845, 845, 845, 845, 845, nil, nil, nil, 845, + 845, nil, nil, nil, nil, nil, nil, 845, nil, nil, + 845, 845, 845, nil, 845, 845, 856, 856, 856, nil, + 856, nil, nil, nil, 856, 856, nil, nil, nil, 856, + nil, 856, 856, 856, 856, 856, 856, 856, nil, nil, + nil, nil, nil, 856, 856, 856, 856, 856, 856, 856, + nil, nil, 856, nil, nil, nil, nil, nil, nil, 856, + nil, nil, 856, 856, 856, 856, 856, 856, 856, 856, + nil, 856, 856, 856, nil, 856, 856, nil, nil, nil, + 856, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 856, nil, nil, 856, nil, nil, 856, 856, nil, nil, + 856, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 856, + 856, 856, 856, 856, 856, nil, nil, nil, 856, 856, + nil, nil, nil, nil, nil, nil, 856, nil, nil, 856, + 856, 856, nil, 856, 856, 1070, 1070, 1070, nil, 1070, + nil, nil, nil, 1070, 1070, nil, nil, nil, 1070, nil, + 1070, 1070, 1070, 1070, 1070, 1070, 1070, nil, nil, nil, + nil, nil, 1070, 1070, 1070, 1070, 1070, 1070, 1070, nil, + nil, 1070, nil, nil, nil, nil, nil, nil, 1070, nil, + nil, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, nil, + 1070, 1070, 1070, nil, 1070, 1070, nil, nil, nil, 1070, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1070, + nil, nil, 1070, nil, nil, 1070, 1070, nil, nil, 1070, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1070, 1070, + 1070, 1070, 1070, 1070, nil, nil, nil, 1070, 1070, nil, + nil, nil, nil, nil, nil, 1070, nil, nil, 1070, 1070, + 1070, nil, 1070, 1070, 1131, 1131, 1131, nil, 1131, nil, + nil, nil, 1131, 1131, nil, nil, nil, 1131, nil, 1131, + 1131, 1131, 1131, 1131, 1131, 1131, nil, nil, nil, nil, + nil, 1131, 1131, 1131, 1131, 1131, 1131, 1131, nil, nil, + 1131, nil, nil, nil, nil, nil, nil, 1131, nil, nil, + 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, nil, 1131, + 1131, 1131, nil, 1131, 1131, nil, nil, nil, 1131, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1131, nil, + nil, 1131, nil, nil, 1131, 1131, nil, nil, 1131, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1131, 1131, 1131, + 1131, 1131, 1131, nil, nil, nil, 1131, 1131, nil, nil, + nil, nil, nil, nil, 1131, nil, nil, 1131, 1131, 1131, + nil, 1131, 1131, 1198, 1198, 1198, nil, 1198, nil, nil, + nil, 1198, 1198, nil, nil, nil, 1198, nil, 1198, 1198, + 1198, 1198, 1198, 1198, 1198, nil, nil, nil, nil, nil, + 1198, 1198, 1198, 1198, 1198, 1198, 1198, nil, nil, 1198, + nil, nil, nil, nil, nil, nil, 1198, nil, nil, 1198, + 1198, 1198, 1198, 1198, 1198, 1198, 1198, nil, 1198, 1198, + 1198, nil, 1198, 1198, nil, nil, nil, 1198, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1198, nil, nil, + 1198, nil, nil, 1198, 1198, nil, nil, 1198, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1198, 1198, 1198, 1198, + 1198, 1198, nil, nil, nil, 1198, 1198, nil, nil, nil, + nil, nil, nil, 1198, nil, nil, 1198, 1198, 1198, nil, + 1198, 1198, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, nil, nil, nil, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, nil, + nil, nil, nil, nil, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, nil, 11, nil, nil, nil, nil, + nil, nil, nil, nil, 11, 11, nil, 11, 11, 11, + 11, 11, 11, 11, nil, nil, 11, 11, nil, nil, + nil, 11, 11, 11, 11, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 11, 11, + nil, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, nil, nil, 11, 11, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 11, nil, nil, nil, nil, + nil, nil, nil, nil, 11, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, nil, + nil, nil, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, nil, nil, nil, nil, nil, 12, 12, 12, + 12, 12, 12, 12, 12, 12, nil, nil, 12, nil, + nil, nil, nil, nil, nil, nil, nil, 12, 12, nil, + 12, 12, 12, 12, 12, 12, 12, nil, nil, 12, + 12, nil, nil, nil, 12, 12, 12, 12, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 12, 12, nil, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, nil, nil, 12, 12, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 12, nil, + nil, nil, nil, nil, nil, nil, nil, 12, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, nil, nil, nil, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, nil, nil, nil, nil, nil, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, nil, 27, nil, nil, nil, nil, nil, nil, + 27, 27, nil, 27, 27, 27, 27, 27, 27, 27, + nil, nil, 27, 27, nil, nil, nil, 27, 27, 27, + 27, nil, nil, nil, nil, nil, 27, nil, nil, nil, + nil, nil, nil, nil, 27, 27, nil, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, nil, nil, + 27, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 27, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, nil, nil, nil, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, nil, nil, + nil, nil, nil, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, nil, 109, nil, nil, nil, + nil, nil, nil, 109, 109, nil, 109, 109, 109, 109, + 109, 109, 109, nil, nil, 109, 109, nil, nil, nil, + 109, 109, 109, 109, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 109, 109, nil, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, nil, nil, 109, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 109, 452, 452, 452, 452, 452, 452, + 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, + 452, 452, 452, 452, 452, 452, 452, 452, nil, nil, + nil, 452, 452, 452, 452, 452, 452, 452, 452, 452, + 452, nil, nil, nil, nil, nil, 452, 452, 452, 452, + 452, 452, 452, 452, 452, nil, nil, 452, nil, nil, + nil, nil, nil, nil, nil, nil, 452, 452, nil, 452, + 452, 452, 452, 452, 452, 452, nil, nil, 452, 452, + nil, nil, nil, 452, 452, 452, 452, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 452, 452, nil, 452, 452, 452, 452, 452, 452, 452, + 452, 452, 452, 452, nil, nil, 452, 452, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 452, nil, nil, + nil, nil, nil, nil, nil, nil, 452, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, + 706, nil, nil, nil, 706, 706, 706, 706, 706, 706, + 706, 706, 706, 706, nil, nil, nil, nil, nil, 706, + 706, 706, 706, 706, 706, 706, 706, 706, nil, nil, + 706, nil, nil, nil, nil, nil, nil, nil, nil, 706, + 706, nil, 706, 706, 706, 706, 706, 706, 706, nil, + nil, 706, 706, nil, nil, nil, 706, 706, 706, 706, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 706, 706, nil, 706, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, nil, nil, 706, + 706, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 706, nil, nil, nil, nil, nil, nil, nil, nil, 706, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, nil, nil, nil, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, nil, nil, nil, + nil, nil, 821, 821, 821, 821, 821, 821, 821, 821, + 821, nil, nil, 821, nil, nil, nil, nil, nil, nil, + nil, nil, 821, 821, nil, 821, 821, 821, 821, 821, + 821, 821, nil, nil, 821, 821, nil, nil, nil, 821, + 821, 821, 821, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 821, 821, nil, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + nil, nil, 821, nil, nil, nil, nil, 553, 553, 553, + 553, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 821, 553, 553, 553, 553, nil, nil, nil, + 553, 553, nil, nil, nil, nil, 553, 553, nil, nil, + nil, 553, 553, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 553, nil, nil, 553, nil, nil, nil, 553, nil, + nil, 553, nil, 553, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 553, nil, nil, nil, + 553, 553, 553, 553, 553, 553, nil, nil, nil, 553, + 553, nil, nil, nil, nil, nil, nil, 553, nil, 553, + 553, 553, 553, nil, 553, 553, nil, nil, 553, 553, + 554, 554, 554, 554, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 554, 554, 554, 554, + nil, nil, nil, 554, 554, nil, nil, nil, nil, 554, + 554, nil, nil, nil, 554, 554, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 554, nil, nil, 554, nil, nil, + nil, 554, nil, nil, 554, nil, 554, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 554, + nil, nil, nil, 554, 554, 554, 554, 554, 554, nil, + nil, nil, 554, 554, nil, nil, nil, nil, nil, nil, + 554, nil, 554, 554, 554, 554, nil, 554, 554, nil, + nil, 554, 554, 786, 786, 786, 786, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 786, + 786, 786, 786, nil, nil, nil, 786, nil, nil, nil, + nil, nil, 786, 786, nil, nil, nil, 786, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 786, nil, nil, + 786, nil, nil, nil, 786, nil, nil, 786, nil, 786, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 786, nil, nil, nil, 786, 786, 786, 786, + 786, 786, nil, nil, nil, 786, 786, 786, nil, nil, + nil, nil, nil, 786, nil, nil, 786, 786, 786, nil, + 786, 786, nil, nil, 786, 786, 794, 794, 794, 794, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 794, 794, 794, 794, nil, nil, nil, 794, + nil, nil, nil, nil, nil, 794, 794, nil, nil, nil, + 794, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 794, nil, nil, 794, nil, nil, nil, 794, nil, nil, + 794, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 794, nil, nil, nil, 794, + 794, 794, 794, 794, 794, nil, nil, nil, 794, 794, + nil, nil, nil, nil, nil, nil, 794, nil, nil, 794, + 794, 794, nil, 794, 794, nil, nil, 794, 794, 967, + 967, 967, 967, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 967, 967, 967, 967, nil, + nil, nil, 967, nil, nil, nil, nil, nil, 967, 967, + nil, nil, nil, 967, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 967, nil, nil, 967, nil, nil, nil, + 967, nil, nil, 967, nil, 967, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 967, nil, + nil, nil, 967, 967, 967, 967, 967, 967, nil, nil, + nil, 967, 967, nil, nil, nil, nil, nil, nil, 967, + nil, nil, 967, 967, 967, nil, 967, 967, nil, nil, + 967, 967, 969, 969, 969, 969, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 969, 969, + 969, 969, nil, nil, nil, 969, nil, nil, nil, nil, + nil, 969, 969, nil, nil, nil, 969, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 969, nil, nil, 969, + nil, nil, nil, 969, nil, nil, 969, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 969, nil, nil, nil, 969, 969, 969, 969, 969, + 969, nil, nil, nil, 969, 969, nil, nil, nil, nil, + nil, nil, 969, nil, nil, 969, 969, 969, nil, 969, + 969, nil, nil, 969, 969, 972, 972, 972, 972, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 972, 972, 972, 972, nil, nil, nil, 972, 972, + nil, nil, nil, nil, 972, 972, nil, nil, nil, 972, + 972, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 972, + nil, nil, 972, nil, nil, nil, 972, nil, nil, 972, + nil, 972, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 972, nil, nil, nil, 972, 972, + 972, 972, 972, 972, nil, nil, nil, 972, 972, nil, + nil, nil, nil, nil, nil, 972, nil, 972, 972, 972, + 972, nil, 972, 972, nil, nil, 972, 972, 973, 973, + 973, 973, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 973, 973, 973, 973, nil, nil, + nil, 973, 973, nil, nil, nil, nil, 973, 973, nil, + nil, nil, 973, 973, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 973, nil, nil, 973, nil, nil, nil, 973, + nil, nil, 973, nil, 973, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 973, nil, nil, + nil, 973, 973, 973, 973, 973, 973, nil, nil, nil, + 973, 973, nil, nil, nil, nil, nil, nil, 973, nil, + 973, 973, 973, 973, nil, 973, 973, nil, nil, 973, + 973, 979, 979, 979, 979, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 979, 979, 979, + 979, nil, nil, nil, 979, nil, nil, nil, nil, nil, + 979, 979, nil, nil, nil, 979, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 979, nil, nil, 979, nil, + nil, nil, 979, nil, nil, 979, nil, 979, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 979, nil, nil, nil, 979, 979, 979, 979, 979, 979, + nil, nil, nil, 979, 979, nil, nil, nil, nil, nil, + nil, 979, nil, nil, 979, 979, 979, nil, 979, 979, + nil, nil, 979, 979, 985, 985, 985, 985, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 985, 985, 985, 985, nil, nil, nil, 985, nil, nil, + nil, nil, nil, 985, 985, nil, nil, nil, 985, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 985, nil, + nil, 985, nil, nil, nil, 985, nil, nil, 985, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 985, nil, nil, nil, 985, 985, 985, + 985, 985, 985, nil, nil, nil, 985, 985, nil, nil, + nil, nil, nil, nil, 985, nil, nil, 985, 985, 985, + nil, 985, 985, nil, nil, 985, 985, 986, 986, 986, + 986, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 986, 986, 986, 986, nil, nil, nil, + 986, nil, nil, nil, nil, nil, 986, 986, nil, nil, + nil, 986, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 986, nil, nil, 986, nil, nil, nil, 986, nil, + nil, 986, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 986, nil, nil, nil, + 986, 986, 986, 986, 986, 986, nil, nil, nil, 986, + 986, nil, nil, nil, nil, nil, nil, 986, nil, nil, + 986, 986, 986, nil, 986, 986, nil, nil, 986, 986, + 1038, 1038, 1038, 1038, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1038, 1038, 1038, 1038, + nil, nil, nil, 1038, 1038, nil, nil, nil, nil, 1038, + 1038, nil, nil, nil, 1038, 1038, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1038, nil, nil, 1038, nil, nil, + nil, 1038, nil, nil, 1038, nil, 1038, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1038, + nil, nil, nil, 1038, 1038, 1038, 1038, 1038, 1038, nil, + nil, nil, 1038, 1038, nil, nil, nil, nil, nil, nil, + 1038, nil, 1038, 1038, 1038, 1038, nil, 1038, 1038, nil, + nil, 1038, 1038, 1170, 1170, 1170, 1170, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1170, + 1170, 1170, 1170, nil, nil, nil, 1170, nil, nil, nil, + nil, nil, 1170, 1170, nil, nil, nil, 1170, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1170, nil, nil, + 1170, nil, nil, nil, 1170, nil, nil, 1170, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1170, nil, nil, nil, 1170, 1170, 1170, 1170, + 1170, 1170, nil, nil, nil, 1170, 1170, nil, nil, nil, + nil, nil, nil, 1170, nil, nil, 1170, 1170, 1170, nil, + 1170, 1170, nil, nil, 1170, 1170, 1179, 1179, 1179, 1179, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1179, 1179, 1179, 1179, nil, nil, nil, 1179, + nil, nil, nil, nil, nil, 1179, 1179, nil, nil, nil, + 1179, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1179, nil, nil, 1179, nil, nil, nil, 1179, nil, nil, + 1179, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1179, nil, nil, nil, 1179, + 1179, 1179, 1179, 1179, 1179, nil, nil, nil, 1179, 1179, + nil, nil, nil, nil, nil, nil, 1179, nil, nil, 1179, + 1179, 1179, nil, 1179, 1179, nil, nil, 1179, 1179, 1183, + 1183, 1183, 1183, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1183, 1183, 1183, 1183, nil, + nil, nil, 1183, nil, nil, nil, nil, nil, 1183, 1183, + nil, nil, nil, 1183, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1183, nil, nil, 1183, nil, nil, nil, + 1183, nil, nil, 1183, nil, 1183, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1183, nil, + nil, nil, 1183, 1183, 1183, 1183, 1183, 1183, nil, nil, + nil, 1183, 1183, nil, nil, nil, nil, nil, nil, 1183, + nil, nil, 1183, 1183, 1183, nil, 1183, 1183, nil, nil, + 1183, 1183, 1230, 1230, 1230, 1230, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1230, 1230, + 1230, 1230, nil, nil, nil, 1230, nil, nil, nil, nil, + nil, 1230, 1230, nil, nil, nil, 1230, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1230, nil, nil, 1230, + nil, nil, nil, 1230, nil, nil, 1230, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1230, nil, nil, nil, 1230, 1230, 1230, 1230, 1230, + 1230, nil, nil, nil, 1230, 1230, nil, nil, nil, nil, + nil, nil, 1230, nil, nil, 1230, 1230, 1230, nil, 1230, + 1230, nil, nil, 1230, 1230, 1261, 1261, 1261, 1261, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1261, 1261, 1261, 1261, nil, nil, nil, 1261, nil, + nil, nil, nil, nil, 1261, 1261, nil, nil, nil, 1261, + nil, nil, nil, nil, nil, nil, nil, 994, 994, 994, + 994, nil, nil, nil, nil, nil, nil, nil, nil, 1261, + nil, nil, 1261, 994, 994, 994, 1261, nil, nil, 1261, + nil, nil, nil, nil, nil, nil, 994, 994, nil, nil, + nil, 994, nil, nil, 1261, nil, nil, nil, 1261, 1261, + 1261, 1261, 1261, 1261, nil, nil, nil, 1261, 1261, nil, + nil, nil, nil, nil, nil, 1261, nil, nil, 1261, 1261, + 1261, nil, 1261, 1261, nil, nil, 1261, 1261, nil, nil, + 240, nil, 240, 240, 240, 240, 240, nil, nil, nil, + 994, 994, 994, 994, 994, 994, 240, nil, nil, 994, + 994, nil, nil, nil, nil, nil, nil, 994, nil, nil, + 994, 994, 994, nil, 994, 994, nil, 241, 240, 241, + 241, 241, 241, 241, nil, nil, nil, 240, 240, 240, + 240, nil, 417, 241, 417, 417, 417, 417, 417, nil, + 679, nil, 679, 679, 679, 679, 679, nil, 417, nil, + nil, nil, nil, nil, nil, 241, 679, nil, nil, nil, + nil, nil, nil, 240, 241, 241, 241, 241, nil, nil, + 417, 417, nil, 240, nil, nil, nil, nil, 679, 417, + 417, 417, 417, nil, nil, nil, nil, 679, 679, 679, + 679, 742, nil, 742, 742, 742, 742, 742, nil, nil, + 241, nil, nil, nil, nil, nil, nil, 742, nil, nil, + 241, nil, nil, nil, 744, 417, 744, 744, 744, 744, + 744, nil, nil, 679, nil, 417, nil, nil, nil, 742, + 744, nil, nil, 679, nil, nil, nil, nil, 742, 742, + 742, 742, 1073, nil, 1073, 1073, 1073, 1073, 1073, nil, + nil, nil, 744, nil, nil, nil, nil, nil, 1073, nil, + nil, 744, 744, 744, 744, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 742, nil, nil, nil, nil, nil, + 1073, nil, nil, nil, 742, nil, nil, nil, nil, 1073, + 1073, 1073, 1073, nil, nil, nil, nil, 744, 232, 232, + nil, nil, 232, nil, nil, nil, nil, 744, nil, nil, + nil, 232, 232, nil, 232, 232, 232, 232, 232, 232, + 232, nil, nil, 232, 232, 1073, nil, nil, 232, 232, + 232, 232, nil, nil, nil, 1073, nil, 232, nil, nil, + nil, nil, nil, nil, nil, 232, 232, nil, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, nil, + nil, 232, nil, nil, nil, nil, 233, 233, nil, nil, + 233, nil, nil, nil, nil, nil, nil, nil, nil, 233, + 233, 232, 233, 233, 233, 233, 233, 233, 233, nil, + nil, 233, 233, nil, nil, nil, 233, 233, 233, 233, + nil, nil, nil, nil, nil, 233, nil, nil, nil, nil, + nil, nil, nil, 233, 233, nil, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, nil, nil, 233, + nil, nil, nil, nil, 310, 310, nil, nil, 310, nil, + nil, nil, nil, nil, nil, nil, nil, 310, 310, 233, + 310, 310, 310, 310, 310, 310, 310, nil, nil, 310, + 310, nil, nil, nil, 310, 310, 310, 310, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 310, 310, nil, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, nil, nil, 310, nil, nil, + nil, nil, 544, 544, nil, nil, 544, nil, nil, nil, + nil, nil, nil, nil, nil, 544, 544, 310, 544, 544, + 544, 544, 544, 544, 544, nil, nil, 544, 544, nil, + nil, nil, 544, 544, 544, 544, nil, nil, nil, nil, + nil, 544, nil, nil, nil, nil, nil, nil, nil, 544, + 544, nil, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, nil, nil, 544, nil, nil, nil, nil, + 545, 545, nil, nil, 545, nil, nil, nil, nil, nil, + nil, nil, nil, 545, 545, 544, 545, 545, 545, 545, + 545, 545, 545, nil, nil, 545, 545, nil, nil, nil, + 545, 545, 545, 545, nil, nil, nil, nil, nil, 545, + nil, nil, nil, nil, nil, nil, nil, 545, 545, nil, + 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, + 545, nil, nil, 545, nil, nil, nil, nil, 621, 621, + nil, nil, 621, nil, nil, nil, nil, nil, nil, nil, + nil, 621, 621, 545, 621, 621, 621, 621, 621, 621, + 621, nil, nil, 621, 621, nil, nil, nil, 621, 621, + 621, 621, nil, nil, nil, nil, nil, 621, nil, nil, + nil, nil, nil, nil, nil, 621, 621, nil, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, nil, + nil, 621, nil, nil, nil, nil, 622, 622, nil, nil, + 622, nil, nil, nil, nil, nil, nil, nil, nil, 622, + 622, 621, 622, 622, 622, 622, 622, 622, 622, nil, + nil, 622, 622, nil, nil, nil, 622, 622, 622, 622, + nil, nil, nil, nil, nil, 622, nil, nil, nil, nil, + nil, nil, nil, 622, 622, nil, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, nil, nil, 622, + nil, nil, nil, nil, 631, 631, nil, nil, 631, nil, + nil, nil, nil, nil, nil, nil, nil, 631, 631, 622, + 631, 631, 631, 631, 631, 631, 631, nil, nil, 631, + 631, nil, nil, nil, 631, 631, 631, 631, nil, nil, + nil, nil, nil, 631, nil, nil, nil, nil, nil, nil, + nil, 631, 631, nil, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 631, nil, nil, 631, nil, nil, + nil, nil, 632, 632, nil, nil, 632, nil, nil, nil, + nil, nil, nil, nil, nil, 632, 632, 631, 632, 632, + 632, 632, 632, 632, 632, nil, nil, 632, 632, nil, + nil, nil, 632, 632, 632, 632, nil, nil, nil, nil, + nil, 632, nil, nil, nil, nil, nil, nil, nil, 632, + 632, nil, 632, 632, 632, 632, 632, 632, 632, 632, + 632, 632, 632, nil, nil, 632, nil, nil, nil, nil, + 663, 663, nil, nil, 663, nil, nil, nil, nil, nil, + nil, nil, nil, 663, 663, 632, 663, 663, 663, 663, + 663, 663, 663, nil, nil, 663, 663, nil, nil, nil, + 663, 663, 663, 663, nil, nil, nil, nil, nil, 663, + nil, nil, nil, nil, nil, nil, nil, 663, 663, nil, + 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, + 663, nil, nil, 663, nil, nil, nil, nil, 664, 664, + nil, nil, 664, nil, nil, nil, nil, nil, nil, nil, + nil, 664, 664, 663, 664, 664, 664, 664, 664, 664, + 664, nil, nil, 664, 664, nil, nil, nil, 664, 664, + 664, 664, nil, nil, nil, nil, nil, 664, nil, nil, + nil, nil, nil, nil, nil, 664, 664, nil, 664, 664, + 664, 664, 664, 664, 664, 664, 664, 664, 664, nil, + nil, 664, nil, nil, nil, nil, 670, 670, nil, nil, + 670, nil, nil, nil, nil, nil, nil, nil, nil, 670, + 670, 664, 670, 670, 670, 670, 670, 670, 670, nil, + nil, 670, 670, nil, nil, nil, 670, 670, 670, 670, + nil, nil, nil, nil, nil, 670, nil, nil, nil, nil, + nil, nil, nil, 670, 670, nil, 670, 670, 670, 670, + 670, 670, 670, 670, 670, 670, 670, nil, nil, 670, + nil, nil, nil, nil, 671, 671, nil, nil, 671, nil, + nil, nil, nil, nil, nil, nil, nil, 671, 671, 670, + 671, 671, 671, 671, 671, 671, 671, nil, nil, 671, + 671, nil, nil, nil, 671, 671, 671, 671, nil, nil, + nil, nil, nil, 671, nil, nil, nil, nil, nil, nil, + nil, 671, 671, nil, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 671, nil, nil, 671, nil, nil, + nil, nil, 713, 713, nil, nil, 713, nil, nil, nil, + nil, nil, nil, nil, nil, 713, 713, 671, 713, 713, + 713, 713, 713, 713, 713, nil, nil, 713, 713, nil, + nil, nil, 713, 713, 713, 713, nil, nil, nil, nil, + nil, 713, nil, nil, nil, nil, nil, nil, nil, 713, + 713, nil, 713, 713, 713, 713, 713, 713, 713, 713, + 713, 713, 713, nil, nil, 713, nil, nil, nil, nil, + 714, 714, nil, nil, 714, nil, nil, nil, nil, nil, + nil, nil, nil, 714, 714, 713, 714, 714, 714, 714, + 714, 714, 714, nil, nil, 714, 714, nil, nil, nil, + 714, 714, 714, 714, nil, nil, nil, nil, nil, 714, + nil, nil, nil, nil, nil, nil, nil, 714, 714, nil, + 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, + 714, nil, nil, 714, nil, nil, nil, nil, 1220, 1220, + nil, nil, 1220, nil, nil, nil, nil, nil, nil, nil, + nil, 1220, 1220, 714, 1220, 1220, 1220, 1220, 1220, 1220, + 1220, nil, nil, 1220, 1220, nil, nil, nil, 1220, 1220, + 1220, 1220, nil, nil, nil, nil, nil, 1220, nil, nil, + nil, nil, nil, nil, nil, 1220, 1220, nil, 1220, 1220, + 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, nil, + nil, 1220, nil, nil, nil, nil, 1221, 1221, nil, nil, + 1221, nil, nil, nil, nil, nil, nil, nil, nil, 1221, + 1221, 1220, 1221, 1221, 1221, 1221, 1221, 1221, 1221, nil, + nil, 1221, 1221, nil, nil, nil, 1221, 1221, 1221, 1221, + nil, nil, nil, nil, nil, 1221, nil, nil, nil, nil, + nil, nil, nil, 1221, 1221, nil, 1221, 1221, 1221, 1221, + 1221, 1221, 1221, 1221, 1221, 1221, 1221, nil, nil, 1221, + nil, nil, nil, nil, 1245, 1245, nil, nil, 1245, nil, + nil, nil, nil, nil, nil, nil, nil, 1245, 1245, 1221, + 1245, 1245, 1245, 1245, 1245, 1245, 1245, nil, nil, 1245, + 1245, nil, nil, nil, 1245, 1245, 1245, 1245, nil, nil, + nil, nil, nil, 1245, nil, nil, nil, nil, nil, nil, + nil, 1245, 1245, nil, 1245, 1245, 1245, 1245, 1245, 1245, + 1245, 1245, 1245, 1245, 1245, nil, nil, 1245, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1245 ] + +racc_action_pointer = [ + nil, 193, 1098, 202, nil, 194, nil, nil, 5417, 1083, + nil, 26870, 27003, 105, nil, 108, 177, 23, 287, 317, + -32, 92, 283, nil, -65, 5560, 1386, 27136, 362, nil, + -40, nil, 165, 5698, 5830, 5960, 6103, 6246, nil, 1242, + 24924, 25063, nil, 280, 449, 513, 370, 6389, 6532, 167, + 6675, 6818, 697, 6961, 315, 361, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 7099, nil, 7240, 7383, nil, + -22, nil, 7526, 7669, nil, nil, 7812, 25202, 25341, 25480, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 208, nil, nil, nil, + nil, nil, nil, 323, 380, 417, 425, nil, nil, 27269, + nil, nil, nil, nil, nil, nil, 0, nil, nil, 136, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 7955, nil, nil, nil, nil, 8098, 8241, 8384, + 8527, 8670, 467, nil, 399, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 461, nil, 1386, 8813, 8956, 9099, 9242, + 9385, 9528, 29877, 29945, nil, nil, 459, 1530, 488, nil, + 29659, 29696, 533, 1674, 9671, 9814, 9957, nil, nil, 376, + -21, 104, 628, 114, 545, 610, nil, 10100, 226, 241, + 1818, 609, nil, nil, 10243, 10386, 10529, 10672, 10815, 10958, + 11101, 11244, 11387, 11530, 11673, 11816, 11959, 12102, 12245, 12388, + 12531, 12674, 12817, 12960, 13103, 13246, nil, nil, nil, nil, + 13389, nil, nil, 388, 412, 514, 548, 552, 576, 596, + 617, 654, 736, nil, nil, nil, nil, nil, nil, nil, + 30013, nil, nil, 604, 13532, 13675, nil, nil, nil, nil, + nil, nil, nil, nil, 13818, nil, 2106, nil, 574, 584, + nil, 13961, 627, 14104, nil, nil, 14247, 14390, nil, nil, + 396, nil, nil, 14533, 1227, nil, 581, 1962, 616, 670, + 637, 25619, 2106, 455, 504, 516, 717, 591, nil, 686, + 689, 193, 737, 773, nil, nil, nil, 775, 266, 739, + 25758, nil, 597, 620, 3402, 3546, 805, nil, 814, 14676, + nil, 14819, 2250, 1329, 776, nil, -94, 172, 785, 14962, + nil, 704, -8, 8, 15105, 2394, 2538, 412, 896, 785, + -19, -7, 640, 875, 24, 907, nil, nil, 1087, 1089, + 181, nil, 650, nil, 834, 15248, nil, 29711, nil, 383, + nil, 402, nil, 136, nil, 821, 440, nil, 827, 481, + nil, 828, -59, nil, 830, -58, nil, 485, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 2682, 27402, nil, nil, nil, nil, 843, nil, 914, + 834, 15391, 835, nil, nil, 821, nil, 652, 147, 931, + nil, nil, 1530, nil, nil, nil, nil, nil, 1674, 852, + nil, nil, 854, 861, 644, 649, 7240, nil, nil, nil, + 272, 408, 906, nil, nil, 15529, 15661, 15794, 991, 990, + nil, nil, 878, 876, 881, nil, nil, 882, 888, 904, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 888, + 784, nil, nil, 15937, nil, nil, nil, 0, nil, nil, + nil, 987, nil, nil, 990, 462, 16080, 1033, nil, nil, + nil, -26, nil, 954, 30081, 30149, 16223, 223, 16366, 16509, + 16652, 901, 902, 27755, 27868, 3690, 3834, 810, 1007, 982, + 983, 985, 987, 5417, 5560, 1121, 3978, 4122, 4266, 4410, + 4554, 4698, 1214, 1243, 4842, 4986, 2250, 5130, nil, nil, + nil, 16795, 1053, nil, 16933, nil, nil, nil, nil, 17059, + 940, 944, 949, nil, nil, nil, 954, nil, nil, 17202, + nil, nil, 17345, nil, 17488, nil, 196, nil, nil, nil, + 17631, 1515, 970, 959, 957, nil, nil, 964, 25897, 969, + 17774, 30217, 30285, 725, 1006, nil, nil, 26036, 968, nil, + 17917, 30353, 30421, 18060, 5274, 2394, 18203, 1096, 981, nil, + nil, 18346, nil, nil, 18489, nil, 1039, 1027, nil, 534, + 1066, 2826, 1146, nil, 2970, 63, 1152, 1157, 337, 1159, + nil, 18632, 18775, 30489, 30557, 26, nil, nil, 766, nil, + 30625, 30693, 18918, nil, nil, nil, 806, 3114, nil, 29719, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 208, nil, nil, 298, nil, nil, nil, 1039, + nil, nil, 1040, nil, 1058, nil, 27535, nil, 19061, 1046, + 19204, 19347, 19490, 30761, 30829, 19633, 19776, 651, 19919, 20062, + 20205, 20348, 1079, nil, nil, nil, 20491, 20634, 1081, nil, + 1137, 1818, 551, nil, 20777, nil, nil, nil, 330, nil, + nil, 747, 29770, nil, 29793, nil, 16939, nil, 1039, 20920, + nil, 918, nil, 1057, 1060, 1372, 1066, nil, nil, nil, + nil, nil, nil, 1150, 1962, nil, nil, nil, 281, 326, + 544, 680, 1069, 21063, 21206, nil, -31, nil, nil, nil, + nil, 1088, nil, nil, nil, 375, 27981, -82, nil, 1069, + 1151, 1074, nil, nil, 28094, nil, nil, 1, nil, nil, + 770, nil, nil, 952, 7099, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 955, 443, nil, nil, + 1081, 27668, -14, nil, 113, 1192, -19, nil, nil, 21349, + nil, 1108, nil, 1219, nil, 1103, nil, 1148, 21492, nil, + nil, 21635, nil, nil, 158, 26175, 1110, nil, 1114, -9, + -5, 1159, 25, 776, 1160, 1122, 26314, nil, 1187, -7, + nil, nil, 691, nil, nil, nil, 862, nil, 1241, nil, + nil, nil, nil, nil, 1249, 1269, nil, nil, nil, 21778, + 69, 1153, 29, 30, 162, 163, 3258, 1231, 784, nil, + 1156, 3402, 21921, 465, 1274, 34, 1158, 1153, 3546, nil, + nil, nil, nil, nil, nil, nil, nil, 1156, 22064, 1172, + 402, 421, 816, 952, nil, 2538, 22207, 1173, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 22350, 22493, + nil, nil, nil, nil, 3690, nil, 1176, 1223, nil, nil, + 1183, nil, 1263, nil, nil, 1186, 1193, nil, 1194, 1195, + nil, 1197, nil, nil, nil, 1201, 1084, 3964, nil, nil, + 22636, 22779, 22922, 23065, 23208, 23351, 479, 28207, 1278, 28320, + 1239, 195, 28433, 28546, 589, 96, 1206, 1207, nil, 28659, + nil, 1207, 266, nil, 1224, 28772, 28885, nil, 340, 1251, + 213, nil, nil, 16918, 29605, nil, nil, nil, nil, 23494, + nil, nil, nil, nil, nil, 23637, nil, nil, nil, nil, + 337, nil, 3834, nil, nil, 1228, 1219, nil, 117, nil, + nil, nil, nil, 1221, 39, nil, nil, nil, 1342, nil, + nil, 23780, nil, 3978, 1344, nil, nil, nil, 28998, nil, + 23923, 4122, 68, 1345, nil, 1346, 598, nil, nil, nil, + 4266, 4410, 1225, 1237, nil, nil, nil, nil, nil, 1226, + 1236, 490, nil, nil, 24066, 2682, 2826, 4554, nil, 9, + 26453, nil, nil, 29821, nil, 24945, nil, 25084, nil, 25223, + nil, nil, nil, nil, 1246, 1247, 2970, 3114, 24209, nil, + 1251, nil, nil, nil, nil, 1292, 1293, 1302, 1268, 1269, + 1272, nil, nil, nil, 1311, 1271, -33, nil, 1276, nil, + nil, 740, 1282, nil, nil, nil, nil, nil, nil, 1286, + 3258, 1284, 1285, nil, 1293, 1299, 1313, nil, 1337, 1323, + 1318, 26592, nil, nil, nil, nil, nil, 4698, nil, 35, + nil, nil, 43, 858, nil, 24352, 426, nil, nil, nil, + 4842, 1354, 1459, 2092, nil, nil, 1463, 4986, 120, 135, + 786, 1418, 144, nil, 1347, 1348, 1351, 1352, 4108, 4252, + 29111, nil, nil, nil, nil, nil, nil, nil, 1354, 29224, + nil, 243, nil, 29337, nil, 367, nil, nil, 475, nil, + nil, nil, 611, nil, 745, nil, nil, 1377, 26731, 855, + 1443, nil, 5130, nil, 24495, 24638, nil, nil, nil, nil, + 1490, nil, nil, 707, nil, nil, nil, nil, 1493, 24781, + 30897, 30965, 145, 25362, nil, nil, nil, nil, 1378, 1379, + 29450, 1380, nil, nil, 1383, nil, nil, 1385, 1386, 1387, + 1388, nil, 1390, nil, 861, 31033, nil, 892, 5274, nil, + nil, nil, nil, 2236, nil, 1394, 158, 168, 169, 236, + 1395, 29563, 1398, nil, 881, nil, 5662, nil, 5761, nil, + 7063, nil, nil, 1438, 1447, nil, 32, nil, 171, nil, + 1409, 1410, 1413, 1414, nil, nil, nil, 15493, nil, nil, + nil, nil, 1415, nil ] + +racc_action_default = [ + -1, -781, -780, -781, -2, -766, -4, -5, -781, -8, + -9, -781, -781, -781, -35, -781, -781, -40, -781, -781, + -672, -672, -315, -56, -768, -781, -65, -781, -74, -75, + -76, -80, -291, -291, -291, -329, -357, -358, -92, -780, + -96, -104, -106, -781, -659, -660, -781, -781, -781, -781, + -781, -781, -244, -781, -768, -262, -306, -307, -308, -309, + -310, -311, -312, -313, -314, -752, -317, -319, -780, -327, + -337, -339, -781, -781, -71, -71, -766, -781, -781, -781, + -359, -360, -362, -363, -364, -365, -366, -367, -368, -369, + -370, -371, -380, -440, -586, -587, -588, -589, -590, -780, + -593, -780, -780, -780, -780, -780, -780, -629, -630, -780, + -632, -638, -640, -641, -642, -643, -750, -648, -649, -751, + -651, -652, -653, -654, -655, -656, -657, -658, -663, -664, + 1294, -3, -767, -776, -777, -778, -7, -781, -781, -781, + -781, -781, -781, -23, -781, -135, -136, -137, -138, -139, + -140, -141, -145, -146, -147, -148, -149, -150, -151, -152, + -153, -154, -155, -156, -157, -158, -159, -160, -161, -162, + -163, -164, -165, -166, -167, -168, -169, -170, -171, -172, + -173, -174, -175, -176, -177, -178, -179, -180, -181, -182, + -183, -184, -185, -186, -187, -188, -189, -190, -191, -192, + -193, -194, -195, -196, -197, -198, -199, -200, -201, -202, + -203, -204, -205, -206, -207, -208, -209, -210, -211, -212, + -213, -214, -215, -28, -142, -780, -781, -781, -781, -781, + -781, -780, -781, -781, -762, -763, -781, -780, -671, -669, + -695, -695, -781, -780, -781, -781, -768, -769, -60, -781, + -659, -660, -781, -315, -781, -781, -250, -781, -672, -672, + -780, -781, -61, -63, -227, -228, -781, -781, -781, -781, + -781, -781, -781, -781, -781, -781, -781, -781, -781, -781, + -781, -781, -781, -781, -781, -781, -263, -264, -265, -266, + -781, -66, -67, -781, -135, -136, -175, -176, -177, -193, + -198, -205, -208, -659, -660, -738, -739, -373, -468, -448, + -781, -764, -765, -81, -780, -781, -336, -372, -452, -461, + -463, -87, -458, -88, -768, -89, -269, -286, -780, -780, + -290, -294, -297, -781, -780, -743, -747, -781, -90, -91, + -766, -16, -17, -781, -20, -21, -94, -780, -768, -781, + -97, -100, -780, -112, -113, -781, -781, -120, -329, -332, + -768, -781, -672, -672, -357, -358, -361, -459, -781, -102, + -781, -108, -325, -781, -229, -230, -639, -238, -239, -781, + -251, -781, -780, -321, -768, -270, -773, -773, -768, -780, + -338, -70, -781, -781, -781, -780, -780, -766, -781, -767, + -659, -660, -781, -781, -315, -781, -390, -391, -130, -131, + -781, -133, -781, -315, -780, -781, -353, -695, -591, -781, + -614, -781, -616, -781, -618, -781, -781, -598, -781, -781, + -604, -781, -781, -610, -781, -781, -612, -781, -631, -633, + -634, -635, -636, -6, -779, -29, -30, -31, -32, -33, + -10, -780, -781, -25, -26, -27, -143, -781, -36, -39, + -302, -781, -781, -301, -37, -781, -41, -781, -315, -53, + -55, -216, -274, -297, -57, -58, -42, -217, -274, -768, + -281, -282, -780, -780, -753, -754, -291, -456, -755, -756, + -754, -753, -291, -455, -457, -755, -756, -781, -578, -781, + -403, -404, -768, -737, -737, -677, -678, -680, -680, -680, + -694, -696, -697, -698, -699, -700, -701, -702, -703, -704, + -781, -706, -708, -710, -715, -717, -718, -721, -726, -728, + -729, -731, -732, -733, -735, -781, -781, -781, -52, -224, + -59, -768, -335, -781, -781, -781, -780, -325, -781, -781, + -781, -781, -781, -781, -781, -225, -226, -231, -232, -233, + -234, -235, -236, -240, -241, -242, -243, -245, -246, -247, + -248, -249, -252, -253, -254, -255, -768, -267, -68, -760, + -761, -781, -781, -469, -291, -753, -754, -78, -82, -696, + -768, -780, -768, -292, -465, -468, -768, -331, -287, -781, + -296, -288, -781, -293, -781, -298, -781, -746, -749, -15, + -767, -19, -781, -768, -93, -323, -109, -98, -781, -768, + -780, -781, -781, -119, -781, -671, -639, -781, -105, -110, + -781, -781, -781, -781, -268, -256, -781, -781, -768, -320, + -271, -775, -774, -273, -775, -326, -781, -781, -741, -773, + -781, -780, -381, -382, -780, -781, -781, -781, -781, -781, + -376, -781, -780, -781, -781, -325, -71, -130, -131, -132, + -781, -781, -780, -348, -665, -667, -350, -780, -441, -695, + -444, -592, -615, -620, -621, -623, -594, -617, -595, -619, + -596, -597, -781, -600, -602, -781, -603, -606, -607, -781, + -608, -609, -781, -637, -781, -24, -781, -34, -781, -305, + -781, -781, -780, -781, -781, -781, -781, -460, -283, -285, + -781, -781, -83, -279, -280, -453, -781, -781, -85, -454, + -48, -258, -780, -374, -780, -355, -379, -670, -781, -675, + -676, -781, -781, -687, -781, -690, -781, -692, -781, -781, + -392, -781, -394, -396, -399, -402, -768, -709, -719, -720, + -730, -734, -673, -50, -260, -356, -334, -770, -753, -754, + -753, -754, -768, -781, -781, -62, -486, -489, -490, -491, + -492, -494, -496, -499, -500, -557, -768, -512, -515, -527, + -531, -536, -538, -539, -542, -543, -780, -546, -548, -549, + -550, -555, -556, -781, -781, -560, -561, -562, -563, -564, + -565, -566, -567, -568, -569, -570, -781, -781, -576, -64, + -781, -781, -768, -447, -780, -77, -449, -465, -276, -283, + -278, -781, -466, -781, -330, -780, -295, -299, -781, -744, + -745, -781, -18, -22, -95, -781, -101, -107, -768, -753, + -754, -780, -757, -118, -781, -103, -781, -223, -237, -768, + -318, -322, -773, -771, -328, -742, -780, -383, -780, -72, + -384, -385, -342, -343, -781, -781, -478, -345, -471, -781, + -781, -768, -753, -754, -757, -324, -780, -130, -131, -134, + -768, -780, -781, -781, -781, -781, -768, -781, -780, -599, + -601, -605, -611, -613, -11, -144, -38, -303, -781, -768, + -753, -754, -754, -753, -54, -275, -781, -780, -44, -219, + -45, -220, -84, -46, -222, -47, -221, -86, -781, -781, + -12, -14, -375, -377, -780, -585, -579, -780, -580, -581, + -737, -716, -721, -736, -679, -680, -680, -707, -680, -680, + -727, -680, -704, -406, -722, -768, -781, -781, -401, -705, + -781, -781, -781, -781, -781, -781, -460, -487, -781, -781, + -497, -498, -781, -781, -781, -517, -768, -768, -511, -518, + -524, -781, -781, -514, -781, -781, -781, -530, -537, -541, + -781, -545, -547, -553, -554, -558, -559, -571, -572, -781, + -644, -645, -646, -131, -574, -781, -69, -740, -429, -430, + -768, -432, -780, -451, -450, -781, -768, -462, -780, -464, + -289, -300, -748, -99, -460, -111, -333, -272, -781, -378, + -386, -781, -388, -780, -781, -73, -344, -346, -781, -472, + -781, -780, -460, -781, -460, -781, -781, -351, -354, -442, + -780, -780, -434, -768, -622, -625, -626, -627, -628, -781, + -304, -460, -43, -218, -284, -49, -259, -780, -584, -781, + -781, -583, -674, -781, -683, -781, -685, -781, -688, -781, + -691, -693, -393, -395, -397, -400, -51, -261, -781, -488, + -527, -493, -495, -504, -508, -781, -781, -781, -768, -768, + -768, -575, -509, -510, -534, -519, -522, -525, -768, -780, + -772, -781, -528, -532, -535, -540, -544, -551, -552, -768, + -257, -737, -737, -410, -780, -780, -780, -428, -781, -768, + -704, -712, -713, -724, -470, -79, -277, -780, -340, -781, + -389, -341, -781, -483, -473, -781, -780, -347, -349, -666, + -780, -781, -781, -781, -443, -624, -780, -780, -659, -660, + -781, -781, -315, -582, -680, -680, -680, -680, -781, -781, + -781, -501, -502, -503, -505, -506, -507, -526, -520, -781, + -513, -781, -516, -781, -573, -781, -408, -409, -413, -412, + -419, -421, -781, -424, -781, -426, -431, -781, -781, -711, + -781, -467, -780, -479, -781, -781, -474, -475, -476, -477, + -781, -445, -446, -768, -436, -438, -439, -13, -578, -780, + -781, -781, -325, -781, -681, -684, -686, -689, -398, -528, + -781, -523, -529, -533, -737, -714, -411, -780, -780, -780, + -780, -725, -780, -433, -723, -781, -325, -780, -780, -484, + -485, -352, -435, -781, -577, -768, -753, -754, -757, -324, + -680, -781, -521, -407, -781, -416, -781, -418, -781, -422, + -781, -425, -427, -324, -757, -387, -780, -437, -460, -682, + -780, -780, -780, -780, -480, -481, -482, -781, -414, -417, + -420, -423, -780, -415 ] + +racc_goto_table = [ + 6, 519, 519, 419, 390, 45, 318, 322, 292, 875, + 291, 45, 309, 437, 350, 245, 732, 450, 239, 239, + 16, 749, 651, 654, 592, 135, 16, 4, 499, 669, + 304, 645, 349, 479, 537, 476, 659, 395, 396, 327, + 327, 327, 45, 354, 354, 381, 588, 601, 940, 538, + 232, 143, 224, 931, 486, 492, 1090, 16, 947, 151, + 151, 311, 132, 248, 463, 464, 385, 502, 535, 1028, + 45, 1034, 148, 148, 628, 750, 775, 819, 778, 778, + 401, 304, 304, 739, 740, 16, 131, 950, 148, 983, + 640, 643, 439, 346, 582, 406, 135, 420, 839, 422, + 424, 427, 430, 433, 436, 243, 831, 420, 376, 1085, + 369, 313, 321, 323, 1112, 348, 590, 1083, 976, 477, + 510, 510, 717, 1053, 236, 242, 756, 366, 366, 1012, + 9, 1125, 584, 539, 1214, 45, 9, 392, 393, 836, + 839, 397, 836, 136, 45, 1241, 328, 328, 328, 18, + 16, 1216, 325, 338, 339, 18, 1, 398, 692, 16, + 2, 695, 1097, 1100, 366, 366, 366, 142, 470, 930, + 148, 470, 1108, 637, 414, 416, 625, 625, 519, 386, + 1067, 842, 612, 223, 407, 470, 18, 459, 452, 553, + 554, 687, 293, 689, 578, 383, 693, 821, 869, 693, + 1035, 601, 445, 446, 447, 448, 487, 310, 827, 706, + 379, 388, 995, 996, 18, 839, 826, 1241, 457, 391, + 391, 305, 977, 391, 647, 405, 673, 382, 45, 480, + 384, 638, 389, 891, 1277, 327, 893, 1128, 606, 946, + 45, 948, 1150, 16, 680, 465, 45, 677, 465, 1084, + 1127, 1216, 1190, 349, 1129, 16, 239, 239, 836, 836, + 9, 16, 465, 45, 458, 469, 1213, 443, 469, 449, + 678, 1049, 1232, 417, 895, 594, 595, 1018, 16, 18, + 544, 880, 469, 824, 391, 391, 391, 391, 18, 889, + 1207, 1142, 1284, 1038, 496, 1248, 874, 510, 1229, 1089, + 1091, 329, 329, 329, 1095, 1098, 750, 1231, 1092, 1237, + 958, 972, 480, 973, 982, 985, 1114, 1105, 327, 327, + 1228, 1115, 846, 1137, 1113, 998, 600, 600, 327, 937, + 1083, 855, 420, 1069, 387, 318, 418, 462, 462, 1015, + 349, 322, 421, 243, 629, 349, 45, 423, 772, 1208, + 45, 624, 426, 865, 354, 45, 1197, 955, 1262, 429, + 135, 16, 551, 552, 432, 16, 486, 492, 435, 836, + 16, 1054, 18, 354, 18, 474, 475, 18, 897, 646, + 898, 833, 438, 892, 18, 45, 621, 648, 656, 657, + 18, 18, 540, 541, 945, 947, 941, 610, 45, 45, + 16, 346, 1117, 1118, 631, 1235, 346, 18, 1096, 1099, + 1180, 581, 675, 16, 16, 966, 950, 135, 776, 776, + 617, 609, 848, 613, nil, 591, 328, 626, 619, 978, + nil, nil, 593, 663, nil, 328, 1004, 539, 366, 477, + 519, 596, nil, 851, nil, nil, nil, 243, nil, 6, + 1275, 797, 797, 851, 45, 922, nil, 366, nil, 655, + 724, 927, 900, nil, 881, 900, 729, nil, 894, 16, + 646, 611, nil, nil, 890, nil, 704, 1217, 658, 1285, + 600, 600, nil, nil, 723, 851, nil, 843, nil, nil, + 18, 1024, 705, 851, 18, 1234, nil, nil, 713, 18, + 151, 730, nil, 519, 947, 519, 896, 1126, 1113, nil, + 1041, 750, 750, 148, 909, nil, nil, 1113, 487, 857, + 1072, 1233, nil, nil, 1042, 918, 920, nil, nil, 18, + nil, 923, 925, 1044, nil, 486, 492, nil, nil, 1016, + 763, 391, 18, 18, 480, nil, nil, nil, 943, 1023, + 327, 943, 1061, 1020, nil, 762, 813, 813, 724, 510, + 839, 1143, 676, 778, nil, 722, 1027, 820, 1113, nil, + 1164, 728, 938, nil, nil, nil, nil, nil, nil, 9, + nil, 329, 723, nil, nil, nil, 947, nil, nil, 600, + 329, nil, 629, 1101, nil, 487, nil, nil, 18, 1233, + nil, 629, nil, nil, 836, 487, 496, nil, nil, 919, + 921, nil, nil, 45, 1094, 924, 926, nil, 480, 1102, + 1103, 354, nil, nil, 327, nil, nil, 1286, 16, 886, + 354, nil, 1198, nil, nil, 1020, 942, 487, nil, nil, + nil, nil, nil, nil, 866, 487, nil, 868, nil, nil, + nil, 975, 470, nil, 45, 649, nil, 45, nil, 989, + 480, 470, 470, 825, nil, nil, 327, 470, 470, 16, + 480, nil, 16, nil, nil, 870, 327, 743, 745, 747, + 45, nil, 1045, 496, nil, 1238, nil, 487, nil, 1239, + nil, nil, nil, 496, nil, 16, nil, nil, nil, 1157, + 990, 1186, 1187, nil, nil, 366, nil, nil, nil, nil, + 480, 45, nil, nil, 366, nil, 327, nil, 45, nil, + nil, 1062, nil, 750, 750, 496, 16, nil, 822, 465, + 935, 496, 939, 16, nil, nil, 1254, nil, 465, 465, + nil, 1174, 1175, 1176, 465, 465, 905, nil, nil, 469, + nil, nil, nil, nil, 151, nil, nil, 18, 469, 469, + 1014, 1280, nil, 646, 469, 469, nil, 148, nil, 1202, + nil, 1130, 1203, nil, nil, 496, nil, 646, 984, nil, + nil, nil, nil, 859, 1209, nil, nil, nil, nil, 813, + nil, nil, nil, nil, 420, nil, nil, 813, 18, nil, + nil, 18, 1006, 1134, 291, 1063, 813, 813, nil, 1013, + nil, nil, nil, nil, 1263, nil, nil, nil, nil, 629, + 1123, nil, 1008, nil, 18, 724, nil, nil, 729, nil, + 1025, nil, 975, 600, 519, nil, 906, 975, 975, 646, + nil, nil, 1152, 914, nil, 462, nil, nil, 354, 723, + 1111, 919, 921, 926, 924, 18, nil, 470, 18, 354, + nil, nil, 18, nil, 1032, 835, 1032, 18, 18, nil, + 797, 797, 646, 18, 18, nil, nil, nil, nil, 1043, + 797, 646, 148, nil, nil, nil, 797, 1052, nil, 45, + nil, 1059, nil, nil, 45, nil, nil, nil, 1278, nil, + 646, 45, nil, 776, 16, nil, nil, 862, nil, 16, + nil, nil, nil, 1047, nil, 600, 16, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1068, nil, nil, + nil, nil, 366, nil, 465, 1071, 797, 45, nil, nil, + nil, 1210, nil, 366, nil, nil, nil, nil, 735, 1130, + nil, nil, 16, 1130, 469, nil, nil, 1046, nil, nil, + nil, nil, 646, nil, nil, nil, nil, 646, 646, nil, + 813, nil, 813, nil, nil, 813, 813, 1063, nil, nil, + nil, nil, 813, nil, 917, nil, 765, nil, 813, 813, + nil, nil, nil, nil, nil, 943, 813, 813, 1123, nil, + nil, 1052, 1123, nil, 1123, nil, nil, nil, nil, nil, + nil, nil, nil, 1181, nil, 45, 1008, nil, nil, nil, + nil, 1255, nil, nil, nil, 1130, 1140, nil, nil, nil, + 16, nil, nil, 18, 1146, nil, 45, nil, 18, 391, + nil, 813, 851, 1151, 45, 18, nil, nil, nil, nil, + nil, 16, nil, 45, 45, nil, nil, nil, nil, 16, + 1156, nil, nil, 18, 1119, nil, 1149, nil, 16, 16, + 45, nil, nil, 1159, 1123, nil, 1123, nil, 1123, nil, + 1123, 18, nil, 942, nil, 16, 860, nil, 1163, 646, + 646, 646, nil, nil, nil, 917, 1139, 1123, nil, 984, + nil, nil, nil, nil, nil, 872, 873, 420, 877, nil, + nil, 542, nil, nil, nil, 1074, 1076, nil, 1078, 1080, + 1052, 1081, 1189, 1189, 1189, nil, nil, 949, nil, 951, + 1201, nil, 1122, nil, 304, nil, nil, nil, nil, nil, + 45, nil, nil, nil, 1032, nil, 391, nil, nil, nil, + 1218, nil, nil, 45, 935, 16, nil, 366, nil, 18, + 45, nil, nil, nil, nil, nil, nil, nil, 16, nil, + nil, nil, nil, 813, nil, 16, nil, nil, 391, nil, + 18, nil, 813, nil, nil, nil, 813, nil, 18, 597, + nil, 1220, nil, nil, 487, 1247, nil, 18, 18, nil, + nil, 304, nil, nil, 1252, 45, nil, nil, nil, nil, + 460, 473, nil, 614, 18, nil, 1131, 480, 366, nil, + 16, nil, nil, 327, 19, nil, nil, nil, nil, nil, + 19, nil, nil, 813, nil, 1189, 1189, 1189, 1189, nil, + 1189, 1276, nil, nil, nil, 1032, 646, 249, nil, 639, + nil, 45, nil, nil, nil, nil, nil, 249, 249, 249, + nil, 19, 355, 355, 813, nil, 16, nil, nil, 1249, + 1250, nil, nil, nil, 1032, nil, nil, nil, 1189, 1189, + 1189, 1189, 496, nil, 18, 366, nil, nil, nil, 19, + 1189, nil, nil, nil, 249, 249, nil, 18, 249, 402, + 412, 412, nil, 20, 18, nil, 496, nil, nil, 20, + 1122, nil, nil, nil, 1122, 603, 1122, 605, nil, nil, + 607, 608, nil, 1036, 1037, nil, nil, nil, nil, nil, + 805, 805, nil, nil, 1224, 1225, 1226, 1227, nil, nil, + 20, 362, 362, 1048, nil, nil, nil, nil, nil, 18, + nil, 391, 391, nil, 19, nil, nil, nil, nil, 249, + 249, 249, 249, 19, nil, nil, nil, 737, 20, nil, + nil, nil, nil, 650, nil, nil, nil, nil, 362, 362, + 362, nil, nil, 1191, 1193, 1195, 1122, nil, 1122, nil, + 1122, 1131, 1122, 1124, 1131, 18, nil, nil, 1131, nil, + 1131, nil, nil, nil, nil, nil, 766, nil, nil, 1122, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1279, nil, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, 20, nil, nil, 709, nil, 19, 249, 467, + 249, 249, 467, 249, nil, 828, 1165, 830, 1166, 19, + 1167, 834, nil, nil, nil, 19, 467, 249, 249, nil, + 1131, nil, 1131, nil, 1131, nil, 1131, 1138, 844, nil, + nil, nil, 19, 1141, 847, nil, nil, nil, nil, nil, + nil, nil, 1147, 1131, 1148, nil, 1265, 1267, 1269, 1271, + nil, 1272, nil, 861, nil, nil, nil, 757, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 20, nil, 20, nil, + nil, 20, nil, nil, nil, nil, 249, 249, 20, 1288, + 1289, 1290, 1291, nil, 20, 20, 249, nil, nil, nil, + nil, 1293, nil, nil, 806, 806, nil, nil, nil, nil, + nil, 20, nil, 805, nil, 19, nil, nil, nil, 19, + nil, 805, nil, 355, 19, 1240, nil, 1242, nil, nil, + 805, 805, nil, 837, nil, nil, 650, nil, 840, nil, + nil, nil, 355, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 19, nil, 1260, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 249, 19, 19, nil, + nil, 959, nil, nil, nil, 837, nil, nil, 650, nil, + nil, nil, nil, nil, nil, nil, nil, 249, nil, nil, + nil, nil, nil, nil, 20, 878, nil, 1281, 20, 1282, + nil, 1283, 362, 20, nil, nil, nil, nil, nil, 1251, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1292, 362, nil, 19, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 20, nil, nil, nil, 1007, nil, nil, + nil, nil, nil, nil, 907, nil, 20, 20, nil, nil, + nil, nil, 837, 650, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 936, 249, + nil, nil, nil, nil, 1026, nil, nil, nil, nil, nil, + nil, nil, nil, 954, nil, nil, nil, nil, nil, nil, + nil, 21, nil, nil, 805, nil, 805, 21, nil, 805, + 805, nil, 20, nil, nil, nil, 805, nil, 249, nil, + nil, nil, 805, 805, nil, nil, nil, nil, 249, nil, + 805, 805, nil, nil, nil, nil, nil, nil, 21, 363, + 363, nil, nil, nil, nil, nil, nil, 806, nil, nil, + nil, nil, nil, nil, nil, 806, nil, nil, nil, nil, + nil, nil, nil, 249, 806, 806, 21, nil, nil, nil, + nil, nil, nil, 837, nil, 805, 363, 363, 363, nil, + 1082, nil, 1021, nil, nil, 1022, nil, nil, nil, nil, + nil, nil, 19, nil, nil, nil, nil, nil, 807, 807, + 355, nil, 249, nil, nil, nil, nil, nil, nil, 355, + nil, nil, nil, nil, nil, nil, nil, nil, 249, nil, + nil, nil, nil, 1039, nil, nil, nil, nil, nil, nil, + nil, 21, nil, 19, nil, nil, 19, nil, nil, nil, + 21, 1136, nil, nil, 249, nil, nil, nil, nil, nil, + nil, nil, 1060, nil, 249, nil, nil, nil, nil, 19, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 20, nil, nil, nil, nil, nil, nil, 1154, 362, + nil, nil, nil, nil, nil, nil, nil, nil, 362, nil, + 19, nil, nil, 467, 249, nil, nil, 19, nil, nil, + nil, nil, 467, 467, 808, 808, nil, 805, 467, 467, + nil, nil, 20, nil, nil, 20, 805, nil, nil, nil, + 805, nil, nil, nil, 21, nil, 21, nil, 806, 21, + 806, nil, nil, 806, 806, nil, 21, nil, 20, nil, + 806, nil, 21, 21, 1184, nil, 806, 806, nil, nil, + nil, nil, nil, nil, 806, 806, nil, nil, nil, 21, + nil, nil, nil, nil, nil, nil, nil, 805, nil, 20, + nil, nil, 20, nil, nil, nil, 20, nil, nil, nil, + nil, 20, 20, nil, 1144, nil, nil, 20, 20, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 805, 806, + nil, nil, nil, nil, nil, nil, nil, nil, 650, nil, + nil, nil, nil, nil, nil, nil, nil, 809, 809, nil, + nil, nil, nil, nil, nil, nil, nil, 355, 22, nil, + nil, 807, nil, nil, 22, nil, nil, nil, 355, 807, + nil, nil, 21, nil, nil, nil, 21, nil, 807, 807, + 363, 21, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 22, 357, 357, 19, 363, + nil, nil, nil, 19, 249, nil, nil, nil, nil, nil, + 19, 21, nil, nil, nil, nil, nil, nil, nil, 1206, + nil, nil, nil, 22, 21, 21, nil, nil, 467, nil, + nil, nil, nil, 404, 413, 413, 362, nil, nil, nil, + nil, nil, nil, 810, 810, nil, 19, 362, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 806, nil, nil, nil, nil, nil, 808, nil, nil, + 806, nil, nil, nil, 806, 808, nil, 20, nil, nil, + 21, nil, 20, nil, 808, 808, nil, nil, 22, 20, + nil, nil, nil, nil, nil, nil, nil, 22, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 20, nil, nil, + nil, 249, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 806, nil, nil, 19, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 807, 249, 807, 19, nil, 807, 807, nil, + nil, nil, 806, 19, 807, nil, nil, nil, nil, nil, + 807, 807, 19, 19, nil, nil, nil, nil, 807, 807, + nil, nil, nil, 811, 811, nil, nil, nil, nil, 19, + 809, 22, 1160, 468, nil, nil, 468, nil, 809, nil, + nil, nil, nil, 22, nil, nil, nil, 809, 809, 22, + 468, nil, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 807, nil, nil, 22, nil, nil, nil, + nil, nil, nil, nil, 20, nil, nil, nil, nil, nil, + nil, nil, 20, nil, nil, nil, nil, nil, nil, 21, + nil, 20, 20, 1199, nil, nil, nil, 363, 808, 19, + 808, nil, nil, 808, 808, nil, 363, nil, 20, nil, + 808, 362, 19, nil, nil, nil, 808, 808, nil, 19, + nil, nil, nil, nil, 808, 808, 810, nil, nil, nil, + 21, nil, nil, 21, 810, nil, nil, nil, nil, nil, + nil, nil, nil, 810, 810, nil, nil, nil, nil, 22, + nil, nil, nil, 22, nil, nil, 21, 357, 22, nil, + 1244, nil, nil, nil, 19, nil, 249, 249, nil, 808, + nil, nil, 362, nil, nil, nil, 357, nil, 20, nil, + nil, 249, nil, nil, nil, nil, nil, 21, 22, nil, + 21, 20, nil, nil, 21, 807, nil, nil, 20, 21, + 21, 22, 22, nil, 807, 21, 21, nil, 807, nil, + 19, 809, nil, 809, nil, nil, 809, 809, nil, nil, + nil, nil, nil, 809, nil, nil, nil, nil, nil, 809, + 809, nil, nil, nil, nil, nil, nil, 809, 809, 362, + nil, nil, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 807, 811, 22, nil, nil, + nil, nil, nil, nil, 811, nil, nil, nil, nil, nil, + nil, nil, nil, 811, 811, nil, nil, nil, nil, nil, + nil, nil, 809, nil, nil, nil, 807, nil, nil, 20, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 808, nil, nil, nil, nil, nil, 810, nil, 810, + 808, nil, 810, 810, 808, 32, nil, nil, nil, 810, + nil, 32, nil, nil, 363, 810, 810, nil, nil, nil, + nil, nil, nil, 810, 810, 363, nil, nil, 32, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 32, 32, + 32, nil, 32, nil, nil, nil, nil, nil, nil, nil, + nil, 808, nil, nil, nil, 21, nil, nil, nil, nil, + 21, nil, nil, nil, nil, nil, nil, 21, 810, nil, + 32, nil, nil, nil, nil, 32, 32, nil, nil, 32, + nil, nil, 808, nil, nil, 21, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 21, 809, nil, 22, nil, nil, nil, + nil, nil, nil, 809, 357, nil, nil, 809, nil, nil, + nil, nil, nil, 357, nil, nil, nil, 811, nil, 811, + nil, nil, 811, 811, nil, 32, nil, nil, nil, 811, + 32, 32, 32, 32, 32, 811, 811, 22, nil, nil, + 22, nil, nil, 811, 811, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 809, nil, nil, nil, nil, nil, + nil, nil, nil, 22, nil, nil, nil, nil, nil, nil, + nil, 21, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 809, 812, 812, 811, nil, + 810, nil, 21, nil, 22, nil, nil, 468, nil, 810, + 21, 22, nil, 810, nil, nil, 468, 468, nil, 21, + 21, nil, 468, 468, nil, nil, nil, nil, 32, 32, + 32, 32, 32, 32, 32, nil, 21, nil, 35, 363, + 32, nil, nil, nil, 35, nil, 32, 32, 32, 32, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 810, 35, nil, 32, nil, nil, nil, nil, nil, nil, + nil, 35, 35, 35, nil, 35, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 810, nil, nil, nil, nil, nil, nil, nil, nil, + 363, nil, nil, 35, nil, nil, 21, nil, 35, 35, + nil, nil, 35, nil, nil, nil, nil, 32, 32, 21, + nil, nil, nil, 814, 814, nil, 21, 32, nil, nil, + 811, nil, nil, nil, nil, nil, nil, nil, nil, 811, + nil, 357, nil, 811, nil, nil, 32, nil, nil, nil, + 32, nil, 357, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 363, 35, nil, + nil, 21, nil, 35, 35, 35, 35, 35, nil, nil, + nil, nil, 22, nil, nil, 32, nil, 22, nil, nil, + 811, nil, nil, 1058, 22, nil, nil, 32, 32, 32, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 468, nil, nil, nil, nil, 21, 32, nil, + nil, 811, nil, nil, nil, nil, nil, nil, nil, 812, + 22, nil, nil, nil, nil, nil, nil, 812, nil, nil, + nil, nil, nil, nil, nil, nil, 812, 812, nil, nil, + 44, nil, nil, nil, 32, nil, 44, nil, nil, nil, + nil, 35, 35, 35, 35, 35, 35, 35, nil, nil, + nil, nil, nil, 35, nil, 303, nil, nil, nil, 35, + 35, 35, 35, nil, nil, nil, nil, 44, 353, 353, + nil, nil, nil, nil, nil, nil, 35, nil, nil, nil, + 32, nil, nil, nil, nil, nil, nil, nil, 22, nil, + nil, nil, nil, nil, nil, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 400, 303, 303, nil, 22, + nil, nil, nil, nil, nil, nil, nil, 22, nil, 32, + nil, nil, nil, nil, nil, nil, 22, 22, nil, 32, + 35, 35, nil, nil, nil, nil, 814, nil, nil, nil, + 35, nil, nil, 22, 814, nil, 1162, nil, nil, nil, + nil, nil, nil, 814, 814, nil, nil, nil, nil, 35, + 44, nil, nil, 35, 32, nil, nil, nil, 35, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 812, nil, 812, 32, nil, 812, 812, nil, 35, nil, + nil, nil, 812, 32, nil, nil, nil, 413, 812, 812, + 35, 35, 35, 22, nil, nil, 812, 812, nil, 32, + nil, nil, nil, nil, nil, nil, 22, nil, nil, nil, + nil, 35, nil, 22, 32, nil, nil, 32, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, 44, nil, 32, nil, nil, nil, nil, + 32, 812, nil, nil, nil, 44, nil, 35, nil, nil, + nil, 44, nil, nil, 413, nil, nil, nil, 22, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 44, nil, + nil, 32, nil, nil, 32, 32, nil, nil, 32, nil, + nil, nil, nil, 32, 32, nil, nil, nil, nil, 32, + 32, nil, nil, 35, nil, nil, nil, 814, nil, 814, + nil, nil, 814, 814, 22, nil, nil, nil, nil, 814, + nil, nil, nil, nil, nil, 814, 814, nil, nil, nil, + nil, nil, nil, 814, 814, nil, nil, nil, nil, nil, + nil, nil, 35, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 35, nil, nil, nil, nil, nil, nil, nil, + nil, 44, nil, nil, nil, 44, nil, nil, nil, 353, + 44, nil, nil, nil, nil, nil, nil, nil, 814, nil, + nil, nil, nil, 812, nil, nil, nil, 35, 353, nil, + nil, nil, 812, nil, nil, nil, 812, nil, nil, nil, + 44, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 44, 44, nil, 35, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 35, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 35, 812, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 35, nil, 32, + 35, nil, nil, nil, 32, 32, nil, nil, 35, 44, + nil, 32, nil, nil, 812, nil, nil, nil, 35, nil, + nil, nil, nil, 35, nil, nil, nil, nil, nil, 32, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 32, nil, nil, + 814, nil, nil, nil, 35, nil, nil, 35, 35, 814, + nil, 35, nil, 814, nil, nil, 35, 35, nil, nil, + nil, nil, 35, 35, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 814, nil, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 814, nil, nil, 32, nil, 32, nil, nil, nil, + nil, nil, nil, nil, 32, nil, nil, nil, nil, nil, + nil, nil, nil, 32, 32, nil, nil, nil, 44, nil, + nil, nil, nil, nil, nil, nil, 353, nil, nil, nil, + 32, nil, nil, nil, nil, 353, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 44, + nil, nil, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 35, nil, nil, 44, nil, 35, 35, nil, + nil, nil, nil, nil, 35, nil, nil, nil, nil, nil, + 32, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 35, 32, nil, 256, 44, nil, nil, nil, + 32, nil, nil, 44, nil, 326, 326, 326, nil, nil, + 35, nil, nil, nil, nil, nil, nil, 374, 375, nil, + 377, 378, nil, 380, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 326, nil, + nil, nil, nil, nil, nil, 32, nil, 32, 32, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 35, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 35, nil, + nil, 32, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 35, nil, 35, + nil, nil, nil, nil, nil, nil, nil, 35, nil, nil, + nil, nil, nil, nil, nil, nil, 35, 35, nil, nil, + nil, nil, nil, 353, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 35, 353, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 44, nil, nil, nil, nil, 44, + nil, nil, nil, nil, nil, nil, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 326, 472, nil, nil, + 478, 326, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 35, 478, nil, nil, nil, nil, nil, + nil, nil, 44, nil, nil, nil, 35, 256, nil, nil, + nil, nil, nil, 35, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, nil, nil, nil, nil, + 577, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 35, nil, + 35, 35, nil, nil, 326, 326, nil, nil, nil, nil, + nil, nil, nil, nil, 326, 35, nil, nil, nil, nil, + 44, 326, nil, 326, nil, nil, 326, 326, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 44, nil, nil, 35, nil, nil, nil, nil, 44, + nil, nil, nil, nil, nil, nil, nil, nil, 44, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 634, + nil, 635, nil, nil, nil, 44, nil, nil, 1158, 326, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 303, + nil, nil, nil, nil, nil, 44, nil, nil, nil, nil, + nil, 326, nil, nil, nil, nil, nil, nil, 44, nil, + nil, nil, nil, nil, nil, 44, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 731, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 303, nil, nil, nil, + 44, nil, nil, 326, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 764, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 326, nil, 478, 478, + 478, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 375, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 326, + nil, nil, 326, nil, 326, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 326, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 478, nil, nil, 858, nil, nil, nil, nil, nil, nil, + nil, 326, nil, nil, 326, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 326, 326, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 326, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 326, 478, 326, nil, nil, nil, 915, nil, 326, 326, + 478, 478, nil, nil, nil, nil, 478, 478, nil, nil, + nil, nil, nil, nil, 326, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 326, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 731, 764, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 326, + nil, nil, nil, nil, nil, nil, nil, nil, 326, nil, + nil, 326, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 326, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 326, nil, + nil, nil, nil, nil, nil, nil, 478, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1065, 1066, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1086, 1087, 478, 478, 478, 478, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1120, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 326, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 326, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 478, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 326, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 326 ] + +racc_goto_check = [ + 6, 251, 251, 217, 113, 78, 95, 95, 46, 125, + 49, 78, 178, 217, 74, 44, 14, 10, 6, 6, + 27, 155, 117, 117, 96, 130, 27, 2, 12, 79, + 78, 36, 13, 35, 12, 32, 124, 54, 54, 40, + 40, 40, 78, 78, 78, 44, 63, 98, 153, 32, + 37, 21, 21, 16, 61, 61, 212, 27, 252, 83, + 83, 37, 8, 26, 28, 28, 6, 177, 177, 118, + 78, 120, 81, 81, 76, 148, 45, 45, 196, 196, + 78, 78, 78, 159, 159, 27, 5, 256, 81, 206, + 93, 93, 49, 70, 179, 27, 130, 6, 261, 6, + 6, 6, 6, 6, 6, 132, 64, 6, 86, 150, + 75, 62, 62, 62, 211, 71, 35, 147, 194, 85, + 246, 246, 36, 169, 39, 39, 149, 88, 88, 167, + 9, 165, 61, 85, 171, 78, 9, 23, 23, 99, + 261, 23, 99, 7, 78, 257, 92, 92, 92, 33, + 27, 172, 69, 69, 69, 33, 1, 5, 233, 27, + 3, 233, 197, 197, 88, 88, 88, 11, 24, 15, + 81, 24, 197, 12, 80, 80, 245, 245, 251, 92, + 17, 19, 20, 22, 25, 24, 33, 29, 31, 47, + 48, 234, 51, 234, 52, 9, 234, 53, 55, 234, + 57, 98, 23, 23, 23, 23, 95, 60, 66, 84, + 89, 91, 221, 221, 33, 261, 97, 257, 13, 30, + 30, 109, 195, 30, 112, 127, 129, 133, 78, 6, + 134, 135, 136, 137, 171, 40, 138, 169, 217, 166, + 78, 166, 139, 27, 177, 27, 78, 140, 27, 151, + 156, 172, 162, 13, 163, 27, 6, 6, 99, 99, + 9, 27, 27, 78, 26, 26, 170, 7, 26, 9, + 173, 174, 212, 175, 176, 181, 182, 184, 27, 33, + 37, 185, 26, 187, 30, 30, 30, 30, 33, 79, + 188, 189, 190, 191, 81, 192, 124, 246, 211, 194, + 199, 94, 94, 94, 194, 194, 148, 211, 201, 165, + 148, 202, 6, 203, 207, 208, 214, 210, 40, 40, + 150, 215, 76, 167, 210, 224, 6, 6, 40, 225, + 147, 76, 6, 226, 94, 95, 229, 92, 92, 64, + 13, 95, 230, 132, 74, 13, 78, 231, 35, 120, + 78, 44, 232, 93, 78, 78, 169, 149, 211, 235, + 130, 27, 39, 39, 236, 27, 61, 61, 237, 99, + 27, 238, 33, 78, 33, 30, 30, 33, 239, 44, + 240, 179, 243, 244, 33, 78, 37, 6, 13, 13, + 33, 33, 30, 30, 250, 252, 254, 8, 78, 78, + 27, 70, 221, 221, 37, 255, 70, 33, 195, 195, + 206, 260, 6, 27, 27, 36, 256, 130, 193, 193, + 75, 5, 35, 71, nil, 92, 92, 86, 71, 36, + nil, nil, 69, 37, nil, 92, 79, 85, 88, 85, + 251, 69, nil, 61, nil, nil, nil, 132, nil, 6, + 118, 219, 219, 61, 78, 63, nil, 88, nil, 23, + 95, 63, 234, nil, 35, 234, 95, nil, 12, 27, + 44, 9, nil, nil, 35, nil, 2, 16, 5, 120, + 6, 6, nil, nil, 6, 61, nil, 10, nil, nil, + 33, 36, 21, 61, 33, 153, nil, nil, 37, 33, + 83, 40, nil, 251, 252, 251, 177, 166, 210, nil, + 117, 148, 148, 81, 35, nil, nil, 210, 95, 85, + 159, 210, nil, nil, 36, 32, 32, nil, nil, 33, + nil, 32, 32, 36, nil, 61, 61, nil, nil, 96, + 40, 30, 33, 33, 6, nil, nil, nil, 160, 76, + 40, 160, 36, 98, nil, 130, 78, 78, 95, 246, + 261, 45, 30, 196, nil, 62, 93, 44, 210, nil, + 166, 62, 28, nil, nil, nil, nil, nil, nil, 9, + nil, 94, 6, nil, nil, nil, 252, nil, nil, 6, + 94, nil, 74, 79, nil, 95, nil, nil, 33, 210, + nil, 74, nil, nil, 99, 95, 81, nil, nil, 85, + 85, nil, nil, 78, 36, 85, 85, nil, 6, 36, + 36, 78, nil, nil, 40, nil, nil, 125, 27, 54, + 78, nil, 155, nil, nil, 98, 219, 95, nil, nil, + nil, nil, nil, nil, 13, 95, nil, 13, nil, nil, + nil, 193, 24, nil, 78, 94, nil, 78, nil, 193, + 6, 24, 24, 62, nil, nil, 40, 24, 24, 27, + 6, nil, 27, nil, nil, 130, 40, 249, 249, 249, + 78, nil, 12, 81, nil, 166, nil, 95, nil, 166, + nil, nil, nil, 81, nil, 27, nil, nil, nil, 117, + 217, 159, 159, nil, nil, 88, nil, nil, nil, nil, + 6, 78, nil, nil, 88, nil, 40, nil, 78, nil, + nil, 32, nil, 148, 148, 81, 27, nil, 30, 27, + 6, 81, 6, 27, nil, nil, 14, nil, 27, 27, + nil, 36, 36, 36, 27, 27, 21, nil, nil, 26, + nil, nil, nil, nil, 83, nil, nil, 33, 26, 26, + 113, 166, nil, 44, 26, 26, nil, 81, nil, 117, + nil, 251, 117, nil, nil, 81, nil, 44, 44, nil, + nil, nil, nil, 30, 124, nil, nil, nil, nil, 78, + nil, nil, nil, nil, 6, nil, nil, 78, 33, nil, + nil, 33, 46, 12, 49, 85, 78, 78, nil, 178, + nil, nil, nil, nil, 159, nil, nil, nil, nil, 74, + 160, nil, 6, nil, 33, 95, nil, nil, 95, nil, + 74, nil, 193, 6, 251, nil, 9, 193, 193, 44, + nil, nil, 12, 9, nil, 92, nil, nil, 78, 6, + 193, 85, 85, 85, 85, 33, nil, 24, 33, 78, + nil, nil, 33, nil, 6, 94, 6, 33, 33, nil, + 219, 219, 44, 33, 33, nil, nil, nil, nil, 13, + 219, 44, 81, nil, nil, nil, 219, 44, nil, 78, + nil, 13, nil, nil, 78, nil, nil, nil, 36, nil, + 44, 78, nil, 193, 27, nil, nil, 94, nil, 27, + nil, nil, nil, 130, nil, 6, 27, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 13, nil, nil, + nil, nil, 88, nil, 27, 6, 219, 78, nil, nil, + nil, 12, nil, 88, nil, nil, nil, nil, 111, 251, + nil, nil, 27, 251, 26, nil, nil, 23, nil, nil, + nil, nil, 44, nil, nil, nil, nil, 44, 44, nil, + 78, nil, 78, nil, nil, 78, 78, 85, nil, nil, + nil, nil, 78, nil, 94, nil, 111, nil, 78, 78, + nil, nil, nil, nil, nil, 160, 78, 78, 160, nil, + nil, 44, 160, nil, 160, nil, nil, nil, nil, nil, + nil, nil, nil, 217, nil, 78, 6, nil, nil, nil, + nil, 35, nil, nil, nil, 251, 13, nil, nil, nil, + 27, nil, nil, 33, 13, nil, 78, nil, 33, 30, + nil, 78, 61, 13, 78, 33, nil, nil, nil, nil, + nil, 27, nil, 78, 78, nil, nil, nil, nil, 27, + 13, nil, nil, 33, 23, nil, 130, nil, 27, 27, + 78, nil, nil, 78, 160, nil, 160, nil, 160, nil, + 160, 33, nil, 219, nil, 27, 111, nil, 27, 44, + 44, 44, nil, nil, nil, 94, 23, 160, nil, 44, + nil, nil, nil, nil, nil, 111, 111, 6, 111, nil, + nil, 72, nil, nil, nil, 249, 249, nil, 249, 249, + 44, 249, 6, 6, 6, nil, nil, 164, nil, 164, + 13, nil, 152, nil, 78, nil, nil, nil, nil, nil, + 78, nil, nil, nil, 6, nil, 30, nil, nil, nil, + 13, nil, nil, 78, 6, 27, nil, 88, nil, 33, + 78, nil, nil, nil, nil, nil, nil, nil, 27, nil, + nil, nil, nil, 78, nil, 27, nil, nil, 30, nil, + 33, nil, 78, nil, nil, nil, 78, nil, 33, 72, + nil, 37, nil, nil, 95, 13, nil, 33, 33, nil, + nil, 78, nil, nil, 44, 78, nil, nil, nil, nil, + 90, 90, nil, 72, 33, nil, 253, 6, 88, nil, + 27, nil, nil, 40, 34, nil, nil, nil, nil, nil, + 34, nil, nil, 78, nil, 6, 6, 6, 6, nil, + 6, 13, nil, nil, nil, 6, 44, 34, nil, 72, + nil, 78, nil, nil, nil, nil, nil, 34, 34, 34, + nil, 34, 34, 34, 78, nil, 27, nil, nil, 23, + 23, nil, nil, nil, 6, nil, nil, nil, 6, 6, + 6, 6, 81, nil, 33, 88, nil, nil, nil, 34, + 6, nil, nil, nil, 34, 34, nil, 33, 34, 34, + 34, 34, nil, 38, 33, nil, 81, nil, nil, 38, + 152, nil, nil, nil, 152, 90, 152, 90, nil, nil, + 90, 90, nil, 111, 111, nil, nil, nil, nil, nil, + 101, 101, nil, nil, 249, 249, 249, 249, nil, nil, + 38, 38, 38, 111, nil, nil, nil, nil, nil, 33, + nil, 30, 30, nil, 34, nil, nil, nil, nil, 34, + 34, 34, 34, 34, nil, nil, nil, 72, 38, nil, + nil, nil, nil, 90, nil, nil, nil, nil, 38, 38, + 38, nil, nil, 161, 161, 161, 152, nil, 152, nil, + 152, 253, 152, 164, 253, 33, nil, nil, 253, nil, + 253, nil, nil, nil, nil, nil, 72, nil, nil, 152, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 249, nil, nil, 38, nil, nil, nil, nil, nil, nil, + nil, nil, 38, nil, nil, 90, nil, 34, 34, 34, + 34, 34, 34, 34, nil, 72, 164, 72, 164, 34, + 164, 72, nil, nil, nil, 34, 34, 34, 34, nil, + 253, nil, 253, nil, 253, nil, 253, 111, 72, nil, + nil, nil, 34, 111, 72, nil, nil, nil, nil, nil, + nil, nil, 111, 253, 111, nil, 161, 161, 161, 161, + nil, 161, nil, 72, nil, nil, nil, 90, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 38, nil, 38, nil, + nil, 38, nil, nil, nil, nil, 34, 34, 38, 161, + 161, 161, 161, nil, 38, 38, 34, nil, nil, nil, + nil, 161, nil, nil, 102, 102, nil, nil, nil, nil, + nil, 38, nil, 101, nil, 34, nil, nil, nil, 34, + nil, 101, nil, 34, 34, 164, nil, 164, nil, nil, + 101, 101, nil, 90, nil, nil, 90, nil, 90, nil, + nil, nil, 34, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 34, nil, 164, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 34, 34, 34, nil, + nil, 72, nil, nil, nil, 90, nil, nil, 90, nil, + nil, nil, nil, nil, nil, nil, nil, 34, nil, nil, + nil, nil, nil, nil, 38, 90, nil, 164, 38, 164, + nil, 164, 38, 38, nil, nil, nil, nil, nil, 111, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 164, 38, nil, 34, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 38, nil, nil, nil, 72, nil, nil, + nil, nil, nil, nil, 90, nil, 38, 38, nil, nil, + nil, nil, 90, 90, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 90, 34, + nil, nil, nil, nil, 72, nil, nil, nil, nil, nil, + nil, nil, nil, 90, nil, nil, nil, nil, nil, nil, + nil, 42, nil, nil, 101, nil, 101, 42, nil, 101, + 101, nil, 38, nil, nil, nil, 101, nil, 34, nil, + nil, nil, 101, 101, nil, nil, nil, nil, 34, nil, + 101, 101, nil, nil, nil, nil, nil, nil, 42, 42, + 42, nil, nil, nil, nil, nil, nil, 102, nil, nil, + nil, nil, nil, nil, nil, 102, nil, nil, nil, nil, + nil, nil, nil, 34, 102, 102, 42, nil, nil, nil, + nil, nil, nil, 90, nil, 101, 42, 42, 42, nil, + 72, nil, 90, nil, nil, 90, nil, nil, nil, nil, + nil, nil, 34, nil, nil, nil, nil, nil, 103, 103, + 34, nil, 34, nil, nil, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, nil, nil, nil, 34, nil, + nil, nil, nil, 90, nil, nil, nil, nil, nil, nil, + nil, 42, nil, 34, nil, nil, 34, nil, nil, nil, + 42, 72, nil, nil, 34, nil, nil, nil, nil, nil, + nil, nil, 90, nil, 34, nil, nil, nil, nil, 34, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 38, nil, nil, nil, nil, nil, nil, 72, 38, + nil, nil, nil, nil, nil, nil, nil, nil, 38, nil, + 34, nil, nil, 34, 34, nil, nil, 34, nil, nil, + nil, nil, 34, 34, 104, 104, nil, 101, 34, 34, + nil, nil, 38, nil, nil, 38, 101, nil, nil, nil, + 101, nil, nil, nil, 42, nil, 42, nil, 102, 42, + 102, nil, nil, 102, 102, nil, 42, nil, 38, nil, + 102, nil, 42, 42, 72, nil, 102, 102, nil, nil, + nil, nil, nil, nil, 102, 102, nil, nil, nil, 42, + nil, nil, nil, nil, nil, nil, nil, 101, nil, 38, + nil, nil, 38, nil, nil, nil, 38, nil, nil, nil, + nil, 38, 38, nil, 90, nil, nil, 38, 38, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 101, 102, + nil, nil, nil, nil, nil, nil, nil, nil, 90, nil, + nil, nil, nil, nil, nil, nil, nil, 105, 105, nil, + nil, nil, nil, nil, nil, nil, nil, 34, 43, nil, + nil, 103, nil, nil, 43, nil, nil, nil, 34, 103, + nil, nil, 42, nil, nil, nil, 42, nil, 103, 103, + 42, 42, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 43, 43, 43, 34, 42, + nil, nil, nil, 34, 34, nil, nil, nil, nil, nil, + 34, 42, nil, nil, nil, nil, nil, nil, nil, 90, + nil, nil, nil, 43, 42, 42, nil, nil, 34, nil, + nil, nil, nil, 43, 43, 43, 38, nil, nil, nil, + nil, nil, nil, 106, 106, nil, 34, 38, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 102, nil, nil, nil, nil, nil, 104, nil, nil, + 102, nil, nil, nil, 102, 104, nil, 38, nil, nil, + 42, nil, 38, nil, 104, 104, nil, nil, 43, 38, + nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 38, nil, nil, + nil, 34, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 102, nil, nil, 34, 38, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 103, 34, 103, 34, nil, 103, 103, nil, + nil, nil, 102, 34, 103, nil, nil, nil, nil, nil, + 103, 103, 34, 34, nil, nil, nil, nil, 103, 103, + nil, nil, nil, 107, 107, nil, nil, nil, nil, 34, + 105, 43, 34, 43, nil, nil, 43, nil, 105, nil, + nil, nil, nil, 43, nil, nil, nil, 105, 105, 43, + 43, nil, nil, 38, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 103, nil, nil, 43, nil, nil, nil, + nil, nil, nil, nil, 38, nil, nil, nil, nil, nil, + nil, nil, 38, nil, nil, nil, nil, nil, nil, 42, + nil, 38, 38, 34, nil, nil, nil, 42, 104, 34, + 104, nil, nil, 104, 104, nil, 42, nil, 38, nil, + 104, 38, 34, nil, nil, nil, 104, 104, nil, 34, + nil, nil, nil, nil, 104, 104, 106, nil, nil, nil, + 42, nil, nil, 42, 106, nil, nil, nil, nil, nil, + nil, nil, nil, 106, 106, nil, nil, nil, nil, 43, + nil, nil, nil, 43, nil, nil, 42, 43, 43, nil, + 34, nil, nil, nil, 34, nil, 34, 34, nil, 104, + nil, nil, 38, nil, nil, nil, 43, nil, 38, nil, + nil, 34, nil, nil, nil, nil, nil, 42, 43, nil, + 42, 38, nil, nil, 42, 103, nil, nil, 38, 42, + 42, 43, 43, nil, 103, 42, 42, nil, 103, nil, + 34, 105, nil, 105, nil, nil, 105, 105, nil, nil, + nil, nil, nil, 105, nil, nil, nil, nil, nil, 105, + 105, nil, nil, nil, nil, nil, nil, 105, 105, 38, + nil, nil, nil, 38, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 103, 107, 43, nil, nil, + nil, nil, nil, nil, 107, nil, nil, nil, nil, nil, + nil, nil, nil, 107, 107, nil, nil, nil, nil, nil, + nil, nil, 105, nil, nil, nil, 103, nil, nil, 38, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 104, nil, nil, nil, nil, nil, 106, nil, 106, + 104, nil, 106, 106, 104, 65, nil, nil, nil, 106, + nil, 65, nil, nil, 42, 106, 106, nil, nil, nil, + nil, nil, nil, 106, 106, 42, nil, nil, 65, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 65, 65, + 65, nil, 65, nil, nil, nil, nil, nil, nil, nil, + nil, 104, nil, nil, nil, 42, nil, nil, nil, nil, + 42, nil, nil, nil, nil, nil, nil, 42, 106, nil, + 65, nil, nil, nil, nil, 65, 65, nil, nil, 65, + nil, nil, 104, nil, nil, 42, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 42, 105, nil, 43, nil, nil, nil, + nil, nil, nil, 105, 43, nil, nil, 105, nil, nil, + nil, nil, nil, 43, nil, nil, nil, 107, nil, 107, + nil, nil, 107, 107, nil, 65, nil, nil, nil, 107, + 65, 65, 65, 65, 65, 107, 107, 43, nil, nil, + 43, nil, nil, 107, 107, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 105, nil, nil, nil, nil, nil, + nil, nil, nil, 43, nil, nil, nil, nil, nil, nil, + nil, 42, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 105, 108, 108, 107, nil, + 106, nil, 42, nil, 43, nil, nil, 43, nil, 106, + 42, 43, nil, 106, nil, nil, 43, 43, nil, 42, + 42, nil, 43, 43, nil, nil, nil, nil, 65, 65, + 65, 65, 65, 65, 65, nil, 42, nil, 68, 42, + 65, nil, nil, nil, 68, nil, 65, 65, 65, 65, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 106, 68, nil, 65, nil, nil, nil, nil, nil, nil, + nil, 68, 68, 68, nil, 68, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 106, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, 68, nil, nil, 42, nil, 68, 68, + nil, nil, 68, nil, nil, nil, nil, 65, 65, 42, + nil, nil, nil, 115, 115, nil, 42, 65, nil, nil, + 107, nil, nil, nil, nil, nil, nil, nil, nil, 107, + nil, 43, nil, 107, nil, nil, 65, nil, nil, nil, + 65, nil, 43, nil, nil, 65, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 42, 68, nil, + nil, 42, nil, 68, 68, 68, 68, 68, nil, nil, + nil, nil, 43, nil, nil, 65, nil, 43, nil, nil, + 107, nil, nil, 43, 43, nil, nil, 65, 65, 65, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 43, nil, nil, nil, nil, 42, 65, nil, + nil, 107, nil, nil, nil, nil, nil, nil, nil, 108, + 43, nil, nil, nil, nil, nil, nil, 108, nil, nil, + nil, nil, nil, nil, nil, nil, 108, 108, nil, nil, + 77, nil, nil, nil, 65, nil, 77, nil, nil, nil, + nil, 68, 68, 68, 68, 68, 68, 68, nil, nil, + nil, nil, nil, 68, nil, 77, nil, nil, nil, 68, + 68, 68, 68, nil, nil, nil, nil, 77, 77, 77, + nil, nil, nil, nil, nil, nil, 68, nil, nil, nil, + 65, nil, nil, nil, nil, nil, nil, nil, 43, nil, + nil, nil, nil, nil, nil, 77, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 77, 77, 77, nil, 43, + nil, nil, nil, nil, nil, nil, nil, 43, nil, 65, + nil, nil, nil, nil, nil, nil, 43, 43, nil, 65, + 68, 68, nil, nil, nil, nil, 115, nil, nil, nil, + 68, nil, nil, 43, 115, nil, 43, nil, nil, nil, + nil, nil, nil, 115, 115, nil, nil, nil, nil, 68, + 77, nil, nil, 68, 65, nil, nil, nil, 68, 77, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 108, nil, 108, 65, nil, 108, 108, nil, 68, nil, + nil, nil, 108, 65, nil, nil, nil, 43, 108, 108, + 68, 68, 68, 43, nil, nil, 108, 108, nil, 65, + nil, nil, nil, nil, nil, nil, 43, nil, nil, nil, + nil, 68, nil, 43, 65, nil, nil, 65, nil, nil, + nil, nil, nil, nil, nil, 65, nil, nil, nil, nil, + nil, nil, nil, 77, nil, 65, nil, nil, nil, nil, + 65, 108, nil, nil, nil, 77, nil, 68, nil, nil, + nil, 77, nil, nil, 43, nil, nil, nil, 43, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 77, nil, + nil, 65, nil, nil, 65, 65, nil, nil, 65, nil, + nil, nil, nil, 65, 65, nil, nil, nil, nil, 65, + 65, nil, nil, 68, nil, nil, nil, 115, nil, 115, + nil, nil, 115, 115, 43, nil, nil, nil, nil, 115, + nil, nil, nil, nil, nil, 115, 115, nil, nil, nil, + nil, nil, nil, 115, 115, nil, nil, nil, nil, nil, + nil, nil, 68, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 68, nil, nil, nil, nil, nil, nil, nil, + nil, 77, nil, nil, nil, 77, nil, nil, nil, 77, + 77, nil, nil, nil, nil, nil, nil, nil, 115, nil, + nil, nil, nil, 108, nil, nil, nil, 68, 77, nil, + nil, nil, 108, nil, nil, nil, 108, nil, nil, nil, + 77, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 77, 77, nil, 68, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 68, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 68, 108, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 68, nil, 65, + 68, nil, nil, nil, 65, 65, nil, nil, 68, 77, + nil, 65, nil, nil, 108, nil, nil, nil, 68, nil, + nil, nil, nil, 68, nil, nil, nil, nil, nil, 65, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 65, nil, nil, + 115, nil, nil, nil, 68, nil, nil, 68, 68, 115, + nil, 68, nil, 115, nil, nil, 68, 68, nil, nil, + nil, nil, 68, 68, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 115, nil, 65, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 65, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 115, nil, nil, 65, nil, 65, nil, nil, nil, + nil, nil, nil, nil, 65, nil, nil, nil, nil, nil, + nil, nil, nil, 65, 65, nil, nil, nil, 77, nil, + nil, nil, nil, nil, nil, nil, 77, nil, nil, nil, + 65, nil, nil, nil, nil, 77, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 77, + nil, nil, 77, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 68, nil, nil, 77, nil, 68, 68, nil, + nil, nil, nil, nil, 68, nil, nil, nil, nil, nil, + 65, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 68, 65, nil, 41, 77, nil, nil, nil, + 65, nil, nil, 77, nil, 41, 41, 41, nil, nil, + 68, nil, nil, nil, nil, nil, nil, 41, 41, nil, + 41, 41, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, 65, nil, 65, 65, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 65, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 68, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 68, nil, + nil, 65, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 68, nil, 68, + nil, nil, nil, nil, nil, nil, nil, 68, nil, nil, + nil, nil, nil, nil, nil, nil, 68, 68, nil, nil, + nil, nil, nil, 77, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 68, 77, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 77, nil, nil, nil, nil, 77, + nil, nil, nil, nil, nil, nil, 77, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, 41, nil, nil, + 41, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 68, 41, nil, nil, nil, nil, nil, + nil, nil, 77, nil, nil, nil, 68, 41, nil, nil, + nil, nil, nil, 68, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 68, nil, + 68, 68, nil, nil, 41, 41, nil, nil, nil, nil, + nil, nil, nil, nil, 41, 68, nil, nil, nil, nil, + 77, 41, nil, 41, nil, nil, 41, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 77, nil, nil, 68, nil, nil, nil, nil, 77, + nil, nil, nil, nil, nil, nil, nil, nil, 77, 77, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, 41, nil, nil, nil, 77, nil, nil, 77, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 77, + nil, nil, nil, nil, nil, 77, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, 77, nil, + nil, nil, nil, nil, nil, 77, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 77, nil, nil, nil, + 77, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, 41, 41, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 77, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, 41, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, 41, 41, nil, nil, nil, 41, nil, 41, 41, + 41, 41, nil, nil, nil, nil, 41, 41, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 41, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, 41, 41, 41, 41, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41 ] + +racc_goto_pointer = [ + nil, 156, 25, 160, nil, 81, -2, 135, 57, 128, + -125, 157, -209, -7, -482, -563, -679, -750, nil, -429, + -163, 40, 171, 65, -59, 107, 38, 18, -162, -39, + 147, 45, -195, 147, 1222, -198, -357, 31, 1301, 104, + 4, 3700, 1739, 2066, -9, -477, -19, -73, -73, -17, + nil, 165, -99, -381, -37, -457, nil, -669, nil, nil, + 177, -178, 79, -267, -488, 2573, -379, nil, 2806, 117, + 54, 76, 865, nil, -26, 69, -296, 3018, 3, -381, + 96, 61, nil, 48, -247, -111, 59, nil, 87, 158, + 984, 143, 111, -296, 266, -26, -290, -368, -282, -460, + nil, 777, 1001, 1285, 1391, 1504, 1600, 1730, 2213, 194, + nil, 449, -165, -66, nil, 2340, nil, -370, -797, nil, + -797, nil, nil, nil, -362, -649, nil, 148, nil, -188, + 20, nil, 84, 161, 163, -152, 163, -440, -440, -805, + -169, nil, nil, nil, nil, nil, nil, -839, -445, -394, + -848, -707, 122, -690, nil, -498, -760, nil, nil, -420, + -190, 259, -872, -756, 383, -879, -503, -695, nil, -773, + -887, -1019, -1002, -147, -624, 180, -404, -173, -16, -214, + nil, -44, -44, nil, -555, -380, nil, -300, -856, -747, + -984, -583, -908, -135, -668, -564, -475, -810, nil, -668, + nil, -661, -474, -472, nil, nil, -698, -473, -473, nil, + -662, -872, -911, nil, -672, -667, nil, -96, nil, -102, + nil, -591, nil, nil, -491, -405, -604, nil, nil, 240, + 241, 245, 249, -268, -230, 255, 259, 262, -526, -306, + -305, nil, nil, 273, -291, -186, -120, nil, nil, 170, + -348, -239, -684, 206, -342, -780, -657, -1047, nil, nil, + 105, -504 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 341, 7, 399, 344, + nil, nil, nil, 498, nil, nil, nil, nil, 340, 342, + nil, nil, nil, nil, 14, 15, 23, 254, nil, nil, + 17, nil, 466, 255, 373, nil, nil, 671, 258, nil, + 28, 26, 259, 253, 543, nil, nil, nil, nil, 150, + 27, nil, nil, nil, nil, nil, 394, nil, 29, 30, + nil, 854, nil, nil, nil, 361, nil, 31, 358, 481, + 38, nil, nil, 40, 43, 42, nil, 250, 251, 411, + nil, 489, 149, 95, nil, 471, 111, 52, 55, 290, + 332, nil, 482, nil, 483, 494, 506, 725, 598, 330, + 315, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 66, nil, nil, 316, 70, 71, 72, nil, nil, 73, + 1030, 74, 75, 76, nil, nil, 77, nil, 78, nil, + 652, 79, 237, nil, nil, nil, nil, nil, nil, nil, + nil, 320, 308, 734, 934, 661, 1031, 752, 518, nil, + 753, 754, 504, 500, 501, nil, 1236, 748, 1121, nil, + 505, nil, nil, nil, 507, nil, 509, nil, 1009, nil, + nil, nil, 516, nil, nil, nil, nil, nil, nil, nil, + 493, nil, nil, 832, nil, nil, 583, nil, nil, nil, + nil, nil, nil, 1104, nil, 777, 980, 779, 780, 784, + 781, 782, nil, nil, 783, 785, nil, nil, nil, 979, + 981, nil, 789, 791, 792, 793, 794, nil, 798, 527, + 799, 800, 801, 802, nil, nil, nil, 94, 96, 98, + nil, nil, nil, nil, 682, nil, nil, nil, nil, nil, + nil, 107, 108, nil, nil, 238, 944, 241, 503, nil, + 508, 952, 521, 523, 524, 1132, 528, 1133, 531, 534, + nil, 335 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 3, 151, :_reduce_6, + 2, 151, :_reduce_none, + 1, 154, :_reduce_none, + 0, 158, :_reduce_9, + 3, 154, :_reduce_10, + 3, 157, :_reduce_11, + 0, 164, :_reduce_12, + 6, 159, :_reduce_13, + 3, 159, :_reduce_14, + 2, 160, :_reduce_15, + 1, 165, :_reduce_none, + 1, 165, :_reduce_none, + 3, 165, :_reduce_18, + 2, 165, :_reduce_19, + 1, 166, :_reduce_none, + 0, 167, :_reduce_21, + 3, 166, :_reduce_22, + 0, 178, :_reduce_23, + 4, 156, :_reduce_24, + 3, 156, :_reduce_25, + 3, 156, :_reduce_26, + 3, 156, :_reduce_27, + 2, 156, :_reduce_28, + 3, 156, :_reduce_29, + 3, 156, :_reduce_30, + 3, 156, :_reduce_31, + 3, 156, :_reduce_32, + 3, 156, :_reduce_33, + 4, 156, :_reduce_34, + 1, 156, :_reduce_none, + 3, 156, :_reduce_36, + 3, 156, :_reduce_37, + 5, 156, :_reduce_38, + 3, 156, :_reduce_39, + 1, 156, :_reduce_none, + 3, 171, :_reduce_41, + 3, 171, :_reduce_42, + 6, 171, :_reduce_43, + 5, 171, :_reduce_44, + 5, 171, :_reduce_45, + 5, 171, :_reduce_46, + 5, 171, :_reduce_47, + 4, 171, :_reduce_48, + 6, 171, :_reduce_49, + 4, 171, :_reduce_50, + 6, 171, :_reduce_51, + 3, 171, :_reduce_52, + 1, 179, :_reduce_53, + 3, 179, :_reduce_54, + 1, 179, :_reduce_none, + 1, 177, :_reduce_none, + 3, 177, :_reduce_57, + 3, 177, :_reduce_58, + 3, 177, :_reduce_59, + 2, 177, :_reduce_60, + 0, 194, :_reduce_61, + 4, 177, :_reduce_62, + 0, 195, :_reduce_63, + 4, 177, :_reduce_64, + 1, 177, :_reduce_none, + 1, 193, :_reduce_66, + 2, 185, :_reduce_67, + 0, 200, :_reduce_68, + 5, 189, :_reduce_69, + 1, 170, :_reduce_70, + 0, 203, :_reduce_71, + 0, 204, :_reduce_72, + 4, 201, :_reduce_73, + 1, 173, :_reduce_none, + 1, 173, :_reduce_none, + 1, 205, :_reduce_none, + 4, 205, :_reduce_77, + 0, 213, :_reduce_78, + 4, 210, :_reduce_79, + 1, 212, :_reduce_80, + 2, 187, :_reduce_81, + 3, 187, :_reduce_82, + 4, 187, :_reduce_83, + 5, 187, :_reduce_84, + 4, 187, :_reduce_85, + 5, 187, :_reduce_86, + 2, 187, :_reduce_87, + 2, 187, :_reduce_88, + 2, 187, :_reduce_89, + 2, 187, :_reduce_90, + 2, 187, :_reduce_91, + 1, 172, :_reduce_none, + 3, 172, :_reduce_93, + 1, 218, :_reduce_none, + 3, 218, :_reduce_95, + 1, 217, :_reduce_96, + 2, 217, :_reduce_97, + 3, 217, :_reduce_98, + 5, 217, :_reduce_99, + 2, 217, :_reduce_100, + 4, 217, :_reduce_101, + 2, 217, :_reduce_102, + 4, 217, :_reduce_103, + 1, 217, :_reduce_104, + 3, 217, :_reduce_105, + 1, 221, :_reduce_none, + 3, 221, :_reduce_107, + 2, 220, :_reduce_108, + 3, 220, :_reduce_109, + 1, 223, :_reduce_110, + 3, 223, :_reduce_111, + 1, 222, :_reduce_112, + 1, 222, :_reduce_113, + 4, 222, :_reduce_114, + 3, 222, :_reduce_115, + 3, 222, :_reduce_116, + 3, 222, :_reduce_117, + 3, 222, :_reduce_118, + 2, 222, :_reduce_119, + 1, 222, :_reduce_120, + 1, 174, :_reduce_121, + 1, 174, :_reduce_122, + 4, 174, :_reduce_123, + 3, 174, :_reduce_124, + 3, 174, :_reduce_125, + 3, 174, :_reduce_126, + 3, 174, :_reduce_127, + 2, 174, :_reduce_128, + 1, 174, :_reduce_129, + 1, 226, :_reduce_130, + 1, 226, :_reduce_none, + 2, 227, :_reduce_132, + 1, 227, :_reduce_133, + 3, 227, :_reduce_134, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_138, + 1, 196, :_reduce_none, + 1, 168, :_reduce_140, + 1, 168, :_reduce_none, + 1, 169, :_reduce_142, + 0, 231, :_reduce_143, + 4, 169, :_reduce_144, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 3, 188, :_reduce_216, + 3, 188, :_reduce_217, + 6, 188, :_reduce_218, + 5, 188, :_reduce_219, + 5, 188, :_reduce_220, + 5, 188, :_reduce_221, + 5, 188, :_reduce_222, + 4, 188, :_reduce_223, + 3, 188, :_reduce_224, + 3, 188, :_reduce_225, + 3, 188, :_reduce_226, + 2, 188, :_reduce_227, + 2, 188, :_reduce_228, + 2, 188, :_reduce_229, + 2, 188, :_reduce_230, + 3, 188, :_reduce_231, + 3, 188, :_reduce_232, + 3, 188, :_reduce_233, + 3, 188, :_reduce_234, + 3, 188, :_reduce_235, + 3, 188, :_reduce_236, + 4, 188, :_reduce_237, + 2, 188, :_reduce_238, + 2, 188, :_reduce_239, + 3, 188, :_reduce_240, + 3, 188, :_reduce_241, + 3, 188, :_reduce_242, + 3, 188, :_reduce_243, + 1, 188, :_reduce_none, + 3, 188, :_reduce_245, + 3, 188, :_reduce_246, + 3, 188, :_reduce_247, + 3, 188, :_reduce_248, + 3, 188, :_reduce_249, + 2, 188, :_reduce_250, + 2, 188, :_reduce_251, + 3, 188, :_reduce_252, + 3, 188, :_reduce_253, + 3, 188, :_reduce_254, + 3, 188, :_reduce_255, + 3, 188, :_reduce_256, + 6, 188, :_reduce_257, + 4, 188, :_reduce_258, + 6, 188, :_reduce_259, + 4, 188, :_reduce_260, + 6, 188, :_reduce_261, + 1, 188, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 3, 234, :_reduce_267, + 3, 234, :_reduce_268, + 1, 237, :_reduce_269, + 1, 238, :_reduce_none, + 2, 238, :_reduce_271, + 4, 238, :_reduce_272, + 2, 238, :_reduce_273, + 1, 232, :_reduce_none, + 3, 232, :_reduce_275, + 3, 242, :_reduce_276, + 5, 242, :_reduce_277, + 3, 242, :_reduce_278, + 1, 244, :_reduce_none, + 1, 244, :_reduce_none, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 2, 182, :_reduce_283, + 4, 182, :_reduce_284, + 2, 182, :_reduce_285, + 1, 216, :_reduce_286, + 2, 216, :_reduce_287, + 2, 216, :_reduce_288, + 4, 216, :_reduce_289, + 1, 216, :_reduce_290, + 0, 247, :_reduce_291, + 2, 209, :_reduce_292, + 2, 246, :_reduce_293, + 1, 246, :_reduce_294, + 2, 245, :_reduce_295, + 1, 245, :_reduce_none, + 1, 239, :_reduce_297, + 2, 239, :_reduce_298, + 3, 239, :_reduce_299, + 4, 239, :_reduce_300, + 1, 176, :_reduce_301, + 1, 176, :_reduce_302, + 3, 175, :_reduce_303, + 4, 175, :_reduce_304, + 2, 175, :_reduce_305, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_316, + 0, 280, :_reduce_317, + 4, 235, :_reduce_318, + 0, 281, :_reduce_319, + 3, 235, :_reduce_320, + 0, 282, :_reduce_321, + 4, 235, :_reduce_322, + 3, 235, :_reduce_323, + 3, 235, :_reduce_324, + 2, 235, :_reduce_325, + 3, 235, :_reduce_326, + 0, 283, :_reduce_327, + 4, 235, :_reduce_328, + 1, 235, :_reduce_329, + 4, 235, :_reduce_330, + 3, 235, :_reduce_331, + 1, 235, :_reduce_332, + 5, 235, :_reduce_333, + 4, 235, :_reduce_334, + 3, 235, :_reduce_335, + 2, 235, :_reduce_336, + 1, 235, :_reduce_none, + 2, 235, :_reduce_338, + 1, 235, :_reduce_339, + 6, 235, :_reduce_340, + 6, 235, :_reduce_341, + 4, 235, :_reduce_342, + 4, 235, :_reduce_343, + 5, 235, :_reduce_344, + 4, 235, :_reduce_345, + 5, 235, :_reduce_346, + 6, 235, :_reduce_347, + 0, 284, :_reduce_348, + 6, 235, :_reduce_349, + 0, 285, :_reduce_350, + 0, 286, :_reduce_351, + 8, 235, :_reduce_352, + 0, 287, :_reduce_353, + 5, 235, :_reduce_354, + 4, 235, :_reduce_355, + 4, 235, :_reduce_356, + 1, 235, :_reduce_357, + 1, 235, :_reduce_358, + 1, 235, :_reduce_359, + 1, 235, :_reduce_360, + 1, 181, :_reduce_361, + 1, 257, :_reduce_none, + 1, 263, :_reduce_none, + 1, 266, :_reduce_none, + 1, 268, :_reduce_none, + 1, 269, :_reduce_none, + 1, 270, :_reduce_none, + 1, 273, :_reduce_none, + 1, 275, :_reduce_369, + 1, 278, :_reduce_370, + 1, 197, :_reduce_371, + 1, 288, :_reduce_none, + 1, 289, :_reduce_none, + 1, 290, :_reduce_none, + 1, 291, :_reduce_none, + 1, 292, :_reduce_none, + 1, 162, :_reduce_none, + 1, 293, :_reduce_none, + 1, 258, :_reduce_none, + 1, 215, :_reduce_none, + 1, 264, :_reduce_none, + 1, 264, :_reduce_none, + 2, 264, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 265, :_reduce_none, + 5, 265, :_reduce_387, + 1, 267, :_reduce_none, + 2, 267, :_reduce_389, + 1, 274, :_reduce_none, + 1, 274, :_reduce_391, + 1, 294, :_reduce_392, + 3, 294, :_reduce_393, + 1, 297, :_reduce_394, + 3, 297, :_reduce_395, + 1, 296, :_reduce_396, + 3, 296, :_reduce_397, + 5, 296, :_reduce_398, + 1, 296, :_reduce_399, + 3, 296, :_reduce_400, + 2, 298, :_reduce_401, + 1, 298, :_reduce_402, + 1, 299, :_reduce_none, + 1, 299, :_reduce_none, + 0, 304, :_reduce_405, + 2, 302, :_reduce_none, + 4, 303, :_reduce_407, + 2, 303, :_reduce_408, + 2, 303, :_reduce_409, + 1, 303, :_reduce_410, + 2, 308, :_reduce_411, + 1, 308, :_reduce_none, + 1, 309, :_reduce_413, + 6, 310, :_reduce_414, + 8, 310, :_reduce_415, + 4, 310, :_reduce_416, + 6, 310, :_reduce_417, + 4, 310, :_reduce_418, + 2, 310, :_reduce_419, + 6, 310, :_reduce_420, + 2, 310, :_reduce_421, + 4, 310, :_reduce_422, + 6, 310, :_reduce_423, + 2, 310, :_reduce_424, + 4, 310, :_reduce_425, + 2, 310, :_reduce_426, + 4, 310, :_reduce_427, + 1, 310, :_reduce_428, + 1, 314, :_reduce_429, + 1, 314, :_reduce_430, + 3, 315, :_reduce_431, + 1, 315, :_reduce_432, + 4, 315, :_reduce_433, + 1, 316, :_reduce_none, + 4, 316, :_reduce_435, + 1, 317, :_reduce_436, + 3, 317, :_reduce_437, + 1, 318, :_reduce_438, + 1, 318, :_reduce_none, + 0, 322, :_reduce_440, + 0, 323, :_reduce_441, + 5, 262, :_reduce_442, + 4, 320, :_reduce_443, + 1, 320, :_reduce_444, + 3, 321, :_reduce_445, + 3, 321, :_reduce_446, + 3, 325, :_reduce_447, + 2, 206, :_reduce_448, + 4, 206, :_reduce_449, + 5, 206, :_reduce_450, + 5, 206, :_reduce_451, + 2, 261, :_reduce_452, + 4, 261, :_reduce_453, + 4, 261, :_reduce_454, + 3, 261, :_reduce_455, + 3, 261, :_reduce_456, + 3, 261, :_reduce_457, + 2, 261, :_reduce_458, + 1, 261, :_reduce_459, + 4, 261, :_reduce_460, + 0, 328, :_reduce_461, + 4, 260, :_reduce_462, + 0, 329, :_reduce_463, + 4, 260, :_reduce_464, + 0, 330, :_reduce_465, + 0, 331, :_reduce_466, + 4, 211, :_reduce_467, + 0, 333, :_reduce_468, + 0, 334, :_reduce_469, + 4, 326, :_reduce_470, + 1, 332, :_reduce_471, + 2, 332, :_reduce_472, + 3, 332, :_reduce_473, + 4, 332, :_reduce_474, + 5, 271, :_reduce_475, + 1, 335, :_reduce_none, + 1, 335, :_reduce_none, + 0, 338, :_reduce_478, + 0, 339, :_reduce_479, + 7, 272, :_reduce_480, + 1, 337, :_reduce_none, + 1, 337, :_reduce_none, + 1, 336, :_reduce_none, + 3, 336, :_reduce_484, + 3, 336, :_reduce_485, + 1, 192, :_reduce_none, + 2, 192, :_reduce_487, + 3, 192, :_reduce_488, + 1, 192, :_reduce_489, + 1, 192, :_reduce_490, + 1, 192, :_reduce_491, + 1, 340, :_reduce_none, + 3, 345, :_reduce_493, + 1, 345, :_reduce_none, + 3, 347, :_reduce_495, + 1, 347, :_reduce_none, + 1, 349, :_reduce_497, + 1, 350, :_reduce_498, + 1, 348, :_reduce_none, + 1, 348, :_reduce_none, + 4, 348, :_reduce_501, + 4, 348, :_reduce_502, + 4, 348, :_reduce_503, + 3, 348, :_reduce_504, + 4, 348, :_reduce_505, + 4, 348, :_reduce_506, + 4, 348, :_reduce_507, + 3, 348, :_reduce_508, + 3, 348, :_reduce_509, + 3, 348, :_reduce_510, + 2, 348, :_reduce_511, + 0, 354, :_reduce_512, + 4, 348, :_reduce_513, + 2, 348, :_reduce_514, + 0, 355, :_reduce_515, + 4, 348, :_reduce_516, + 1, 341, :_reduce_517, + 1, 341, :_reduce_518, + 2, 341, :_reduce_519, + 3, 341, :_reduce_520, + 5, 341, :_reduce_521, + 2, 341, :_reduce_522, + 4, 341, :_reduce_523, + 1, 341, :_reduce_none, + 2, 356, :_reduce_525, + 3, 356, :_reduce_526, + 1, 343, :_reduce_527, + 3, 343, :_reduce_528, + 5, 342, :_reduce_529, + 2, 359, :_reduce_530, + 1, 359, :_reduce_531, + 1, 358, :_reduce_none, + 3, 358, :_reduce_533, + 1, 357, :_reduce_534, + 3, 344, :_reduce_535, + 1, 344, :_reduce_536, + 2, 344, :_reduce_537, + 1, 344, :_reduce_538, + 1, 360, :_reduce_none, + 3, 360, :_reduce_540, + 2, 362, :_reduce_541, + 1, 362, :_reduce_542, + 1, 363, :_reduce_543, + 3, 363, :_reduce_544, + 2, 365, :_reduce_545, + 1, 365, :_reduce_546, + 2, 367, :_reduce_547, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 1, 351, :_reduce_none, + 3, 351, :_reduce_551, + 3, 351, :_reduce_552, + 2, 351, :_reduce_553, + 2, 351, :_reduce_554, + 1, 351, :_reduce_none, + 1, 351, :_reduce_none, + 1, 351, :_reduce_none, + 2, 351, :_reduce_558, + 2, 351, :_reduce_559, + 1, 368, :_reduce_none, + 1, 368, :_reduce_none, + 1, 368, :_reduce_none, + 1, 368, :_reduce_none, + 1, 368, :_reduce_564, + 1, 368, :_reduce_565, + 1, 368, :_reduce_566, + 1, 368, :_reduce_567, + 1, 368, :_reduce_568, + 1, 368, :_reduce_none, + 1, 346, :_reduce_570, + 2, 369, :_reduce_571, + 2, 369, :_reduce_572, + 4, 370, :_reduce_573, + 2, 352, :_reduce_574, + 3, 352, :_reduce_575, + 1, 352, :_reduce_576, + 6, 161, :_reduce_577, + 0, 161, :_reduce_578, + 1, 372, :_reduce_579, + 1, 372, :_reduce_none, + 1, 372, :_reduce_none, + 2, 373, :_reduce_582, + 1, 373, :_reduce_none, + 2, 163, :_reduce_584, + 1, 163, :_reduce_none, + 1, 248, :_reduce_586, + 1, 248, :_reduce_none, + 1, 249, :_reduce_588, + 1, 375, :_reduce_589, + 1, 375, :_reduce_none, + 2, 375, :_reduce_591, + 3, 376, :_reduce_592, + 1, 376, :_reduce_593, + 3, 250, :_reduce_594, + 3, 251, :_reduce_595, + 3, 252, :_reduce_596, + 3, 252, :_reduce_597, + 1, 379, :_reduce_598, + 3, 379, :_reduce_599, + 1, 380, :_reduce_none, + 2, 380, :_reduce_601, + 3, 254, :_reduce_602, + 3, 254, :_reduce_603, + 1, 382, :_reduce_604, + 3, 382, :_reduce_605, + 3, 253, :_reduce_606, + 3, 253, :_reduce_607, + 3, 255, :_reduce_608, + 3, 255, :_reduce_609, + 1, 383, :_reduce_610, + 3, 383, :_reduce_611, + 1, 384, :_reduce_612, + 3, 384, :_reduce_613, + 1, 364, :_reduce_614, + 2, 364, :_reduce_615, + 1, 377, :_reduce_616, + 2, 377, :_reduce_617, + 1, 378, :_reduce_618, + 2, 378, :_reduce_619, + 1, 381, :_reduce_620, + 0, 386, :_reduce_621, + 3, 381, :_reduce_622, + 0, 387, :_reduce_623, + 4, 381, :_reduce_624, + 1, 385, :_reduce_625, + 1, 385, :_reduce_626, + 1, 385, :_reduce_627, + 1, 385, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 2, 388, :_reduce_631, + 1, 388, :_reduce_632, + 1, 390, :_reduce_none, + 1, 390, :_reduce_none, + 1, 390, :_reduce_none, + 1, 390, :_reduce_none, + 3, 389, :_reduce_637, + 1, 374, :_reduce_none, + 2, 374, :_reduce_639, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 371, :_reduce_644, + 1, 371, :_reduce_645, + 1, 371, :_reduce_646, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 225, :_reduce_652, + 1, 225, :_reduce_653, + 1, 225, :_reduce_654, + 1, 225, :_reduce_655, + 1, 225, :_reduce_656, + 1, 225, :_reduce_657, + 1, 225, :_reduce_658, + 1, 256, :_reduce_659, + 1, 256, :_reduce_660, + 1, 180, :_reduce_661, + 1, 180, :_reduce_662, + 1, 190, :_reduce_663, + 1, 190, :_reduce_664, + 0, 391, :_reduce_665, + 4, 276, :_reduce_666, + 1, 276, :_reduce_667, + 1, 186, :_reduce_none, + 1, 186, :_reduce_669, + 3, 392, :_reduce_670, + 1, 279, :_reduce_none, + 0, 394, :_reduce_672, + 3, 279, :_reduce_673, + 4, 393, :_reduce_674, + 2, 393, :_reduce_675, + 2, 393, :_reduce_676, + 1, 393, :_reduce_none, + 1, 393, :_reduce_none, + 2, 396, :_reduce_679, + 0, 396, :_reduce_680, + 6, 324, :_reduce_681, + 8, 324, :_reduce_682, + 4, 324, :_reduce_683, + 6, 324, :_reduce_684, + 4, 324, :_reduce_685, + 6, 324, :_reduce_686, + 2, 324, :_reduce_687, + 4, 324, :_reduce_688, + 6, 324, :_reduce_689, + 2, 324, :_reduce_690, + 4, 324, :_reduce_691, + 2, 324, :_reduce_692, + 4, 324, :_reduce_693, + 1, 324, :_reduce_694, + 0, 324, :_reduce_695, + 1, 243, :_reduce_696, + 1, 319, :_reduce_697, + 1, 319, :_reduce_698, + 1, 319, :_reduce_699, + 1, 319, :_reduce_700, + 1, 295, :_reduce_none, + 1, 295, :_reduce_702, + 1, 398, :_reduce_none, + 1, 399, :_reduce_none, + 3, 399, :_reduce_705, + 1, 311, :_reduce_706, + 3, 311, :_reduce_707, + 1, 400, :_reduce_708, + 2, 401, :_reduce_709, + 1, 401, :_reduce_710, + 2, 402, :_reduce_711, + 1, 402, :_reduce_712, + 1, 305, :_reduce_none, + 3, 305, :_reduce_714, + 1, 395, :_reduce_none, + 3, 395, :_reduce_716, + 1, 366, :_reduce_none, + 1, 366, :_reduce_none, + 2, 301, :_reduce_719, + 2, 300, :_reduce_720, + 1, 300, :_reduce_721, + 3, 403, :_reduce_722, + 3, 404, :_reduce_723, + 1, 312, :_reduce_724, + 3, 312, :_reduce_725, + 1, 397, :_reduce_726, + 3, 397, :_reduce_727, + 1, 405, :_reduce_none, + 1, 405, :_reduce_none, + 2, 313, :_reduce_730, + 1, 313, :_reduce_731, + 1, 406, :_reduce_none, + 1, 406, :_reduce_none, + 2, 307, :_reduce_734, + 1, 307, :_reduce_735, + 2, 306, :_reduce_736, + 0, 306, :_reduce_737, + 1, 198, :_reduce_none, + 0, 407, :_reduce_739, + 4, 198, :_reduce_740, + 1, 259, :_reduce_741, + 2, 259, :_reduce_none, + 1, 241, :_reduce_none, + 3, 241, :_reduce_744, + 3, 408, :_reduce_745, + 2, 408, :_reduce_746, + 1, 408, :_reduce_747, + 4, 408, :_reduce_748, + 2, 408, :_reduce_749, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 327, :_reduce_none, + 1, 327, :_reduce_none, + 1, 327, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 191, :_reduce_none, + 1, 191, :_reduce_none, + 2, 219, :_reduce_770, + 2, 183, :_reduce_771, + 2, 353, :_reduce_772, + 0, 240, :_reduce_none, + 1, 240, :_reduce_none, + 1, 240, :_reduce_none, + 1, 277, :_reduce_776, + 1, 277, :_reduce_none, + 1, 155, :_reduce_none, + 2, 155, :_reduce_779, + 0, 153, :_reduce_780 ] + +racc_reduce_n = 781 + +racc_shift_n = 1294 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLONELY => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tLOWEST => 145, + :tEQL => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLONELY", + "tBDOT2", + "tBDOT3", + "tLOWEST", + "tEQL", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@3", + "stmts", + "stmt_or_begin", + "@4", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@5", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "defn_head", + "f_opt_paren_args", + "command", + "arg", + "defs_head", + "backref", + "opt_nl", + "p_top_expr_body", + "def_name", + "@6", + "@7", + "fname", + "k_def", + "singleton", + "dot_or_colon", + "@8", + "expr_value_do", + "do", + "@9", + "@10", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@11", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "op", + "reswords", + "symbol", + "@12", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@13", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "p_case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "f_any_kwrest", + "f_kwrest", + "f_no_kwarg", + "f_eq", + "block_args_tail", + "@22", + "f_block_kwarg", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "excessed_comma", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@23", + "@24", + "f_args", + "do_block", + "do_body", + "operation3", + "@25", + "@26", + "@27", + "@28", + "case_args", + "@29", + "@30", + "cases", + "p_top_expr", + "p_cases", + "@31", + "@32", + "p_expr", + "p_args", + "p_find", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@33", + "@34", + "p_args_head", + "p_arg", + "p_args_post", + "p_rest", + "p_kwarg", + "p_any_kwrest", + "p_kw", + "p_kw_label", + "string_contents", + "p_kwrest", + "kwrest_mark", + "p_kwnorest", + "p_primitive", + "p_var_ref", + "p_expr_ref", + "nonlocal_var", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@35", + "@36", + "ssym", + "dsym", + "sym", + "@37", + "f_paren_args", + "args_tail", + "@38", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@39", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 1 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + (_, line), stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_12(val, _values, result) + res = _values[-2] + yyerror "else without rescue is useless" unless res + + result +end + +def _reduce_13(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_14(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_15(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 16 omitted + +# reduce 17 omitted + +def _reduce_18(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_19(val, _values, result) + result = val[1] + debug 2 + + result +end + +# reduce 20 omitted + +def _reduce_21(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_22(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_23(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_24(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_25(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_27(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_28(val, _values, result) + result = val[1] + + result +end + +def _reduce_29(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_30(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_31(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_33(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_34(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 3 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 35 omitted + +def _reduce_36(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_37(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_38(val, _values, result) + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_49(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_50(val, _values, result) + result = new_endless_defs val + + result +end + +def _reduce_51(val, _values, result) + result = new_endless_defs val + + result +end + +def _reduce_52(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_53(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +def _reduce_54(val, _values, result) + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + + result +end + +# reduce 55 omitted + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_58(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_59(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_60(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +def _reduce_61(val, _values, result) + # value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + + result +end + +def _reduce_62(val, _values, result) + lhs, _, in_kwarg, rhs = val + + self.env.unextend + self.in_kwarg = in_kwarg + + rhs = new_in rhs, nil, nil, rhs.line + result = new_case lhs, rhs, rhs.line + + result +end + +def _reduce_63(val, _values, result) + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + + result +end + +def _reduce_64(val, _values, result) + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + + result +end + +# reduce 65 omitted + +def _reduce_66(val, _values, result) + # TODO: numparam_name(p, fname); + + (id, line), = val + old_in_def = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result = [id.to_sym, line, old_in_def] + + result +end + +def _reduce_67(val, _values, result) + _, name = val + result = name + + result +end + +def _reduce_68(val, _values, result) + lexer.lex_state = EXPR_FNAME + self.in_argdef = true + + result +end + +def _reduce_69(val, _values, result) + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + self.in_single += 1 # TODO: remove? + + # self.in_def = true # local_push + # self.env.extend + # lexer.cmdarg.push false + # lexer.cond.push false + + _, recv, _, _, name = val + + result = [recv, name] + + result +end + +def _reduce_70(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_71(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_72(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_73(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 74 omitted + +# reduce 75 omitted + +# reduce 76 omitted + +def _reduce_77(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_78(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_79(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_80(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_81(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_82(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_83(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_84(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_85(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_86(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_87(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_88(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_89(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_90(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_91(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 92 omitted + +def _reduce_93(val, _values, result) + result = val[1] + + result +end + +# reduce 94 omitted + +def _reduce_95(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_96(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_97(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_98(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_99(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_100(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_101(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_102(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_103(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_104(val, _values, result) + (_, l), = val + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_105(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 106 omitted + +def _reduce_107(val, _values, result) + result = val[1] + + result +end + +def _reduce_108(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_109(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_110(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_111(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_112(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_113(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_114(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_115(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_116(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_117(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_118(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 4 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_119(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 5 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_120(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_121(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_122(val, _values, result) + var, = val + + result = self.assignable var + + debug 6 + + result +end + +def _reduce_123(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_124(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_125(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_126(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_127(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 7 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_128(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 8 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_129(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_130(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 131 omitted + +def _reduce_132(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_133(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_134(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +def _reduce_138(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 139 omitted + +def _reduce_140(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 141 omitted + +def _reduce_142(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_143(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_144(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +# reduce 204 omitted + +# reduce 205 omitted + +# reduce 206 omitted + +# reduce 207 omitted + +# reduce 208 omitted + +# reduce 209 omitted + +# reduce 210 omitted + +# reduce 211 omitted + +# reduce 212 omitted + +# reduce 213 omitted + +# reduce 214 omitted + +# reduce 215 omitted + +def _reduce_216(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_217(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_218(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_219(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_220(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_221(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_222(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_223(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_224(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_225(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_226(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_227(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + + result +end + +def _reduce_228(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + + result +end + +def _reduce_229(val, _values, result) + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + + result +end + +def _reduce_230(val, _values, result) + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + + result +end + +def _reduce_231(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_236(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + _, num, _, arg = val + lit = wrap :lit, num + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_238(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_239(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_240(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_241(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_242(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_243(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 244 omitted + +def _reduce_245(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_246(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_247(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_248(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_249(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_250(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_251(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_252(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_253(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_254(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_255(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_256(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_257(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +def _reduce_258(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_259(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_260(val, _values, result) + result = new_endless_defs val + + result +end + +def _reduce_261(val, _values, result) + result = new_endless_defs val + + result +end + +# reduce 262 omitted + +# reduce 263 omitted + +# reduce 264 omitted + +# reduce 265 omitted + +# reduce 266 omitted + +def _reduce_267(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_268(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_269(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 270 omitted + +def _reduce_271(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_272(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_273(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 274 omitted + +def _reduce_275(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_276(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +def _reduce_277(val, _values, result) + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + + result +end + +def _reduce_278(val, _values, result) + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + + result +end + +# reduce 279 omitted + +# reduce 280 omitted + +# reduce 281 omitted + +# reduce 282 omitted + +def _reduce_283(val, _values, result) + result = args val + + result +end + +def _reduce_284(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_285(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_286(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_287(val, _values, result) + result = call_args val + + result +end + +def _reduce_288(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_289(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_290(val, _values, result) + result = call_args val + + result +end + +def _reduce_291(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_292(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_293(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_294(val, _values, result) + (_, line), = val + result = s(:block_pass).line line + + result +end + +def _reduce_295(val, _values, result) + result = val[1] + + result +end + +# reduce 296 omitted + +def _reduce_297(val, _values, result) + arg, = val + lineno = arg.line + + result = s(:array, arg).line lineno + + result +end + +def _reduce_298(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_299(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_300(val, _values, result) + args, _, (_, line), id = val + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_301(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_302(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_303(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_304(val, _values, result) + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_305(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 306 omitted + +# reduce 307 omitted + +# reduce 308 omitted + +# reduce 309 omitted + +# reduce 310 omitted + +# reduce 311 omitted + +# reduce 312 omitted + +# reduce 313 omitted + +# reduce 314 omitted + +# reduce 315 omitted + +def _reduce_316(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_317(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_318(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_319(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_320(val, _values, result) + (_, line), _, _ = val + result = s(:begin).line line + + result +end + +def _reduce_321(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_322(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_323(val, _values, result) + (_, line), stmt, _ = val + result = stmt || s(:nil).line(line) + result.paren = true + + result +end + +def _reduce_324(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_325(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_326(val, _values, result) + (_, line), args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_327(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_328(val, _values, result) + result = new_hash val + + result +end + +def _reduce_329(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_330(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_331(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_332(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_333(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_334(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_335(val, _values, result) + debug 9 + + result +end + +def _reduce_336(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 337 omitted + +def _reduce_338(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_339(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_340(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_341(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_342(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_343(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_344(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_345(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_346(val, _values, result) + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + + result +end + +def _reduce_347(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_348(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_349(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_350(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_351(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_352(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_353(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_354(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_355(val, _values, result) + # [ [:f, 1, false], s(:args)...] + # => + # [[:k_def, 666], [:f, 1], false, s(:args)...] + val.insert 1, val.first.pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_356(val, _values, result) + # [ [recv, [:name, 1, false]], s(:args...] + # => + # [ recv, [:name, 1, false], s(:args...] + # => + # [ recv, [:name, 1], false, s(:args...] + # => + # [ :k_def, recv, [:name, 1], false, s(:args...] + + val.prepend(*val.shift) + val.insert 2, val[1].pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_357(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_358(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_359(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_360(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_361(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 362 omitted + +# reduce 363 omitted + +# reduce 364 omitted + +# reduce 365 omitted + +# reduce 366 omitted + +# reduce 367 omitted + +# reduce 368 omitted + +def _reduce_369(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_370(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_371(val, _values, result) + self.comments.push self.lexer.comments + self.in_argdef = true + + result +end + +# reduce 372 omitted + +# reduce 373 omitted + +# reduce 374 omitted + +# reduce 375 omitted + +# reduce 376 omitted + +# reduce 377 omitted + +# reduce 378 omitted + +# reduce 379 omitted + +# reduce 380 omitted + +# reduce 381 omitted + +# reduce 382 omitted + +# reduce 383 omitted + +# reduce 384 omitted + +# reduce 385 omitted + +# reduce 386 omitted + +def _reduce_387(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 388 omitted + +def _reduce_389(val, _values, result) + result = val[1] + + result +end + +# reduce 390 omitted + +def _reduce_391(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +def _reduce_392(val, _values, result) + (sym, line), = val + + result = s(:dummy, sym).line line + + result +end + +def _reduce_393(val, _values, result) + _, args, _ = val + result = args + + result +end + +def _reduce_394(val, _values, result) + arg, = val + line = arg.line + + arg = arg.last if arg.sexp_type == :dummy + + result = s(:array, arg).line line + + result +end + +def _reduce_395(val, _values, result) + args, _, arg = val + + arg = arg.last if arg.sexp_type == :dummy + + result = list_append args, arg + + result +end + +def _reduce_396(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_397(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_398(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_399(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_400(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_401(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_402(val, _values, result) + (_, line), = val + result = args([:*]).line line + + result +end + +# reduce 403 omitted + +# reduce 404 omitted + +def _reduce_405(val, _values, result) + self.in_argdef = false + result +end + +# reduce 406 omitted + +def _reduce_407(val, _values, result) + result = call_args val + + result +end + +def _reduce_408(val, _values, result) + result = call_args val + + result +end + +def _reduce_409(val, _values, result) + result = call_args val + + result +end + +def _reduce_410(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_411(val, _values, result) + result = args val + + result +end + +# reduce 412 omitted + +def _reduce_413(val, _values, result) + result = s(:WTF_COMMA!) + + result +end + +def _reduce_414(val, _values, result) + result = args val + + result +end + +def _reduce_415(val, _values, result) + result = args val + + result +end + +def _reduce_416(val, _values, result) + result = args val + + result +end + +def _reduce_417(val, _values, result) + result = args val + + result +end + +def _reduce_418(val, _values, result) + result = args val + + result +end + +def _reduce_419(val, _values, result) + arg, _ = val + result = arg << nil + + result +end + +def _reduce_420(val, _values, result) + result = args val + + result +end + +def _reduce_421(val, _values, result) + result = args val + + result +end + +def _reduce_422(val, _values, result) + result = args val + + result +end + +def _reduce_423(val, _values, result) + result = args val + + result +end + +def _reduce_424(val, _values, result) + result = args val + + result +end + +def _reduce_425(val, _values, result) + result = args val + + result +end + +def _reduce_426(val, _values, result) + result = args val + + result +end + +def _reduce_427(val, _values, result) + result = args val + + result +end + +def _reduce_428(val, _values, result) + result = args val + + result +end + +def _reduce_429(val, _values, result) + result = 0 + result +end + +def _reduce_430(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_431(val, _values, result) + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + + result +end + +def _reduce_432(val, _values, result) + (_, line), = val + + result = s(:args).line line + + result +end + +def _reduce_433(val, _values, result) + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + + result +end + +# reduce 434 omitted + +def _reduce_435(val, _values, result) + result = args val + + result +end + +def _reduce_436(val, _values, result) + result = args val + + result +end + +def _reduce_437(val, _values, result) + result = args val + + result +end + +def _reduce_438(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 439 omitted + +def _reduce_440(val, _values, result) + self.env.extend :dynamic + result = lexer.lpar_beg + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_441(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_442(val, _values, result) + (_, line), lpar, args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_443(val, _values, result) + self.in_argdef = false + result = args val + + result +end + +def _reduce_444(val, _values, result) + self.in_argdef = false + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_445(val, _values, result) + result = val[1] + + result +end + +def _reduce_446(val, _values, result) + result = val[1] + + result +end + +def _reduce_447(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_448(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_449(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_450(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_451(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_452(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_453(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_454(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_455(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_456(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_457(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_458(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_459(val, _values, result) + (_, line), = val + result = s(:zsuper).line line + + result +end + +def _reduce_460(val, _values, result) + result = new_aref val + + result +end + +def _reduce_461(val, _values, result) + self.env.extend :dynamic + + result +end + +def _reduce_462(val, _values, result) + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_463(val, _values, result) + self.env.extend :dynamic + + result +end + +def _reduce_464(val, _values, result) + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_465(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_466(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_467(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_468(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_469(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_470(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_471(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_472(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_473(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_474(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_475(val, _values, result) + (_, line), case_args, _then, body, cases = val + + result = new_when case_args, body + result.line line + result << cases if cases + + result +end + +# reduce 476 omitted + +# reduce 477 omitted + +def _reduce_478(val, _values, result) + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + + result +end + +def _reduce_479(val, _values, result) + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + + result +end + +def _reduce_480(val, _values, result) + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + + result +end + +# reduce 481 omitted + +# reduce 482 omitted + +# reduce 483 omitted + +def _reduce_484(val, _values, result) + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + + result +end + +def _reduce_485(val, _values, result) + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + + result +end + +# reduce 486 omitted + +def _reduce_487(val, _values, result) + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + + result +end + +def _reduce_488(val, _values, result) + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + + result +end + +def _reduce_489(val, _values, result) + find, = val + + result = new_find_pattern nil, find + + result +end + +def _reduce_490(val, _values, result) + args, = val + result = new_array_pattern nil, nil, args, args.line + + result +end + +def _reduce_491(val, _values, result) + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + + result +end + +# reduce 492 omitted + +def _reduce_493(val, _values, result) + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + + result +end + +# reduce 494 omitted + +def _reduce_495(val, _values, result) + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + + result +end + +# reduce 496 omitted + +def _reduce_497(val, _values, result) + push_pktbl + result +end + +def _reduce_498(val, _values, result) + push_pktbl + result +end + +# reduce 499 omitted + +# reduce 500 omitted + +def _reduce_501(val, _values, result) + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + + result +end + +def _reduce_502(val, _values, result) + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + + result +end + +def _reduce_503(val, _values, result) + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + + result +end + +def _reduce_504(val, _values, result) + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + + result +end + +def _reduce_505(val, _values, result) + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + + result +end + +def _reduce_506(val, _values, result) + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + + result +end + +def _reduce_507(val, _values, result) + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + + result +end + +def _reduce_508(val, _values, result) + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + + result +end + +def _reduce_509(val, _values, result) + _, pat, _ = val + + result = new_array_pattern nil, nil, pat, pat.line + + result +end + +def _reduce_510(val, _values, result) + _, find, _ = val + + result = new_find_pattern nil, find + + result +end + +def _reduce_511(val, _values, result) + (_, line), _ = val + + result = s(:array_pat).line line + + result +end + +def _reduce_512(val, _values, result) + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + + result +end + +def _reduce_513(val, _values, result) + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + + result +end + +def _reduce_514(val, _values, result) + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + + result +end + +def _reduce_515(val, _values, result) + push_pktbl + result +end + +def _reduce_516(val, _values, result) + _, _, expr, _ = val + + pop_pktbl + result = expr + + result +end + +def _reduce_517(val, _values, result) + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + + result +end + +def _reduce_518(val, _values, result) + head, = val + + result = new_array_pattern_tail head, true, nil, nil + + result +end + +def _reduce_519(val, _values, result) + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + + result +end + +def _reduce_520(val, _values, result) + head, _, (id, _line) = val + + result = new_array_pattern_tail head, true, id.to_sym, nil + result.line head.line + + result +end + +def _reduce_521(val, _values, result) + head, _, (id, _line), _, post = val + + result = new_array_pattern_tail head, true, id.to_sym, post + result.line head.line + + result +end + +def _reduce_522(val, _values, result) + expr, _ = val + + result = new_array_pattern_tail(expr, true, nil, nil).line expr.line + + result +end + +def _reduce_523(val, _values, result) + head, _, _, post = val + + result = new_array_pattern_tail(head, true, nil, post).line head.line + + result +end + +# reduce 524 omitted + +def _reduce_525(val, _values, result) + arg, _ = val + result = arg + + result +end + +def _reduce_526(val, _values, result) + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + + result +end + +def _reduce_527(val, _values, result) + (id, line), = val + + result = new_array_pattern_tail nil, true, id, nil + result.line line + + result +end + +def _reduce_528(val, _values, result) + (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id, rhs + result.line line + + result +end + +def _reduce_529(val, _values, result) + lhs, _, mid, _, rhs = val + + result = new_find_pattern_tail lhs, mid, rhs + + result +end + +def _reduce_530(val, _values, result) + _, (id, line) = val + + result = [id.to_sym, line] + + result +end + +def _reduce_531(val, _values, result) + (_id, line), = val + + result = [nil, line] + + result +end + +# reduce 532 omitted + +def _reduce_533(val, _values, result) + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + + result +end + +def _reduce_534(val, _values, result) + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + + result +end + +def _reduce_535(val, _values, result) + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + + result +end + +def _reduce_536(val, _values, result) + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + + result +end + +def _reduce_537(val, _values, result) + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + + result +end + +def _reduce_538(val, _values, result) + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + + result +end + +# reduce 539 omitted + +def _reduce_540(val, _values, result) + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + + result +end + +def _reduce_541(val, _values, result) + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + + result +end + +def _reduce_542(val, _values, result) + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 10 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + + result +end + +def _reduce_543(val, _values, result) + result = wrap :lit, val[0] + + result +end + +def _reduce_544(val, _values, result) + # you can't actually get here the way I lex labels + debug 11 + + result +end + +def _reduce_545(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + + result +end + +def _reduce_546(val, _values, result) + (_, line), = val + + result = s(:kwrest, :"**").line line + + result +end + +def _reduce_547(val, _values, result) + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + + result +end + +# reduce 548 omitted + +# reduce 549 omitted + +# reduce 550 omitted + +def _reduce_551(val, _values, result) + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + + result +end + +def _reduce_552(val, _values, result) + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + + result +end + +def _reduce_553(val, _values, result) + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + + result +end + +def _reduce_554(val, _values, result) + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + + result +end + +# reduce 555 omitted + +# reduce 556 omitted + +# reduce 557 omitted + +def _reduce_558(val, _values, result) + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + + result +end + +def _reduce_559(val, _values, result) + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + + result +end + +# reduce 560 omitted + +# reduce 561 omitted + +# reduce 562 omitted + +# reduce 563 omitted + +def _reduce_564(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_565(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_566(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_567(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_568(val, _values, result) + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + + result +end + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + + result +end + +def _reduce_571(val, _values, result) + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + + result +end + +def _reduce_572(val, _values, result) + _, var = val + result = var + + result +end + +def _reduce_573(val, _values, result) + _, _, expr, _ = val + result = expr # TODO? s(:begin, expr).line expr.line + + result +end + +def _reduce_574(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_575(val, _values, result) + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + + result +end + +def _reduce_576(val, _values, result) + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + + result +end + +def _reduce_577(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_578(val, _values, result) + result = nil + + result +end + +def _reduce_579(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 580 omitted + +# reduce 581 omitted + +def _reduce_582(val, _values, result) + result = val[1] + + result +end + +# reduce 583 omitted + +def _reduce_584(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 585 omitted + +def _reduce_586(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 587 omitted + +def _reduce_588(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_589(val, _values, result) + debug 12 + + result +end + +# reduce 590 omitted + +def _reduce_591(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_592(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_593(val, _values, result) + result = new_string val + + result +end + +def _reduce_594(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_595(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_596(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_597(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_598(val, _values, result) + result = new_word_list + + result +end + +def _reduce_599(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 600 omitted + +def _reduce_601(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_602(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_603(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_604(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_605(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_606(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_607(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_608(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_609(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_610(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_611(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_612(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_613(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_614(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_615(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_616(val, _values, result) + result = nil + + result +end + +def _reduce_617(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_618(val, _values, result) + result = nil + + result +end + +def _reduce_619(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_620(val, _values, result) + result = new_string val + + result +end + +def _reduce_621(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_622(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_623(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_624(val, _values, result) + (_, line), memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 13 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_625(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_626(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_627(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 628 omitted + +# reduce 629 omitted + +# reduce 630 omitted + +def _reduce_631(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_632(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 633 omitted + +# reduce 634 omitted + +# reduce 635 omitted + +# reduce 636 omitted + +def _reduce_637(val, _values, result) + (_, line), result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line line + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 14 + end + + result +end + +# reduce 638 omitted + +def _reduce_639(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 640 omitted + +# reduce 641 omitted + +# reduce 642 omitted + +# reduce 643 omitted + +def _reduce_644(val, _values, result) + result = wrap :ivar, val[0] + result +end + +def _reduce_645(val, _values, result) + result = wrap :gvar, val[0] + result +end + +def _reduce_646(val, _values, result) + result = wrap :cvar, val[0] + result +end + +# reduce 647 omitted + +# reduce 648 omitted + +# reduce 649 omitted + +# reduce 650 omitted + +# reduce 651 omitted + +def _reduce_652(val, _values, result) + (_, line), = val; result = s(:nil).line line + result +end + +def _reduce_653(val, _values, result) + (_, line), = val; result = s(:self).line line + result +end + +def _reduce_654(val, _values, result) + (_, line), = val; result = s(:true).line line + result +end + +def _reduce_655(val, _values, result) + (_, line), = val; result = s(:false).line line + result +end + +def _reduce_656(val, _values, result) + (_, line), = val; result = s(:str, self.file).line line + result +end + +def _reduce_657(val, _values, result) + (_, line), = val; result = s(:lit, line).line line + result +end + +def _reduce_658(val, _values, result) + (_, l), = val + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_659(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + + result.line line + + result +end + +def _reduce_660(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_661(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_662(val, _values, result) + result = self.assignable val[0] + debug 15 + + result +end + +def _reduce_663(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_664(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_665(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_666(val, _values, result) + result = val[2] + + result +end + +def _reduce_667(val, _values, result) + result = nil + + result +end + +# reduce 668 omitted + +def _reduce_669(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +def _reduce_670(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +# reduce 671 omitted + +def _reduce_672(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.in_argdef = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_673(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +def _reduce_674(val, _values, result) + result = args val + + result +end + +def _reduce_675(val, _values, result) + result = args val + + result +end + +def _reduce_676(val, _values, result) + result = args val + + result +end + +# reduce 677 omitted + +# reduce 678 omitted + +def _reduce_679(val, _values, result) + result = val[1] + + result +end + +def _reduce_680(val, _values, result) + result = nil + + result +end + +def _reduce_681(val, _values, result) + result = args val + + result +end + +def _reduce_682(val, _values, result) + result = args val + + result +end + +def _reduce_683(val, _values, result) + result = args val + + result +end + +def _reduce_684(val, _values, result) + result = args val + + result +end + +def _reduce_685(val, _values, result) + result = args val + + result +end + +def _reduce_686(val, _values, result) + result = args val + + result +end + +def _reduce_687(val, _values, result) + result = args val + + result +end + +def _reduce_688(val, _values, result) + result = args val + + result +end + +def _reduce_689(val, _values, result) + result = args val + + result +end + +def _reduce_690(val, _values, result) + result = args val + + result +end + +def _reduce_691(val, _values, result) + result = args val + + result +end + +def _reduce_692(val, _values, result) + result = args val + + result +end + +def _reduce_693(val, _values, result) + result = args val + + result +end + +def _reduce_694(val, _values, result) + result = args val + + result +end + +def _reduce_695(val, _values, result) + result = args val + + result +end + +def _reduce_696(val, _values, result) + (_, line), = val + result = s(:forward_args).line line + + result +end + +def _reduce_697(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_698(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_699(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_700(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 701 omitted + +def _reduce_702(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 703 omitted + +# reduce 704 omitted + +def _reduce_705(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_706(val, _values, result) + result = new_arg val + + result +end + +def _reduce_707(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +def _reduce_708(val, _values, result) + label, = val + # arg_var(p, formal_argument(p, $1)); + # p->cur_arg = get_id($1); + # p->max_numparam = ORDINAL_PARAM; + self.in_argdef = false + result = label + + result +end + +def _reduce_709(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + self.in_argdef = true + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_710(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_711(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_712(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 713 omitted + +def _reduce_714(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 715 omitted + +def _reduce_716(val, _values, result) + result = args val + + result +end + +# reduce 717 omitted + +# reduce 718 omitted + +def _reduce_719(val, _values, result) + (_, line), _ = val + result = [:"**nil", line] + + result +end + +def _reduce_720(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_721(val, _values, result) + (_, line), = val + id = :"**" + self.env[id] = :lvar + result = [id, line] + + result +end + +def _reduce_722(val, _values, result) + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO: detect duplicate names + # TODO? p->cur_arg = 0; + + result +end + +def _reduce_723(val, _values, result) + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO? p->cur_arg = 0; + + result +end + +def _reduce_724(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_725(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_726(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_727(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 728 omitted + +# reduce 729 omitted + +def _reduce_730(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_731(val, _values, result) + (_, line), = val + name = :"*" + self.env[name] = :lvar + result = [name, line] + + result +end + +# reduce 732 omitted + +# reduce 733 omitted + +def _reduce_734(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_735(val, _values, result) + (_, line), = val + + result = [:&, line] + + result +end + +def _reduce_736(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_737(val, _values, result) + result = nil + + result +end + +# reduce 738 omitted + +def _reduce_739(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_740(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_741(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 742 omitted + +# reduce 743 omitted + +def _reduce_744(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_745(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_746(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_747(val, _values, result) + lit = wrap :lit, val[0] + arg = nil + + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_748(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_749(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +# reduce 750 omitted + +# reduce 751 omitted + +# reduce 752 omitted + +# reduce 753 omitted + +# reduce 754 omitted + +# reduce 755 omitted + +# reduce 756 omitted + +# reduce 757 omitted + +# reduce 758 omitted + +# reduce 759 omitted + +# reduce 760 omitted + +# reduce 761 omitted + +# reduce 762 omitted + +# reduce 763 omitted + +# reduce 764 omitted + +# reduce 765 omitted + +# reduce 766 omitted + +# reduce 767 omitted + +# reduce 768 omitted + +# reduce 769 omitted + +def _reduce_770(val, _values, result) + _, close = val # TODO: include lineno in close? + result = [close, lexer.lineno] + + result +end + +def _reduce_771(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_772(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 773 omitted + +# reduce 774 omitted + +# reduce 775 omitted + +def _reduce_776(val, _values, result) + yyerrok + result +end + +# reduce 777 omitted + +# reduce 778 omitted + +def _reduce_779(val, _values, result) + yyerrok + result +end + +def _reduce_780(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby31Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby31_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby31_parser.y new file mode 100644 index 000000000..619165976 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby31_parser.y @@ -0,0 +1,3542 @@ +# -*- racc -*- + +class Ruby31Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + tBDOT2 tBDOT3 + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 1 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY top_compstmt tRCURLY + { + (_, line), stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + yyerror "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 2 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 3 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg kRESCUE_MOD stmt + { + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | defn_head f_opt_paren_args tEQL command + { + result = new_endless_defn val + } + | defn_head f_opt_paren_args tEQL command kRESCUE_MOD arg + { + result = new_endless_defn val + } + | defs_head f_opt_paren_args tEQL command + { + result = new_endless_defs val + } + | defs_head f_opt_paren_args tEQL command kRESCUE_MOD arg + { + result = new_endless_defs val + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg tASSOC + { + # value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } + p_top_expr_body + { + lhs, _, in_kwarg, rhs = val + + self.env.unextend + self.in_kwarg = in_kwarg + + rhs = new_in rhs, nil, nil, rhs.line + result = new_case lhs, rhs, rhs.line + } + | arg + kIN + { + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } + p_top_expr_body + { + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + } + | arg =tLBRACE_ARG + + def_name: fname + { + # TODO: numparam_name(p, fname); + + (id, line), = val + old_in_def = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result = [id.to_sym, line, old_in_def] + } + defn_head: k_def def_name + { + _, name = val + result = name + } + defs_head: k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + self.in_argdef = true + } + def_name + { + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + self.in_single += 1 # TODO: remove? + + # self.in_def = true # local_push + # self.env.extend + # lexer.cmdarg.push false + # lexer.cond.push false + + _, recv, _, _, name = val + + result = [recv, name] + } + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + (_, l), = val + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 4 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 5 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 6 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 7 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 8 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + | arg tDOT2 + { + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + } + | arg tDOT3 + { + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + } + + | tBDOT2 arg + { + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + } + | tBDOT3 arg + { + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + } + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, num, _, arg = val + lit = wrap :lit, num + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | defn_head f_opt_paren_args tEQL arg + { + result = new_endless_defn val + } + | defn_head f_opt_paren_args tEQL arg kRESCUE_MOD arg + { + result = new_endless_defn val + } + | defs_head f_opt_paren_args tEQL arg + { + result = new_endless_defs val + } + | defs_head f_opt_paren_args tEQL arg kRESCUE_MOD arg + { + result = new_endless_defs val + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + | tLPAREN2 args tCOMMA args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + | tLPAREN2 args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + | tAMPER + { + (_, line), = val + result = s(:block_pass).line line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + args, _, (_, line), id = val + result = self.list_append args, s(:splat, id).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + (_, line), _, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + (_, line), stmt, _ = val + result = stmt || s(:nil).line(line) + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK aref_args rbracket + { + (_, line), args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 9 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_case expr_value opt_terms p_case_body k_end + { + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt + k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | defn_head f_arglist bodystmt k_end + { + # [ [:f, 1, false], s(:args)...] + # => + # [[:k_def, 666], [:f, 1], false, s(:args)...] + val.insert 1, val.first.pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | defs_head f_arglist bodystmt k_end + { + # [ [recv, [:name, 1, false]], s(:args...] + # => + # [ recv, [:name, 1, false], s(:args...] + # => + # [ recv, [:name, 1], false, s(:args...] + # => + # [ :k_def, recv, [:name, 1], false, s(:args...] + + val.prepend(*val.shift) + val.insert 2, val[1].pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + self.in_argdef = true + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + { + (sym, line), = val + + result = s(:dummy, sym).line line + } + | tLPAREN f_margs rparen + { + _, args, _ = val + result = args + } + + f_marg_list: f_marg + { + arg, = val + line = arg.line + + arg = arg.last if arg.sexp_type == :dummy + + result = s(:array, arg).line line + } + | f_marg_list tCOMMA f_marg + { + args, _, arg = val + + arg = arg.last if arg.sexp_type == :dummy + + result = list_append args, arg + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + (_, line), = val + result = args([:*]).line line + } + + f_any_kwrest: f_kwrest + | f_no_kwarg + + f_eq: { self.in_argdef = false } tEQL + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_any_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + excessed_comma: tCOMMA + { + result = s(:WTF_COMMA!) + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg excessed_comma + { + arg, _ = val + result = arg << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + } + | tOROP + { + (_, line), = val + + result = s(:args).line line + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = lexer.lpar_beg + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + (_, line), lpar, args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + self.in_argdef = false + result = args val + } + | f_args + { + self.in_argdef = false + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + (_, line), = val + result = s(:zsuper).line line + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + } + brace_body + tRCURLY + { + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + } + do_body + kEND + { + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + bodystmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + case_args then compstmt cases + { + (_, line), case_args, _then, body, cases = val + + result = new_when case_args, body + result.line line + result << cases if cases + } + + cases: opt_else | case_body +###################################################################### + + p_case_body: kIN + { + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + } + p_top_expr then + { + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + } + compstmt + p_cases + { + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + } + + p_cases: opt_else + | p_case_body + + p_top_expr: p_top_expr_body + | p_top_expr_body kIF_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + } + | p_top_expr_body kUNLESS_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + } + + p_top_expr_body: p_expr + | p_expr tCOMMA + { + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + } + | p_expr tCOMMA p_args + { + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + } + | p_find + { + find, = val + + result = new_find_pattern nil, find + } + | p_args_tail + { + args, = val + result = new_array_pattern nil, nil, args, args.line + } + | p_kwargs + { + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + } + + p_expr: p_as + + p_as: p_expr tASSOC p_variable + { + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + } + | p_alt + + p_alt: p_alt tPIPE p_expr_basic + { + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + } + | p_expr_basic + + p_lparen: tLPAREN2 { push_pktbl } + p_lbracket: tLBRACK2 { push_pktbl } + + p_expr_basic: p_value + | p_variable + | p_const p_lparen p_args tRPAREN + { + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + } + | p_const p_lparen p_find tRPAREN + { + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + } + | p_const p_lparen p_kwargs tRPAREN + { + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + } + | p_const tLPAREN2 tRPAREN + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | p_const p_lbracket p_args rbracket + { + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + } + | p_const p_lbracket p_find rbracket + { + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + } + | p_const p_lbracket p_kwargs rbracket + { + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + } + | p_const tLBRACK2 rbracket + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | tLBRACK p_args rbracket + { + _, pat, _ = val + + result = new_array_pattern nil, nil, pat, pat.line + } + | tLBRACK p_find rbracket + { + _, find, _ = val + + result = new_find_pattern nil, find + } + | tLBRACK rbracket + { + (_, line), _ = val + + result = s(:array_pat).line line + } + | tLBRACE + { + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + } + p_kwargs rbrace + { + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + } + | tLBRACE rbrace + { + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + } + | tLPAREN { push_pktbl } p_expr tRPAREN + { + _, _, expr, _ = val + + pop_pktbl + result = expr + } + + p_args: p_expr + { + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + } + | p_args_head + { + head, = val + + result = new_array_pattern_tail head, true, nil, nil + } + | p_args_head p_arg + { + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER + { + head, _, (id, _line) = val + + result = new_array_pattern_tail head, true, id.to_sym, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post + { + head, _, (id, _line), _, post = val + + result = new_array_pattern_tail head, true, id.to_sym, post + result.line head.line + } + | p_args_head tSTAR + { + expr, _ = val + + result = new_array_pattern_tail(expr, true, nil, nil).line expr.line + } + | p_args_head tSTAR tCOMMA p_args_post + { + head, _, _, post = val + + result = new_array_pattern_tail(head, true, nil, post).line head.line + } + | p_args_tail + + p_args_head: p_arg tCOMMA + { + arg, _ = val + result = arg + } + | p_args_head p_arg tCOMMA + { + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + } + + p_args_tail: p_rest + { + (id, line), = val + + result = new_array_pattern_tail nil, true, id, nil + result.line line + } + | p_rest tCOMMA p_args_post + { + (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id, rhs + result.line line + } + + p_find: p_rest tCOMMA p_args_post tCOMMA p_rest + { + lhs, _, mid, _, rhs = val + + result = new_find_pattern_tail lhs, mid, rhs + } + + p_rest: tSTAR tIDENTIFIER + { + _, (id, line) = val + + result = [id.to_sym, line] + } + | tSTAR + { + (_id, line), = val + + result = [nil, line] + } + + p_args_post: p_arg + | p_args_post tCOMMA p_arg + { + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + } + + p_arg: p_expr + { + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + } + + p_kwargs: p_kwarg tCOMMA p_any_kwrest + { + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + } + | p_kwarg + { + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_kwarg tCOMMA + { + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_any_kwrest + { + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + } + + p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1) + | p_kwarg tCOMMA p_kw + { + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + } + + p_kw: p_kw_label p_expr + { + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + } + | p_kw_label + { + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 10 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + } + + p_kw_label: tLABEL + { + result = wrap :lit, val[0] + } + | tSTRING_BEG string_contents tLABEL_END + { + # you can't actually get here the way I lex labels + debug 11 + } + + p_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + } + | kwrest_mark + { + (_, line), = val + + result = s(:kwrest, :"**").line line + } + + p_kwnorest: kwrest_mark kNIL + { + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + } + + p_any_kwrest: p_kwrest + | p_kwnorest + + p_value: p_primitive + | p_primitive tDOT2 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + } + | p_primitive tDOT3 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + } + | p_primitive tDOT2 + { + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + } + | p_primitive tDOT3 + { + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + } + | p_var_ref + | p_expr_ref + | p_const + | tBDOT2 p_primitive + { + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + } + | tBDOT3 p_primitive + { + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + } + + p_primitive: literal + | strings + | xstring + | regexp + | words + { + result = ary_to_pat val[0] + } + | qwords + { + result = ary_to_pat val[0] + } + | symbols + { + result = ary_to_pat val[0] + } + | qsymbols + { + result = ary_to_pat val[0] + } + | keyword_variable + { + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + } + | lambda + + p_variable: tIDENTIFIER + { + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + } + + p_var_ref: tCARET tIDENTIFIER + { + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + } + | tCARET nonlocal_var + { + _, var = val + result = var + } + + p_expr_ref: tCARET tLPAREN expr_value rparen + { + _, _, expr, _ = val + result = expr # TODO? s(:begin, expr).line expr.line + } + + p_const: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | p_const tCOLON2 cname + { + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + } + | tCONSTANT + { + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + } +###################################################################### + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 12 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + (_, line), memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 13 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + (_, line), result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line line + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 14 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + nonlocal_var: tIVAR { result = wrap :ivar, val[0] } + | tGVAR { result = wrap :gvar, val[0] } + | tCVAR { result = wrap :cvar, val[0] } + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { (_, line), = val; result = s(:nil).line line } + | kSELF { (_, line), = val; result = s(:self).line line } + | kTRUE { (_, line), = val; result = s(:true).line line } + | kFALSE { (_, line), = val; result = s(:false).line line } + | k__FILE__ { (_, line), = val; result = s(:str, self.file).line line } + | k__LINE__ { (_, line), = val; result = s(:lit, line).line line } + | k__ENCODING__ + { + (_, l), = val + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 15 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + +f_opt_paren_args: f_paren_args + | none + { + self.in_argdef = false + result = end_args val + } + + f_paren_args: tLPAREN2 f_args rparen + { + self.in_argdef = false + result = end_args val + } + + f_arglist: f_paren_args + | { + result = self.in_kwarg + self.in_kwarg = true + self.in_argdef = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + self.in_argdef = false + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_any_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + | args_forward + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + } + + args_forward: tBDOT3 + { + (_, line), = val + result = s(:forward_args).line line + } + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + { + label, = val + # arg_var(p, formal_argument(p, $1)); + # p->cur_arg = get_id($1); + # p->max_numparam = ORDINAL_PARAM; + self.in_argdef = false + result = label + } + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + self.in_argdef = true + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + f_no_kwarg: kwrest_mark kNIL + { + (_, line), _ = val + result = [:"**nil", line] + } + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + (_, line), = val + id = :"**" + self.env[id] = :lvar + result = [id, line] + } + + f_opt: f_arg_asgn + f_eq + arg_value + { + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO: detect duplicate names + # TODO? p->cur_arg = 0; + } + + f_block_opt: f_arg_asgn + f_eq + primary_value + { + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO? p->cur_arg = 0; + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + (_, line), = val + name = :"*" + self.env[name] = :lvar + result = [name, line] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + | blkarg_mark + { + (_, line), = val + + result = [:&, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tLABEL + { + lit = wrap :lit, val[0] + arg = nil + + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val # TODO: include lineno in close? + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + rbrace: opt_nl tRCURLY + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby32_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby32_parser.rb new file mode 100644 index 000000000..4046c8c28 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby32_parser.rb @@ -0,0 +1,13601 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.6.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +class Ruby32Parser < RubyParser::Parser + + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** +##### State transition tables begin ### + +racc_action_table = [ + -647, 699, 702, 317, 653, -121, 317, -647, -647, -647, + 228, 229, -647, -647, -647, -115, -647, -122, 968, -117, + 653, 653, 228, 229, -647, 246, -647, -647, -647, 228, + 229, -769, 642, 758, 992, 641, -647, -647, 234, -647, + -647, -647, -647, -647, 247, 312, 1033, 653, -129, -116, + -128, 759, 991, -124, -126, 653, 876, 968, 240, 967, + 3, 247, 1051, -114, 698, 701, -661, -647, -647, -647, + -647, -647, -647, -647, -647, -647, -647, -647, -647, -647, + -647, 653, -115, -647, -647, -647, -117, -647, -647, 871, + 319, -647, -123, 319, -647, -647, 130, -647, -534, -647, + 247, -647, 235, -647, -647, -647, -647, -647, -647, -647, + -112, -647, 247, -647, -781, -754, -116, -115, 134, 247, + -115, -117, -113, 133, -117, -121, -647, -647, -647, -647, + -114, -647, -121, -647, 134, 134, -650, -115, -647, 133, + 133, -117, -647, -650, -650, -650, -647, -122, -650, -650, + -650, -116, -650, -120, -116, -119, -129, -128, -115, -117, + -650, 134, -650, -650, -650, -114, 133, 1050, -114, 134, + -124, -116, -650, -650, 133, -650, -650, -650, -650, -650, + -126, -125, 240, -123, 225, -114, -125, -127, 1011, 134, + 317, -662, 1011, 226, 133, 134, 683, -114, 1040, 688, + 133, 548, 227, -650, -650, -650, -650, -650, -650, -650, + -650, -650, -650, -650, -650, -650, -650, 99, 317, -650, + -650, -650, 1010, -650, -650, 100, 1010, -650, 112, 113, + -650, -650, 667, -650, 244, -650, 668, -650, -781, -650, + -650, -650, -650, -650, -650, -650, -121, -650, -127, -650, + -122, -121, -754, -755, 230, 314, 683, 685, 684, -754, + -129, -122, -650, -650, -650, -650, -122, -650, 683, -650, + -129, -128, -326, 683, -650, -129, -128, 319, -650, -326, + -326, -326, -650, 314, -124, -326, -326, -107, -326, -124, + -769, -116, -118, -129, -126, -125, -326, -123, 642, -126, + -125, 644, -123, 683, -93, 319, 114, 115, -326, -326, + 630, -326, -326, -326, -326, -326, 240, 685, 684, 681, + 134, 247, 795, 307, 660, 133, -755, 112, 113, 685, + 684, 240, 876, 525, 685, 684, 681, 841, 899, -326, + -326, -326, -326, -326, -326, -326, -326, -326, -326, -326, + -326, -326, -326, 371, 1116, -326, -326, -326, 683, 726, + -326, 372, -127, -326, 685, 684, -326, -127, 962, -128, + 244, -326, -781, -326, 247, -326, -326, -326, -326, -326, + -326, -326, 1109, -326, 1116, -326, 522, -781, 517, 425, + 514, 513, 512, 522, 515, 234, 795, 525, -326, -326, + 526, -118, 233, -326, 525, 114, 115, 525, -758, 428, + -326, 231, -120, 963, -326, -758, -758, -758, -127, 685, + 684, -758, -758, 522, -758, 431, 520, -124, 901, -129, + 533, 532, -758, -758, 525, 530, 529, 533, 532, -363, + 1033, 434, 660, 683, -758, -758, -363, -758, -758, -758, + -758, -758, 453, 451, 234, -363, 1109, 455, 454, 235, + 974, 545, 683, 247, 526, 970, 579, 533, 532, 971, + 546, 526, -126, 580, 526, -758, -758, -758, -758, -758, + -758, -758, -758, -758, -758, -758, -758, -758, -758, 720, + -647, -758, -758, -758, 667, 727, -758, -647, 1003, -758, + 683, 526, -758, -363, 685, 684, 681, -758, 721, -758, + 456, -758, -758, -758, -758, -758, -758, -758, 235, -758, + -758, -758, 134, 685, 684, 686, 517, 133, 514, 513, + 512, 522, 515, -659, -758, -758, -661, -116, 134, -758, + -659, 683, 525, 133, -758, 683, -758, 497, -124, -659, + -758, -758, -758, -758, -125, -668, -758, -758, -758, 932, + -758, 685, 684, 691, 520, 933, 1088, -126, -758, -758, + -758, -758, -758, 530, 529, 533, 532, 916, -112, 536, + -758, -758, -660, -758, -758, -758, -758, -758, 134, -660, + 547, 134, -650, 133, 234, -121, 133, -659, -660, -650, + -662, 622, 685, 684, 696, 549, 685, 684, 703, 526, + 620, -758, -758, -758, -758, -758, -758, -758, -758, -758, + -758, -758, -758, -758, -758, -123, -657, -758, -758, -758, + -656, 964, -758, -657, 550, -758, -123, -656, -758, -758, + 667, -758, -113, -758, 1003, -758, -660, -758, -758, -758, + -758, -758, -758, -758, -658, -758, -758, -758, 235, -122, + 642, -658, 517, 644, 514, 513, 512, 522, 515, -317, + -758, -758, -758, -758, -655, -758, -317, -758, 525, 246, + -326, -655, -758, 587, 630, -317, -758, -326, -326, -326, + -125, 599, -326, -326, -326, -652, -326, 602, 234, 604, + 520, -92, -652, 247, -326, 632, -326, -326, -326, 530, + 529, 533, 532, 615, 546, 616, -326, -326, 234, -326, + -326, -326, -326, -326, 134, 664, -119, 623, 234, 133, + 234, 720, -653, -317, 662, 670, 721, 714, 916, -653, + 228, 229, 324, -128, 672, 526, 712, -326, -326, -326, + -326, -326, -326, -326, -326, -326, -326, -326, -326, -326, + -326, 247, 235, -326, -326, -326, 240, 965, -326, 288, + 289, -326, 240, -115, -326, -326, 314, -326, -117, -326, + -114, -326, 235, -326, -326, -326, -326, -326, -326, -326, + -124, -326, 235, -326, 235, -126, 517, -123, 514, 513, + 512, 522, 515, -327, 287, 286, -326, -326, -326, -326, + -327, -326, 525, -326, -654, 627, -326, 642, -326, -327, + 644, -654, -326, -326, -326, -326, -127, 633, 968, -326, + -326, 1181, -326, 247, 520, 517, 1251, 514, 513, 512, + -326, 515, 228, 229, -327, 533, 532, 228, 229, 533, + 532, -327, -326, -326, -326, -326, -326, -326, -326, -326, + -327, -326, -326, 271, 234, 247, -755, -327, 247, -326, + -326, 1220, 660, 751, -755, 993, 994, 271, -326, 526, + 1218, 444, 755, -326, -326, -326, -326, -326, -326, -326, + -326, -326, -326, -326, -326, -326, -326, 1029, 1033, -326, + -326, -326, 665, 726, -326, 1203, 1204, -326, -327, 268, + -326, 1029, 1033, 270, 269, -326, 666, -326, -326, -326, + -326, -326, -326, -326, -326, -326, -326, -326, 235, -326, + 674, 690, 517, 234, 514, 513, 512, 522, 515, 234, + 1243, 694, -326, -326, 697, -326, 1243, -326, 525, 672, + 700, 707, -758, 708, -326, 672, -297, 710, -326, -758, + -758, -758, -127, 711, 715, -758, -758, 247, -758, 517, + 520, 514, 513, 512, 718, 515, -758, -758, 719, 530, + 529, 533, 532, 314, 122, 121, 123, 124, -758, -758, + 733, -758, -758, -758, -758, -758, 736, 235, 247, 738, + 126, 125, 127, 235, 741, 742, 997, 751, 1001, 1000, + 744, 746, 1002, 112, 113, 526, 755, -407, 368, -758, + -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, + -758, -758, -758, 760, 761, -758, -758, -758, 736, 727, + -758, 767, 773, -758, 999, 774, -758, 271, 271, 271, + 271, -758, 823, -758, 247, -758, -758, -758, -758, -758, + -758, -758, 829, -758, -758, -758, 247, 109, 99, 101, + 102, 103, 105, 247, 271, 451, 100, 110, -758, -758, + 247, -758, -107, -758, 93, 845, 247, 97, 104, 106, + -758, 114, 115, 636, -758, 856, 736, 247, -125, 8, + 89, 90, 91, 12, 82, 863, 268, 864, 83, 84, + 270, 269, -751, 87, -752, 85, 86, 88, 36, 37, + 80, 81, 137, 138, 139, 140, 141, 92, 34, 33, + 122, 121, 123, 124, 604, 517, 24, 514, 513, 512, + 867, 515, 11, 54, 10, 13, 126, 125, 127, 116, + 65, 118, 117, 119, 736, 120, 128, 129, 736, 112, + 113, 736, 50, 51, 49, -647, 902, -650, 903, 904, + -298, 587, -647, 751, -650, 587, 928, -751, 953, -752, + 956, -647, 755, -650, 46, 957, 247, 39, 271, 960, + 67, 68, 247, 969, 69, 986, 41, 987, 988, -751, + 53, -752, 1005, 307, 281, 282, 1055, 1056, 25, 1017, + 1057, 128, 129, 109, 99, 101, 102, 103, 105, 1019, + 268, 602, 100, 110, 270, 269, 266, 267, 604, -647, + 93, -650, 856, 97, 104, 106, 247, 114, 115, 314, + 314, 47, 48, 343, 89, 90, 91, 12, 82, 856, + 271, 1033, 83, 84, 736, 736, -758, 87, 247, 85, + 86, 88, 36, 37, 80, 81, 137, 138, 139, 140, + 141, 92, 34, 33, 122, 121, 123, 124, 247, 736, + 24, 271, 247, -300, 247, 1064, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, -297, 120, + 128, 129, 1070, 112, 113, 741, 50, 51, 49, -758, + 271, 759, 1073, 268, 1075, 1077, -758, 270, 269, 266, + 267, -754, 1079, 1079, 247, -758, 815, 1093, 46, 247, + 247, 347, 1107, 1110, 67, 68, 968, 1135, 69, 247, + 41, 856, 268, -758, 53, 736, 270, 269, 266, 267, + 736, 736, 25, 736, 1153, 247, 1155, 109, 99, 101, + 102, 103, 105, -301, 1168, 1169, 100, 110, 137, 138, + 139, 140, 141, -758, 93, 1170, 1171, 97, 104, 106, + 1172, 114, 115, 1173, 247, 47, 48, 343, 89, 90, + 91, 12, 82, 247, 247, 968, 83, 84, 1177, 1178, + 247, 87, 1182, 85, 86, 88, 36, 37, 80, 81, + 263, 247, 1184, 741, 1187, 92, 34, 33, 122, 121, + 123, 124, 1191, 517, 24, 514, 513, 512, 1193, 515, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, 1195, 120, 128, 129, 247, 112, 113, -407, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, 284, 279, 280, 1210, 264, 265, 1211, 932, 281, + 282, 1221, 46, 1222, 262, 39, 1079, 1079, 67, 68, + 1079, 1241, 69, 1244, 41, 268, 736, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, 733, 1169, + 1259, 109, 99, 101, 102, 103, 105, 1259, 741, 1261, + 100, 110, 1263, 285, 1265, 1267, 1267, 247, 93, 1079, + -755, 97, 104, 106, -754, 114, 115, 1284, 1267, 47, + 48, 343, 89, 90, 91, 12, 82, 1267, 1267, 1267, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, 137, 138, 139, 140, 141, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, 716, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, 275, 276, + 277, 278, 288, 289, 283, 284, 279, 280, nil, 264, + 265, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, 285, nil, -269, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, 716, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, 275, 276, 277, 278, 288, 289, 283, 284, + 279, 280, nil, 264, 265, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, 285, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, 929, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, 275, 276, 277, 278, + 288, 289, 283, 284, 279, 280, nil, 264, 265, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, 285, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 343, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, 961, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + 275, 276, 277, 278, 288, 289, 283, 284, 279, 280, + nil, 264, 265, nil, nil, 281, 282, nil, 46, nil, + nil, 347, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, 285, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, 1214, 24, 514, 513, 512, nil, 515, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, 284, 279, 280, nil, 264, 265, nil, nil, 281, + 282, nil, 46, nil, nil, 347, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, 285, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, 1214, 24, 514, + 513, 512, nil, 515, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, 275, 276, + 277, 278, 288, 289, 283, 284, 279, 280, nil, 264, + 265, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, 247, 285, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, 275, 276, 277, 278, 288, 289, 283, 284, + 279, 280, nil, 264, 265, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, 285, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, 275, 276, 277, 278, + 288, 289, 283, 284, 279, 280, nil, 264, 265, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, 285, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 8, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, 11, 54, 10, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + 275, 276, 277, 278, 288, 289, 283, 284, 279, 280, + nil, 264, 265, nil, nil, 281, 282, nil, 46, nil, + nil, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, 285, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 24, nil, nil, nil, nil, nil, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, 284, 279, 280, nil, 264, 265, nil, nil, 281, + 282, nil, 46, nil, nil, 39, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, 285, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, 275, 276, + 277, 278, 288, 289, 283, 284, 279, 280, nil, 264, + 265, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, 285, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, 275, 276, 277, 278, 288, 289, 283, 284, + 279, 280, nil, 264, 265, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, 285, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, 275, 276, 277, 278, + 288, 289, 283, 284, 279, 280, nil, 264, 265, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, 285, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 343, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + 275, 276, 277, 278, 288, 289, 283, 284, 279, 280, + nil, -782, -782, nil, nil, 281, 282, nil, 46, nil, + nil, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 24, nil, nil, nil, nil, nil, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, 284, 279, 280, nil, -782, -782, nil, nil, 281, + 282, nil, 46, nil, nil, 39, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, 275, 276, + 277, 278, 288, 289, 283, 284, 279, 280, nil, -782, + -782, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, 275, 276, 277, 278, 288, 289, 283, 284, + 279, 280, nil, -782, -782, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, 517, 24, 514, 513, 512, + nil, 515, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, -782, -782, -782, -782, + 288, 289, nil, 751, -782, -782, nil, nil, nil, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 343, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, 517, + 24, 514, 513, 512, nil, 515, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + -782, -782, -782, -782, 288, 289, nil, 751, -782, -782, + nil, nil, nil, nil, nil, 281, 282, nil, 46, nil, + nil, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, 517, 24, 514, 513, 512, nil, 515, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, -782, -782, -782, -782, 288, 289, + nil, 751, -782, -782, nil, nil, nil, nil, nil, 281, + 282, nil, 46, nil, nil, 39, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, -782, -782, + -782, -782, 288, 289, nil, nil, -782, -782, nil, nil, + nil, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, 287, 286, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, -782, -782, -782, -782, 288, 289, nil, nil, + -782, -782, nil, nil, nil, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, 287, 286, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 343, + 89, 90, 91, 12, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, 11, 54, 345, 13, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, 271, -782, -782, -782, -782, + 288, 289, nil, nil, -782, -782, nil, nil, nil, nil, + nil, 281, 282, nil, 46, nil, nil, 39, nil, nil, + 67, 68, nil, nil, 69, nil, 41, 268, nil, 274, + 53, 270, 269, 266, 267, 287, 286, 272, 25, 273, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 343, 89, 90, 91, 12, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, 11, 54, 345, 13, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, 271, + 275, 276, 277, 278, 288, 289, nil, nil, 279, 280, + nil, nil, nil, nil, nil, 281, 282, nil, 46, nil, + nil, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, 268, nil, 274, 53, 270, 269, 266, 267, 287, + 286, 272, 25, 273, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 343, 89, 90, + 91, 12, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 24, nil, nil, nil, nil, nil, + 11, 54, 345, 13, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, 271, 275, 276, 277, 278, 288, 289, + 283, nil, 279, 280, nil, nil, nil, nil, nil, 281, + 282, nil, 46, nil, nil, 39, nil, nil, 67, 68, + nil, nil, 69, nil, 41, 268, nil, 274, 53, 270, + 269, 266, 267, 287, 286, 272, 25, 273, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 343, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, 345, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 281, 282, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, 268, + nil, 274, 53, 270, 269, 266, 267, nil, nil, 272, + 25, 273, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 343, 89, 90, 91, 12, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, 11, 54, + 345, 13, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, 271, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 281, 282, nil, + 46, nil, nil, 39, nil, nil, 67, 68, nil, nil, + 69, nil, 41, 268, nil, 274, 53, 270, 269, 266, + 267, nil, nil, 272, 25, 273, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, 12, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 24, nil, nil, nil, nil, + nil, 11, 54, 10, 13, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, 271, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 281, 282, nil, 46, nil, nil, 39, nil, nil, 67, + 68, nil, nil, 69, nil, 41, 268, nil, 274, 53, + 270, 269, 266, 267, nil, nil, nil, 25, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, 271, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 281, 282, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, 268, + nil, 274, 53, 270, 269, 266, 267, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, -461, 114, + 115, nil, nil, 47, 48, -461, -461, -461, nil, nil, + -461, -461, -461, 517, -461, 514, 513, 512, 522, 515, + nil, nil, -461, -461, -461, -461, nil, nil, nil, 525, + nil, nil, nil, nil, -461, -461, nil, -461, -461, -461, + -461, -461, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 520, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 533, 532, nil, -461, -461, -461, -461, -461, + -461, -461, -461, -461, -461, -461, -461, -461, -461, nil, + nil, -461, -461, -461, nil, nil, -461, nil, 314, -461, + nil, nil, -461, -461, nil, -461, 526, -461, nil, -461, + nil, -461, -461, -461, -461, -461, -461, -461, nil, -461, + -461, -461, 517, nil, 514, 513, 512, 522, 515, nil, + nil, nil, nil, nil, -461, -461, nil, -461, 525, -461, + -334, nil, nil, nil, nil, nil, -461, -334, -334, -334, + -461, nil, -334, -334, -334, nil, -334, nil, nil, nil, + 520, nil, nil, nil, -334, nil, -334, -334, nil, nil, + nil, 533, 532, nil, nil, nil, -334, -334, nil, -334, + -334, -334, -334, -334, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 526, nil, -334, -334, -334, + -334, -334, -334, -334, -334, -334, -334, -334, -334, -334, + -334, nil, nil, -334, -334, -334, nil, nil, -334, nil, + 324, -334, nil, nil, -334, -334, nil, -334, nil, -334, + nil, -334, nil, -334, -334, -334, -334, -334, -334, -334, + nil, -334, nil, -334, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, -334, -334, nil, -334, + nil, -334, 89, 90, 91, nil, 82, nil, -334, nil, + 83, 84, -334, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, 336, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, 333, nil, + 331, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 334, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, 337, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 336, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 333, nil, 331, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 334, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 337, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 336, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, 333, nil, 331, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 334, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 337, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, -318, + 114, 115, nil, nil, 47, 48, -318, -318, -318, nil, + nil, -318, -318, -318, 517, -318, 514, 513, 512, 522, + 515, nil, nil, -318, nil, -318, -318, -318, nil, nil, + 525, 122, 121, 123, 124, -318, -318, nil, -318, -318, + -318, -318, -318, nil, nil, nil, nil, 126, 125, 127, + nil, nil, 520, nil, nil, nil, nil, nil, nil, nil, + 112, 113, nil, 533, 532, 368, -318, -318, -318, -318, + -318, -318, -318, -318, -318, -318, -318, -318, -318, -318, + nil, nil, -318, -318, -318, nil, nil, -318, nil, nil, + -318, nil, nil, -318, -318, nil, -318, 526, -318, nil, + -318, nil, -318, -318, -318, -318, -318, -318, -318, nil, + -318, nil, -318, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, -318, -318, -318, -318, nil, + -318, 93, -318, nil, 97, 104, 106, -318, 114, 115, + -781, -318, 89, 90, 91, 12, 82, -781, -781, -781, + 83, 84, -781, -781, -781, 87, -781, 85, 86, 88, + 36, 37, 80, 81, -781, -781, -781, -781, nil, 92, + 34, 33, 122, 121, 123, 124, -781, -781, 24, -781, + -781, -781, -781, -781, 11, 54, nil, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, -781, -781, -781, + -781, -781, -781, -781, -781, -781, -781, -781, -781, -781, + -781, nil, nil, -781, -781, -781, 46, nil, -781, 39, + 314, -781, 67, 68, -781, -781, 69, -781, 41, -781, + nil, -781, 53, -781, -781, -781, -781, -781, -781, -781, + 25, -781, -781, -781, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, -781, -781, nil, -781, + nil, -781, 93, nil, nil, 97, 104, 106, -781, 114, + 115, nil, -781, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 336, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 333, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 334, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 337, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 24, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 25, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 36, + 37, 80, 81, nil, nil, nil, nil, nil, 92, 34, + 33, 122, 121, 123, 124, nil, nil, 24, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 25, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 25, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, 134, nil, + nil, nil, nil, 133, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + 12, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 24, nil, nil, nil, nil, nil, 11, + 54, 10, 13, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 46, nil, nil, 39, nil, nil, 67, 68, nil, + nil, 69, nil, 41, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, 444, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 25, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 24, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 25, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 24, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 25, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, 12, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, 11, 54, nil, 13, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 46, nil, nil, 39, + nil, nil, 67, 68, nil, nil, 69, nil, 41, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 25, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 461, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 36, 37, 80, 81, + nil, nil, nil, nil, nil, 92, 34, 33, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, 461, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 36, + 37, 80, 81, nil, nil, nil, nil, nil, 92, 34, + 33, 122, 121, 123, 124, nil, nil, 24, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 25, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 24, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 25, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 336, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, 333, nil, 331, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 334, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 337, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 25, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 24, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 25, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, 247, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 36, 37, 80, 81, nil, nil, nil, nil, + nil, 92, 34, 33, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 336, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + 333, nil, 331, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 334, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 337, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 589, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 336, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, 333, nil, 331, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 334, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 337, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 336, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, 333, nil, 331, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 334, 101, 102, 103, 105, nil, + nil, nil, 100, 110, 247, nil, nil, nil, nil, nil, + 93, nil, 337, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, 12, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 24, nil, nil, nil, nil, nil, 11, 54, nil, + 13, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 46, + nil, nil, 39, nil, nil, 67, 68, nil, nil, 69, + nil, 41, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 25, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, 636, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 336, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 334, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 337, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 24, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 25, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, -759, + 114, 115, nil, nil, 47, 48, -759, -759, -759, nil, + nil, -759, -759, -759, 517, -759, 514, 513, 512, 522, + 515, nil, nil, -759, -759, -759, -759, -759, nil, nil, + 525, nil, nil, nil, nil, -759, -759, nil, -759, -759, + -759, -759, -759, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 520, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 533, 532, nil, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + nil, nil, -759, -759, -759, nil, nil, -759, nil, nil, + -759, nil, nil, -759, -759, nil, -759, 526, -759, nil, + -759, nil, -759, -759, -759, -759, -759, -759, -759, nil, + -759, -759, -759, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, -759, -759, -759, -759, nil, + -759, -760, -759, nil, nil, nil, nil, -759, -760, -760, + -760, -759, nil, -760, -760, -760, nil, -760, nil, nil, + nil, nil, nil, nil, nil, -760, -760, -760, -760, -760, + nil, nil, nil, nil, nil, nil, nil, -760, -760, nil, + -760, -760, -760, -760, -760, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, -760, -760, + -760, -760, -760, -760, -760, -760, -760, -760, -760, -760, + -760, -760, nil, nil, -760, -760, -760, nil, nil, -760, + nil, nil, -760, nil, nil, -760, -760, nil, -760, nil, + -760, nil, -760, nil, -760, -760, -760, -760, -760, -760, + -760, nil, -760, -760, -760, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, -760, -760, -760, + -760, nil, -760, nil, -760, nil, 89, 90, 91, -760, + 82, nil, nil, -760, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, 336, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 333, nil, 331, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 334, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 337, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 24, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, -781, 114, 115, nil, nil, 47, 48, + -781, -781, -781, nil, nil, -781, -781, -781, nil, -781, + 122, 121, 123, 124, nil, nil, nil, -781, -781, -781, + nil, nil, nil, nil, nil, nil, 126, 125, 127, -781, + -781, nil, -781, -781, -781, -781, -781, nil, nil, 112, + 113, nil, nil, nil, 368, nil, nil, nil, nil, nil, + 517, nil, 514, 513, 512, 522, 515, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 525, nil, nil, nil, + nil, -781, nil, nil, nil, nil, nil, nil, -781, nil, + nil, nil, nil, 314, -781, nil, nil, nil, 520, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, 533, + 532, nil, 100, 110, nil, -781, -781, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, -781, + nil, 89, 90, 91, -781, 82, nil, nil, nil, 83, + 84, -781, nil, 526, 87, -781, 85, 86, 88, 364, + 365, 80, 81, 511, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 336, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + 838, nil, 331, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 334, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 337, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 336, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, 331, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 334, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 337, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, 12, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 24, + nil, nil, nil, nil, nil, 11, 54, 345, 13, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 46, nil, nil, + 39, nil, nil, 67, 68, nil, nil, 69, nil, 41, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, 444, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + 336, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, 333, nil, 331, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 334, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, 337, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 24, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 25, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 336, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, 838, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 334, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 337, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, 336, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 334, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, 337, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + 879, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, 336, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, 333, nil, 331, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 334, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 337, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, 336, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, 333, nil, 331, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 334, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 337, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, 12, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 24, + nil, nil, nil, nil, nil, 11, 54, nil, 13, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 46, nil, nil, + 39, nil, nil, 67, 68, nil, nil, 69, nil, 41, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, 908, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, 336, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, 333, nil, + 331, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 334, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, 337, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, 12, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 36, 37, 80, 81, nil, nil, nil, + nil, nil, 92, 34, 33, 122, 121, 123, 124, nil, + nil, 24, nil, nil, nil, nil, nil, 11, 54, nil, + 13, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 46, + nil, nil, 39, nil, nil, 67, 68, nil, nil, 69, + nil, 41, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 25, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, 336, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, 838, nil, 331, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 334, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, 337, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, 336, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, 331, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 334, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, 337, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, 461, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, 336, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, 838, nil, 331, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 334, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, 337, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 589, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 24, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 25, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 257, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 36, 37, 80, + 81, nil, nil, nil, nil, nil, 92, 34, 33, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 364, 365, 80, 81, nil, nil, nil, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 257, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 257, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 36, 37, 80, 81, nil, nil, + nil, nil, nil, 92, 34, 33, 122, 121, 123, 124, + nil, nil, 24, nil, nil, nil, nil, nil, nil, 54, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, 50, 51, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 252, nil, nil, 260, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, 53, nil, nil, nil, + nil, nil, nil, nil, 25, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 47, 48, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 54, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, 50, 51, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 252, nil, nil, 260, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, 53, + nil, nil, nil, nil, nil, nil, nil, 257, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 47, 48, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, nil, 85, 86, 88, + 36, 37, 80, 81, nil, nil, nil, nil, nil, 92, + 34, 33, 122, 121, 123, 124, nil, nil, 24, nil, + nil, nil, nil, nil, nil, 54, nil, nil, 126, 125, + 127, 116, 65, 118, 117, 119, nil, 120, 128, 129, + nil, 112, 113, nil, 50, 51, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 252, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, 53, nil, nil, nil, nil, nil, nil, nil, + 25, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 47, 48, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 54, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, 50, 51, 49, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 252, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, 1145, nil, nil, nil, 53, nil, nil, nil, nil, + nil, nil, nil, 257, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, nil, nil, 47, 48, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 54, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, 336, 120, 128, 129, nil, 112, 113, nil, + 50, 51, 49, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 252, nil, nil, 260, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, 331, nil, 53, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, nil, + nil, 109, 334, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 337, 97, 104, 106, nil, 114, 115, nil, nil, 47, + 48, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 54, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, 50, 51, 49, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 252, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, nil, nil, nil, 257, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 47, 48, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 54, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, 50, 51, 49, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 252, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 47, 48, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 36, 37, 80, 81, nil, + nil, nil, nil, nil, 92, 34, 33, 122, 121, 123, + 124, nil, nil, 24, nil, nil, nil, nil, nil, nil, + 54, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, 50, + 51, 49, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 252, nil, nil, 260, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, 53, nil, nil, + nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 47, 48, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 36, 37, + 80, 81, nil, nil, nil, nil, nil, 92, 34, 33, + 122, 121, 123, 124, nil, nil, 24, nil, nil, nil, + nil, nil, nil, 54, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, 50, 51, 49, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 252, nil, nil, 260, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, 25, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, nil, + nil, 47, 48, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 36, 37, 80, 81, nil, nil, nil, nil, nil, + 92, 34, 33, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 54, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, 336, 120, 128, + 129, nil, 112, 113, nil, 50, 51, 49, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 252, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, 333, + nil, 331, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 257, nil, nil, nil, nil, 109, 334, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, 337, 97, 104, 106, nil, + 114, 115, nil, nil, 47, 48, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 360, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, nil, nil, + 368, nil, nil, nil, nil, nil, 517, nil, 514, 513, + 512, 522, 515, nil, nil, nil, nil, nil, nil, nil, + 356, nil, 525, 352, nil, nil, 67, 68, nil, nil, + 69, nil, 351, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 520, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, 533, 532, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, 526, + 85, 86, 88, 364, 365, 80, 81, nil, nil, 511, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 360, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, nil, nil, 368, + nil, nil, nil, nil, nil, 517, nil, 514, 513, 512, + 522, 515, nil, nil, nil, nil, nil, nil, nil, 356, + nil, 525, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 520, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, 533, 532, nil, 100, 110, nil, + nil, nil, 370, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, 526, 85, + 86, 88, 364, 365, 80, 81, nil, nil, 511, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 360, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, nil, nil, 368, nil, + nil, nil, nil, nil, 517, nil, 514, 513, 512, 522, + 515, nil, nil, nil, nil, nil, nil, nil, 403, nil, + 525, 39, nil, nil, 67, 68, nil, nil, 69, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 520, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, 533, 532, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, 526, 85, 86, + 88, 364, 365, 80, 81, nil, nil, 511, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 360, nil, nil, 126, + 125, 127, 408, 65, 118, 117, 409, nil, 120, 128, + 129, nil, 112, 113, nil, nil, nil, 368, nil, nil, + nil, nil, nil, 517, nil, 514, 513, 512, 522, 515, + nil, nil, nil, nil, 415, nil, nil, 410, nil, 525, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 520, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, 533, 532, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, 89, 90, 91, nil, 82, nil, nil, nil, + 83, 84, nil, nil, nil, 87, 526, 85, 86, 88, + 364, 365, 80, 81, nil, nil, 511, nil, nil, 92, + 359, 367, 122, 121, 123, 124, nil, nil, 261, nil, + nil, nil, nil, nil, nil, 360, nil, nil, 126, 125, + 127, 408, 65, 118, 117, 409, nil, 120, 128, 129, + nil, 112, 113, nil, nil, nil, 368, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 410, nil, nil, 260, + nil, nil, 67, 68, nil, nil, 69, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, 89, 90, 91, nil, 82, nil, nil, nil, 83, + 84, nil, nil, nil, 87, nil, 85, 86, 88, 364, + 365, 80, 81, nil, nil, nil, nil, nil, 92, 359, + 367, 122, 121, 123, 124, nil, nil, 261, nil, nil, + nil, nil, nil, nil, 360, nil, nil, 126, 125, 127, + 116, 65, 118, 117, 119, nil, 120, 128, 129, nil, + 112, 113, nil, nil, nil, 368, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 356, nil, nil, 260, nil, + nil, 67, 68, nil, nil, 69, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, 618, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + 89, 90, 91, nil, 82, nil, nil, nil, 83, 84, + nil, nil, nil, 87, nil, 85, 86, 88, 364, 365, + 80, 81, nil, nil, nil, nil, nil, 92, 359, 367, + 122, 121, 123, 124, nil, nil, 261, nil, nil, nil, + nil, nil, nil, 360, nil, nil, 126, 125, 127, 116, + 65, 118, 117, 119, nil, 120, 128, 129, nil, 112, + 113, nil, nil, nil, 368, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 356, nil, nil, 352, nil, nil, + 67, 68, nil, nil, 69, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 109, 99, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, nil, 97, 104, 106, nil, 114, 115, 89, + 90, 91, nil, 82, nil, nil, nil, 83, 84, nil, + nil, nil, 87, nil, 85, 86, 88, 364, 365, 80, + 81, nil, nil, nil, nil, nil, 92, 359, 367, 122, + 121, 123, 124, nil, nil, 261, nil, nil, nil, nil, + nil, nil, 360, nil, nil, 126, 125, 127, 116, 65, + 118, 117, 119, nil, 120, 128, 129, nil, 112, 113, + nil, nil, nil, 368, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 356, nil, nil, 352, nil, nil, 67, + 68, nil, nil, 69, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, 89, 90, + 91, nil, 82, nil, nil, nil, 83, 84, nil, nil, + nil, 87, nil, 85, 86, 88, 364, 365, 80, 81, + nil, nil, nil, nil, nil, 92, 359, 367, 122, 121, + 123, 124, nil, nil, 261, nil, nil, nil, nil, nil, + nil, 360, nil, nil, 126, 125, 127, 116, 65, 118, + 117, 119, nil, 120, 128, 129, nil, 112, 113, nil, + nil, nil, 368, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 356, nil, nil, 352, nil, nil, 67, 68, + nil, nil, 69, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 109, 99, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + nil, 97, 104, 106, nil, 114, 115, 89, 90, 91, + nil, 82, nil, nil, nil, 83, 84, nil, nil, nil, + 87, nil, 85, 86, 88, 364, 365, 80, 81, nil, + nil, nil, nil, nil, 92, 359, 367, 122, 121, 123, + 124, nil, nil, 261, nil, nil, nil, nil, nil, nil, + 360, nil, nil, 126, 125, 127, 116, 65, 118, 117, + 119, nil, 120, 128, 129, nil, 112, 113, nil, nil, + nil, 368, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 356, nil, nil, 352, nil, nil, 67, 68, nil, + nil, 69, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, 89, 90, 91, nil, + 82, nil, nil, nil, 83, 84, nil, nil, nil, 87, + nil, 85, 86, 88, 364, 365, 80, 81, nil, nil, + nil, nil, nil, 92, 359, 367, 122, 121, 123, 124, + nil, nil, 261, nil, nil, nil, nil, nil, nil, 360, + nil, nil, 126, 125, 127, 116, 65, 118, 117, 119, + nil, 120, 128, 129, nil, 112, 113, nil, nil, nil, + 368, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 356, nil, nil, 352, nil, nil, 67, 68, nil, nil, + 69, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, 89, 90, 91, nil, 82, + nil, nil, nil, 83, 84, nil, nil, nil, 87, nil, + 85, 86, 88, 364, 365, 80, 81, nil, nil, nil, + nil, nil, 92, 359, 367, 122, 121, 123, 124, nil, + nil, 261, nil, nil, nil, nil, nil, nil, 360, nil, + nil, 126, 125, 127, 116, 65, 118, 117, 119, nil, + 120, 128, 129, nil, 112, 113, nil, nil, nil, 368, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1161, + nil, nil, 260, nil, nil, 67, 68, nil, nil, 69, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 109, 99, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, nil, 97, 104, + 106, nil, 114, 115, 89, 90, 91, nil, 82, nil, + nil, nil, 83, 84, nil, nil, nil, 87, nil, 85, + 86, 88, 364, 365, 80, 81, nil, nil, nil, nil, + nil, 92, 359, 367, 122, 121, 123, 124, nil, nil, + 261, nil, nil, nil, nil, nil, nil, 360, nil, nil, + 126, 125, 127, 116, 65, 118, 117, 119, nil, 120, + 128, 129, nil, 112, 113, nil, nil, nil, 368, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1199, nil, + nil, 260, nil, nil, 67, 68, nil, nil, 69, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, 89, 90, 91, nil, 82, nil, nil, + nil, 83, 84, nil, nil, nil, 87, nil, 85, 86, + 88, 364, 365, 80, 81, nil, nil, nil, nil, nil, + 92, 359, 367, 122, 121, 123, 124, nil, nil, 261, + nil, nil, nil, nil, nil, nil, 360, nil, nil, 126, + 125, 127, 116, 65, 118, 117, 119, nil, 120, 128, + 129, nil, 112, 113, nil, nil, nil, 368, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1199, nil, nil, + 260, nil, nil, 67, 68, nil, nil, 69, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, 192, 203, 193, 216, 189, 209, 199, 198, + 219, 220, 214, 197, 196, 191, 217, 221, 222, 201, + 190, 204, 208, 210, 202, 195, nil, nil, nil, 211, + 218, 213, 212, 205, 215, 200, 188, 207, 206, nil, + nil, nil, nil, nil, 187, 194, 185, 186, 182, 183, + 184, 145, 147, 144, nil, 146, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, nil, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, 109, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 110, nil, nil, nil, nil, + nil, nil, nil, nil, 174, 192, 203, 193, 216, 189, + 209, 199, 198, 219, 220, 214, 197, 196, 191, 217, + 221, 222, 201, 190, 204, 208, 210, 202, 195, nil, + nil, nil, 211, 218, 213, 212, 205, 215, 200, 188, + 207, 206, nil, nil, nil, nil, nil, 187, 194, 185, + 186, 182, 183, 184, 145, 147, nil, nil, 146, nil, + nil, nil, nil, nil, nil, nil, nil, 177, 178, nil, + 173, 155, 156, 157, 164, 161, 163, nil, nil, 158, + 159, nil, nil, nil, 179, 180, 165, 166, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 170, 169, nil, 154, 176, 172, 171, 167, 168, + 162, 160, 152, 175, 153, nil, nil, 181, 109, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 110, nil, + nil, nil, nil, nil, nil, nil, nil, 174, 192, 203, + 193, 216, 189, 209, 199, 198, 219, 220, 214, 197, + 196, 191, 217, 221, 222, 201, 190, 204, 208, 210, + 202, 195, nil, nil, nil, 211, 218, 213, 301, 300, + 302, 299, 188, 207, 206, nil, nil, nil, nil, nil, + 187, 194, 185, 186, 296, 297, 298, 294, 147, 118, + 117, 295, nil, 120, nil, nil, nil, nil, nil, nil, + 177, 178, nil, 173, 155, 156, 157, 164, 161, 163, + nil, nil, 158, 159, nil, nil, nil, 179, 180, 165, + 166, nil, nil, nil, nil, nil, 306, nil, nil, nil, + nil, nil, nil, nil, 170, 169, nil, 154, 176, 172, + 171, 167, 168, 162, 160, 152, 175, 153, nil, nil, + 181, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 174, 192, 203, 193, 216, 189, 209, 199, 198, 219, + 220, 214, 197, 196, 191, 217, 221, 222, 201, 190, + 204, 208, 210, 202, 195, nil, nil, nil, 211, 218, + 213, 212, 205, 215, 200, 188, 207, 206, nil, nil, + nil, nil, nil, 187, 194, 185, 186, 182, 183, 184, + 145, 147, 441, 440, 146, nil, 442, nil, nil, nil, + nil, nil, nil, 177, 178, nil, 173, 155, 156, 157, + 164, 161, 163, nil, nil, 158, 159, nil, nil, nil, + 179, 180, 165, 166, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 170, 169, nil, + 154, 176, 172, 171, 167, 168, 162, 160, 152, 175, + 153, nil, nil, 181, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 174, 192, 203, 193, 216, 189, 209, + 199, 198, 219, 220, 214, 197, 196, 191, 217, 221, + 222, 201, 190, 204, 208, 210, 202, 195, nil, nil, + nil, 211, 218, 213, 212, 205, 215, 200, 188, 207, + 206, nil, nil, nil, nil, nil, 187, 194, 185, 186, + 182, 183, 184, 145, 147, nil, nil, 146, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, nil, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, nil, 181, 109, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 110, nil, nil, + nil, nil, nil, nil, nil, nil, 174, 192, 203, 193, + 216, 189, 209, 199, 198, 219, 220, 214, 197, 196, + 191, 217, 221, 222, 201, 190, 204, 208, 210, 202, + 195, nil, nil, nil, 211, 218, 213, 212, 205, 215, + 200, 188, 207, 206, nil, nil, nil, nil, nil, 187, + 194, 185, 186, 182, 183, 184, 145, 147, nil, nil, + 146, nil, nil, nil, nil, nil, nil, nil, nil, 177, + 178, nil, 173, 155, 156, 157, 164, 161, 163, nil, + nil, 158, 159, nil, nil, nil, 179, 180, 165, 166, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 170, 169, nil, 154, 176, 172, 171, + 167, 168, 162, 160, 152, 175, 153, nil, nil, 181, + 109, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 110, nil, nil, nil, nil, nil, nil, nil, nil, 174, + 192, 203, 193, 216, 189, 209, 199, 198, 219, 220, + 214, 197, 196, 191, 217, 221, 222, 201, 190, 204, + 208, 210, 202, 195, nil, nil, nil, 211, 218, 213, + 212, 205, 215, 200, 188, 207, 206, nil, nil, nil, + nil, nil, 187, 194, 185, 186, 182, 183, 184, 145, + 147, nil, nil, 146, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, nil, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, nil, nil, nil, nil, 122, 121, 123, + 124, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 174, 126, 125, 127, 815, nil, nil, nil, + 818, 795, nil, nil, nil, nil, 112, 113, nil, nil, + nil, 368, 525, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 817, nil, nil, 788, nil, nil, nil, 786, nil, + nil, 787, nil, 790, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 816, nil, nil, nil, + 109, 796, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, 526, + 97, 104, 106, nil, 114, 115, nil, nil, 803, 804, + 122, 121, 123, 124, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 126, 125, 127, 815, + nil, nil, nil, 818, 795, nil, nil, nil, nil, 112, + 113, nil, nil, nil, 368, 525, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 817, nil, nil, 788, nil, nil, + nil, 786, nil, nil, 787, nil, 790, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 816, + nil, nil, nil, 109, 796, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 526, 97, 104, 106, nil, 114, 115, nil, + nil, 803, 804, 122, 121, 123, 124, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 126, + 125, 127, 815, nil, nil, nil, 818, nil, nil, nil, + nil, nil, 112, 113, nil, nil, nil, 368, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 817, nil, nil, + 788, nil, nil, nil, 786, nil, nil, 787, nil, 790, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 816, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, 247, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 803, 804, 122, 121, 123, 124, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 126, 125, 127, 815, nil, nil, nil, 818, + nil, nil, nil, nil, nil, 112, 113, nil, nil, nil, + 368, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 817, nil, nil, 788, nil, nil, nil, 786, nil, nil, + 787, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 816, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 803, 804, 122, + 121, 123, 124, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 126, 125, 127, 815, nil, + nil, nil, 818, nil, nil, nil, nil, nil, 112, 113, + nil, nil, nil, 368, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 817, nil, nil, 788, nil, nil, nil, + 786, nil, nil, 787, nil, 790, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 816, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 803, 804, 122, 121, 123, 124, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 126, 125, + 127, 815, nil, nil, nil, 818, nil, nil, nil, nil, + nil, 112, 113, nil, nil, nil, 368, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 817, nil, nil, 788, + nil, nil, nil, 786, nil, nil, 787, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 816, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 803, 804, 122, 121, 123, 124, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 126, 125, 127, 815, nil, nil, nil, 818, 795, + nil, nil, nil, nil, 112, 113, nil, nil, nil, 368, + 525, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 817, + nil, nil, 788, nil, nil, nil, 786, nil, nil, 787, + nil, 790, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 816, nil, nil, nil, 109, 796, + 101, 102, 103, 105, nil, nil, nil, 100, 110, nil, + nil, nil, nil, nil, nil, 93, nil, 526, 97, 104, + 106, nil, 114, 115, nil, nil, 803, 804, 122, 121, + 123, 124, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 126, 125, 127, 815, nil, nil, + nil, 818, 795, nil, nil, nil, nil, 112, 113, nil, + nil, nil, 368, 525, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 817, nil, nil, 788, nil, nil, nil, 786, + nil, nil, 787, nil, 790, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 816, nil, nil, + nil, 109, 796, 101, 102, 103, 105, nil, nil, nil, + 100, 110, nil, nil, nil, nil, nil, nil, 93, nil, + 526, 97, 104, 106, nil, 114, 115, nil, nil, 803, + 804, 122, 121, 123, 124, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 126, 125, 127, + 815, nil, nil, nil, 818, nil, nil, nil, nil, nil, + 112, 113, nil, nil, nil, 368, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 817, nil, nil, 788, nil, + nil, nil, 786, nil, nil, 787, nil, 790, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 816, nil, nil, nil, 109, 99, 101, 102, 103, 105, + nil, nil, nil, 100, 110, nil, nil, nil, nil, nil, + nil, 93, nil, nil, 97, 104, 106, nil, 114, 115, + nil, nil, 803, 804, 122, 121, 123, 124, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 126, 125, 127, 815, nil, nil, nil, 818, nil, nil, + nil, nil, nil, 112, 113, nil, nil, nil, 368, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 817, nil, + nil, 788, nil, nil, nil, 786, nil, nil, 787, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 816, nil, nil, nil, 109, 99, 101, + 102, 103, 105, nil, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, nil, 803, 804, 122, 121, 123, + 124, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 126, 125, 127, 815, nil, nil, nil, + 818, nil, nil, nil, nil, nil, 112, 113, nil, nil, + nil, 368, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 817, nil, nil, 788, nil, nil, nil, 786, nil, + nil, 787, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 816, nil, nil, nil, + 109, 99, 101, 102, 103, 105, nil, nil, nil, 100, + 110, nil, nil, nil, nil, nil, nil, 93, nil, nil, + 97, 104, 106, nil, 114, 115, nil, nil, 803, 804, + 122, 121, 123, 124, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 126, 125, 127, 815, + nil, nil, nil, 818, 795, nil, nil, nil, nil, 112, + 113, nil, nil, nil, 368, 525, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 817, nil, nil, 788, nil, nil, + nil, 786, nil, nil, 787, nil, 790, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 816, + nil, nil, nil, 109, 796, 101, 102, 103, 105, nil, + nil, nil, 100, 110, nil, nil, nil, nil, nil, nil, + 93, nil, 526, 97, 104, 106, nil, 114, 115, nil, + nil, 803, 804, 122, 121, 123, 124, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 126, + 125, 127, 815, nil, nil, nil, 818, nil, nil, nil, + nil, nil, 112, 113, nil, nil, nil, 368, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 817, nil, nil, + 788, nil, nil, nil, 786, nil, nil, 787, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 816, nil, nil, nil, 109, 99, 101, 102, + 103, 105, nil, nil, nil, 100, 110, nil, nil, nil, + nil, nil, nil, 93, nil, nil, 97, 104, 106, nil, + 114, 115, nil, nil, 803, 804, 122, 121, 123, 124, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 126, 125, 127, 815, nil, nil, nil, 818, + nil, nil, nil, nil, nil, 112, 113, nil, nil, nil, + 368, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 817, nil, nil, 788, nil, nil, nil, 786, nil, nil, + 787, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 816, nil, nil, nil, 109, + 99, 101, 102, 103, 105, nil, nil, nil, 100, 110, + nil, nil, nil, nil, nil, nil, 93, nil, nil, 97, + 104, 106, nil, 114, 115, nil, nil, 803, 804, 122, + 121, 123, 124, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 126, 125, 127, 815, nil, + nil, nil, 818, nil, nil, nil, nil, nil, 112, 113, + nil, nil, nil, 368, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 817, nil, nil, 788, nil, nil, nil, + 786, nil, nil, 787, nil, 790, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 816, nil, + nil, nil, 109, 99, 101, 102, 103, 105, nil, nil, + nil, 100, 110, nil, nil, nil, nil, nil, nil, 93, + nil, nil, 97, 104, 106, nil, 114, 115, nil, nil, + 803, 804, 122, 121, 123, 124, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 126, 125, + 127, 815, nil, nil, nil, 818, nil, nil, nil, nil, + nil, 112, 113, nil, nil, nil, 368, nil, nil, nil, + nil, nil, nil, nil, 122, 121, 123, 124, nil, nil, + nil, nil, nil, nil, nil, nil, 817, nil, nil, 788, + 126, 125, 127, 786, nil, nil, 787, nil, nil, nil, + nil, nil, nil, 112, 113, nil, nil, nil, 368, nil, + nil, 816, nil, nil, nil, 109, 99, 101, 102, 103, + 105, nil, nil, nil, 100, 110, nil, nil, nil, nil, + nil, nil, 93, nil, nil, 97, 104, 106, nil, 114, + 115, nil, nil, 803, 804, nil, nil, 517, nil, 514, + 513, 512, 522, 515, nil, nil, nil, 109, 99, 101, + 102, 103, 105, 525, nil, nil, 100, 110, nil, nil, + nil, nil, nil, nil, 93, nil, nil, 97, 104, 106, + nil, 114, 115, nil, 517, 520, 514, 513, 512, 522, + 515, nil, nil, nil, 530, 529, 533, 532, nil, 517, + 525, 514, 513, 512, 522, 515, nil, 517, nil, 514, + 513, 512, 522, 515, nil, 525, nil, nil, nil, nil, + nil, nil, 520, 525, nil, nil, nil, nil, nil, nil, + 526, 530, 529, 533, 532, nil, nil, 520, 679, nil, + 511, nil, nil, nil, nil, 520, 530, 529, 533, 532, + nil, nil, nil, nil, 530, 529, 533, 532, 517, nil, + 514, 513, 512, 522, 515, nil, nil, 526, nil, nil, + nil, nil, nil, nil, 525, nil, nil, 511, nil, nil, + nil, 517, 526, 514, 513, 512, 522, 515, nil, nil, + 526, nil, 511, nil, nil, nil, 520, 525, nil, nil, + 511, nil, nil, nil, nil, 530, 529, 533, 532, 517, + nil, 514, 513, 512, 522, 515, nil, nil, nil, 520, + nil, nil, nil, nil, nil, 525, nil, nil, 530, 529, + 533, 532, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 526, nil, nil, nil, nil, nil, 520, nil, nil, + nil, 511, nil, nil, nil, nil, 530, 529, 533, 532, + nil, nil, nil, nil, 526, 484, 488, nil, nil, 485, + nil, nil, nil, nil, 511, nil, nil, nil, 177, 178, + nil, 173, 155, 156, 157, 164, 161, 163, nil, nil, + 158, 159, 526, nil, nil, 179, 180, 165, 166, nil, + nil, nil, 511, nil, 314, nil, nil, nil, nil, nil, + nil, nil, 170, 169, nil, 154, 176, 172, 171, 167, + 168, 162, 160, 152, 175, 153, nil, nil, 181, nil, + nil, nil, nil, 491, 495, nil, nil, 490, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, 174, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, 314, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, nil, 181, nil, nil, nil, + nil, 585, 488, nil, nil, 586, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, 174, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, nil, nil, nil, nil, 768, + 488, nil, nil, 769, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, 174, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, 314, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, nil, nil, nil, nil, 770, 495, nil, + nil, 771, nil, nil, nil, nil, nil, nil, nil, nil, + 177, 178, 174, 173, 155, 156, 157, 164, 161, 163, + nil, nil, 158, 159, nil, nil, nil, 179, 180, 165, + 166, nil, nil, nil, nil, nil, 314, nil, nil, nil, + nil, nil, nil, nil, 170, 169, nil, 154, 176, 172, + 171, 167, 168, 162, 160, 152, 175, 153, nil, nil, + 181, nil, nil, nil, nil, 849, 488, nil, nil, 850, + nil, nil, nil, nil, nil, nil, nil, nil, 177, 178, + 174, 173, 155, 156, 157, 164, 161, 163, nil, nil, + 158, 159, nil, nil, nil, 179, 180, 165, 166, nil, + nil, nil, nil, nil, 314, nil, nil, nil, nil, nil, + nil, nil, 170, 169, nil, 154, 176, 172, 171, 167, + 168, 162, 160, 152, 175, 153, nil, nil, 181, nil, + nil, nil, nil, 852, 495, nil, nil, 853, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, 174, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, 314, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, nil, 181, nil, nil, nil, + nil, 768, 488, nil, nil, 769, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, 174, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + 314, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, nil, nil, nil, nil, 770, + 495, nil, nil, 771, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, 174, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, 314, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, nil, nil, nil, nil, 882, 488, nil, + nil, 883, nil, nil, nil, nil, nil, nil, nil, nil, + 177, 178, 174, 173, 155, 156, 157, 164, 161, 163, + nil, nil, 158, 159, nil, nil, nil, 179, 180, 165, + 166, nil, nil, nil, nil, nil, 314, nil, nil, nil, + nil, nil, nil, nil, 170, 169, nil, 154, 176, 172, + 171, 167, 168, 162, 160, 152, 175, 153, nil, nil, + 181, nil, nil, nil, nil, 884, 495, nil, nil, 885, + nil, nil, nil, nil, nil, nil, nil, nil, 177, 178, + 174, 173, 155, 156, 157, 164, 161, 163, nil, nil, + 158, 159, nil, nil, nil, 179, 180, 165, 166, nil, + nil, nil, nil, nil, 314, nil, nil, nil, nil, nil, + nil, nil, 170, 169, nil, 154, 176, 172, 171, 167, + 168, 162, 160, 152, 175, 153, nil, nil, 181, nil, + nil, nil, nil, 887, 495, nil, nil, 888, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, 174, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, 314, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, nil, 181, nil, nil, nil, + nil, 585, 488, nil, nil, 586, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, 174, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + 314, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, nil, nil, nil, nil, 910, + 488, nil, nil, 911, nil, nil, nil, nil, nil, nil, + nil, nil, 177, 178, 174, 173, 155, 156, 157, 164, + 161, 163, nil, nil, 158, 159, nil, nil, nil, 179, + 180, 165, 166, nil, nil, nil, nil, nil, 314, nil, + nil, nil, nil, nil, nil, nil, 170, 169, nil, 154, + 176, 172, 171, 167, 168, 162, 160, 152, 175, 153, + nil, nil, 181, nil, nil, nil, nil, 913, 495, nil, + nil, 912, nil, nil, nil, nil, nil, nil, nil, nil, + 177, 178, 174, 173, 155, 156, 157, 164, 161, 163, + nil, nil, 158, 159, nil, nil, nil, 179, 180, 165, + 166, nil, nil, nil, nil, nil, 314, nil, nil, nil, + nil, nil, nil, nil, 170, 169, nil, 154, 176, 172, + 171, 167, 168, 162, 160, 152, 175, 153, nil, nil, + 181, nil, nil, nil, nil, 1254, 488, nil, nil, 1255, + nil, nil, nil, nil, nil, nil, nil, nil, 177, 178, + 174, 173, 155, 156, 157, 164, 161, 163, nil, nil, + 158, 159, nil, nil, nil, 179, 180, 165, 166, nil, + nil, nil, nil, nil, 314, nil, nil, nil, nil, nil, + nil, nil, 170, 169, nil, 154, 176, 172, 171, 167, + 168, 162, 160, 152, 175, 153, nil, nil, 181, nil, + nil, nil, nil, 1256, 495, nil, nil, 1257, nil, nil, + nil, nil, nil, nil, nil, nil, 177, 178, 174, 173, + 155, 156, 157, 164, 161, 163, nil, nil, 158, 159, + nil, nil, nil, 179, 180, 165, 166, nil, nil, nil, + nil, nil, 314, nil, nil, nil, nil, nil, nil, nil, + 170, 169, nil, 154, 176, 172, 171, 167, 168, 162, + 160, 152, 175, 153, nil, nil, 181, nil, nil, nil, + nil, 1271, 495, nil, nil, 1270, nil, nil, nil, nil, + nil, nil, nil, nil, 177, 178, 174, 173, 155, 156, + 157, 164, 161, 163, nil, nil, 158, 159, nil, nil, + nil, 179, 180, 165, 166, nil, nil, nil, nil, nil, + 314, nil, nil, nil, nil, nil, nil, nil, 170, 169, + nil, 154, 176, 172, 171, 167, 168, 162, 160, 152, + 175, 153, nil, nil, 181, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 174 ] + +racc_action_check = [ + 116, 432, 435, 70, 392, 400, 826, 116, 116, 116, + 541, 541, 116, 116, 116, 849, 116, 401, 776, 850, + 393, 1069, 822, 822, 116, 24, 116, 116, 116, 859, + 859, 787, 386, 527, 797, 386, 116, 116, 30, 116, + 116, 116, 116, 116, 787, 30, 1273, 1139, 404, 852, + 665, 527, 797, 882, 883, 1142, 1273, 975, 20, 776, + 1, 24, 895, 1024, 432, 435, 250, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 880, 849, 116, 116, 116, 850, 116, 116, 655, + 70, 116, 1042, 826, 116, 116, 3, 116, 975, 116, + 541, 116, 30, 116, 116, 116, 116, 116, 116, 116, + 400, 116, 822, 116, 20, 852, 852, 849, 392, 859, + 849, 850, 401, 392, 850, 250, 116, 116, 116, 116, + 1024, 116, 1158, 116, 393, 1069, 119, 849, 116, 393, + 1069, 850, 116, 119, 119, 119, 116, 1159, 119, 119, + 119, 852, 119, 404, 852, 665, 1162, 1221, 882, 883, + 119, 1139, 119, 119, 119, 1024, 1139, 895, 1024, 1142, + 1254, 852, 119, 119, 1142, 119, 119, 119, 119, 119, + 1255, 1256, 21, 1275, 13, 1024, 884, 885, 824, 655, + 32, 251, 1018, 15, 655, 880, 423, 1042, 880, 423, + 880, 253, 16, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 96, 361, 119, + 119, 119, 824, 119, 119, 96, 1018, 119, 49, 49, + 119, 119, 410, 119, 468, 119, 410, 119, 21, 119, + 119, 119, 119, 119, 119, 119, 1158, 119, 1257, 119, + 251, 1158, 884, 885, 18, 32, 606, 423, 423, 1256, + 253, 1159, 119, 119, 119, 119, 1159, 119, 692, 119, + 1162, 1221, 490, 990, 119, 1162, 1221, 32, 119, 490, + 490, 490, 119, 361, 1254, 490, 490, 844, 490, 1254, + 971, 884, 885, 468, 1255, 1256, 490, 1275, 387, 1255, + 1256, 387, 1275, 1180, 844, 361, 49, 49, 490, 490, + 547, 490, 490, 490, 490, 490, 258, 606, 606, 606, + 5, 971, 982, 28, 658, 5, 1257, 368, 368, 692, + 692, 259, 658, 982, 990, 990, 990, 606, 692, 490, + 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, + 490, 490, 490, 43, 990, 490, 490, 490, 695, 490, + 490, 46, 1257, 490, 1180, 1180, 490, 1257, 768, 547, + 22, 490, 258, 490, 54, 490, 490, 490, 490, 490, + 490, 490, 982, 490, 1180, 490, 738, 259, 1010, 103, + 1010, 1010, 1010, 1010, 1010, 19, 988, 738, 490, 490, + 982, 490, 19, 490, 1010, 368, 368, 988, 491, 104, + 490, 19, 22, 769, 490, 491, 491, 491, 490, 695, + 695, 491, 491, 1184, 491, 105, 1010, 768, 695, 22, + 738, 738, 491, 491, 1184, 1010, 1010, 1010, 1010, 55, + 1146, 106, 1146, 419, 491, 491, 55, 491, 491, 491, + 491, 491, 144, 142, 249, 55, 988, 144, 144, 19, + 785, 249, 421, 1010, 738, 785, 293, 1184, 1184, 785, + 249, 1010, 769, 293, 988, 491, 491, 491, 491, 491, + 491, 491, 491, 491, 491, 491, 491, 491, 491, 910, + 294, 491, 491, 491, 817, 491, 491, 294, 817, 491, + 426, 1184, 491, 55, 419, 419, 419, 491, 911, 491, + 223, 491, 491, 491, 491, 491, 491, 491, 249, 491, + 491, 491, 340, 421, 421, 421, 1187, 340, 1187, 1187, + 1187, 1187, 1187, 353, 491, 491, 44, 491, 397, 491, + 353, 429, 1187, 397, 770, 437, 491, 236, 910, 353, + 491, 770, 770, 770, 491, 238, 770, 770, 770, 732, + 770, 426, 426, 426, 1187, 732, 966, 911, 770, 770, + 770, 770, 770, 1187, 1187, 1187, 1187, 1061, 44, 242, + 770, 770, 354, 770, 770, 770, 770, 770, 535, 354, + 252, 893, 295, 535, 355, 44, 893, 353, 354, 295, + 45, 355, 429, 429, 429, 254, 437, 437, 437, 1187, + 355, 770, 770, 770, 770, 770, 770, 770, 770, 770, + 770, 770, 770, 770, 770, 966, 296, 770, 770, 770, + 297, 770, 770, 296, 255, 770, 1061, 297, 770, 770, + 974, 770, 45, 770, 974, 770, 354, 770, 770, 770, + 770, 770, 770, 770, 298, 770, 770, 770, 355, 45, + 649, 298, 1191, 649, 1191, 1191, 1191, 1191, 1191, 357, + 770, 770, 770, 770, 299, 770, 357, 770, 1191, 261, + 771, 299, 770, 313, 372, 357, 770, 771, 771, 771, + 770, 328, 771, 771, 771, 300, 771, 329, 373, 332, + 1191, 346, 300, 348, 771, 373, 771, 771, 771, 1191, + 1191, 1191, 1191, 349, 373, 350, 771, 771, 402, 771, + 771, 771, 771, 771, 1046, 402, 372, 356, 412, 1046, + 467, 484, 301, 357, 402, 412, 485, 467, 717, 301, + 17, 17, 359, 372, 412, 1191, 467, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 360, 373, 771, 771, 771, 362, 771, 771, 52, + 52, 771, 363, 484, 771, 771, 367, 771, 485, 771, + 717, 771, 402, 771, 771, 771, 771, 771, 771, 771, + 484, 771, 412, 771, 467, 485, 1193, 717, 1193, 1193, + 1193, 1193, 1193, 623, 52, 52, 771, 771, 771, 771, + 623, 771, 1193, 771, 302, 369, 912, 862, 771, 623, + 862, 302, 771, 912, 912, 912, 771, 376, 1111, 912, + 912, 1111, 912, 1212, 1193, 520, 1212, 520, 520, 520, + 912, 520, 391, 391, 668, 1193, 1193, 676, 676, 741, + 741, 668, 912, 912, 853, 912, 912, 912, 912, 912, + 668, 853, 888, 378, 1160, 384, 853, 623, 388, 888, + 853, 1160, 398, 520, 888, 800, 800, 557, 888, 1193, + 1160, 399, 520, 912, 912, 912, 912, 912, 912, 912, + 912, 912, 912, 912, 912, 912, 912, 866, 866, 912, + 912, 912, 403, 912, 912, 1143, 1143, 912, 668, 557, + 912, 1245, 1245, 557, 557, 912, 405, 912, 853, 912, + 912, 912, 912, 912, 912, 912, 888, 912, 1160, 912, + 414, 425, 1261, 1198, 1261, 1261, 1261, 1261, 1261, 1242, + 1198, 428, 912, 912, 431, 912, 1242, 912, 1261, 1198, + 434, 457, 913, 459, 912, 1242, 460, 462, 912, 913, + 913, 913, 912, 465, 469, 913, 913, 479, 913, 751, + 1261, 751, 751, 751, 482, 751, 913, 913, 483, 1261, + 1261, 1261, 1261, 492, 803, 803, 803, 803, 913, 913, + 498, 913, 913, 913, 913, 913, 499, 1198, 502, 503, + 803, 803, 803, 1242, 504, 507, 816, 751, 816, 816, + 508, 509, 816, 803, 803, 1261, 751, 519, 803, 913, + 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, + 913, 913, 913, 531, 534, 913, 913, 913, 537, 913, + 913, 543, 551, 913, 816, 552, 913, 559, 560, 561, + 562, 913, 582, 913, 590, 913, 913, 913, 913, 913, + 913, 913, 591, 913, 913, 913, 592, 803, 803, 803, + 803, 803, 803, 596, 558, 612, 803, 803, 913, 913, + 613, 913, 614, 913, 803, 617, 619, 803, 803, 803, + 913, 803, 803, 624, 913, 628, 637, 638, 913, 2, + 2, 2, 2, 2, 2, 646, 558, 647, 2, 2, + 558, 558, 408, 2, 409, 2, 2, 2, 2, 2, + 2, 2, 9, 9, 9, 9, 9, 2, 2, 2, + 2, 2, 2, 2, 650, 956, 2, 956, 956, 956, + 652, 956, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 656, 2, 2, 2, 657, 2, + 2, 659, 2, 2, 2, 408, 699, 409, 702, 704, + 709, 722, 408, 956, 409, 728, 730, 408, 748, 409, + 753, 408, 956, 409, 2, 754, 756, 2, 565, 763, + 2, 2, 772, 781, 2, 789, 2, 790, 791, 408, + 2, 409, 820, 825, 565, 565, 897, 897, 2, 831, + 897, 897, 897, 2, 2, 2, 2, 2, 2, 833, + 565, 835, 2, 2, 565, 565, 565, 565, 837, 408, + 2, 409, 846, 2, 2, 2, 848, 2, 2, 851, + 854, 2, 2, 39, 39, 39, 39, 39, 39, 855, + 858, 868, 39, 39, 874, 875, 887, 39, 881, 39, + 39, 39, 39, 39, 39, 39, 344, 344, 344, 344, + 344, 39, 39, 39, 39, 39, 39, 39, 890, 894, + 39, 572, 896, 907, 909, 917, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 936, 39, + 39, 39, 937, 39, 39, 940, 39, 39, 39, 887, + 573, 942, 945, 572, 946, 948, 887, 572, 572, 572, + 572, 887, 949, 951, 955, 887, 968, 970, 39, 976, + 977, 39, 981, 984, 39, 39, 989, 1015, 39, 1016, + 39, 1023, 573, 887, 39, 1028, 573, 573, 573, 573, + 1034, 1043, 39, 1045, 1052, 1053, 1059, 39, 39, 39, + 39, 39, 39, 1060, 1084, 1085, 39, 39, 383, 383, + 383, 383, 383, 887, 39, 1090, 1095, 39, 39, 39, + 1096, 39, 39, 1097, 1098, 39, 39, 225, 225, 225, + 225, 225, 225, 1099, 1100, 1104, 225, 225, 1105, 1106, + 1108, 225, 1112, 225, 225, 225, 225, 225, 225, 225, + 26, 1119, 1121, 1122, 1124, 225, 225, 225, 225, 225, + 225, 225, 1125, 755, 225, 755, 755, 755, 1126, 755, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 1128, 225, 225, 225, 1129, 225, 225, 1130, + 225, 225, 225, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 1151, 26, 26, 1152, 1156, 26, + 26, 1161, 225, 1164, 26, 225, 1165, 1166, 225, 225, + 1167, 1196, 225, 1199, 225, 26, 1209, 26, 225, 26, + 26, 26, 26, 26, 26, 26, 225, 26, 1217, 1227, + 1228, 225, 225, 225, 225, 225, 225, 1229, 1232, 1235, + 225, 225, 1236, 26, 1237, 1238, 1240, 1253, 225, 1258, + 1270, 225, 225, 225, 1271, 225, 225, 1277, 1278, 225, + 225, 237, 237, 237, 237, 237, 237, 1279, 1280, 1289, + 237, 237, nil, nil, nil, 237, nil, 237, 237, 237, + 237, 237, 237, 237, 611, 611, 611, 611, 611, 237, + 237, 237, 237, 237, 237, 237, nil, nil, 237, nil, + nil, nil, nil, 472, 237, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, nil, 237, 237, 237, + nil, 237, 237, nil, 237, 237, 237, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, nil, 472, + 472, nil, nil, 472, 472, nil, 237, nil, nil, 237, + nil, nil, 237, 237, nil, nil, 237, nil, 237, 472, + nil, 472, 237, 472, 472, 472, 472, 472, 472, 472, + 237, 472, nil, nil, nil, 237, 237, 237, 237, 237, + 237, nil, nil, nil, 237, 237, nil, 472, nil, 472, + nil, nil, 237, nil, nil, 237, 237, 237, nil, 237, + 237, nil, nil, 237, 237, 243, 243, 243, 243, 243, + 243, nil, nil, nil, 243, 243, nil, nil, nil, 243, + nil, 243, 243, 243, 243, 243, 243, 243, nil, nil, + nil, nil, nil, 243, 243, 243, 243, 243, 243, 243, + nil, nil, 243, nil, nil, nil, nil, 478, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + nil, 243, 243, 243, nil, 243, 243, nil, 243, 243, + 243, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, nil, 478, 478, nil, nil, 478, 478, nil, + 243, nil, nil, 243, nil, nil, 243, 243, nil, nil, + 243, nil, 243, 478, nil, 478, 243, 478, 478, 478, + 478, 478, 478, 478, 243, 478, nil, nil, nil, 243, + 243, 243, 243, 243, 243, nil, nil, nil, 243, 243, + nil, 478, nil, nil, nil, nil, 243, nil, nil, 243, + 243, 243, nil, 243, 243, nil, nil, 243, 243, 260, + 260, 260, 260, 260, 260, nil, nil, nil, 260, 260, + nil, nil, nil, 260, nil, 260, 260, 260, 260, 260, + 260, 260, nil, nil, nil, nil, nil, 260, 260, 260, + 260, 260, 260, 260, nil, nil, 260, nil, nil, nil, + nil, 731, 260, 260, 260, 260, 260, 260, 260, 260, + 260, 260, 260, 260, nil, 260, 260, 260, nil, 260, + 260, nil, 260, 260, 260, 731, 731, 731, 731, 731, + 731, 731, 731, 731, 731, 731, nil, 731, 731, nil, + nil, 731, 731, nil, 260, nil, nil, 260, nil, nil, + 260, 260, nil, nil, 260, nil, 260, 731, nil, 731, + 260, 731, 731, 731, 731, 731, 731, 731, 260, 731, + nil, nil, nil, 260, 260, 260, 260, 260, 260, nil, + nil, nil, 260, 260, nil, 731, nil, nil, nil, nil, + 260, nil, nil, 260, 260, 260, nil, 260, 260, nil, + nil, 260, 260, 347, 347, 347, 347, 347, 347, nil, + nil, nil, 347, 347, nil, nil, nil, 347, nil, 347, + 347, 347, 347, 347, 347, 347, nil, nil, nil, nil, + nil, 347, 347, 347, 347, 347, 347, 347, nil, nil, + 347, nil, nil, nil, nil, 764, 347, 347, 347, 347, + 347, 347, 347, 347, 347, 347, 347, 347, nil, 347, + 347, 347, nil, 347, 347, nil, 347, 347, 347, 764, + 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, + nil, 764, 764, nil, nil, 764, 764, nil, 347, nil, + nil, 347, nil, nil, 347, 347, nil, nil, 347, nil, + 347, 764, nil, 764, 347, 764, 764, 764, 764, 764, + 764, 764, 347, 764, nil, nil, nil, 347, 347, 347, + 347, 347, 347, nil, nil, nil, 347, 347, nil, 764, + nil, nil, nil, nil, 347, nil, nil, 347, 347, 347, + nil, 347, 347, nil, nil, 347, 347, 352, 352, 352, + 352, 352, 352, nil, nil, nil, 352, 352, nil, nil, + nil, 352, nil, 352, 352, 352, 352, 352, 352, 352, + nil, nil, nil, nil, nil, 352, 352, 352, 352, 352, + 352, 352, nil, 1153, 352, 1153, 1153, 1153, nil, 1153, + 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, nil, 352, 352, 352, nil, 352, 352, nil, + 352, 352, 352, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, nil, 326, 326, nil, nil, 326, + 326, nil, 352, nil, nil, 352, nil, nil, 352, 352, + nil, nil, 352, nil, 352, 326, nil, 326, 352, 326, + 326, 326, 326, 326, 326, 326, 352, 326, nil, nil, + nil, 352, 352, 352, 352, 352, 352, nil, nil, nil, + 352, 352, nil, 326, nil, nil, nil, nil, 352, nil, + nil, 352, 352, 352, nil, 352, 352, nil, nil, 352, + 352, 382, 382, 382, 382, 382, 382, nil, nil, nil, + 382, 382, nil, nil, nil, 382, nil, 382, 382, 382, + 382, 382, 382, 382, nil, nil, nil, nil, nil, 382, + 382, 382, 382, 382, 382, 382, nil, 1251, 382, 1251, + 1251, 1251, nil, 1251, 382, 382, 382, 382, 382, 382, + 382, 382, 382, 382, 382, 382, nil, 382, 382, 382, + nil, 382, 382, nil, 382, 382, 382, 576, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, nil, 576, + 576, nil, nil, 576, 576, nil, 382, nil, nil, 382, + nil, nil, 382, 382, nil, nil, 382, nil, 382, 576, + nil, 576, 382, 576, 576, 576, 576, 576, 576, 576, + 382, 576, nil, nil, nil, 382, 382, 382, 382, 382, + 382, nil, nil, nil, 382, 382, 576, 576, nil, nil, + nil, nil, 382, nil, nil, 382, 382, 382, nil, 382, + 382, nil, nil, 382, 382, 395, 395, 395, 395, 395, + 395, nil, nil, nil, 395, 395, nil, nil, nil, 395, + nil, 395, 395, 395, 395, 395, 395, 395, nil, nil, + nil, nil, nil, 395, 395, 395, 395, 395, 395, 395, + nil, nil, 395, nil, nil, nil, nil, nil, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + nil, 395, 395, 395, nil, 395, 395, nil, 395, 395, + 395, 635, 635, 635, 635, 635, 635, 635, 635, 635, + 635, 635, nil, 635, 635, nil, nil, 635, 635, nil, + 395, nil, nil, 395, nil, nil, 395, 395, nil, nil, + 395, nil, 395, 635, nil, 635, 395, 635, 635, 635, + 635, 635, 635, 635, 395, 635, nil, nil, nil, 395, + 395, 395, 395, 395, 395, nil, nil, nil, 395, 395, + nil, 635, nil, nil, nil, nil, 395, nil, nil, 395, + 395, 395, nil, 395, 395, nil, nil, 395, 395, 396, + 396, 396, 396, 396, 396, nil, nil, nil, 396, 396, + nil, nil, nil, 396, nil, 396, 396, 396, 396, 396, + 396, 396, nil, nil, nil, nil, nil, 396, 396, 396, + 396, 396, 396, 396, nil, nil, 396, nil, nil, nil, + nil, nil, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, nil, 396, 396, 396, nil, 396, + 396, nil, 396, 396, 396, 915, 915, 915, 915, 915, + 915, 915, 915, 915, 915, 915, nil, 915, 915, nil, + nil, 915, 915, nil, 396, nil, nil, 396, nil, nil, + 396, 396, nil, nil, 396, nil, 396, 915, nil, 915, + 396, 915, 915, 915, 915, 915, 915, 915, 396, 915, + nil, nil, nil, 396, 396, 396, 396, 396, 396, nil, + nil, nil, 396, 396, nil, 915, nil, nil, nil, nil, + 396, nil, nil, 396, 396, 396, nil, 396, 396, nil, + nil, 396, 396, 451, 451, 451, 451, 451, 451, nil, + nil, nil, 451, 451, nil, nil, nil, 451, nil, 451, + 451, 451, 451, 451, 451, 451, nil, nil, nil, nil, + nil, 451, 451, 451, 451, 451, 451, 451, nil, nil, + 451, nil, nil, nil, nil, nil, 451, 451, 451, 451, + 451, 451, 451, 451, 451, 451, 451, 451, nil, 451, + 451, 451, nil, 451, 451, nil, 451, 451, 451, 1065, + 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, + nil, 1065, 1065, nil, nil, 1065, 1065, nil, 451, nil, + nil, 451, nil, nil, 451, 451, nil, nil, 451, nil, + 451, 1065, nil, 1065, 451, 1065, 1065, 1065, 1065, 1065, + 1065, 1065, 451, 1065, nil, nil, nil, 451, 451, 451, + 451, 451, 451, nil, nil, nil, 451, 451, nil, 1065, + nil, nil, nil, nil, 451, nil, nil, 451, 451, 451, + nil, 451, 451, nil, nil, 451, 451, 651, 651, 651, + 651, 651, 651, nil, nil, nil, 651, 651, nil, nil, + nil, 651, nil, 651, 651, 651, 651, 651, 651, 651, + nil, nil, nil, nil, nil, 651, 651, 651, 651, 651, + 651, 651, nil, nil, 651, nil, nil, nil, nil, nil, + 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, + 651, 651, nil, 651, 651, 651, nil, 651, 651, nil, + 651, 651, 651, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, 1066, nil, 1066, 1066, nil, nil, 1066, + 1066, nil, 651, nil, nil, 651, nil, nil, 651, 651, + nil, nil, 651, nil, 651, 1066, nil, 1066, 651, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 651, 1066, nil, nil, + nil, 651, 651, 651, 651, 651, 651, nil, nil, nil, + 651, 651, nil, 1066, nil, nil, nil, nil, 651, nil, + nil, 651, 651, 651, nil, 651, 651, nil, nil, 651, + 651, 654, 654, 654, 654, 654, 654, nil, nil, nil, + 654, 654, nil, nil, nil, 654, nil, 654, 654, 654, + 654, 654, 654, 654, nil, nil, nil, nil, nil, 654, + 654, 654, 654, 654, 654, 654, nil, nil, 654, nil, + nil, nil, nil, nil, 654, 654, 654, 654, 654, 654, + 654, 654, 654, 654, 654, 654, nil, 654, 654, 654, + nil, 654, 654, nil, 654, 654, 654, 1086, 1086, 1086, + 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, nil, 1086, + 1086, nil, nil, 1086, 1086, nil, 654, nil, nil, 654, + nil, nil, 654, 654, nil, nil, 654, nil, 654, 1086, + nil, 1086, 654, 1086, 1086, 1086, 1086, 1086, 1086, 1086, + 654, 1086, nil, nil, nil, 654, 654, 654, 654, 654, + 654, nil, nil, nil, 654, 654, nil, 1086, nil, nil, + nil, nil, 654, nil, nil, 654, 654, 654, nil, 654, + 654, nil, nil, 654, 654, 677, 677, 677, 677, 677, + 677, nil, nil, nil, 677, 677, nil, nil, nil, 677, + nil, 677, 677, 677, 677, 677, 677, 677, nil, nil, + nil, nil, nil, 677, 677, 677, 677, 677, 677, 677, + nil, nil, 677, nil, nil, nil, nil, nil, 677, 677, + 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, + nil, 677, 677, 677, nil, 677, 677, nil, 677, 677, + 677, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, nil, 1087, 1087, nil, nil, 1087, 1087, nil, + 677, nil, nil, 677, nil, nil, 677, 677, nil, nil, + 677, nil, 677, 1087, nil, 1087, 677, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 677, 1087, nil, nil, nil, 677, + 677, 677, 677, 677, 677, nil, nil, nil, 677, 677, + nil, 1087, nil, nil, nil, nil, 677, nil, nil, 677, + 677, 677, nil, 677, 677, nil, nil, 677, 677, 886, + 886, 886, 886, 886, 886, nil, nil, nil, 886, 886, + nil, nil, nil, 886, nil, 886, 886, 886, 886, 886, + 886, 886, nil, nil, nil, nil, nil, 886, 886, 886, + 886, 886, 886, 886, nil, nil, 886, nil, nil, nil, + nil, nil, 886, 886, 886, 886, 886, 886, 886, 886, + 886, 886, 886, 886, nil, 886, 886, 886, nil, 886, + 886, nil, 886, 886, 886, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, nil, 1120, 1120, nil, + nil, 1120, 1120, nil, 886, nil, nil, 886, nil, nil, + 886, 886, nil, nil, 886, nil, 886, 1120, nil, 1120, + 886, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 886, 1120, + nil, nil, nil, 886, 886, 886, 886, 886, 886, nil, + nil, nil, 886, 886, nil, 1120, nil, nil, nil, nil, + 886, nil, nil, 886, 886, 886, nil, 886, 886, nil, + nil, 886, 886, 891, 891, 891, 891, 891, 891, nil, + nil, nil, 891, 891, nil, nil, nil, 891, nil, 891, + 891, 891, 891, 891, 891, 891, nil, nil, nil, nil, + nil, 891, 891, 891, 891, 891, 891, 891, nil, nil, + 891, nil, nil, nil, nil, nil, 891, 891, 891, 891, + 891, 891, 891, 891, 891, 891, 891, 891, nil, 891, + 891, 891, nil, 891, 891, nil, 891, 891, 891, 374, + 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, + nil, 374, 374, nil, nil, 374, 374, nil, 891, nil, + nil, 891, nil, nil, 891, 891, nil, nil, 891, nil, + 891, 374, nil, 374, 891, 374, 374, 374, 374, 374, + 374, 374, 891, 374, nil, nil, nil, 891, 891, 891, + 891, 891, 891, nil, nil, nil, 891, 891, nil, nil, + nil, nil, nil, nil, 891, nil, nil, 891, 891, 891, + nil, 891, 891, nil, nil, 891, 891, 898, 898, 898, + 898, 898, 898, nil, nil, nil, 898, 898, nil, nil, + nil, 898, nil, 898, 898, 898, 898, 898, 898, 898, + nil, nil, nil, nil, nil, 898, 898, 898, 898, 898, + 898, 898, nil, nil, 898, nil, nil, nil, nil, nil, + 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, + 898, 898, nil, 898, 898, 898, nil, 898, 898, nil, + 898, 898, 898, 375, 375, 375, 375, 375, 375, 375, + 375, 375, 375, 375, nil, 375, 375, nil, nil, 375, + 375, nil, 898, nil, nil, 898, nil, nil, 898, 898, + nil, nil, 898, nil, 898, 375, nil, 375, 898, 375, + 375, 375, 375, 375, 375, 375, 898, 375, nil, nil, + nil, 898, 898, 898, 898, 898, 898, nil, nil, nil, + 898, 898, nil, nil, nil, nil, nil, nil, 898, nil, + nil, 898, 898, 898, nil, 898, 898, nil, nil, 898, + 898, 934, 934, 934, 934, 934, 934, nil, nil, nil, + 934, 934, nil, nil, nil, 934, nil, 934, 934, 934, + 934, 934, 934, 934, nil, nil, nil, nil, nil, 934, + 934, 934, 934, 934, 934, 934, nil, nil, 934, nil, + nil, nil, nil, nil, 934, 934, 934, 934, 934, 934, + 934, 934, 934, 934, 934, 934, nil, 934, 934, 934, + nil, 934, 934, nil, 934, 934, 934, 555, 555, 555, + 555, 555, 555, 555, 555, 555, 555, 555, nil, 555, + 555, nil, nil, 555, 555, nil, 934, nil, nil, 934, + nil, nil, 934, 934, nil, nil, 934, nil, 934, 555, + nil, 555, 934, 555, 555, 555, 555, 555, 555, 555, + 934, 555, nil, nil, nil, 934, 934, 934, 934, 934, + 934, nil, nil, nil, 934, 934, nil, nil, nil, nil, + nil, nil, 934, nil, nil, 934, 934, 934, nil, 934, + 934, nil, nil, 934, 934, 1012, 1012, 1012, 1012, 1012, + 1012, nil, nil, nil, 1012, 1012, nil, nil, nil, 1012, + nil, 1012, 1012, 1012, 1012, 1012, 1012, 1012, nil, nil, + nil, nil, nil, 1012, 1012, 1012, 1012, 1012, 1012, 1012, + nil, nil, 1012, nil, nil, nil, nil, nil, 1012, 1012, + 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, + nil, 1012, 1012, 1012, nil, 1012, 1012, nil, 1012, 1012, + 1012, 556, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, nil, 556, 556, nil, nil, 556, 556, nil, + 1012, nil, nil, 1012, nil, nil, 1012, 1012, nil, nil, + 1012, nil, 1012, 556, nil, 556, 1012, 556, 556, 556, + 556, 556, 556, 556, 1012, 556, nil, nil, nil, 1012, + 1012, 1012, 1012, 1012, 1012, nil, nil, nil, 1012, 1012, + nil, nil, nil, nil, nil, nil, 1012, nil, nil, 1012, + 1012, 1012, nil, 1012, 1012, nil, nil, 1012, 1012, 1033, + 1033, 1033, 1033, 1033, 1033, nil, nil, nil, 1033, 1033, + nil, nil, nil, 1033, nil, 1033, 1033, 1033, 1033, 1033, + 1033, 1033, nil, nil, nil, nil, nil, 1033, 1033, 1033, + 1033, 1033, 1033, 1033, nil, 957, 1033, 957, 957, 957, + nil, 957, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, + 1033, 1033, 1033, 1033, nil, 1033, 1033, 1033, nil, 1033, + 1033, nil, 1033, 1033, 1033, 566, 566, 566, 566, 566, + 566, 566, nil, 957, 566, 566, nil, nil, nil, nil, + nil, 566, 566, nil, 1033, nil, nil, 1033, nil, nil, + 1033, 1033, nil, nil, 1033, nil, 1033, 566, nil, 566, + 1033, 566, 566, 566, 566, 566, 566, 566, 1033, 566, + nil, nil, nil, 1033, 1033, 1033, 1033, 1033, 1033, nil, + nil, nil, 1033, 1033, nil, nil, nil, nil, nil, nil, + 1033, nil, nil, 1033, 1033, 1033, nil, 1033, 1033, nil, + nil, 1033, 1033, 1041, 1041, 1041, 1041, 1041, 1041, nil, + nil, nil, 1041, 1041, nil, nil, nil, 1041, nil, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, nil, nil, nil, nil, + nil, 1041, 1041, 1041, 1041, 1041, 1041, 1041, nil, 1168, + 1041, 1168, 1168, 1168, nil, 1168, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, nil, 1041, + 1041, 1041, nil, 1041, 1041, nil, 1041, 1041, 1041, 567, + 567, 567, 567, 567, 567, 567, nil, 1168, 567, 567, + nil, nil, nil, nil, nil, 567, 567, nil, 1041, nil, + nil, 1041, nil, nil, 1041, 1041, nil, nil, 1041, nil, + 1041, 567, nil, 567, 1041, 567, 567, 567, 567, 567, + 567, 567, 1041, 567, nil, nil, nil, 1041, 1041, 1041, + 1041, 1041, 1041, nil, nil, nil, 1041, 1041, nil, nil, + nil, nil, nil, nil, 1041, nil, nil, 1041, 1041, 1041, + nil, 1041, 1041, nil, nil, 1041, 1041, 1050, 1050, 1050, + 1050, 1050, 1050, nil, nil, nil, 1050, 1050, nil, nil, + nil, 1050, nil, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + nil, nil, nil, nil, nil, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, nil, 1169, 1050, 1169, 1169, 1169, nil, 1169, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, nil, 1050, 1050, 1050, nil, 1050, 1050, nil, + 1050, 1050, 1050, 568, 568, 568, 568, 568, 568, 568, + nil, 1169, 568, 568, nil, nil, nil, nil, nil, 568, + 568, nil, 1050, nil, nil, 1050, nil, nil, 1050, 1050, + nil, nil, 1050, nil, 1050, 568, nil, 568, 1050, 568, + 568, 568, 568, 568, 568, 568, 1050, 568, nil, nil, + nil, 1050, 1050, 1050, 1050, 1050, 1050, nil, nil, nil, + 1050, 1050, nil, nil, nil, nil, nil, nil, 1050, nil, + nil, 1050, 1050, 1050, nil, 1050, 1050, nil, nil, 1050, + 1050, 1051, 1051, 1051, 1051, 1051, 1051, nil, nil, nil, + 1051, 1051, nil, nil, nil, 1051, nil, 1051, 1051, 1051, + 1051, 1051, 1051, 1051, nil, nil, nil, nil, nil, 1051, + 1051, 1051, 1051, 1051, 1051, 1051, nil, nil, 1051, nil, + nil, nil, nil, nil, 1051, 1051, 1051, 1051, 1051, 1051, + 1051, 1051, 1051, 1051, 1051, 1051, nil, 1051, 1051, 1051, + nil, 1051, 1051, nil, 1051, 1051, 1051, 569, 569, 569, + 569, 569, 569, 569, nil, nil, 569, 569, nil, nil, + nil, nil, nil, 569, 569, nil, 1051, nil, nil, 1051, + nil, nil, 1051, 1051, nil, nil, 1051, nil, 1051, 569, + nil, 569, 1051, 569, 569, 569, 569, 569, 569, 569, + 1051, 569, nil, nil, nil, 1051, 1051, 1051, 1051, 1051, + 1051, nil, nil, nil, 1051, 1051, nil, nil, nil, nil, + nil, nil, 1051, nil, nil, 1051, 1051, 1051, nil, 1051, + 1051, nil, nil, 1051, 1051, 1067, 1067, 1067, 1067, 1067, + 1067, nil, nil, nil, 1067, 1067, nil, nil, nil, 1067, + nil, 1067, 1067, 1067, 1067, 1067, 1067, 1067, nil, nil, + nil, nil, nil, 1067, 1067, 1067, 1067, 1067, 1067, 1067, + nil, nil, 1067, nil, nil, nil, nil, nil, 1067, 1067, + 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, + nil, 1067, 1067, 1067, nil, 1067, 1067, nil, 1067, 1067, + 1067, 570, 570, 570, 570, 570, 570, 570, nil, nil, + 570, 570, nil, nil, nil, nil, nil, 570, 570, nil, + 1067, nil, nil, 1067, nil, nil, 1067, 1067, nil, nil, + 1067, nil, 1067, 570, nil, 570, 1067, 570, 570, 570, + 570, 570, 570, 570, 1067, 570, nil, nil, nil, 1067, + 1067, 1067, 1067, 1067, 1067, nil, nil, nil, 1067, 1067, + nil, nil, nil, nil, nil, nil, 1067, nil, nil, 1067, + 1067, 1067, nil, 1067, 1067, nil, nil, 1067, 1067, 1137, + 1137, 1137, 1137, 1137, 1137, nil, nil, nil, 1137, 1137, + nil, nil, nil, 1137, nil, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, nil, nil, nil, nil, nil, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, nil, nil, 1137, nil, nil, nil, + nil, nil, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, nil, 1137, 1137, 1137, nil, 1137, + 1137, nil, 1137, 1137, 1137, 571, 571, 571, 571, 571, + 571, 571, nil, nil, 571, 571, nil, nil, nil, nil, + nil, 571, 571, nil, 1137, nil, nil, 1137, nil, nil, + 1137, 1137, nil, nil, 1137, nil, 1137, 571, nil, 571, + 1137, 571, 571, 571, 571, 571, 571, 571, 1137, 571, + nil, nil, nil, 1137, 1137, 1137, 1137, 1137, 1137, nil, + nil, nil, 1137, 1137, nil, nil, nil, nil, nil, nil, + 1137, nil, nil, 1137, 1137, 1137, nil, 1137, 1137, nil, + nil, 1137, 1137, 1150, 1150, 1150, 1150, 1150, 1150, nil, + nil, nil, 1150, 1150, nil, nil, nil, 1150, nil, 1150, + 1150, 1150, 1150, 1150, 1150, 1150, nil, nil, nil, nil, + nil, 1150, 1150, 1150, 1150, 1150, 1150, 1150, nil, nil, + 1150, nil, nil, nil, nil, nil, 1150, 1150, 1150, 1150, + 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, nil, 1150, + 1150, 1150, nil, 1150, 1150, nil, 1150, 1150, 1150, 574, + 574, 574, 574, 574, 574, 574, nil, nil, 574, 574, + nil, nil, nil, nil, nil, 574, 574, nil, 1150, nil, + nil, 1150, nil, nil, 1150, 1150, nil, nil, 1150, nil, + 1150, 574, nil, 574, 1150, 574, 574, 574, 574, 574, + 574, 574, 1150, 574, nil, nil, nil, 1150, 1150, 1150, + 1150, 1150, 1150, nil, nil, nil, 1150, 1150, nil, nil, + nil, nil, nil, nil, 1150, nil, nil, 1150, 1150, 1150, + nil, 1150, 1150, nil, nil, 1150, 1150, 1157, 1157, 1157, + 1157, 1157, 1157, nil, nil, nil, 1157, 1157, nil, nil, + nil, 1157, nil, 1157, 1157, 1157, 1157, 1157, 1157, 1157, + nil, nil, nil, nil, nil, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, nil, nil, 1157, nil, nil, nil, nil, nil, + 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, nil, 1157, 1157, 1157, nil, 1157, 1157, nil, + 1157, 1157, 1157, 575, 575, 575, 575, 575, 575, 575, + 575, nil, 575, 575, nil, nil, nil, nil, nil, 575, + 575, nil, 1157, nil, nil, 1157, nil, nil, 1157, 1157, + nil, nil, 1157, nil, 1157, 575, nil, 575, 1157, 575, + 575, 575, 575, 575, 575, 575, 1157, 575, nil, nil, + nil, 1157, 1157, 1157, 1157, 1157, 1157, nil, nil, nil, + 1157, 1157, nil, nil, nil, nil, nil, nil, 1157, nil, + nil, 1157, 1157, 1157, nil, 1157, 1157, nil, nil, 1157, + 1157, 1201, 1201, 1201, 1201, 1201, 1201, nil, nil, nil, + 1201, 1201, nil, nil, nil, 1201, nil, 1201, 1201, 1201, + 1201, 1201, 1201, 1201, nil, nil, nil, nil, nil, 1201, + 1201, 1201, 1201, 1201, 1201, 1201, nil, nil, 1201, nil, + nil, nil, nil, nil, 1201, 1201, 1201, 1201, 1201, 1201, + 1201, 1201, 1201, 1201, 1201, 1201, nil, 1201, 1201, 1201, + nil, 1201, 1201, nil, 1201, 1201, 1201, 577, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 577, 577, nil, 1201, nil, nil, 1201, + nil, nil, 1201, 1201, nil, nil, 1201, nil, 1201, 577, + nil, 577, 1201, 577, 577, 577, 577, nil, nil, 577, + 1201, 577, nil, nil, nil, 1201, 1201, 1201, 1201, 1201, + 1201, nil, nil, nil, 1201, 1201, nil, nil, nil, nil, + nil, nil, 1201, nil, nil, 1201, 1201, 1201, nil, 1201, + 1201, nil, nil, 1201, 1201, 1246, 1246, 1246, 1246, 1246, + 1246, nil, nil, nil, 1246, 1246, nil, nil, nil, 1246, + nil, 1246, 1246, 1246, 1246, 1246, 1246, 1246, nil, nil, + nil, nil, nil, 1246, 1246, 1246, 1246, 1246, 1246, 1246, + nil, nil, 1246, nil, nil, nil, nil, nil, 1246, 1246, + 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, + nil, 1246, 1246, 1246, nil, 1246, 1246, nil, 1246, 1246, + 1246, 634, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 634, 634, nil, + 1246, nil, nil, 1246, nil, nil, 1246, 1246, nil, nil, + 1246, nil, 1246, 634, nil, 634, 1246, 634, 634, 634, + 634, nil, nil, 634, 1246, 634, nil, nil, nil, 1246, + 1246, 1246, 1246, 1246, 1246, nil, nil, nil, 1246, 1246, + nil, nil, nil, nil, nil, nil, 1246, nil, nil, 1246, + 1246, 1246, nil, 1246, 1246, nil, nil, 1246, 1246, 8, + 8, 8, 8, 8, nil, nil, nil, 8, 8, nil, + nil, nil, 8, nil, 8, 8, 8, 8, 8, 8, + 8, nil, nil, nil, nil, nil, 8, 8, 8, 8, + 8, 8, 8, nil, nil, 8, nil, nil, nil, nil, + nil, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, nil, 8, 8, 8, nil, 8, 8, + nil, 8, 8, 8, 563, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 563, 563, nil, 8, nil, nil, 8, nil, nil, 8, + 8, nil, nil, 8, nil, 8, 563, nil, 563, 8, + 563, 563, 563, 563, nil, nil, nil, 8, nil, nil, + nil, nil, 8, 8, 8, 8, 8, 8, nil, nil, + nil, 8, 8, nil, nil, nil, nil, nil, nil, 8, + nil, nil, 8, 8, 8, nil, 8, 8, nil, nil, + 8, 8, 25, 25, 25, nil, 25, nil, nil, nil, + 25, 25, nil, nil, nil, 25, nil, 25, 25, 25, + 25, 25, 25, 25, nil, nil, nil, nil, nil, 25, + 25, 25, 25, 25, 25, 25, nil, nil, 25, nil, + nil, nil, nil, nil, nil, 25, nil, nil, 25, 25, + 25, 25, 25, 25, 25, 25, nil, 25, 25, 25, + nil, 25, 25, nil, 25, 25, 25, 564, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 564, 564, nil, 25, nil, nil, 25, + nil, nil, 25, 25, nil, nil, 25, nil, nil, 564, + nil, 564, 25, 564, 564, 564, 564, nil, nil, nil, + 25, nil, nil, nil, nil, 25, 25, 25, 25, 25, + 25, nil, nil, nil, 25, 25, nil, nil, nil, nil, + nil, nil, 25, nil, nil, 25, 25, 25, 33, 25, + 25, nil, nil, 25, 25, 33, 33, 33, nil, nil, + 33, 33, 33, 1263, 33, 1263, 1263, 1263, 1263, 1263, + nil, nil, 33, 33, 33, 33, nil, nil, nil, 1263, + nil, nil, nil, nil, 33, 33, nil, 33, 33, 33, + 33, 33, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1263, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1263, 1263, nil, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, nil, + nil, 33, 33, 33, nil, nil, 33, nil, 33, 33, + nil, nil, 33, 33, nil, 33, 1263, 33, nil, 33, + nil, 33, 33, 33, 33, 33, 33, 33, nil, 33, + 33, 33, 1265, nil, 1265, 1265, 1265, 1265, 1265, nil, + nil, nil, nil, nil, 33, 33, nil, 33, 1265, 33, + 34, nil, nil, nil, nil, nil, 33, 34, 34, 34, + 33, nil, 34, 34, 34, nil, 34, nil, nil, nil, + 1265, nil, nil, nil, 34, nil, 34, 34, nil, nil, + nil, 1265, 1265, nil, nil, nil, 34, 34, nil, 34, + 34, 34, 34, 34, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1265, nil, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, nil, nil, 34, 34, 34, nil, nil, 34, nil, + 34, 34, nil, nil, 34, 34, nil, 34, nil, 34, + nil, 34, nil, 34, 34, 34, 34, 34, 34, 34, + nil, 34, nil, 34, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 34, 34, nil, 34, + nil, 34, 35, 35, 35, nil, 35, nil, 34, nil, + 35, 35, 34, nil, nil, 35, nil, 35, 35, 35, + 35, 35, 35, 35, nil, nil, nil, nil, nil, 35, + 35, 35, 35, 35, 35, 35, nil, nil, 35, nil, + nil, nil, nil, nil, nil, 35, nil, nil, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + nil, 35, 35, nil, 35, 35, 35, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 35, nil, nil, 35, + nil, nil, 35, 35, nil, nil, 35, nil, 35, nil, + 35, nil, 35, nil, nil, nil, nil, nil, nil, nil, + 35, nil, nil, nil, nil, 35, 35, 35, 35, 35, + 35, nil, nil, nil, 35, 35, nil, nil, nil, nil, + nil, nil, 35, nil, 35, 35, 35, 35, nil, 35, + 35, nil, nil, 35, 35, 36, 36, 36, nil, 36, + nil, nil, nil, 36, 36, nil, nil, nil, 36, nil, + 36, 36, 36, 36, 36, 36, 36, nil, nil, nil, + nil, nil, 36, 36, 36, 36, 36, 36, 36, nil, + nil, 36, nil, nil, nil, nil, nil, nil, 36, nil, + nil, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, nil, 36, 36, nil, 36, 36, 36, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 36, + nil, nil, 36, nil, nil, 36, 36, nil, nil, 36, + nil, 36, nil, 36, nil, 36, nil, nil, nil, nil, + nil, nil, nil, 36, nil, nil, nil, nil, 36, 36, + 36, 36, 36, 36, nil, nil, nil, 36, 36, nil, + nil, nil, nil, nil, nil, 36, nil, 36, 36, 36, + 36, nil, 36, 36, nil, nil, 36, 36, 37, 37, + 37, nil, 37, nil, nil, nil, 37, 37, nil, nil, + nil, 37, nil, 37, 37, 37, 37, 37, 37, 37, + nil, nil, nil, nil, nil, 37, 37, 37, 37, 37, + 37, 37, nil, nil, 37, nil, nil, nil, nil, nil, + nil, 37, nil, nil, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, nil, 37, 37, nil, + 37, 37, 37, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 37, nil, nil, 37, nil, nil, 37, 37, + nil, nil, 37, nil, 37, nil, 37, nil, 37, nil, + nil, nil, nil, nil, nil, nil, 37, nil, nil, nil, + nil, 37, 37, 37, 37, 37, 37, nil, nil, nil, + 37, 37, nil, nil, nil, nil, nil, nil, 37, nil, + 37, 37, 37, 37, nil, 37, 37, nil, nil, 37, + 37, 47, 47, 47, nil, 47, nil, nil, nil, 47, + 47, nil, nil, nil, 47, nil, 47, 47, 47, 47, + 47, 47, 47, nil, nil, nil, nil, nil, 47, 47, + 47, 47, 47, 47, 47, nil, nil, 47, nil, nil, + nil, nil, nil, nil, 47, nil, nil, 47, 47, 47, + 47, 47, 47, 47, 47, nil, 47, 47, 47, nil, + 47, 47, nil, 47, 47, 47, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 47, nil, nil, 47, nil, + nil, 47, 47, nil, nil, 47, nil, nil, nil, nil, + nil, 47, nil, nil, nil, nil, nil, nil, nil, 47, + nil, nil, nil, nil, 47, 47, 47, 47, 47, 47, + nil, nil, nil, 47, 47, nil, nil, nil, nil, nil, + nil, 47, nil, nil, 47, 47, 47, nil, 47, 47, + nil, nil, 47, 47, 48, 48, 48, nil, 48, nil, + nil, nil, 48, 48, nil, nil, nil, 48, nil, 48, + 48, 48, 48, 48, 48, 48, nil, nil, nil, nil, + nil, 48, 48, 48, 48, 48, 48, 48, nil, nil, + 48, nil, nil, nil, nil, nil, nil, 48, nil, nil, + 48, 48, 48, 48, 48, 48, 48, 48, nil, 48, + 48, 48, nil, 48, 48, nil, 48, 48, 48, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 48, nil, + nil, 48, nil, nil, 48, 48, nil, nil, 48, nil, + nil, nil, nil, nil, 48, nil, nil, nil, nil, nil, + nil, nil, 48, nil, nil, nil, nil, 48, 48, 48, + 48, 48, 48, nil, nil, nil, 48, 48, nil, nil, + nil, nil, nil, nil, 48, nil, nil, 48, 48, 48, + nil, 48, 48, nil, nil, 48, 48, 50, 50, 50, + nil, 50, nil, nil, nil, 50, 50, nil, nil, nil, + 50, nil, 50, 50, 50, 50, 50, 50, 50, nil, + nil, nil, nil, nil, 50, 50, 50, 50, 50, 50, + 50, nil, nil, 50, nil, nil, nil, nil, nil, nil, + 50, nil, nil, 50, 50, 50, 50, 50, 50, 50, + 50, nil, 50, 50, 50, nil, 50, 50, nil, 50, + 50, 50, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 50, nil, nil, 50, nil, nil, 50, 50, nil, + nil, 50, nil, nil, nil, nil, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 50, nil, nil, nil, nil, + 50, 50, 50, 50, 50, 50, nil, nil, nil, 50, + 50, nil, nil, nil, nil, nil, nil, 50, nil, nil, + 50, 50, 50, nil, 50, 50, nil, nil, 50, 50, + 51, 51, 51, nil, 51, nil, nil, nil, 51, 51, + nil, nil, nil, 51, nil, 51, 51, 51, 51, 51, + 51, 51, nil, nil, nil, nil, nil, 51, 51, 51, + 51, 51, 51, 51, nil, nil, 51, nil, nil, nil, + nil, nil, nil, 51, nil, nil, 51, 51, 51, 51, + 51, 51, 51, 51, nil, 51, 51, 51, nil, 51, + 51, nil, 51, 51, 51, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 51, nil, nil, 51, nil, nil, + 51, 51, nil, nil, 51, nil, nil, nil, nil, nil, + 51, nil, nil, nil, nil, nil, nil, nil, 51, nil, + nil, nil, nil, 51, 51, 51, 51, 51, 51, nil, + nil, nil, 51, 51, nil, nil, nil, nil, nil, nil, + 51, nil, nil, 51, 51, 51, nil, 51, 51, nil, + nil, 51, 51, 53, 53, 53, nil, 53, nil, nil, + nil, 53, 53, nil, nil, nil, 53, nil, 53, 53, + 53, 53, 53, 53, 53, nil, nil, nil, nil, nil, + 53, 53, 53, 53, 53, 53, 53, nil, nil, 53, + nil, nil, nil, nil, nil, nil, 53, nil, nil, 53, + 53, 53, 53, 53, 53, 53, 53, nil, 53, 53, + 53, nil, 53, 53, nil, 53, 53, 53, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 53, nil, nil, + 53, nil, nil, 53, 53, nil, nil, 53, nil, nil, + nil, nil, nil, 53, nil, nil, nil, nil, nil, nil, + nil, 53, nil, nil, nil, nil, 53, 53, 53, 53, + 53, 53, nil, nil, nil, 53, 53, nil, nil, nil, + nil, nil, nil, 53, nil, nil, 53, 53, 53, 65, + 53, 53, nil, nil, 53, 53, 65, 65, 65, nil, + nil, 65, 65, 65, 1267, 65, 1267, 1267, 1267, 1267, + 1267, nil, nil, 65, nil, 65, 65, 65, nil, nil, + 1267, 804, 804, 804, 804, 65, 65, nil, 65, 65, + 65, 65, 65, nil, nil, nil, nil, 804, 804, 804, + nil, nil, 1267, nil, nil, nil, nil, nil, nil, nil, + 804, 804, nil, 1267, 1267, 804, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + nil, nil, 65, 65, 65, nil, nil, 65, nil, nil, + 65, nil, nil, 65, 65, nil, 65, 1267, 65, nil, + 65, nil, 65, 65, 65, 65, 65, 65, 65, nil, + 65, nil, 65, nil, 804, 804, 804, 804, 804, 804, + nil, nil, nil, 804, 804, 65, 65, 65, 65, nil, + 65, 804, 65, nil, 804, 804, 804, 65, 804, 804, + 486, 65, 67, 67, 67, 67, 67, 486, 486, 486, + 67, 67, 486, 486, 486, 67, 486, 67, 67, 67, + 67, 67, 67, 67, 486, 486, 486, 486, nil, 67, + 67, 67, 67, 67, 67, 67, 486, 486, 67, 486, + 486, 486, 486, 486, 67, 67, nil, 67, 67, 67, + 67, 67, 67, 67, 67, 67, nil, 67, 67, 67, + nil, 67, 67, nil, 67, 67, 67, 486, 486, 486, + 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, + 486, nil, nil, 486, 486, 486, 67, nil, 486, 67, + 486, 486, 67, 67, 486, 486, 67, 486, 67, 486, + nil, 486, 67, 486, 486, 486, 486, 486, 486, 486, + 67, 486, 486, 486, nil, 67, 67, 67, 67, 67, + 67, nil, nil, nil, 67, 67, 486, 486, nil, 486, + nil, 486, 67, nil, nil, 67, 67, 67, 486, 67, + 67, nil, 486, 67, 67, 68, 68, 68, nil, 68, + nil, nil, nil, 68, 68, nil, nil, nil, 68, nil, + 68, 68, 68, 68, 68, 68, 68, nil, nil, nil, + nil, nil, 68, 68, 68, 68, 68, 68, 68, nil, + nil, 68, nil, nil, nil, nil, nil, nil, 68, nil, + nil, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, nil, 68, 68, nil, 68, 68, 68, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 68, + nil, nil, 68, nil, nil, 68, 68, nil, nil, 68, + nil, 68, nil, nil, nil, 68, nil, nil, nil, nil, + nil, nil, nil, 68, nil, nil, nil, nil, 68, 68, + 68, 68, 68, 68, nil, nil, nil, 68, 68, nil, + nil, nil, nil, nil, nil, 68, nil, 68, 68, 68, + 68, nil, 68, 68, nil, nil, 68, 68, 72, 72, + 72, nil, 72, nil, nil, nil, 72, 72, nil, nil, + nil, 72, nil, 72, 72, 72, 72, 72, 72, 72, + nil, nil, nil, nil, nil, 72, 72, 72, 72, 72, + 72, 72, nil, nil, 72, nil, nil, nil, nil, nil, + nil, 72, nil, nil, 72, 72, 72, 72, 72, 72, + 72, 72, nil, 72, 72, 72, nil, 72, 72, nil, + 72, 72, 72, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 72, nil, nil, 72, nil, nil, 72, 72, + nil, nil, 72, nil, nil, nil, nil, nil, 72, nil, + nil, nil, nil, nil, nil, nil, 72, nil, nil, nil, + nil, 72, 72, 72, 72, 72, 72, nil, nil, nil, + 72, 72, nil, nil, nil, nil, nil, nil, 72, nil, + nil, 72, 72, 72, nil, 72, 72, nil, nil, 72, + 72, 73, 73, 73, nil, 73, nil, nil, nil, 73, + 73, nil, nil, nil, 73, nil, 73, 73, 73, 73, + 73, 73, 73, nil, nil, nil, nil, nil, 73, 73, + 73, 73, 73, 73, 73, nil, nil, 73, nil, nil, + nil, nil, nil, nil, 73, nil, nil, 73, 73, 73, + 73, 73, 73, 73, 73, nil, 73, 73, 73, nil, + 73, 73, nil, 73, 73, 73, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 73, nil, nil, 73, nil, + nil, 73, 73, nil, nil, 73, nil, nil, nil, nil, + nil, 73, nil, nil, nil, nil, nil, nil, nil, 73, + nil, nil, nil, nil, 73, 73, 73, 73, 73, 73, + nil, nil, nil, 73, 73, nil, nil, nil, nil, nil, + nil, 73, nil, nil, 73, 73, 73, nil, 73, 73, + nil, nil, 73, 73, 76, 76, 76, nil, 76, nil, + nil, nil, 76, 76, nil, nil, nil, 76, nil, 76, + 76, 76, 76, 76, 76, 76, nil, nil, nil, nil, + nil, 76, 76, 76, 76, 76, 76, 76, nil, nil, + 76, nil, nil, nil, nil, nil, nil, 76, nil, nil, + 76, 76, 76, 76, 76, 76, 76, 76, nil, 76, + 76, 76, nil, 76, 76, nil, 76, 76, 76, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 76, nil, + nil, 76, nil, nil, 76, 76, nil, nil, 76, nil, + nil, nil, nil, nil, 76, nil, nil, nil, nil, nil, + nil, nil, 76, nil, nil, nil, nil, 76, 76, 76, + 76, 76, 76, nil, nil, nil, 76, 76, 76, nil, + nil, nil, nil, 76, 76, nil, nil, 76, 76, 76, + nil, 76, 76, nil, nil, 76, 76, 132, 132, 132, + 132, 132, nil, nil, nil, 132, 132, nil, nil, nil, + 132, nil, 132, 132, 132, 132, 132, 132, 132, nil, + nil, nil, nil, nil, 132, 132, 132, 132, 132, 132, + 132, nil, nil, 132, nil, nil, nil, nil, nil, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, nil, 132, 132, 132, nil, 132, 132, nil, 132, + 132, 132, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 132, nil, nil, 132, nil, nil, 132, 132, nil, + nil, 132, nil, 132, nil, nil, nil, 132, nil, nil, + nil, nil, nil, nil, nil, 132, nil, nil, nil, nil, + 132, 132, 132, 132, 132, 132, nil, nil, nil, 132, + 132, nil, nil, nil, nil, nil, 132, 132, nil, nil, + 132, 132, 132, nil, 132, 132, nil, nil, 132, 132, + 137, 137, 137, nil, 137, nil, nil, nil, 137, 137, + nil, nil, nil, 137, nil, 137, 137, 137, 137, 137, + 137, 137, nil, nil, nil, nil, nil, 137, 137, 137, + 137, 137, 137, 137, nil, nil, 137, nil, nil, nil, + nil, nil, nil, 137, nil, nil, 137, 137, 137, 137, + 137, 137, 137, 137, nil, 137, 137, 137, nil, 137, + 137, nil, 137, 137, 137, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 137, nil, nil, 137, nil, nil, + 137, 137, nil, nil, 137, nil, nil, nil, nil, nil, + 137, nil, nil, nil, nil, nil, nil, nil, 137, nil, + nil, nil, nil, 137, 137, 137, 137, 137, 137, nil, + nil, nil, 137, 137, nil, nil, nil, nil, nil, nil, + 137, nil, nil, 137, 137, 137, nil, 137, 137, nil, + nil, 137, 137, 138, 138, 138, nil, 138, nil, nil, + nil, 138, 138, nil, nil, nil, 138, nil, 138, 138, + 138, 138, 138, 138, 138, nil, nil, nil, nil, nil, + 138, 138, 138, 138, 138, 138, 138, nil, nil, 138, + nil, nil, nil, nil, nil, nil, 138, nil, nil, 138, + 138, 138, 138, 138, 138, 138, 138, nil, 138, 138, + 138, nil, 138, 138, nil, 138, 138, 138, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 138, nil, nil, + 138, nil, nil, 138, 138, nil, nil, 138, nil, nil, + nil, nil, nil, 138, nil, nil, nil, nil, nil, nil, + nil, 138, nil, nil, nil, nil, 138, 138, 138, 138, + 138, 138, nil, nil, nil, 138, 138, nil, nil, nil, + nil, nil, nil, 138, nil, nil, 138, 138, 138, nil, + 138, 138, nil, nil, 138, 138, 139, 139, 139, nil, + 139, nil, nil, nil, 139, 139, nil, nil, nil, 139, + nil, 139, 139, 139, 139, 139, 139, 139, nil, nil, + nil, nil, nil, 139, 139, 139, 139, 139, 139, 139, + nil, nil, 139, nil, nil, nil, nil, nil, nil, 139, + nil, nil, 139, 139, 139, 139, 139, 139, 139, 139, + nil, 139, 139, 139, nil, 139, 139, nil, 139, 139, + 139, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 139, nil, nil, 139, nil, nil, 139, 139, nil, nil, + 139, nil, nil, nil, nil, nil, 139, nil, nil, nil, + nil, nil, nil, nil, 139, nil, nil, nil, nil, 139, + 139, 139, 139, 139, 139, nil, nil, nil, 139, 139, + nil, nil, nil, nil, nil, nil, 139, nil, nil, 139, + 139, 139, nil, 139, 139, nil, nil, 139, 139, 140, + 140, 140, nil, 140, nil, nil, nil, 140, 140, nil, + nil, nil, 140, nil, 140, 140, 140, 140, 140, 140, + 140, nil, nil, nil, nil, nil, 140, 140, 140, 140, + 140, 140, 140, nil, nil, 140, nil, nil, nil, nil, + nil, nil, 140, nil, nil, 140, 140, 140, 140, 140, + 140, 140, 140, nil, 140, 140, 140, nil, 140, 140, + nil, 140, 140, 140, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 140, nil, nil, 140, nil, nil, 140, + 140, nil, nil, 140, nil, nil, nil, nil, nil, 140, + nil, nil, nil, nil, nil, nil, nil, 140, nil, nil, + nil, nil, 140, 140, 140, 140, 140, 140, nil, nil, + nil, 140, 140, nil, nil, nil, nil, nil, nil, 140, + nil, nil, 140, 140, 140, nil, 140, 140, nil, nil, + 140, 140, 141, 141, 141, 141, 141, nil, nil, nil, + 141, 141, nil, nil, nil, 141, nil, 141, 141, 141, + 141, 141, 141, 141, nil, nil, nil, nil, nil, 141, + 141, 141, 141, 141, 141, 141, nil, nil, 141, nil, + nil, nil, nil, nil, 141, 141, nil, 141, 141, 141, + 141, 141, 141, 141, 141, 141, nil, 141, 141, 141, + nil, 141, 141, nil, 141, 141, 141, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 141, nil, nil, 141, + nil, nil, 141, 141, nil, nil, 141, nil, 141, nil, + nil, nil, 141, nil, nil, nil, nil, nil, nil, nil, + 141, nil, nil, nil, nil, 141, 141, 141, 141, 141, + 141, nil, nil, nil, 141, 141, nil, nil, nil, nil, + nil, nil, 141, nil, nil, 141, 141, 141, nil, 141, + 141, nil, nil, 141, 141, 226, 226, 226, nil, 226, + nil, nil, nil, 226, 226, nil, nil, nil, 226, nil, + 226, 226, 226, 226, 226, 226, 226, nil, nil, nil, + nil, nil, 226, 226, 226, 226, 226, 226, 226, nil, + nil, 226, nil, nil, nil, nil, nil, nil, 226, nil, + nil, 226, 226, 226, 226, 226, 226, 226, 226, nil, + 226, 226, 226, nil, 226, 226, nil, 226, 226, 226, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 226, + nil, nil, 226, nil, nil, 226, 226, nil, nil, 226, + nil, 226, nil, nil, nil, 226, nil, nil, nil, nil, + nil, nil, nil, 226, nil, nil, nil, nil, 226, 226, + 226, 226, 226, 226, nil, nil, nil, 226, 226, nil, + nil, nil, nil, nil, nil, 226, nil, nil, 226, 226, + 226, nil, 226, 226, nil, nil, 226, 226, 227, 227, + 227, nil, 227, nil, nil, nil, 227, 227, nil, nil, + nil, 227, nil, 227, 227, 227, 227, 227, 227, 227, + nil, nil, nil, nil, nil, 227, 227, 227, 227, 227, + 227, 227, nil, nil, 227, nil, nil, nil, nil, nil, + nil, 227, nil, nil, 227, 227, 227, 227, 227, 227, + 227, 227, nil, 227, 227, 227, nil, 227, 227, nil, + 227, 227, 227, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 227, nil, nil, 227, nil, nil, 227, 227, + nil, nil, 227, nil, 227, nil, nil, nil, 227, nil, + nil, nil, nil, nil, nil, nil, 227, nil, nil, nil, + nil, 227, 227, 227, 227, 227, 227, nil, nil, nil, + 227, 227, nil, nil, nil, nil, nil, nil, 227, nil, + nil, 227, 227, 227, nil, 227, 227, nil, nil, 227, + 227, 228, 228, 228, nil, 228, nil, nil, nil, 228, + 228, nil, nil, nil, 228, nil, 228, 228, 228, 228, + 228, 228, 228, nil, nil, nil, nil, nil, 228, 228, + 228, 228, 228, 228, 228, nil, nil, 228, nil, nil, + nil, nil, nil, nil, 228, nil, nil, 228, 228, 228, + 228, 228, 228, 228, 228, nil, 228, 228, 228, nil, + 228, 228, nil, 228, 228, 228, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 228, nil, nil, 228, nil, + nil, 228, 228, nil, nil, 228, nil, nil, nil, nil, + nil, 228, nil, nil, nil, nil, nil, nil, nil, 228, + nil, nil, nil, nil, 228, 228, 228, 228, 228, 228, + nil, nil, nil, 228, 228, nil, nil, nil, nil, nil, + nil, 228, nil, nil, 228, 228, 228, nil, 228, 228, + nil, nil, 228, 228, 229, 229, 229, nil, 229, nil, + nil, nil, 229, 229, nil, nil, nil, 229, nil, 229, + 229, 229, 229, 229, 229, 229, nil, nil, nil, nil, + nil, 229, 229, 229, 229, 229, 229, 229, nil, nil, + 229, nil, nil, nil, nil, nil, nil, 229, nil, nil, + 229, 229, 229, 229, 229, 229, 229, 229, nil, 229, + 229, 229, nil, 229, 229, nil, 229, 229, 229, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 229, nil, + nil, 229, nil, nil, 229, 229, nil, nil, 229, nil, + nil, nil, nil, nil, 229, nil, nil, nil, nil, nil, + nil, nil, 229, nil, nil, nil, nil, 229, 229, 229, + 229, 229, 229, nil, nil, nil, 229, 229, nil, nil, + nil, nil, nil, nil, 229, nil, nil, 229, 229, 229, + nil, 229, 229, nil, nil, 229, 229, 230, 230, 230, + nil, 230, nil, nil, nil, 230, 230, nil, nil, nil, + 230, nil, 230, 230, 230, 230, 230, 230, 230, nil, + nil, nil, nil, nil, 230, 230, 230, 230, 230, 230, + 230, nil, nil, 230, nil, nil, nil, nil, nil, nil, + 230, nil, nil, 230, 230, 230, 230, 230, 230, 230, + 230, nil, 230, 230, 230, nil, 230, 230, nil, 230, + 230, 230, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 230, nil, nil, 230, nil, nil, 230, 230, nil, + nil, 230, nil, nil, nil, nil, nil, 230, nil, nil, + nil, nil, nil, nil, nil, 230, nil, nil, nil, nil, + 230, 230, 230, 230, 230, 230, nil, nil, nil, 230, + 230, nil, nil, nil, nil, nil, nil, 230, nil, nil, + 230, 230, 230, nil, 230, 230, nil, nil, 230, 230, + 231, 231, 231, nil, 231, nil, nil, nil, 231, 231, + nil, nil, nil, 231, nil, 231, 231, 231, 231, 231, + 231, 231, nil, nil, nil, nil, nil, 231, 231, 231, + 231, 231, 231, 231, nil, nil, 231, nil, nil, nil, + nil, nil, nil, 231, nil, nil, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, nil, 231, + 231, nil, 231, 231, 231, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 231, nil, nil, 231, nil, nil, + 231, 231, nil, nil, 231, nil, 231, nil, 231, nil, + 231, nil, nil, nil, nil, nil, nil, nil, 231, nil, + nil, nil, nil, 231, 231, 231, 231, 231, 231, nil, + nil, nil, 231, 231, nil, nil, nil, nil, nil, nil, + 231, nil, 231, 231, 231, 231, nil, 231, 231, nil, + nil, 231, 231, 244, 244, 244, nil, 244, nil, nil, + nil, 244, 244, nil, nil, nil, 244, nil, 244, 244, + 244, 244, 244, 244, 244, nil, nil, nil, nil, nil, + 244, 244, 244, 244, 244, 244, 244, nil, nil, 244, + nil, nil, nil, nil, nil, nil, 244, nil, nil, 244, + 244, 244, 244, 244, 244, 244, 244, nil, 244, 244, + 244, nil, 244, 244, nil, 244, 244, 244, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 244, nil, nil, + 244, nil, nil, 244, 244, nil, nil, 244, nil, nil, + nil, nil, nil, 244, nil, nil, nil, nil, nil, nil, + nil, 244, nil, nil, nil, nil, 244, 244, 244, 244, + 244, 244, nil, nil, nil, 244, 244, nil, nil, nil, + nil, nil, nil, 244, nil, nil, 244, 244, 244, nil, + 244, 244, nil, nil, 244, 244, 245, 245, 245, nil, + 245, nil, nil, nil, 245, 245, nil, nil, nil, 245, + nil, 245, 245, 245, 245, 245, 245, 245, nil, nil, + nil, nil, nil, 245, 245, 245, 245, 245, 245, 245, + nil, nil, 245, nil, nil, nil, nil, nil, nil, 245, + nil, nil, 245, 245, 245, 245, 245, 245, 245, 245, + nil, 245, 245, 245, nil, 245, 245, nil, 245, 245, + 245, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 245, nil, nil, 245, nil, nil, 245, 245, nil, nil, + 245, nil, nil, nil, nil, nil, 245, nil, nil, nil, + nil, nil, nil, nil, 245, nil, nil, nil, nil, 245, + 245, 245, 245, 245, 245, nil, nil, nil, 245, 245, + nil, nil, nil, nil, nil, nil, 245, nil, nil, 245, + 245, 245, nil, 245, 245, nil, nil, 245, 245, 246, + 246, 246, nil, 246, nil, nil, nil, 246, 246, nil, + nil, nil, 246, nil, 246, 246, 246, 246, 246, 246, + 246, nil, nil, nil, nil, nil, 246, 246, 246, 246, + 246, 246, 246, nil, nil, 246, nil, nil, nil, nil, + nil, nil, 246, nil, nil, 246, 246, 246, 246, 246, + 246, 246, 246, nil, 246, 246, 246, nil, 246, 246, + nil, 246, 246, 246, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 246, nil, nil, 246, nil, nil, 246, + 246, nil, nil, 246, nil, nil, nil, nil, nil, 246, + nil, nil, nil, nil, nil, nil, nil, 246, nil, nil, + nil, nil, 246, 246, 246, 246, 246, 246, nil, nil, + nil, 246, 246, 246, nil, nil, nil, nil, nil, 246, + nil, nil, 246, 246, 246, nil, 246, 246, nil, nil, + 246, 246, 257, 257, 257, nil, 257, nil, nil, nil, + 257, 257, nil, nil, nil, 257, nil, 257, 257, 257, + 257, 257, 257, 257, nil, nil, nil, nil, nil, 257, + 257, 257, 257, 257, 257, 257, nil, nil, 257, nil, + nil, nil, nil, nil, nil, 257, nil, nil, 257, 257, + 257, 257, 257, 257, 257, 257, nil, 257, 257, 257, + nil, 257, 257, nil, 257, 257, 257, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 257, nil, nil, 257, + nil, nil, 257, 257, nil, nil, 257, nil, nil, nil, + nil, nil, 257, nil, nil, nil, nil, nil, nil, nil, + 257, nil, nil, nil, nil, 257, 257, 257, 257, 257, + 257, nil, nil, nil, 257, 257, nil, nil, nil, nil, + nil, nil, 257, nil, nil, 257, 257, 257, nil, 257, + 257, nil, nil, 257, 257, 264, 264, 264, nil, 264, + nil, nil, nil, 264, 264, nil, nil, nil, 264, nil, + 264, 264, 264, 264, 264, 264, 264, nil, nil, nil, + nil, nil, 264, 264, 264, 264, 264, 264, 264, nil, + nil, 264, nil, nil, nil, nil, nil, nil, 264, nil, + nil, 264, 264, 264, 264, 264, 264, 264, 264, nil, + 264, 264, 264, nil, 264, 264, nil, 264, 264, 264, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 264, + nil, nil, 264, nil, nil, 264, 264, nil, nil, 264, + nil, nil, nil, nil, nil, 264, nil, nil, nil, nil, + nil, nil, nil, 264, nil, nil, nil, nil, 264, 264, + 264, 264, 264, 264, nil, nil, nil, 264, 264, nil, + nil, nil, nil, nil, nil, 264, nil, nil, 264, 264, + 264, nil, 264, 264, nil, nil, 264, 264, 265, 265, + 265, nil, 265, nil, nil, nil, 265, 265, nil, nil, + nil, 265, nil, 265, 265, 265, 265, 265, 265, 265, + nil, nil, nil, nil, nil, 265, 265, 265, 265, 265, + 265, 265, nil, nil, 265, nil, nil, nil, nil, nil, + nil, 265, nil, nil, 265, 265, 265, 265, 265, 265, + 265, 265, nil, 265, 265, 265, nil, 265, 265, nil, + 265, 265, 265, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 265, nil, nil, 265, nil, nil, 265, 265, + nil, nil, 265, nil, nil, nil, nil, nil, 265, nil, + nil, nil, nil, nil, nil, nil, 265, nil, nil, nil, + nil, 265, 265, 265, 265, 265, 265, nil, nil, nil, + 265, 265, nil, nil, nil, nil, nil, nil, 265, nil, + nil, 265, 265, 265, nil, 265, 265, nil, nil, 265, + 265, 266, 266, 266, nil, 266, nil, nil, nil, 266, + 266, nil, nil, nil, 266, nil, 266, 266, 266, 266, + 266, 266, 266, nil, nil, nil, nil, nil, 266, 266, + 266, 266, 266, 266, 266, nil, nil, 266, nil, nil, + nil, nil, nil, nil, 266, nil, nil, 266, 266, 266, + 266, 266, 266, 266, 266, nil, 266, 266, 266, nil, + 266, 266, nil, 266, 266, 266, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 266, nil, nil, 266, nil, + nil, 266, 266, nil, nil, 266, nil, nil, nil, nil, + nil, 266, nil, nil, nil, nil, nil, nil, nil, 266, + nil, nil, nil, nil, 266, 266, 266, 266, 266, 266, + nil, nil, nil, 266, 266, nil, nil, nil, nil, nil, + nil, 266, nil, nil, 266, 266, 266, nil, 266, 266, + nil, nil, 266, 266, 267, 267, 267, nil, 267, nil, + nil, nil, 267, 267, nil, nil, nil, 267, nil, 267, + 267, 267, 267, 267, 267, 267, nil, nil, nil, nil, + nil, 267, 267, 267, 267, 267, 267, 267, nil, nil, + 267, nil, nil, nil, nil, nil, nil, 267, nil, nil, + 267, 267, 267, 267, 267, 267, 267, 267, nil, 267, + 267, 267, nil, 267, 267, nil, 267, 267, 267, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 267, nil, + nil, 267, nil, nil, 267, 267, nil, nil, 267, nil, + nil, nil, nil, nil, 267, nil, nil, nil, nil, nil, + nil, nil, 267, nil, nil, nil, nil, 267, 267, 267, + 267, 267, 267, nil, nil, nil, 267, 267, nil, nil, + nil, nil, nil, nil, 267, nil, nil, 267, 267, 267, + nil, 267, 267, nil, nil, 267, 267, 268, 268, 268, + nil, 268, nil, nil, nil, 268, 268, nil, nil, nil, + 268, nil, 268, 268, 268, 268, 268, 268, 268, nil, + nil, nil, nil, nil, 268, 268, 268, 268, 268, 268, + 268, nil, nil, 268, nil, nil, nil, nil, nil, nil, + 268, nil, nil, 268, 268, 268, 268, 268, 268, 268, + 268, nil, 268, 268, 268, nil, 268, 268, nil, 268, + 268, 268, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 268, nil, nil, 268, nil, nil, 268, 268, nil, + nil, 268, nil, nil, nil, nil, nil, 268, nil, nil, + nil, nil, nil, nil, nil, 268, nil, nil, nil, nil, + 268, 268, 268, 268, 268, 268, nil, nil, nil, 268, + 268, nil, nil, nil, nil, nil, nil, 268, nil, nil, + 268, 268, 268, nil, 268, 268, nil, nil, 268, 268, + 269, 269, 269, nil, 269, nil, nil, nil, 269, 269, + nil, nil, nil, 269, nil, 269, 269, 269, 269, 269, + 269, 269, nil, nil, nil, nil, nil, 269, 269, 269, + 269, 269, 269, 269, nil, nil, 269, nil, nil, nil, + nil, nil, nil, 269, nil, nil, 269, 269, 269, 269, + 269, 269, 269, 269, nil, 269, 269, 269, nil, 269, + 269, nil, 269, 269, 269, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 269, nil, nil, 269, nil, nil, + 269, 269, nil, nil, 269, nil, nil, nil, nil, nil, + 269, nil, nil, nil, nil, nil, nil, nil, 269, nil, + nil, nil, nil, 269, 269, 269, 269, 269, 269, nil, + nil, nil, 269, 269, nil, nil, nil, nil, nil, nil, + 269, nil, nil, 269, 269, 269, nil, 269, 269, nil, + nil, 269, 269, 270, 270, 270, nil, 270, nil, nil, + nil, 270, 270, nil, nil, nil, 270, nil, 270, 270, + 270, 270, 270, 270, 270, nil, nil, nil, nil, nil, + 270, 270, 270, 270, 270, 270, 270, nil, nil, 270, + nil, nil, nil, nil, nil, nil, 270, nil, nil, 270, + 270, 270, 270, 270, 270, 270, 270, nil, 270, 270, + 270, nil, 270, 270, nil, 270, 270, 270, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 270, nil, nil, + 270, nil, nil, 270, 270, nil, nil, 270, nil, nil, + nil, nil, nil, 270, nil, nil, nil, nil, nil, nil, + nil, 270, nil, nil, nil, nil, 270, 270, 270, 270, + 270, 270, nil, nil, nil, 270, 270, nil, nil, nil, + nil, nil, nil, 270, nil, nil, 270, 270, 270, nil, + 270, 270, nil, nil, 270, 270, 271, 271, 271, nil, + 271, nil, nil, nil, 271, 271, nil, nil, nil, 271, + nil, 271, 271, 271, 271, 271, 271, 271, nil, nil, + nil, nil, nil, 271, 271, 271, 271, 271, 271, 271, + nil, nil, 271, nil, nil, nil, nil, nil, nil, 271, + nil, nil, 271, 271, 271, 271, 271, 271, 271, 271, + nil, 271, 271, 271, nil, 271, 271, nil, 271, 271, + 271, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 271, nil, nil, 271, nil, nil, 271, 271, nil, nil, + 271, nil, nil, nil, nil, nil, 271, nil, nil, nil, + nil, nil, nil, nil, 271, nil, nil, nil, nil, 271, + 271, 271, 271, 271, 271, nil, nil, nil, 271, 271, + nil, nil, nil, nil, nil, nil, 271, nil, nil, 271, + 271, 271, nil, 271, 271, nil, nil, 271, 271, 272, + 272, 272, nil, 272, nil, nil, nil, 272, 272, nil, + nil, nil, 272, nil, 272, 272, 272, 272, 272, 272, + 272, nil, nil, nil, nil, nil, 272, 272, 272, 272, + 272, 272, 272, nil, nil, 272, nil, nil, nil, nil, + nil, nil, 272, nil, nil, 272, 272, 272, 272, 272, + 272, 272, 272, nil, 272, 272, 272, nil, 272, 272, + nil, 272, 272, 272, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 272, nil, nil, 272, nil, nil, 272, + 272, nil, nil, 272, nil, nil, nil, nil, nil, 272, + nil, nil, nil, nil, nil, nil, nil, 272, nil, nil, + nil, nil, 272, 272, 272, 272, 272, 272, nil, nil, + nil, 272, 272, nil, nil, nil, nil, nil, nil, 272, + nil, nil, 272, 272, 272, nil, 272, 272, nil, nil, + 272, 272, 273, 273, 273, nil, 273, nil, nil, nil, + 273, 273, nil, nil, nil, 273, nil, 273, 273, 273, + 273, 273, 273, 273, nil, nil, nil, nil, nil, 273, + 273, 273, 273, 273, 273, 273, nil, nil, 273, nil, + nil, nil, nil, nil, nil, 273, nil, nil, 273, 273, + 273, 273, 273, 273, 273, 273, nil, 273, 273, 273, + nil, 273, 273, nil, 273, 273, 273, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 273, nil, nil, 273, + nil, nil, 273, 273, nil, nil, 273, nil, nil, nil, + nil, nil, 273, nil, nil, nil, nil, nil, nil, nil, + 273, nil, nil, nil, nil, 273, 273, 273, 273, 273, + 273, nil, nil, nil, 273, 273, nil, nil, nil, nil, + nil, nil, 273, nil, nil, 273, 273, 273, nil, 273, + 273, nil, nil, 273, 273, 274, 274, 274, nil, 274, + nil, nil, nil, 274, 274, nil, nil, nil, 274, nil, + 274, 274, 274, 274, 274, 274, 274, nil, nil, nil, + nil, nil, 274, 274, 274, 274, 274, 274, 274, nil, + nil, 274, nil, nil, nil, nil, nil, nil, 274, nil, + nil, 274, 274, 274, 274, 274, 274, 274, 274, nil, + 274, 274, 274, nil, 274, 274, nil, 274, 274, 274, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 274, + nil, nil, 274, nil, nil, 274, 274, nil, nil, 274, + nil, nil, nil, nil, nil, 274, nil, nil, nil, nil, + nil, nil, nil, 274, nil, nil, nil, nil, 274, 274, + 274, 274, 274, 274, nil, nil, nil, 274, 274, nil, + nil, nil, nil, nil, nil, 274, nil, nil, 274, 274, + 274, nil, 274, 274, nil, nil, 274, 274, 275, 275, + 275, nil, 275, nil, nil, nil, 275, 275, nil, nil, + nil, 275, nil, 275, 275, 275, 275, 275, 275, 275, + nil, nil, nil, nil, nil, 275, 275, 275, 275, 275, + 275, 275, nil, nil, 275, nil, nil, nil, nil, nil, + nil, 275, nil, nil, 275, 275, 275, 275, 275, 275, + 275, 275, nil, 275, 275, 275, nil, 275, 275, nil, + 275, 275, 275, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 275, nil, nil, 275, nil, nil, 275, 275, + nil, nil, 275, nil, nil, nil, nil, nil, 275, nil, + nil, nil, nil, nil, nil, nil, 275, nil, nil, nil, + nil, 275, 275, 275, 275, 275, 275, nil, nil, nil, + 275, 275, nil, nil, nil, nil, nil, nil, 275, nil, + nil, 275, 275, 275, nil, 275, 275, nil, nil, 275, + 275, 276, 276, 276, nil, 276, nil, nil, nil, 276, + 276, nil, nil, nil, 276, nil, 276, 276, 276, 276, + 276, 276, 276, nil, nil, nil, nil, nil, 276, 276, + 276, 276, 276, 276, 276, nil, nil, 276, nil, nil, + nil, nil, nil, nil, 276, nil, nil, 276, 276, 276, + 276, 276, 276, 276, 276, nil, 276, 276, 276, nil, + 276, 276, nil, 276, 276, 276, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 276, nil, nil, 276, nil, + nil, 276, 276, nil, nil, 276, nil, nil, nil, nil, + nil, 276, nil, nil, nil, nil, nil, nil, nil, 276, + nil, nil, nil, nil, 276, 276, 276, 276, 276, 276, + nil, nil, nil, 276, 276, nil, nil, nil, nil, nil, + nil, 276, nil, nil, 276, 276, 276, nil, 276, 276, + nil, nil, 276, 276, 277, 277, 277, nil, 277, nil, + nil, nil, 277, 277, nil, nil, nil, 277, nil, 277, + 277, 277, 277, 277, 277, 277, nil, nil, nil, nil, + nil, 277, 277, 277, 277, 277, 277, 277, nil, nil, + 277, nil, nil, nil, nil, nil, nil, 277, nil, nil, + 277, 277, 277, 277, 277, 277, 277, 277, nil, 277, + 277, 277, nil, 277, 277, nil, 277, 277, 277, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 277, nil, + nil, 277, nil, nil, 277, 277, nil, nil, 277, nil, + nil, nil, nil, nil, 277, nil, nil, nil, nil, nil, + nil, nil, 277, nil, nil, nil, nil, 277, 277, 277, + 277, 277, 277, nil, nil, nil, 277, 277, nil, nil, + nil, nil, nil, nil, 277, nil, nil, 277, 277, 277, + nil, 277, 277, nil, nil, 277, 277, 278, 278, 278, + nil, 278, nil, nil, nil, 278, 278, nil, nil, nil, + 278, nil, 278, 278, 278, 278, 278, 278, 278, nil, + nil, nil, nil, nil, 278, 278, 278, 278, 278, 278, + 278, nil, nil, 278, nil, nil, nil, nil, nil, nil, + 278, nil, nil, 278, 278, 278, 278, 278, 278, 278, + 278, nil, 278, 278, 278, nil, 278, 278, nil, 278, + 278, 278, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 278, nil, nil, 278, nil, nil, 278, 278, nil, + nil, 278, nil, nil, nil, nil, nil, 278, nil, nil, + nil, nil, nil, nil, nil, 278, nil, nil, nil, nil, + 278, 278, 278, 278, 278, 278, nil, nil, nil, 278, + 278, nil, nil, nil, nil, nil, nil, 278, nil, nil, + 278, 278, 278, nil, 278, 278, nil, nil, 278, 278, + 279, 279, 279, nil, 279, nil, nil, nil, 279, 279, + nil, nil, nil, 279, nil, 279, 279, 279, 279, 279, + 279, 279, nil, nil, nil, nil, nil, 279, 279, 279, + 279, 279, 279, 279, nil, nil, 279, nil, nil, nil, + nil, nil, nil, 279, nil, nil, 279, 279, 279, 279, + 279, 279, 279, 279, nil, 279, 279, 279, nil, 279, + 279, nil, 279, 279, 279, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 279, nil, nil, 279, nil, nil, + 279, 279, nil, nil, 279, nil, nil, nil, nil, nil, + 279, nil, nil, nil, nil, nil, nil, nil, 279, nil, + nil, nil, nil, 279, 279, 279, 279, 279, 279, nil, + nil, nil, 279, 279, nil, nil, nil, nil, nil, nil, + 279, nil, nil, 279, 279, 279, nil, 279, 279, nil, + nil, 279, 279, 280, 280, 280, nil, 280, nil, nil, + nil, 280, 280, nil, nil, nil, 280, nil, 280, 280, + 280, 280, 280, 280, 280, nil, nil, nil, nil, nil, + 280, 280, 280, 280, 280, 280, 280, nil, nil, 280, + nil, nil, nil, nil, nil, nil, 280, nil, nil, 280, + 280, 280, 280, 280, 280, 280, 280, nil, 280, 280, + 280, nil, 280, 280, nil, 280, 280, 280, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 280, nil, nil, + 280, nil, nil, 280, 280, nil, nil, 280, nil, nil, + nil, nil, nil, 280, nil, nil, nil, nil, nil, nil, + nil, 280, nil, nil, nil, nil, 280, 280, 280, 280, + 280, 280, nil, nil, nil, 280, 280, nil, nil, nil, + nil, nil, nil, 280, nil, nil, 280, 280, 280, nil, + 280, 280, nil, nil, 280, 280, 281, 281, 281, nil, + 281, nil, nil, nil, 281, 281, nil, nil, nil, 281, + nil, 281, 281, 281, 281, 281, 281, 281, nil, nil, + nil, nil, nil, 281, 281, 281, 281, 281, 281, 281, + nil, nil, 281, nil, nil, nil, nil, nil, nil, 281, + nil, nil, 281, 281, 281, 281, 281, 281, 281, 281, + nil, 281, 281, 281, nil, 281, 281, nil, 281, 281, + 281, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 281, nil, nil, 281, nil, nil, 281, 281, nil, nil, + 281, nil, nil, nil, nil, nil, 281, nil, nil, nil, + nil, nil, nil, nil, 281, nil, nil, nil, nil, 281, + 281, 281, 281, 281, 281, nil, nil, nil, 281, 281, + nil, nil, nil, nil, nil, nil, 281, nil, nil, 281, + 281, 281, nil, 281, 281, nil, nil, 281, 281, 282, + 282, 282, nil, 282, nil, nil, nil, 282, 282, nil, + nil, nil, 282, nil, 282, 282, 282, 282, 282, 282, + 282, nil, nil, nil, nil, nil, 282, 282, 282, 282, + 282, 282, 282, nil, nil, 282, nil, nil, nil, nil, + nil, nil, 282, nil, nil, 282, 282, 282, 282, 282, + 282, 282, 282, nil, 282, 282, 282, nil, 282, 282, + nil, 282, 282, 282, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 282, nil, nil, 282, nil, nil, 282, + 282, nil, nil, 282, nil, nil, nil, nil, nil, 282, + nil, nil, nil, nil, nil, nil, nil, 282, nil, nil, + nil, nil, 282, 282, 282, 282, 282, 282, nil, nil, + nil, 282, 282, nil, nil, nil, nil, nil, nil, 282, + nil, nil, 282, 282, 282, nil, 282, 282, nil, nil, + 282, 282, 283, 283, 283, nil, 283, nil, nil, nil, + 283, 283, nil, nil, nil, 283, nil, 283, 283, 283, + 283, 283, 283, 283, nil, nil, nil, nil, nil, 283, + 283, 283, 283, 283, 283, 283, nil, nil, 283, nil, + nil, nil, nil, nil, nil, 283, nil, nil, 283, 283, + 283, 283, 283, 283, 283, 283, nil, 283, 283, 283, + nil, 283, 283, nil, 283, 283, 283, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 283, nil, nil, 283, + nil, nil, 283, 283, nil, nil, 283, nil, nil, nil, + nil, nil, 283, nil, nil, nil, nil, nil, nil, nil, + 283, nil, nil, nil, nil, 283, 283, 283, 283, 283, + 283, nil, nil, nil, 283, 283, nil, nil, nil, nil, + nil, nil, 283, nil, nil, 283, 283, 283, nil, 283, + 283, nil, nil, 283, 283, 284, 284, 284, nil, 284, + nil, nil, nil, 284, 284, nil, nil, nil, 284, nil, + 284, 284, 284, 284, 284, 284, 284, nil, nil, nil, + nil, nil, 284, 284, 284, 284, 284, 284, 284, nil, + nil, 284, nil, nil, nil, nil, nil, nil, 284, nil, + nil, 284, 284, 284, 284, 284, 284, 284, 284, nil, + 284, 284, 284, nil, 284, 284, nil, 284, 284, 284, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 284, + nil, nil, 284, nil, nil, 284, 284, nil, nil, 284, + nil, nil, nil, nil, nil, 284, nil, nil, nil, nil, + nil, nil, nil, 284, nil, nil, nil, nil, 284, 284, + 284, 284, 284, 284, nil, nil, nil, 284, 284, nil, + nil, nil, nil, nil, nil, 284, nil, nil, 284, 284, + 284, nil, 284, 284, nil, nil, 284, 284, 285, 285, + 285, nil, 285, nil, nil, nil, 285, 285, nil, nil, + nil, 285, nil, 285, 285, 285, 285, 285, 285, 285, + nil, nil, nil, nil, nil, 285, 285, 285, 285, 285, + 285, 285, nil, nil, 285, nil, nil, nil, nil, nil, + nil, 285, nil, nil, 285, 285, 285, 285, 285, 285, + 285, 285, nil, 285, 285, 285, nil, 285, 285, nil, + 285, 285, 285, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 285, nil, nil, 285, nil, nil, 285, 285, + nil, nil, 285, nil, nil, nil, nil, nil, 285, nil, + nil, nil, nil, nil, nil, nil, 285, nil, nil, nil, + nil, 285, 285, 285, 285, 285, 285, nil, nil, nil, + 285, 285, nil, nil, nil, nil, nil, nil, 285, nil, + nil, 285, 285, 285, nil, 285, 285, nil, nil, 285, + 285, 290, 290, 290, nil, 290, nil, nil, nil, 290, + 290, nil, nil, nil, 290, nil, 290, 290, 290, 290, + 290, 290, 290, nil, nil, nil, nil, nil, 290, 290, + 290, 290, 290, 290, 290, nil, nil, 290, nil, nil, + nil, nil, nil, nil, 290, nil, nil, 290, 290, 290, + 290, 290, 290, 290, 290, nil, 290, 290, 290, nil, + 290, 290, nil, 290, 290, 290, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 290, nil, nil, 290, nil, + nil, 290, 290, nil, nil, 290, nil, nil, nil, nil, + nil, 290, nil, nil, nil, nil, nil, nil, nil, 290, + nil, nil, nil, nil, 290, 290, 290, 290, 290, 290, + nil, nil, nil, 290, 290, nil, nil, nil, nil, nil, + nil, 290, nil, nil, 290, 290, 290, nil, 290, 290, + nil, nil, 290, 290, 314, 314, 314, nil, 314, nil, + nil, nil, 314, 314, nil, nil, nil, 314, nil, 314, + 314, 314, 314, 314, 314, 314, nil, nil, nil, nil, + nil, 314, 314, 314, 314, 314, 314, 314, nil, nil, + 314, nil, nil, nil, nil, nil, nil, 314, nil, nil, + 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, + 314, 314, nil, 314, 314, nil, 314, 314, 314, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 314, nil, + nil, 314, nil, nil, 314, 314, nil, nil, 314, nil, + 314, nil, 314, nil, 314, nil, nil, nil, nil, nil, + nil, nil, 314, nil, nil, nil, nil, 314, 314, 314, + 314, 314, 314, nil, nil, nil, 314, 314, nil, nil, + nil, nil, nil, nil, 314, nil, 314, 314, 314, 314, + nil, 314, 314, nil, nil, 314, 314, 315, 315, 315, + nil, 315, nil, nil, nil, 315, 315, nil, nil, nil, + 315, nil, 315, 315, 315, 315, 315, 315, 315, nil, + nil, nil, nil, nil, 315, 315, 315, 315, 315, 315, + 315, nil, nil, 315, nil, nil, nil, nil, nil, nil, + 315, nil, nil, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 315, 315, nil, 315, 315, nil, 315, + 315, 315, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 315, nil, nil, 315, nil, nil, 315, 315, nil, + nil, 315, nil, 315, nil, 315, nil, 315, nil, nil, + nil, nil, nil, nil, nil, 315, nil, nil, nil, nil, + 315, 315, 315, 315, 315, 315, nil, nil, nil, 315, + 315, nil, nil, nil, nil, nil, nil, 315, nil, 315, + 315, 315, 315, nil, 315, 315, nil, nil, 315, 315, + 324, 324, 324, nil, 324, nil, nil, nil, 324, 324, + nil, nil, nil, 324, nil, 324, 324, 324, 324, 324, + 324, 324, nil, nil, nil, nil, nil, 324, 324, 324, + 324, 324, 324, 324, nil, nil, 324, nil, nil, nil, + nil, nil, nil, 324, nil, nil, 324, 324, 324, 324, + 324, 324, 324, 324, 324, 324, 324, 324, nil, 324, + 324, nil, 324, 324, 324, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 324, nil, nil, 324, nil, nil, + 324, 324, nil, nil, 324, nil, 324, nil, 324, nil, + 324, nil, nil, nil, nil, nil, nil, nil, 324, nil, + nil, nil, nil, 324, 324, 324, 324, 324, 324, nil, + nil, nil, 324, 324, 324, nil, nil, nil, nil, nil, + 324, nil, 324, 324, 324, 324, nil, 324, 324, nil, + nil, 324, 324, 331, 331, 331, nil, 331, nil, nil, + nil, 331, 331, nil, nil, nil, 331, nil, 331, 331, + 331, 331, 331, 331, 331, nil, nil, nil, nil, nil, + 331, 331, 331, 331, 331, 331, 331, nil, nil, 331, + nil, nil, nil, nil, nil, nil, 331, nil, nil, 331, + 331, 331, 331, 331, 331, 331, 331, nil, 331, 331, + 331, nil, 331, 331, nil, 331, 331, 331, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 331, nil, nil, + 331, nil, nil, 331, 331, nil, nil, 331, nil, nil, + nil, nil, nil, 331, nil, nil, nil, nil, nil, nil, + nil, 331, nil, nil, nil, nil, 331, 331, 331, 331, + 331, 331, nil, nil, nil, 331, 331, nil, nil, nil, + nil, nil, nil, 331, nil, nil, 331, 331, 331, nil, + 331, 331, nil, nil, 331, 331, 333, 333, 333, nil, + 333, nil, nil, nil, 333, 333, nil, nil, nil, 333, + nil, 333, 333, 333, 333, 333, 333, 333, nil, nil, + nil, nil, nil, 333, 333, 333, 333, 333, 333, 333, + nil, nil, 333, nil, nil, nil, nil, nil, nil, 333, + nil, nil, 333, 333, 333, 333, 333, 333, 333, 333, + nil, 333, 333, 333, nil, 333, 333, nil, 333, 333, + 333, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 333, nil, nil, 333, nil, nil, 333, 333, nil, nil, + 333, nil, nil, nil, nil, nil, 333, nil, nil, nil, + nil, nil, nil, nil, 333, nil, nil, nil, nil, 333, + 333, 333, 333, 333, 333, nil, nil, nil, 333, 333, + nil, nil, nil, nil, nil, nil, 333, nil, nil, 333, + 333, 333, nil, 333, 333, nil, nil, 333, 333, 336, + 336, 336, nil, 336, nil, nil, nil, 336, 336, nil, + nil, nil, 336, nil, 336, 336, 336, 336, 336, 336, + 336, nil, nil, nil, nil, nil, 336, 336, 336, 336, + 336, 336, 336, nil, nil, 336, nil, nil, nil, nil, + nil, nil, 336, nil, nil, 336, 336, 336, 336, 336, + 336, 336, 336, nil, 336, 336, 336, nil, 336, 336, + nil, 336, 336, 336, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 336, nil, nil, 336, nil, nil, 336, + 336, nil, nil, 336, nil, nil, nil, nil, nil, 336, + nil, nil, nil, nil, nil, nil, nil, 336, nil, nil, + nil, nil, 336, 336, 336, 336, 336, 336, nil, nil, + nil, 336, 336, nil, nil, nil, nil, nil, nil, 336, + nil, nil, 336, 336, 336, nil, 336, 336, nil, nil, + 336, 336, 337, 337, 337, nil, 337, nil, nil, nil, + 337, 337, nil, nil, nil, 337, nil, 337, 337, 337, + 337, 337, 337, 337, nil, nil, nil, nil, nil, 337, + 337, 337, 337, 337, 337, 337, nil, nil, 337, nil, + nil, nil, nil, nil, nil, 337, nil, nil, 337, 337, + 337, 337, 337, 337, 337, 337, nil, 337, 337, 337, + nil, 337, 337, nil, 337, 337, 337, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 337, nil, nil, 337, + nil, nil, 337, 337, nil, nil, 337, nil, nil, nil, + nil, nil, 337, nil, nil, nil, nil, nil, nil, nil, + 337, nil, nil, nil, nil, 337, 337, 337, 337, 337, + 337, nil, nil, nil, 337, 337, nil, nil, nil, nil, + nil, nil, 337, nil, nil, 337, 337, 337, nil, 337, + 337, nil, nil, 337, 337, 343, 343, 343, 343, 343, + nil, nil, nil, 343, 343, nil, nil, nil, 343, nil, + 343, 343, 343, 343, 343, 343, 343, nil, nil, nil, + nil, nil, 343, 343, 343, 343, 343, 343, 343, nil, + nil, 343, nil, nil, nil, nil, nil, 343, 343, nil, + 343, 343, 343, 343, 343, 343, 343, 343, 343, nil, + 343, 343, 343, nil, 343, 343, nil, 343, 343, 343, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 343, + nil, nil, 343, nil, nil, 343, 343, nil, nil, 343, + nil, 343, nil, nil, nil, 343, nil, nil, nil, nil, + nil, nil, nil, 343, nil, nil, nil, nil, 343, 343, + 343, 343, 343, 343, nil, nil, nil, 343, 343, nil, + nil, nil, nil, nil, nil, 343, nil, nil, 343, 343, + 343, nil, 343, 343, nil, nil, 343, 343, 379, 379, + 379, nil, 379, nil, nil, nil, 379, 379, nil, nil, + nil, 379, nil, 379, 379, 379, 379, 379, 379, 379, + nil, nil, nil, nil, nil, 379, 379, 379, 379, 379, + 379, 379, nil, nil, 379, nil, nil, nil, nil, nil, + nil, 379, nil, nil, 379, 379, 379, 379, 379, 379, + 379, 379, nil, 379, 379, 379, nil, 379, 379, nil, + 379, 379, 379, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 379, nil, nil, 379, nil, nil, 379, 379, + nil, nil, 379, nil, nil, nil, nil, nil, 379, nil, + nil, nil, nil, nil, nil, nil, 379, nil, nil, nil, + nil, 379, 379, 379, 379, 379, 379, nil, nil, nil, + 379, 379, nil, nil, nil, nil, nil, nil, 379, nil, + nil, 379, 379, 379, nil, 379, 379, nil, nil, 379, + 379, 381, 381, 381, nil, 381, nil, nil, nil, 381, + 381, nil, nil, nil, 381, nil, 381, 381, 381, 381, + 381, 381, 381, nil, nil, nil, nil, nil, 381, 381, + 381, 381, 381, 381, 381, nil, nil, 381, nil, nil, + nil, nil, nil, nil, 381, nil, nil, 381, 381, 381, + 381, 381, 381, 381, 381, nil, 381, 381, 381, nil, + 381, 381, nil, 381, 381, 381, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 381, nil, nil, 381, 381, + nil, 381, 381, nil, nil, 381, nil, nil, nil, nil, + nil, 381, nil, nil, nil, nil, nil, nil, nil, 381, + nil, nil, nil, nil, 381, 381, 381, 381, 381, 381, + nil, nil, nil, 381, 381, nil, nil, nil, nil, nil, + nil, 381, nil, nil, 381, 381, 381, nil, 381, 381, + nil, nil, 381, 381, 389, 389, 389, nil, 389, nil, + nil, nil, 389, 389, nil, nil, nil, 389, nil, 389, + 389, 389, 389, 389, 389, 389, nil, nil, nil, nil, + nil, 389, 389, 389, 389, 389, 389, 389, nil, nil, + 389, nil, nil, nil, nil, nil, nil, 389, nil, nil, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, nil, 389, 389, nil, 389, 389, 389, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 389, nil, + nil, 389, nil, nil, 389, 389, nil, nil, 389, nil, + nil, nil, nil, nil, 389, nil, nil, nil, nil, nil, + nil, nil, 389, nil, nil, nil, nil, 389, 389, 389, + 389, 389, 389, nil, nil, nil, 389, 389, nil, nil, + nil, nil, nil, nil, 389, nil, 389, 389, 389, 389, + nil, 389, 389, nil, nil, 389, 389, 394, 394, 394, + nil, 394, nil, nil, nil, 394, 394, nil, nil, nil, + 394, nil, 394, 394, 394, 394, 394, 394, 394, nil, + nil, nil, nil, nil, 394, 394, 394, 394, 394, 394, + 394, nil, nil, 394, nil, nil, nil, nil, nil, nil, + 394, nil, nil, 394, 394, 394, 394, 394, 394, 394, + 394, nil, 394, 394, 394, nil, 394, 394, nil, 394, + 394, 394, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 394, nil, nil, 394, nil, nil, 394, 394, nil, + nil, 394, nil, nil, nil, nil, nil, 394, nil, nil, + nil, nil, nil, nil, nil, 394, nil, nil, nil, nil, + 394, 394, 394, 394, 394, 394, nil, nil, nil, 394, + 394, nil, nil, nil, nil, nil, nil, 394, nil, nil, + 394, 394, 394, nil, 394, 394, nil, nil, 394, 394, + 415, 415, 415, nil, 415, nil, nil, nil, 415, 415, + nil, nil, nil, 415, nil, 415, 415, 415, 415, 415, + 415, 415, nil, nil, nil, nil, nil, 415, 415, 415, + 415, 415, 415, 415, nil, nil, 415, nil, nil, nil, + nil, nil, nil, 415, nil, nil, 415, 415, 415, 415, + 415, 415, 415, 415, nil, 415, 415, 415, nil, 415, + 415, nil, 415, 415, 415, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 415, nil, nil, 415, nil, nil, + 415, 415, nil, nil, 415, nil, nil, nil, nil, nil, + 415, nil, nil, nil, nil, nil, nil, nil, 415, nil, + nil, nil, nil, 415, 415, 415, 415, 415, 415, nil, + nil, nil, 415, 415, nil, nil, nil, nil, nil, nil, + 415, nil, nil, 415, 415, 415, nil, 415, 415, nil, + nil, 415, 415, 461, 461, 461, nil, 461, nil, nil, + nil, 461, 461, nil, nil, nil, 461, nil, 461, 461, + 461, 461, 461, 461, 461, nil, nil, nil, nil, nil, + 461, 461, 461, 461, 461, 461, 461, nil, nil, 461, + nil, nil, nil, nil, nil, nil, 461, nil, nil, 461, + 461, 461, 461, 461, 461, 461, 461, nil, 461, 461, + 461, nil, 461, 461, nil, 461, 461, 461, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 461, nil, nil, + 461, nil, nil, 461, 461, nil, nil, 461, nil, nil, + nil, nil, nil, 461, nil, nil, nil, nil, nil, nil, + nil, 461, nil, nil, nil, nil, 461, 461, 461, 461, + 461, 461, nil, nil, nil, 461, 461, nil, nil, nil, + nil, nil, nil, 461, nil, nil, 461, 461, 461, 495, + 461, 461, nil, nil, 461, 461, 495, 495, 495, nil, + nil, 495, 495, 495, 1284, 495, 1284, 1284, 1284, 1284, + 1284, nil, nil, 495, 495, 495, 495, 495, nil, nil, + 1284, nil, nil, nil, nil, 495, 495, nil, 495, 495, + 495, 495, 495, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1284, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1284, 1284, nil, 495, 495, 495, 495, + 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, + nil, nil, 495, 495, 495, nil, nil, 495, nil, nil, + 495, nil, nil, 495, 495, nil, 495, 1284, 495, nil, + 495, nil, 495, 495, 495, 495, 495, 495, 495, nil, + 495, 495, 495, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 495, 495, 495, 495, nil, + 495, 496, 495, nil, nil, nil, nil, 495, 496, 496, + 496, 495, nil, 496, 496, 496, nil, 496, nil, nil, + nil, nil, nil, nil, nil, 496, 496, 496, 496, 496, + nil, nil, nil, nil, nil, nil, nil, 496, 496, nil, + 496, 496, 496, 496, 496, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 496, 496, + 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, + 496, 496, nil, nil, 496, 496, 496, nil, nil, 496, + nil, nil, 496, nil, nil, 496, 496, nil, 496, nil, + 496, nil, 496, nil, 496, 496, 496, 496, 496, 496, + 496, nil, 496, 496, 496, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 496, 496, 496, + 496, nil, 496, nil, 496, nil, 497, 497, 497, 496, + 497, nil, nil, 496, 497, 497, nil, nil, nil, 497, + nil, 497, 497, 497, 497, 497, 497, 497, nil, nil, + nil, nil, nil, 497, 497, 497, 497, 497, 497, 497, + nil, nil, 497, nil, nil, nil, nil, nil, nil, 497, + nil, nil, 497, 497, 497, 497, 497, 497, 497, 497, + nil, 497, 497, 497, nil, 497, 497, nil, 497, 497, + 497, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 497, nil, nil, 497, nil, nil, 497, 497, nil, nil, + 497, nil, nil, nil, nil, nil, 497, nil, nil, nil, + nil, nil, nil, nil, 497, nil, nil, nil, nil, 497, + 497, 497, 497, 497, 497, nil, nil, nil, 497, 497, + nil, nil, nil, nil, nil, nil, 497, nil, nil, 497, + 497, 497, nil, 497, 497, nil, nil, 497, 497, 523, + 523, 523, nil, 523, nil, nil, nil, 523, 523, nil, + nil, nil, 523, nil, 523, 523, 523, 523, 523, 523, + 523, nil, nil, nil, nil, nil, 523, 523, 523, 523, + 523, 523, 523, nil, nil, 523, nil, nil, nil, nil, + nil, nil, 523, nil, nil, 523, 523, 523, 523, 523, + 523, 523, 523, nil, 523, 523, 523, nil, 523, 523, + nil, 523, 523, 523, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 523, nil, nil, 523, nil, nil, 523, + 523, nil, nil, 523, nil, nil, nil, nil, nil, 523, + nil, nil, nil, nil, nil, nil, nil, 523, nil, nil, + nil, nil, 523, 523, 523, 523, 523, 523, nil, nil, + nil, 523, 523, nil, nil, nil, nil, nil, nil, 523, + nil, nil, 523, 523, 523, nil, 523, 523, nil, nil, + 523, 523, 536, 536, 536, nil, 536, nil, nil, nil, + 536, 536, nil, nil, nil, 536, nil, 536, 536, 536, + 536, 536, 536, 536, nil, nil, nil, nil, nil, 536, + 536, 536, 536, 536, 536, 536, nil, nil, 536, nil, + nil, nil, nil, nil, nil, 536, nil, nil, 536, 536, + 536, 536, 536, 536, 536, 536, nil, 536, 536, 536, + nil, 536, 536, nil, 536, 536, 536, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 536, nil, nil, 536, + nil, nil, 536, 536, nil, nil, 536, nil, nil, nil, + nil, nil, 536, nil, nil, nil, nil, nil, nil, nil, + 536, nil, nil, nil, nil, 536, 536, 536, 536, 536, + 536, nil, nil, nil, 536, 536, nil, nil, nil, nil, + nil, nil, 536, nil, nil, 536, 536, 536, nil, 536, + 536, nil, nil, 536, 536, 546, 546, 546, nil, 546, + nil, nil, nil, 546, 546, nil, nil, nil, 546, nil, + 546, 546, 546, 546, 546, 546, 546, nil, nil, nil, + nil, nil, 546, 546, 546, 546, 546, 546, 546, nil, + nil, 546, nil, nil, nil, nil, nil, nil, 546, nil, + nil, 546, 546, 546, 546, 546, 546, 546, 546, 546, + 546, 546, 546, nil, 546, 546, nil, 546, 546, 546, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 546, + nil, nil, 546, nil, nil, 546, 546, nil, nil, 546, + nil, 546, nil, 546, nil, 546, nil, nil, nil, nil, + nil, nil, nil, 546, nil, nil, nil, nil, 546, 546, + 546, 546, 546, 546, nil, nil, nil, 546, 546, nil, + nil, nil, nil, nil, nil, 546, nil, 546, 546, 546, + 546, nil, 546, 546, nil, nil, 546, 546, 548, 548, + 548, nil, 548, nil, nil, nil, 548, 548, nil, nil, + nil, 548, nil, 548, 548, 548, 548, 548, 548, 548, + nil, nil, nil, nil, nil, 548, 548, 548, 548, 548, + 548, 548, nil, nil, 548, nil, nil, nil, nil, nil, + nil, 548, nil, nil, 548, 548, 548, 548, 548, 548, + 548, 548, nil, 548, 548, 548, nil, 548, 548, nil, + 548, 548, 548, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 548, nil, nil, 548, nil, nil, 548, 548, + nil, nil, 548, nil, nil, nil, nil, nil, 548, nil, + nil, nil, nil, nil, nil, nil, 548, nil, nil, nil, + nil, 548, 548, 548, 548, 548, 548, nil, nil, nil, + 548, 548, nil, nil, nil, nil, nil, nil, 548, nil, + nil, 548, 548, 548, nil, 548, 548, nil, nil, 548, + 548, 549, 549, 549, nil, 549, nil, nil, nil, 549, + 549, nil, nil, nil, 549, nil, 549, 549, 549, 549, + 549, 549, 549, nil, nil, nil, nil, nil, 549, 549, + 549, 549, 549, 549, 549, nil, nil, 549, nil, nil, + nil, nil, nil, nil, 549, nil, nil, 549, 549, 549, + 549, 549, 549, 549, 549, nil, 549, 549, 549, nil, + 549, 549, nil, 549, 549, 549, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 549, nil, nil, 549, nil, + nil, 549, 549, nil, nil, 549, nil, nil, nil, nil, + nil, 549, nil, nil, nil, nil, nil, nil, nil, 549, + nil, nil, nil, nil, 549, 549, 549, 549, 549, 549, + nil, nil, nil, 549, 549, nil, nil, nil, nil, nil, + nil, 549, nil, nil, 549, 549, 549, nil, 549, 549, + nil, nil, 549, 549, 550, 550, 550, nil, 550, nil, + nil, nil, 550, 550, nil, nil, nil, 550, nil, 550, + 550, 550, 550, 550, 550, 550, nil, nil, nil, nil, + nil, 550, 550, 550, 550, 550, 550, 550, nil, nil, + 550, nil, nil, nil, nil, nil, nil, 550, nil, nil, + 550, 550, 550, 550, 550, 550, 550, 550, nil, 550, + 550, 550, nil, 550, 550, nil, 550, 550, 550, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 550, nil, + nil, 550, nil, nil, 550, 550, nil, nil, 550, nil, + nil, nil, nil, nil, 550, nil, nil, nil, nil, nil, + nil, nil, 550, nil, nil, nil, nil, 550, 550, 550, + 550, 550, 550, nil, nil, nil, 550, 550, nil, nil, + nil, nil, nil, nil, 550, nil, nil, 550, 550, 550, + nil, 550, 550, nil, nil, 550, 550, 581, 581, 581, + nil, 581, nil, nil, nil, 581, 581, nil, nil, nil, + 581, nil, 581, 581, 581, 581, 581, 581, 581, nil, + nil, nil, nil, nil, 581, 581, 581, 581, 581, 581, + 581, nil, nil, 581, nil, nil, nil, nil, nil, nil, + 581, nil, nil, 581, 581, 581, 581, 581, 581, 581, + 581, nil, 581, 581, 581, nil, 581, 581, nil, 581, + 581, 581, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 581, nil, nil, 581, nil, nil, 581, 581, nil, + nil, 581, nil, nil, nil, nil, nil, 581, nil, nil, + nil, nil, nil, nil, nil, 581, nil, nil, nil, nil, + 581, 581, 581, 581, 581, 581, nil, nil, nil, 581, + 581, nil, nil, nil, nil, nil, nil, 581, nil, nil, + 581, 581, 581, 584, 581, 581, nil, nil, 581, 581, + 584, 584, 584, nil, nil, 584, 584, 584, nil, 584, + 993, 993, 993, 993, nil, nil, nil, 584, 584, 584, + nil, nil, nil, nil, nil, nil, 993, 993, 993, 584, + 584, nil, 584, 584, 584, 584, 584, nil, nil, 993, + 993, nil, nil, nil, 993, nil, nil, nil, nil, nil, + 746, nil, 746, 746, 746, 746, 746, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 746, nil, nil, nil, + nil, 584, nil, nil, nil, nil, nil, nil, 584, nil, + nil, nil, nil, 584, 584, nil, nil, nil, 746, nil, + nil, nil, nil, 993, 993, 993, 993, 993, 993, 746, + 746, nil, 993, 993, nil, 584, 584, nil, nil, nil, + 993, nil, nil, 993, 993, 993, nil, 993, 993, 584, + nil, 589, 589, 589, 584, 589, nil, nil, nil, 589, + 589, 584, nil, 746, 589, 584, 589, 589, 589, 589, + 589, 589, 589, 746, nil, nil, nil, nil, 589, 589, + 589, 589, 589, 589, 589, nil, nil, 589, nil, nil, + nil, nil, nil, nil, 589, nil, nil, 589, 589, 589, + 589, 589, 589, 589, 589, nil, 589, 589, 589, nil, + 589, 589, nil, 589, 589, 589, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 589, nil, nil, 589, nil, + nil, 589, 589, nil, nil, 589, nil, nil, nil, nil, + nil, 589, nil, nil, nil, nil, nil, nil, nil, 589, + nil, nil, nil, nil, 589, 589, 589, 589, 589, 589, + nil, nil, nil, 589, 589, nil, nil, nil, nil, nil, + nil, 589, nil, nil, 589, 589, 589, nil, 589, 589, + nil, nil, 589, 589, 599, 599, 599, nil, 599, nil, + nil, nil, 599, 599, nil, nil, nil, 599, nil, 599, + 599, 599, 599, 599, 599, 599, nil, nil, nil, nil, + nil, 599, 599, 599, 599, 599, 599, 599, nil, nil, + 599, nil, nil, nil, nil, nil, nil, 599, nil, nil, + 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, nil, 599, 599, nil, 599, 599, 599, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 599, nil, + nil, 599, nil, nil, 599, 599, nil, nil, 599, nil, + 599, nil, 599, nil, 599, nil, nil, nil, nil, nil, + nil, nil, 599, nil, nil, nil, nil, 599, 599, 599, + 599, 599, 599, nil, nil, nil, 599, 599, nil, nil, + nil, nil, nil, nil, 599, nil, 599, 599, 599, 599, + nil, 599, 599, nil, nil, 599, 599, 602, 602, 602, + nil, 602, nil, nil, nil, 602, 602, nil, nil, nil, + 602, nil, 602, 602, 602, 602, 602, 602, 602, nil, + nil, nil, nil, nil, 602, 602, 602, 602, 602, 602, + 602, nil, nil, 602, nil, nil, nil, nil, nil, nil, + 602, nil, nil, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, nil, 602, 602, nil, 602, + 602, 602, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 602, nil, nil, 602, nil, nil, 602, 602, nil, + nil, 602, nil, nil, nil, 602, nil, 602, nil, nil, + nil, nil, nil, nil, nil, 602, nil, nil, nil, nil, + 602, 602, 602, 602, 602, 602, nil, nil, nil, 602, + 602, nil, nil, nil, nil, nil, nil, 602, nil, 602, + 602, 602, 602, nil, 602, 602, nil, nil, 602, 602, + 604, 604, 604, nil, 604, nil, nil, nil, 604, 604, + nil, nil, nil, 604, nil, 604, 604, 604, 604, 604, + 604, 604, nil, nil, nil, nil, nil, 604, 604, 604, + 604, 604, 604, 604, nil, nil, 604, nil, nil, nil, + nil, nil, nil, 604, nil, nil, 604, 604, 604, 604, + 604, 604, 604, 604, nil, 604, 604, 604, nil, 604, + 604, nil, 604, 604, 604, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 604, nil, nil, 604, nil, nil, + 604, 604, nil, nil, 604, nil, nil, nil, nil, nil, + 604, nil, nil, nil, nil, nil, nil, nil, 604, nil, + nil, nil, nil, 604, 604, 604, 604, 604, 604, nil, + nil, nil, 604, 604, nil, nil, nil, nil, nil, nil, + 604, nil, nil, 604, 604, 604, nil, 604, 604, nil, + nil, 604, 604, 610, 610, 610, 610, 610, nil, nil, + nil, 610, 610, nil, nil, nil, 610, nil, 610, 610, + 610, 610, 610, 610, 610, nil, nil, nil, nil, nil, + 610, 610, 610, 610, 610, 610, 610, nil, nil, 610, + nil, nil, nil, nil, nil, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 610, 610, 610, nil, 610, 610, + 610, nil, 610, 610, nil, 610, 610, 610, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 610, nil, nil, + 610, nil, nil, 610, 610, nil, nil, 610, nil, 610, + nil, nil, nil, 610, nil, nil, nil, nil, nil, nil, + nil, 610, nil, nil, nil, nil, 610, 610, 610, 610, + 610, 610, nil, nil, nil, 610, 610, nil, nil, nil, + nil, nil, 610, 610, nil, nil, 610, 610, 610, nil, + 610, 610, nil, nil, 610, 610, 620, 620, 620, nil, + 620, nil, nil, nil, 620, 620, nil, nil, nil, 620, + nil, 620, 620, 620, 620, 620, 620, 620, nil, nil, + nil, nil, nil, 620, 620, 620, 620, 620, 620, 620, + nil, nil, 620, nil, nil, nil, nil, nil, nil, 620, + nil, nil, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, nil, 620, 620, nil, 620, 620, + 620, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 620, nil, nil, 620, nil, nil, 620, 620, nil, nil, + 620, nil, 620, nil, 620, nil, 620, nil, nil, nil, + nil, nil, nil, nil, 620, nil, nil, nil, nil, 620, + 620, 620, 620, 620, 620, nil, nil, nil, 620, 620, + nil, nil, nil, nil, nil, nil, 620, nil, 620, 620, + 620, 620, nil, 620, 620, nil, nil, 620, 620, 630, + 630, 630, nil, 630, nil, nil, nil, 630, 630, nil, + nil, nil, 630, nil, 630, 630, 630, 630, 630, 630, + 630, nil, nil, nil, nil, nil, 630, 630, 630, 630, + 630, 630, 630, nil, nil, 630, nil, nil, nil, nil, + nil, nil, 630, nil, nil, 630, 630, 630, 630, 630, + 630, 630, 630, nil, 630, 630, 630, nil, 630, 630, + nil, 630, 630, 630, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 630, nil, nil, 630, nil, nil, 630, + 630, nil, nil, 630, nil, nil, nil, nil, nil, 630, + nil, nil, nil, nil, nil, nil, nil, 630, nil, nil, + nil, nil, 630, 630, 630, 630, 630, 630, nil, nil, + nil, 630, 630, nil, nil, nil, nil, nil, nil, 630, + nil, nil, 630, 630, 630, nil, 630, 630, nil, nil, + 630, 630, 633, 633, 633, nil, 633, nil, nil, nil, + 633, 633, nil, nil, nil, 633, nil, 633, 633, 633, + 633, 633, 633, 633, nil, nil, nil, nil, nil, 633, + 633, 633, 633, 633, 633, 633, nil, nil, 633, nil, + nil, nil, nil, nil, nil, 633, nil, nil, 633, 633, + 633, 633, 633, 633, 633, 633, nil, 633, 633, 633, + nil, 633, 633, nil, 633, 633, 633, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 633, nil, nil, 633, + nil, nil, 633, 633, nil, nil, 633, nil, nil, nil, + nil, nil, 633, nil, nil, nil, nil, nil, nil, nil, + 633, nil, nil, nil, nil, 633, 633, 633, 633, 633, + 633, nil, nil, nil, 633, 633, nil, nil, nil, nil, + nil, nil, 633, nil, nil, 633, 633, 633, nil, 633, + 633, nil, nil, 633, 633, 636, 636, 636, nil, 636, + nil, nil, nil, 636, 636, nil, nil, nil, 636, nil, + 636, 636, 636, 636, 636, 636, 636, nil, nil, nil, + nil, nil, 636, 636, 636, 636, 636, 636, 636, nil, + nil, 636, nil, nil, nil, nil, nil, nil, 636, nil, + nil, 636, 636, 636, 636, 636, 636, 636, 636, nil, + 636, 636, 636, nil, 636, 636, nil, 636, 636, 636, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 636, + nil, nil, 636, nil, nil, 636, 636, nil, nil, 636, + nil, nil, nil, nil, nil, 636, nil, nil, nil, nil, + nil, nil, nil, 636, nil, nil, nil, nil, 636, 636, + 636, 636, 636, 636, nil, nil, nil, 636, 636, nil, + nil, nil, nil, nil, nil, 636, nil, nil, 636, 636, + 636, nil, 636, 636, nil, nil, 636, 636, 641, 641, + 641, nil, 641, nil, nil, nil, 641, 641, nil, nil, + nil, 641, nil, 641, 641, 641, 641, 641, 641, 641, + nil, nil, nil, nil, nil, 641, 641, 641, 641, 641, + 641, 641, nil, nil, 641, nil, nil, nil, nil, nil, + nil, 641, nil, nil, 641, 641, 641, 641, 641, 641, + 641, 641, 641, 641, 641, 641, nil, 641, 641, nil, + 641, 641, 641, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 641, nil, nil, 641, nil, nil, 641, 641, + nil, nil, 641, nil, 641, nil, nil, nil, 641, nil, + nil, nil, nil, nil, nil, nil, 641, nil, nil, nil, + nil, 641, 641, 641, 641, 641, 641, nil, nil, nil, + 641, 641, nil, nil, nil, nil, nil, nil, 641, nil, + 641, 641, 641, 641, nil, 641, 641, nil, nil, 641, + 641, 644, 644, 644, nil, 644, nil, nil, nil, 644, + 644, nil, nil, nil, 644, nil, 644, 644, 644, 644, + 644, 644, 644, nil, nil, nil, nil, nil, 644, 644, + 644, 644, 644, 644, 644, nil, nil, 644, nil, nil, + nil, nil, nil, nil, 644, nil, nil, 644, 644, 644, + 644, 644, 644, 644, 644, 644, 644, 644, 644, nil, + 644, 644, nil, 644, 644, 644, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 644, nil, nil, 644, nil, + nil, 644, 644, nil, nil, 644, nil, nil, nil, nil, + nil, 644, nil, nil, nil, nil, nil, nil, nil, 644, + nil, nil, nil, nil, 644, 644, 644, 644, 644, 644, + nil, nil, nil, 644, 644, nil, nil, nil, nil, nil, + nil, 644, nil, 644, 644, 644, 644, nil, 644, 644, + nil, nil, 644, 644, 661, 661, 661, nil, 661, nil, + nil, nil, 661, 661, nil, nil, nil, 661, nil, 661, + 661, 661, 661, 661, 661, 661, nil, nil, nil, nil, + nil, 661, 661, 661, 661, 661, 661, 661, nil, nil, + 661, nil, nil, nil, nil, nil, nil, 661, nil, nil, + 661, 661, 661, 661, 661, 661, 661, 661, nil, 661, + 661, 661, nil, 661, 661, nil, 661, 661, 661, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 661, nil, + nil, 661, nil, nil, 661, 661, nil, nil, 661, nil, + 661, nil, nil, nil, 661, nil, nil, nil, nil, nil, + nil, nil, 661, nil, nil, nil, nil, 661, 661, 661, + 661, 661, 661, nil, nil, nil, 661, 661, nil, nil, + nil, nil, nil, nil, 661, nil, nil, 661, 661, 661, + nil, 661, 661, nil, nil, 661, 661, 662, 662, 662, + nil, 662, nil, nil, nil, 662, 662, nil, nil, nil, + 662, nil, 662, 662, 662, 662, 662, 662, 662, nil, + nil, nil, nil, nil, 662, 662, 662, 662, 662, 662, + 662, nil, nil, 662, nil, nil, nil, nil, nil, nil, + 662, nil, nil, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, nil, 662, 662, nil, 662, + 662, 662, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 662, nil, nil, 662, nil, nil, 662, 662, nil, + nil, 662, nil, 662, nil, 662, nil, 662, nil, nil, + nil, nil, nil, nil, nil, 662, nil, nil, nil, nil, + 662, 662, 662, 662, 662, 662, nil, nil, nil, 662, + 662, nil, nil, nil, nil, nil, nil, 662, nil, 662, + 662, 662, 662, nil, 662, 662, nil, nil, 662, 662, + 672, 672, 672, nil, 672, nil, nil, nil, 672, 672, + nil, nil, nil, 672, nil, 672, 672, 672, 672, 672, + 672, 672, nil, nil, nil, nil, nil, 672, 672, 672, + 672, 672, 672, 672, nil, nil, 672, nil, nil, nil, + nil, nil, nil, 672, nil, nil, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, nil, 672, + 672, nil, 672, 672, 672, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 672, nil, nil, 672, nil, nil, + 672, 672, nil, nil, 672, nil, 672, nil, 672, nil, + 672, nil, nil, nil, nil, nil, nil, nil, 672, nil, + nil, nil, nil, 672, 672, 672, 672, 672, 672, nil, + nil, nil, 672, 672, nil, nil, nil, nil, nil, nil, + 672, nil, 672, 672, 672, 672, nil, 672, 672, nil, + nil, 672, 672, 708, 708, 708, 708, 708, nil, nil, + nil, 708, 708, nil, nil, nil, 708, nil, 708, 708, + 708, 708, 708, 708, 708, nil, nil, nil, nil, nil, + 708, 708, 708, 708, 708, 708, 708, nil, nil, 708, + nil, nil, nil, nil, nil, 708, 708, nil, 708, 708, + 708, 708, 708, 708, 708, 708, 708, nil, 708, 708, + 708, nil, 708, 708, nil, 708, 708, 708, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 708, nil, nil, + 708, nil, nil, 708, 708, nil, nil, 708, nil, 708, + nil, nil, nil, 708, nil, nil, nil, nil, nil, nil, + nil, 708, nil, nil, nil, nil, 708, 708, 708, 708, + 708, 708, nil, nil, nil, 708, 708, nil, nil, nil, + nil, nil, nil, 708, nil, nil, 708, 708, 708, nil, + 708, 708, nil, nil, 708, 708, 710, 710, 710, nil, + 710, nil, nil, nil, 710, 710, nil, nil, nil, 710, + nil, 710, 710, 710, 710, 710, 710, 710, nil, nil, + nil, nil, nil, 710, 710, 710, 710, 710, 710, 710, + nil, nil, 710, nil, nil, nil, nil, nil, nil, 710, + nil, nil, 710, 710, 710, 710, 710, 710, 710, 710, + nil, 710, 710, 710, nil, 710, 710, nil, 710, 710, + 710, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 710, nil, nil, 710, nil, nil, 710, 710, nil, nil, + 710, nil, 710, nil, nil, nil, 710, nil, nil, nil, + nil, nil, nil, nil, 710, nil, nil, nil, nil, 710, + 710, 710, 710, 710, 710, nil, nil, nil, 710, 710, + nil, nil, nil, nil, nil, nil, 710, nil, nil, 710, + 710, 710, nil, 710, 710, nil, nil, 710, 710, 711, + 711, 711, nil, 711, nil, nil, nil, 711, 711, nil, + nil, nil, 711, nil, 711, 711, 711, 711, 711, 711, + 711, nil, nil, nil, nil, nil, 711, 711, 711, 711, + 711, 711, 711, nil, nil, 711, nil, nil, nil, nil, + nil, nil, 711, nil, nil, 711, 711, 711, 711, 711, + 711, 711, 711, nil, 711, 711, 711, nil, 711, 711, + nil, 711, 711, 711, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 711, nil, nil, 711, nil, nil, 711, + 711, nil, nil, 711, nil, nil, nil, nil, nil, 711, + nil, nil, nil, nil, nil, nil, nil, 711, nil, nil, + nil, nil, 711, 711, 711, 711, 711, 711, nil, nil, + nil, 711, 711, nil, nil, nil, nil, nil, nil, 711, + nil, nil, 711, 711, 711, nil, 711, 711, nil, nil, + 711, 711, 712, 712, 712, nil, 712, nil, nil, nil, + 712, 712, nil, nil, nil, 712, nil, 712, 712, 712, + 712, 712, 712, 712, nil, nil, nil, nil, nil, 712, + 712, 712, 712, 712, 712, 712, nil, nil, 712, nil, + nil, nil, nil, nil, nil, 712, nil, nil, 712, 712, + 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + nil, 712, 712, nil, 712, 712, 712, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 712, nil, nil, 712, + nil, nil, 712, 712, nil, nil, 712, nil, 712, nil, + 712, nil, 712, nil, nil, nil, nil, nil, nil, nil, + 712, nil, nil, nil, nil, 712, 712, 712, 712, 712, + 712, nil, nil, nil, 712, 712, nil, nil, nil, nil, + nil, nil, 712, nil, 712, 712, 712, 712, nil, 712, + 712, nil, nil, 712, 712, 715, 715, 715, 715, 715, + nil, nil, nil, 715, 715, nil, nil, nil, 715, nil, + 715, 715, 715, 715, 715, 715, 715, nil, nil, nil, + nil, nil, 715, 715, 715, 715, 715, 715, 715, nil, + nil, 715, nil, nil, nil, nil, nil, 715, 715, nil, + 715, 715, 715, 715, 715, 715, 715, 715, 715, nil, + 715, 715, 715, nil, 715, 715, nil, 715, 715, 715, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 715, + nil, nil, 715, nil, nil, 715, 715, nil, nil, 715, + nil, 715, nil, nil, nil, 715, nil, nil, nil, nil, + nil, nil, nil, 715, nil, nil, nil, nil, 715, 715, + 715, 715, 715, 715, nil, nil, nil, 715, 715, nil, + nil, nil, nil, nil, nil, 715, nil, nil, 715, 715, + 715, nil, 715, 715, nil, nil, 715, 715, 716, 716, + 716, nil, 716, nil, nil, nil, 716, 716, nil, nil, + nil, 716, nil, 716, 716, 716, 716, 716, 716, 716, + nil, nil, nil, nil, nil, 716, 716, 716, 716, 716, + 716, 716, nil, nil, 716, nil, nil, nil, nil, nil, + nil, 716, nil, nil, 716, 716, 716, 716, 716, 716, + 716, 716, nil, 716, 716, 716, nil, 716, 716, nil, + 716, 716, 716, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 716, nil, nil, 716, nil, nil, 716, 716, + nil, nil, 716, nil, nil, nil, nil, nil, 716, nil, + nil, nil, nil, nil, nil, nil, 716, nil, nil, nil, + nil, 716, 716, 716, 716, 716, 716, nil, nil, nil, + 716, 716, nil, nil, nil, nil, nil, nil, 716, nil, + nil, 716, 716, 716, nil, 716, 716, nil, nil, 716, + 716, 718, 718, 718, nil, 718, nil, nil, nil, 718, + 718, nil, nil, nil, 718, nil, 718, 718, 718, 718, + 718, 718, 718, nil, nil, nil, nil, nil, 718, 718, + 718, 718, 718, 718, 718, nil, nil, 718, nil, nil, + nil, nil, nil, nil, 718, nil, nil, 718, 718, 718, + 718, 718, 718, 718, 718, 718, 718, 718, 718, nil, + 718, 718, nil, 718, 718, 718, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 718, nil, nil, 718, nil, + nil, 718, 718, nil, nil, 718, nil, 718, nil, 718, + nil, 718, nil, nil, nil, nil, nil, nil, nil, 718, + nil, nil, nil, nil, 718, 718, 718, 718, 718, 718, + nil, nil, nil, 718, 718, nil, nil, nil, nil, nil, + nil, 718, nil, 718, 718, 718, 718, nil, 718, 718, + nil, nil, 718, 718, 719, 719, 719, nil, 719, nil, + nil, nil, 719, 719, nil, nil, nil, 719, nil, 719, + 719, 719, 719, 719, 719, 719, nil, nil, nil, nil, + nil, 719, 719, 719, 719, 719, 719, 719, nil, nil, + 719, nil, nil, nil, nil, nil, nil, 719, nil, nil, + 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, + 719, 719, nil, 719, 719, nil, 719, 719, 719, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 719, nil, + nil, 719, nil, nil, 719, 719, nil, nil, 719, nil, + nil, nil, 719, nil, 719, nil, nil, nil, nil, nil, + nil, nil, 719, nil, nil, nil, nil, 719, 719, 719, + 719, 719, 719, nil, nil, nil, 719, 719, nil, nil, + nil, nil, nil, nil, 719, nil, 719, 719, 719, 719, + nil, 719, 719, nil, nil, 719, 719, 720, 720, 720, + nil, 720, nil, nil, nil, 720, 720, nil, nil, nil, + 720, nil, 720, 720, 720, 720, 720, 720, 720, nil, + nil, nil, nil, nil, 720, 720, 720, 720, 720, 720, + 720, nil, nil, 720, nil, nil, nil, nil, nil, nil, + 720, nil, nil, 720, 720, 720, 720, 720, 720, 720, + 720, nil, 720, 720, 720, nil, 720, 720, nil, 720, + 720, 720, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 720, nil, nil, 720, nil, nil, 720, 720, nil, + nil, 720, nil, nil, nil, nil, nil, 720, nil, nil, + nil, nil, nil, nil, nil, 720, nil, nil, nil, nil, + 720, 720, 720, 720, 720, 720, nil, nil, nil, 720, + 720, nil, nil, nil, nil, nil, nil, 720, nil, nil, + 720, 720, 720, nil, 720, 720, nil, nil, 720, 720, + 721, 721, 721, nil, 721, nil, nil, nil, 721, 721, + nil, nil, nil, 721, nil, 721, 721, 721, 721, 721, + 721, 721, nil, nil, nil, nil, nil, 721, 721, 721, + 721, 721, 721, 721, nil, nil, 721, nil, nil, nil, + nil, nil, nil, 721, nil, nil, 721, 721, 721, 721, + 721, 721, 721, 721, nil, 721, 721, 721, nil, 721, + 721, nil, 721, 721, 721, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 721, nil, nil, 721, nil, nil, + 721, 721, nil, nil, 721, nil, nil, nil, nil, nil, + 721, nil, nil, nil, nil, nil, nil, nil, 721, nil, + nil, nil, nil, 721, 721, 721, 721, 721, 721, nil, + nil, nil, 721, 721, nil, nil, nil, nil, nil, nil, + 721, nil, nil, 721, 721, 721, nil, 721, 721, nil, + nil, 721, 721, 726, 726, 726, nil, 726, nil, nil, + nil, 726, 726, nil, nil, nil, 726, nil, 726, 726, + 726, 726, 726, 726, 726, nil, nil, nil, nil, nil, + 726, 726, 726, 726, 726, 726, 726, nil, nil, 726, + nil, nil, nil, nil, nil, nil, 726, nil, nil, 726, + 726, 726, 726, 726, 726, 726, 726, nil, 726, 726, + 726, nil, 726, 726, nil, 726, 726, 726, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 726, nil, nil, + 726, nil, nil, 726, 726, nil, nil, 726, nil, nil, + nil, nil, nil, 726, nil, nil, nil, nil, nil, nil, + nil, 726, nil, nil, nil, nil, 726, 726, 726, 726, + 726, 726, nil, nil, nil, 726, 726, nil, nil, nil, + nil, nil, nil, 726, nil, nil, 726, 726, 726, nil, + 726, 726, nil, nil, 726, 726, 727, 727, 727, nil, + 727, nil, nil, nil, 727, 727, nil, nil, nil, 727, + nil, 727, 727, 727, 727, 727, 727, 727, nil, nil, + nil, nil, nil, 727, 727, 727, 727, 727, 727, 727, + nil, nil, 727, nil, nil, nil, nil, nil, nil, 727, + nil, nil, 727, 727, 727, 727, 727, 727, 727, 727, + nil, 727, 727, 727, nil, 727, 727, nil, 727, 727, + 727, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 727, nil, nil, 727, nil, nil, 727, 727, nil, nil, + 727, nil, nil, nil, nil, nil, 727, nil, nil, nil, + nil, nil, nil, nil, 727, nil, nil, nil, nil, 727, + 727, 727, 727, 727, 727, nil, nil, nil, 727, 727, + nil, nil, nil, nil, nil, nil, 727, nil, nil, 727, + 727, 727, nil, 727, 727, nil, nil, 727, 727, 734, + 734, 734, nil, 734, nil, nil, nil, 734, 734, nil, + nil, nil, 734, nil, 734, 734, 734, 734, 734, 734, + 734, nil, nil, nil, nil, nil, 734, 734, 734, 734, + 734, 734, 734, nil, nil, 734, nil, nil, nil, nil, + nil, nil, 734, nil, nil, 734, 734, 734, 734, 734, + 734, 734, 734, nil, 734, 734, 734, nil, 734, 734, + nil, 734, 734, 734, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 734, nil, nil, 734, nil, nil, 734, + 734, nil, nil, 734, nil, 734, nil, nil, nil, 734, + nil, nil, nil, nil, nil, nil, nil, 734, nil, nil, + nil, nil, 734, 734, 734, 734, 734, 734, nil, nil, + nil, 734, 734, nil, nil, nil, nil, nil, nil, 734, + nil, nil, 734, 734, 734, nil, 734, 734, nil, nil, + 734, 734, 749, 749, 749, nil, 749, nil, nil, nil, + 749, 749, nil, nil, nil, 749, nil, 749, 749, 749, + 749, 749, 749, 749, nil, nil, nil, nil, nil, 749, + 749, 749, 749, 749, 749, 749, nil, nil, 749, nil, + nil, nil, nil, nil, nil, 749, nil, nil, 749, 749, + 749, 749, 749, 749, 749, 749, nil, 749, 749, 749, + nil, 749, 749, nil, 749, 749, 749, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 749, nil, nil, 749, + nil, nil, 749, 749, nil, nil, 749, nil, nil, nil, + nil, nil, 749, nil, nil, nil, nil, nil, nil, nil, + 749, nil, nil, nil, nil, 749, 749, 749, 749, 749, + 749, nil, nil, nil, 749, 749, nil, nil, nil, nil, + nil, nil, 749, nil, nil, 749, 749, 749, nil, 749, + 749, nil, nil, 749, 749, 773, 773, 773, nil, 773, + nil, nil, nil, 773, 773, nil, nil, nil, 773, nil, + 773, 773, 773, 773, 773, 773, 773, nil, nil, nil, + nil, nil, 773, 773, 773, 773, 773, 773, 773, nil, + nil, 773, nil, nil, nil, nil, nil, nil, 773, nil, + nil, 773, 773, 773, 773, 773, 773, 773, 773, nil, + 773, 773, 773, nil, 773, 773, nil, 773, 773, 773, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 773, + nil, nil, 773, nil, nil, 773, 773, nil, nil, 773, + nil, nil, nil, nil, nil, 773, nil, nil, nil, nil, + nil, nil, nil, 773, nil, nil, nil, nil, 773, 773, + 773, 773, 773, 773, nil, nil, nil, 773, 773, nil, + nil, nil, nil, nil, nil, 773, nil, nil, 773, 773, + 773, nil, 773, 773, nil, nil, 773, 773, 774, 774, + 774, nil, 774, nil, nil, nil, 774, 774, nil, nil, + nil, 774, nil, 774, 774, 774, 774, 774, 774, 774, + nil, nil, nil, nil, nil, 774, 774, 774, 774, 774, + 774, 774, nil, nil, 774, nil, nil, nil, nil, nil, + nil, 774, nil, nil, 774, 774, 774, 774, 774, 774, + 774, 774, nil, 774, 774, 774, nil, 774, 774, nil, + 774, 774, 774, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 774, nil, nil, 774, nil, nil, 774, 774, + nil, nil, 774, nil, nil, nil, nil, nil, 774, nil, + nil, nil, nil, nil, nil, nil, 774, nil, nil, nil, + nil, 774, 774, 774, 774, 774, 774, nil, nil, nil, + 774, 774, nil, nil, nil, nil, nil, nil, 774, nil, + nil, 774, 774, 774, nil, 774, 774, nil, nil, 774, + 774, 829, 829, 829, nil, 829, nil, nil, nil, 829, + 829, nil, nil, nil, 829, nil, 829, 829, 829, 829, + 829, 829, 829, nil, nil, nil, nil, nil, 829, 829, + 829, 829, 829, 829, 829, nil, nil, 829, nil, nil, + nil, nil, nil, nil, 829, nil, nil, 829, 829, 829, + 829, 829, 829, 829, 829, 829, 829, 829, 829, nil, + 829, 829, nil, 829, 829, 829, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 829, nil, nil, 829, nil, + nil, 829, 829, nil, nil, 829, nil, 829, nil, 829, + nil, 829, nil, nil, nil, nil, nil, nil, nil, 829, + nil, nil, nil, nil, 829, 829, 829, 829, 829, 829, + nil, nil, nil, 829, 829, nil, nil, nil, nil, nil, + nil, 829, nil, 829, 829, 829, 829, nil, 829, 829, + nil, nil, 829, 829, 838, 838, 838, nil, 838, nil, + nil, nil, 838, 838, nil, nil, nil, 838, nil, 838, + 838, 838, 838, 838, 838, 838, nil, nil, nil, nil, + nil, 838, 838, 838, 838, 838, 838, 838, nil, nil, + 838, nil, nil, nil, nil, nil, nil, 838, nil, nil, + 838, 838, 838, 838, 838, 838, 838, 838, nil, 838, + 838, 838, nil, 838, 838, nil, 838, 838, 838, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 838, nil, + nil, 838, nil, nil, 838, 838, nil, nil, 838, nil, + nil, nil, nil, nil, 838, nil, nil, nil, nil, nil, + nil, nil, 838, nil, nil, nil, nil, 838, 838, 838, + 838, 838, 838, nil, nil, nil, 838, 838, nil, nil, + nil, nil, nil, nil, 838, nil, nil, 838, 838, 838, + nil, 838, 838, nil, nil, 838, 838, 841, 841, 841, + nil, 841, nil, nil, nil, 841, 841, nil, nil, nil, + 841, nil, 841, 841, 841, 841, 841, 841, 841, nil, + nil, nil, nil, nil, 841, 841, 841, 841, 841, 841, + 841, nil, nil, 841, nil, nil, nil, nil, nil, nil, + 841, nil, nil, 841, 841, 841, 841, 841, 841, 841, + 841, nil, 841, 841, 841, nil, 841, 841, nil, 841, + 841, 841, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 841, nil, nil, 841, nil, nil, 841, 841, nil, + nil, 841, nil, nil, nil, nil, nil, 841, nil, nil, + nil, nil, nil, nil, nil, 841, nil, nil, nil, nil, + 841, 841, 841, 841, 841, 841, nil, nil, nil, 841, + 841, nil, nil, nil, nil, nil, nil, 841, nil, nil, + 841, 841, 841, nil, 841, 841, nil, nil, 841, 841, + 879, 879, 879, nil, 879, nil, nil, nil, 879, 879, + nil, nil, nil, 879, nil, 879, 879, 879, 879, 879, + 879, 879, nil, nil, nil, nil, nil, 879, 879, 879, + 879, 879, 879, 879, nil, nil, 879, nil, nil, nil, + nil, nil, nil, 879, nil, nil, 879, 879, 879, 879, + 879, 879, 879, 879, nil, 879, 879, 879, nil, 879, + 879, nil, 879, 879, 879, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 879, nil, nil, 879, nil, nil, + 879, 879, nil, nil, 879, nil, nil, nil, nil, nil, + 879, nil, nil, nil, nil, nil, nil, nil, 879, nil, + nil, nil, nil, 879, 879, 879, 879, 879, 879, nil, + nil, nil, 879, 879, nil, nil, nil, nil, nil, nil, + 879, nil, nil, 879, 879, 879, nil, 879, 879, nil, + nil, 879, 879, 892, 892, 892, nil, 892, nil, nil, + nil, 892, 892, nil, nil, nil, 892, nil, 892, 892, + 892, 892, 892, 892, 892, nil, nil, nil, nil, nil, + 892, 892, 892, 892, 892, 892, 892, nil, nil, 892, + nil, nil, nil, nil, nil, nil, 892, nil, nil, 892, + 892, 892, 892, 892, 892, 892, 892, nil, 892, 892, + 892, nil, 892, 892, nil, 892, 892, 892, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 892, nil, nil, + 892, nil, nil, 892, 892, nil, nil, 892, nil, nil, + nil, nil, nil, 892, nil, nil, nil, nil, nil, nil, + nil, 892, nil, nil, nil, nil, 892, 892, 892, 892, + 892, 892, nil, nil, nil, 892, 892, nil, nil, nil, + nil, nil, nil, 892, nil, nil, 892, 892, 892, nil, + 892, 892, nil, nil, 892, 892, 908, 908, 908, nil, + 908, nil, nil, nil, 908, 908, nil, nil, nil, 908, + nil, 908, 908, 908, 908, 908, 908, 908, nil, nil, + nil, nil, nil, 908, 908, 908, 908, 908, 908, 908, + nil, nil, 908, nil, nil, nil, nil, nil, nil, 908, + nil, nil, 908, 908, 908, 908, 908, 908, 908, 908, + nil, 908, 908, 908, nil, 908, 908, nil, 908, 908, + 908, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 908, nil, nil, 908, nil, nil, 908, 908, nil, nil, + 908, nil, nil, nil, nil, nil, 908, nil, nil, nil, + nil, nil, nil, nil, 908, nil, nil, nil, nil, 908, + 908, 908, 908, 908, 908, nil, nil, nil, 908, 908, + nil, nil, nil, nil, nil, nil, 908, nil, nil, 908, + 908, 908, nil, 908, 908, nil, nil, 908, 908, 916, + 916, 916, nil, 916, nil, nil, nil, 916, 916, nil, + nil, nil, 916, nil, 916, 916, 916, 916, 916, 916, + 916, nil, nil, nil, nil, nil, 916, 916, 916, 916, + 916, 916, 916, nil, nil, 916, nil, nil, nil, nil, + nil, nil, 916, nil, nil, 916, 916, 916, 916, 916, + 916, 916, 916, nil, 916, 916, 916, nil, 916, 916, + nil, 916, 916, 916, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 916, nil, nil, 916, nil, nil, 916, + 916, nil, nil, 916, nil, nil, nil, nil, nil, 916, + nil, nil, nil, nil, nil, nil, nil, 916, nil, nil, + nil, nil, 916, 916, 916, 916, 916, 916, nil, nil, + nil, 916, 916, nil, nil, nil, nil, nil, nil, 916, + nil, nil, 916, 916, 916, nil, 916, 916, nil, nil, + 916, 916, 928, 928, 928, nil, 928, nil, nil, nil, + 928, 928, nil, nil, nil, 928, nil, 928, 928, 928, + 928, 928, 928, 928, nil, nil, nil, nil, nil, 928, + 928, 928, 928, 928, 928, 928, nil, nil, 928, nil, + nil, nil, nil, nil, nil, 928, nil, nil, 928, 928, + 928, 928, 928, 928, 928, 928, nil, 928, 928, 928, + nil, 928, 928, nil, 928, 928, 928, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 928, nil, nil, 928, + nil, nil, 928, 928, nil, nil, 928, nil, nil, nil, + nil, nil, 928, nil, nil, nil, nil, nil, nil, nil, + 928, nil, nil, nil, nil, 928, 928, 928, 928, 928, + 928, nil, nil, nil, 928, 928, nil, nil, nil, nil, + nil, nil, 928, nil, nil, 928, 928, 928, nil, 928, + 928, nil, nil, 928, 928, 929, 929, 929, nil, 929, + nil, nil, nil, 929, 929, nil, nil, nil, 929, nil, + 929, 929, 929, 929, 929, 929, 929, nil, nil, nil, + nil, nil, 929, 929, 929, 929, 929, 929, 929, nil, + nil, 929, nil, nil, nil, nil, nil, nil, 929, nil, + nil, 929, 929, 929, 929, 929, 929, 929, 929, nil, + 929, 929, 929, nil, 929, 929, nil, 929, 929, 929, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 929, + nil, nil, 929, nil, nil, 929, 929, nil, nil, 929, + nil, nil, nil, nil, nil, 929, nil, nil, nil, nil, + nil, nil, nil, 929, nil, nil, nil, nil, 929, 929, + 929, 929, 929, 929, nil, nil, nil, 929, 929, nil, + nil, nil, nil, nil, nil, 929, nil, nil, 929, 929, + 929, nil, 929, 929, nil, nil, 929, 929, 960, 960, + 960, nil, 960, nil, nil, nil, 960, 960, nil, nil, + nil, 960, nil, 960, 960, 960, 960, 960, 960, 960, + nil, nil, nil, nil, nil, 960, 960, 960, 960, 960, + 960, 960, nil, nil, 960, nil, nil, nil, nil, nil, + nil, 960, nil, nil, 960, 960, 960, 960, 960, 960, + 960, 960, nil, 960, 960, 960, nil, 960, 960, nil, + 960, 960, 960, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 960, nil, nil, 960, nil, nil, 960, 960, + nil, nil, 960, nil, nil, nil, nil, nil, 960, nil, + nil, nil, nil, nil, nil, nil, 960, nil, nil, nil, + nil, 960, 960, 960, 960, 960, 960, nil, nil, nil, + 960, 960, nil, nil, nil, nil, nil, nil, 960, nil, + nil, 960, 960, 960, nil, 960, 960, nil, nil, 960, + 960, 961, 961, 961, nil, 961, nil, nil, nil, 961, + 961, nil, nil, nil, 961, nil, 961, 961, 961, 961, + 961, 961, 961, nil, nil, nil, nil, nil, 961, 961, + 961, 961, 961, 961, 961, nil, nil, 961, nil, nil, + nil, nil, nil, nil, 961, nil, nil, 961, 961, 961, + 961, 961, 961, 961, 961, nil, 961, 961, 961, nil, + 961, 961, nil, 961, 961, 961, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 961, nil, nil, 961, nil, + nil, 961, 961, nil, nil, 961, nil, nil, nil, nil, + nil, 961, nil, nil, nil, nil, nil, nil, nil, 961, + nil, nil, nil, nil, 961, 961, 961, 961, 961, 961, + nil, nil, nil, 961, 961, nil, nil, nil, nil, nil, + nil, 961, nil, nil, 961, 961, 961, nil, 961, 961, + nil, nil, 961, 961, 962, 962, 962, nil, 962, nil, + nil, nil, 962, 962, nil, nil, nil, 962, nil, 962, + 962, 962, 962, 962, 962, 962, nil, nil, nil, nil, + nil, 962, 962, 962, 962, 962, 962, 962, nil, nil, + 962, nil, nil, nil, nil, nil, nil, 962, nil, nil, + 962, 962, 962, 962, 962, 962, 962, 962, nil, 962, + 962, 962, nil, 962, 962, nil, 962, 962, 962, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 962, nil, + nil, 962, nil, nil, 962, 962, nil, nil, 962, nil, + nil, nil, nil, nil, 962, nil, nil, nil, nil, nil, + nil, nil, 962, nil, nil, nil, nil, 962, 962, 962, + 962, 962, 962, nil, nil, nil, 962, 962, nil, nil, + nil, nil, nil, nil, 962, nil, nil, 962, 962, 962, + nil, 962, 962, nil, nil, 962, 962, 963, 963, 963, + nil, 963, nil, nil, nil, 963, 963, nil, nil, nil, + 963, nil, 963, 963, 963, 963, 963, 963, 963, nil, + nil, nil, nil, nil, 963, 963, 963, 963, 963, 963, + 963, nil, nil, 963, nil, nil, nil, nil, nil, nil, + 963, nil, nil, 963, 963, 963, 963, 963, 963, 963, + 963, nil, 963, 963, 963, nil, 963, 963, nil, 963, + 963, 963, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 963, nil, nil, 963, nil, nil, 963, 963, nil, + nil, 963, nil, nil, nil, nil, nil, 963, nil, nil, + nil, nil, nil, nil, nil, 963, nil, nil, nil, nil, + 963, 963, 963, 963, 963, 963, nil, nil, nil, 963, + 963, nil, nil, nil, nil, nil, nil, 963, nil, nil, + 963, 963, 963, nil, 963, 963, nil, nil, 963, 963, + 964, 964, 964, nil, 964, nil, nil, nil, 964, 964, + nil, nil, nil, 964, nil, 964, 964, 964, 964, 964, + 964, 964, nil, nil, nil, nil, nil, 964, 964, 964, + 964, 964, 964, 964, nil, nil, 964, nil, nil, nil, + nil, nil, nil, 964, nil, nil, 964, 964, 964, 964, + 964, 964, 964, 964, nil, 964, 964, 964, nil, 964, + 964, nil, 964, 964, 964, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 964, nil, nil, 964, nil, nil, + 964, 964, nil, nil, 964, nil, nil, nil, nil, nil, + 964, nil, nil, nil, nil, nil, nil, nil, 964, nil, + nil, nil, nil, 964, 964, 964, 964, 964, 964, nil, + nil, nil, 964, 964, nil, nil, nil, nil, nil, nil, + 964, nil, nil, 964, 964, 964, nil, 964, 964, nil, + nil, 964, 964, 965, 965, 965, nil, 965, nil, nil, + nil, 965, 965, nil, nil, nil, 965, nil, 965, 965, + 965, 965, 965, 965, 965, nil, nil, nil, nil, nil, + 965, 965, 965, 965, 965, 965, 965, nil, nil, 965, + nil, nil, nil, nil, nil, nil, 965, nil, nil, 965, + 965, 965, 965, 965, 965, 965, 965, nil, 965, 965, + 965, nil, 965, 965, nil, 965, 965, 965, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 965, nil, nil, + 965, nil, nil, 965, 965, nil, nil, 965, nil, nil, + nil, nil, nil, 965, nil, nil, nil, nil, nil, nil, + nil, 965, nil, nil, nil, nil, 965, 965, 965, 965, + 965, 965, nil, nil, nil, 965, 965, nil, nil, nil, + nil, nil, nil, 965, nil, nil, 965, 965, 965, nil, + 965, 965, nil, nil, 965, 965, 999, 999, 999, nil, + 999, nil, nil, nil, 999, 999, nil, nil, nil, 999, + nil, 999, 999, 999, 999, 999, 999, 999, nil, nil, + nil, nil, nil, 999, 999, 999, 999, 999, 999, 999, + nil, nil, 999, nil, nil, nil, nil, nil, nil, 999, + nil, nil, 999, 999, 999, 999, 999, 999, 999, 999, + nil, 999, 999, 999, nil, 999, 999, nil, 999, 999, + 999, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 999, nil, nil, 999, nil, nil, 999, 999, nil, nil, + 999, nil, nil, nil, nil, nil, 999, nil, nil, nil, + nil, nil, nil, nil, 999, nil, nil, nil, nil, 999, + 999, 999, 999, 999, 999, nil, nil, nil, 999, 999, + nil, nil, nil, nil, nil, nil, 999, nil, nil, 999, + 999, 999, nil, 999, 999, nil, nil, 999, 999, 1005, + 1005, 1005, nil, 1005, nil, nil, nil, 1005, 1005, nil, + nil, nil, 1005, nil, 1005, 1005, 1005, 1005, 1005, 1005, + 1005, nil, nil, nil, nil, nil, 1005, 1005, 1005, 1005, + 1005, 1005, 1005, nil, nil, 1005, nil, nil, nil, nil, + nil, nil, 1005, nil, nil, 1005, 1005, 1005, 1005, 1005, + 1005, 1005, 1005, nil, 1005, 1005, 1005, nil, 1005, 1005, + nil, 1005, 1005, 1005, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1005, nil, nil, 1005, nil, nil, 1005, + 1005, nil, nil, 1005, nil, nil, nil, nil, nil, 1005, + nil, nil, nil, nil, nil, nil, nil, 1005, nil, nil, + nil, nil, 1005, 1005, 1005, 1005, 1005, 1005, nil, nil, + nil, 1005, 1005, nil, nil, nil, nil, nil, nil, 1005, + nil, nil, 1005, 1005, 1005, nil, 1005, 1005, nil, nil, + 1005, 1005, 1031, 1031, 1031, nil, 1031, nil, nil, nil, + 1031, 1031, nil, nil, nil, 1031, nil, 1031, 1031, 1031, + 1031, 1031, 1031, 1031, nil, nil, nil, nil, nil, 1031, + 1031, 1031, 1031, 1031, 1031, 1031, nil, nil, 1031, nil, + nil, nil, nil, nil, nil, 1031, nil, nil, 1031, 1031, + 1031, 1031, 1031, 1031, 1031, 1031, nil, 1031, 1031, 1031, + nil, 1031, 1031, nil, 1031, 1031, 1031, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1031, nil, nil, 1031, + nil, nil, 1031, 1031, nil, nil, 1031, nil, nil, nil, + nil, nil, 1031, nil, nil, nil, nil, nil, nil, nil, + 1031, nil, nil, nil, nil, 1031, 1031, 1031, 1031, 1031, + 1031, nil, nil, nil, 1031, 1031, nil, nil, nil, nil, + nil, nil, 1031, nil, nil, 1031, 1031, 1031, nil, 1031, + 1031, nil, nil, 1031, 1031, 1040, 1040, 1040, nil, 1040, + nil, nil, nil, 1040, 1040, nil, nil, nil, 1040, nil, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, nil, nil, nil, + nil, nil, 1040, 1040, 1040, 1040, 1040, 1040, 1040, nil, + nil, 1040, nil, nil, nil, nil, nil, nil, 1040, nil, + nil, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, nil, + 1040, 1040, 1040, nil, 1040, 1040, nil, 1040, 1040, 1040, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1040, + nil, nil, 1040, nil, nil, 1040, 1040, nil, nil, 1040, + nil, 1040, nil, nil, nil, 1040, nil, nil, nil, nil, + nil, nil, nil, 1040, nil, nil, nil, nil, 1040, 1040, + 1040, 1040, 1040, 1040, nil, nil, nil, 1040, 1040, nil, + nil, nil, nil, nil, nil, 1040, nil, nil, 1040, 1040, + 1040, nil, 1040, 1040, nil, nil, 1040, 1040, 1064, 1064, + 1064, nil, 1064, nil, nil, nil, 1064, 1064, nil, nil, + nil, 1064, nil, 1064, 1064, 1064, 1064, 1064, 1064, 1064, + nil, nil, nil, nil, nil, 1064, 1064, 1064, 1064, 1064, + 1064, 1064, nil, nil, 1064, nil, nil, nil, nil, nil, + nil, 1064, nil, nil, 1064, 1064, 1064, 1064, 1064, 1064, + 1064, 1064, 1064, 1064, 1064, 1064, nil, 1064, 1064, nil, + 1064, 1064, 1064, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1064, nil, nil, 1064, nil, nil, 1064, 1064, + nil, nil, 1064, nil, nil, nil, 1064, nil, 1064, nil, + nil, nil, nil, nil, nil, nil, 1064, nil, nil, nil, + nil, 1064, 1064, 1064, 1064, 1064, 1064, nil, nil, nil, + 1064, 1064, nil, nil, nil, nil, nil, nil, 1064, nil, + 1064, 1064, 1064, 1064, nil, 1064, 1064, nil, nil, 1064, + 1064, 1088, 1088, 1088, nil, 1088, nil, nil, nil, 1088, + 1088, nil, nil, nil, 1088, nil, 1088, 1088, 1088, 1088, + 1088, 1088, 1088, nil, nil, nil, nil, nil, 1088, 1088, + 1088, 1088, 1088, 1088, 1088, nil, nil, 1088, nil, nil, + nil, nil, nil, nil, 1088, nil, nil, 1088, 1088, 1088, + 1088, 1088, 1088, 1088, 1088, nil, 1088, 1088, 1088, nil, + 1088, 1088, nil, 1088, 1088, 1088, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1088, nil, nil, 1088, nil, + nil, 1088, 1088, nil, nil, 1088, nil, nil, nil, nil, + nil, 1088, nil, nil, nil, nil, nil, nil, nil, 1088, + nil, nil, nil, nil, 1088, 1088, 1088, 1088, 1088, 1088, + nil, nil, nil, 1088, 1088, nil, nil, nil, nil, nil, + nil, 1088, nil, nil, 1088, 1088, 1088, nil, 1088, 1088, + nil, nil, 1088, 1088, 1145, 1145, 1145, nil, 1145, nil, + nil, nil, 1145, 1145, nil, nil, nil, 1145, nil, 1145, + 1145, 1145, 1145, 1145, 1145, 1145, nil, nil, nil, nil, + nil, 1145, 1145, 1145, 1145, 1145, 1145, 1145, nil, nil, + 1145, nil, nil, nil, nil, nil, nil, 1145, nil, nil, + 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, nil, 1145, + 1145, 1145, nil, 1145, 1145, nil, 1145, 1145, 1145, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1145, nil, + nil, 1145, nil, nil, 1145, 1145, nil, nil, 1145, nil, + nil, nil, nil, nil, 1145, nil, nil, nil, nil, nil, + nil, nil, 1145, nil, nil, nil, nil, 1145, 1145, 1145, + 1145, 1145, 1145, nil, nil, nil, 1145, 1145, nil, nil, + nil, nil, nil, nil, 1145, nil, nil, 1145, 1145, 1145, + nil, 1145, 1145, nil, nil, 1145, 1145, 1203, 1203, 1203, + nil, 1203, nil, nil, nil, 1203, 1203, nil, nil, nil, + 1203, nil, 1203, 1203, 1203, 1203, 1203, 1203, 1203, nil, + nil, nil, nil, nil, 1203, 1203, 1203, 1203, 1203, 1203, + 1203, nil, nil, 1203, nil, nil, nil, nil, nil, nil, + 1203, nil, nil, 1203, 1203, 1203, 1203, 1203, 1203, 1203, + 1203, nil, 1203, 1203, 1203, nil, 1203, 1203, nil, 1203, + 1203, 1203, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1203, nil, nil, 1203, nil, nil, 1203, 1203, nil, + nil, 1203, nil, nil, nil, nil, nil, 1203, nil, nil, + nil, nil, nil, nil, nil, 1203, nil, nil, nil, nil, + 1203, 1203, 1203, 1203, 1203, 1203, nil, nil, nil, 1203, + 1203, nil, nil, nil, nil, nil, nil, 1203, nil, nil, + 1203, 1203, 1203, nil, 1203, 1203, nil, nil, 1203, 1203, + 1204, 1204, 1204, nil, 1204, nil, nil, nil, 1204, 1204, + nil, nil, nil, 1204, nil, 1204, 1204, 1204, 1204, 1204, + 1204, 1204, nil, nil, nil, nil, nil, 1204, 1204, 1204, + 1204, 1204, 1204, 1204, nil, nil, 1204, nil, nil, nil, + nil, nil, nil, 1204, nil, nil, 1204, 1204, 1204, 1204, + 1204, 1204, 1204, 1204, nil, 1204, 1204, 1204, nil, 1204, + 1204, nil, 1204, 1204, 1204, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1204, nil, nil, 1204, nil, nil, + 1204, 1204, nil, nil, 1204, nil, nil, nil, nil, nil, + 1204, nil, nil, nil, nil, nil, nil, nil, 1204, nil, + nil, nil, nil, 1204, 1204, 1204, 1204, 1204, 1204, nil, + nil, nil, 1204, 1204, nil, nil, nil, nil, nil, nil, + 1204, nil, nil, 1204, 1204, 1204, nil, 1204, 1204, nil, + nil, 1204, 1204, 1218, 1218, 1218, nil, 1218, nil, nil, + nil, 1218, 1218, nil, nil, nil, 1218, nil, 1218, 1218, + 1218, 1218, 1218, 1218, 1218, nil, nil, nil, nil, nil, + 1218, 1218, 1218, 1218, 1218, 1218, 1218, nil, nil, 1218, + nil, nil, nil, nil, nil, nil, 1218, nil, nil, 1218, + 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, + 1218, nil, 1218, 1218, nil, 1218, 1218, 1218, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1218, nil, nil, + 1218, nil, nil, 1218, 1218, nil, nil, 1218, nil, 1218, + nil, 1218, nil, 1218, nil, nil, nil, nil, nil, nil, + nil, 1218, nil, nil, nil, nil, 1218, 1218, 1218, 1218, + 1218, 1218, nil, nil, nil, 1218, 1218, nil, nil, nil, + nil, nil, nil, 1218, nil, 1218, 1218, 1218, 1218, nil, + 1218, 1218, nil, nil, 1218, 1218, 40, 40, 40, nil, + 40, nil, nil, nil, 40, 40, nil, nil, nil, 40, + nil, 40, 40, 40, 40, 40, 40, 40, nil, nil, + nil, nil, nil, 40, 40, 40, 40, 40, 40, 40, + nil, nil, 40, nil, nil, nil, nil, nil, nil, 40, + nil, nil, 40, 40, 40, 40, 40, 40, 40, 40, + nil, 40, 40, 40, nil, 40, 40, nil, nil, nil, + 40, nil, nil, nil, nil, nil, 1075, nil, 1075, 1075, + 1075, 1075, 1075, nil, nil, nil, nil, nil, nil, nil, + 40, nil, 1075, 40, nil, nil, 40, 40, nil, nil, + 40, nil, 40, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1075, nil, nil, nil, nil, 40, + 40, 40, 40, 40, 40, 1075, 1075, nil, 40, 40, + nil, nil, nil, nil, nil, nil, 40, nil, nil, 40, + 40, 40, nil, 40, 40, 41, 41, 41, nil, 41, + nil, nil, nil, 41, 41, nil, nil, nil, 41, 1075, + 41, 41, 41, 41, 41, 41, 41, nil, nil, 1075, + nil, nil, 41, 41, 41, 41, 41, 41, 41, nil, + nil, 41, nil, nil, nil, nil, nil, nil, 41, nil, + nil, 41, 41, 41, 41, 41, 41, 41, 41, nil, + 41, 41, 41, nil, 41, 41, nil, nil, nil, 41, + nil, nil, nil, nil, nil, 1077, nil, 1077, 1077, 1077, + 1077, 1077, nil, nil, nil, nil, nil, nil, nil, 41, + nil, 1077, 41, nil, nil, 41, 41, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1077, nil, nil, nil, nil, 41, 41, + 41, 41, 41, 41, 1077, 1077, nil, 41, 41, nil, + nil, nil, 41, nil, nil, 41, nil, nil, 41, 41, + 41, nil, 41, 41, 77, 77, 77, nil, 77, nil, + nil, nil, 77, 77, nil, nil, nil, 77, 1077, 77, + 77, 77, 77, 77, 77, 77, nil, nil, 1077, nil, + nil, 77, 77, 77, 77, 77, 77, 77, nil, nil, + 77, nil, nil, nil, nil, nil, nil, 77, nil, nil, + 77, 77, 77, 77, 77, 77, 77, 77, nil, 77, + 77, 77, nil, 77, 77, nil, nil, nil, 77, nil, + nil, nil, nil, nil, 1079, nil, 1079, 1079, 1079, 1079, + 1079, nil, nil, nil, nil, nil, nil, nil, 77, nil, + 1079, 77, nil, nil, 77, 77, nil, nil, 77, nil, + 77, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1079, nil, nil, nil, nil, 77, 77, 77, + 77, 77, 77, 1079, 1079, nil, 77, 77, nil, nil, + nil, nil, nil, nil, 77, nil, nil, 77, 77, 77, + nil, 77, 77, 78, 78, 78, nil, 78, nil, nil, + nil, 78, 78, nil, nil, nil, 78, 1079, 78, 78, + 78, 78, 78, 78, 78, nil, nil, 1079, nil, nil, + 78, 78, 78, 78, 78, 78, 78, nil, nil, 78, + nil, nil, nil, nil, nil, nil, 78, nil, nil, 78, + 78, 78, 78, 78, 78, 78, 78, nil, 78, 78, + 78, nil, 78, 78, nil, nil, nil, 78, nil, nil, + nil, nil, nil, 1222, nil, 1222, 1222, 1222, 1222, 1222, + nil, nil, nil, nil, 78, nil, nil, 78, nil, 1222, + 78, nil, nil, 78, 78, nil, nil, 78, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1222, nil, nil, nil, nil, 78, 78, 78, 78, + 78, 78, 1222, 1222, nil, 78, 78, nil, nil, nil, + nil, nil, nil, 78, nil, nil, 78, 78, 78, nil, + 78, 78, 79, 79, 79, nil, 79, nil, nil, nil, + 79, 79, nil, nil, nil, 79, 1222, 79, 79, 79, + 79, 79, 79, 79, nil, nil, 1222, nil, nil, 79, + 79, 79, 79, 79, 79, 79, nil, nil, 79, nil, + nil, nil, nil, nil, nil, 79, nil, nil, 79, 79, + 79, 79, 79, 79, 79, 79, nil, 79, 79, 79, + nil, 79, 79, nil, nil, nil, 79, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 79, nil, nil, 79, + nil, nil, 79, 79, nil, nil, 79, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 79, 79, 79, 79, 79, + 79, nil, nil, nil, 79, 79, nil, nil, nil, nil, + nil, nil, 79, nil, nil, 79, 79, 79, nil, 79, + 79, 351, 351, 351, nil, 351, nil, nil, nil, 351, + 351, nil, nil, nil, 351, nil, 351, 351, 351, 351, + 351, 351, 351, nil, nil, nil, nil, nil, 351, 351, + 351, 351, 351, 351, 351, nil, nil, 351, nil, nil, + nil, nil, nil, nil, 351, nil, nil, 351, 351, 351, + 351, 351, 351, 351, 351, nil, 351, 351, 351, nil, + 351, 351, nil, nil, nil, 351, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 351, nil, nil, 351, nil, + nil, 351, 351, nil, nil, 351, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 351, 351, 351, 351, 351, 351, + nil, nil, nil, 351, 351, nil, nil, nil, 351, nil, + nil, 351, nil, nil, 351, 351, 351, nil, 351, 351, + 370, 370, 370, nil, 370, nil, nil, nil, 370, 370, + nil, nil, nil, 370, nil, 370, 370, 370, 370, 370, + 370, 370, nil, nil, nil, nil, nil, 370, 370, 370, + 370, 370, 370, 370, nil, nil, 370, nil, nil, nil, + nil, nil, nil, 370, nil, nil, 370, 370, 370, 370, + 370, 370, 370, 370, nil, 370, 370, 370, nil, 370, + 370, nil, nil, nil, 370, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 370, nil, nil, 370, nil, nil, + 370, 370, nil, nil, 370, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 370, 370, 370, 370, 370, 370, nil, + nil, nil, 370, 370, nil, nil, nil, nil, nil, nil, + 370, nil, nil, 370, 370, 370, nil, 370, 370, 618, + 618, 618, nil, 618, nil, nil, nil, 618, 618, nil, + nil, nil, 618, nil, 618, 618, 618, 618, 618, 618, + 618, nil, nil, nil, nil, nil, 618, 618, 618, 618, + 618, 618, 618, nil, nil, 618, nil, nil, nil, nil, + nil, nil, 618, nil, nil, 618, 618, 618, 618, 618, + 618, 618, 618, nil, 618, 618, 618, nil, 618, 618, + nil, nil, nil, 618, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 618, nil, nil, 618, nil, nil, 618, + 618, nil, nil, 618, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 618, 618, 618, 618, 618, 618, nil, nil, + nil, 618, 618, nil, nil, nil, nil, nil, nil, 618, + nil, nil, 618, 618, 618, nil, 618, 618, 627, 627, + 627, nil, 627, nil, nil, nil, 627, 627, nil, nil, + nil, 627, nil, 627, 627, 627, 627, 627, 627, 627, + nil, nil, nil, nil, nil, 627, 627, 627, 627, 627, + 627, 627, nil, nil, 627, nil, nil, nil, nil, nil, + nil, 627, nil, nil, 627, 627, 627, 627, 627, 627, + 627, 627, nil, 627, 627, 627, nil, 627, 627, nil, + nil, nil, 627, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 627, nil, nil, 627, nil, nil, 627, 627, + nil, nil, 627, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 627, 627, 627, 627, 627, 627, nil, nil, nil, + 627, 627, nil, nil, nil, nil, nil, nil, 627, nil, + nil, 627, 627, 627, nil, 627, 627, 845, 845, 845, + nil, 845, nil, nil, nil, 845, 845, nil, nil, nil, + 845, nil, 845, 845, 845, 845, 845, 845, 845, nil, + nil, nil, nil, nil, 845, 845, 845, 845, 845, 845, + 845, nil, nil, 845, nil, nil, nil, nil, nil, nil, + 845, nil, nil, 845, 845, 845, 845, 845, 845, 845, + 845, nil, 845, 845, 845, nil, 845, 845, nil, nil, + nil, 845, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 845, nil, nil, 845, nil, nil, 845, 845, nil, + nil, 845, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 845, 845, 845, 845, 845, 845, nil, nil, nil, 845, + 845, nil, nil, nil, nil, nil, nil, 845, nil, nil, + 845, 845, 845, nil, 845, 845, 856, 856, 856, nil, + 856, nil, nil, nil, 856, 856, nil, nil, nil, 856, + nil, 856, 856, 856, 856, 856, 856, 856, nil, nil, + nil, nil, nil, 856, 856, 856, 856, 856, 856, 856, + nil, nil, 856, nil, nil, nil, nil, nil, nil, 856, + nil, nil, 856, 856, 856, 856, 856, 856, 856, 856, + nil, 856, 856, 856, nil, 856, 856, nil, nil, nil, + 856, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 856, nil, nil, 856, nil, nil, 856, 856, nil, nil, + 856, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 856, + 856, 856, 856, 856, 856, nil, nil, nil, 856, 856, + nil, nil, nil, nil, nil, nil, 856, nil, nil, 856, + 856, 856, nil, 856, 856, 1070, 1070, 1070, nil, 1070, + nil, nil, nil, 1070, 1070, nil, nil, nil, 1070, nil, + 1070, 1070, 1070, 1070, 1070, 1070, 1070, nil, nil, nil, + nil, nil, 1070, 1070, 1070, 1070, 1070, 1070, 1070, nil, + nil, 1070, nil, nil, nil, nil, nil, nil, 1070, nil, + nil, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, nil, + 1070, 1070, 1070, nil, 1070, 1070, nil, nil, nil, 1070, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1070, + nil, nil, 1070, nil, nil, 1070, 1070, nil, nil, 1070, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1070, 1070, + 1070, 1070, 1070, 1070, nil, nil, nil, 1070, 1070, nil, + nil, nil, nil, nil, nil, 1070, nil, nil, 1070, 1070, + 1070, nil, 1070, 1070, 1131, 1131, 1131, nil, 1131, nil, + nil, nil, 1131, 1131, nil, nil, nil, 1131, nil, 1131, + 1131, 1131, 1131, 1131, 1131, 1131, nil, nil, nil, nil, + nil, 1131, 1131, 1131, 1131, 1131, 1131, 1131, nil, nil, + 1131, nil, nil, nil, nil, nil, nil, 1131, nil, nil, + 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, nil, 1131, + 1131, 1131, nil, 1131, 1131, nil, nil, nil, 1131, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1131, nil, + nil, 1131, nil, nil, 1131, 1131, nil, nil, 1131, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1131, 1131, 1131, + 1131, 1131, 1131, nil, nil, nil, 1131, 1131, nil, nil, + nil, nil, nil, nil, 1131, nil, nil, 1131, 1131, 1131, + nil, 1131, 1131, 1197, 1197, 1197, nil, 1197, nil, nil, + nil, 1197, 1197, nil, nil, nil, 1197, nil, 1197, 1197, + 1197, 1197, 1197, 1197, 1197, nil, nil, nil, nil, nil, + 1197, 1197, 1197, 1197, 1197, 1197, 1197, nil, nil, 1197, + nil, nil, nil, nil, nil, nil, 1197, nil, nil, 1197, + 1197, 1197, 1197, 1197, 1197, 1197, 1197, nil, 1197, 1197, + 1197, nil, 1197, 1197, nil, nil, nil, 1197, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1197, nil, nil, + 1197, nil, nil, 1197, 1197, nil, nil, 1197, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1197, 1197, 1197, 1197, + 1197, 1197, nil, nil, nil, 1197, 1197, nil, nil, nil, + nil, nil, nil, 1197, nil, nil, 1197, 1197, 1197, nil, + 1197, 1197, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, nil, nil, nil, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, nil, + nil, nil, nil, nil, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, nil, 11, nil, nil, nil, nil, + nil, nil, nil, nil, 11, 11, nil, 11, 11, 11, + 11, 11, 11, 11, nil, nil, 11, 11, nil, nil, + nil, 11, 11, 11, 11, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 11, 11, + nil, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, nil, nil, 11, 11, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 11, nil, nil, nil, nil, + nil, nil, nil, nil, 11, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, nil, + nil, nil, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, nil, nil, nil, nil, nil, 12, 12, 12, + 12, 12, 12, 12, 12, 12, nil, nil, 12, nil, + nil, nil, nil, nil, nil, nil, nil, 12, 12, nil, + 12, 12, 12, 12, 12, 12, 12, nil, nil, 12, + 12, nil, nil, nil, 12, 12, 12, 12, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 12, 12, nil, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, nil, nil, 12, 12, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 12, nil, + nil, nil, nil, nil, nil, nil, nil, 12, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, nil, nil, nil, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, nil, nil, nil, nil, nil, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, nil, 27, nil, nil, nil, nil, nil, nil, + 27, 27, nil, 27, 27, 27, 27, 27, 27, 27, + nil, nil, 27, 27, nil, nil, nil, 27, 27, 27, + 27, nil, nil, nil, nil, nil, 27, nil, nil, nil, + nil, nil, nil, nil, 27, 27, nil, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, nil, nil, + 27, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 27, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, nil, nil, nil, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, nil, nil, + nil, nil, nil, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, nil, 109, nil, nil, nil, + nil, nil, nil, 109, 109, nil, 109, 109, 109, 109, + 109, 109, 109, nil, nil, 109, 109, nil, nil, nil, + 109, 109, 109, 109, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 109, 109, nil, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, nil, nil, 109, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 109, 452, 452, 452, 452, 452, 452, + 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, + 452, 452, 452, 452, 452, 452, 452, 452, nil, nil, + nil, 452, 452, 452, 452, 452, 452, 452, 452, 452, + 452, nil, nil, nil, nil, nil, 452, 452, 452, 452, + 452, 452, 452, 452, 452, nil, nil, 452, nil, nil, + nil, nil, nil, nil, nil, nil, 452, 452, nil, 452, + 452, 452, 452, 452, 452, 452, nil, nil, 452, 452, + nil, nil, nil, 452, 452, 452, 452, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 452, 452, nil, 452, 452, 452, 452, 452, 452, 452, + 452, 452, 452, 452, nil, nil, 452, 452, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 452, nil, nil, + nil, nil, nil, nil, nil, nil, 452, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, + 706, nil, nil, nil, 706, 706, 706, 706, 706, 706, + 706, 706, 706, 706, nil, nil, nil, nil, nil, 706, + 706, 706, 706, 706, 706, 706, 706, 706, nil, nil, + 706, nil, nil, nil, nil, nil, nil, nil, nil, 706, + 706, nil, 706, 706, 706, 706, 706, 706, 706, nil, + nil, 706, 706, nil, nil, nil, 706, 706, 706, 706, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 706, 706, nil, 706, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, nil, nil, 706, + 706, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 706, nil, nil, nil, nil, nil, nil, nil, nil, 706, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, nil, nil, nil, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, nil, nil, nil, + nil, nil, 821, 821, 821, 821, 821, 821, 821, 821, + 821, nil, nil, 821, nil, nil, nil, nil, nil, nil, + nil, nil, 821, 821, nil, 821, 821, 821, 821, 821, + 821, 821, nil, nil, 821, 821, nil, nil, nil, 821, + 821, 821, 821, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 821, 821, nil, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + nil, nil, 821, nil, nil, nil, nil, 553, 553, 553, + 553, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 821, 553, 553, 553, 553, nil, nil, nil, + 553, 553, nil, nil, nil, nil, 553, 553, nil, nil, + nil, 553, 553, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 553, nil, nil, 553, nil, nil, nil, 553, nil, + nil, 553, nil, 553, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 553, nil, nil, nil, + 553, 553, 553, 553, 553, 553, nil, nil, nil, 553, + 553, nil, nil, nil, nil, nil, nil, 553, nil, 553, + 553, 553, 553, nil, 553, 553, nil, nil, 553, 553, + 554, 554, 554, 554, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 554, 554, 554, 554, + nil, nil, nil, 554, 554, nil, nil, nil, nil, 554, + 554, nil, nil, nil, 554, 554, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 554, nil, nil, 554, nil, nil, + nil, 554, nil, nil, 554, nil, 554, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 554, + nil, nil, nil, 554, 554, 554, 554, 554, 554, nil, + nil, nil, 554, 554, nil, nil, nil, nil, nil, nil, + 554, nil, 554, 554, 554, 554, nil, 554, 554, nil, + nil, 554, 554, 786, 786, 786, 786, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 786, + 786, 786, 786, nil, nil, nil, 786, nil, nil, nil, + nil, nil, 786, 786, nil, nil, nil, 786, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 786, nil, nil, + 786, nil, nil, nil, 786, nil, nil, 786, nil, 786, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 786, nil, nil, nil, 786, 786, 786, 786, + 786, 786, nil, nil, nil, 786, 786, 786, nil, nil, + nil, nil, nil, 786, nil, nil, 786, 786, 786, nil, + 786, 786, nil, nil, 786, 786, 794, 794, 794, 794, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 794, 794, 794, 794, nil, nil, nil, 794, + nil, nil, nil, nil, nil, 794, 794, nil, nil, nil, + 794, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 794, nil, nil, 794, nil, nil, nil, 794, nil, nil, + 794, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 794, nil, nil, nil, 794, + 794, 794, 794, 794, 794, nil, nil, nil, 794, 794, + nil, nil, nil, nil, nil, nil, 794, nil, nil, 794, + 794, 794, nil, 794, 794, nil, nil, 794, 794, 967, + 967, 967, 967, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 967, 967, 967, 967, nil, + nil, nil, 967, nil, nil, nil, nil, nil, 967, 967, + nil, nil, nil, 967, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 967, nil, nil, 967, nil, nil, nil, + 967, nil, nil, 967, nil, 967, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 967, nil, + nil, nil, 967, 967, 967, 967, 967, 967, nil, nil, + nil, 967, 967, nil, nil, nil, nil, nil, nil, 967, + nil, nil, 967, 967, 967, nil, 967, 967, nil, nil, + 967, 967, 969, 969, 969, 969, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 969, 969, + 969, 969, nil, nil, nil, 969, nil, nil, nil, nil, + nil, 969, 969, nil, nil, nil, 969, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 969, nil, nil, 969, + nil, nil, nil, 969, nil, nil, 969, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 969, nil, nil, nil, 969, 969, 969, 969, 969, + 969, nil, nil, nil, 969, 969, nil, nil, nil, nil, + nil, nil, 969, nil, nil, 969, 969, 969, nil, 969, + 969, nil, nil, 969, 969, 972, 972, 972, 972, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 972, 972, 972, 972, nil, nil, nil, 972, 972, + nil, nil, nil, nil, 972, 972, nil, nil, nil, 972, + 972, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 972, + nil, nil, 972, nil, nil, nil, 972, nil, nil, 972, + nil, 972, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 972, nil, nil, nil, 972, 972, + 972, 972, 972, 972, nil, nil, nil, 972, 972, nil, + nil, nil, nil, nil, nil, 972, nil, 972, 972, 972, + 972, nil, 972, 972, nil, nil, 972, 972, 973, 973, + 973, 973, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 973, 973, 973, 973, nil, nil, + nil, 973, 973, nil, nil, nil, nil, 973, 973, nil, + nil, nil, 973, 973, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 973, nil, nil, 973, nil, nil, nil, 973, + nil, nil, 973, nil, 973, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 973, nil, nil, + nil, 973, 973, 973, 973, 973, 973, nil, nil, nil, + 973, 973, nil, nil, nil, nil, nil, nil, 973, nil, + 973, 973, 973, 973, nil, 973, 973, nil, nil, 973, + 973, 979, 979, 979, 979, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 979, 979, 979, + 979, nil, nil, nil, 979, nil, nil, nil, nil, nil, + 979, 979, nil, nil, nil, 979, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 979, nil, nil, 979, nil, + nil, nil, 979, nil, nil, 979, nil, 979, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 979, nil, nil, nil, 979, 979, 979, 979, 979, 979, + nil, nil, nil, 979, 979, nil, nil, nil, nil, nil, + nil, 979, nil, nil, 979, 979, 979, nil, 979, 979, + nil, nil, 979, 979, 985, 985, 985, 985, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 985, 985, 985, 985, nil, nil, nil, 985, nil, nil, + nil, nil, nil, 985, 985, nil, nil, nil, 985, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 985, nil, + nil, 985, nil, nil, nil, 985, nil, nil, 985, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 985, nil, nil, nil, 985, 985, 985, + 985, 985, 985, nil, nil, nil, 985, 985, nil, nil, + nil, nil, nil, nil, 985, nil, nil, 985, 985, 985, + nil, 985, 985, nil, nil, 985, 985, 986, 986, 986, + 986, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 986, 986, 986, 986, nil, nil, nil, + 986, nil, nil, nil, nil, nil, 986, 986, nil, nil, + nil, 986, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 986, nil, nil, 986, nil, nil, nil, 986, nil, + nil, 986, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 986, nil, nil, nil, + 986, 986, 986, 986, 986, 986, nil, nil, nil, 986, + 986, nil, nil, nil, nil, nil, nil, 986, nil, nil, + 986, 986, 986, nil, 986, 986, nil, nil, 986, 986, + 1038, 1038, 1038, 1038, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 1038, 1038, 1038, 1038, + nil, nil, nil, 1038, 1038, nil, nil, nil, nil, 1038, + 1038, nil, nil, nil, 1038, 1038, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1038, nil, nil, 1038, nil, nil, + nil, 1038, nil, nil, 1038, nil, 1038, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1038, + nil, nil, nil, 1038, 1038, 1038, 1038, 1038, 1038, nil, + nil, nil, 1038, 1038, nil, nil, nil, nil, nil, nil, + 1038, nil, 1038, 1038, 1038, 1038, nil, 1038, 1038, nil, + nil, 1038, 1038, 1170, 1170, 1170, 1170, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1170, + 1170, 1170, 1170, nil, nil, nil, 1170, nil, nil, nil, + nil, nil, 1170, 1170, nil, nil, nil, 1170, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1170, nil, nil, + 1170, nil, nil, nil, 1170, nil, nil, 1170, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1170, nil, nil, nil, 1170, 1170, 1170, 1170, + 1170, 1170, nil, nil, nil, 1170, 1170, nil, nil, nil, + nil, nil, nil, 1170, nil, nil, 1170, 1170, 1170, nil, + 1170, 1170, nil, nil, 1170, 1170, 1178, 1178, 1178, 1178, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1178, 1178, 1178, 1178, nil, nil, nil, 1178, + nil, nil, nil, nil, nil, 1178, 1178, nil, nil, nil, + 1178, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 1178, nil, nil, 1178, nil, nil, nil, 1178, nil, nil, + 1178, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1178, nil, nil, nil, 1178, + 1178, 1178, 1178, 1178, 1178, nil, nil, nil, 1178, 1178, + nil, nil, nil, nil, nil, nil, 1178, nil, nil, 1178, + 1178, 1178, nil, 1178, 1178, nil, nil, 1178, 1178, 1182, + 1182, 1182, 1182, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1182, 1182, 1182, 1182, nil, + nil, nil, 1182, nil, nil, nil, nil, nil, 1182, 1182, + nil, nil, nil, 1182, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 1182, nil, nil, 1182, nil, nil, nil, + 1182, nil, nil, 1182, nil, 1182, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1182, nil, + nil, nil, 1182, 1182, 1182, 1182, 1182, 1182, nil, nil, + nil, 1182, 1182, nil, nil, nil, nil, nil, nil, 1182, + nil, nil, 1182, 1182, 1182, nil, 1182, 1182, nil, nil, + 1182, 1182, 1259, 1259, 1259, 1259, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 1259, 1259, + 1259, 1259, nil, nil, nil, 1259, nil, nil, nil, nil, + nil, 1259, 1259, nil, nil, nil, 1259, nil, nil, nil, + nil, nil, nil, nil, 994, 994, 994, 994, nil, nil, + nil, nil, nil, nil, nil, nil, 1259, nil, nil, 1259, + 994, 994, 994, 1259, nil, nil, 1259, nil, nil, nil, + nil, nil, nil, 994, 994, nil, nil, nil, 994, nil, + nil, 1259, nil, nil, nil, 1259, 1259, 1259, 1259, 1259, + 1259, nil, nil, nil, 1259, 1259, nil, nil, nil, nil, + nil, nil, 1259, nil, nil, 1259, 1259, 1259, nil, 1259, + 1259, nil, nil, 1259, 1259, nil, nil, 240, nil, 240, + 240, 240, 240, 240, nil, nil, nil, 994, 994, 994, + 994, 994, 994, 240, nil, nil, 994, 994, nil, nil, + nil, nil, nil, nil, 994, nil, nil, 994, 994, 994, + nil, 994, 994, nil, 241, 240, 241, 241, 241, 241, + 241, nil, nil, nil, 240, 240, 240, 240, nil, 417, + 241, 417, 417, 417, 417, 417, nil, 679, nil, 679, + 679, 679, 679, 679, nil, 417, nil, nil, nil, nil, + nil, nil, 241, 679, nil, nil, nil, nil, nil, nil, + 240, 241, 241, 241, 241, nil, nil, 417, 417, nil, + 240, nil, nil, nil, nil, 679, 417, 417, 417, 417, + nil, nil, nil, nil, 679, 679, 679, 679, 742, nil, + 742, 742, 742, 742, 742, nil, nil, 241, nil, nil, + nil, nil, nil, nil, 742, nil, nil, 241, nil, nil, + nil, 744, 417, 744, 744, 744, 744, 744, nil, nil, + 679, nil, 417, nil, nil, nil, 742, 744, nil, nil, + 679, nil, nil, nil, nil, 742, 742, 742, 742, 1073, + nil, 1073, 1073, 1073, 1073, 1073, nil, nil, nil, 744, + nil, nil, nil, nil, nil, 1073, nil, nil, 744, 744, + 744, 744, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 742, nil, nil, nil, nil, nil, 1073, nil, nil, + nil, 742, nil, nil, nil, nil, 1073, 1073, 1073, 1073, + nil, nil, nil, nil, 744, 232, 232, nil, nil, 232, + nil, nil, nil, nil, 744, nil, nil, nil, 232, 232, + nil, 232, 232, 232, 232, 232, 232, 232, nil, nil, + 232, 232, 1073, nil, nil, 232, 232, 232, 232, nil, + nil, nil, 1073, nil, 232, nil, nil, nil, nil, nil, + nil, nil, 232, 232, nil, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, nil, nil, 232, nil, + nil, nil, nil, 233, 233, nil, nil, 233, nil, nil, + nil, nil, nil, nil, nil, nil, 233, 233, 232, 233, + 233, 233, 233, 233, 233, 233, nil, nil, 233, 233, + nil, nil, nil, 233, 233, 233, 233, nil, nil, nil, + nil, nil, 233, nil, nil, nil, nil, nil, nil, nil, + 233, 233, nil, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, nil, nil, 233, nil, nil, nil, + nil, 310, 310, nil, nil, 310, nil, nil, nil, nil, + nil, nil, nil, nil, 310, 310, 233, 310, 310, 310, + 310, 310, 310, 310, nil, nil, 310, 310, nil, nil, + nil, 310, 310, 310, 310, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 310, 310, + nil, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, nil, nil, 310, nil, nil, nil, nil, 544, + 544, nil, nil, 544, nil, nil, nil, nil, nil, nil, + nil, nil, 544, 544, 310, 544, 544, 544, 544, 544, + 544, 544, nil, nil, 544, 544, nil, nil, nil, 544, + 544, 544, 544, nil, nil, nil, nil, nil, 544, nil, + nil, nil, nil, nil, nil, nil, 544, 544, nil, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + nil, nil, 544, nil, nil, nil, nil, 545, 545, nil, + nil, 545, nil, nil, nil, nil, nil, nil, nil, nil, + 545, 545, 544, 545, 545, 545, 545, 545, 545, 545, + nil, nil, 545, 545, nil, nil, nil, 545, 545, 545, + 545, nil, nil, nil, nil, nil, 545, nil, nil, nil, + nil, nil, nil, nil, 545, 545, nil, 545, 545, 545, + 545, 545, 545, 545, 545, 545, 545, 545, nil, nil, + 545, nil, nil, nil, nil, 621, 621, nil, nil, 621, + nil, nil, nil, nil, nil, nil, nil, nil, 621, 621, + 545, 621, 621, 621, 621, 621, 621, 621, nil, nil, + 621, 621, nil, nil, nil, 621, 621, 621, 621, nil, + nil, nil, nil, nil, 621, nil, nil, nil, nil, nil, + nil, nil, 621, 621, nil, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, nil, nil, 621, nil, + nil, nil, nil, 622, 622, nil, nil, 622, nil, nil, + nil, nil, nil, nil, nil, nil, 622, 622, 621, 622, + 622, 622, 622, 622, 622, 622, nil, nil, 622, 622, + nil, nil, nil, 622, 622, 622, 622, nil, nil, nil, + nil, nil, 622, nil, nil, nil, nil, nil, nil, nil, + 622, 622, nil, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, nil, nil, 622, nil, nil, nil, + nil, 631, 631, nil, nil, 631, nil, nil, nil, nil, + nil, nil, nil, nil, 631, 631, 622, 631, 631, 631, + 631, 631, 631, 631, nil, nil, 631, 631, nil, nil, + nil, 631, 631, 631, 631, nil, nil, nil, nil, nil, + 631, nil, nil, nil, nil, nil, nil, nil, 631, 631, + nil, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 631, 631, nil, nil, 631, nil, nil, nil, nil, 632, + 632, nil, nil, 632, nil, nil, nil, nil, nil, nil, + nil, nil, 632, 632, 631, 632, 632, 632, 632, 632, + 632, 632, nil, nil, 632, 632, nil, nil, nil, 632, + 632, 632, 632, nil, nil, nil, nil, nil, 632, nil, + nil, nil, nil, nil, nil, nil, 632, 632, nil, 632, + 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, + nil, nil, 632, nil, nil, nil, nil, 663, 663, nil, + nil, 663, nil, nil, nil, nil, nil, nil, nil, nil, + 663, 663, 632, 663, 663, 663, 663, 663, 663, 663, + nil, nil, 663, 663, nil, nil, nil, 663, 663, 663, + 663, nil, nil, nil, nil, nil, 663, nil, nil, nil, + nil, nil, nil, nil, 663, 663, nil, 663, 663, 663, + 663, 663, 663, 663, 663, 663, 663, 663, nil, nil, + 663, nil, nil, nil, nil, 664, 664, nil, nil, 664, + nil, nil, nil, nil, nil, nil, nil, nil, 664, 664, + 663, 664, 664, 664, 664, 664, 664, 664, nil, nil, + 664, 664, nil, nil, nil, 664, 664, 664, 664, nil, + nil, nil, nil, nil, 664, nil, nil, nil, nil, nil, + nil, nil, 664, 664, nil, 664, 664, 664, 664, 664, + 664, 664, 664, 664, 664, 664, nil, nil, 664, nil, + nil, nil, nil, 670, 670, nil, nil, 670, nil, nil, + nil, nil, nil, nil, nil, nil, 670, 670, 664, 670, + 670, 670, 670, 670, 670, 670, nil, nil, 670, 670, + nil, nil, nil, 670, 670, 670, 670, nil, nil, nil, + nil, nil, 670, nil, nil, nil, nil, nil, nil, nil, + 670, 670, nil, 670, 670, 670, 670, 670, 670, 670, + 670, 670, 670, 670, nil, nil, 670, nil, nil, nil, + nil, 671, 671, nil, nil, 671, nil, nil, nil, nil, + nil, nil, nil, nil, 671, 671, 670, 671, 671, 671, + 671, 671, 671, 671, nil, nil, 671, 671, nil, nil, + nil, 671, 671, 671, 671, nil, nil, nil, nil, nil, + 671, nil, nil, nil, nil, nil, nil, nil, 671, 671, + nil, 671, 671, 671, 671, 671, 671, 671, 671, 671, + 671, 671, nil, nil, 671, nil, nil, nil, nil, 713, + 713, nil, nil, 713, nil, nil, nil, nil, nil, nil, + nil, nil, 713, 713, 671, 713, 713, 713, 713, 713, + 713, 713, nil, nil, 713, 713, nil, nil, nil, 713, + 713, 713, 713, nil, nil, nil, nil, nil, 713, nil, + nil, nil, nil, nil, nil, nil, 713, 713, nil, 713, + 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, + nil, nil, 713, nil, nil, nil, nil, 714, 714, nil, + nil, 714, nil, nil, nil, nil, nil, nil, nil, nil, + 714, 714, 713, 714, 714, 714, 714, 714, 714, 714, + nil, nil, 714, 714, nil, nil, nil, 714, 714, 714, + 714, nil, nil, nil, nil, nil, 714, nil, nil, nil, + nil, nil, nil, nil, 714, 714, nil, 714, 714, 714, + 714, 714, 714, 714, 714, 714, 714, 714, nil, nil, + 714, nil, nil, nil, nil, 1219, 1219, nil, nil, 1219, + nil, nil, nil, nil, nil, nil, nil, nil, 1219, 1219, + 714, 1219, 1219, 1219, 1219, 1219, 1219, 1219, nil, nil, + 1219, 1219, nil, nil, nil, 1219, 1219, 1219, 1219, nil, + nil, nil, nil, nil, 1219, nil, nil, nil, nil, nil, + nil, nil, 1219, 1219, nil, 1219, 1219, 1219, 1219, 1219, + 1219, 1219, 1219, 1219, 1219, 1219, nil, nil, 1219, nil, + nil, nil, nil, 1220, 1220, nil, nil, 1220, nil, nil, + nil, nil, nil, nil, nil, nil, 1220, 1220, 1219, 1220, + 1220, 1220, 1220, 1220, 1220, 1220, nil, nil, 1220, 1220, + nil, nil, nil, 1220, 1220, 1220, 1220, nil, nil, nil, + nil, nil, 1220, nil, nil, nil, nil, nil, nil, nil, + 1220, 1220, nil, 1220, 1220, 1220, 1220, 1220, 1220, 1220, + 1220, 1220, 1220, 1220, nil, nil, 1220, nil, nil, nil, + nil, 1243, 1243, nil, nil, 1243, nil, nil, nil, nil, + nil, nil, nil, nil, 1243, 1243, 1220, 1243, 1243, 1243, + 1243, 1243, 1243, 1243, nil, nil, 1243, 1243, nil, nil, + nil, 1243, 1243, 1243, 1243, nil, nil, nil, nil, nil, + 1243, nil, nil, nil, nil, nil, nil, nil, 1243, 1243, + nil, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, + 1243, 1243, nil, nil, 1243, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1243 ] + +racc_action_pointer = [ + nil, 60, 1098, 96, nil, 194, nil, nil, 5417, 1083, + nil, 26870, 27003, 72, nil, 47, 56, 704, 167, 317, + -32, 92, 283, nil, -65, 5560, 1386, 27136, 296, nil, + -40, nil, 165, 5698, 5830, 5960, 6103, 6246, nil, 1242, + 24924, 25063, nil, 224, 449, 513, 306, 6389, 6532, 167, + 6675, 6818, 697, 6961, 248, 361, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 7099, nil, 7240, 7383, nil, + -22, nil, 7526, 7669, nil, nil, 7812, 25202, 25341, 25480, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 101, nil, nil, nil, + nil, nil, nil, 259, 279, 295, 311, nil, nil, 27269, + nil, nil, nil, nil, nil, nil, 0, nil, nil, 136, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 7955, nil, nil, nil, nil, 8098, 8241, 8384, + 8527, 8670, 341, nil, 399, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 381, nil, 1386, 8813, 8956, 9099, 9242, + 9385, 9528, 29764, 29832, nil, nil, 401, 1530, 409, nil, + 29546, 29583, 433, 1674, 9671, 9814, 9957, nil, nil, 376, + -21, 104, 535, 114, 459, 547, nil, 10100, 226, 241, + 1818, 589, nil, nil, 10243, 10386, 10529, 10672, 10815, 10958, + 11101, 11244, 11387, 11530, 11673, 11816, 11959, 12102, 12245, 12388, + 12531, 12674, 12817, 12960, 13103, 13246, nil, nil, nil, nil, + 13389, nil, nil, 388, 412, 514, 548, 552, 576, 596, + 617, 654, 736, nil, nil, nil, nil, nil, nil, nil, + 29900, nil, nil, 586, 13532, 13675, nil, nil, nil, nil, + nil, nil, nil, nil, 13818, nil, 2106, nil, 562, 568, + nil, 13961, 611, 14104, nil, nil, 14247, 14390, nil, nil, + 396, nil, nil, 14533, 1227, nil, 555, 1962, 577, 622, + 586, 25619, 2106, 455, 504, 516, 672, 591, nil, 652, + 635, 193, 676, 682, nil, nil, nil, 686, 266, 686, + 25758, nil, 597, 620, 3402, 3546, 760, nil, 796, 14676, + nil, 14819, 2250, 1329, 739, nil, -94, 172, 742, 14962, + nil, 806, -8, 8, 15105, 2394, 2538, 412, 856, 750, + -19, -7, 640, 847, 24, 892, nil, nil, 1087, 1089, + 181, nil, 650, nil, 823, 15248, nil, 29598, nil, 383, + nil, 402, nil, 136, nil, 808, 440, nil, 818, 481, + nil, 821, -59, nil, 827, -58, nil, 485, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 2682, 27402, nil, nil, nil, nil, 838, nil, 910, + 827, 15391, 828, nil, nil, 817, nil, 652, 147, 921, + nil, nil, 1530, nil, nil, nil, nil, nil, 1674, 841, + nil, nil, 845, 849, 644, 649, 7240, nil, nil, nil, + 272, 408, 893, nil, nil, 15529, 15661, 15794, 983, 987, + nil, nil, 872, 870, 875, nil, nil, 876, 881, 882, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 871, + 784, nil, nil, 15937, nil, nil, nil, 0, nil, nil, + nil, 982, nil, nil, 983, 462, 16080, 1029, nil, nil, + nil, -26, nil, 950, 29968, 30036, 16223, 223, 16366, 16509, + 16652, 896, 899, 27755, 27868, 3690, 3834, 810, 1007, 980, + 981, 982, 983, 5417, 5560, 1121, 3978, 4122, 4266, 4410, + 4554, 4698, 1214, 1243, 4842, 4986, 2250, 5130, nil, nil, + nil, 16795, 1043, nil, 16933, nil, nil, nil, nil, 17059, + 928, 933, 940, nil, nil, nil, 947, nil, nil, 17202, + nil, nil, 17345, nil, 17488, nil, 196, nil, nil, nil, + 17631, 1515, 963, 954, 953, nil, nil, 956, 25897, 960, + 17774, 30104, 30172, 725, 1003, nil, nil, 26036, 966, nil, + 17917, 30240, 30308, 18060, 5274, 2394, 18203, 1087, 971, nil, + nil, 18346, nil, nil, 18489, nil, 1010, 994, nil, 534, + 1046, 2826, 1128, nil, 2970, 63, 1145, 1149, 308, 1152, + nil, 18632, 18775, 30376, 30444, 26, nil, nil, 766, nil, + 30512, 30580, 18918, nil, nil, nil, 811, 3114, nil, 29606, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 208, nil, nil, 298, nil, nil, nil, 1036, + nil, nil, 1038, nil, 1056, nil, 27535, nil, 19061, 1041, + 19204, 19347, 19490, 30648, 30716, 19633, 19776, 651, 19919, 20062, + 20205, 20348, 1074, nil, nil, nil, 20491, 20634, 1078, nil, + 1133, 1818, 551, nil, 20777, nil, nil, nil, 330, nil, + nil, 749, 29657, nil, 29680, nil, 16939, nil, 1032, 20920, + nil, 918, nil, 1051, 1056, 1372, 1060, nil, nil, nil, + nil, nil, nil, 1146, 1962, nil, nil, nil, 281, 326, + 544, 680, 1066, 21063, 21206, nil, -70, nil, nil, nil, + nil, 1084, nil, nil, nil, 375, 27981, -82, nil, 1066, + 1146, 1069, nil, nil, 28094, nil, nil, 1, nil, nil, + 796, nil, nil, 952, 7099, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 955, 443, nil, nil, + 1074, 27668, -14, nil, 113, 1176, -19, nil, nil, 21349, + nil, 1096, nil, 1210, nil, 1092, nil, 1140, 21492, nil, + nil, 21635, nil, nil, 158, 26175, 1103, nil, 1110, -9, + -5, 1149, 25, 776, 1150, 1120, 26314, nil, 1183, -7, + nil, nil, 691, nil, nil, nil, 884, nil, 1237, nil, + nil, nil, nil, nil, 1245, 1246, nil, nil, nil, 21778, + 69, 1132, 29, 30, 162, 163, 3258, 1231, 784, nil, + 1152, 3402, 21921, 465, 1270, 34, 1156, 1153, 3546, nil, + nil, nil, nil, nil, nil, nil, nil, 1154, 22064, 1158, + 402, 421, 816, 952, nil, 2538, 22207, 1156, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 22350, 22493, + nil, nil, nil, nil, 3690, nil, 1169, 1214, nil, nil, + 1176, nil, 1260, nil, nil, 1183, 1185, nil, 1186, 1193, + nil, 1194, nil, nil, nil, 1198, 1084, 3964, nil, nil, + 22636, 22779, 22922, 23065, 23208, 23351, 479, 28207, 1275, 28320, + 1236, 195, 28433, 28546, 589, -31, 1203, 1204, nil, 28659, + nil, 1203, 266, nil, 1220, 28772, 28885, nil, 340, 1248, + 213, nil, nil, 16918, 29492, nil, nil, nil, nil, 23494, + nil, nil, nil, nil, nil, 23637, nil, nil, nil, nil, + 337, nil, 3834, nil, nil, 1224, 1213, nil, 117, nil, + nil, nil, nil, 1212, 39, nil, nil, nil, 1336, nil, + nil, 23780, nil, 3978, 1341, nil, nil, nil, 28998, nil, + 23923, 4122, 68, 1342, nil, 1344, 598, nil, nil, nil, + 4266, 4410, 1223, 1229, nil, nil, nil, nil, nil, 1218, + 1234, 490, nil, nil, 24066, 2682, 2826, 4554, nil, 9, + 26453, nil, nil, 29708, nil, 24945, nil, 25084, nil, 25223, + nil, nil, nil, nil, 1235, 1236, 2970, 3114, 24209, nil, + 1246, nil, nil, nil, nil, 1285, 1289, 1292, 1258, 1267, + 1268, nil, nil, nil, 1307, 1269, 1270, nil, 1274, nil, + nil, 740, 1273, nil, nil, nil, nil, nil, nil, 1285, + 3258, 1283, 1284, nil, 1285, 1293, 1299, nil, 1333, 1320, + 1303, 26592, nil, nil, nil, nil, nil, 4698, nil, 35, + nil, nil, 43, 866, nil, 24352, 426, nil, nil, nil, + 4842, 1351, 1458, 2092, nil, nil, 1460, 4986, 120, 135, + 786, 1416, 144, nil, 1344, 1347, 1348, 1351, 4108, 4252, + 29111, nil, nil, nil, nil, nil, nil, nil, 29224, nil, + 243, nil, 29337, nil, 367, nil, nil, 475, nil, nil, + nil, 611, nil, 745, nil, nil, 1372, 26731, 855, 1428, + nil, 5130, nil, 24495, 24638, nil, nil, nil, nil, 1477, + nil, nil, 707, nil, nil, nil, nil, 1491, 24781, 30784, + 30852, 145, 25362, nil, nil, nil, nil, 1370, 1371, 1378, + nil, nil, 1379, nil, nil, 1380, 1383, 1385, 1386, nil, + 1387, nil, 861, 30920, nil, 898, 5274, nil, nil, nil, + nil, 2236, nil, 1391, 158, 168, 169, 236, 1390, 29450, + nil, 881, nil, 5662, nil, 5761, nil, 7063, nil, nil, + 1430, 1434, nil, 32, nil, 171, nil, 1398, 1399, 1408, + 1409, nil, nil, nil, 15493, nil, nil, nil, nil, 1410, + nil ] + +racc_action_default = [ + -1, -782, -781, -782, -2, -767, -4, -5, -782, -8, + -9, -782, -782, -782, -35, -782, -782, -40, -782, -782, + -672, -672, -317, -56, -769, -782, -65, -782, -74, -75, + -76, -80, -291, -291, -291, -331, -359, -360, -92, -781, + -96, -104, -106, -782, -659, -660, -782, -782, -782, -782, + -782, -782, -244, -782, -769, -262, -308, -309, -310, -311, + -312, -313, -314, -315, -316, -753, -319, -321, -781, -329, + -339, -341, -782, -782, -71, -71, -767, -782, -782, -782, + -361, -362, -364, -365, -366, -367, -368, -369, -370, -371, + -372, -373, -382, -442, -586, -587, -588, -589, -590, -781, + -593, -781, -781, -781, -781, -781, -781, -629, -630, -781, + -632, -638, -640, -641, -642, -643, -751, -648, -649, -752, + -651, -652, -653, -654, -655, -656, -657, -658, -663, -664, + 1291, -3, -768, -777, -778, -779, -7, -782, -782, -782, + -782, -782, -782, -23, -782, -135, -136, -137, -138, -139, + -140, -141, -145, -146, -147, -148, -149, -150, -151, -152, + -153, -154, -155, -156, -157, -158, -159, -160, -161, -162, + -163, -164, -165, -166, -167, -168, -169, -170, -171, -172, + -173, -174, -175, -176, -177, -178, -179, -180, -181, -182, + -183, -184, -185, -186, -187, -188, -189, -190, -191, -192, + -193, -194, -195, -196, -197, -198, -199, -200, -201, -202, + -203, -204, -205, -206, -207, -208, -209, -210, -211, -212, + -213, -214, -215, -28, -142, -781, -782, -782, -782, -782, + -782, -781, -782, -782, -763, -764, -782, -781, -671, -669, + -695, -695, -782, -781, -782, -782, -769, -770, -60, -782, + -659, -660, -782, -317, -782, -782, -250, -782, -672, -672, + -781, -782, -61, -63, -227, -228, -782, -782, -782, -782, + -782, -782, -782, -782, -782, -782, -782, -782, -782, -782, + -782, -782, -782, -782, -782, -782, -263, -264, -265, -266, + -782, -66, -67, -782, -135, -136, -175, -176, -177, -193, + -198, -205, -208, -659, -660, -738, -739, -375, -470, -450, + -782, -765, -766, -81, -781, -782, -338, -374, -454, -463, + -465, -87, -460, -88, -769, -89, -269, -286, -781, -781, + -290, -294, -297, -299, -781, -743, -747, -750, -90, -91, + -767, -16, -17, -782, -20, -21, -94, -781, -769, -782, + -97, -100, -781, -112, -113, -782, -782, -120, -331, -334, + -769, -782, -672, -672, -359, -360, -363, -461, -782, -102, + -782, -108, -327, -782, -229, -230, -639, -238, -239, -782, + -251, -782, -781, -323, -769, -270, -774, -774, -769, -781, + -340, -70, -782, -782, -782, -781, -781, -767, -782, -768, + -659, -660, -782, -782, -317, -782, -392, -393, -130, -131, + -782, -133, -782, -317, -781, -782, -355, -695, -591, -782, + -614, -782, -616, -782, -618, -782, -782, -598, -782, -782, + -604, -782, -782, -610, -782, -782, -612, -782, -631, -633, + -634, -635, -636, -6, -780, -29, -30, -31, -32, -33, + -10, -781, -782, -25, -26, -27, -143, -782, -36, -39, + -304, -299, -782, -303, -37, -782, -41, -782, -317, -53, + -55, -216, -274, -297, -57, -58, -42, -217, -274, -769, + -281, -282, -781, -781, -754, -755, -291, -458, -756, -757, + -755, -754, -291, -457, -459, -756, -757, -782, -578, -782, + -405, -406, -769, -737, -737, -677, -678, -680, -680, -680, + -694, -696, -697, -698, -699, -700, -701, -702, -703, -704, + -782, -706, -708, -710, -715, -717, -718, -721, -726, -728, + -729, -731, -732, -733, -735, -782, -782, -782, -52, -224, + -59, -769, -337, -782, -782, -782, -781, -327, -782, -782, + -782, -782, -782, -782, -782, -225, -226, -231, -232, -233, + -234, -235, -236, -240, -241, -242, -243, -245, -246, -247, + -248, -249, -252, -253, -254, -255, -769, -267, -68, -761, + -762, -782, -782, -471, -291, -754, -755, -78, -82, -696, + -769, -781, -769, -292, -467, -470, -769, -333, -287, -782, + -296, -288, -782, -293, -782, -298, -782, -746, -749, -15, + -768, -19, -782, -769, -93, -325, -109, -98, -782, -769, + -781, -782, -782, -119, -782, -671, -639, -782, -105, -110, + -782, -782, -782, -782, -268, -256, -782, -782, -769, -322, + -271, -776, -775, -273, -776, -328, -782, -782, -741, -774, + -782, -781, -383, -384, -781, -782, -782, -782, -782, -782, + -378, -782, -781, -782, -782, -327, -71, -130, -131, -132, + -782, -782, -781, -350, -665, -667, -352, -781, -443, -695, + -446, -592, -615, -620, -621, -623, -594, -617, -595, -619, + -596, -597, -782, -600, -602, -782, -603, -606, -607, -782, + -608, -609, -782, -637, -782, -24, -782, -34, -782, -307, + -782, -782, -781, -782, -782, -782, -782, -462, -283, -285, + -782, -782, -83, -279, -280, -455, -782, -782, -85, -456, + -48, -258, -781, -376, -781, -357, -381, -670, -782, -675, + -676, -782, -782, -687, -782, -690, -782, -692, -782, -782, + -394, -782, -396, -398, -401, -404, -769, -709, -719, -720, + -730, -734, -673, -50, -260, -358, -336, -771, -754, -755, + -754, -755, -769, -782, -782, -62, -488, -491, -492, -493, + -494, -496, -498, -501, -502, -557, -769, -514, -517, -527, + -531, -536, -538, -539, -542, -543, -781, -546, -548, -549, + -550, -555, -556, -782, -782, -560, -561, -562, -563, -564, + -565, -566, -567, -568, -569, -570, -782, -782, -576, -64, + -782, -782, -769, -449, -781, -77, -451, -467, -276, -283, + -278, -782, -468, -782, -332, -781, -295, -300, -302, -744, + -745, -782, -18, -22, -95, -782, -101, -107, -769, -754, + -755, -781, -758, -118, -782, -103, -782, -223, -237, -769, + -320, -324, -774, -772, -330, -742, -781, -385, -781, -72, + -386, -387, -344, -345, -782, -782, -480, -347, -473, -782, + -782, -769, -754, -755, -758, -326, -781, -130, -131, -134, + -769, -781, -782, -782, -782, -782, -769, -782, -781, -599, + -601, -605, -611, -613, -11, -144, -38, -305, -302, -769, + -754, -755, -755, -754, -54, -275, -782, -781, -44, -219, + -45, -220, -84, -46, -222, -47, -221, -86, -782, -782, + -12, -14, -377, -379, -781, -585, -579, -781, -580, -581, + -737, -716, -721, -736, -679, -680, -680, -707, -680, -680, + -727, -680, -704, -408, -722, -769, -782, -782, -403, -705, + -782, -782, -782, -782, -782, -782, -462, -489, -782, -782, + -499, -500, -782, -782, -782, -519, -769, -769, -513, -520, + -524, -782, -782, -516, -782, -782, -782, -530, -537, -541, + -782, -545, -547, -553, -554, -558, -559, -571, -572, -782, + -644, -645, -646, -131, -574, -782, -69, -740, -431, -432, + -769, -434, -781, -453, -452, -782, -769, -464, -781, -466, + -289, -301, -748, -99, -462, -111, -335, -272, -782, -380, + -388, -782, -390, -781, -782, -73, -346, -348, -782, -474, + -782, -781, -462, -782, -462, -782, -782, -353, -356, -444, + -781, -781, -436, -769, -622, -625, -626, -627, -628, -782, + -306, -462, -43, -218, -284, -49, -259, -781, -584, -782, + -782, -583, -674, -782, -683, -782, -685, -782, -688, -782, + -691, -693, -395, -397, -399, -402, -51, -261, -782, -490, + -527, -495, -497, -506, -510, -782, -782, -782, -769, -769, + -769, -575, -511, -512, -534, -521, -522, -525, -769, -781, + -773, -782, -528, -532, -535, -540, -544, -551, -552, -769, + -257, -737, -737, -412, -781, -781, -781, -430, -782, -769, + -704, -712, -713, -724, -472, -79, -277, -781, -342, -782, + -391, -343, -782, -485, -475, -782, -781, -349, -351, -666, + -781, -782, -782, -782, -445, -624, -781, -781, -659, -660, + -782, -782, -317, -582, -680, -680, -680, -680, -782, -782, + -782, -503, -504, -505, -507, -508, -509, -526, -782, -515, + -782, -518, -782, -573, -782, -410, -411, -415, -414, -421, + -423, -782, -426, -782, -428, -433, -782, -782, -711, -782, + -469, -781, -481, -782, -782, -476, -477, -478, -479, -782, + -447, -448, -769, -438, -440, -441, -13, -578, -781, -782, + -782, -327, -782, -681, -684, -686, -689, -400, -528, -523, + -529, -533, -737, -714, -413, -781, -781, -781, -781, -725, + -781, -435, -723, -782, -327, -781, -781, -486, -487, -354, + -437, -782, -577, -769, -754, -755, -758, -326, -680, -782, + -409, -782, -418, -782, -420, -782, -424, -782, -427, -429, + -326, -758, -389, -781, -439, -462, -682, -781, -781, -781, + -781, -482, -483, -484, -782, -416, -419, -422, -425, -781, + -417 ] + +racc_goto_table = [ + 6, 309, 292, 519, 519, 45, 318, 322, 390, 291, + 875, 45, 651, 654, 669, 245, 732, 419, 239, 239, + 16, 749, 366, 366, 232, 450, 16, 437, 592, 350, + 304, 659, 940, 479, 135, 311, 4, 395, 396, 327, + 327, 327, 45, 354, 354, 381, 499, 18, 601, 743, + 745, 747, 537, 18, 947, 739, 740, 16, 931, 366, + 366, 366, 143, 224, 463, 464, 385, 775, 819, 1028, + 45, 1034, 148, 148, 313, 321, 323, 328, 328, 328, + 401, 304, 304, 839, 18, 16, 392, 393, 148, 588, + 397, 439, 151, 151, 750, 406, 628, 420, 132, 422, + 424, 427, 430, 433, 436, 135, 476, 420, 778, 778, + 386, 983, 18, 369, 582, 248, 590, 950, 640, 643, + 538, 1012, 502, 535, 1090, 839, 510, 510, 376, 243, + 131, 325, 338, 339, 9, 45, 1106, 756, 486, 492, + 9, 136, 1239, 831, 45, 346, 1112, 1085, 348, 1083, + 16, 445, 446, 447, 448, 236, 242, 1053, 1, 16, + 1125, 1213, 1215, 329, 329, 329, 946, 2, 948, 692, + 148, 142, 695, 836, 1097, 1100, 836, 18, 414, 416, + 519, 995, 996, 1105, 1108, 930, 18, 625, 625, 1067, + 1113, 637, 842, 612, 223, 407, 387, 459, 452, 383, + 839, 398, 601, 349, 470, 553, 487, 470, 554, 293, + 578, 821, 1239, 869, 1035, 310, 584, 827, 977, 706, + 379, 470, 388, 826, 305, 647, 405, 673, 45, 480, + 382, 384, 638, 389, 891, 327, 893, 1150, 677, 1084, + 45, 1127, 1189, 16, 976, 465, 45, 1129, 465, 1212, + 678, 1049, 606, 417, 544, 16, 239, 239, 895, 1274, + 1215, 16, 465, 45, 9, 443, 594, 595, 462, 462, + 18, 1128, 18, 449, 889, 18, 1018, 880, 16, 824, + 1206, 1142, 18, 1281, 1038, 1246, 1091, 1092, 18, 18, + 972, 874, 836, 836, 496, 973, 1122, 982, 985, 680, + 1114, 1115, 998, 510, 937, 18, 1069, 418, 421, 423, + 426, 429, 480, 432, 435, 1137, 458, 469, 327, 327, + 469, 1054, 897, 898, 438, 750, 600, 600, 327, 958, + 1228, 892, 420, 366, 469, 318, 945, 1235, 1229, 1230, + 941, 322, 1233, 581, 846, nil, 45, nil, 772, 1207, + 45, 624, 366, 855, 354, 45, 591, 328, 1227, 629, + 621, 16, 1083, nil, nil, 16, 328, 243, 955, 135, + 16, 1117, 1118, 354, 1113, 687, 1015, 689, 631, 646, + 693, 865, 1113, 693, nil, 45, 1231, 648, 18, 457, + 1196, 947, 18, 551, 552, 477, nil, 18, 45, 45, + 16, 833, nil, 836, 1096, 1099, nil, 663, 655, 539, + nil, 593, 675, 16, 16, nil, nil, nil, nil, nil, + 596, 1004, 848, 617, 349, 1089, 135, 18, nil, nil, + 1095, 1098, 1179, 610, 1126, nil, nil, nil, 776, 776, + 18, 18, 519, 329, nil, nil, 950, 626, 1272, 6, + 486, 492, 329, 346, 45, nil, 613, nil, 346, nil, + 724, 619, nil, 1231, 881, 609, 729, nil, nil, 16, + 646, 243, 713, 1122, 890, 611, 1282, 1122, 1232, 1122, + 600, 600, 1216, nil, 723, 704, 894, 1074, 1076, nil, + 1078, 1080, 1072, 1081, nil, 843, 18, 1164, 922, 947, + 1041, 730, nil, 705, 927, 519, nil, 519, 391, 391, + nil, 349, 391, 148, 909, nil, 349, 649, 487, nil, + 797, 797, 658, nil, nil, nil, nil, 851, 722, nil, + 750, 750, nil, 151, 728, nil, nil, 851, nil, nil, + 763, nil, nil, 1016, 480, 839, nil, 1122, nil, 1122, + 327, 1122, 1143, 1122, 1020, nil, 813, 813, 724, 656, + 657, 896, nil, nil, 762, 510, nil, 820, nil, 851, + 1122, 1023, 938, 391, 391, 391, 391, 851, 1101, 947, + nil, nil, 723, 9, nil, nil, nil, nil, nil, 600, + nil, nil, nil, 778, 1027, 487, 918, 920, nil, nil, + 366, nil, 923, 925, nil, 487, 496, 629, nil, 366, + nil, 1236, nil, 45, nil, 1237, 629, nil, 480, 486, + 492, 354, nil, 735, 327, 1283, 825, nil, 16, 886, + 354, nil, 1197, nil, nil, nil, 1020, 487, 836, nil, + nil, nil, nil, nil, nil, 487, 900, nil, nil, 900, + nil, nil, nil, nil, 45, 18, nil, 45, nil, nil, + 480, 765, nil, nil, 474, 475, 327, nil, nil, 16, + 480, 975, 16, 1185, 1186, nil, 327, nil, nil, 989, + 45, 540, 541, 496, 870, 1277, nil, 487, 470, 1157, + nil, nil, nil, 496, nil, 16, 18, 470, 470, 18, + 1045, nil, nil, 470, 470, 942, 1223, 1224, 1225, 1226, + 480, 45, nil, 539, 990, 477, 327, nil, 45, nil, + nil, nil, 18, nil, nil, 496, 16, 835, nil, 465, + 935, 496, 939, 16, nil, 1252, nil, nil, 465, 465, + nil, nil, 750, 750, 465, 465, nil, nil, nil, nil, + nil, nil, nil, 18, nil, nil, 18, 905, nil, 1201, + 18, 860, 1202, 646, 1014, 18, 18, 148, nil, 862, + nil, 18, 18, 1130, nil, 496, 462, 646, 984, 1208, + 872, 873, nil, 877, 1260, nil, nil, 151, nil, 813, + nil, nil, 1062, nil, 420, 857, 1006, 813, 1013, nil, + 1276, 469, nil, 291, nil, nil, 813, 813, nil, nil, + 469, 469, nil, nil, nil, 866, 469, 469, 868, nil, + nil, 1134, 1008, nil, nil, 724, nil, 366, 729, nil, + 391, nil, nil, 600, 629, nil, 519, nil, 366, 646, + 906, nil, nil, nil, nil, 1025, 917, 914, 354, 723, + nil, 676, 975, nil, nil, nil, nil, 975, 975, 354, + 1152, nil, nil, nil, 1032, nil, 1032, 645, nil, nil, + 1111, 943, 646, nil, 943, nil, nil, nil, nil, nil, + nil, 646, 148, nil, nil, 919, 921, 1052, nil, 45, + nil, 924, 926, 470, 45, nil, nil, nil, nil, nil, + 646, 45, nil, nil, 16, nil, 1046, nil, nil, 16, + nil, nil, nil, nil, nil, 600, 16, nil, nil, nil, + nil, nil, 1047, 776, nil, nil, nil, nil, nil, nil, + nil, 18, nil, nil, 465, 1071, 18, 45, nil, 797, + 797, nil, nil, 18, nil, nil, nil, nil, nil, 797, + 1130, nil, 16, nil, 1130, 797, nil, 917, 717, 1209, + nil, 18, 646, nil, nil, nil, nil, 646, 646, nil, + 813, nil, 813, nil, nil, 813, 813, nil, nil, 18, + nil, nil, 813, nil, nil, nil, nil, nil, 813, 813, + nil, nil, nil, nil, nil, nil, 813, 813, 1036, 1037, + nil, 1052, nil, nil, nil, 797, 469, nil, nil, nil, + nil, nil, nil, 1119, nil, 45, 1008, 822, 1048, nil, + 1253, nil, nil, nil, 1130, nil, nil, 1180, nil, nil, + 16, nil, nil, nil, nil, nil, 45, nil, nil, nil, + nil, 813, nil, nil, 45, 1139, nil, nil, nil, nil, + 1043, 16, 366, 45, 45, nil, nil, 18, nil, 16, + nil, nil, 1059, nil, nil, nil, nil, nil, 16, 16, + 45, 19, 859, 1159, nil, 1149, nil, 19, 18, nil, + nil, 1063, nil, nil, nil, 16, 18, nil, 1163, 646, + 646, 646, nil, nil, 249, 18, 18, nil, 1068, 984, + nil, nil, nil, nil, 249, 249, 249, 420, 19, 355, + 355, nil, 18, 366, nil, 949, nil, 951, nil, nil, + 1052, nil, 1188, 1188, 1188, 851, nil, 919, 921, 926, + 924, nil, nil, nil, 304, nil, 19, nil, nil, nil, + 45, 249, 249, 1123, 1032, 249, 402, 412, 412, nil, + 20, 942, 1138, 45, 935, 16, 20, nil, 1141, nil, + 45, nil, nil, nil, nil, 1219, nil, 1147, 16, 1148, + nil, 1131, nil, 813, nil, 16, nil, nil, nil, 366, + nil, 813, 18, nil, nil, 813, nil, 20, 362, 362, + nil, nil, nil, 487, nil, 18, nil, 1140, nil, nil, + 304, 19, 18, 1250, 45, 1146, 249, 249, 249, 249, + 19, nil, nil, nil, 1151, 20, 480, 1247, 1248, 16, + nil, nil, 327, nil, nil, 362, 362, 362, 805, 805, + nil, 1156, nil, 1188, 1188, 1188, 1188, nil, 1188, nil, + nil, 542, nil, 1032, 646, nil, 18, nil, nil, 45, + nil, 966, nil, 1063, nil, nil, nil, nil, nil, nil, + nil, nil, 813, nil, 16, 978, nil, nil, nil, nil, + nil, 1032, nil, nil, nil, 1188, 1188, 1188, 1188, nil, + 20, 496, nil, nil, nil, nil, nil, 1188, nil, 20, + nil, 18, nil, nil, 19, 249, 467, 249, 249, 467, + 249, 1200, nil, nil, 496, nil, 19, nil, nil, nil, + nil, nil, 19, 467, 249, 249, nil, 943, nil, 597, + 1123, 1217, nil, nil, 1123, nil, 1123, 1024, 391, 19, + nil, nil, nil, 1249, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 614, nil, 1131, nil, nil, 1131, nil, + nil, nil, 1131, nil, 1131, nil, nil, nil, nil, nil, + 1042, nil, nil, nil, nil, 1245, nil, nil, nil, 1044, + nil, nil, nil, 20, nil, 20, nil, nil, 20, 639, + nil, 1124, nil, 249, 249, 20, nil, nil, 1061, nil, + nil, 20, 20, 249, 1123, nil, 1123, nil, 1123, nil, + 1123, nil, nil, nil, nil, nil, nil, nil, 20, nil, + 1273, nil, 19, nil, nil, nil, 19, 1123, nil, nil, + 355, 19, 1131, nil, 1131, nil, 1131, nil, 1131, nil, + nil, nil, nil, nil, nil, 391, nil, nil, nil, 355, + nil, nil, nil, nil, 1165, 1131, 1166, nil, 1167, nil, + 1094, 19, nil, nil, nil, 1102, 1103, 1190, 1192, 1194, + nil, 805, nil, 249, 19, 19, nil, 391, nil, 805, + nil, nil, nil, nil, nil, nil, nil, nil, 805, 805, + nil, nil, nil, nil, 249, nil, nil, nil, nil, nil, + nil, 20, nil, nil, nil, 20, nil, 737, nil, 362, + 20, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 460, 473, nil, nil, nil, 362, nil, + 19, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 20, nil, nil, nil, nil, nil, 766, nil, nil, nil, + nil, nil, nil, 20, 20, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 1238, nil, 1240, nil, 249, nil, 1262, 1264, + 1266, 1268, nil, 1269, nil, nil, nil, 1174, 1175, 1176, + nil, nil, nil, nil, nil, 828, nil, 830, 21, nil, + nil, 834, nil, 1258, 21, nil, nil, nil, nil, 20, + nil, nil, nil, nil, nil, 249, nil, nil, 844, nil, + 1285, 1286, 1287, 1288, 847, 249, nil, nil, 603, nil, + 605, nil, 1290, 607, 608, 21, 363, 363, nil, nil, + nil, nil, 1278, 861, 1279, nil, 1280, nil, nil, 391, + 391, nil, 805, nil, 805, nil, nil, 805, 805, nil, + 249, nil, nil, 21, 805, 1289, nil, 806, 806, nil, + 805, 805, nil, 363, 363, 363, nil, nil, 805, 805, + nil, nil, nil, nil, nil, nil, 650, nil, nil, 19, + nil, nil, nil, nil, nil, nil, nil, 355, nil, 249, + nil, nil, nil, nil, nil, nil, 355, nil, nil, nil, + nil, nil, nil, nil, nil, 249, nil, nil, nil, nil, + nil, nil, nil, 805, nil, nil, nil, nil, 21, nil, + 19, nil, nil, 19, nil, nil, nil, 21, nil, nil, + nil, 249, 1275, nil, nil, nil, nil, nil, nil, nil, + nil, 249, nil, nil, nil, nil, 19, nil, 709, nil, + nil, 959, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, nil, nil, nil, nil, 362, nil, nil, nil, + nil, nil, nil, nil, nil, 362, nil, 19, nil, nil, + 467, 249, nil, nil, 19, nil, nil, nil, nil, 467, + 467, 807, 807, nil, nil, 467, 467, nil, nil, 20, + nil, nil, 20, nil, nil, nil, nil, nil, nil, nil, + 757, 21, nil, 21, nil, nil, 21, 1007, nil, nil, + nil, nil, nil, 21, nil, 20, nil, nil, nil, 21, + 21, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 805, 21, nil, nil, nil, + nil, nil, nil, 805, 1026, nil, 20, 805, nil, 20, + nil, nil, nil, 20, nil, nil, nil, nil, 20, 20, + nil, nil, nil, nil, 20, 20, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 837, nil, nil, 650, + 806, 840, nil, nil, nil, nil, nil, nil, 806, nil, + nil, nil, nil, nil, nil, nil, nil, 806, 806, nil, + nil, nil, nil, nil, 355, 22, nil, nil, nil, nil, + nil, 22, nil, nil, nil, 355, nil, nil, 837, 21, + nil, 650, nil, 21, 805, nil, nil, 363, 21, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 878, nil, + 1082, nil, 22, 357, 357, 19, 363, nil, nil, nil, + 19, 249, nil, nil, nil, nil, nil, 19, 21, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 22, 21, 21, nil, nil, 467, nil, nil, nil, nil, + 404, 413, 413, 362, nil, nil, nil, 907, nil, nil, + nil, nil, nil, 19, 362, 837, 650, nil, nil, nil, + nil, 1136, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 936, nil, nil, 807, nil, nil, nil, nil, nil, + nil, nil, 807, nil, 20, nil, 954, 21, nil, 20, + nil, 807, 807, nil, nil, 22, 20, nil, 1154, nil, + nil, nil, nil, nil, 22, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 20, nil, nil, nil, 249, nil, + nil, 806, nil, 806, nil, nil, 806, 806, nil, nil, + nil, 19, 20, 806, nil, nil, nil, nil, nil, 806, + 806, nil, nil, nil, nil, nil, nil, 806, 806, nil, + 249, nil, 19, nil, nil, nil, nil, nil, nil, nil, + 19, nil, nil, nil, 1183, nil, 837, nil, nil, 19, + 19, nil, nil, nil, nil, 1021, nil, nil, 1022, nil, + nil, nil, nil, nil, nil, nil, 19, nil, 22, 1160, + 468, nil, 806, 468, nil, nil, nil, nil, nil, nil, + 22, nil, nil, nil, nil, nil, 22, 468, nil, nil, + 20, nil, nil, nil, nil, nil, 1039, nil, nil, nil, + nil, nil, nil, 22, nil, nil, nil, nil, nil, nil, + nil, 20, nil, nil, nil, nil, nil, nil, nil, 20, + nil, nil, nil, nil, nil, 1060, 21, nil, 20, 20, + 1198, nil, nil, nil, 363, 807, 19, 807, nil, nil, + 807, 807, nil, 363, nil, 20, nil, 807, 362, 19, + nil, nil, nil, 807, 807, nil, 19, nil, nil, nil, + nil, 807, 807, nil, nil, nil, nil, 21, nil, nil, + 21, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 22, nil, nil, nil, + 22, nil, nil, 21, 357, 22, 1242, nil, nil, nil, + 19, nil, 249, 249, 806, nil, 807, nil, nil, 362, + nil, nil, 806, 357, nil, 20, 806, 249, nil, nil, + nil, nil, nil, nil, 21, 22, nil, 21, 20, nil, + nil, 21, nil, nil, nil, 20, 21, 21, 22, 22, + nil, nil, 21, 21, nil, 19, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1144, nil, nil, + nil, nil, nil, 808, 808, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 362, nil, nil, nil, 20, + nil, 650, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 806, 22, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 20, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 807, nil, + nil, nil, nil, nil, nil, nil, 807, nil, nil, nil, + 807, nil, 32, nil, nil, nil, nil, nil, 32, nil, + nil, 363, 1205, nil, nil, nil, 809, 809, nil, nil, + nil, nil, 363, nil, nil, 32, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 32, 32, 32, nil, 32, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 21, nil, nil, nil, nil, 21, nil, nil, + nil, nil, nil, nil, 21, nil, nil, 32, nil, nil, + nil, nil, 32, 32, nil, nil, 32, 807, nil, nil, + nil, nil, 21, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 21, nil, nil, 22, nil, nil, nil, nil, nil, nil, + nil, 357, nil, nil, nil, nil, nil, nil, nil, nil, + 357, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 32, nil, nil, nil, nil, 32, 32, 32, + 32, 32, nil, nil, 22, nil, 808, 22, nil, nil, + nil, nil, nil, nil, 808, nil, nil, nil, nil, nil, + nil, nil, nil, 808, 808, nil, nil, nil, nil, nil, + 22, nil, nil, 810, 810, nil, nil, nil, 21, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 21, + nil, 22, nil, nil, 468, nil, nil, 21, 22, nil, + nil, nil, nil, 468, 468, nil, 21, 21, nil, 468, + 468, nil, nil, nil, nil, 32, 32, 32, 32, 32, + 32, 32, nil, 21, nil, 35, 363, 32, nil, nil, + nil, 35, nil, 32, 32, 32, 32, nil, nil, 809, + nil, nil, nil, nil, nil, nil, nil, 809, 35, nil, + 32, nil, nil, nil, nil, nil, 809, 809, 35, 35, + 35, nil, 35, nil, nil, nil, nil, 811, 811, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 363, nil, nil, + 35, nil, nil, 21, nil, 35, 35, nil, nil, 35, + nil, nil, nil, nil, 32, 32, 21, nil, 812, 812, + nil, nil, nil, 21, 32, nil, nil, 808, nil, 808, + nil, nil, 808, 808, nil, nil, nil, nil, 357, 808, + nil, nil, nil, 32, nil, 808, 808, 32, nil, 357, + nil, nil, 32, 808, 808, nil, nil, nil, nil, nil, + nil, nil, nil, 363, nil, 35, nil, 21, nil, nil, + 35, 35, 35, 35, 35, nil, nil, nil, nil, 22, + nil, nil, 32, nil, 22, nil, nil, nil, nil, nil, + 1058, 22, nil, nil, 32, 32, 32, nil, 808, nil, + nil, nil, nil, nil, nil, nil, 810, nil, nil, 468, + nil, nil, 21, nil, 810, 32, nil, nil, nil, nil, + nil, nil, nil, 810, 810, nil, nil, 22, nil, nil, + 809, nil, 809, nil, nil, 809, 809, nil, nil, nil, + nil, nil, 809, nil, nil, nil, nil, 44, 809, 809, + nil, 32, nil, 44, nil, nil, 809, 809, 35, 35, + 35, 35, 35, 35, 35, nil, nil, nil, nil, nil, + 35, nil, 303, nil, nil, nil, 35, 35, 35, 35, + nil, nil, nil, nil, 44, 353, 353, nil, nil, nil, + nil, nil, nil, 35, nil, nil, nil, 32, nil, nil, + nil, 809, nil, nil, nil, 22, nil, nil, nil, nil, + 811, nil, 44, nil, nil, nil, nil, nil, 811, nil, + nil, nil, 400, 303, 303, nil, 22, 811, 811, nil, + 808, nil, nil, nil, 22, nil, 32, nil, 808, nil, + nil, nil, 808, 22, 22, nil, 32, 35, 35, nil, + nil, 812, nil, nil, nil, nil, nil, 35, nil, 812, + 22, nil, nil, 1162, nil, nil, nil, nil, 812, 812, + nil, nil, nil, nil, nil, nil, 35, 44, nil, nil, + 35, 32, nil, nil, nil, 35, 44, 810, nil, 810, + nil, nil, 810, 810, nil, nil, nil, 814, 814, 810, + nil, nil, nil, nil, nil, 810, 810, nil, nil, nil, + 32, nil, nil, 810, 810, 35, nil, nil, nil, 808, + 32, nil, nil, nil, 413, nil, nil, 35, 35, 35, + 22, nil, nil, 809, nil, nil, 32, nil, nil, nil, + nil, 809, nil, 22, nil, 809, nil, nil, 35, nil, + 22, 32, nil, nil, 32, nil, nil, nil, 810, nil, + nil, nil, 32, nil, nil, nil, nil, nil, nil, nil, + 44, nil, 32, nil, nil, nil, nil, 32, nil, nil, + nil, nil, 44, nil, 35, nil, nil, nil, 44, nil, + 413, 811, nil, 811, 22, nil, 811, 811, nil, nil, + nil, nil, nil, 811, nil, 44, nil, nil, 32, 811, + 811, 32, 32, nil, nil, 32, nil, 811, 811, nil, + 32, 32, 809, nil, nil, nil, 32, 32, nil, nil, + 35, nil, 812, nil, 812, nil, nil, 812, 812, 22, + nil, nil, nil, nil, 812, nil, nil, nil, nil, nil, + 812, 812, nil, nil, nil, nil, nil, nil, 812, 812, + nil, nil, 811, nil, nil, nil, nil, nil, nil, 35, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 35, + nil, nil, nil, nil, nil, nil, nil, nil, 44, nil, + 810, nil, 44, nil, nil, nil, 353, 44, 810, nil, + nil, nil, 810, 812, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 35, 353, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 44, nil, nil, + 814, nil, nil, nil, nil, nil, nil, nil, 814, nil, + 44, 44, nil, 35, nil, nil, nil, 814, 814, nil, + nil, nil, nil, 35, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 35, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 810, + nil, nil, nil, nil, 35, nil, 32, 35, nil, nil, + nil, 32, 32, nil, 811, 35, 44, nil, 32, nil, + nil, nil, 811, nil, nil, 35, 811, nil, nil, nil, + 35, nil, nil, nil, nil, nil, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 32, 812, nil, nil, nil, nil, + nil, 35, nil, 812, 35, 35, nil, 812, 35, nil, + nil, nil, nil, 35, 35, nil, nil, nil, nil, 35, + 35, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 811, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 32, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 814, 32, 814, nil, nil, 814, 814, nil, nil, + nil, nil, nil, 814, 812, nil, nil, nil, nil, 814, + 814, 32, nil, 32, nil, nil, nil, 814, 814, nil, + nil, 32, nil, nil, nil, nil, nil, nil, nil, nil, + 32, 32, nil, nil, nil, 44, nil, nil, nil, nil, + nil, nil, nil, 353, nil, nil, nil, 32, nil, nil, + nil, nil, 353, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 814, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 44, nil, nil, 44, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 35, + nil, nil, 44, nil, 35, 35, nil, nil, nil, nil, + nil, 35, nil, nil, nil, nil, nil, 32, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 35, + 32, nil, nil, 44, 256, nil, nil, 32, nil, nil, + 44, nil, nil, nil, 326, 326, 326, 35, nil, nil, + nil, nil, nil, nil, nil, nil, 374, 375, nil, 377, + 378, nil, 380, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 326, nil, nil, + nil, 32, nil, 32, 32, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 814, nil, nil, nil, 32, nil, + nil, nil, 814, nil, nil, nil, 814, nil, nil, nil, + nil, nil, 35, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 35, 32, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 35, nil, 35, nil, nil, nil, + nil, nil, nil, nil, 35, nil, nil, nil, nil, nil, + nil, nil, nil, 35, 35, nil, nil, nil, nil, nil, + 353, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 35, 353, nil, 814, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 44, nil, nil, nil, nil, 44, nil, nil, nil, + nil, nil, nil, 44, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 326, 472, nil, nil, 478, + 326, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 35, nil, nil, 478, nil, nil, nil, nil, nil, 44, + nil, nil, nil, 35, nil, nil, 256, nil, nil, nil, + 35, nil, nil, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, nil, nil, nil, nil, 577, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 35, nil, 35, 35, nil, nil, + nil, nil, nil, 326, 326, nil, nil, nil, nil, nil, + nil, 35, nil, 326, nil, nil, nil, 44, nil, nil, + 326, nil, 326, nil, nil, 326, 326, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 44, 35, + nil, nil, nil, nil, nil, nil, 44, nil, nil, nil, + nil, nil, nil, nil, nil, 44, 44, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 634, nil, + 635, nil, 44, nil, nil, 1158, nil, nil, 326, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 303, nil, nil, nil, + nil, nil, 44, nil, nil, nil, nil, nil, nil, nil, + 326, nil, nil, nil, nil, 44, nil, nil, nil, nil, + nil, nil, 44, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 731, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 303, nil, nil, nil, 44, nil, nil, nil, + nil, nil, 326, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 764, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 326, nil, 478, 478, 478, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 44, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 375, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 326, nil, + nil, 326, nil, 326, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 326, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 478, + nil, nil, 858, nil, nil, nil, nil, nil, nil, nil, + 326, nil, nil, 326, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 326, 326, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 326, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 326, + 478, 326, nil, nil, nil, 915, nil, 326, 326, 478, + 478, nil, nil, nil, nil, 478, 478, nil, nil, nil, + nil, nil, nil, 326, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 326, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 731, 764, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 326, nil, + nil, nil, nil, nil, nil, nil, nil, 326, nil, nil, + 326, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 326, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 326, nil, nil, + nil, nil, nil, nil, nil, 478, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1065, 1066, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 1086, + 1087, 478, 478, 478, 478, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 1120, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 326, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 326, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 478, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 326, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 326 ] + +racc_goto_check = [ + 6, 178, 46, 251, 251, 78, 95, 95, 113, 49, + 125, 78, 117, 117, 79, 44, 14, 217, 6, 6, + 27, 155, 88, 88, 37, 10, 27, 217, 96, 74, + 78, 124, 153, 35, 130, 37, 2, 54, 54, 40, + 40, 40, 78, 78, 78, 44, 12, 33, 98, 249, + 249, 249, 12, 33, 252, 159, 159, 27, 16, 88, + 88, 88, 21, 21, 28, 28, 6, 45, 45, 118, + 78, 120, 81, 81, 62, 62, 62, 92, 92, 92, + 78, 78, 78, 261, 33, 27, 23, 23, 81, 63, + 23, 49, 83, 83, 148, 27, 76, 6, 8, 6, + 6, 6, 6, 6, 6, 130, 32, 6, 196, 196, + 92, 206, 33, 75, 179, 26, 35, 256, 93, 93, + 32, 167, 177, 177, 211, 261, 246, 246, 86, 132, + 5, 69, 69, 69, 9, 78, 211, 149, 61, 61, + 9, 7, 257, 64, 78, 70, 212, 150, 71, 147, + 27, 23, 23, 23, 23, 39, 39, 169, 1, 27, + 165, 171, 172, 94, 94, 94, 166, 3, 166, 233, + 81, 11, 233, 99, 197, 197, 99, 33, 80, 80, + 251, 221, 221, 210, 197, 15, 33, 245, 245, 17, + 210, 12, 19, 20, 22, 25, 94, 29, 31, 9, + 261, 5, 98, 13, 24, 47, 95, 24, 48, 51, + 52, 53, 257, 55, 57, 60, 61, 66, 195, 84, + 89, 24, 91, 97, 109, 112, 127, 129, 78, 6, + 133, 134, 135, 136, 137, 40, 138, 139, 140, 151, + 78, 156, 162, 27, 194, 27, 78, 163, 27, 170, + 173, 174, 217, 175, 37, 27, 6, 6, 176, 171, + 172, 27, 27, 78, 9, 7, 181, 182, 92, 92, + 33, 169, 33, 9, 79, 33, 184, 185, 27, 187, + 188, 189, 33, 190, 191, 192, 199, 201, 33, 33, + 202, 124, 99, 99, 81, 203, 152, 207, 208, 177, + 214, 215, 224, 246, 225, 33, 226, 229, 230, 231, + 232, 235, 6, 236, 237, 167, 26, 26, 40, 40, + 26, 238, 239, 240, 243, 148, 6, 6, 40, 148, + 212, 244, 6, 88, 26, 95, 250, 165, 212, 211, + 254, 95, 255, 260, 76, nil, 78, nil, 35, 120, + 78, 44, 88, 76, 78, 78, 92, 92, 150, 74, + 37, 27, 147, nil, nil, 27, 92, 132, 149, 130, + 27, 221, 221, 78, 210, 234, 64, 234, 37, 44, + 234, 93, 210, 234, nil, 78, 210, 6, 33, 13, + 169, 252, 33, 39, 39, 85, nil, 33, 78, 78, + 27, 179, nil, 99, 195, 195, nil, 37, 23, 85, + nil, 69, 6, 27, 27, nil, nil, nil, nil, nil, + 69, 79, 35, 75, 13, 194, 130, 33, nil, nil, + 194, 194, 206, 8, 166, nil, nil, nil, 193, 193, + 33, 33, 251, 94, nil, nil, 256, 86, 118, 6, + 61, 61, 94, 70, 78, nil, 71, nil, 70, nil, + 95, 71, nil, 210, 35, 5, 95, nil, nil, 27, + 44, 132, 37, 152, 35, 9, 120, 152, 153, 152, + 6, 6, 16, nil, 6, 2, 12, 249, 249, nil, + 249, 249, 159, 249, nil, 10, 33, 166, 63, 252, + 117, 40, nil, 21, 63, 251, nil, 251, 30, 30, + nil, 13, 30, 81, 35, nil, 13, 94, 95, nil, + 219, 219, 5, nil, nil, nil, nil, 61, 62, nil, + 148, 148, nil, 83, 62, nil, nil, 61, nil, nil, + 40, nil, nil, 96, 6, 261, nil, 152, nil, 152, + 40, 152, 45, 152, 98, nil, 78, 78, 95, 13, + 13, 177, nil, nil, 130, 246, nil, 44, nil, 61, + 152, 76, 28, 30, 30, 30, 30, 61, 79, 252, + nil, nil, 6, 9, nil, nil, nil, nil, nil, 6, + nil, nil, nil, 196, 93, 95, 32, 32, nil, nil, + 88, nil, 32, 32, nil, 95, 81, 74, nil, 88, + nil, 166, nil, 78, nil, 166, 74, nil, 6, 61, + 61, 78, nil, 111, 40, 125, 62, nil, 27, 54, + 78, nil, 155, nil, nil, nil, 98, 95, 99, nil, + nil, nil, nil, nil, nil, 95, 234, nil, nil, 234, + nil, nil, nil, nil, 78, 33, nil, 78, nil, nil, + 6, 111, nil, nil, 30, 30, 40, nil, nil, 27, + 6, 193, 27, 159, 159, nil, 40, nil, nil, 193, + 78, 30, 30, 81, 130, 166, nil, 95, 24, 117, + nil, nil, nil, 81, nil, 27, 33, 24, 24, 33, + 12, nil, nil, 24, 24, 219, 249, 249, 249, 249, + 6, 78, nil, 85, 217, 85, 40, nil, 78, nil, + nil, nil, 33, nil, nil, 81, 27, 94, nil, 27, + 6, 81, 6, 27, nil, 14, nil, nil, 27, 27, + nil, nil, 148, 148, 27, 27, nil, nil, nil, nil, + nil, nil, nil, 33, nil, nil, 33, 21, nil, 117, + 33, 111, 117, 44, 113, 33, 33, 81, nil, 94, + nil, 33, 33, 251, nil, 81, 92, 44, 44, 124, + 111, 111, nil, 111, 159, nil, nil, 83, nil, 78, + nil, nil, 32, nil, 6, 85, 46, 78, 178, nil, + 249, 26, nil, 49, nil, nil, 78, 78, nil, nil, + 26, 26, nil, nil, nil, 13, 26, 26, 13, nil, + nil, 12, 6, nil, nil, 95, nil, 88, 95, nil, + 30, nil, nil, 6, 74, nil, 251, nil, 88, 44, + 9, nil, nil, nil, nil, 74, 94, 9, 78, 6, + nil, 30, 193, nil, nil, nil, nil, 193, 193, 78, + 12, nil, nil, nil, 6, nil, 6, 36, nil, nil, + 193, 160, 44, nil, 160, nil, nil, nil, nil, nil, + nil, 44, 81, nil, nil, 85, 85, 44, nil, 78, + nil, 85, 85, 24, 78, nil, nil, nil, nil, nil, + 44, 78, nil, nil, 27, nil, 23, nil, nil, 27, + nil, nil, nil, nil, nil, 6, 27, nil, nil, nil, + nil, nil, 130, 193, nil, nil, nil, nil, nil, nil, + nil, 33, nil, nil, 27, 6, 33, 78, nil, 219, + 219, nil, nil, 33, nil, nil, nil, nil, nil, 219, + 251, nil, 27, nil, 251, 219, nil, 94, 36, 12, + nil, 33, 44, nil, nil, nil, nil, 44, 44, nil, + 78, nil, 78, nil, nil, 78, 78, nil, nil, 33, + nil, nil, 78, nil, nil, nil, nil, nil, 78, 78, + nil, nil, nil, nil, nil, nil, 78, 78, 111, 111, + nil, 44, nil, nil, nil, 219, 26, nil, nil, nil, + nil, nil, nil, 23, nil, 78, 6, 30, 111, nil, + 35, nil, nil, nil, 251, nil, nil, 217, nil, nil, + 27, nil, nil, nil, nil, nil, 78, nil, nil, nil, + nil, 78, nil, nil, 78, 23, nil, nil, nil, nil, + 13, 27, 88, 78, 78, nil, nil, 33, nil, 27, + nil, nil, 13, nil, nil, nil, nil, nil, 27, 27, + 78, 34, 30, 78, nil, 130, nil, 34, 33, nil, + nil, 85, nil, nil, nil, 27, 33, nil, 27, 44, + 44, 44, nil, nil, 34, 33, 33, nil, 13, 44, + nil, nil, nil, nil, 34, 34, 34, 6, 34, 34, + 34, nil, 33, 88, nil, 164, nil, 164, nil, nil, + 44, nil, 6, 6, 6, 61, nil, 85, 85, 85, + 85, nil, nil, nil, 78, nil, 34, nil, nil, nil, + 78, 34, 34, 160, 6, 34, 34, 34, 34, nil, + 38, 219, 111, 78, 6, 27, 38, nil, 111, nil, + 78, nil, nil, nil, nil, 37, nil, 111, 27, 111, + nil, 253, nil, 78, nil, 27, nil, nil, nil, 88, + nil, 78, 33, nil, nil, 78, nil, 38, 38, 38, + nil, nil, nil, 95, nil, 33, nil, 13, nil, nil, + 78, 34, 33, 44, 78, 13, 34, 34, 34, 34, + 34, nil, nil, nil, 13, 38, 6, 23, 23, 27, + nil, nil, 40, nil, nil, 38, 38, 38, 101, 101, + nil, 13, nil, 6, 6, 6, 6, nil, 6, nil, + nil, 72, nil, 6, 44, nil, 33, nil, nil, 78, + nil, 36, nil, 85, nil, nil, nil, nil, nil, nil, + nil, nil, 78, nil, 27, 36, nil, nil, nil, nil, + nil, 6, nil, nil, nil, 6, 6, 6, 6, nil, + 38, 81, nil, nil, nil, nil, nil, 6, nil, 38, + nil, 33, nil, nil, 34, 34, 34, 34, 34, 34, + 34, 13, nil, nil, 81, nil, 34, nil, nil, nil, + nil, nil, 34, 34, 34, 34, nil, 160, nil, 72, + 160, 13, nil, nil, 160, nil, 160, 36, 30, 34, + nil, nil, nil, 111, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 72, nil, 253, nil, nil, 253, nil, + nil, nil, 253, nil, 253, nil, nil, nil, nil, nil, + 36, nil, nil, nil, nil, 13, nil, nil, nil, 36, + nil, nil, nil, 38, nil, 38, nil, nil, 38, 72, + nil, 164, nil, 34, 34, 38, nil, nil, 36, nil, + nil, 38, 38, 34, 160, nil, 160, nil, 160, nil, + 160, nil, nil, nil, nil, nil, nil, nil, 38, nil, + 13, nil, 34, nil, nil, nil, 34, 160, nil, nil, + 34, 34, 253, nil, 253, nil, 253, nil, 253, nil, + nil, nil, nil, nil, nil, 30, nil, nil, nil, 34, + nil, nil, nil, nil, 164, 253, 164, nil, 164, nil, + 36, 34, nil, nil, nil, 36, 36, 161, 161, 161, + nil, 101, nil, 34, 34, 34, nil, 30, nil, 101, + nil, nil, nil, nil, nil, nil, nil, nil, 101, 101, + nil, nil, nil, nil, 34, nil, nil, nil, nil, nil, + nil, 38, nil, nil, nil, 38, nil, 72, nil, 38, + 38, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 90, 90, nil, nil, nil, 38, nil, + 34, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 38, nil, nil, nil, nil, nil, 72, nil, nil, nil, + nil, nil, nil, 38, 38, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 164, nil, 164, nil, 34, nil, 161, 161, + 161, 161, nil, 161, nil, nil, nil, 36, 36, 36, + nil, nil, nil, nil, nil, 72, nil, 72, 42, nil, + nil, 72, nil, 164, 42, nil, nil, nil, nil, 38, + nil, nil, nil, nil, nil, 34, nil, nil, 72, nil, + 161, 161, 161, 161, 72, 34, nil, nil, 90, nil, + 90, nil, 161, 90, 90, 42, 42, 42, nil, nil, + nil, nil, 164, 72, 164, nil, 164, nil, nil, 30, + 30, nil, 101, nil, 101, nil, nil, 101, 101, nil, + 34, nil, nil, 42, 101, 164, nil, 102, 102, nil, + 101, 101, nil, 42, 42, 42, nil, nil, 101, 101, + nil, nil, nil, nil, nil, nil, 90, nil, nil, 34, + nil, nil, nil, nil, nil, nil, nil, 34, nil, 34, + nil, nil, nil, nil, nil, nil, 34, nil, nil, nil, + nil, nil, nil, nil, nil, 34, nil, nil, nil, nil, + nil, nil, nil, 101, nil, nil, nil, nil, 42, nil, + 34, nil, nil, 34, nil, nil, nil, 42, nil, nil, + nil, 34, 36, nil, nil, nil, nil, nil, nil, nil, + nil, 34, nil, nil, nil, nil, 34, nil, 90, nil, + nil, 72, nil, nil, nil, nil, nil, nil, 38, nil, + nil, nil, nil, nil, nil, nil, 38, nil, nil, nil, + nil, nil, nil, nil, nil, 38, nil, 34, nil, nil, + 34, 34, nil, nil, 34, nil, nil, nil, nil, 34, + 34, 103, 103, nil, nil, 34, 34, nil, nil, 38, + nil, nil, 38, nil, nil, nil, nil, nil, nil, nil, + 90, 42, nil, 42, nil, nil, 42, 72, nil, nil, + nil, nil, nil, 42, nil, 38, nil, nil, nil, 42, + 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 101, 42, nil, nil, nil, + nil, nil, nil, 101, 72, nil, 38, 101, nil, 38, + nil, nil, nil, 38, nil, nil, nil, nil, 38, 38, + nil, nil, nil, nil, 38, 38, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 90, nil, nil, 90, + 102, 90, nil, nil, nil, nil, nil, nil, 102, nil, + nil, nil, nil, nil, nil, nil, nil, 102, 102, nil, + nil, nil, nil, nil, 34, 43, nil, nil, nil, nil, + nil, 43, nil, nil, nil, 34, nil, nil, 90, 42, + nil, 90, nil, 42, 101, nil, nil, 42, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 90, nil, + 72, nil, 43, 43, 43, 34, 42, nil, nil, nil, + 34, 34, nil, nil, nil, nil, nil, 34, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 43, 42, 42, nil, nil, 34, nil, nil, nil, nil, + 43, 43, 43, 38, nil, nil, nil, 90, nil, nil, + nil, nil, nil, 34, 38, 90, 90, nil, nil, nil, + nil, 72, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 90, nil, nil, 103, nil, nil, nil, nil, nil, + nil, nil, 103, nil, 38, nil, 90, 42, nil, 38, + nil, 103, 103, nil, nil, 43, 38, nil, 72, nil, + nil, nil, nil, nil, 43, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 38, nil, nil, nil, 34, nil, + nil, 102, nil, 102, nil, nil, 102, 102, nil, nil, + nil, 34, 38, 102, nil, nil, nil, nil, nil, 102, + 102, nil, nil, nil, nil, nil, nil, 102, 102, nil, + 34, nil, 34, nil, nil, nil, nil, nil, nil, nil, + 34, nil, nil, nil, 72, nil, 90, nil, nil, 34, + 34, nil, nil, nil, nil, 90, nil, nil, 90, nil, + nil, nil, nil, nil, nil, nil, 34, nil, 43, 34, + 43, nil, 102, 43, nil, nil, nil, nil, nil, nil, + 43, nil, nil, nil, nil, nil, 43, 43, nil, nil, + 38, nil, nil, nil, nil, nil, 90, nil, nil, nil, + nil, nil, nil, 43, nil, nil, nil, nil, nil, nil, + nil, 38, nil, nil, nil, nil, nil, nil, nil, 38, + nil, nil, nil, nil, nil, 90, 42, nil, 38, 38, + 34, nil, nil, nil, 42, 103, 34, 103, nil, nil, + 103, 103, nil, 42, nil, 38, nil, 103, 38, 34, + nil, nil, nil, 103, 103, nil, 34, nil, nil, nil, + nil, 103, 103, nil, nil, nil, nil, 42, nil, nil, + 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 43, nil, nil, nil, + 43, nil, nil, 42, 43, 43, 34, nil, nil, nil, + 34, nil, 34, 34, 102, nil, 103, nil, nil, 38, + nil, nil, 102, 43, nil, 38, 102, 34, nil, nil, + nil, nil, nil, nil, 42, 43, nil, 42, 38, nil, + nil, 42, nil, nil, nil, 38, 42, 42, 43, 43, + nil, nil, 42, 42, nil, 34, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 90, nil, nil, + nil, nil, nil, 104, 104, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 38, nil, nil, nil, 38, + nil, 90, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 102, 43, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 38, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 103, nil, + nil, nil, nil, nil, nil, nil, 103, nil, nil, nil, + 103, nil, 65, nil, nil, nil, nil, nil, 65, nil, + nil, 42, 90, nil, nil, nil, 105, 105, nil, nil, + nil, nil, 42, nil, nil, 65, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 65, 65, 65, nil, 65, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 42, nil, nil, nil, nil, 42, nil, nil, + nil, nil, nil, nil, 42, nil, nil, 65, nil, nil, + nil, nil, 65, 65, nil, nil, 65, 103, nil, nil, + nil, nil, 42, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 42, nil, nil, 43, nil, nil, nil, nil, nil, nil, + nil, 43, nil, nil, nil, nil, nil, nil, nil, nil, + 43, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 65, nil, nil, nil, nil, 65, 65, 65, + 65, 65, nil, nil, 43, nil, 104, 43, nil, nil, + nil, nil, nil, nil, 104, nil, nil, nil, nil, nil, + nil, nil, nil, 104, 104, nil, nil, nil, nil, nil, + 43, nil, nil, 106, 106, nil, nil, nil, 42, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 42, + nil, 43, nil, nil, 43, nil, nil, 42, 43, nil, + nil, nil, nil, 43, 43, nil, 42, 42, nil, 43, + 43, nil, nil, nil, nil, 65, 65, 65, 65, 65, + 65, 65, nil, 42, nil, 68, 42, 65, nil, nil, + nil, 68, nil, 65, 65, 65, 65, nil, nil, 105, + nil, nil, nil, nil, nil, nil, nil, 105, 68, nil, + 65, nil, nil, nil, nil, nil, 105, 105, 68, 68, + 68, nil, 68, nil, nil, nil, nil, 107, 107, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 42, nil, nil, + 68, nil, nil, 42, nil, 68, 68, nil, nil, 68, + nil, nil, nil, nil, 65, 65, 42, nil, 108, 108, + nil, nil, nil, 42, 65, nil, nil, 104, nil, 104, + nil, nil, 104, 104, nil, nil, nil, nil, 43, 104, + nil, nil, nil, 65, nil, 104, 104, 65, nil, 43, + nil, nil, 65, 104, 104, nil, nil, nil, nil, nil, + nil, nil, nil, 42, nil, 68, nil, 42, nil, nil, + 68, 68, 68, 68, 68, nil, nil, nil, nil, 43, + nil, nil, 65, nil, 43, nil, nil, nil, nil, nil, + 43, 43, nil, nil, 65, 65, 65, nil, 104, nil, + nil, nil, nil, nil, nil, nil, 106, nil, nil, 43, + nil, nil, 42, nil, 106, 65, nil, nil, nil, nil, + nil, nil, nil, 106, 106, nil, nil, 43, nil, nil, + 105, nil, 105, nil, nil, 105, 105, nil, nil, nil, + nil, nil, 105, nil, nil, nil, nil, 77, 105, 105, + nil, 65, nil, 77, nil, nil, 105, 105, 68, 68, + 68, 68, 68, 68, 68, nil, nil, nil, nil, nil, + 68, nil, 77, nil, nil, nil, 68, 68, 68, 68, + nil, nil, nil, nil, 77, 77, 77, nil, nil, nil, + nil, nil, nil, 68, nil, nil, nil, 65, nil, nil, + nil, 105, nil, nil, nil, 43, nil, nil, nil, nil, + 107, nil, 77, nil, nil, nil, nil, nil, 107, nil, + nil, nil, 77, 77, 77, nil, 43, 107, 107, nil, + 104, nil, nil, nil, 43, nil, 65, nil, 104, nil, + nil, nil, 104, 43, 43, nil, 65, 68, 68, nil, + nil, 108, nil, nil, nil, nil, nil, 68, nil, 108, + 43, nil, nil, 43, nil, nil, nil, nil, 108, 108, + nil, nil, nil, nil, nil, nil, 68, 77, nil, nil, + 68, 65, nil, nil, nil, 68, 77, 106, nil, 106, + nil, nil, 106, 106, nil, nil, nil, 115, 115, 106, + nil, nil, nil, nil, nil, 106, 106, nil, nil, nil, + 65, nil, nil, 106, 106, 68, nil, nil, nil, 104, + 65, nil, nil, nil, 43, nil, nil, 68, 68, 68, + 43, nil, nil, 105, nil, nil, 65, nil, nil, nil, + nil, 105, nil, 43, nil, 105, nil, nil, 68, nil, + 43, 65, nil, nil, 65, nil, nil, nil, 106, nil, + nil, nil, 65, nil, nil, nil, nil, nil, nil, nil, + 77, nil, 65, nil, nil, nil, nil, 65, nil, nil, + nil, nil, 77, nil, 68, nil, nil, nil, 77, nil, + 43, 107, nil, 107, 43, nil, 107, 107, nil, nil, + nil, nil, nil, 107, nil, 77, nil, nil, 65, 107, + 107, 65, 65, nil, nil, 65, nil, 107, 107, nil, + 65, 65, 105, nil, nil, nil, 65, 65, nil, nil, + 68, nil, 108, nil, 108, nil, nil, 108, 108, 43, + nil, nil, nil, nil, 108, nil, nil, nil, nil, nil, + 108, 108, nil, nil, nil, nil, nil, nil, 108, 108, + nil, nil, 107, nil, nil, nil, nil, nil, nil, 68, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 68, + nil, nil, nil, nil, nil, nil, nil, nil, 77, nil, + 106, nil, 77, nil, nil, nil, 77, 77, 106, nil, + nil, nil, 106, 108, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 68, 77, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 77, nil, nil, + 115, nil, nil, nil, nil, nil, nil, nil, 115, nil, + 77, 77, nil, 68, nil, nil, nil, 115, 115, nil, + nil, nil, nil, 68, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 68, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 106, + nil, nil, nil, nil, 68, nil, 65, 68, nil, nil, + nil, 65, 65, nil, 107, 68, 77, nil, 65, nil, + nil, nil, 107, nil, nil, 68, 107, nil, nil, nil, + 68, nil, nil, nil, nil, nil, 65, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 65, 108, nil, nil, nil, nil, + nil, 68, nil, 108, 68, 68, nil, 108, 68, nil, + nil, nil, nil, 68, 68, nil, nil, nil, nil, 68, + 68, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 107, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 65, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 115, 65, 115, nil, nil, 115, 115, nil, nil, + nil, nil, nil, 115, 108, nil, nil, nil, nil, 115, + 115, 65, nil, 65, nil, nil, nil, 115, 115, nil, + nil, 65, nil, nil, nil, nil, nil, nil, nil, nil, + 65, 65, nil, nil, nil, 77, nil, nil, nil, nil, + nil, nil, nil, 77, nil, nil, nil, 65, nil, nil, + nil, nil, 77, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 115, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 77, nil, nil, 77, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 68, + nil, nil, 77, nil, 68, 68, nil, nil, nil, nil, + nil, 68, nil, nil, nil, nil, nil, 65, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 68, + 65, nil, nil, 77, 41, nil, nil, 65, nil, nil, + 77, nil, nil, nil, 41, 41, 41, 68, nil, nil, + nil, nil, nil, nil, nil, nil, 41, 41, nil, 41, + 41, nil, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, 65, nil, 65, 65, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 115, nil, nil, nil, 65, nil, + nil, nil, 115, nil, nil, nil, 115, nil, nil, nil, + nil, nil, 68, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 68, 65, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 68, nil, 68, nil, nil, nil, + nil, nil, nil, nil, 68, nil, nil, nil, nil, nil, + nil, nil, nil, 68, 68, nil, nil, nil, nil, nil, + 77, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 68, 77, nil, 115, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 77, nil, nil, nil, nil, 77, nil, nil, nil, + nil, nil, nil, 77, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, 41, nil, nil, 41, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 68, nil, nil, 41, nil, nil, nil, nil, nil, 77, + nil, nil, nil, 68, nil, nil, 41, nil, nil, nil, + 68, nil, nil, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 68, nil, 68, 68, nil, nil, + nil, nil, nil, 41, 41, nil, nil, nil, nil, nil, + nil, 68, nil, 41, nil, nil, nil, 77, nil, nil, + 41, nil, 41, nil, nil, 41, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 77, 68, + nil, nil, nil, nil, nil, nil, 77, nil, nil, nil, + nil, nil, nil, nil, nil, 77, 77, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + 41, nil, 77, nil, nil, 77, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 77, nil, nil, nil, + nil, nil, 77, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, nil, nil, 77, nil, nil, nil, nil, + nil, nil, 77, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 41, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 77, nil, nil, nil, 77, nil, nil, nil, + nil, nil, 41, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 41, nil, 41, 41, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 77, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, 41, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, 41, nil, nil, nil, nil, nil, nil, nil, + 41, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 41, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + 41, 41, nil, nil, nil, 41, nil, 41, 41, 41, + 41, nil, nil, nil, nil, 41, 41, nil, nil, nil, + nil, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 41, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + 41, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, 41, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, 41, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + 41, 41, 41, 41, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 41, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 41 ] + +racc_goto_pointer = [ + nil, 158, 34, 167, nil, 125, -2, 133, 93, 132, + -117, 161, -191, 164, -482, -547, -674, -741, nil, -418, + -152, 51, 182, 14, -23, 118, 90, 18, -162, -29, + 436, 55, -124, 45, 1069, -198, 479, 5, 1148, 135, + 4, 3549, 1586, 1913, -9, -486, -25, -57, -55, -18, + nil, 182, -83, -367, -37, -442, nil, -655, nil, nil, + 185, -94, 42, -224, -451, 2420, -370, nil, 2653, 96, + 106, 109, 995, nil, -11, 72, -274, 2865, 3, -396, + 100, 61, nil, 81, -237, 165, 79, nil, -18, 168, + 1287, 154, 42, -268, 128, -26, -286, -361, -281, -426, + nil, 675, 1104, 1238, 1780, 1883, 2040, 2144, 2185, 197, + nil, 124, -164, -62, nil, 2464, nil, -380, -797, nil, + -797, nil, nil, nil, -367, -648, nil, 149, nil, -187, + 29, nil, 108, 164, 164, -151, 164, -439, -440, -810, + -178, nil, nil, nil, nil, nil, nil, -807, -426, -383, + -810, -717, -714, -706, nil, -498, -769, nil, nil, -448, + 133, 333, -882, -763, 371, -850, -576, -703, nil, -739, + -904, -992, -991, -167, -644, 160, -420, -118, -27, -194, + nil, -53, -53, nil, -556, -384, nil, -304, -866, -757, + -990, -592, -917, -115, -542, -568, -445, -798, nil, -682, + nil, -682, -495, -490, nil, nil, -676, -490, -490, nil, + -796, -843, -840, nil, -688, -687, nil, -82, nil, -33, + nil, -622, nil, nil, -514, -430, -631, nil, nil, 211, + 207, 207, 207, -257, -46, 207, 208, 208, -576, -362, + -362, nil, nil, 215, -343, -175, -114, nil, nil, -458, + -406, -237, -688, 161, -398, -842, -627, -1049, nil, nil, + 37, -519 ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, nil, 341, 7, 399, 344, + nil, nil, nil, 498, nil, nil, nil, nil, 340, 342, + nil, nil, nil, nil, 14, 15, 23, 254, nil, nil, + 17, nil, 466, 255, 373, nil, nil, 671, 258, nil, + 28, 26, 259, 253, 543, nil, nil, nil, nil, 150, + 27, nil, nil, nil, nil, nil, 394, nil, 29, 30, + nil, 854, nil, nil, nil, 361, nil, 31, 358, 481, + 38, nil, nil, 40, 43, 42, nil, 250, 251, 411, + nil, 489, 149, 95, nil, 471, 111, 52, 55, 290, + 332, nil, 482, nil, 483, 494, 506, 725, 598, 330, + 315, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 66, nil, nil, 316, 70, 71, 72, nil, nil, 73, + 1030, 74, 75, 76, nil, nil, 77, nil, 78, nil, + 652, 79, 237, nil, nil, nil, nil, nil, nil, nil, + nil, 320, 308, 734, 934, 661, 1031, 752, 518, nil, + 753, 754, 504, 500, 501, nil, 1234, 748, 1121, nil, + 505, nil, nil, nil, 507, nil, 509, nil, 1009, nil, + nil, nil, 516, nil, nil, nil, nil, nil, nil, nil, + 493, nil, nil, 832, nil, nil, 583, nil, nil, nil, + nil, nil, nil, 1104, nil, 777, 980, 779, 780, 784, + 781, 782, nil, nil, 783, 785, nil, nil, nil, 979, + 981, 789, nil, 791, 792, 793, 794, nil, 798, 527, + 799, 800, 801, 802, nil, nil, nil, 94, 96, 98, + nil, nil, nil, nil, 682, nil, nil, nil, nil, nil, + nil, 107, 108, nil, nil, 238, 944, 241, 503, nil, + 508, 952, 521, 523, 524, 1132, 528, 1133, 531, 534, + nil, 335 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 150, :_reduce_1, + 2, 148, :_reduce_2, + 2, 149, :_reduce_3, + 1, 151, :_reduce_none, + 1, 151, :_reduce_none, + 3, 151, :_reduce_6, + 2, 151, :_reduce_none, + 1, 154, :_reduce_none, + 0, 158, :_reduce_9, + 3, 154, :_reduce_10, + 3, 157, :_reduce_11, + 0, 164, :_reduce_12, + 6, 159, :_reduce_13, + 3, 159, :_reduce_14, + 2, 160, :_reduce_15, + 1, 165, :_reduce_none, + 1, 165, :_reduce_none, + 3, 165, :_reduce_18, + 2, 165, :_reduce_19, + 1, 166, :_reduce_none, + 0, 167, :_reduce_21, + 3, 166, :_reduce_22, + 0, 178, :_reduce_23, + 4, 156, :_reduce_24, + 3, 156, :_reduce_25, + 3, 156, :_reduce_26, + 3, 156, :_reduce_27, + 2, 156, :_reduce_28, + 3, 156, :_reduce_29, + 3, 156, :_reduce_30, + 3, 156, :_reduce_31, + 3, 156, :_reduce_32, + 3, 156, :_reduce_33, + 4, 156, :_reduce_34, + 1, 156, :_reduce_none, + 3, 156, :_reduce_36, + 3, 156, :_reduce_37, + 5, 156, :_reduce_38, + 3, 156, :_reduce_39, + 1, 156, :_reduce_none, + 3, 171, :_reduce_41, + 3, 171, :_reduce_42, + 6, 171, :_reduce_43, + 5, 171, :_reduce_44, + 5, 171, :_reduce_45, + 5, 171, :_reduce_46, + 5, 171, :_reduce_47, + 4, 171, :_reduce_48, + 6, 171, :_reduce_49, + 4, 171, :_reduce_50, + 6, 171, :_reduce_51, + 3, 171, :_reduce_52, + 1, 179, :_reduce_53, + 3, 179, :_reduce_54, + 1, 179, :_reduce_none, + 1, 177, :_reduce_none, + 3, 177, :_reduce_57, + 3, 177, :_reduce_58, + 3, 177, :_reduce_59, + 2, 177, :_reduce_60, + 0, 194, :_reduce_61, + 4, 177, :_reduce_62, + 0, 195, :_reduce_63, + 4, 177, :_reduce_64, + 1, 177, :_reduce_none, + 1, 193, :_reduce_66, + 2, 185, :_reduce_67, + 0, 200, :_reduce_68, + 5, 189, :_reduce_69, + 1, 170, :_reduce_70, + 0, 203, :_reduce_71, + 0, 204, :_reduce_72, + 4, 201, :_reduce_73, + 1, 173, :_reduce_none, + 1, 173, :_reduce_none, + 1, 205, :_reduce_none, + 4, 205, :_reduce_77, + 0, 213, :_reduce_78, + 4, 210, :_reduce_79, + 1, 212, :_reduce_80, + 2, 187, :_reduce_81, + 3, 187, :_reduce_82, + 4, 187, :_reduce_83, + 5, 187, :_reduce_84, + 4, 187, :_reduce_85, + 5, 187, :_reduce_86, + 2, 187, :_reduce_87, + 2, 187, :_reduce_88, + 2, 187, :_reduce_89, + 2, 187, :_reduce_90, + 2, 187, :_reduce_91, + 1, 172, :_reduce_none, + 3, 172, :_reduce_93, + 1, 218, :_reduce_none, + 3, 218, :_reduce_95, + 1, 217, :_reduce_96, + 2, 217, :_reduce_97, + 3, 217, :_reduce_98, + 5, 217, :_reduce_99, + 2, 217, :_reduce_100, + 4, 217, :_reduce_101, + 2, 217, :_reduce_102, + 4, 217, :_reduce_103, + 1, 217, :_reduce_104, + 3, 217, :_reduce_105, + 1, 221, :_reduce_none, + 3, 221, :_reduce_107, + 2, 220, :_reduce_108, + 3, 220, :_reduce_109, + 1, 223, :_reduce_110, + 3, 223, :_reduce_111, + 1, 222, :_reduce_112, + 1, 222, :_reduce_113, + 4, 222, :_reduce_114, + 3, 222, :_reduce_115, + 3, 222, :_reduce_116, + 3, 222, :_reduce_117, + 3, 222, :_reduce_118, + 2, 222, :_reduce_119, + 1, 222, :_reduce_120, + 1, 174, :_reduce_121, + 1, 174, :_reduce_122, + 4, 174, :_reduce_123, + 3, 174, :_reduce_124, + 3, 174, :_reduce_125, + 3, 174, :_reduce_126, + 3, 174, :_reduce_127, + 2, 174, :_reduce_128, + 1, 174, :_reduce_129, + 1, 226, :_reduce_130, + 1, 226, :_reduce_none, + 2, 227, :_reduce_132, + 1, 227, :_reduce_133, + 3, 227, :_reduce_134, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_none, + 1, 196, :_reduce_138, + 1, 196, :_reduce_none, + 1, 168, :_reduce_140, + 1, 168, :_reduce_none, + 1, 169, :_reduce_142, + 0, 231, :_reduce_143, + 4, 169, :_reduce_144, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 1, 229, :_reduce_none, + 3, 188, :_reduce_216, + 3, 188, :_reduce_217, + 6, 188, :_reduce_218, + 5, 188, :_reduce_219, + 5, 188, :_reduce_220, + 5, 188, :_reduce_221, + 5, 188, :_reduce_222, + 4, 188, :_reduce_223, + 3, 188, :_reduce_224, + 3, 188, :_reduce_225, + 3, 188, :_reduce_226, + 2, 188, :_reduce_227, + 2, 188, :_reduce_228, + 2, 188, :_reduce_229, + 2, 188, :_reduce_230, + 3, 188, :_reduce_231, + 3, 188, :_reduce_232, + 3, 188, :_reduce_233, + 3, 188, :_reduce_234, + 3, 188, :_reduce_235, + 3, 188, :_reduce_236, + 4, 188, :_reduce_237, + 2, 188, :_reduce_238, + 2, 188, :_reduce_239, + 3, 188, :_reduce_240, + 3, 188, :_reduce_241, + 3, 188, :_reduce_242, + 3, 188, :_reduce_243, + 1, 188, :_reduce_none, + 3, 188, :_reduce_245, + 3, 188, :_reduce_246, + 3, 188, :_reduce_247, + 3, 188, :_reduce_248, + 3, 188, :_reduce_249, + 2, 188, :_reduce_250, + 2, 188, :_reduce_251, + 3, 188, :_reduce_252, + 3, 188, :_reduce_253, + 3, 188, :_reduce_254, + 3, 188, :_reduce_255, + 3, 188, :_reduce_256, + 6, 188, :_reduce_257, + 4, 188, :_reduce_258, + 6, 188, :_reduce_259, + 4, 188, :_reduce_260, + 6, 188, :_reduce_261, + 1, 188, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 3, 234, :_reduce_267, + 3, 234, :_reduce_268, + 1, 237, :_reduce_269, + 1, 238, :_reduce_none, + 2, 238, :_reduce_271, + 4, 238, :_reduce_272, + 2, 238, :_reduce_273, + 1, 232, :_reduce_none, + 3, 232, :_reduce_275, + 3, 242, :_reduce_276, + 5, 242, :_reduce_277, + 3, 242, :_reduce_278, + 1, 244, :_reduce_none, + 1, 244, :_reduce_none, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 2, 182, :_reduce_283, + 4, 182, :_reduce_284, + 2, 182, :_reduce_285, + 1, 216, :_reduce_286, + 2, 216, :_reduce_287, + 2, 216, :_reduce_288, + 4, 216, :_reduce_289, + 1, 216, :_reduce_290, + 0, 247, :_reduce_291, + 2, 209, :_reduce_292, + 2, 246, :_reduce_293, + 1, 246, :_reduce_294, + 2, 245, :_reduce_295, + 1, 245, :_reduce_none, + 1, 239, :_reduce_297, + 2, 239, :_reduce_298, + 1, 239, :_reduce_299, + 3, 239, :_reduce_300, + 4, 239, :_reduce_301, + 3, 239, :_reduce_302, + 1, 176, :_reduce_303, + 1, 176, :_reduce_304, + 3, 175, :_reduce_305, + 4, 175, :_reduce_306, + 2, 175, :_reduce_307, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_318, + 0, 280, :_reduce_319, + 4, 235, :_reduce_320, + 0, 281, :_reduce_321, + 3, 235, :_reduce_322, + 0, 282, :_reduce_323, + 4, 235, :_reduce_324, + 3, 235, :_reduce_325, + 3, 235, :_reduce_326, + 2, 235, :_reduce_327, + 3, 235, :_reduce_328, + 0, 283, :_reduce_329, + 4, 235, :_reduce_330, + 1, 235, :_reduce_331, + 4, 235, :_reduce_332, + 3, 235, :_reduce_333, + 1, 235, :_reduce_334, + 5, 235, :_reduce_335, + 4, 235, :_reduce_336, + 3, 235, :_reduce_337, + 2, 235, :_reduce_338, + 1, 235, :_reduce_none, + 2, 235, :_reduce_340, + 1, 235, :_reduce_341, + 6, 235, :_reduce_342, + 6, 235, :_reduce_343, + 4, 235, :_reduce_344, + 4, 235, :_reduce_345, + 5, 235, :_reduce_346, + 4, 235, :_reduce_347, + 5, 235, :_reduce_348, + 6, 235, :_reduce_349, + 0, 284, :_reduce_350, + 6, 235, :_reduce_351, + 0, 285, :_reduce_352, + 0, 286, :_reduce_353, + 8, 235, :_reduce_354, + 0, 287, :_reduce_355, + 5, 235, :_reduce_356, + 4, 235, :_reduce_357, + 4, 235, :_reduce_358, + 1, 235, :_reduce_359, + 1, 235, :_reduce_360, + 1, 235, :_reduce_361, + 1, 235, :_reduce_362, + 1, 181, :_reduce_363, + 1, 257, :_reduce_none, + 1, 263, :_reduce_none, + 1, 266, :_reduce_none, + 1, 268, :_reduce_none, + 1, 269, :_reduce_none, + 1, 270, :_reduce_none, + 1, 273, :_reduce_none, + 1, 275, :_reduce_371, + 1, 278, :_reduce_372, + 1, 197, :_reduce_373, + 1, 288, :_reduce_none, + 1, 289, :_reduce_none, + 1, 290, :_reduce_none, + 1, 291, :_reduce_none, + 1, 292, :_reduce_none, + 1, 162, :_reduce_none, + 1, 293, :_reduce_none, + 1, 258, :_reduce_none, + 1, 215, :_reduce_none, + 1, 264, :_reduce_none, + 1, 264, :_reduce_none, + 2, 264, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 265, :_reduce_none, + 5, 265, :_reduce_389, + 1, 267, :_reduce_none, + 2, 267, :_reduce_391, + 1, 274, :_reduce_none, + 1, 274, :_reduce_393, + 1, 294, :_reduce_394, + 3, 294, :_reduce_395, + 1, 297, :_reduce_396, + 3, 297, :_reduce_397, + 1, 296, :_reduce_398, + 3, 296, :_reduce_399, + 5, 296, :_reduce_400, + 1, 296, :_reduce_401, + 3, 296, :_reduce_402, + 2, 298, :_reduce_403, + 1, 298, :_reduce_404, + 1, 299, :_reduce_none, + 1, 299, :_reduce_none, + 0, 304, :_reduce_407, + 2, 302, :_reduce_none, + 4, 303, :_reduce_409, + 2, 303, :_reduce_410, + 2, 303, :_reduce_411, + 1, 303, :_reduce_412, + 2, 308, :_reduce_413, + 1, 308, :_reduce_none, + 1, 309, :_reduce_415, + 6, 310, :_reduce_416, + 8, 310, :_reduce_417, + 4, 310, :_reduce_418, + 6, 310, :_reduce_419, + 4, 310, :_reduce_420, + 2, 310, :_reduce_421, + 6, 310, :_reduce_422, + 2, 310, :_reduce_423, + 4, 310, :_reduce_424, + 6, 310, :_reduce_425, + 2, 310, :_reduce_426, + 4, 310, :_reduce_427, + 2, 310, :_reduce_428, + 4, 310, :_reduce_429, + 1, 310, :_reduce_430, + 1, 314, :_reduce_431, + 1, 314, :_reduce_432, + 3, 315, :_reduce_433, + 1, 315, :_reduce_434, + 4, 315, :_reduce_435, + 1, 316, :_reduce_none, + 4, 316, :_reduce_437, + 1, 317, :_reduce_438, + 3, 317, :_reduce_439, + 1, 318, :_reduce_440, + 1, 318, :_reduce_none, + 0, 322, :_reduce_442, + 0, 323, :_reduce_443, + 5, 262, :_reduce_444, + 4, 320, :_reduce_445, + 1, 320, :_reduce_446, + 3, 321, :_reduce_447, + 3, 321, :_reduce_448, + 3, 325, :_reduce_449, + 2, 206, :_reduce_450, + 4, 206, :_reduce_451, + 5, 206, :_reduce_452, + 5, 206, :_reduce_453, + 2, 261, :_reduce_454, + 4, 261, :_reduce_455, + 4, 261, :_reduce_456, + 3, 261, :_reduce_457, + 3, 261, :_reduce_458, + 3, 261, :_reduce_459, + 2, 261, :_reduce_460, + 1, 261, :_reduce_461, + 4, 261, :_reduce_462, + 0, 328, :_reduce_463, + 4, 260, :_reduce_464, + 0, 329, :_reduce_465, + 4, 260, :_reduce_466, + 0, 330, :_reduce_467, + 0, 331, :_reduce_468, + 4, 211, :_reduce_469, + 0, 333, :_reduce_470, + 0, 334, :_reduce_471, + 4, 326, :_reduce_472, + 1, 332, :_reduce_473, + 2, 332, :_reduce_474, + 3, 332, :_reduce_475, + 4, 332, :_reduce_476, + 5, 271, :_reduce_477, + 1, 335, :_reduce_none, + 1, 335, :_reduce_none, + 0, 338, :_reduce_480, + 0, 339, :_reduce_481, + 7, 272, :_reduce_482, + 1, 337, :_reduce_none, + 1, 337, :_reduce_none, + 1, 336, :_reduce_none, + 3, 336, :_reduce_486, + 3, 336, :_reduce_487, + 1, 192, :_reduce_none, + 2, 192, :_reduce_489, + 3, 192, :_reduce_490, + 1, 192, :_reduce_491, + 1, 192, :_reduce_492, + 1, 192, :_reduce_493, + 1, 340, :_reduce_none, + 3, 345, :_reduce_495, + 1, 345, :_reduce_none, + 3, 347, :_reduce_497, + 1, 347, :_reduce_none, + 1, 349, :_reduce_499, + 1, 350, :_reduce_500, + 1, 348, :_reduce_none, + 1, 348, :_reduce_none, + 4, 348, :_reduce_503, + 4, 348, :_reduce_504, + 4, 348, :_reduce_505, + 3, 348, :_reduce_506, + 4, 348, :_reduce_507, + 4, 348, :_reduce_508, + 4, 348, :_reduce_509, + 3, 348, :_reduce_510, + 3, 348, :_reduce_511, + 3, 348, :_reduce_512, + 2, 348, :_reduce_513, + 0, 354, :_reduce_514, + 4, 348, :_reduce_515, + 2, 348, :_reduce_516, + 0, 355, :_reduce_517, + 4, 348, :_reduce_518, + 1, 341, :_reduce_519, + 1, 341, :_reduce_520, + 2, 341, :_reduce_521, + 2, 341, :_reduce_522, + 4, 341, :_reduce_523, + 1, 341, :_reduce_none, + 2, 356, :_reduce_525, + 3, 356, :_reduce_526, + 1, 343, :_reduce_527, + 3, 343, :_reduce_528, + 5, 342, :_reduce_529, + 2, 358, :_reduce_530, + 1, 358, :_reduce_531, + 1, 359, :_reduce_none, + 3, 359, :_reduce_533, + 1, 357, :_reduce_534, + 3, 344, :_reduce_535, + 1, 344, :_reduce_536, + 2, 344, :_reduce_537, + 1, 344, :_reduce_538, + 1, 360, :_reduce_none, + 3, 360, :_reduce_540, + 2, 362, :_reduce_541, + 1, 362, :_reduce_542, + 1, 363, :_reduce_543, + 3, 363, :_reduce_544, + 2, 365, :_reduce_545, + 1, 365, :_reduce_546, + 2, 367, :_reduce_547, + 1, 361, :_reduce_none, + 1, 361, :_reduce_none, + 1, 351, :_reduce_none, + 3, 351, :_reduce_551, + 3, 351, :_reduce_552, + 2, 351, :_reduce_553, + 2, 351, :_reduce_554, + 1, 351, :_reduce_none, + 1, 351, :_reduce_none, + 1, 351, :_reduce_none, + 2, 351, :_reduce_558, + 2, 351, :_reduce_559, + 1, 368, :_reduce_none, + 1, 368, :_reduce_none, + 1, 368, :_reduce_none, + 1, 368, :_reduce_none, + 1, 368, :_reduce_564, + 1, 368, :_reduce_565, + 1, 368, :_reduce_566, + 1, 368, :_reduce_567, + 1, 368, :_reduce_568, + 1, 368, :_reduce_none, + 1, 346, :_reduce_570, + 2, 369, :_reduce_571, + 2, 369, :_reduce_572, + 4, 370, :_reduce_573, + 2, 352, :_reduce_574, + 3, 352, :_reduce_575, + 1, 352, :_reduce_576, + 6, 161, :_reduce_577, + 0, 161, :_reduce_578, + 1, 372, :_reduce_579, + 1, 372, :_reduce_none, + 1, 372, :_reduce_none, + 2, 373, :_reduce_582, + 1, 373, :_reduce_none, + 2, 163, :_reduce_584, + 1, 163, :_reduce_none, + 1, 248, :_reduce_586, + 1, 248, :_reduce_none, + 1, 249, :_reduce_588, + 1, 375, :_reduce_589, + 1, 375, :_reduce_none, + 2, 375, :_reduce_591, + 3, 376, :_reduce_592, + 1, 376, :_reduce_593, + 3, 250, :_reduce_594, + 3, 251, :_reduce_595, + 3, 252, :_reduce_596, + 3, 252, :_reduce_597, + 1, 379, :_reduce_598, + 3, 379, :_reduce_599, + 1, 380, :_reduce_none, + 2, 380, :_reduce_601, + 3, 254, :_reduce_602, + 3, 254, :_reduce_603, + 1, 382, :_reduce_604, + 3, 382, :_reduce_605, + 3, 253, :_reduce_606, + 3, 253, :_reduce_607, + 3, 255, :_reduce_608, + 3, 255, :_reduce_609, + 1, 383, :_reduce_610, + 3, 383, :_reduce_611, + 1, 384, :_reduce_612, + 3, 384, :_reduce_613, + 1, 364, :_reduce_614, + 2, 364, :_reduce_615, + 1, 377, :_reduce_616, + 2, 377, :_reduce_617, + 1, 378, :_reduce_618, + 2, 378, :_reduce_619, + 1, 381, :_reduce_620, + 0, 386, :_reduce_621, + 3, 381, :_reduce_622, + 0, 387, :_reduce_623, + 4, 381, :_reduce_624, + 1, 385, :_reduce_625, + 1, 385, :_reduce_626, + 1, 385, :_reduce_627, + 1, 385, :_reduce_none, + 1, 230, :_reduce_none, + 1, 230, :_reduce_none, + 2, 388, :_reduce_631, + 1, 388, :_reduce_632, + 1, 390, :_reduce_none, + 1, 390, :_reduce_none, + 1, 390, :_reduce_none, + 1, 390, :_reduce_none, + 3, 389, :_reduce_637, + 1, 374, :_reduce_none, + 2, 374, :_reduce_639, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 233, :_reduce_none, + 1, 371, :_reduce_644, + 1, 371, :_reduce_645, + 1, 371, :_reduce_646, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 224, :_reduce_none, + 1, 225, :_reduce_652, + 1, 225, :_reduce_653, + 1, 225, :_reduce_654, + 1, 225, :_reduce_655, + 1, 225, :_reduce_656, + 1, 225, :_reduce_657, + 1, 225, :_reduce_658, + 1, 256, :_reduce_659, + 1, 256, :_reduce_660, + 1, 180, :_reduce_661, + 1, 180, :_reduce_662, + 1, 190, :_reduce_663, + 1, 190, :_reduce_664, + 0, 391, :_reduce_665, + 4, 276, :_reduce_666, + 1, 276, :_reduce_667, + 1, 186, :_reduce_none, + 1, 186, :_reduce_669, + 3, 392, :_reduce_670, + 1, 279, :_reduce_none, + 0, 394, :_reduce_672, + 3, 279, :_reduce_673, + 4, 393, :_reduce_674, + 2, 393, :_reduce_675, + 2, 393, :_reduce_676, + 1, 393, :_reduce_none, + 1, 393, :_reduce_none, + 2, 396, :_reduce_679, + 0, 396, :_reduce_680, + 6, 324, :_reduce_681, + 8, 324, :_reduce_682, + 4, 324, :_reduce_683, + 6, 324, :_reduce_684, + 4, 324, :_reduce_685, + 6, 324, :_reduce_686, + 2, 324, :_reduce_687, + 4, 324, :_reduce_688, + 6, 324, :_reduce_689, + 2, 324, :_reduce_690, + 4, 324, :_reduce_691, + 2, 324, :_reduce_692, + 4, 324, :_reduce_693, + 1, 324, :_reduce_694, + 0, 324, :_reduce_695, + 1, 243, :_reduce_696, + 1, 319, :_reduce_697, + 1, 319, :_reduce_698, + 1, 319, :_reduce_699, + 1, 319, :_reduce_700, + 1, 295, :_reduce_none, + 1, 295, :_reduce_702, + 1, 398, :_reduce_none, + 1, 399, :_reduce_none, + 3, 399, :_reduce_705, + 1, 311, :_reduce_706, + 3, 311, :_reduce_707, + 1, 400, :_reduce_708, + 2, 401, :_reduce_709, + 1, 401, :_reduce_710, + 2, 402, :_reduce_711, + 1, 402, :_reduce_712, + 1, 305, :_reduce_none, + 3, 305, :_reduce_714, + 1, 395, :_reduce_none, + 3, 395, :_reduce_716, + 1, 366, :_reduce_none, + 1, 366, :_reduce_none, + 2, 301, :_reduce_719, + 2, 300, :_reduce_720, + 1, 300, :_reduce_721, + 3, 403, :_reduce_722, + 3, 404, :_reduce_723, + 1, 312, :_reduce_724, + 3, 312, :_reduce_725, + 1, 397, :_reduce_726, + 3, 397, :_reduce_727, + 1, 405, :_reduce_none, + 1, 405, :_reduce_none, + 2, 313, :_reduce_730, + 1, 313, :_reduce_731, + 1, 406, :_reduce_none, + 1, 406, :_reduce_none, + 2, 307, :_reduce_734, + 1, 307, :_reduce_735, + 2, 306, :_reduce_736, + 0, 306, :_reduce_737, + 1, 198, :_reduce_none, + 0, 407, :_reduce_739, + 4, 198, :_reduce_740, + 1, 259, :_reduce_741, + 2, 259, :_reduce_none, + 1, 241, :_reduce_none, + 3, 241, :_reduce_744, + 3, 408, :_reduce_745, + 2, 408, :_reduce_746, + 1, 408, :_reduce_747, + 4, 408, :_reduce_748, + 2, 408, :_reduce_749, + 1, 408, :_reduce_750, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 214, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 327, :_reduce_none, + 1, 327, :_reduce_none, + 1, 327, :_reduce_none, + 1, 199, :_reduce_none, + 1, 199, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 207, :_reduce_none, + 1, 207, :_reduce_none, + 0, 152, :_reduce_none, + 1, 152, :_reduce_none, + 0, 191, :_reduce_none, + 1, 191, :_reduce_none, + 2, 219, :_reduce_771, + 2, 183, :_reduce_772, + 2, 353, :_reduce_773, + 0, 240, :_reduce_none, + 1, 240, :_reduce_none, + 1, 240, :_reduce_none, + 1, 277, :_reduce_777, + 1, 277, :_reduce_none, + 1, 155, :_reduce_none, + 2, 155, :_reduce_780, + 0, 153, :_reduce_781 ] + +racc_reduce_n = 782 + +racc_shift_n = 1291 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tQWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tDSTAR => 134, + :tCHAR => 135, + :tSYMBOLS_BEG => 136, + :tQSYMBOLS_BEG => 137, + :tSTRING_DEND => 138, + :tRATIONAL => 139, + :tIMAGINARY => 140, + :tLABEL_END => 141, + :tLONELY => 142, + :tBDOT2 => 143, + :tBDOT3 => 144, + :tLOWEST => 145, + :tEQL => 146 } + +racc_nt_base = 147 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tDSTAR", + "tCHAR", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DEND", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tLONELY", + "tBDOT2", + "tBDOT3", + "tLOWEST", + "tEQL", + "$start", + "program", + "top_compstmt", + "@1", + "top_stmts", + "opt_terms", + "none", + "top_stmt", + "terms", + "stmt", + "begin_block", + "@2", + "bodystmt", + "compstmt", + "opt_rescue", + "k_else", + "opt_ensure", + "@3", + "stmts", + "stmt_or_begin", + "@4", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@5", + "command_rhs", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "call_op", + "defn_head", + "f_opt_paren_args", + "command", + "arg", + "defs_head", + "backref", + "opt_nl", + "p_top_expr_body", + "def_name", + "@6", + "@7", + "fname", + "k_def", + "singleton", + "dot_or_colon", + "@8", + "expr_value_do", + "do", + "@9", + "@10", + "block_command", + "block_call", + "call_op2", + "operation2", + "command_args", + "cmd_brace_block", + "brace_body", + "fcall", + "@11", + "operation", + "k_return", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "op", + "reswords", + "symbol", + "@12", + "arg_rhs", + "simple_numeric", + "rel_expr", + "primary", + "relop", + "arg_value", + "aref_args", + "args", + "trailer", + "assocs", + "paren_args", + "args_forward", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@13", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "k_begin", + "k_end", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "k_if", + "then", + "if_tail", + "k_unless", + "opt_else", + "k_while", + "k_until", + "k_case", + "case_body", + "p_case_body", + "k_for", + "for_var", + "k_class", + "superclass", + "term", + "k_module", + "f_arglist", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "k_do", + "k_do_block", + "k_rescue", + "k_ensure", + "k_when", + "k_elsif", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "f_rest_marg", + "f_any_kwrest", + "f_kwrest", + "f_no_kwarg", + "f_eq", + "block_args_tail", + "@22", + "f_block_kwarg", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "excessed_comma", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "opt_block_param", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@23", + "@24", + "f_args", + "do_block", + "do_body", + "operation3", + "@25", + "@26", + "@27", + "@28", + "case_args", + "@29", + "@30", + "cases", + "p_top_expr", + "p_cases", + "@31", + "@32", + "p_expr", + "p_args", + "p_find", + "p_args_tail", + "p_kwargs", + "p_as", + "p_variable", + "p_alt", + "p_expr_basic", + "p_lparen", + "p_lbracket", + "p_value", + "p_const", + "rbrace", + "@33", + "@34", + "p_args_head", + "p_arg", + "p_rest", + "p_args_post", + "p_kwarg", + "p_any_kwrest", + "p_kw", + "p_kw_label", + "string_contents", + "p_kwrest", + "kwrest_mark", + "p_kwnorest", + "p_primitive", + "p_var_ref", + "p_expr_ref", + "nonlocal_var", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@35", + "@36", + "ssym", + "dsym", + "sym", + "@37", + "f_paren_args", + "args_tail", + "@38", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "@39", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + self.lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_2(val, _values, result) + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + + result +end + +def _reduce_3(val, _values, result) + stmt, _ = val + result = stmt + + result +end + +# reduce 4 omitted + +# reduce 5 omitted + +def _reduce_6(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 7 omitted + +# reduce 8 omitted + +def _reduce_9(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 1 + yyerror "BEGIN in method" + end + self.env.extend + + result +end + +def _reduce_10(val, _values, result) + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + + result +end + +def _reduce_11(val, _values, result) + (_, line), stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + + result +end + +def _reduce_12(val, _values, result) + res = _values[-2] + yyerror "else without rescue is useless" unless res + + result +end + +def _reduce_13(val, _values, result) + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + + result +end + +def _reduce_14(val, _values, result) + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + + result +end + +def _reduce_15(val, _values, result) + result = new_compstmt val + + result +end + +# reduce 16 omitted + +# reduce 17 omitted + +def _reduce_18(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +def _reduce_19(val, _values, result) + result = val[1] + debug 2 + + result +end + +# reduce 20 omitted + +def _reduce_21(val, _values, result) + yyerror "BEGIN is permitted only at toplevel" + + result +end + +def _reduce_22(val, _values, result) + result = val[2] # wtf? + + result +end + +def _reduce_23(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_24(val, _values, result) + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + + result +end + +def _reduce_25(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + + result +end + +def _reduce_26(val, _values, result) + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + + result +end + +def _reduce_27(val, _values, result) + yyerror "can't make alias for the number variables" + + result +end + +def _reduce_28(val, _values, result) + result = val[1] + + result +end + +def _reduce_29(val, _values, result) + t, _, c = val + result = new_if c, t, nil + + result +end + +def _reduce_30(val, _values, result) + f, _, c = val + result = new_if c, nil, f + + result +end + +def _reduce_31(val, _values, result) + e, _, c = val + result = new_while e, c, true + + result +end + +def _reduce_32(val, _values, result) + e, _, c = val + result = new_until e, c, true + + result +end + +def _reduce_33(val, _values, result) + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + + result +end + +def _reduce_34(val, _values, result) + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 3 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + + result +end + +# reduce 35 omitted + +def _reduce_36(val, _values, result) + result = new_masgn val[0], val[2], :wrap + + result +end + +def _reduce_37(val, _values, result) + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + + result +end + +def _reduce_38(val, _values, result) + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + + result +end + +def _reduce_39(val, _values, result) + result = new_masgn val[0], val[2] + + result +end + +# reduce 40 omitted + +def _reduce_41(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_42(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_43(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_44(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_45(val, _values, result) + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + + result +end + +def _reduce_46(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_47(val, _values, result) + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + + result +end + +def _reduce_48(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_49(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_50(val, _values, result) + result = new_endless_defs val + + result +end + +def _reduce_51(val, _values, result) + result = new_endless_defs val + + result +end + +def _reduce_52(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_53(val, _values, result) + expr, = val + result = value_expr expr + + result +end + +def _reduce_54(val, _values, result) + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + + result +end + +# reduce 55 omitted + +# reduce 56 omitted + +def _reduce_57(val, _values, result) + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + + result +end + +def _reduce_58(val, _values, result) + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + + result +end + +def _reduce_59(val, _values, result) + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + + result +end + +def _reduce_60(val, _values, result) + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + + result +end + +def _reduce_61(val, _values, result) + # value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + + result +end + +def _reduce_62(val, _values, result) + lhs, _, in_kwarg, rhs = val + + self.env.unextend + self.in_kwarg = in_kwarg + + rhs = new_in rhs, nil, nil, rhs.line + result = new_case lhs, rhs, rhs.line + + result +end + +def _reduce_63(val, _values, result) + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + + result +end + +def _reduce_64(val, _values, result) + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + + result +end + +# reduce 65 omitted + +def _reduce_66(val, _values, result) + # TODO: numparam_name(p, fname); + + (id, line), = val + old_in_def = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result = [id.to_sym, line, old_in_def] + + result +end + +def _reduce_67(val, _values, result) + _, name = val + result = name + + result +end + +def _reduce_68(val, _values, result) + lexer.lex_state = EXPR_FNAME + self.in_argdef = true + + result +end + +def _reduce_69(val, _values, result) + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + self.in_single += 1 # TODO: remove? + + # self.in_def = true # local_push + # self.env.extend + # lexer.cmdarg.push false + # lexer.cond.push false + + _, recv, _, _, name = val + + result = [recv, name] + + result +end + +def _reduce_70(val, _values, result) + result = value_expr(val[0]) + + result +end + +def _reduce_71(val, _values, result) + lexer.cond.push true + + result +end + +def _reduce_72(val, _values, result) + lexer.cond.pop + + result +end + +def _reduce_73(val, _values, result) + _, expr, _, _ = val + result = expr + + result +end + +# reduce 74 omitted + +# reduce 75 omitted + +# reduce 76 omitted + +def _reduce_77(val, _values, result) + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + + result +end + +def _reduce_78(val, _values, result) + # self.env.extend(:dynamic) + result = self.lexer.lineno + + result +end + +def _reduce_79(val, _values, result) + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + + result +end + +def _reduce_80(val, _values, result) + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + + result +end + +def _reduce_81(val, _values, result) + call, args = val + result = call.concat args.sexp_body + + result +end + +def _reduce_82(val, _values, result) + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + + result +end + +def _reduce_83(val, _values, result) + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + + result +end + +def _reduce_84(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_85(val, _values, result) + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + + result +end + +def _reduce_86(val, _values, result) + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + + result +end + +def _reduce_87(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_88(val, _values, result) + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + + result +end + +def _reduce_89(val, _values, result) + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + + result +end + +def _reduce_90(val, _values, result) + (_, line), args = val + result = s(:break, ret_args(args)).line line + + result +end + +def _reduce_91(val, _values, result) + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + + result +end + +# reduce 92 omitted + +def _reduce_93(val, _values, result) + result = val[1] + + result +end + +# reduce 94 omitted + +def _reduce_95(val, _values, result) + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + + result +end + +def _reduce_96(val, _values, result) + head, = val + result = s(:masgn, head).line head.line + + result +end + +def _reduce_97(val, _values, result) + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + + result +end + +def _reduce_98(val, _values, result) + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + + result +end + +def _reduce_99(val, _values, result) + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + + result +end + +def _reduce_100(val, _values, result) + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + + result +end + +def _reduce_101(val, _values, result) + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_102(val, _values, result) + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + + result +end + +def _reduce_103(val, _values, result) + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + + result +end + +def _reduce_104(val, _values, result) + (_, l), = val + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + + result +end + +def _reduce_105(val, _values, result) + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + + result +end + +# reduce 106 omitted + +def _reduce_107(val, _values, result) + result = val[1] + + result +end + +def _reduce_108(val, _values, result) + lhs, _ = val + result = s(:array, lhs).line lhs.line + + result +end + +def _reduce_109(val, _values, result) + result = val[0] << val[1].compact + + result +end + +def _reduce_110(val, _values, result) + item, = val + result = s(:array, item).line item.line + + result +end + +def _reduce_111(val, _values, result) + result = list_append val[0], val[2] + + result +end + +def _reduce_112(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_113(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_114(val, _values, result) + result = self.aryset val[0], val[2] + + result +end + +def _reduce_115(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_116(val, _values, result) + recv, _, (id, _line) = val + result = new_attrasgn recv, id + + result +end + +def _reduce_117(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_118(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 4 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + + result +end + +def _reduce_119(val, _values, result) + if (self.in_def || self.in_single > 0) then + debug 5 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_120(val, _values, result) + ref, = val + + self.backref_assign_error ref + + result +end + +def _reduce_121(val, _values, result) + var, = val + + result = self.assignable var + + result +end + +def _reduce_122(val, _values, result) + var, = val + + result = self.assignable var + + debug 6 + + result +end + +def _reduce_123(val, _values, result) + lhs, _, args, _ = val + + result = self.aryset lhs, args + + result +end + +def _reduce_124(val, _values, result) + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + + result +end + +def _reduce_125(val, _values, result) + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + + result +end + +def _reduce_126(val, _values, result) + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + + result +end + +def _reduce_127(val, _values, result) + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 7 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + + result +end + +def _reduce_128(val, _values, result) + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 8 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + + result +end + +def _reduce_129(val, _values, result) + self.backref_assign_error val[0] + + result +end + +def _reduce_130(val, _values, result) + yyerror "class/module name must be CONSTANT" + + result +end + +# reduce 131 omitted + +def _reduce_132(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_133(val, _values, result) + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + + result +end + +def _reduce_134(val, _values, result) + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + + result +end + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +def _reduce_138(val, _values, result) + lexer.lex_state = EXPR_END + + result +end + +# reduce 139 omitted + +def _reduce_140(val, _values, result) + result = wrap :lit, val[0] + + result +end + +# reduce 141 omitted + +def _reduce_142(val, _values, result) + result = new_undef val[0] + + result +end + +def _reduce_143(val, _values, result) + lexer.lex_state = EXPR_FNAME + + result +end + +def _reduce_144(val, _values, result) + result = new_undef val[0], val[3] + + result +end + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +# reduce 201 omitted + +# reduce 202 omitted + +# reduce 203 omitted + +# reduce 204 omitted + +# reduce 205 omitted + +# reduce 206 omitted + +# reduce 207 omitted + +# reduce 208 omitted + +# reduce 209 omitted + +# reduce 210 omitted + +# reduce 211 omitted + +# reduce 212 omitted + +# reduce 213 omitted + +# reduce 214 omitted + +# reduce 215 omitted + +def _reduce_216(val, _values, result) + result = new_assign val[0], val[2] + + result +end + +def _reduce_217(val, _values, result) + result = new_op_asgn val + + result +end + +def _reduce_218(val, _values, result) + result = new_op_asgn1 val + + result +end + +def _reduce_219(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_220(val, _values, result) + result = new_op_asgn2 val + + result +end + +def _reduce_221(val, _values, result) + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + + result +end + +def _reduce_222(val, _values, result) + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_223(val, _values, result) + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + + result +end + +def _reduce_224(val, _values, result) + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + + result +end + +def _reduce_225(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + + result +end + +def _reduce_226(val, _values, result) + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + + result +end + +def _reduce_227(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + + result +end + +def _reduce_228(val, _values, result) + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + + result +end + +def _reduce_229(val, _values, result) + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + + result +end + +def _reduce_230(val, _values, result) + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + + result +end + +def _reduce_231(val, _values, result) + result = new_call val[0], :+, argl(val[2]) + + result +end + +def _reduce_232(val, _values, result) + result = new_call val[0], :-, argl(val[2]) + + result +end + +def _reduce_233(val, _values, result) + result = new_call val[0], :*, argl(val[2]) + + result +end + +def _reduce_234(val, _values, result) + result = new_call val[0], :"/", argl(val[2]) + + result +end + +def _reduce_235(val, _values, result) + result = new_call val[0], :"%", argl(val[2]) + + result +end + +def _reduce_236(val, _values, result) + result = new_call val[0], :**, argl(val[2]) + + result +end + +def _reduce_237(val, _values, result) + _, num, _, arg = val + lit = wrap :lit, num + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + + result +end + +def _reduce_238(val, _values, result) + result = new_call val[1], :"+@" + + result +end + +def _reduce_239(val, _values, result) + result = new_call val[1], :"-@" + + result +end + +def _reduce_240(val, _values, result) + result = new_call val[0], :"|", argl(val[2]) + + result +end + +def _reduce_241(val, _values, result) + result = new_call val[0], :"^", argl(val[2]) + + result +end + +def _reduce_242(val, _values, result) + result = new_call val[0], :"&", argl(val[2]) + + result +end + +def _reduce_243(val, _values, result) + result = new_call val[0], :"<=>", argl(val[2]) + + result +end + +# reduce 244 omitted + +def _reduce_245(val, _values, result) + result = new_call val[0], :"==", argl(val[2]) + + result +end + +def _reduce_246(val, _values, result) + result = new_call val[0], :"===", argl(val[2]) + + result +end + +def _reduce_247(val, _values, result) + result = new_call val[0], :"!=", argl(val[2]) + + result +end + +def _reduce_248(val, _values, result) + lhs, _, rhs = val + result = new_match lhs, rhs + + result +end + +def _reduce_249(val, _values, result) + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + + result +end + +def _reduce_250(val, _values, result) + _, arg = val + result = new_call arg, :"!" + result.line arg.line + + result +end + +def _reduce_251(val, _values, result) + result = new_call value_expr(val[1]), :"~" + + result +end + +def _reduce_252(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + + result +end + +def _reduce_253(val, _values, result) + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + + result +end + +def _reduce_254(val, _values, result) + result = logical_op :and, val[0], val[2] + + result +end + +def _reduce_255(val, _values, result) + result = logical_op :or, val[0], val[2] + + result +end + +def _reduce_256(val, _values, result) + (_, line), _, arg = val + result = s(:defined, arg).line line + + result +end + +def _reduce_257(val, _values, result) + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + + result +end + +def _reduce_258(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_259(val, _values, result) + result = new_endless_defn val + + result +end + +def _reduce_260(val, _values, result) + result = new_endless_defs val + + result +end + +def _reduce_261(val, _values, result) + result = new_endless_defs val + + result +end + +# reduce 262 omitted + +# reduce 263 omitted + +# reduce 264 omitted + +# reduce 265 omitted + +# reduce 266 omitted + +def _reduce_267(val, _values, result) + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_268(val, _values, result) + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + + result +end + +def _reduce_269(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 270 omitted + +def _reduce_271(val, _values, result) + result = args [val[0]] + + result +end + +def _reduce_272(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_273(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +# reduce 274 omitted + +def _reduce_275(val, _values, result) + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + + result +end + +def _reduce_276(val, _values, result) + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + + result +end + +def _reduce_277(val, _values, result) + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + + result +end + +def _reduce_278(val, _values, result) + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + + result +end + +# reduce 279 omitted + +# reduce 280 omitted + +# reduce 281 omitted + +# reduce 282 omitted + +def _reduce_283(val, _values, result) + result = args val + + result +end + +def _reduce_284(val, _values, result) + result = args [val[0], array_to_hash(val[2])] + + result +end + +def _reduce_285(val, _values, result) + result = args [array_to_hash(val[0])] + + result +end + +def _reduce_286(val, _values, result) + warning "parenthesize argument(s) for future version" + result = call_args val + + result +end + +def _reduce_287(val, _values, result) + result = call_args val + + result +end + +def _reduce_288(val, _values, result) + result = call_args [array_to_hash(val[0]), val[1]] + + result +end + +def _reduce_289(val, _values, result) + result = call_args [val[0], array_to_hash(val[2]), val[3]] + + result +end + +def _reduce_290(val, _values, result) + result = call_args val + + result +end + +def _reduce_291(val, _values, result) + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + + result +end + +def _reduce_292(val, _values, result) + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + + result +end + +def _reduce_293(val, _values, result) + _, arg = val + result = s(:block_pass, arg).line arg.line + + result +end + +def _reduce_294(val, _values, result) + (_, line), = val + result = s(:block_pass).line line + + result +end + +def _reduce_295(val, _values, result) + result = val[1] + + result +end + +# reduce 296 omitted + +def _reduce_297(val, _values, result) + arg, = val + lineno = arg.line + + result = s(:array, arg).line lineno + + result +end + +def _reduce_298(val, _values, result) + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_299(val, _values, result) + (_, line), = val + result = s(:array, s(:splat).line(line)).line line + + result +end + +def _reduce_300(val, _values, result) + args, _, id = val + result = self.list_append args, id + + result +end + +def _reduce_301(val, _values, result) + args, _, (_, line), id = val + result = self.list_append args, s(:splat, id).line(line) + + result +end + +def _reduce_302(val, _values, result) + args, _, (_, line) = val + result = self.list_append args, s(:splat).line(line) + + result +end + +def _reduce_303(val, _values, result) + result = new_masgn_arg val[0] + + result +end + +def _reduce_304(val, _values, result) + result = new_masgn_arg val[0], :wrap + + result +end + +def _reduce_305(val, _values, result) + result = val[0] << val[2] + + result +end + +def _reduce_306(val, _values, result) + arg, _, _, splat = val + result = self.arg_concat arg, splat + + result +end + +def _reduce_307(val, _values, result) + _, arg = val + result = s(:splat, arg).line arg.line + + result +end + +# reduce 308 omitted + +# reduce 309 omitted + +# reduce 310 omitted + +# reduce 311 omitted + +# reduce 312 omitted + +# reduce 313 omitted + +# reduce 314 omitted + +# reduce 315 omitted + +# reduce 316 omitted + +# reduce 317 omitted + +def _reduce_318(val, _values, result) + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + + result +end + +def _reduce_319(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_320(val, _values, result) + lexer.cmdarg.pop + result = new_begin val + + result +end + +def _reduce_321(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_322(val, _values, result) + (_, line), _, _ = val + result = s(:begin).line line + + result +end + +def _reduce_323(val, _values, result) + lexer.lex_state = EXPR_ENDARG + + result +end + +def _reduce_324(val, _values, result) + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + + result +end + +def _reduce_325(val, _values, result) + (_, line), stmt, _ = val + result = stmt || s(:nil).line(line) + result.paren = true + + result +end + +def _reduce_326(val, _values, result) + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + + result +end + +def _reduce_327(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_328(val, _values, result) + (_, line), args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + + result +end + +def _reduce_329(val, _values, result) + result = self.lexer.lineno + + result +end + +def _reduce_330(val, _values, result) + result = new_hash val + + result +end + +def _reduce_331(val, _values, result) + (_, line), = val + result = s(:return).line line + + result +end + +def _reduce_332(val, _values, result) + (_, line), _, args, _ = val + + result = new_yield(args).line line + + result +end + +def _reduce_333(val, _values, result) + (_, line), _, _ = val + + result = new_yield.line line + + result +end + +def _reduce_334(val, _values, result) + (_, line), = val + + result = new_yield.line line + + result +end + +def _reduce_335(val, _values, result) + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + + result +end + +def _reduce_336(val, _values, result) + _, _, lhs, _ = val + result = new_call lhs, :"!" + + result +end + +def _reduce_337(val, _values, result) + debug 9 + + result +end + +def _reduce_338(val, _values, result) + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + + result +end + +# reduce 339 omitted + +def _reduce_340(val, _values, result) + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + + result +end + +def _reduce_341(val, _values, result) + expr, = val + result = expr + + result +end + +def _reduce_342(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, t, f + + result +end + +def _reduce_343(val, _values, result) + _, c, _, t, f, _ = val + result = new_if c, f, t + + result +end + +def _reduce_344(val, _values, result) + _, cond, body, _ = val + result = new_while body, cond, true + + result +end + +def _reduce_345(val, _values, result) + _, cond, body, _ = val + result = new_until body, cond, true + + result +end + +def _reduce_346(val, _values, result) + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + + result +end + +def _reduce_347(val, _values, result) + (_, line), _, body, _ = val + result = new_case nil, body, line + + result +end + +def _reduce_348(val, _values, result) + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + + result +end + +def _reduce_349(val, _values, result) + _, var, _, iter, body, _ = val + result = new_for iter, var, body + + result +end + +def _reduce_350(val, _values, result) + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + + result +end + +def _reduce_351(val, _values, result) + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_352(val, _values, result) + result = self.in_def + self.in_def = false + + result +end + +def _reduce_353(val, _values, result) + result = self.in_single + self.in_single = 0 + self.env.extend + + result +end + +def _reduce_354(val, _values, result) + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_355(val, _values, result) + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + + result +end + +def _reduce_356(val, _values, result) + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + + result +end + +def _reduce_357(val, _values, result) + # [ [:f, 1, false], s(:args)...] + # => + # [[:k_def, 666], [:f, 1], false, s(:args)...] + val.insert 1, val.first.pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + + result +end + +def _reduce_358(val, _values, result) + # [ [recv, [:name, 1, false]], s(:args...] + # => + # [ recv, [:name, 1, false], s(:args...] + # => + # [ recv, [:name, 1], false, s(:args...] + # => + # [ :k_def, recv, [:name, 1], false, s(:args...] + + val.prepend(*val.shift) + val.insert 2, val[1].pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + + result +end + +def _reduce_359(val, _values, result) + (_, line), = val + result = s(:break).line line + + result +end + +def _reduce_360(val, _values, result) + (_, line), = val + result = s(:next).line line + + result +end + +def _reduce_361(val, _values, result) + (_, line), = val + result = s(:redo).line line + + result +end + +def _reduce_362(val, _values, result) + (_, line), = val + result = s(:retry).line line + + result +end + +def _reduce_363(val, _values, result) + result = value_expr(val[0]) + + result +end + +# reduce 364 omitted + +# reduce 365 omitted + +# reduce 366 omitted + +# reduce 367 omitted + +# reduce 368 omitted + +# reduce 369 omitted + +# reduce 370 omitted + +def _reduce_371(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_372(val, _values, result) + self.comments.push self.lexer.comments + + result +end + +def _reduce_373(val, _values, result) + self.comments.push self.lexer.comments + self.in_argdef = true + + result +end + +# reduce 374 omitted + +# reduce 375 omitted + +# reduce 376 omitted + +# reduce 377 omitted + +# reduce 378 omitted + +# reduce 379 omitted + +# reduce 380 omitted + +# reduce 381 omitted + +# reduce 382 omitted + +# reduce 383 omitted + +# reduce 384 omitted + +# reduce 385 omitted + +# reduce 386 omitted + +# reduce 387 omitted + +# reduce 388 omitted + +def _reduce_389(val, _values, result) + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + + result +end + +# reduce 390 omitted + +def _reduce_391(val, _values, result) + result = val[1] + + result +end + +# reduce 392 omitted + +def _reduce_393(val, _values, result) + val[0].delete_at 1 if val[0][1].nil? # HACK + + result +end + +def _reduce_394(val, _values, result) + (sym, line), = val + + result = s(:dummy, sym).line line + + result +end + +def _reduce_395(val, _values, result) + _, args, _ = val + result = args + + result +end + +def _reduce_396(val, _values, result) + arg, = val + line = arg.line + + arg = arg.last if arg.sexp_type == :dummy + + result = s(:array, arg).line line + + result +end + +def _reduce_397(val, _values, result) + args, _, arg = val + + arg = arg.last if arg.sexp_type == :dummy + + result = list_append args, arg + + result +end + +def _reduce_398(val, _values, result) + args, = val + + result = block_var args + + result +end + +def _reduce_399(val, _values, result) + args, _, rest = val + + result = block_var args, rest + + result +end + +def _reduce_400(val, _values, result) + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + + result +end + +def _reduce_401(val, _values, result) + rest, = val + + result = block_var rest + + result +end + +def _reduce_402(val, _values, result) + splat, _, rest = val + + result = block_var splat, rest + + result +end + +def _reduce_403(val, _values, result) + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + + result +end + +def _reduce_404(val, _values, result) + (_, line), = val + result = args([:*]).line line + + result +end + +# reduce 405 omitted + +# reduce 406 omitted + +def _reduce_407(val, _values, result) + self.in_argdef = false + result +end + +# reduce 408 omitted + +def _reduce_409(val, _values, result) + result = call_args val + + result +end + +def _reduce_410(val, _values, result) + result = call_args val + + result +end + +def _reduce_411(val, _values, result) + result = call_args val + + result +end + +def _reduce_412(val, _values, result) + (id, line), = val + result = call_args [id] + result.line line + + result +end + +def _reduce_413(val, _values, result) + result = args val + + result +end + +# reduce 414 omitted + +def _reduce_415(val, _values, result) + result = s(:WTF_COMMA!) + + result +end + +def _reduce_416(val, _values, result) + result = args val + + result +end + +def _reduce_417(val, _values, result) + result = args val + + result +end + +def _reduce_418(val, _values, result) + result = args val + + result +end + +def _reduce_419(val, _values, result) + result = args val + + result +end + +def _reduce_420(val, _values, result) + result = args val + + result +end + +def _reduce_421(val, _values, result) + arg, _ = val + result = arg << nil + + result +end + +def _reduce_422(val, _values, result) + result = args val + + result +end + +def _reduce_423(val, _values, result) + result = args val + + result +end + +def _reduce_424(val, _values, result) + result = args val + + result +end + +def _reduce_425(val, _values, result) + result = args val + + result +end + +def _reduce_426(val, _values, result) + result = args val + + result +end + +def _reduce_427(val, _values, result) + result = args val + + result +end + +def _reduce_428(val, _values, result) + result = args val + + result +end + +def _reduce_429(val, _values, result) + result = args val + + result +end + +def _reduce_430(val, _values, result) + result = args val + + result +end + +def _reduce_431(val, _values, result) + result = 0 + result +end + +def _reduce_432(val, _values, result) + self.lexer.command_start = true + + result +end + +def _reduce_433(val, _values, result) + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + + result +end + +def _reduce_434(val, _values, result) + (_, line), = val + + result = s(:args).line line + + result +end + +def _reduce_435(val, _values, result) + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + + result +end + +# reduce 436 omitted + +def _reduce_437(val, _values, result) + result = args val + + result +end + +def _reduce_438(val, _values, result) + result = args val + + result +end + +def _reduce_439(val, _values, result) + result = args val + + result +end + +def _reduce_440(val, _values, result) + result = wrap :shadow, val[0] + + result +end + +# reduce 441 omitted + +def _reduce_442(val, _values, result) + self.env.extend :dynamic + result = lexer.lpar_beg + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + + result +end + +def _reduce_443(val, _values, result) + lexer.cmdarg.push false + + result +end + +def _reduce_444(val, _values, result) + (_, line), lpar, args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + + result +end + +def _reduce_445(val, _values, result) + self.in_argdef = false + result = args val + + result +end + +def _reduce_446(val, _values, result) + self.in_argdef = false + result = val[0] + result = 0 if result == s(:args) + + result +end + +def _reduce_447(val, _values, result) + result = val[1] + + result +end + +def _reduce_448(val, _values, result) + result = val[1] + + result +end + +def _reduce_449(val, _values, result) + (_, line), iter, _ = val + result = iter.line line + + result +end + +def _reduce_450(val, _values, result) + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + + result +end + +def _reduce_451(val, _values, result) + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + + result +end + +def _reduce_452(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_453(val, _values, result) + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + + result +end + +def _reduce_454(val, _values, result) + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + + result +end + +def _reduce_455(val, _values, result) + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + + result +end + +def _reduce_456(val, _values, result) + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + + result +end + +def _reduce_457(val, _values, result) + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + + result +end + +def _reduce_458(val, _values, result) + result = new_call val[0], :call, val[2], val[1] + + result +end + +def _reduce_459(val, _values, result) + result = new_call val[0], :call, val[2] + + result +end + +def _reduce_460(val, _values, result) + result = new_super val[1] + + result +end + +def _reduce_461(val, _values, result) + (_, line), = val + result = s(:zsuper).line line + + result +end + +def _reduce_462(val, _values, result) + result = new_aref val + + result +end + +def _reduce_463(val, _values, result) + self.env.extend :dynamic + + result +end + +def _reduce_464(val, _values, result) + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_465(val, _values, result) + self.env.extend :dynamic + + result +end + +def _reduce_466(val, _values, result) + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + + result +end + +def _reduce_467(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_468(val, _values, result) + result = lexer.cmdarg.store(false) + result +end + +def _reduce_469(val, _values, result) + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + + result +end + +def _reduce_470(val, _values, result) + self.env.extend :dynamic; result = self.lexer.lineno + result +end + +def _reduce_471(val, _values, result) + lexer.cmdarg.push false + result +end + +def _reduce_472(val, _values, result) + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + + result +end + +def _reduce_473(val, _values, result) + arg, = val + + result = s(:array, arg).line arg.line + + result +end + +def _reduce_474(val, _values, result) + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + + result +end + +def _reduce_475(val, _values, result) + args, _, id = val + + result = self.list_append args, id + + result +end + +def _reduce_476(val, _values, result) + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + + result +end + +def _reduce_477(val, _values, result) + (_, line), case_args, _then, body, cases = val + + result = new_when case_args, body + result.line line + result << cases if cases + + result +end + +# reduce 478 omitted + +# reduce 479 omitted + +def _reduce_480(val, _values, result) + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + + result +end + +def _reduce_481(val, _values, result) + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + + result +end + +def _reduce_482(val, _values, result) + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + + result +end + +# reduce 483 omitted + +# reduce 484 omitted + +# reduce 485 omitted + +def _reduce_486(val, _values, result) + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + + result +end + +def _reduce_487(val, _values, result) + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + + result +end + +# reduce 488 omitted + +def _reduce_489(val, _values, result) + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + + result +end + +def _reduce_490(val, _values, result) + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + + result +end + +def _reduce_491(val, _values, result) + find, = val + + result = new_find_pattern nil, find + + result +end + +def _reduce_492(val, _values, result) + args, = val + result = new_array_pattern nil, nil, args, args.line + + result +end + +def _reduce_493(val, _values, result) + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + + result +end + +# reduce 494 omitted + +def _reduce_495(val, _values, result) + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + + result +end + +# reduce 496 omitted + +def _reduce_497(val, _values, result) + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + + result +end + +# reduce 498 omitted + +def _reduce_499(val, _values, result) + push_pktbl + result +end + +def _reduce_500(val, _values, result) + push_pktbl + result +end + +# reduce 501 omitted + +# reduce 502 omitted + +def _reduce_503(val, _values, result) + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + + result +end + +def _reduce_504(val, _values, result) + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + + result +end + +def _reduce_505(val, _values, result) + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + + result +end + +def _reduce_506(val, _values, result) + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + + result +end + +def _reduce_507(val, _values, result) + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + + result +end + +def _reduce_508(val, _values, result) + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + + result +end + +def _reduce_509(val, _values, result) + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + + result +end + +def _reduce_510(val, _values, result) + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + + result +end + +def _reduce_511(val, _values, result) + _, pat, _ = val + + result = new_array_pattern nil, nil, pat, pat.line + + result +end + +def _reduce_512(val, _values, result) + _, find, _ = val + + result = new_find_pattern nil, find + + result +end + +def _reduce_513(val, _values, result) + (_, line), _ = val + + result = s(:array_pat).line line + + result +end + +def _reduce_514(val, _values, result) + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + + result +end + +def _reduce_515(val, _values, result) + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + + result +end + +def _reduce_516(val, _values, result) + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + + result +end + +def _reduce_517(val, _values, result) + push_pktbl + result +end + +def _reduce_518(val, _values, result) + _, _, expr, _ = val + + pop_pktbl + result = expr + + result +end + +def _reduce_519(val, _values, result) + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + + result +end + +def _reduce_520(val, _values, result) + head, = val + + result = new_array_pattern_tail head, true, nil, nil + + result +end + +def _reduce_521(val, _values, result) + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + + result +end + +def _reduce_522(val, _values, result) + head, (rest, _) = val + + result = new_array_pattern_tail(head, true, rest, nil).line head.line + + result +end + +def _reduce_523(val, _values, result) + head, (rest, _), _, post = val + + result = new_array_pattern_tail(head, true, rest, post).line head.line + + result +end + +# reduce 524 omitted + +def _reduce_525(val, _values, result) + arg, _ = val + result = arg + + result +end + +def _reduce_526(val, _values, result) + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + + result +end + +def _reduce_527(val, _values, result) + (id, line), = val + + result = new_array_pattern_tail nil, true, id, nil + result.line line + + result +end + +def _reduce_528(val, _values, result) + (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id, rhs + result.line line + + result +end + +def _reduce_529(val, _values, result) + lhs, _, mid, _, rhs = val + + result = new_find_pattern_tail lhs, mid, rhs + + result +end + +def _reduce_530(val, _values, result) + _, (id, line) = val + + result = [id.to_sym, line] + + result +end + +def _reduce_531(val, _values, result) + (_id, line), = val + + result = [nil, line] + + result +end + +# reduce 532 omitted + +def _reduce_533(val, _values, result) + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + + result +end + +def _reduce_534(val, _values, result) + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + + result +end + +def _reduce_535(val, _values, result) + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + + result +end + +def _reduce_536(val, _values, result) + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + + result +end + +def _reduce_537(val, _values, result) + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + + result +end + +def _reduce_538(val, _values, result) + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + + result +end + +# reduce 539 omitted + +def _reduce_540(val, _values, result) + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + + result +end + +def _reduce_541(val, _values, result) + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + + result +end + +def _reduce_542(val, _values, result) + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 10 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + + result +end + +def _reduce_543(val, _values, result) + result = wrap :lit, val[0] + + result +end + +def _reduce_544(val, _values, result) + # you can't actually get here the way I lex labels + debug 11 + + result +end + +def _reduce_545(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + + result +end + +def _reduce_546(val, _values, result) + (_, line), = val + + result = s(:kwrest, :"**").line line + + result +end + +def _reduce_547(val, _values, result) + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + + result +end + +# reduce 548 omitted + +# reduce 549 omitted + +# reduce 550 omitted + +def _reduce_551(val, _values, result) + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + + result +end + +def _reduce_552(val, _values, result) + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + + result +end + +def _reduce_553(val, _values, result) + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + + result +end + +def _reduce_554(val, _values, result) + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + + result +end + +# reduce 555 omitted + +# reduce 556 omitted + +# reduce 557 omitted + +def _reduce_558(val, _values, result) + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + + result +end + +def _reduce_559(val, _values, result) + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + + result +end + +# reduce 560 omitted + +# reduce 561 omitted + +# reduce 562 omitted + +# reduce 563 omitted + +def _reduce_564(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_565(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_566(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_567(val, _values, result) + result = ary_to_pat val[0] + + result +end + +def _reduce_568(val, _values, result) + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + + result +end + +# reduce 569 omitted + +def _reduce_570(val, _values, result) + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + + result +end + +def _reduce_571(val, _values, result) + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + + result +end + +def _reduce_572(val, _values, result) + _, var = val + result = var + + result +end + +def _reduce_573(val, _values, result) + _, _, expr, _ = val + result = expr # TODO? s(:begin, expr).line expr.line + + result +end + +def _reduce_574(val, _values, result) + result = wrap :colon3, val[1] + + result +end + +def _reduce_575(val, _values, result) + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + + result +end + +def _reduce_576(val, _values, result) + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + + result +end + +def _reduce_577(val, _values, result) + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + + result +end + +def _reduce_578(val, _values, result) + result = nil + + result +end + +def _reduce_579(val, _values, result) + arg, = val + result = s(:array, arg).line arg.line + + result +end + +# reduce 580 omitted + +# reduce 581 omitted + +def _reduce_582(val, _values, result) + result = val[1] + + result +end + +# reduce 583 omitted + +def _reduce_584(val, _values, result) + (_, line), body = val + + result = body || s(:nil).line(line) + + result +end + +# reduce 585 omitted + +def _reduce_586(val, _values, result) + (lit, line), = val + result = s(:lit, lit).line line + + result +end + +# reduce 587 omitted + +def _reduce_588(val, _values, result) + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + + result +end + +def _reduce_589(val, _values, result) + debug 12 + + result +end + +# reduce 590 omitted + +def _reduce_591(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_592(val, _values, result) + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + + result +end + +def _reduce_593(val, _values, result) + result = new_string val + + result +end + +def _reduce_594(val, _values, result) + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + + result +end + +def _reduce_595(val, _values, result) + result = new_regexp val + + result +end + +def _reduce_596(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_597(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_598(val, _values, result) + result = new_word_list + + result +end + +def _reduce_599(val, _values, result) + result = val[0].dup << new_word_list_entry(val) + + result +end + +# reduce 600 omitted + +def _reduce_601(val, _values, result) + result = self.literal_concat val[0], val[1] + + result +end + +def _reduce_602(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_603(val, _values, result) + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_604(val, _values, result) + result = new_symbol_list + + result +end + +def _reduce_605(val, _values, result) + list, * = val + result = list.dup << new_symbol_list_entry(val) + + result +end + +def _reduce_606(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_607(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_608(val, _values, result) + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + + result +end + +def _reduce_609(val, _values, result) + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + + result +end + +def _reduce_610(val, _values, result) + result = new_qword_list + + result +end + +def _reduce_611(val, _values, result) + result = val[0].dup << new_qword_list_entry(val) + + result +end + +def _reduce_612(val, _values, result) + result = new_qsym_list + + result +end + +def _reduce_613(val, _values, result) + result = val[0].dup << new_qsym_list_entry(val) + + result +end + +def _reduce_614(val, _values, result) + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + + result +end + +def _reduce_615(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_616(val, _values, result) + result = nil + + result +end + +def _reduce_617(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_618(val, _values, result) + result = nil + + result +end + +def _reduce_619(val, _values, result) + v1, v2 = val + result = literal_concat v1, v2 + + result +end + +def _reduce_620(val, _values, result) + result = new_string val + + result +end + +def _reduce_621(val, _values, result) + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_622(val, _values, result) + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + + result +end + +def _reduce_623(val, _values, result) + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_624(val, _values, result) + (_, line), memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 13 + raise "unknown string body: #{stmt.inspect}" + end + + result +end + +def _reduce_625(val, _values, result) + result = wrap :gvar, val[0] + + result +end + +def _reduce_626(val, _values, result) + result = wrap :ivar, val[0] + + result +end + +def _reduce_627(val, _values, result) + result = wrap :cvar, val[0] + + result +end + +# reduce 628 omitted + +# reduce 629 omitted + +# reduce 630 omitted + +def _reduce_631(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + + result +end + +def _reduce_632(val, _values, result) + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + + result +end + +# reduce 633 omitted + +# reduce 634 omitted + +# reduce 635 omitted + +# reduce 636 omitted + +def _reduce_637(val, _values, result) + (_, line), result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line line + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 14 + end + + result +end + +# reduce 638 omitted + +def _reduce_639(val, _values, result) + _, (num, line) = val + result = [-num, line] + + result +end + +# reduce 640 omitted + +# reduce 641 omitted + +# reduce 642 omitted + +# reduce 643 omitted + +def _reduce_644(val, _values, result) + result = wrap :ivar, val[0] + result +end + +def _reduce_645(val, _values, result) + result = wrap :gvar, val[0] + result +end + +def _reduce_646(val, _values, result) + result = wrap :cvar, val[0] + result +end + +# reduce 647 omitted + +# reduce 648 omitted + +# reduce 649 omitted + +# reduce 650 omitted + +# reduce 651 omitted + +def _reduce_652(val, _values, result) + (_, line), = val; result = s(:nil).line line + result +end + +def _reduce_653(val, _values, result) + (_, line), = val; result = s(:self).line line + result +end + +def _reduce_654(val, _values, result) + (_, line), = val; result = s(:true).line line + result +end + +def _reduce_655(val, _values, result) + (_, line), = val; result = s(:false).line line + result +end + +def _reduce_656(val, _values, result) + (_, line), = val; result = s(:str, self.file).line line + result +end + +def _reduce_657(val, _values, result) + (_, line), = val; result = s(:lit, line).line line + result +end + +def _reduce_658(val, _values, result) + (_, l), = val + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + + result +end + +def _reduce_659(val, _values, result) + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + + result.line line + + result +end + +def _reduce_660(val, _values, result) + var = val[0] + result = Sexp === var ? var : self.gettable(var) + + result +end + +def _reduce_661(val, _values, result) + result = self.assignable val[0] + + result +end + +def _reduce_662(val, _values, result) + result = self.assignable val[0] + debug 15 + + result +end + +def _reduce_663(val, _values, result) + (ref, line), = val + result = s(:nth_ref, ref).line line + + result +end + +def _reduce_664(val, _values, result) + (ref, line), = val + result = s(:back_ref, ref).line line + + result +end + +def _reduce_665(val, _values, result) + lexer.lex_state = EXPR_BEG + lexer.command_start = true + + result +end + +def _reduce_666(val, _values, result) + result = val[2] + + result +end + +def _reduce_667(val, _values, result) + result = nil + + result +end + +# reduce 668 omitted + +def _reduce_669(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +def _reduce_670(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +# reduce 671 omitted + +def _reduce_672(val, _values, result) + result = self.in_kwarg + self.in_kwarg = true + self.in_argdef = true + self.lexer.lex_state |= EXPR_LABEL + + result +end + +def _reduce_673(val, _values, result) + self.in_argdef = false + result = end_args val + + result +end + +def _reduce_674(val, _values, result) + result = args val + + result +end + +def _reduce_675(val, _values, result) + result = args val + + result +end + +def _reduce_676(val, _values, result) + result = args val + + result +end + +# reduce 677 omitted + +# reduce 678 omitted + +def _reduce_679(val, _values, result) + result = val[1] + + result +end + +def _reduce_680(val, _values, result) + result = nil + + result +end + +def _reduce_681(val, _values, result) + result = args val + + result +end + +def _reduce_682(val, _values, result) + result = args val + + result +end + +def _reduce_683(val, _values, result) + result = args val + + result +end + +def _reduce_684(val, _values, result) + result = args val + + result +end + +def _reduce_685(val, _values, result) + result = args val + + result +end + +def _reduce_686(val, _values, result) + result = args val + + result +end + +def _reduce_687(val, _values, result) + result = args val + + result +end + +def _reduce_688(val, _values, result) + result = args val + + result +end + +def _reduce_689(val, _values, result) + result = args val + + result +end + +def _reduce_690(val, _values, result) + result = args val + + result +end + +def _reduce_691(val, _values, result) + result = args val + + result +end + +def _reduce_692(val, _values, result) + result = args val + + result +end + +def _reduce_693(val, _values, result) + result = args val + + result +end + +def _reduce_694(val, _values, result) + result = args val + + result +end + +def _reduce_695(val, _values, result) + result = args val + + result +end + +def _reduce_696(val, _values, result) + (_, line), = val + result = s(:forward_args).line line + + result +end + +def _reduce_697(val, _values, result) + yyerror "formal argument cannot be a constant" + + result +end + +def _reduce_698(val, _values, result) + yyerror "formal argument cannot be an instance variable" + + result +end + +def _reduce_699(val, _values, result) + yyerror "formal argument cannot be a global variable" + + result +end + +def _reduce_700(val, _values, result) + yyerror "formal argument cannot be a class variable" + + result +end + +# reduce 701 omitted + +def _reduce_702(val, _values, result) + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + + result +end + +# reduce 703 omitted + +# reduce 704 omitted + +def _reduce_705(val, _values, result) + _, margs, _ = val + + result = margs + + result +end + +def _reduce_706(val, _values, result) + result = new_arg val + + result +end + +def _reduce_707(val, _values, result) + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + + result +end + +def _reduce_708(val, _values, result) + label, = val + # arg_var(p, formal_argument(p, $1)); + # p->cur_arg = get_id($1); + # p->max_numparam = ORDINAL_PARAM; + self.in_argdef = false + result = label + + result +end + +def _reduce_709(val, _values, result) + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + self.in_argdef = true + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + + result +end + +def _reduce_710(val, _values, result) + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +def _reduce_711(val, _values, result) + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + + result +end + +def _reduce_712(val, _values, result) + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + + result +end + +# reduce 713 omitted + +def _reduce_714(val, _values, result) + list, _, item = val + result = list << item.last + + result +end + +# reduce 715 omitted + +def _reduce_716(val, _values, result) + result = args val + + result +end + +# reduce 717 omitted + +# reduce 718 omitted + +def _reduce_719(val, _values, result) + (_, line), _ = val + result = [:"**nil", line] + + result +end + +def _reduce_720(val, _values, result) + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + + result +end + +def _reduce_721(val, _values, result) + (_, line), = val + id = :"**" + self.env[id] = :lvar + result = [id, line] + + result +end + +def _reduce_722(val, _values, result) + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO: detect duplicate names + # TODO? p->cur_arg = 0; + + result +end + +def _reduce_723(val, _values, result) + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO? p->cur_arg = 0; + + result +end + +def _reduce_724(val, _values, result) + optblk, = val + result = s(:block, optblk).line optblk.line + + result +end + +def _reduce_725(val, _values, result) + optarg, _, optblk = val + result = optarg + result << optblk + + result +end + +def _reduce_726(val, _values, result) + opt, = val + result = s(:block, opt).line opt.line + + result +end + +def _reduce_727(val, _values, result) + result = self.block_append val[0], val[2] + + result +end + +# reduce 728 omitted + +# reduce 729 omitted + +def _reduce_730(val, _values, result) + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + + result +end + +def _reduce_731(val, _values, result) + (_, line), = val + name = :"*" + self.env[name] = :lvar + result = [name, line] + + result +end + +# reduce 732 omitted + +# reduce 733 omitted + +def _reduce_734(val, _values, result) + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + + result +end + +def _reduce_735(val, _values, result) + (_, line), = val + + result = [:&, line] + + result +end + +def _reduce_736(val, _values, result) + _, arg = val + result = arg + + result +end + +def _reduce_737(val, _values, result) + result = nil + + result +end + +# reduce 738 omitted + +def _reduce_739(val, _values, result) + lexer.lex_state = EXPR_BEG + + result +end + +def _reduce_740(val, _values, result) + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + + result +end + +def _reduce_741(val, _values, result) + result = s(:array).line lexer.lineno + + result +end + +# reduce 742 omitted + +# reduce 743 omitted + +def _reduce_744(val, _values, result) + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + + result +end + +def _reduce_745(val, _values, result) + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + + result +end + +def _reduce_746(val, _values, result) + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_747(val, _values, result) + lit = wrap :lit, val[0] + arg = nil + + result = s(:array, lit, arg).line lit.line + + result +end + +def _reduce_748(val, _values, result) + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + + result +end + +def _reduce_749(val, _values, result) + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + + result +end + +def _reduce_750(val, _values, result) + (_, line), = val + result = s(:array, s(:kwsplat).line(line)).line line + + result +end + +# reduce 751 omitted + +# reduce 752 omitted + +# reduce 753 omitted + +# reduce 754 omitted + +# reduce 755 omitted + +# reduce 756 omitted + +# reduce 757 omitted + +# reduce 758 omitted + +# reduce 759 omitted + +# reduce 760 omitted + +# reduce 761 omitted + +# reduce 762 omitted + +# reduce 763 omitted + +# reduce 764 omitted + +# reduce 765 omitted + +# reduce 766 omitted + +# reduce 767 omitted + +# reduce 768 omitted + +# reduce 769 omitted + +# reduce 770 omitted + +def _reduce_771(val, _values, result) + _, close = val # TODO: include lineno in close? + result = [close, lexer.lineno] + + result +end + +def _reduce_772(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +def _reduce_773(val, _values, result) + _, close = val + result = [close, lexer.lineno] + + result +end + +# reduce 774 omitted + +# reduce 775 omitted + +# reduce 776 omitted + +def _reduce_777(val, _values, result) + yyerrok + result +end + +# reduce 778 omitted + +# reduce 779 omitted + +def _reduce_780(val, _values, result) + yyerrok + result +end + +def _reduce_781(val, _values, result) + result = nil; + result +end + +def _reduce_none(val, _values, result) + val[0] +end + +end # class Ruby32Parser diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby32_parser.y b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby32_parser.y new file mode 100644 index 000000000..62dc144ef --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby32_parser.y @@ -0,0 +1,3543 @@ +# -*- racc -*- + +class Ruby32Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + tBDOT2 tBDOT3 + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 1 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY top_compstmt tRCURLY + { + (_, line), stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + yyerror "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 2 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 3 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg kRESCUE_MOD stmt + { + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | defn_head f_opt_paren_args tEQL command + { + result = new_endless_defn val + } + | defn_head f_opt_paren_args tEQL command kRESCUE_MOD arg + { + result = new_endless_defn val + } + | defs_head f_opt_paren_args tEQL command + { + result = new_endless_defs val + } + | defs_head f_opt_paren_args tEQL command kRESCUE_MOD arg + { + result = new_endless_defs val + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg tASSOC + { + # value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } + p_top_expr_body + { + lhs, _, in_kwarg, rhs = val + + self.env.unextend + self.in_kwarg = in_kwarg + + rhs = new_in rhs, nil, nil, rhs.line + result = new_case lhs, rhs, rhs.line + } + | arg + kIN + { + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } + p_top_expr_body + { + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + } + | arg =tLBRACE_ARG + + def_name: fname + { + # TODO: numparam_name(p, fname); + + (id, line), = val + old_in_def = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result = [id.to_sym, line, old_in_def] + } + defn_head: k_def def_name + { + _, name = val + result = name + } + defs_head: k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + self.in_argdef = true + } + def_name + { + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + self.in_single += 1 # TODO: remove? + + # self.in_def = true # local_push + # self.env.extend + # lexer.cmdarg.push false + # lexer.cond.push false + + _, recv, _, _, name = val + + result = [recv, name] + } + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + (_, l), = val + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 4 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 5 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 6 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 7 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 8 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + | arg tDOT2 + { + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + } + | arg tDOT3 + { + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + } + + | tBDOT2 arg + { + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + } + | tBDOT3 arg + { + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + } + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, num, _, arg = val + lit = wrap :lit, num + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | defn_head f_opt_paren_args tEQL arg + { + result = new_endless_defn val + } + | defn_head f_opt_paren_args tEQL arg kRESCUE_MOD arg + { + result = new_endless_defn val + } + | defs_head f_opt_paren_args tEQL arg + { + result = new_endless_defs val + } + | defs_head f_opt_paren_args tEQL arg kRESCUE_MOD arg + { + result = new_endless_defs val + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + | tLPAREN2 args tCOMMA args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + | tLPAREN2 args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + | tAMPER + { + (_, line), = val + result = s(:block_pass).line line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | tSTAR + { + (_, line), = val + result = s(:array, s(:splat).line(line)).line line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + args, _, (_, line), id = val + result = self.list_append args, s(:splat, id).line(line) + } + | args tCOMMA tSTAR + { + args, _, (_, line) = val + result = self.list_append args, s(:splat).line(line) + } + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + (_, line), _, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + (_, line), stmt, _ = val + result = stmt || s(:nil).line(line) + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK aref_args rbracket + { + (_, line), args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 9 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_case expr_value opt_terms p_case_body k_end + { + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt + k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | defn_head f_arglist bodystmt k_end + { + # [ [:f, 1, false], s(:args)...] + # => + # [[:k_def, 666], [:f, 1], false, s(:args)...] + val.insert 1, val.first.pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | defs_head f_arglist bodystmt k_end + { + # [ [recv, [:name, 1, false]], s(:args...] + # => + # [ recv, [:name, 1, false], s(:args...] + # => + # [ recv, [:name, 1], false, s(:args...] + # => + # [ :k_def, recv, [:name, 1], false, s(:args...] + + val.prepend(*val.shift) + val.insert 2, val[1].pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + self.in_argdef = true + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + { + (sym, line), = val + + result = s(:dummy, sym).line line + } + | tLPAREN f_margs rparen + { + _, args, _ = val + result = args + } + + f_marg_list: f_marg + { + arg, = val + line = arg.line + + arg = arg.last if arg.sexp_type == :dummy + + result = s(:array, arg).line line + } + | f_marg_list tCOMMA f_marg + { + args, _, arg = val + + arg = arg.last if arg.sexp_type == :dummy + + result = list_append args, arg + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + (_, line), = val + result = args([:*]).line line + } + + f_any_kwrest: f_kwrest + | f_no_kwarg + + f_eq: { self.in_argdef = false } tEQL + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_any_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + excessed_comma: tCOMMA + { + result = s(:WTF_COMMA!) + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg excessed_comma + { + arg, _ = val + result = arg << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + } + | tOROP + { + (_, line), = val + + result = s(:args).line line + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = lexer.lpar_beg + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + (_, line), lpar, args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + self.in_argdef = false + result = args val + } + | f_args + { + self.in_argdef = false + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + (_, line), = val + result = s(:zsuper).line line + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + } + brace_body + tRCURLY + { + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + } + do_body + kEND + { + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + bodystmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + case_args then compstmt cases + { + (_, line), case_args, _then, body, cases = val + + result = new_when case_args, body + result.line line + result << cases if cases + } + + cases: opt_else | case_body +###################################################################### + + p_case_body: kIN + { + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + } + p_top_expr then + { + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + } + compstmt + p_cases + { + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + } + + p_cases: opt_else + | p_case_body + + p_top_expr: p_top_expr_body + | p_top_expr_body kIF_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + } + | p_top_expr_body kUNLESS_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + } + + p_top_expr_body: p_expr + | p_expr tCOMMA + { + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + } + | p_expr tCOMMA p_args + { + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + } + | p_find + { + find, = val + + result = new_find_pattern nil, find + } + | p_args_tail + { + args, = val + result = new_array_pattern nil, nil, args, args.line + } + | p_kwargs + { + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + } + + p_expr: p_as + + p_as: p_expr tASSOC p_variable + { + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + } + | p_alt + + p_alt: p_alt tPIPE p_expr_basic + { + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + } + | p_expr_basic + + p_lparen: tLPAREN2 { push_pktbl } + p_lbracket: tLBRACK2 { push_pktbl } + + p_expr_basic: p_value + | p_variable + | p_const p_lparen p_args tRPAREN + { + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + } + | p_const p_lparen p_find tRPAREN + { + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + } + | p_const p_lparen p_kwargs tRPAREN + { + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + } + | p_const tLPAREN2 tRPAREN + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | p_const p_lbracket p_args rbracket + { + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + } + | p_const p_lbracket p_find rbracket + { + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + } + | p_const p_lbracket p_kwargs rbracket + { + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + } + | p_const tLBRACK2 rbracket + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | tLBRACK p_args rbracket + { + _, pat, _ = val + + result = new_array_pattern nil, nil, pat, pat.line + } + | tLBRACK p_find rbracket + { + _, find, _ = val + + result = new_find_pattern nil, find + } + | tLBRACK rbracket + { + (_, line), _ = val + + result = s(:array_pat).line line + } + | tLBRACE + { + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + } + p_kwargs rbrace + { + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + } + | tLBRACE rbrace + { + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + } + | tLPAREN { push_pktbl } p_expr tRPAREN + { + _, _, expr, _ = val + + pop_pktbl + result = expr + } + + p_args: p_expr + { + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + } + | p_args_head + { + head, = val + + result = new_array_pattern_tail head, true, nil, nil + } + | p_args_head p_arg + { + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + } + | p_args_head p_rest + { + head, (rest, _) = val + + result = new_array_pattern_tail(head, true, rest, nil).line head.line + } + | p_args_head p_rest tCOMMA p_args_post + { + head, (rest, _), _, post = val + + result = new_array_pattern_tail(head, true, rest, post).line head.line + } + | p_args_tail + + p_args_head: p_arg tCOMMA + { + arg, _ = val + result = arg + } + | p_args_head p_arg tCOMMA + { + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + } + + p_args_tail: p_rest + { + (id, line), = val + + result = new_array_pattern_tail nil, true, id, nil + result.line line + } + | p_rest tCOMMA p_args_post + { + (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id, rhs + result.line line + } + + p_find: p_rest tCOMMA p_args_post tCOMMA p_rest + { + lhs, _, mid, _, rhs = val + + result = new_find_pattern_tail lhs, mid, rhs + } + + p_rest: tSTAR tIDENTIFIER + { + _, (id, line) = val + + result = [id.to_sym, line] + } + | tSTAR + { + (_id, line), = val + + result = [nil, line] + } + + p_args_post: p_arg + | p_args_post tCOMMA p_arg + { + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + } + + p_arg: p_expr + { + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + } + + p_kwargs: p_kwarg tCOMMA p_any_kwrest + { + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + } + | p_kwarg + { + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_kwarg tCOMMA + { + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_any_kwrest + { + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + } + + p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1) + | p_kwarg tCOMMA p_kw + { + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + } + + p_kw: p_kw_label p_expr + { + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + } + | p_kw_label + { + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 10 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + } + + p_kw_label: tLABEL + { + result = wrap :lit, val[0] + } + | tSTRING_BEG string_contents tLABEL_END + { + # you can't actually get here the way I lex labels + debug 11 + } + + p_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + } + | kwrest_mark + { + (_, line), = val + + result = s(:kwrest, :"**").line line + } + + p_kwnorest: kwrest_mark kNIL + { + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + } + + p_any_kwrest: p_kwrest + | p_kwnorest + + p_value: p_primitive + | p_primitive tDOT2 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + } + | p_primitive tDOT3 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + } + | p_primitive tDOT2 + { + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + } + | p_primitive tDOT3 + { + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + } + | p_var_ref + | p_expr_ref + | p_const + | tBDOT2 p_primitive + { + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + } + | tBDOT3 p_primitive + { + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + } + + p_primitive: literal + | strings + | xstring + | regexp + | words + { + result = ary_to_pat val[0] + } + | qwords + { + result = ary_to_pat val[0] + } + | symbols + { + result = ary_to_pat val[0] + } + | qsymbols + { + result = ary_to_pat val[0] + } + | keyword_variable + { + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + } + | lambda + + p_variable: tIDENTIFIER + { + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + } + + p_var_ref: tCARET tIDENTIFIER + { + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + } + | tCARET nonlocal_var + { + _, var = val + result = var + } + + p_expr_ref: tCARET tLPAREN expr_value rparen + { + _, _, expr, _ = val + result = expr # TODO? s(:begin, expr).line expr.line + } + + p_const: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | p_const tCOLON2 cname + { + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + } + | tCONSTANT + { + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + } +###################################################################### + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 12 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + (_, line), memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 13 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + (_, line), result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line line + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 14 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + + nonlocal_var: tIVAR { result = wrap :ivar, val[0] } + | tGVAR { result = wrap :gvar, val[0] } + | tCVAR { result = wrap :cvar, val[0] } + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { (_, line), = val; result = s(:nil).line line } + | kSELF { (_, line), = val; result = s(:self).line line } + | kTRUE { (_, line), = val; result = s(:true).line line } + | kFALSE { (_, line), = val; result = s(:false).line line } + | k__FILE__ { (_, line), = val; result = s(:str, self.file).line line } + | k__LINE__ { (_, line), = val; result = s(:lit, line).line line } + | k__ENCODING__ + { + (_, l), = val + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 15 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + +f_opt_paren_args: f_paren_args + | none + { + self.in_argdef = false + result = end_args val + } + + f_paren_args: tLPAREN2 f_args rparen + { + self.in_argdef = false + result = end_args val + } + + f_arglist: f_paren_args + | { + result = self.in_kwarg + self.in_kwarg = true + self.in_argdef = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + self.in_argdef = false + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_any_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg + | args_forward + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + } + + args_forward: tBDOT3 + { + (_, line), = val + result = s(:forward_args).line line + } + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + { + label, = val + # arg_var(p, formal_argument(p, $1)); + # p->cur_arg = get_id($1); + # p->max_numparam = ORDINAL_PARAM; + self.in_argdef = false + result = label + } + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + self.in_argdef = true + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + f_no_kwarg: kwrest_mark kNIL + { + (_, line), _ = val + result = [:"**nil", line] + } + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + (_, line), = val + id = :"**" + self.env[id] = :lvar + result = [id, line] + } + + f_opt: f_arg_asgn + f_eq + arg_value + { + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO: detect duplicate names + # TODO? p->cur_arg = 0; + } + + f_block_opt: f_arg_asgn + f_eq + primary_value + { + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO? p->cur_arg = 0; + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + (_, line), = val + name = :"*" + self.env[name] = :lvar + result = [name, line] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + | blkarg_mark + { + (_, line), = val + + result = [:&, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tLABEL + { + lit = wrap :lit, val[0] + arg = nil + + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + | tDSTAR + { + (_, line), = val + result = s(:array, s(:kwsplat).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val # TODO: include lineno in close? + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + rbrace: opt_nl tRCURLY + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby3_parser.yy b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby3_parser.yy new file mode 100644 index 000000000..09f60a683 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby3_parser.yy @@ -0,0 +1,3635 @@ +# -*- racc -*- + +#if V == 30 +class Ruby30Parser +#elif V == 31 +class Ruby31Parser +#elif V == 32 +class Ruby32Parser +#else +fail "version not specified or supported on code generation" +#endif + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND + tRATIONAL tIMAGINARY + tLABEL_END + tLONELY + tBDOT2 tBDOT3 + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 1 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY top_compstmt tRCURLY + { + (_, line), stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + yyerror "else without rescue is useless" unless res + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 2 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 3 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } + | mlhs tEQL mrhs_arg kRESCUE_MOD stmt + { + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + } + | mlhs tEQL mrhs_arg + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } +#if V > 30 + | defn_head f_opt_paren_args tEQL command + { + result = new_endless_defn val + } + | defn_head f_opt_paren_args tEQL command kRESCUE_MOD arg + { + result = new_endless_defn val + } + | defs_head f_opt_paren_args tEQL command + { + result = new_endless_defs val + } + | defs_head f_opt_paren_args tEQL command kRESCUE_MOD arg + { + result = new_endless_defs val + } +#endif + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } + | arg tASSOC + { + # value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } +#if V == 30 + p_expr +#else + p_top_expr_body +#endif + { + lhs, _, in_kwarg, rhs = val + + self.env.unextend + self.in_kwarg = in_kwarg + + rhs = new_in rhs, nil, nil, rhs.line + result = new_case lhs, rhs, rhs.line + } + | arg + kIN + { + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } +#if V == 30 + p_expr +#else + p_top_expr_body +#endif + { + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + } + | arg =tLBRACE_ARG + + def_name: fname + { + # TODO: numparam_name(p, fname); + + (id, line), = val + old_in_def = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + result = [id.to_sym, line, old_in_def] + } + defn_head: k_def def_name + { + _, name = val + result = name + } + defs_head: k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + self.in_argdef = true + } + def_name + { + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + self.in_single += 1 # TODO: remove? + + # self.in_def = true # local_push + # self.env.extend + # lexer.cmdarg.push false + # lexer.cond.push false + + _, recv, _, _, name = val + + result = [recv, name] + } + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + (_, l), = val + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 4 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 5 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 6 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 7 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 8 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } + | arg tDOT2 + { + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + } + | arg tDOT3 + { + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + } + + | tBDOT2 arg + { + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + } + | tBDOT3 arg + { + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + } + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + _, num, _, arg = val + lit = wrap :lit, num + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | defn_head f_opt_paren_args tEQL arg + { + result = new_endless_defn val + } + | defn_head f_opt_paren_args tEQL arg kRESCUE_MOD arg + { + result = new_endless_defn val + } + | defs_head f_opt_paren_args tEQL arg + { + result = new_endless_defs val + } + | defs_head f_opt_paren_args tEQL arg kRESCUE_MOD arg + { + result = new_endless_defs val + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } + | tLPAREN2 args tCOMMA args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + | tLPAREN2 args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } +#if V > 30 + | tAMPER + { + (_, line), = val + result = s(:block_pass).line line + } +#endif + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } +#if V >= 32 + | tSTAR + { + (_, line), = val + result = s(:array, s(:splat).line(line)).line line + } +#endif + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + args, _, (_, line), id = val + result = self.list_append args, s(:splat, id).line(line) + } +#if V >= 32 + | args tCOMMA tSTAR + { + args, _, (_, line) = val + result = self.list_append args, s(:splat).line(line) + } +#endif + + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + (_, line), _, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + (_, line), stmt, _ = val + result = stmt || s(:nil).line(line) + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK aref_args rbracket + { + (_, line), args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 9 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } + | k_case expr_value opt_terms p_case_body k_end + { + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + } + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt + k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | defn_head f_arglist bodystmt k_end + { + # [ [:f, 1, false], s(:args)...] + # => + # [[:k_def, 666], [:f, 1], false, s(:args)...] + val.insert 1, val.first.pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | defs_head f_arglist bodystmt k_end + { + # [ [recv, [:name, 1, false]], s(:args...] + # => + # [ recv, [:name, 1, false], s(:args...] + # => + # [ recv, [:name, 1], false, s(:args...] + # => + # [ :k_def, recv, [:name, 1], false, s(:args...] + + val.prepend(*val.shift) + val.insert 2, val[1].pop + val.insert 0, [:k_def, 666] + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + self.in_argdef = true + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + { + (sym, line), = val + + result = s(:dummy, sym).line line + } + | tLPAREN f_margs rparen + { + _, args, _ = val + result = args + } + + f_marg_list: f_marg + { + arg, = val + line = arg.line + + arg = arg.last if arg.sexp_type == :dummy + + result = s(:array, arg).line line + } + | f_marg_list tCOMMA f_marg + { + args, _, arg = val + + arg = arg.last if arg.sexp_type == :dummy + + result = list_append args, arg + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + (_, line), = val + result = args([:*]).line line + } + + f_any_kwrest: f_kwrest + | f_no_kwarg + +#if V > 30 + f_eq: { self.in_argdef = false } tEQL +#endif + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_any_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + excessed_comma: tCOMMA + { + result = s(:WTF_COMMA!) + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg excessed_comma + { + arg, _ = val + result = arg << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + } + | tOROP + { + (_, line), = val + + result = s(:args).line line + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + self.in_argdef = false + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = lexer.lpar_beg + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + (_, line), lpar, args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + self.in_argdef = false + result = args val + } + | f_args + { + self.in_argdef = false + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + (_, line), = val + result = s(:zsuper).line line + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + } + brace_body + tRCURLY + { + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + } + do_body + kEND + { + (_, line), _, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param + bodystmt + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + case_args then compstmt cases + { + (_, line), case_args, _then, body, cases = val + + result = new_when case_args, body + result.line line + result << cases if cases + } + + cases: opt_else | case_body +###################################################################### + + p_case_body: kIN + { + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + } + p_top_expr then + { + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + } + compstmt + p_cases + { + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + } + + p_cases: opt_else + | p_case_body + + p_top_expr: p_top_expr_body + | p_top_expr_body kIF_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + } + | p_top_expr_body kUNLESS_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + } + + p_top_expr_body: p_expr + | p_expr tCOMMA + { + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + } + | p_expr tCOMMA p_args + { + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + } + | p_find + { + find, = val + + result = new_find_pattern nil, find + } + | p_args_tail + { + args, = val + result = new_array_pattern nil, nil, args, args.line + } + | p_kwargs + { + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + } + + p_expr: p_as + + p_as: p_expr tASSOC p_variable + { + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + } + | p_alt + + p_alt: p_alt tPIPE p_expr_basic + { + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + } + | p_expr_basic + + p_lparen: tLPAREN2 { push_pktbl } + p_lbracket: tLBRACK2 { push_pktbl } + + p_expr_basic: p_value +#if V > 30 + | p_variable +#endif + | p_const p_lparen p_args tRPAREN + { + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + } + | p_const p_lparen p_find tRPAREN + { + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + } + | p_const p_lparen p_kwargs tRPAREN + { + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + } + | p_const tLPAREN2 tRPAREN + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | p_const p_lbracket p_args rbracket + { + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + } + | p_const p_lbracket p_find rbracket + { + const, _, find, _ = val + + pop_pktbl + result = new_find_pattern(const, find).line const.line + } + | p_const p_lbracket p_kwargs rbracket + { + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + } + | p_const tLBRACK2 rbracket + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | tLBRACK p_args rbracket + { + _, pat, _ = val + + result = new_array_pattern nil, nil, pat, pat.line + } + | tLBRACK p_find rbracket + { + _, find, _ = val + + result = new_find_pattern nil, find + } + | tLBRACK rbracket + { + (_, line), _ = val + + result = s(:array_pat).line line + } + | tLBRACE + { + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + } + p_kwargs rbrace + { + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + } + | tLBRACE rbrace + { + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + } + | tLPAREN { push_pktbl } p_expr tRPAREN + { + _, _, expr, _ = val + + pop_pktbl + result = expr + } + + p_args: p_expr + { + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + } + | p_args_head + { + head, = val + + result = new_array_pattern_tail head, true, nil, nil + } + | p_args_head p_arg + { + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + } +#if V < 32 + | p_args_head tSTAR tIDENTIFIER + { + head, _, (id, _line) = val + + result = new_array_pattern_tail head, true, id.to_sym, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post + { + head, _, (id, _line), _, post = val + + result = new_array_pattern_tail head, true, id.to_sym, post + result.line head.line + } + | p_args_head tSTAR + { + expr, _ = val + + result = new_array_pattern_tail(expr, true, nil, nil).line expr.line + } + | p_args_head tSTAR tCOMMA p_args_post + { + head, _, _, post = val + + result = new_array_pattern_tail(head, true, nil, post).line head.line + } +#else + | p_args_head p_rest + { + head, (rest, _) = val + + result = new_array_pattern_tail(head, true, rest, nil).line head.line + } + | p_args_head p_rest tCOMMA p_args_post + { + head, (rest, _), _, post = val + + result = new_array_pattern_tail(head, true, rest, post).line head.line + } +#endif + | p_args_tail + + p_args_head: p_arg tCOMMA + { + arg, _ = val + result = arg + } + | p_args_head p_arg tCOMMA + { + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + } + + p_args_tail: p_rest + { + (id, line), = val + + result = new_array_pattern_tail nil, true, id, nil + result.line line + } + | p_rest tCOMMA p_args_post + { + (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id, rhs + result.line line + } + + p_find: p_rest tCOMMA p_args_post tCOMMA p_rest + { + lhs, _, mid, _, rhs = val + + result = new_find_pattern_tail lhs, mid, rhs + } + + p_rest: tSTAR tIDENTIFIER + { + _, (id, line) = val + + result = [id.to_sym, line] + } + | tSTAR + { + (_id, line), = val + + result = [nil, line] + } + + p_args_post: p_arg + | p_args_post tCOMMA p_arg + { + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + } + + p_arg: p_expr + { + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + } + + p_kwargs: p_kwarg tCOMMA p_any_kwrest + { + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + } + | p_kwarg + { + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_kwarg tCOMMA + { + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_any_kwrest + { + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + } + + p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1) + | p_kwarg tCOMMA p_kw + { + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + } + + p_kw: p_kw_label p_expr + { + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + } + | p_kw_label + { + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 10 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + } + + p_kw_label: tLABEL + { + result = wrap :lit, val[0] + } +#if V > 30 + | tSTRING_BEG string_contents tLABEL_END + { + # you can't actually get here the way I lex labels + debug 11 + } +#endif + + p_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + } + | kwrest_mark + { + (_, line), = val + + result = s(:kwrest, :"**").line line + } + + p_kwnorest: kwrest_mark kNIL + { + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + } + + p_any_kwrest: p_kwrest + | p_kwnorest + + p_value: p_primitive + | p_primitive tDOT2 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + } + | p_primitive tDOT3 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + } + | p_primitive tDOT2 + { + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + } + | p_primitive tDOT3 + { + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + } +#if V == 30 + | p_variable +#endif + | p_var_ref +#if V > 30 + | p_expr_ref +#endif + | p_const + | tBDOT2 p_primitive + { + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + } + | tBDOT3 p_primitive + { + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + } + + p_primitive: literal + | strings + | xstring + | regexp + | words + { + result = ary_to_pat val[0] + } + | qwords + { + result = ary_to_pat val[0] + } + | symbols + { + result = ary_to_pat val[0] + } + | qsymbols + { + result = ary_to_pat val[0] + } + | keyword_variable + { + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + } + | lambda + + p_variable: tIDENTIFIER + { + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + } + + p_var_ref: tCARET tIDENTIFIER + { + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + } +#if V > 30 + | tCARET nonlocal_var + { + _, var = val + result = var + } +#endif + +#if V > 30 + p_expr_ref: tCARET tLPAREN expr_value rparen + { + _, _, expr, _ = val + result = expr # TODO? s(:begin, expr).line expr.line + } +#endif + + p_const: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | p_const tCOLON2 cname + { + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + } + | tCONSTANT + { + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + } +###################################################################### + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 12 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + (_, line), memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 13 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + (_, line), result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line line + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 14 + end + } + + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST + { + _, (num, line) = val + result = [-num, line] + } + + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + +#if V > 30 + nonlocal_var: tIVAR { result = wrap :ivar, val[0] } + | tGVAR { result = wrap :gvar, val[0] } + | tCVAR { result = wrap :cvar, val[0] } +#endif + + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { (_, line), = val; result = s(:nil).line line } + | kSELF { (_, line), = val; result = s(:self).line line } + | kTRUE { (_, line), = val; result = s(:true).line line } + | kFALSE { (_, line), = val; result = s(:false).line line } + | k__FILE__ { (_, line), = val; result = s(:str, self.file).line line } + | k__LINE__ { (_, line), = val; result = s(:lit, line).line line } + | k__ENCODING__ + { + (_, l), = val + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 15 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + +f_opt_paren_args: f_paren_args + | none + { + self.in_argdef = false + result = end_args val + } + + f_paren_args: tLPAREN2 f_args rparen + { + self.in_argdef = false + result = end_args val + } +#if V == 30 + | tLPAREN2 f_arg tCOMMA args_forward rparen + { + result = end_args val + } + | tLPAREN2 args_forward rparen + { + result = end_args val + } +#endif + + f_arglist: f_paren_args + | { + result = self.in_kwarg + self.in_kwarg = true + self.in_argdef = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + self.in_argdef = false + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_any_kwrest opt_f_block_arg + { + result = args val + } + | f_block_arg +#if V > 30 + | args_forward +#endif + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + } + + args_forward: tBDOT3 + { + (_, line), = val + result = s(:forward_args).line line + } + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + + f_label: tLABEL + { + label, = val + # arg_var(p, formal_argument(p, $1)); + # p->cur_arg = get_id($1); + # p->max_numparam = ORDINAL_PARAM; + self.in_argdef = false + result = label + } + + f_kw: f_label arg_value + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + self.in_argdef = true + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kw: f_label primary_value + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + self.in_argdef = true + + result = s(:array, s(:kwarg, id).line(line)).line line + } + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + + f_no_kwarg: kwrest_mark kNIL + { + (_, line), _ = val + result = [:"**nil", line] + } + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + (_, line), = val + id = :"**" + self.env[id] = :lvar + result = [id, line] + } + + f_opt: f_arg_asgn +#if V > 30 + f_eq +#else + tEQL +#endif + arg_value + { + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO: detect duplicate names + # TODO? p->cur_arg = 0; + } + + f_block_opt: f_arg_asgn +#if V > 30 + f_eq +#else + tEQL +#endif + primary_value + { + lhs, _, rhs = val + self.in_argdef = true + result = self.assignable lhs, rhs + # TODO? p->cur_arg = 0; + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + (_, line), = val + name = :"*" + self.env[name] = :lvar + result = [name, line] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + | blkarg_mark + { + (_, line), = val + + result = [:&, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } + | tLABEL + { + lit = wrap :lit, val[0] + arg = nil + + result = s(:array, lit, arg).line lit.line + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } +#if V >= 32 + | tDSTAR + { + (_, line), = val + result = s(:array, s(:kwsplat).line(line)).line line + } +#endif + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT + | tLONELY # TODO: rename tANDDOT? + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val # TODO: include lineno in close? + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } + rbrace: opt_nl tRCURLY + { + _, close = val + result = [close, lexer.lineno] + } + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rb new file mode 100644 index 000000000..09ac7d54b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rb @@ -0,0 +1,1159 @@ +# frozen_string_literal: true +# encoding: UTF-8 + +$DEBUG = true if ENV["DEBUG"] + +class RubyLexer + # :stopdoc: + EOF = :eof_haha! + + ESCAPES = { + "a" => "\007", + "b" => "\010", + "e" => "\033", + "f" => "\f", + "n" => "\n", + "r" => "\r", + "s" => " ", + "t" => "\t", + "v" => "\13", + "\\" => '\\', + "\n" => "", + "C-\?" => 127.chr, + "c\?" => 127.chr, + } + + HAS_ENC = "".respond_to? :encoding + + BTOKENS = { + ".." => :tBDOT2, + "..." => :tBDOT3, + } + + TOKENS = { + "!" => :tBANG, + "!=" => :tNEQ, + "!@" => :tBANG, + "!~" => :tNMATCH, + "," => :tCOMMA, + ".." => :tDOT2, + "..." => :tDOT3, + "=" => :tEQL, + "==" => :tEQ, + "===" => :tEQQ, + "=>" => :tASSOC, + "=~" => :tMATCH, + "->" => :tLAMBDA, + } + + PERCENT_END = { + "(" => ")", + "[" => "]", + "{" => "}", + "<" => ">", + } + + SIMPLE_RE_META = /[\$\*\+\.\?\^\|\)\]\}\>]/ + + @@regexp_cache = Hash.new { |h, k| h[k] = Regexp.new(Regexp.escape(k)) } + @@regexp_cache[nil] = nil + + def regexp_cache + @@regexp_cache + end + + if $DEBUG then + attr_reader :lex_state + + def lex_state= o + return if @lex_state == o + + from = "" + if ENV["VERBOSE"] + path = caller[0] + path = caller[1] if path =~ /result/ + path, line, *_ = path.split(/:/) + path.delete_prefix! File.dirname File.dirname __FILE__ + from = " at .%s:%s" % [path, line] + end + + warn "lex_state: %p -> %p%s" % [lex_state, o, from] + + @lex_state = o + end + end + + # :startdoc: + + attr_accessor :lex_state unless $DEBUG + + attr_accessor :brace_nest + attr_accessor :cmdarg + attr_accessor :command_start + attr_accessor :cmd_state # temporary--ivar to avoid passing everywhere + attr_accessor :last_state + attr_accessor :cond + attr_accessor :old_ss + attr_accessor :old_lineno + + # these are generated via ruby_lexer.rex: ss, lineno + + ## + # Additional context surrounding tokens that both the lexer and + # grammar use. + + attr_accessor :lex_strterm + attr_accessor :lpar_beg + attr_accessor :paren_nest + attr_accessor :parser # HACK for very end of lexer... *sigh* + attr_accessor :space_seen + attr_accessor :string_buffer + attr_accessor :string_nest + + # Last token read via next_token. + attr_accessor :token + + attr_writer :comments + + def initialize _ = nil + @lex_state = nil # remove one warning under $DEBUG + @lex_state = EXPR_NONE + + self.cond = RubyParserStuff::StackState.new(:cond, $DEBUG) + self.cmdarg = RubyParserStuff::StackState.new(:cmdarg, $DEBUG) + self.ss = RPStringScanner.new "" + + reset + end + + def arg_ambiguous + self.warning "Ambiguous first argument. make sure." + end + + def arg_state + is_after_operator? ? EXPR_ARG : EXPR_BEG + end + + def ignore_body_comments + @comments.clear + end + + def comments # TODO: remove this... maybe comment_string + attr_accessor + c = @comments.join + @comments.clear + c + end + + def debug n + raise "debug #{n}" + end + + def expr_dot? + lex_state =~ EXPR_DOT + end + + def expr_fname? # REFACTOR + lex_state =~ EXPR_FNAME + end + + def expr_result token, text + cond.push false + cmdarg.push false + result EXPR_BEG, token, text + end + + def in_fname? # REFACTOR + lex_state =~ EXPR_FNAME + end + + def int_with_base base + rb_compile_error "Invalid numeric format" if matched =~ /__/ + + text = matched + case + when text.end_with?("ri") + result EXPR_NUM, :tIMAGINARY, Complex(0, Rational(text.chop.chop.to_i(base))) + when text.end_with?("r") + result EXPR_NUM, :tRATIONAL, Rational(text.chop.to_i(base)) + when text.end_with?("i") + result EXPR_NUM, :tIMAGINARY, Complex(0, text.chop.to_i(base)) + else + result EXPR_NUM, :tINTEGER, text.to_i(base) + end + end + + def is_after_operator? + lex_state =~ EXPR_FNAME|EXPR_DOT + end + + def is_arg? + lex_state =~ EXPR_ARG_ANY + end + + def is_beg? + lex_state =~ EXPR_BEG_ANY || lex_state == EXPR_LAB # yes, == EXPR_LAB + end + + def is_end? + lex_state =~ EXPR_END_ANY + end + + def is_label_possible? + (lex_state =~ EXPR_LABEL|EXPR_ENDFN && !cmd_state) || is_arg? + end + + def is_label_suffix? + check(/:(?!:)/) + end + + def is_space_arg? c = "x" + is_arg? and space_seen and c !~ /\s/ + end + + def lambda_beginning? + lpar_beg && lpar_beg == paren_nest + end + + def is_local_id id + # maybe just make this false for now + self.parser.env[id.to_sym] == :lvar # HACK: this isn't remotely right + end + + def lvar_defined? id + # TODO: (dyna_in_block? && dvar_defined?(id)) || local_id?(id) + self.parser.env[id.to_sym] == :lvar + end + + def not_end? + not is_end? + end + + def possibly_escape_string text, check + content = match[1] + + if text =~ check then + unescape_string content + else + content.gsub(/\\\\/, "\\").gsub(/\\\'/, "'") + end + end + + def process_amper text + token = if is_arg? && space_seen && !check(/\s/) then + warning("`&' interpreted as argument prefix") + :tAMPER + elsif lex_state =~ EXPR_BEG|EXPR_MID then + :tAMPER + else + :tAMPER2 + end + + result :arg_state, token, "&" + end + + def process_backref text + token = match[1].to_sym + # TODO: can't do lineno hack w/ symbol + result EXPR_END, :tBACK_REF, token + end + + def process_begin text + @comments << matched + + unless scan(/.*?\n=end( |\t|\f)*[^\n]*(\n|\z)/m) then + @comments.clear + rb_compile_error("embedded document meets end of file") + end + + @comments << matched + self.lineno += matched.count("\n") # HACK? + + nil # TODO + end + + # TODO: make all tXXXX terminals include lexer.lineno ... enforce it somehow? + + def process_brace_close text + case matched + when "}" then + self.brace_nest -= 1 + return :tSTRING_DEND, matched if brace_nest < 0 + end + + # matching compare/parse26.y:8099 + cond.pop + cmdarg.pop + + case matched + when "}" then + self.lex_state = ruby24minus? ? EXPR_ENDARG : EXPR_END + return :tRCURLY, matched + when "]" then + self.paren_nest -= 1 + self.lex_state = ruby24minus? ? EXPR_ENDARG : EXPR_END + return :tRBRACK, matched + when ")" then + self.paren_nest -= 1 + self.lex_state = EXPR_ENDFN + return :tRPAREN, matched + else + raise "Unknown bracing: #{matched.inspect}" + end + end + + def process_brace_open text + # matching compare/parse23.y:8694 + self.brace_nest += 1 + + if lambda_beginning? then + self.lpar_beg = nil + self.paren_nest -= 1 # close arg list when lambda opens body + + return expr_result(:tLAMBEG, "{") + end + + token = case + when lex_state =~ EXPR_LABELED then + :tLBRACE # hash + when lex_state =~ EXPR_ARG_ANY|EXPR_END|EXPR_ENDFN then + :tLCURLY # block (primary) "{" in parse.y + when lex_state =~ EXPR_ENDARG then + :tLBRACE_ARG # block (expr) + else + :tLBRACE # hash + end + + state = token == :tLBRACE_ARG ? EXPR_BEG : EXPR_PAR + self.command_start = true if token != :tLBRACE + + cond.push false + cmdarg.push false + result state, token, text + end + + def process_colon1 text + # ?: / then / when + if is_end? || check(/\s/) then + return result EXPR_BEG, :tCOLON, text + end + + case + when scan(/\'/) then + string STR_SSYM, matched + when scan(/\"/) then + string STR_DSYM, matched + end + + result EXPR_FNAME, :tSYMBEG, text + end + + def process_colon2 text + if is_beg? || lex_state =~ EXPR_CLASS || is_space_arg? then + result EXPR_BEG, :tCOLON3, text + else + result EXPR_DOT, :tCOLON2, text + end + end + + def process_dots text # parse32.y:10216 + is_beg = self.is_beg? + self.lex_state = EXPR_BEG + + return result EXPR_ENDARG, :tBDOT3, text if + parser.in_argdef && text == "..." # TODO: version check? + + tokens = ruby27plus? && is_beg ? BTOKENS : TOKENS + + result EXPR_BEG, tokens[text], text + end + + def process_float text + rb_compile_error "Invalid numeric format" if text =~ /__/ + + case + when text.end_with?("ri") + result EXPR_NUM, :tIMAGINARY, Complex(0, Rational(text.chop.chop)) + when text.end_with?("i") + result EXPR_NUM, :tIMAGINARY, Complex(0, text.chop.to_f) + when text.end_with?("r") + result EXPR_NUM, :tRATIONAL, Rational(text.chop) + else + result EXPR_NUM, :tFLOAT, text.to_f + end + end + + def process_gvar text + if parser.class.version > 20 && text == "$-" then + rb_compile_error "unexpected $undefined" + end + + result EXPR_END, :tGVAR, text + end + + def process_gvar_oddity text + rb_compile_error "#{text.inspect} is not allowed as a global variable name" + end + + def process_ivar text + tok_id = text =~ /^@@/ ? :tCVAR : :tIVAR + result EXPR_END, tok_id, text + end + + def process_label text + symbol = possibly_escape_string text, /^\"/ + + result EXPR_LAB, :tLABEL, symbol + end + + def process_label_or_string text + if @was_label && text =~ /:\Z/ then + @was_label = nil + return process_label text + elsif text =~ /:\Z/ then + self.pos -= 1 # put back ":" + text = text[0..-2] + end + + orig_line = lineno + str = text[1..-2].gsub(/\\\\/, "\\").gsub(/\\\'/, "\'") + self.lineno += str.count("\n") + + result EXPR_END, :tSTRING, str, orig_line + end + + def process_lchevron text + if (lex_state !~ EXPR_DOT|EXPR_CLASS && + !is_end? && + (!is_arg? || lex_state =~ EXPR_LABELED || space_seen)) then + tok = self.heredoc_identifier + return tok if tok + end + + if is_after_operator? then + self.lex_state = EXPR_ARG + else + self.command_start = true if lex_state =~ EXPR_CLASS + self.lex_state = EXPR_BEG + end + + result lex_state, :tLSHFT, "\<\<" + end + + def process_newline_or_comment text # ../compare/parse30.y:9126 ish + c = matched + + if c == "#" then + self.pos -= 1 + + while scan(/\s*\#.*(\n+|\z)/) do + self.lineno += matched.count "\n" + @comments << matched.gsub(/^ +#/, "#").gsub(/^ +$/, "") + end + + return nil if end_of_stream? + end + + c = (lex_state =~ EXPR_BEG|EXPR_CLASS|EXPR_FNAME|EXPR_DOT && + lex_state !~ EXPR_LABELED) + if c || self.lex_state == EXPR_LAB then # yes, == EXPR_LAB + # ignore if !fallthrough? + if !c && parser.in_kwarg then + # normal newline + self.command_start = true + return result EXPR_BEG, :tNL, nil + else + maybe_pop_stack + return # goto retry + end + end + + if scan(/[\ \t\r\f\v]+/) then + self.space_seen = true + end + + if check(/#/) then + return # goto retry + elsif check(/&\.|\.(?!\.)/) then # C version is a hellish obfuscated xnor + return # goto retry + end + + self.command_start = true + + result EXPR_BEG, :tNL, nil + end + + def process_nthref text + # TODO: can't do lineno hack w/ number + result EXPR_END, :tNTH_REF, match[1].to_i + end + + def process_paren text + token = if is_beg? then + :tLPAREN + elsif !space_seen then + # foo( ... ) => method call, no ambiguity + :tLPAREN2 + elsif is_space_arg? then + :tLPAREN_ARG + elsif lex_state =~ EXPR_ENDFN && !lambda_beginning? then + # TODO: + # warn("parentheses after method name is interpreted as " \ + # "an argument list, not a decomposed argument") + :tLPAREN2 + else + :tLPAREN2 # plain "(" in parse.y + end + + self.paren_nest += 1 + + cond.push false + cmdarg.push false + result EXPR_PAR, token, text + end + + def process_percent text + case + when is_beg? then + process_percent_quote + when scan(/\=/) + result EXPR_BEG, :tOP_ASGN, "%" + when is_space_arg?(check(/\s/)) || (lex_state =~ EXPR_FITEM && check(/s/)) + process_percent_quote + else + result :arg_state, :tPERCENT, "%" + end + end + + def process_plus_minus text + sign = matched + utype, type = if sign == "+" then + [:tUPLUS, :tPLUS] + else + [:tUMINUS, :tMINUS] + end + + if is_after_operator? then + if scan(/@/) then + return result(EXPR_ARG, utype, "#{sign}@") + else + return result(EXPR_ARG, type, sign) + end + end + + return result(EXPR_BEG, :tOP_ASGN, sign) if scan(/\=/) + + if is_beg? || (is_arg? && space_seen && !check(/\s/)) then + arg_ambiguous if is_arg? + + if check(/\d/) then + return nil if utype == :tUPLUS + return result EXPR_BEG, :tUMINUS_NUM, sign + end + + return result EXPR_BEG, utype, sign + end + + result EXPR_BEG, type, sign + end + + def process_questionmark text + if is_end? then + return result EXPR_BEG, :tEH, "?" + end + + if end_of_stream? then + rb_compile_error "incomplete character syntax: parsed #{text.inspect}" + end + + if check(/\s|\v/) then + unless is_arg? then + c2 = { " " => "s", + "\n" => "n", + "\t" => "t", + "\v" => "v", + "\r" => "r", + "\f" => "f" }[matched] + + if c2 then + warning("invalid character syntax; use ?\\" + c2) + end + end + + # ternary + return result EXPR_BEG, :tEH, "?" + elsif check(/\w(?=\w)/) then # ternary, also + return result EXPR_BEG, :tEH, "?" + end + + c = if scan(/\\/) then + self.read_escape + else + getch + end + + result EXPR_END, :tSTRING, c + end + + def process_simple_string text + orig_line = lineno + self.lineno += text.count("\n") + + str = unescape_string text[1..-2] + + result EXPR_END, :tSTRING, str, orig_line + end + + def process_slash text + if is_beg? then + string STR_REGEXP, matched + + return result nil, :tREGEXP_BEG, "/" + end + + if scan(/\=/) then + return result(EXPR_BEG, :tOP_ASGN, "/") + end + + if is_arg? && space_seen then + unless scan(/\s/) then + arg_ambiguous + string STR_REGEXP, "/" + return result(nil, :tREGEXP_BEG, "/") + end + end + + result :arg_state, :tDIVIDE, "/" + end + + def process_square_bracket text + self.paren_nest += 1 + + token = nil + + if is_after_operator? then + case + when scan(/\]\=/) then + self.paren_nest -= 1 # HACK? I dunno, or bug in MRI + return result EXPR_ARG, :tASET, "[]=" + when scan(/\]/) then + self.paren_nest -= 1 # HACK? I dunno, or bug in MRI + return result EXPR_ARG, :tAREF, "[]" + else + rb_compile_error "unexpected '['" + end + elsif is_beg? then + token = :tLBRACK + elsif is_arg? && (space_seen || lex_state =~ EXPR_LABELED) then + token = :tLBRACK + else + token = :tLBRACK2 + end + + cond.push false + cmdarg.push false + result EXPR_PAR, token, text + end + + def process_symbol text + symbol = possibly_escape_string text, /^:\"/ # stupid emacs + + result EXPR_LIT, :tSYMBOL, symbol + end + + def process_token text + # matching: parse_ident in compare/parse23.y:7989 + # FIX: remove: self.last_state = lex_state + + token = self.token = text + token << matched if scan(/[\!\?](?!=)/) + + tok_id = + case + when token =~ /[!?]$/ then + :tFID + when lex_state =~ EXPR_FNAME && scan(/=(?:(?![~>=])|(?==>))/) then + # ident=, not =~ => == or followed by => + # TODO test lexing of a=>b vs a==>b + token << matched + :tIDENTIFIER + when token =~ /^[A-Z]/ then + :tCONSTANT + else + :tIDENTIFIER + end + + if is_label_possible? and is_label_suffix? then + scan(/:/) + return result EXPR_LAB, :tLABEL, token + end + + # TODO: mb == ENC_CODERANGE_7BIT && lex_state !~ EXPR_DOT + if lex_state !~ EXPR_DOT then + # See if it is a reserved word. + keyword = RubyParserStuff::Keyword.keyword token + + return process_token_keyword keyword if keyword + end + + # matching: compare/parse32.y:9031 + state = if lex_state =~ EXPR_BEG_ANY|EXPR_ARG_ANY|EXPR_DOT then + cmd_state ? EXPR_CMDARG : EXPR_ARG + elsif lex_state =~ EXPR_FNAME then + EXPR_ENDFN + else + EXPR_END + end + self.lex_state = state + + tok_id = :tIDENTIFIER if tok_id == :tCONSTANT && is_local_id(token) + + if last_state !~ EXPR_DOT|EXPR_FNAME and + (tok_id == :tIDENTIFIER) and # not EXPR_FNAME, not attrasgn + lvar_defined?(token) then + state = EXPR_END|EXPR_LABEL + end + + result state, tok_id, token + end + + def process_token_keyword keyword + # matching MIDDLE of parse_ident in compare/parse32.y:9695 + state = lex_state + + return result(EXPR_ENDFN, keyword.id0, token) if lex_state =~ EXPR_FNAME + + self.lex_state = keyword.state + self.command_start = true if lex_state =~ EXPR_BEG + + case + when keyword.id0 == :kDO then # parse32.y line 9712 + case + when lambda_beginning? then + self.lpar_beg = nil # lambda_beginning? == FALSE in the body of "-> do ... end" + self.paren_nest -= 1 # TODO: question this? + result lex_state, :kDO_LAMBDA, token + when cond.is_in_state then + result lex_state, :kDO_COND, token + when cmdarg.is_in_state && state != EXPR_CMDARG then + result lex_state, :kDO_BLOCK, token + else + result lex_state, :kDO, token + end + when state =~ EXPR_PAD then + result lex_state, keyword.id0, token + when keyword.id0 != keyword.id1 then + result EXPR_PAR, keyword.id1, token + else + result lex_state, keyword.id1, token + end + end + + def process_underscore text + self.unscan # put back "_" + + if beginning_of_line? && scan(/\__END__(\r?\n|\Z)/) then + ss.terminate + [RubyLexer::EOF, RubyLexer::EOF] + elsif scan(/#{IDENT_CHAR}+/) then + process_token matched + end + end + + def rb_compile_error msg + msg += ". near line #{self.lineno}: #{self.rest[/^.*/].inspect}" + raise RubyParser::SyntaxError, msg + end + + def reset + self.lineno = 1 + self.brace_nest = 0 + self.command_start = true + self.comments = [] + self.lex_state = EXPR_NONE + self.lex_strterm = nil + self.lpar_beg = nil + self.paren_nest = 0 + self.space_seen = false + self.string_nest = 0 + self.token = nil + self.string_buffer = [] + self.old_ss = nil + self.old_lineno = nil + + self.cond.reset + self.cmdarg.reset + end + + def result new_state, token, text, line = self.lineno # :nodoc: + new_state = self.arg_state if new_state == :arg_state + self.lex_state = new_state if new_state + + [token, [text, line]] + end + + def ruby22_label? + ruby22plus? and is_label_possible? + end + + def ruby22plus? + parser.class.version >= 22 + end + + def ruby23plus? + parser.class.version >= 23 + end + + def ruby24minus? + parser.class.version <= 24 + end + + def ruby27plus? + parser.class.version >= 27 + end + + def space_vs_beginning space_type, beg_type, fallback + if is_space_arg? check(/./m) then + warning "`**' interpreted as argument prefix" + space_type + elsif is_beg? then + beg_type + else + # TODO: warn_balanced("**", "argument prefix"); + fallback + end + end + + def unescape_string str + str = str.gsub(ESC) { unescape($1).b.force_encoding Encoding::UTF_8 } + if str.valid_encoding? + str + else + str.b + end + end + + def unescape s + r = ESCAPES[s] + + return r if r + + x = case s + when /^[0-7]{1,3}/ then + ($&.to_i(8) & 0xFF).chr + when /^x([0-9a-fA-F]{1,2})/ then + $1.to_i(16).chr + when /^M-(.)/ then + ($1[0].ord | 0x80).chr + when /^(C-|c)(.)/ then + ($2[0].ord & 0x9f).chr + when /^[89a-f]/i then # bad octal or hex... ignore? that's what MRI does :( + s + when /^[McCx0-9]/ then + rb_compile_error("Invalid escape character syntax") + when /u(\h{4})/ then + [$1.delete("{}").to_i(16)].pack("U") + when /u(\h{1,3})/ then + rb_compile_error("Invalid escape character syntax") + when /u\{(\h+(?:\s+\h+)*)\}/ then + $1.split.map { |cp| cp.to_i(16) }.pack("U*") + else + s + end + x + end + + def warning s + # do nothing for now + end + + def was_label? + @was_label = ruby22_label? + true + end + + class State + attr_accessor :n + attr_accessor :names + + # TODO: take a shared hash of strings for inspect/to_s + def initialize o, names + raise ArgumentError, "bad state: %p" % [o] unless Integer === o # TODO: remove + + self.n = o + self.names = names + end + + def == o + self.equal?(o) || (o.class == self.class && o.n == self.n) + end + + def =~ v + (self.n & v.n) != 0 + end + + def | v + raise ArgumentError, "Incompatible State: %p vs %p" % [self, v] unless + self.names == v.names + self.class.new(self.n | v.n, self.names) + end + + def inspect + return "EXPR_NONE" if n.zero? # HACK? + + names.map { |v, k| k if self =~ v }. + compact. + join("|"). + gsub(/(?:EXPR_|STR_(?:FUNC_)?)/, "") + end + + alias to_s inspect + + module Values + expr_names = {} + + EXPR_NONE = State.new 0x0, expr_names + EXPR_BEG = State.new 0x1, expr_names + EXPR_END = State.new 0x2, expr_names + EXPR_ENDARG = State.new 0x4, expr_names + EXPR_ENDFN = State.new 0x8, expr_names + EXPR_ARG = State.new 0x10, expr_names + EXPR_CMDARG = State.new 0x20, expr_names + EXPR_MID = State.new 0x40, expr_names + EXPR_FNAME = State.new 0x80, expr_names + EXPR_DOT = State.new 0x100, expr_names + EXPR_CLASS = State.new 0x200, expr_names + EXPR_LABEL = State.new 0x400, expr_names + EXPR_LABELED = State.new 0x800, expr_names + EXPR_FITEM = State.new 0x1000, expr_names + + EXPR_BEG_ANY = EXPR_BEG | EXPR_MID | EXPR_CLASS + EXPR_ARG_ANY = EXPR_ARG | EXPR_CMDARG + EXPR_END_ANY = EXPR_END | EXPR_ENDARG | EXPR_ENDFN + + # extra fake lex_state names to make things a bit cleaner + + EXPR_LAB = EXPR_ARG|EXPR_LABELED + EXPR_LIT = EXPR_END|EXPR_ENDARG + EXPR_PAR = EXPR_BEG|EXPR_LABEL + EXPR_PAD = EXPR_BEG|EXPR_LABELED + + EXPR_NUM = EXPR_LIT + + expr_names.merge!(EXPR_NONE => "EXPR_NONE", + EXPR_BEG => "EXPR_BEG", + EXPR_END => "EXPR_END", + EXPR_ENDARG => "EXPR_ENDARG", + EXPR_ENDFN => "EXPR_ENDFN", + EXPR_ARG => "EXPR_ARG", + EXPR_CMDARG => "EXPR_CMDARG", + EXPR_MID => "EXPR_MID", + EXPR_FNAME => "EXPR_FNAME", + EXPR_DOT => "EXPR_DOT", + EXPR_CLASS => "EXPR_CLASS", + EXPR_LABEL => "EXPR_LABEL", + EXPR_LABELED => "EXPR_LABELED", + EXPR_FITEM => "EXPR_FITEM") + + # ruby constants for strings + + str_func_names = {} + + STR_FUNC_BORING = State.new 0x00, str_func_names + STR_FUNC_ESCAPE = State.new 0x01, str_func_names + STR_FUNC_EXPAND = State.new 0x02, str_func_names + STR_FUNC_REGEXP = State.new 0x04, str_func_names + STR_FUNC_QWORDS = State.new 0x08, str_func_names + STR_FUNC_SYMBOL = State.new 0x10, str_func_names + STR_FUNC_INDENT = State.new 0x20, str_func_names # <<-HEREDOC + STR_FUNC_LABEL = State.new 0x40, str_func_names + STR_FUNC_LIST = State.new 0x4000, str_func_names + STR_FUNC_TERM = State.new 0x8000, str_func_names + STR_FUNC_DEDENT = State.new 0x10000, str_func_names # <<~HEREDOC + + # TODO: check parser25.y on how they do STR_FUNC_INDENT + + STR_SQUOTE = STR_FUNC_BORING + STR_DQUOTE = STR_FUNC_EXPAND + STR_XQUOTE = STR_FUNC_EXPAND + STR_REGEXP = STR_FUNC_REGEXP | STR_FUNC_ESCAPE | STR_FUNC_EXPAND + STR_SWORD = STR_FUNC_QWORDS | STR_FUNC_LIST + STR_DWORD = STR_FUNC_QWORDS | STR_FUNC_EXPAND | STR_FUNC_LIST + STR_SSYM = STR_FUNC_SYMBOL + STR_DSYM = STR_FUNC_SYMBOL | STR_FUNC_EXPAND + STR_LABEL = STR_FUNC_LABEL + + str_func_names.merge!(STR_FUNC_ESCAPE => "STR_FUNC_ESCAPE", + STR_FUNC_EXPAND => "STR_FUNC_EXPAND", + STR_FUNC_REGEXP => "STR_FUNC_REGEXP", + STR_FUNC_QWORDS => "STR_FUNC_QWORDS", + STR_FUNC_SYMBOL => "STR_FUNC_SYMBOL", + STR_FUNC_INDENT => "STR_FUNC_INDENT", + STR_FUNC_LABEL => "STR_FUNC_LABEL", + STR_FUNC_LIST => "STR_FUNC_LIST", + STR_FUNC_TERM => "STR_FUNC_TERM", + STR_FUNC_DEDENT => "STR_FUNC_DEDENT", + STR_SQUOTE => "STR_SQUOTE") + end + + include Values + end + + include State::Values +end + +class RubyLexer + module SSWrapper + def string= s + ss.string= s + end + + def beginning_of_line? + ss.bol? + end + + alias bol? beginning_of_line? # to make .rex file more readable + + def check re + maybe_pop_stack + + ss.check re + end + + def end_of_stream? + ss.eos? + end + + alias eos? end_of_stream? + + def getch + c = ss.getch + c = ss.getch if c == "\r" && ss.peek(1) == "\n" + c + end + + def match + ss + end + + def matched + ss.matched + end + + def in_heredoc? + !!self.old_ss + end + + def maybe_pop_stack + if ss.eos? && in_heredoc? then + self.ss_pop + self.lineno_pop + end + end + + def pos + ss.pos + end + + def pos= n + ss.pos = n + end + + def rest + ss.rest + end + + def scan re + maybe_pop_stack + + ss.scan re + end + + def scanner_class # TODO: design this out of oedipus_lex. or something. + RPStringScanner + end + + def ss_string + ss.string + end + + def ss_string= s + raise "Probably not" + ss.string = s + end + + def unscan + ss.unscan + end + end + + include SSWrapper +end + +class RubyLexer + module SSStackish + def lineno_push new_lineno + self.old_lineno = self.lineno + self.lineno = new_lineno + end + + def lineno_pop + self.lineno = self.old_lineno + self.old_lineno = nil + end + + def ss= o + raise "Clearing ss while in heredoc!?!" if in_heredoc? + @old_ss = nil + super + end + + def ss_push new_ss + @old_ss = self.ss + @ss = new_ss + end + + def ss_pop + @ss = self.old_ss + @old_ss = nil + end + end + + prepend SSStackish +end + +if ENV["RP_STRTERM_DEBUG"] then + class RubyLexer + def d o + $stderr.puts o.inspect + end + + alias old_lex_strterm= lex_strterm= + + def lex_strterm= o + self.old_lex_strterm= o + where = caller.first.split(/:/).first(2).join(":") + $stderr.puts + d :lex_strterm => [o, where] + end + end +end + +require_relative "./ruby_lexer.rex.rb" +require_relative "./ruby_lexer_strings.rb" + +if ENV["RP_LINENO_DEBUG"] then + class RubyLexer + def d o + $stderr.puts o.inspect + end + + alias old_lineno= lineno= + + def lineno= n + self.old_lineno= n + where = caller.first.split(/:/).first(2).join(":") + $stderr.puts + d :lineno => [n, where] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rex b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rex new file mode 100644 index 000000000..8a894c306 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rex @@ -0,0 +1,185 @@ +# encoding: UTF-8 +# +# lexical scanner definition for ruby + +class RubyLexer + +option + + lineno + column + +macro + + IDENT_CHAR /[a-zA-Z0-9_[:^ascii:]]/ + + ESC /\\((?>[0-7]{1,3}|x\h{1,2}|M-[^\\]|(C-|c)[^\\]|u\h{1,4}|u\{\h+(?:\s+\h+)*\}|[^0-7xMCc]))/ + SIMPLE_STRING /((#{ESC}|\#(#{ESC}|[^\{\#\@\$\"\\])|[^\"\\\#])*)/o + SSTRING /((\\.|[^\'])*)/ + + INT_DEC /[+]?(?:(?:[1-9][\d_]*|0)(?!\.\d)(ri|r|i)?\b|0d[0-9_]+)(ri|r|i)?/i + INT_HEX /[+]?0x[a-f0-9_]+(ri|r|i)?/i + INT_BIN /[+]?0b[01_]+(ri|r|i)?/i + INT_OCT /[+]?0o?[0-7_]+(ri|r|i)?|0o(ri|r|i)?/i + FLOAT /[+]?\d[\d_]*\.[\d_]+(e[+-]?[\d_]+)?(?:(ri|r|i)\b)?|[+]?[\d_]+e[+-]?[\d_]+(?:(ri|r|i)\b)?/i + INT_DEC2 /[+]?\d[0-9_]*(?![e])((ri|r|i)\b)?/i + + NUM_BAD /[+]?0[xbd]\b/i + INT_OCT_BAD /[+]?0o?[0-7_]*[89]/i + FLOAT_BAD /[+]?\d[\d_]*_(e|\.)/i + +start + + maybe_pop_stack + return process_string_or_heredoc if lex_strterm + + self.cmd_state = self.command_start + self.command_start = false + self.space_seen = false # TODO: rename token_seen? + self.last_state = lex_state + +rule + +# [:state] pattern [actions] + + # \s - \n + \v + /[\ \t\r\f\v]+/ { self.space_seen = true; next } + + /\n|\#/ process_newline_or_comment + + /[\]\)\}]/ process_brace_close + +: /\!/ +| is_after_operator? /\!\@/ { result EXPR_ARG, TOKENS[text], text } +| /\![=~]?/ { result :arg_state, TOKENS[text], text } + +: /\./ +| /\.\.\.?/ process_dots +| /\.\d/ { rb_compile_error "no .<digit> floating literal anymore put 0 before dot" } +| /\./ { self.lex_state = EXPR_BEG; result EXPR_DOT, :tDOT, "." } + + /\(/ process_paren + + /\,/ { result EXPR_PAR, TOKENS[text], text } + +: /=/ +| /\=\=\=|\=\=|\=~|\=>|\=(?!begin\b)/ { result arg_state, TOKENS[text], text } +| bol? /\=begin(?=\s)/ process_begin +| /\=(?=begin\b)/ { result arg_state, TOKENS[text], text } + +ruby22_label? /\"#{SIMPLE_STRING}\":/o process_label + /\"(#{SIMPLE_STRING})\"/o process_simple_string + /\"/ { string STR_DQUOTE, '"'; result nil, :tSTRING_BEG, text } + + /\@\@?\d/ { rb_compile_error "`#{text}` is not allowed as a variable name" } + /\@\@?#{IDENT_CHAR}+/o process_ivar + +: /:/ +| not_end? /:([a-zA-Z_]#{IDENT_CHAR}*(?:[?]|[!](?!=)|=(?==>)|=(?![=>]))?)/o process_symbol +| not_end? /\:\"(#{SIMPLE_STRING})\"/o process_symbol +| not_end? /\:\'(#{SSTRING})\'/o process_symbol +| /\:\:/ process_colon2 +| /\:/ process_colon1 + + /->/ { result EXPR_ENDFN, :tLAMBDA, text } + + /[+-]/ process_plus_minus + +: /[+\d]/ +| /#{NUM_BAD}/o { rb_compile_error "Invalid numeric format" } +| /#{INT_DEC}/o { int_with_base 10 } +| /#{INT_HEX}/o { int_with_base 16 } +| /#{INT_BIN}/o { int_with_base 2 } +| /#{INT_OCT_BAD}/o { rb_compile_error "Illegal octal digit." } +| /#{INT_OCT}/o { int_with_base 8 } +| /#{FLOAT_BAD}/o { rb_compile_error "Trailing '_' in number." } +| /#{FLOAT}/o process_float +| /#{INT_DEC2}/o { int_with_base 10 } +| /[0-9]/ { rb_compile_error "Bad number format" } + + /\[/ process_square_bracket + +was_label? /\'#{SSTRING}\':?/o process_label_or_string + /\'/ { string STR_SQUOTE, "'"; result nil, :tSTRING_BEG, text } + +: /\|/ +| /\|\|\=/ { result EXPR_BEG, :tOP_ASGN, "||" } +| /\|\|/ { result EXPR_BEG, :tOROP, "||" } +| /\|\=/ { result EXPR_BEG, :tOP_ASGN, "|" } +| /\|/ { state = is_after_operator? ? EXPR_ARG : EXPR_PAR; result state, :tPIPE, "|" } + + /\{/ process_brace_open + +: /\*/ +| /\*\*=/ { result EXPR_BEG, :tOP_ASGN, "**" } +| /\*\*/ { result :arg_state, space_vs_beginning(:tDSTAR, :tDSTAR, :tPOW), "**" } +| /\*\=/ { result EXPR_BEG, :tOP_ASGN, "*" } +| /\*/ { result :arg_state, space_vs_beginning(:tSTAR, :tSTAR, :tSTAR2), "*" } + +# TODO: fix result+process_lchevron to set command_start = true +: /</ +| /\<\=\>/ { result :arg_state, :tCMP, "<=>" } +| /\<\=/ { result :arg_state, :tLEQ, "<=" } +| /\<\<\=/ { result EXPR_BEG, :tOP_ASGN, "<<" } +| /\<\</ process_lchevron +| /\</ { result :arg_state, :tLT, "<" } + +: />/ +| /\>\=/ { result :arg_state, :tGEQ, ">=" } +| /\>\>=/ { result EXPR_BEG, :tOP_ASGN, ">>" } +| /\>\>/ { result :arg_state, :tRSHFT, ">>" } +| /\>/ { result :arg_state, :tGT, ">" } + +: /\`/ +| expr_fname? /\`/ { result EXPR_END, :tBACK_REF2, "`" } +| expr_dot? /\`/ { result((cmd_state ? EXPR_CMDARG : EXPR_ARG), :tBACK_REF2, "`") } +| /\`/ { string STR_XQUOTE, '`'; result nil, :tXSTRING_BEG, "`" } + + /\?/ process_questionmark + +: /&/ +| /\&\&\=/ { result EXPR_BEG, :tOP_ASGN, "&&" } +| /\&\&/ { result EXPR_BEG, :tANDOP, "&&" } +| /\&\=/ { result EXPR_BEG, :tOP_ASGN, "&" } +| /\&\./ { result EXPR_DOT, :tLONELY, "&." } +| /\&/ process_amper + + /\// process_slash + +: /\^/ +| /\^=/ { result EXPR_BEG, :tOP_ASGN, "^" } +| /\^/ { result :arg_state, :tCARET, "^" } + + /\;/ { self.command_start = true; result EXPR_BEG, :tSEMI, ";" } + +: /~/ +| is_after_operator? /\~@/ { result :arg_state, :tTILDE, "~" } +| /\~/ { result :arg_state, :tTILDE, "~" } + +: /\\/ +| /\\\r?\n/ { self.lineno += 1; self.space_seen = true; next } +| /\\/ { rb_compile_error "bare backslash only allowed before newline" } + + /\%/ process_percent + +: /\$/ +| /\$_\w+/ process_gvar +| /\$_/ process_gvar +| /\$[~*$?!@\/\\;,.=:<>\"]|\$-\w?/ process_gvar +| in_fname? /\$([\&\`\'\+])/ process_gvar +| /\$([\&\`\'\+])/ process_backref +| in_fname? /\$([1-9]\d*)/ process_gvar +| /\$([1-9]\d*)/ process_nthref +| /\$0/ process_gvar +| /\$#{IDENT_CHAR}+/ process_gvar +| /\$\W/ process_gvar_oddity + + /\_/ process_underscore + + /#{IDENT_CHAR}+/o process_token + + /\004|\032|\000|\Z/ { [RubyLexer::EOF, RubyLexer::EOF] } + + /./ { rb_compile_error "Invalid char #{text.inspect} in expression" } + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rex.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rex.rb new file mode 100644 index 000000000..bd916f663 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer.rex.rb @@ -0,0 +1,399 @@ +# frozen_string_literal: true +# encoding: UTF-8 +#-- +# This file is automatically generated. Do not modify it. +# Generated by: oedipus_lex version 2.6.1. +# Source: lib/ruby_lexer.rex +#++ + +# +# lexical scanner definition for ruby + + +## +# The generated lexer RubyLexer + +class RubyLexer + require 'strscan' + + # :stopdoc: + IDENT_CHAR = /[a-zA-Z0-9_[:^ascii:]]/ + ESC = /\\((?>[0-7]{1,3}|x\h{1,2}|M-[^\\]|(C-|c)[^\\]|u\h{1,4}|u\{\h+(?:\s+\h+)*\}|[^0-7xMCc]))/ + SIMPLE_STRING = /((#{ESC}|\#(#{ESC}|[^\{\#\@\$\"\\])|[^\"\\\#])*)/o + SSTRING = /((\\.|[^\'])*)/ + INT_DEC = /[+]?(?:(?:[1-9][\d_]*|0)(?!\.\d)(ri|r|i)?\b|0d[0-9_]+)(ri|r|i)?/i + INT_HEX = /[+]?0x[a-f0-9_]+(ri|r|i)?/i + INT_BIN = /[+]?0b[01_]+(ri|r|i)?/i + INT_OCT = /[+]?0o?[0-7_]+(ri|r|i)?|0o(ri|r|i)?/i + FLOAT = /[+]?\d[\d_]*\.[\d_]+(e[+-]?[\d_]+)?(?:(ri|r|i)\b)?|[+]?[\d_]+e[+-]?[\d_]+(?:(ri|r|i)\b)?/i + INT_DEC2 = /[+]?\d[0-9_]*(?![e])((ri|r|i)\b)?/i + NUM_BAD = /[+]?0[xbd]\b/i + INT_OCT_BAD = /[+]?0o?[0-7_]*[89]/i + FLOAT_BAD = /[+]?\d[\d_]*_(e|\.)/i + # :startdoc: + # :stopdoc: + class LexerError < StandardError ; end + class ScanError < LexerError ; end + # :startdoc: + + ## + # The current line number. + + attr_accessor :lineno + ## + # The file name / path + + attr_accessor :filename + + ## + # The StringScanner for this lexer. + + attr_accessor :ss + + ## + # The current lexical state. + + attr_accessor :state + + alias :match :ss + + ## + # The match groups for the current scan. + + def matches + m = (1..9).map { |i| ss[i] } + m.pop until m[-1] or m.empty? + m + end + + ## + # Yields on the current action. + + def action + yield + end + + ## + # The previous position. Only available if the :column option is on. + + attr_accessor :old_pos + + ## + # The position of the start of the current line. Only available if the + # :column option is on. + + attr_accessor :start_of_current_line_pos + + ## + # The current column, starting at 0. Only available if the + # :column option is on. + def column + old_pos - start_of_current_line_pos + end + + + ## + # The current scanner class. Must be overridden in subclasses. + + def scanner_class + StringScanner + end unless instance_methods(false).map(&:to_s).include?("scanner_class") + + ## + # Parse the given string. + + def parse str + self.ss = scanner_class.new str + self.lineno = 1 + self.start_of_current_line_pos = 0 + self.state ||= nil + + do_parse + end + + ## + # Read in and parse the file at +path+. + + def parse_file path + self.filename = path + open path do |f| + parse f.read + end + end + + ## + # The current location in the parse. + + def location + [ + (filename || "<input>"), + lineno, + column, + ].compact.join(":") + end + + ## + # Lex the next token. + + def next_token + maybe_pop_stack + return process_string_or_heredoc if lex_strterm + self.cmd_state = self.command_start + self.command_start = false + self.space_seen = false # TODO: rename token_seen? + self.last_state = lex_state + + token = nil + + until ss.eos? or token do + if ss.check(/\n/) then + self.lineno += 1 + # line starts 1 position after the newline + self.start_of_current_line_pos = ss.pos + 1 + end + self.old_pos = ss.pos + token = + case state + when nil then + case + when ss.skip(/[\ \t\r\f\v]+/) then + action { self.space_seen = true; next } + when text = ss.scan(/\n|\#/) then + process_newline_or_comment text + when text = ss.scan(/[\]\)\}]/) then + process_brace_close text + when ss.match?(/\!/) then + case + when is_after_operator? && (text = ss.scan(/\!\@/)) then + action { result EXPR_ARG, TOKENS[text], text } + when text = ss.scan(/\![=~]?/) then + action { result :arg_state, TOKENS[text], text } + end # group /\!/ + when ss.match?(/\./) then + case + when text = ss.scan(/\.\.\.?/) then + process_dots text + when ss.skip(/\.\d/) then + action { rb_compile_error "no .<digit> floating literal anymore put 0 before dot" } + when ss.skip(/\./) then + action { self.lex_state = EXPR_BEG; result EXPR_DOT, :tDOT, "." } + end # group /\./ + when text = ss.scan(/\(/) then + process_paren text + when text = ss.scan(/\,/) then + action { result EXPR_PAR, TOKENS[text], text } + when ss.match?(/=/) then + case + when text = ss.scan(/\=\=\=|\=\=|\=~|\=>|\=(?!begin\b)/) then + action { result arg_state, TOKENS[text], text } + when bol? && (text = ss.scan(/\=begin(?=\s)/)) then + process_begin text + when text = ss.scan(/\=(?=begin\b)/) then + action { result arg_state, TOKENS[text], text } + end # group /=/ + when ruby22_label? && (text = ss.scan(/\"#{SIMPLE_STRING}\":/o)) then + process_label text + when text = ss.scan(/\"(#{SIMPLE_STRING})\"/o) then + process_simple_string text + when text = ss.scan(/\"/) then + action { string STR_DQUOTE, '"'; result nil, :tSTRING_BEG, text } + when text = ss.scan(/\@\@?\d/) then + action { rb_compile_error "`#{text}` is not allowed as a variable name" } + when text = ss.scan(/\@\@?#{IDENT_CHAR}+/o) then + process_ivar text + when ss.match?(/:/) then + case + when not_end? && (text = ss.scan(/:([a-zA-Z_]#{IDENT_CHAR}*(?:[?]|[!](?!=)|=(?==>)|=(?![=>]))?)/o)) then + process_symbol text + when not_end? && (text = ss.scan(/\:\"(#{SIMPLE_STRING})\"/o)) then + process_symbol text + when not_end? && (text = ss.scan(/\:\'(#{SSTRING})\'/o)) then + process_symbol text + when text = ss.scan(/\:\:/) then + process_colon2 text + when text = ss.scan(/\:/) then + process_colon1 text + end # group /:/ + when text = ss.scan(/->/) then + action { result EXPR_ENDFN, :tLAMBDA, text } + when text = ss.scan(/[+-]/) then + process_plus_minus text + when ss.match?(/[+\d]/) then + case + when ss.skip(/#{NUM_BAD}/o) then + action { rb_compile_error "Invalid numeric format" } + when ss.skip(/#{INT_DEC}/o) then + action { int_with_base 10 } + when ss.skip(/#{INT_HEX}/o) then + action { int_with_base 16 } + when ss.skip(/#{INT_BIN}/o) then + action { int_with_base 2 } + when ss.skip(/#{INT_OCT_BAD}/o) then + action { rb_compile_error "Illegal octal digit." } + when ss.skip(/#{INT_OCT}/o) then + action { int_with_base 8 } + when ss.skip(/#{FLOAT_BAD}/o) then + action { rb_compile_error "Trailing '_' in number." } + when text = ss.scan(/#{FLOAT}/o) then + process_float text + when ss.skip(/#{INT_DEC2}/o) then + action { int_with_base 10 } + when ss.skip(/[0-9]/) then + action { rb_compile_error "Bad number format" } + end # group /[+\d]/ + when text = ss.scan(/\[/) then + process_square_bracket text + when was_label? && (text = ss.scan(/\'#{SSTRING}\':?/o)) then + process_label_or_string text + when text = ss.scan(/\'/) then + action { string STR_SQUOTE, "'"; result nil, :tSTRING_BEG, text } + when ss.match?(/\|/) then + case + when ss.skip(/\|\|\=/) then + action { result EXPR_BEG, :tOP_ASGN, "||" } + when ss.skip(/\|\|/) then + action { result EXPR_BEG, :tOROP, "||" } + when ss.skip(/\|\=/) then + action { result EXPR_BEG, :tOP_ASGN, "|" } + when ss.skip(/\|/) then + action { state = is_after_operator? ? EXPR_ARG : EXPR_PAR; result state, :tPIPE, "|" } + end # group /\|/ + when text = ss.scan(/\{/) then + process_brace_open text + when ss.match?(/\*/) then + case + when ss.skip(/\*\*=/) then + action { result EXPR_BEG, :tOP_ASGN, "**" } + when ss.skip(/\*\*/) then + action { result :arg_state, space_vs_beginning(:tDSTAR, :tDSTAR, :tPOW), "**" } + when ss.skip(/\*\=/) then + action { result EXPR_BEG, :tOP_ASGN, "*" } + when ss.skip(/\*/) then + action { result :arg_state, space_vs_beginning(:tSTAR, :tSTAR, :tSTAR2), "*" } + end # group /\*/ + when ss.match?(/</) then + case + when ss.skip(/\<\=\>/) then + action { result :arg_state, :tCMP, "<=>" } + when ss.skip(/\<\=/) then + action { result :arg_state, :tLEQ, "<=" } + when ss.skip(/\<\<\=/) then + action { result EXPR_BEG, :tOP_ASGN, "<<" } + when text = ss.scan(/\<\</) then + process_lchevron text + when ss.skip(/\</) then + action { result :arg_state, :tLT, "<" } + end # group /</ + when ss.match?(/>/) then + case + when ss.skip(/\>\=/) then + action { result :arg_state, :tGEQ, ">=" } + when ss.skip(/\>\>=/) then + action { result EXPR_BEG, :tOP_ASGN, ">>" } + when ss.skip(/\>\>/) then + action { result :arg_state, :tRSHFT, ">>" } + when ss.skip(/\>/) then + action { result :arg_state, :tGT, ">" } + end # group />/ + when ss.match?(/\`/) then + case + when expr_fname? && (ss.skip(/\`/)) then + action { result EXPR_END, :tBACK_REF2, "`" } + when expr_dot? && (ss.skip(/\`/)) then + action { result((cmd_state ? EXPR_CMDARG : EXPR_ARG), :tBACK_REF2, "`") } + when ss.skip(/\`/) then + action { string STR_XQUOTE, '`'; result nil, :tXSTRING_BEG, "`" } + end # group /\`/ + when text = ss.scan(/\?/) then + process_questionmark text + when ss.match?(/&/) then + case + when ss.skip(/\&\&\=/) then + action { result EXPR_BEG, :tOP_ASGN, "&&" } + when ss.skip(/\&\&/) then + action { result EXPR_BEG, :tANDOP, "&&" } + when ss.skip(/\&\=/) then + action { result EXPR_BEG, :tOP_ASGN, "&" } + when ss.skip(/\&\./) then + action { result EXPR_DOT, :tLONELY, "&." } + when text = ss.scan(/\&/) then + process_amper text + end # group /&/ + when text = ss.scan(/\//) then + process_slash text + when ss.match?(/\^/) then + case + when ss.skip(/\^=/) then + action { result EXPR_BEG, :tOP_ASGN, "^" } + when ss.skip(/\^/) then + action { result :arg_state, :tCARET, "^" } + end # group /\^/ + when ss.skip(/\;/) then + action { self.command_start = true; result EXPR_BEG, :tSEMI, ";" } + when ss.match?(/~/) then + case + when is_after_operator? && (ss.skip(/\~@/)) then + action { result :arg_state, :tTILDE, "~" } + when ss.skip(/\~/) then + action { result :arg_state, :tTILDE, "~" } + end # group /~/ + when ss.match?(/\\/) then + case + when ss.skip(/\\\r?\n/) then + action { self.lineno += 1; self.space_seen = true; next } + when ss.skip(/\\/) then + action { rb_compile_error "bare backslash only allowed before newline" } + end # group /\\/ + when text = ss.scan(/\%/) then + process_percent text + when ss.match?(/\$/) then + case + when text = ss.scan(/\$_\w+/) then + process_gvar text + when text = ss.scan(/\$_/) then + process_gvar text + when text = ss.scan(/\$[~*$?!@\/\\;,.=:<>\"]|\$-\w?/) then + process_gvar text + when in_fname? && (text = ss.scan(/\$([\&\`\'\+])/)) then + process_gvar text + when text = ss.scan(/\$([\&\`\'\+])/) then + process_backref text + when in_fname? && (text = ss.scan(/\$([1-9]\d*)/)) then + process_gvar text + when text = ss.scan(/\$([1-9]\d*)/) then + process_nthref text + when text = ss.scan(/\$0/) then + process_gvar text + when text = ss.scan(/\$#{IDENT_CHAR}+/) then + process_gvar text + when text = ss.scan(/\$\W/) then + process_gvar_oddity text + end # group /\$/ + when text = ss.scan(/\_/) then + process_underscore text + when text = ss.scan(/#{IDENT_CHAR}+/o) then + process_token text + when ss.skip(/\004|\032|\000|\Z/) then + action { [RubyLexer::EOF, RubyLexer::EOF] } + when text = ss.scan(/./) then + action { rb_compile_error "Invalid char #{text.inspect} in expression" } + else + text = ss.string[ss.pos .. -1] + raise ScanError, "can not match (#{state.inspect}) at #{location}: '#{text}'" + end + else + raise ScanError, "undefined state at #{location}: '#{state}'" + end # token = case state + + next unless token # allow functions to trigger redo w/ nil + end # while + + raise LexerError, "bad lexical result at #{location}: #{token.inspect}" unless + token.nil? || (Array === token && token.size >= 2) + + # auto-switch state + self.state = token.last if token && token.first == :state + + token + end # def next_token +end # class diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer_strings.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer_strings.rb new file mode 100644 index 000000000..e74a51f35 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_lexer_strings.rb @@ -0,0 +1,638 @@ +# frozen_string_literal: true + +class RubyLexer + def eat_whitespace + r = scan(/\s+/) + self.lineno += r.count("\n") if r + + r += eat_whitespace if eos? && in_heredoc? # forces heredoc pop + + r + end + + def heredoc here # ../compare/parse30.y:7678 + _, term, func, _indent_max, _lineno, range = here + + start_line = lineno + eos = term # HACK + indent = func =~ STR_FUNC_INDENT + + self.string_buffer = [] + + last_line = self.ss_string[range] if range + eol = last_line && last_line.end_with?("\r\n") ? "\r\n" : "\n" # HACK + + expand = func =~ STR_FUNC_EXPAND + + # TODO? p->heredoc_line_indent == -1 + + indent_re = indent ? "[ \t]*" : nil + eos_re = /#{indent_re}#{Regexp.escape eos}(?=\r?\n|\z)/ + err_msg = "can't match #{eos_re.inspect} anywhere in " + + maybe_pop_stack + rb_compile_error err_msg if end_of_stream? + + if beginning_of_line? && scan(eos_re) then + scan(/\r?\n|\z/) + self.lineno += 1 if matched =~ /\n/ + + heredoc_restore + + self.lex_strterm = nil + self.lex_state = EXPR_END + + return :tSTRING_END, [term, func, range] + end + + if expand then + case + when scan(/#(?=\$(-.|[a-zA-Z_0-9~\*\$\?!@\/\\;,\.=:<>\"\&\`\'+]))/) then + # TODO: !ISASCII + # ?! see parser_peek_variable_name + return :tSTRING_DVAR, matched + when scan(/#(?=\@\@?[a-zA-Z_])/) then + # TODO: !ISASCII + return :tSTRING_DVAR, matched + when scan(/#[{]/) then + self.command_start = true + return :tSTRING_DBEG, [matched, lineno] + when scan(/#/) then + string_buffer << "#" + end + + begin + # NOTE: this visibly diverges from the C code but uses tokadd_string + # to stay clean. + + str = tokadd_string func, eol, nil + rb_compile_error err_msg if str == RubyLexer::EOF + + if str != eol then + str = string_buffer.join + string_buffer.clear + return result nil, :tSTRING_CONTENT, str, start_line + else + string_buffer << scan(/\r?\n/) + self.lineno += 1 # TODO: try to remove most scan(/\n/) and friends + end + end until check eos_re + else + until check(eos_re) do + string_buffer << scan(/.*(\r?\n|\z)/) + self.lineno += 1 + rb_compile_error err_msg if end_of_stream? + end + end + + string_content = begin + s = string_buffer.join + s.b.force_encoding Encoding::UTF_8 + s + end + string_buffer.clear + + result nil, :tSTRING_CONTENT, string_content, start_line + end + + def heredoc_identifier # ../compare/parse30.y:7354 + token = :tSTRING_BEG + func = STR_FUNC_BORING + term = nil + indent = nil + quote = nil + char_pos = nil + byte_pos = nil + + heredoc_indent_mods = "-" + heredoc_indent_mods += '\~' if ruby23plus? + + case + when scan(/([#{heredoc_indent_mods}]?)([\'\"\`])(.*?)\2/) then + mods, quote, term = match[1], match[2], match[3] + char_pos = ss.charpos + byte_pos = ss.pos + + func |= STR_FUNC_INDENT unless mods.empty? + func |= STR_FUNC_DEDENT if mods == "~" + func |= case quote + when "\'" then + STR_SQUOTE + when '"' then + STR_DQUOTE + when "`" then + token = :tXSTRING_BEG + STR_XQUOTE + else + debug 1 + end + when scan(/[#{heredoc_indent_mods}]?([\'\"\`])(?!\1*\Z)/) then + rb_compile_error "unterminated here document identifier" + when scan(/([#{heredoc_indent_mods}]?)(#{IDENT_CHAR}+)/) then + mods, term = match[1], match[2] + quote = '"' + char_pos = ss.charpos + byte_pos = ss.pos + + func |= STR_FUNC_INDENT unless mods.empty? + func |= STR_FUNC_DEDENT if mods == "~" + func |= STR_DQUOTE + else + return + end + + old_lineno = self.lineno + rest_of_line = scan(/.*(?:\r?\n|\z)/) + self.lineno += rest_of_line.count "\n" + + char_pos_end = ss.charpos - 1 + + range = nil + range = char_pos..char_pos_end unless rest_of_line.empty? + + self.lex_strterm = [:heredoc, term, func, indent, old_lineno, range, byte_pos] + + result nil, token, quote, old_lineno + end + + def heredoc_restore # ../compare/parse30.y:7438 + _, _term, _func, _indent, lineno, range, bytepos = lex_strterm + + new_ss = ss.class.new self.ss_string[0..range.max] + new_ss.pos = bytepos + + lineno_push lineno + ss_push new_ss + + nil + end + + def newtok + string_buffer.clear + end + + def nextc + # TODO: + # if (UNLIKELY((p->lex.pcur == p->lex.pend) || p->eofp || RTEST(p->lex.nextline))) { + # if (nextline(p)) return -1; + # } + + maybe_pop_stack + + c = ss.getch + + if c == "\n" then + ss.unscan + c = nil + end + + c + end + + def parse_string quote # ../compare/parse30.y:7273 + _, func, term, paren = quote + + qwords = func =~ STR_FUNC_QWORDS + regexp = func =~ STR_FUNC_REGEXP + expand = func =~ STR_FUNC_EXPAND + list = func =~ STR_FUNC_LIST + termx = func =~ STR_FUNC_TERM # TODO: document wtf this means + + space = false + term_re = regexp_cache[term] + + if termx then + # self.nextc if qwords # delayed term + + self.lex_strterm = nil + + return result EXPR_END, regexp ? :tREGEXP_END : :tSTRING_END, term + end + + space = true if qwords and eat_whitespace + + if list then + debug 4 + # quote[1] -= STR_FUNC_LIST + # space = true + end + + # TODO: move to quote.nest! + if string_nest == 0 && scan(term_re) then + if qwords then + quote[1] |= STR_FUNC_TERM + + return :tSPACE, matched + end + + return string_term func + end + + return result nil, :tSPACE, " " if space + + newtok + + if expand && check(/#/) then + t = self.scan_variable_name + return t if t + + tokadd "#" + end + + # TODO: add string_nest, enc, base_enc ? + lineno = self.lineno + if tokadd_string(func, term, paren) == RubyLexer::EOF then + if qwords then + rb_compile_error "unterminated list meets end of file" + end + + if regexp then + rb_compile_error "unterminated regexp meets end of file" + else + rb_compile_error "unterminated string meets end of file" + end + end + + result nil, :tSTRING_CONTENT, string_buffer.join, lineno + end + + # called from process_percent + def process_percent_quote # ../compare/parse30.y:8645 + c = getch # type %<type><term>...<term> + + long_hand = !!(c =~ /[QqWwIixrs]/) + + if end_of_stream? || c !~ /\p{Alnum}/ then + term = c # TODO? PERCENT_END[c] || c + + debug 2 if c && c !~ /\p{ASCII}/ + c = "Q" + else + term = getch + + debug 3 if term =~ /\p{Alnum}|\P{ASCII}/ + end + + if end_of_stream? or c == RubyLexer::EOF or term == RubyLexer::EOF then + rb_compile_error "unterminated quoted string meets end of file" + end + + # "\0" is special to indicate beg=nnd and that no nesting? + paren = term + term = PERCENT_END[term] + term, paren = paren, "\0" if term.nil? # TODO: "\0" -> nil + + text = long_hand ? "%#{c}#{paren}" : "%#{term}" + + current_line = self.lineno + + token_type, string_type = + case c + when "Q" then + [:tSTRING_BEG, STR_DQUOTE] + when "q" then + [:tSTRING_BEG, STR_SQUOTE] + when "W" then + eat_whitespace + [:tWORDS_BEG, STR_DQUOTE | STR_FUNC_QWORDS] + when "w" then + eat_whitespace + [:tQWORDS_BEG, STR_SQUOTE | STR_FUNC_QWORDS] + when "I" then + eat_whitespace + [:tSYMBOLS_BEG, STR_DQUOTE | STR_FUNC_QWORDS] + when "i" then + eat_whitespace + [:tQSYMBOLS_BEG, STR_SQUOTE | STR_FUNC_QWORDS] + when "x" then + [:tXSTRING_BEG, STR_XQUOTE] + when "r" then + [:tREGEXP_BEG, STR_REGEXP] + when "s" then + self.lex_state = EXPR_FNAME + [:tSYMBEG, STR_SSYM] + else + rb_compile_error "unknown type of %string. Expected [QqWwIixrs], found '#{c}'." + end + + string string_type, term, paren + + result nil, token_type, text, current_line + end + + def process_string_or_heredoc # ../compare/parse30.y:9075 + if lex_strterm[0] == :heredoc then + self.heredoc lex_strterm + else + self.parse_string lex_strterm + end + end + + def read_escape flags = nil # ../compare/parse30.y:6712 + case + when scan(/\\/) then # Backslash + '\\' + when scan(/n/) then # newline + "\n" + when scan(/t/) then # horizontal tab + "\t" + when scan(/r/) then # carriage-return + "\r" + when scan(/f/) then # form-feed + "\f" + when scan(/v/) then # vertical tab + "\13" + when scan(/a/) then # alarm(bell) + "\007" + when scan(/e/) then # escape + "\033" + when scan(/[0-7]{1,3}/) then # octal constant + (matched.to_i(8) & 0xFF).chr.force_encoding Encoding::UTF_8 + when scan(/x([0-9a-fA-F]{1,2})/) then # hex constant + # TODO: force encode everything to UTF-8? + match[1].to_i(16).chr.force_encoding Encoding::UTF_8 + when scan(/b/) then # backspace + "\010" + when scan(/s/) then # space + " " + when check(/M-\\u/) then + debug 5 + when scan(/M-\\(?=.)/) then + c = read_escape + c[0] = (c[0].ord | 0x80).chr + c + when scan(/M-(\p{ASCII})/) then + # TODO: ISCNTRL(c) -> goto eof + c = match[1] + c[0] = (c[0].ord | 0x80).chr + c + when check(/(C-|c)\\u/) then + debug 6 + when scan(/(C-|c)\\?\?/) then + 127.chr + when scan(/(C-|c)\\/) then + c = read_escape + c[0] = (c[0].ord & 0x9f).chr + c + when scan(/(?:C-|c)(.)/) then + c = match[1] + c[0] = (c[0].ord & 0x9f).chr + c + when scan(/^[89]/i) then # bad octal or hex... MRI ignores them :( + matched + when scan(/u(\h{4})/) then + [match[1].to_i(16)].pack("U") + when scan(/u(\h{1,3})/) then + debug 7 + rb_compile_error "Invalid escape character syntax" + when scan(/u\{(\h+(?: +\h+)*)\}/) then + match[1].split.map { |s| s.to_i(16) }.pack("U*") + when scan(/[McCx0-9]/) || end_of_stream? then + rb_compile_error("Invalid escape character syntax") + else + getch + end.dup + end + + def regx_options # ../compare/parse30.y:6914 + newtok + + options = scan(/\p{Alpha}+/) || "" + + rb_compile_error("unknown regexp options: %s" % [options]) if + options =~ /[^ixmonesu]/ + + options + end + + def scan_variable_name # ../compare/parse30.y:7208 + case + when scan(/#(?=\$(-.|[a-zA-Z_0-9~\*\$\?!@\/\\;,\.=:<>\"\&\`\'+]))/) then + # TODO: !ISASCII + return :tSTRING_DVAR, matched + when scan(/#(?=\@\@?[a-zA-Z_])/) then + # TODO: !ISASCII + return :tSTRING_DVAR, matched + when scan(/#[{]/) then + self.command_start = true + return :tSTRING_DBEG, [matched, lineno] + when scan(/#/) then + # do nothing but swallow + end + + # if scan(/\P{ASCII}|_|\p{Alpha}/) then # TODO: fold into above DVAR cases + # # if (!ISASCII(c) || c == '_' || ISALPHA(c)) + # # return tSTRING_DVAR; + # end + + nil + end + + def string type, beg, nnd = nil + # label = (IS_LABEL_POSSIBLE() ? str_label : 0); + # p->lex.strterm = NEW_STRTERM(str_dquote | label, '"', 0); + # p->lex.ptok = p->lex.pcur-1; + + type |= STR_FUNC_LABEL if is_label_possible? + self.lex_strterm = [:strterm, type, beg, nnd || "\0"] + end + + def string_term func # ../compare/parse30.y:7254 + self.lex_strterm = nil + + return result EXPR_END, :tREGEXP_END, self.regx_options if + func =~ STR_FUNC_REGEXP + + if func =~ STR_FUNC_LABEL && is_label_suffix? then + self.getch + self.lex_state = EXPR_BEG|EXPR_LABEL + + return :tLABEL_END, string_buffer.join + end + + self.lex_state = EXPR_END + + return :tSTRING_END, [self.matched, func] + end + + def tokadd c # ../compare/parse30.y:6548 + string_buffer << c + end + + def tokadd_escape # ../compare/parse30.y:6840 + case + when scan(/\\\n/) then + # just ignore + when scan(/\\([0-7]{1,3}|x[0-9a-fA-F]{1,2})/) then + tokadd matched + when scan(/\\([MC]-|c)(?=\\)/) then + tokadd matched + self.tokadd_escape + when scan(/\\([MC]-|c)(.)/) then + tokadd matched + + self.tokadd_escape if check(/\\/) # recurse if continued! + when scan(/\\[McCx]/) then # all unprocessed branches from above have failed + rb_compile_error "Invalid escape character syntax" + when scan(/\\(.)/m) then + chr, = match[1] + + tokadd "\\" + tokadd chr + else + rb_compile_error "Invalid escape character syntax: %p" % [self.rest.lines.first] + end + end + + def tokadd_string func, term, paren # ../compare/parse30.y:7020 + qwords = func =~ STR_FUNC_QWORDS + escape = func =~ STR_FUNC_ESCAPE + expand = func =~ STR_FUNC_EXPAND + regexp = func =~ STR_FUNC_REGEXP + + paren_re = regexp_cache[paren] if paren != "\0" + term_re = if term == "\n" + /\r?\n/ + else + regexp_cache[term] + end + + until end_of_stream? do + case + when paren_re && scan(paren_re) then + self.string_nest += 1 + when scan(term_re) then + if self.string_nest == 0 then + self.pos -= 1 # TODO: ss.unscan 665 errors #$ HACK: why do we depend on this so hard? + break # leave eos loop, go parse term in caller (heredoc or parse_string) + else + self.lineno += matched.count("\n") + self.string_nest -= 1 + end + + when expand && check(/#[\$\@\{]/) then + # do nothing since we used `check` + break # leave eos loop + when check(/\\/) then + case + when scan(/\\\n/) then + self.lineno += 1 + case + when qwords then + tokadd "\n" + next + when expand then + next if func !~ STR_FUNC_INDENT + + if term == "\n" then + unscan # rollback + scan(/\\/) # and split + scan(/\n/) # this is `matched` + break + end + + tokadd "\\" + debug 9 + else + unscan # rollback + scan(/\\/) # this is `matched` + end + when check(/\\\\/) then + tokadd '\\' if escape + nextc # ignore 1st \\ + nextc # for tokadd ss.matched, below + when scan(/\\u/) then + unless expand then + tokadd "\\" + next + end + + tokadd_utf8 term, func, regexp + + next + else + scan(/\\/) # eat it, we know it's there + + return RubyLexer::EOF if end_of_stream? + + if scan(/\P{ASCII}/) then + tokadd "\\" unless expand + tokadd self.matched + next + end + + case + when regexp then + if term !~ SIMPLE_RE_META && scan(term_re) then + tokadd matched + next + end + + self.pos -= 1 # TODO: ss.unscan 15 errors + # HACK? decide whether to eat the \\ above + if _esc = tokadd_escape && end_of_stream? then + debug 10 + end + + next # C's continue = Ruby's next + when expand then + tokadd "\\" if escape + tokadd read_escape + next + when qwords && scan(/\s/) then + # ignore backslashed spaces in %w + when !check(term_re) && !(paren_re && check(paren_re)) then + tokadd "\\" + next + else + getch # slurp it too for matched below + end + end # inner case for /\\/ + + when scan(/\P{ASCII}/) then + # not currently checking encoding stuff -- drops to tokadd below + when qwords && check(/\s/) then + break # leave eos loop + else + t = Regexp.escape term == "\n" ? "\r\n" : term + x = Regexp.escape paren if paren && paren != "\000" + q = "\\s" if qwords + re = /[^#{t}#{x}\#\\#{q}]+/ + + scan re or getch + self.lineno += matched.count "\n" if matched + end # big case + + tokadd self.matched + end # until end_of_stream? + + if self.matched then + self.matched + elsif end_of_stream? then + RubyLexer::EOF + end + end # tokadd_string + + def tokadd_utf8 term, func, regexp_literal # ../compare/parse30.y:6646 + tokadd "\\u" if regexp_literal + + case + when scan(/\h{4}/) then + codepoint = [matched.to_i(16)].pack("U") + + tokadd regexp_literal ? matched : codepoint + when scan(/\{\s*(\h{1,6}(?:\s+\h{1,6})*)\s*\}/) then + codepoints = match[1].split.map { |s| s.to_i 16 }.pack("U") + + if regexp_literal then + tokadd "{" + tokadd match[1].split.join(" ") + tokadd "}" + else + tokadd codepoints + end + else + rb_compile_error "unterminated Unicode escape" + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser.rb new file mode 100644 index 000000000..994fccee7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser.rb @@ -0,0 +1,100 @@ +require "ruby_parser_extras" +require "racc/parser" + +## +# RubyParser is a compound parser that uses all known versions to +# attempt to parse. + +class RubyParser + + VERSIONS = [] + + attr_accessor :current + + def self.for_current_ruby + name = "V#{RUBY_VERSION[/^\d+\.\d+/].delete "."}" + klass = if const_defined? name then + const_get name + else + latest = VERSIONS.first + warn "NOTE: RubyParser::#{name} undefined, using #{latest}." + latest + end + + klass.new + end + + def self.latest + VERSIONS.first.new + end + + def process s, f = "(string)", t = 10 + e = nil + VERSIONS.each do |klass| + self.current = parser = klass.new + begin + return parser.process s, f, t + rescue Racc::ParseError, RubyParser::SyntaxError => exc + e ||= exc + end + end + raise e + end + + alias :parse :process + + def reset + # do nothing + end + + class Parser < Racc::Parser + include RubyParserStuff + + def self.inherited x + RubyParser::VERSIONS << x + end + + def self.version= v + @version = v + end + + def self.version + @version ||= Parser > self && self.name[/(?:V|Ruby)(\d+)/, 1].to_i + end + end + + class SyntaxError < RuntimeError; end +end + +## +# Unfortunately a problem with racc is that it won't let me namespace +# properly, so instead of RubyParser::V25, I still have to generate +# the old Ruby25Parser and shove it in as V25. + +require "ruby20_parser" +require "ruby21_parser" +require "ruby22_parser" +require "ruby23_parser" +require "ruby24_parser" +require "ruby25_parser" +require "ruby26_parser" +require "ruby27_parser" +require "ruby30_parser" +require "ruby31_parser" +require "ruby32_parser" + +class RubyParser # HACK + VERSIONS.clear # also a HACK caused by racc namespace issues + + class V32 < ::Ruby32Parser; end + class V31 < ::Ruby31Parser; end + class V30 < ::Ruby30Parser; end + class V27 < ::Ruby27Parser; end + class V26 < ::Ruby26Parser; end + class V25 < ::Ruby25Parser; end + class V24 < ::Ruby24Parser; end + class V23 < ::Ruby23Parser; end + class V22 < ::Ruby22Parser; end + class V21 < ::Ruby21Parser; end + class V20 < ::Ruby20Parser; end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser.yy b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser.yy new file mode 100644 index 000000000..c2a3aaa3e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser.yy @@ -0,0 +1,3501 @@ +# -*- racc -*- + +#if V==20 +class Ruby20Parser +#elif V==21 +class Ruby21Parser +#elif V == 22 +class Ruby22Parser +#elif V == 23 +class Ruby23Parser +#elif V == 24 +class Ruby24Parser +#elif V == 25 +class Ruby25Parser +#elif V == 26 +class Ruby26Parser +#elif V == 27 +class Ruby27Parser +#else +fail "version not specified or supported on code generation" +#endif + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA + tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND +#if V >= 21 + tRATIONAL tIMAGINARY +#endif +#if V >= 22 + tLABEL_END +#endif +#if V >= 23 + tLONELY +#endif +#if V >= 26 + tBDOT2 tBDOT3 +#endif + +preclow + nonassoc tLOWEST + nonassoc tLBRACE_ARG + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + left kOR kAND + right kNOT + nonassoc kDEFINED + right tEQL tOP_ASGN + left kRESCUE_MOD + right tEH tCOLON + nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3 + left tOROP + left tANDOP + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tGT tGEQ tLT tLEQ + left tPIPE tCARET + left tAMPER2 + left tLSHFT tRSHFT + left tPLUS tMINUS + left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT + right tUMINUS_NUM tUMINUS + right tPOW + right tBANG tTILDE tUPLUS +prechigh + +rule + + program: { + self.lexer.lex_state = EXPR_BEG + } + top_compstmt + { + result = new_compstmt val + + lexer.cond.pop # local_pop + lexer.cmdarg.pop + } + + top_compstmt: top_stmts opt_terms + { + stmt, _ = val + result = stmt + } + + top_stmts: none + | top_stmt + | top_stmts terms top_stmt + { + result = self.block_append val[0], val[2] + } + | error top_stmt + + top_stmt: stmt + | klBEGIN + { + if (self.in_def || self.in_single > 0) then + debug 11 + yyerror "BEGIN in method" + end + self.env.extend + } + begin_block + { + (_, lineno), _, iter = val + iter.line lineno + + (_, preexe,) = iter + preexe.line lineno + + result = iter + } + + begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY + { + _, line, stmt, _ = val + result = new_iter s(:preexe).line(line), 0, stmt + } + + bodystmt: compstmt opt_rescue k_else + { + res = _values[-2] + # TODO: move down to main match so I can just use val + +#if V >= 26 + yyerror "else without rescue is useless" unless res +#else + warn "else without rescue is useless" unless res +#endif + } + compstmt + opt_ensure + { + body, resc, _, _, els, ens = val + + result = new_body [body, resc, els, ens] + } + | compstmt opt_rescue opt_ensure + { + body, resc, ens = val + + result = new_body [body, resc, nil, ens] + } + + compstmt: stmts opt_terms + { + result = new_compstmt val + } + + stmts: none + | stmt_or_begin # TODO: newline_node ? + | stmts terms stmt_or_begin + { + result = self.block_append val[0], val[2] + } + | error stmt + { + result = val[1] + debug 12 + } + + stmt_or_begin: stmt + | klBEGIN + { + yyerror "BEGIN is permitted only at toplevel" + } + begin_block + { + result = val[2] # wtf? + } + + stmt: kALIAS fitem + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + (_, line), lhs, _, rhs = val + result = s(:alias, lhs, rhs).line(line).line line + } + | kALIAS tGVAR tGVAR + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, rhs.to_sym).line line + } + | kALIAS tGVAR tBACK_REF + { + (_, line), (lhs, _), (rhs, _) = val + result = s(:valias, lhs.to_sym, :"$#{rhs}").line line + } + | kALIAS tGVAR tNTH_REF + { + yyerror "can't make alias for the number variables" + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + t, _, c = val + result = new_if c, t, nil + } + | stmt kUNLESS_MOD expr_value + { + f, _, c = val + result = new_if c, nil, f + } + | stmt kWHILE_MOD expr_value + { + e, _, c = val + result = new_while e, c, true + } + | stmt kUNTIL_MOD expr_value + { + e, _, c = val + result = new_until e, c, true + } + | stmt kRESCUE_MOD stmt + { + body, _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + result = new_rescue body, resbody + } + | klEND tLCURLY compstmt tRCURLY + { + (_, line), _, stmt, _ = val + + if (self.in_def || self.in_single > 0) then + debug 13 + yyerror "END in method; use at_exit" + end + + result = new_iter s(:postexe).line(line), 0, stmt + } + | command_asgn + | mlhs tEQL command_call + { + result = new_masgn val[0], val[2], :wrap + } + | lhs tEQL mrhs + { + lhs, _, rhs = val + + result = new_assign lhs, s(:svalue, rhs).line(rhs.line) + } +#if V == 20 + | mlhs tEQL arg_value + { + result = new_masgn val[0], val[2], :wrap + } +#endif +#if V >= 27 + | mlhs tEQL mrhs_arg kRESCUE_MOD stmt + { + # unwraps s(:to_ary, rhs) + lhs, _, (_, rhs), _, resbody = val + + resbody = new_resbody s(:array).line(resbody.line), resbody + + result = new_masgn lhs, new_rescue(rhs, resbody), :wrap + } +#endif +#if V == 20 + | mlhs tEQL mrhs +#else + | mlhs tEQL mrhs_arg +#endif + { + result = new_masgn val[0], val[2] + } + | expr + + command_asgn: lhs tEQL command_rhs + { + result = new_assign val[0], val[2] + } + # | lhs tEQL command_asgn + # { + # result = new_assign val[0], val[2] + # } + | var_lhs tOP_ASGN command_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value call_op tCONSTANT tOP_ASGN command_rhs + { + prim, (call_op, _), (id, _), (op_asgn, _), rhs = val + + result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym) + result.sexp_type = :safe_op_asgn if call_op == '&.' + result.line prim.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs + { + lhs1, _, (lhs2, line), (id, _), rhs = val + + result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line + } + | backref tOP_ASGN command_rhs + { + self.backref_assign_error val[0] + } + + command_rhs: command_call =tOP_ASGN + { + expr, = val + result = value_expr expr + } +#if V >= 24 + | command_call kRESCUE_MOD stmt + { + expr, (_, line), resbody = val + + expr = value_expr expr + ary = s(:array).line line + result = new_rescue(expr, new_resbody(ary, resbody)) + } +#endif + | command_asgn + + expr: command_call + | expr kAND expr + { + lhs, _, rhs = val + result = logical_op :and, lhs, rhs + } + | expr kOR expr + { + lhs, _, rhs = val + result = logical_op :or, lhs, rhs + } + | kNOT opt_nl expr + { + (_, line), _, expr = val + result = new_call(expr, :"!").line line + # REFACTOR: call_uni_op + } + | tBANG command_call + { + _, cmd = val + result = new_call(cmd, :"!").line cmd.line + # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict + # REFACTOR: call_uni_op -- see parse26.y + } +#if V >= 27 + | arg + kIN + { + # TODO? value_expr($1); + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + self.env.extend + } + p_expr + { + self.env.unextend + + expr, _, old_kwarg, pat = val + + expr = value_expr expr + + self.in_kwarg = old_kwarg + pat_in = new_in pat, nil, nil, expr.line + result = new_case expr, pat_in, expr.line + } +#endif + | arg =tLBRACE_ARG + + expr_value: expr + { + result = value_expr(val[0]) + } + + expr_value_do: { + lexer.cond.push true + } + expr_value do + { + lexer.cond.pop + } + { + _, expr, _, _ = val + result = expr + } + + command_call: command + | block_command + + block_command: block_call + | block_call call_op2 operation2 command_args + { + blk, _, (msg, _line), args = val + result = new_call(blk, msg.to_sym, args).line blk.line + } + + cmd_brace_block: tLBRACE_ARG + { + # self.env.extend(:dynamic) + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + # self.env.unextend + } + + fcall: operation + { + (msg, line), = val + result = new_call(nil, msg.to_sym).line line + } + + command: fcall command_args =tLOWEST + { + call, args = val + result = call.concat args.sexp_body + } + | fcall command_args cmd_brace_block + { + call, args, block = val + + result = call.concat args.sexp_body + + if block then + block_dup_check result, block + + result, operation = block, result + result.insert 1, operation + end + } + | primary_value call_op operation2 command_args =tLOWEST + { + lhs, callop, (op, _), args = val + + result = new_call lhs, op.to_sym, args, callop + result.line lhs.line + } + | primary_value call_op operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args, val[1] + + block_dup_check call, block + + block.insert 1, call + result = block + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lhs, _, (id, line), args = val + + result = new_call lhs, id.to_sym, args + result.line line + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + recv, _, (msg, _line), args, block = val + call = new_call recv, msg.to_sym, args + + block_dup_check call, block + + block.insert 1, call + result = block + } + | kSUPER command_args + { + result = new_super val[1] + } + | kYIELD command_args + { + (_, line), args = val + result = new_yield args + result.line line # TODO: push to new_yield + } + | k_return call_args + { + line = val[0].last + result = s(:return, ret_args(val[1])).line(line) + } + | kBREAK call_args + { + (_, line), args = val + result = s(:break, ret_args(args)).line line + } + | kNEXT call_args + { + line = val[0].last + result = s(:next, ret_args(val[1])).line(line) + } + + mlhs: mlhs_basic + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_inner: mlhs_basic + | tLPAREN mlhs_inner rparen + { + _, arg, _ = val + l = arg.line + + result = s(:masgn, s(:array, arg).line(l)).line l + } + + mlhs_basic: mlhs_head + { + head, = val + result = s(:masgn, head).line head.line + } + | mlhs_head mlhs_item + { + lhs, rhs = val + result = s(:masgn, lhs << rhs.compact).line lhs.line + } + | mlhs_head tSTAR mlhs_node + { + head, _, tail = val + head << s(:splat, tail).line(tail.line) + result = s(:masgn, head).line head.line + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + ary1, _, splat, _, ary2 = val + + result = list_append ary1, s(:splat, splat).line(splat.line) + result.concat ary2.sexp_body + result = s(:masgn, result).line result.line + } + | mlhs_head tSTAR + { + head, _ = val + l = head.line + result = s(:masgn, head << s(:splat).line(l)).line l + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + head, _, _, post = val + ary = list_append head, s(:splat).line(head.line) + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR mlhs_node + { + _, node = val + l = node.line + splat = s(:splat, node).line l + ary = s(:array, splat).line l + result = s(:masgn, ary).line l + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + _, node, _, post = val + + splat = s(:splat, node).line node.line + ary = s(:array, splat).line splat.line + ary.concat post.sexp_body + result = s(:masgn, ary).line ary.line + } + | tSTAR + { + l = lexer.lineno + result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l + } + | tSTAR tCOMMA mlhs_post + { + _, _, post = val + l = post.line + + splat = s(:splat).line l + ary = s(:array, splat, *post.sexp_body).line l + result = s(:masgn, ary).line l + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + lhs, _ = val + result = s(:array, lhs).line lhs.line + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1].compact + } + + mlhs_post: mlhs_item + { + item, = val + result = s(:array, item).line item.line + } + | mlhs_post tCOMMA mlhs_item + { + result = list_append val[0], val[2] + } + + mlhs_node: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = self.aryset val[0], val[2] + } + | primary_value call_op tIDENTIFIER + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tIDENTIFIER + { + recv, _, (id, _line) = val + result = new_attrasgn recv, id + } + | primary_value call_op tCONSTANT + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 14 + yyerror "dynamic constant assignment" + end + + expr, _, (id, _line) = val + l = expr.line + + result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l + } + | tCOLON3 tCONSTANT + { + if (self.in_def || self.in_single > 0) then + debug 15 + yyerror "dynamic constant assignment" + end + + _, (id, l) = val + + result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + ref, = val + + self.backref_assign_error ref + } + + lhs: user_variable + { + var, = val + + result = self.assignable var + } + | keyword_variable + { + var, = val + + result = self.assignable var + + debug 16 + } + | primary_value tLBRACK2 opt_call_args rbracket + { + lhs, _, args, _ = val + + result = self.aryset lhs, args + } + | primary_value call_op tIDENTIFIER # REFACTOR + { + lhs, op, (id, _line) = val + + result = new_attrasgn lhs, id, op + } + | primary_value tCOLON2 tIDENTIFIER + { + lhs, _, (id, _line) = val + + result = new_attrasgn lhs, id + } + | primary_value call_op tCONSTANT # REFACTOR? + { + lhs, call_op, (id, _line) = val + + result = new_attrasgn lhs, id, call_op + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + if (self.in_def || self.in_single > 0) then + debug 17 + yyerror "dynamic constant assignment" + end + + l = expr.line + result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l + } + | tCOLON3 tCONSTANT + { + _, (id, l) = val + + if (self.in_def || self.in_single > 0) then + debug 18 + yyerror "dynamic constant assignment" + end + + result = s(:const, s(:colon3, id.to_sym).line(l)).line l + } + | backref + { + self.backref_assign_error val[0] + } + + cname: tIDENTIFIER + { + yyerror "class/module name must be CONSTANT" + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | cname + { + (id, line), = val + result = [id.to_sym, line] # TODO: sexp? + } + | primary_value tCOLON2 cname + { + pval, _, (name, _line) = val + + result = s(:colon2, pval, name.to_sym) + result.line pval.line + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + { + lexer.lex_state = EXPR_END + } + + | reswords + + fitem: fname + { + result = wrap :lit, val[0] + } + | symbol + + undef_list: fitem + { + result = new_undef val[0] + } + | + undef_list tCOMMA + { + lexer.lex_state = EXPR_FNAME + } + fitem + { + result = new_undef val[0], val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg_rhs + { + result = new_assign val[0], val[2] + } + | var_lhs tOP_ASGN arg_rhs + { + result = new_op_asgn val + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs + { + result = new_op_asgn1 val + } + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs + { + result = new_op_asgn2 val + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs + { + lhs, _, (id, _line), (op, _), rhs = val + + result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs + { + lhs1, _, (lhs2, _line), op, rhs = val + + lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line + result = new_const_op_asgn [lhs, op, rhs] + } + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs + { + _, lhs, op, rhs = val + + lhs = wrap :colon3, lhs + result = new_const_op_asgn [lhs, op, rhs] + } + | backref tOP_ASGN arg_rhs + { + # TODO: lhs = var_field val[0] + asgn = new_op_asgn val + result = self.backref_assign_error asgn + } + | arg tDOT2 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)..(v2.last)).line v1.line + else + result = s(:dot2, v1, v2).line v1.line + end + } + | arg tDOT3 arg + { + v1, v2 = val[0], val[2] + if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then + result = s(:lit, (v1.last)...(v2.last)).line v1.line + else + result = s(:dot3, v1, v2).line v1.line + end + } +#if V >= 26 + | arg tDOT2 + { + v1, _ = val + v2 = nil + + result = s(:dot2, v1, v2).line v1.line + } + | arg tDOT3 + { + v1, _ = val + v2 = nil + + result = s(:dot3, v1, v2).line v1.line + } +#endif + +#if V >= 27 + | tBDOT2 arg + { + _, v2, = val + v1 = nil + + result = s(:dot2, v1, v2).line v2.line + } + | tBDOT3 arg + { + _, v2 = val + v1 = nil + + result = s(:dot3, v1, v2).line v2.line + } +#endif + + | arg tPLUS arg + { + result = new_call val[0], :+, argl(val[2]) + } + | arg tMINUS arg + { + result = new_call val[0], :-, argl(val[2]) + } + | arg tSTAR2 arg # TODO: rename + { + result = new_call val[0], :*, argl(val[2]) + } + | arg tDIVIDE arg + { + result = new_call val[0], :"/", argl(val[2]) + } + | arg tPERCENT arg + { + result = new_call val[0], :"%", argl(val[2]) + } + | arg tPOW arg + { + result = new_call val[0], :**, argl(val[2]) + } +#if V == 20 + | tUMINUS_NUM tINTEGER tPOW arg + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + } + | tUMINUS_NUM tFLOAT tPOW arg +#else + | tUMINUS_NUM simple_numeric tPOW arg +#endif + { + _, (num, line), _, arg = val + lit = s(:lit, num).line line + result = new_call(new_call(lit, :"**", argl(arg)), :"-@") + +#if V == 20 + ## TODO: why is this 2.0 only? + debug 19 +#endif + } + | tUPLUS arg + { + result = new_call val[1], :"+@" + } + | tUMINUS arg + { + result = new_call val[1], :"-@" + } + | arg tPIPE arg + { + result = new_call val[0], :"|", argl(val[2]) + } + | arg tCARET arg + { + result = new_call val[0], :"^", argl(val[2]) + } + | arg tAMPER2 arg + { + result = new_call val[0], :"&", argl(val[2]) + } + | arg tCMP arg + { + result = new_call val[0], :"<=>", argl(val[2]) + } + | rel_expr =tCMP + | arg tEQ arg + { + result = new_call val[0], :"==", argl(val[2]) + } + | arg tEQQ arg + { + result = new_call val[0], :"===", argl(val[2]) + } + | arg tNEQ arg + { + result = new_call val[0], :"!=", argl(val[2]) + } + | arg tMATCH arg + { + lhs, _, rhs = val + result = new_match lhs, rhs + } + | arg tNMATCH arg + { + lhs, _, rhs = val + result = s(:not, new_match(lhs, rhs)).line lhs.line + } + | tBANG arg + { + _, arg = val + result = new_call arg, :"!" + result.line arg.line + } + | tTILDE arg + { + result = new_call value_expr(val[1]), :"~" + } + | arg tLSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :"\<\<", argl(val[2]) + } + | arg tRSHFT arg + { + val[0] = value_expr val[0] + val[2] = value_expr val[2] + result = new_call val[0], :">>", argl(val[2]) + } + | arg tANDOP arg + { + result = logical_op :and, val[0], val[2] + } + | arg tOROP arg + { + result = logical_op :or, val[0], val[2] + } + | kDEFINED opt_nl arg + { + (_, line), _, arg = val + result = s(:defined, arg).line line + } + | arg tEH arg opt_nl tCOLON arg + { + c, _, t, _, _, f = val + result = s(:if, c, t, f).line c.line + } + | primary + + relop: tGT + | tLT + | tGEQ + | tLEQ + + rel_expr: arg relop arg =tGT + { + lhs, (op, _), rhs = val + result = new_call lhs, op.to_sym, argl(rhs) + } + | rel_expr relop arg =tGT + { + lhs, (op, _), rhs = val + warn "comparison '%s' after comparison", op + result = new_call lhs, op.to_sym, argl(rhs) + } + + arg_value: arg + { + result = value_expr(val[0]) + } + + aref_args: none + | args trailer + { + result = args [val[0]] + } + | args tCOMMA assocs trailer + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs trailer + { + result = args [array_to_hash(val[0])] + } + + arg_rhs: arg =tOP_ASGN + | arg kRESCUE_MOD arg + { + body, (_, line), resbody = val + body = value_expr body + resbody = remove_begin resbody + + ary = s(:array).line line + result = new_rescue(body, new_resbody(ary, resbody)) + } + + paren_args: tLPAREN2 opt_call_args rparen + { + _, args, (_, line_max) = val + + result = args + result.line_max = line_max if args + } +#if V >= 27 + | tLPAREN2 args tCOMMA args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } + | tLPAREN2 args_forward rparen + { + yyerror "Unexpected ..." unless + self.lexer.is_local_id(:"*") && + self.lexer.is_local_id(:"**") && + self.lexer.is_local_id(:"&") + + result = call_args val + } +#endif + + opt_paren_args: none + | paren_args + + opt_call_args: none + | call_args + | args tCOMMA + { + result = args val + } + | args tCOMMA assocs tCOMMA + { + result = args [val[0], array_to_hash(val[2])] + } + | assocs tCOMMA + { + result = args [array_to_hash(val[0])] + } + + call_args: command + { + warning "parenthesize argument(s) for future version" + result = call_args val + } + | args opt_block_arg + { + result = call_args val + } + | assocs opt_block_arg + { + result = call_args [array_to_hash(val[0]), val[1]] + } + | args tCOMMA assocs opt_block_arg + { + result = call_args [val[0], array_to_hash(val[2]), val[3]] + } + | block_arg + { + result = call_args val + } + + command_args: { + # parse26.y line 2200 + + # If call_args starts with a open paren '(' or + # '[', look-ahead reading of the letters calls + # CMDARG_PUSH(0), but the push must be done + # after CMDARG_PUSH(1). So this code makes them + # consistent by first cancelling the premature + # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and + # finally redoing CMDARG_PUSH(0). + + result = yychar = self.last_token_type.first + lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.push true + lexer.cmdarg.push false if lookahead + } + call_args + { + yychar, args = val + + # call_args can be followed by tLBRACE_ARG (that + # does CMDARG_PUSH(0) in the lexer) but the push + # must be done after CMDARG_POP() in the parser. + # So this code does CMDARG_POP() to pop 0 pushed + # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed + # by command_args, and CMDARG_PUSH(0) to restore + # back the flag set by tLBRACE_ARG. + + lookahead = [:tLBRACE_ARG].include?(yychar) + lexer.cmdarg.pop if lookahead + lexer.cmdarg.pop + lexer.cmdarg.push false if lookahead + result = args + } + + block_arg: tAMPER arg_value + { + _, arg = val + result = s(:block_pass, arg).line arg.line + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | none + + args: arg_value + { + arg, = val + lineno = arg.line || lexer.lineno # HACK + + result = s(:array, arg).line lineno + } + | tSTAR arg_value + { + _, arg = val + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | args tCOMMA arg_value + { + args, _, id = val + result = self.list_append args, id + } + | args tCOMMA tSTAR arg_value + { + # TODO: the line number from tSTAR has been dropped + args, _, _, id = val + line = lexer.lineno + result = self.list_append args, s(:splat, id).line(line) + } + +#if V >= 21 + mrhs_arg: mrhs + { + result = new_masgn_arg val[0] + } + | arg_value + { + result = new_masgn_arg val[0], :wrap + } + +#endif + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + # TODO: make all tXXXX terminals include lexer.lineno + arg, _, _, splat = val + result = self.arg_concat arg, splat + } + | tSTAR arg_value + { + _, arg = val + result = s(:splat, arg).line arg.line + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + (msg, line), = val + result = new_call nil, msg.to_sym + result.line line + } + | k_begin + { + lexer.cmdarg.push false + } + bodystmt k_end + { + lexer.cmdarg.pop + result = new_begin val + } + | tLPAREN_ARG + { + lexer.lex_state = EXPR_ENDARG + result = lexer.lineno + } + rparen + { + _, line, _ = val + result = s(:begin).line line + } + | tLPAREN_ARG + stmt + { + lexer.lex_state = EXPR_ENDARG + } + rparen + { + _, stmt, _, _, = val + # warning "(...) interpreted as grouped expression" + result = stmt + } + | tLPAREN compstmt tRPAREN + { + _, stmt, _ = val + result = stmt + result ||= s(:nil).line lexer.lineno + result.paren = true + } + | primary_value tCOLON2 tCONSTANT + { + expr, _, (id, _line) = val + + result = s(:colon2, expr, id.to_sym).line expr.line + } + | tCOLON3 tCONSTANT + { + result = wrap :colon3, val[1] + } + | tLBRACK { result = lexer.lineno } aref_args rbracket + { + _, line, args, (_, line_max) = val + + result = args || s(:array) + result.sexp_type = :array # aref_args is :args + result.line line + result.line_max = line_max + } + | tLBRACE + { + result = self.lexer.lineno + } + assoc_list tRCURLY + { + result = new_hash val + } + | k_return + { + (_, line), = val + result = s(:return).line line + } + | kYIELD tLPAREN2 call_args rparen + { + (_, line), _, args, _ = val + + result = new_yield(args).line line + } + | kYIELD tLPAREN2 rparen + { + (_, line), _, _ = val + + result = new_yield.line line + } + | kYIELD + { + (_, line), = val + + result = new_yield.line line + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + (_, line), _, _, arg, _ = val + + result = s(:defined, arg).line line + } + | kNOT tLPAREN2 expr rparen + { + _, _, lhs, _ = val + result = new_call lhs, :"!" + } + | kNOT tLPAREN2 rparen + { + debug 20 + } + | fcall brace_block + { + call, iter = val + + iter.insert 1, call + result = iter + # FIX: probably not: call.line = iter.line + } + | method_call + | method_call brace_block + { + call, iter = val[0], val[1] + block_dup_check call, iter + iter.insert 1, call # FIX + result = iter + } + | lambda + { + expr, = val + result = expr + } + | k_if expr_value then compstmt if_tail k_end + { + _, c, _, t, f, _ = val + result = new_if c, t, f + } + | k_unless expr_value then compstmt opt_else k_end + { + _, c, _, t, f, _ = val + result = new_if c, f, t + } + | k_while expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_while body, cond, true + } + | k_until expr_value_do compstmt k_end + { + _, cond, body, _ = val + result = new_until body, cond, true + } + | k_case expr_value opt_terms case_body k_end + { + (_, line), expr, _, body, _ = val + result = new_case expr, body, line + } + | k_case opt_terms case_body k_end + { + (_, line), _, body, _ = val + result = new_case nil, body, line + } +#if V >= 27 + | k_case expr_value opt_terms p_case_body k_end + { + (_, line), expr, _, body, _ = val + + result = new_case expr, body, line + } +#endif + | k_for for_var kIN expr_value_do compstmt k_end + { + _, var, _, iter, body, _ = val + result = new_for iter, var, body + } + | k_class + cpath superclass + { + if (self.in_def || self.in_single > 0) then + yyerror "class definition in method body" + end + self.env.extend + } + bodystmt k_end + { + result = new_class val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_class tLSHFT + expr + { + result = self.in_def + self.in_def = false + } + term + { + result = self.in_single + self.in_single = 0 + self.env.extend + } + bodystmt k_end + { + result = new_sclass val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_module + cpath + { + yyerror "module definition in method body" if + self.in_def or self.in_single > 0 + + self.env.extend + } + bodystmt k_end + { + result = new_module val + self.env.unextend + self.lexer.ignore_body_comments + } + | k_def fname + { + result = self.in_def + + self.in_def = true # group = local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + } + f_arglist bodystmt k_end + { + result, in_def = new_defn val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.lexer.ignore_body_comments + } + | k_def singleton dot_or_colon + { + lexer.lex_state = EXPR_FNAME + } + fname + { + result = self.in_def + + self.in_single += 1 # TODO: remove? + + self.in_def = true # local_push + self.env.extend + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_state = EXPR_ENDFN|EXPR_LABEL + } + f_arglist bodystmt k_end + { + + # [kdef, recv, _, _, (name, line), in_def, args, body, kend] + # => + # [kdef, recv, (name, line), in_def, args, body, kend] + + val.delete_at 3 + val.delete_at 2 + + result, in_def = new_defs val + + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + + self.in_single -= 1 + + # TODO: restore cur_arg ? what's cur_arg? + + self.lexer.ignore_body_comments + } + | kBREAK + { + (_, line), = val + result = s(:break).line line + } + | kNEXT + { + (_, line), = val + result = s(:next).line line + } + | kREDO + { + (_, line), = val + result = s(:redo).line line + } + | kRETRY + { + (_, line), = val + result = s(:retry).line line + } + + primary_value: primary + { + result = value_expr(val[0]) + } + + # These are really stupid + k_begin: kBEGIN + k_if: kIF + k_unless: kUNLESS + k_while: kWHILE + k_until: kUNTIL + k_case: kCASE + k_for: kFOR + k_class: kCLASS + { + self.comments.push self.lexer.comments + } + k_module: kMODULE + { + self.comments.push self.lexer.comments + } + k_def: kDEF + { + self.comments.push self.lexer.comments + } + k_do: kDO + k_do_block: kDO_BLOCK + k_rescue: kRESCUE + k_ensure: kENSURE + k_when: kWHEN + k_else: kELSE + k_elsif: kELSIF + k_end: kEND + k_return: kRETURN + + then: term + | kTHEN + | term kTHEN + + do: term + | kDO_COND + + if_tail: opt_else + | k_elsif expr_value then compstmt if_tail + { + (_, line), c, _, t, rest = val + + result = s(:if, c, t, rest).line line + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + for_var: lhs + | mlhs + { + val[0].delete_at 1 if val[0][1].nil? # HACK + } + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = val[1] + } + + f_marg_list: f_marg + { + sym, = val + + result = s(:array, sym).line lexer.lineno + } + | f_marg_list tCOMMA f_marg + { + result = list_append val[0], val[2] + } + + f_margs: f_marg_list + { + args, = val + + result = block_var args + } + | f_marg_list tCOMMA f_rest_marg + { + args, _, rest = val + + result = block_var args, rest + } + | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list + { + lhs, _, splat, _, rhs = val + + result = block_var lhs, splat, rhs + } + | f_rest_marg + { + rest, = val + + result = block_var rest + } + | f_rest_marg tCOMMA f_marg_list + { + splat, _, rest = val + + result = block_var splat, rest + } + + f_rest_marg: tSTAR f_norm_arg + { + _, (id, line) = val + + result = args ["*#{id}".to_sym] + result.line line + } + | tSTAR + { + result = args [:*] + result.line lexer.lineno # FIX: tSTAR -> line + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = call_args val + } + | f_block_kwarg opt_f_block_arg + { + result = call_args val + } + | f_kwrest opt_f_block_arg + { + result = call_args val + } +#if V >= 27 + | f_no_kwarg opt_f_block_arg + { + result = args val + } +#endif + | f_block_arg + { + (id, line), = val + result = call_args [id] + result.line line + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = args val + } + | none + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_arg tCOMMA + { + result = args(val) << nil + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_block_optarg opt_block_args_tail + { + result = args val + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg opt_block_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = args val + } + | block_args_tail + { + result = args val + } + + opt_block_param: none { result = 0 } + | block_param_def + { + self.lexer.command_start = true + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + | tOROP + { + result = s(:args).line lexer.lineno + } + | tPIPE block_param opt_bv_decl tPIPE + { + # TODO: current_arg = 0 + result = args val + } + + opt_bv_decl: opt_nl + | opt_nl tSEMI bv_decls opt_nl + { + result = args val + } + + bv_decls: bvar + { + result = args val + } + | bv_decls tCOMMA bvar + { + result = args val + } + + bvar: tIDENTIFIER + { + result = wrap :shadow, val[0] + } + | f_bad_arg + + lambda: tLAMBDA + { + self.env.extend :dynamic + result = [lexer.lineno, lexer.lpar_beg] + lexer.paren_nest += 1 + lexer.lpar_beg = lexer.paren_nest + } + f_larglist + { + lexer.cmdarg.push false + } + lambda_body + { + _, (line, lpar), args, _cmdarg, body = val + lexer.lpar_beg = lpar + + lexer.cmdarg.pop + + call = s(:lambda).line line + result = new_iter call, args, body + result.line line + self.env.unextend # TODO: dynapush & dynapop + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = args val + } + | f_args + { + result = val[0] + result = 0 if result == s(:args) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA bodystmt kEND + { + result = val[1] + } + + do_block: k_do_block do_body kEND + { + (_, line), iter, _ = val + result = iter.line line + } + + block_call: command do_block + { + # TODO: + ## if (nd_type($1) == NODE_YIELD) { + ## compile_error(PARSER_ARG "block given to yield"); + + cmd, blk = val + + syntax_error "Both block arg and actual block given." if + cmd.block_pass? + + if inverted? val then + val = invert_block_call val + cmd, blk = val + end + + result = blk + result.insert 1, cmd + } + | block_call call_op2 operation2 opt_paren_args + { + lhs, _, (id, _line), args = val + + result = new_call lhs, id.to_sym, args + } + | block_call call_op2 operation2 opt_paren_args brace_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + | block_call call_op2 operation2 command_args do_block + { + iter1, _, (name, _line), args, iter2 = val + + call = new_call iter1, name.to_sym, args + iter2.insert 1, call + + result = iter2 + } + + method_call: fcall paren_args + { + call, args = val + + result = call + + if args then + call.concat args.sexp_body + result.line_max = args.line_max + end + } + | primary_value call_op operation2 opt_paren_args + { + recv, call_op, (op, op_line), args = val + + result = new_call recv, op.to_sym, args, call_op + result.line_max = op_line unless args + } + | primary_value tCOLON2 operation2 paren_args + { + recv, _, (op, _line), args = val + + result = new_call recv, op.to_sym, args + } + | primary_value tCOLON2 operation3 + { + lhs, _, (id, _line) = val + + result = new_call lhs, id.to_sym + } + | primary_value call_op paren_args + { + result = new_call val[0], :call, val[2], val[1] + } + | primary_value tCOLON2 paren_args + { + result = new_call val[0], :call, val[2] + } + | kSUPER paren_args + { + result = new_super val[1] + } + | kSUPER + { + result = s(:zsuper).line lexer.lineno + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = new_aref val + } + + brace_block: tLCURLY + { + self.env.extend :dynamic + result = self.lexer.lineno + } + brace_body tRCURLY + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + | k_do + { + self.env.extend :dynamic + result = self.lexer.lineno + } + do_body kEND + { + _, line, body, _ = val + + result = body + result.line line + + self.env.unextend + } + + brace_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { result = lexer.cmdarg.store(false) } + opt_block_param compstmt + { + line, cmdarg, param, cmpstmt = val + + result = new_brace_body param, cmpstmt, line + self.env.unextend + lexer.cmdarg.restore cmdarg + lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ? + } + + do_body: { self.env.extend :dynamic; result = self.lexer.lineno } + { lexer.cmdarg.push false } + opt_block_param +#if V >= 25 + bodystmt +#else + compstmt +#endif + { + line, _cmdarg, param, cmpstmt = val + + result = new_do_body param, cmpstmt, line + lexer.cmdarg.pop + self.env.unextend + } + + case_args: arg_value + { + arg, = val + + result = s(:array, arg).line arg.line + } + | tSTAR arg_value + { + _, arg = val + + result = s(:array, s(:splat, arg).line(arg.line)).line arg.line + } + | case_args tCOMMA arg_value + { + args, _, id = val + + result = self.list_append args, id + } + | case_args tCOMMA tSTAR arg_value + { + args, _, _, id = val + + result = self.list_append args, s(:splat, id).line(id.line) + } + + case_body: k_when + { + result = self.lexer.lineno + } + case_args then compstmt cases + { + result = new_when(val[2], val[4]) + result.line val[1] + result << val[5] if val[5] + } + + cases: opt_else | case_body +#if V >= 27 +###################################################################### + + p_case_body: kIN + { + self.lexer.lex_state = EXPR_BEG|EXPR_LABEL + self.lexer.command_start = false + result = self.in_kwarg + self.in_kwarg = true + push_pvtbl + push_pktbl + } + p_top_expr then + { + pop_pktbl + pop_pvtbl + old_kwargs = _values[-3] + self.in_kwarg = old_kwargs + } + compstmt + p_cases + { + (_, line), _, pat, _, _, body, cases = val + + result = new_in pat, body, cases, line + } + + p_cases: opt_else + | p_case_body + + p_top_expr: p_top_expr_body + | p_top_expr_body kIF_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, body, nil).line body.line + } + | p_top_expr_body kUNLESS_MOD expr_value + { + body, _, cond = val + body = remove_begin body + + result = s(:if, cond, nil, body).line body.line + } + + p_top_expr_body: p_expr + | p_expr tCOMMA + { + expr, _ = val + + tail = new_array_pattern_tail nil, true, nil, nil + result = new_array_pattern nil, expr, tail, expr.line + } + | p_expr tCOMMA p_args + { + expr, _, args = val + + result = new_array_pattern nil, expr, args, expr.line + } + | p_args_tail + { + args, = val + result = new_array_pattern nil, nil, args, args.line + } + | p_kwargs + { + kwargs, = val + result = new_hash_pattern nil, kwargs, kwargs.line + } + + p_expr: p_as + + p_as: p_expr tASSOC p_variable + { + # NODE *n = NEW_LIST($1, &@$); + # n = list_append(p, n, $3); + # $$ = new_hash(p, n, &@$); + + expr, _, var = val + + id = var.last + + self.env[id] = :lvar # HACK: need to extend env + lhs = s(:lasgn, id).line var.line + + result = new_assign lhs, expr + } + | p_alt + + p_alt: p_alt tPIPE p_expr_basic + { + lhs, _, rhs = val + + result = s(:or, lhs, rhs).line lhs.line + } + | p_expr_basic + + p_lparen: tLPAREN2 { push_pktbl } + p_lbracket: tLBRACK2 { push_pktbl } + + p_expr_basic: p_value + | p_const p_lparen p_args tRPAREN + { + lhs, _, args, _ = val + + pop_pktbl + result = new_array_pattern(lhs, nil, args, lhs.line) + } + | p_const p_lparen p_kwargs tRPAREN + { + lhs, _, kwargs, _ = val + + pop_pktbl + result = new_hash_pattern(lhs, kwargs, lhs.line) + } + | p_const tLPAREN2 tRPAREN + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | p_const p_lbracket p_args rbracket + { + const, _, pre_arg, _ = val + + pop_pktbl + result = new_array_pattern const, nil, pre_arg, const.line + } + | p_const p_lbracket p_kwargs rbracket + { + const, _, kwargs, _ = val + + result = new_hash_pattern const, kwargs, const.line + } + | p_const tLBRACK2 rbracket + { + const, _, _ = val + + tail = new_array_pattern_tail nil, nil, nil, nil + result = new_array_pattern const, nil, tail, const.line + } + | tLBRACK { push_pktbl } p_args rbracket + { + _, _, pat, _ = val + + pop_pktbl + result = new_array_pattern nil, nil, pat, pat.line + } + | tLBRACK rbracket + { + (_, line), _ = val + + result = s(:array_pat).line line + } + | tLBRACE + { + push_pktbl + result = self.in_kwarg + self.in_kwarg = false + } + p_kwargs rbrace + { + _, in_kwarg, kwargs, _ = val + + pop_pktbl + self.in_kwarg = in_kwarg + + result = new_hash_pattern(nil, kwargs, kwargs.line) + } + | tLBRACE rbrace + { + (_, line), _ = val + + tail = new_hash_pattern_tail nil, nil, line + result = new_hash_pattern nil, tail, line + } + | tLPAREN { push_pktbl } p_expr tRPAREN + { + _, _, expr, _ = val + + pop_pktbl + result = expr + } + + p_args: p_expr + { + expr, = val + + ary = s(:array_TAIL, expr).line expr.line + result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line + } + | p_args_head + { + head, = val + + result = new_array_pattern_tail head, true, nil, nil + } + | p_args_head p_arg + { + head, tail = val + + both = array_pat_concat head, tail + + result = new_array_pattern_tail both, nil, nil, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER + { + head, _, (id, _line) = val + + result = new_array_pattern_tail head, true, id.to_sym, nil + result.line head.line + } + | p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post + { + head, _, (id, _line), _, post = val + + result = new_array_pattern_tail head, true, id.to_sym, post + result.line head.line + } + | p_args_head tSTAR + { + expr, _ = val + + result = new_array_pattern_tail(expr, true, nil, nil).line expr.line + } + | p_args_head tSTAR tCOMMA p_args_post + { + head, _, _, post = val + + result = new_array_pattern_tail(head, true, nil, post).line head.line + } + | p_args_tail + + p_args_head: p_arg tCOMMA + { + arg, _ = val + result = arg + } + | p_args_head p_arg tCOMMA + { + head, tail, _ = val + + result = s(:PATTERN, *head.sexp_body, *tail.sexp_body) + result.line head.line + } + + p_args_tail: tSTAR tIDENTIFIER + { + _, (id, line) = val + + result = new_array_pattern_tail nil, true, id.to_sym, nil + result.line line + } + | tSTAR tIDENTIFIER tCOMMA p_args_post + { + _, (id, line), _, rhs = val + + result = new_array_pattern_tail nil, true, id.to_sym, rhs + result.line line + } + | tSTAR + { + (_, line), = val + + result = new_array_pattern_tail nil, true, nil, nil + result.line line + } + | tSTAR tCOMMA p_args_post + { + (_, line), _, args = val + + result = new_array_pattern_tail nil, true, nil, args + result.line line + } + + p_args_post: p_arg + | p_args_post tCOMMA p_arg + { + lhs, _, rhs = val + + result = array_pat_concat lhs, rhs + } + + p_arg: p_expr + { + expr, = val + expr = s(:array_TAIL, expr).line expr.line unless + expr.sexp_type == :array_TAIL + result = expr + } + + p_kwargs: p_kwarg tCOMMA p_kwrest + { + kw_arg, _, rest = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kw_arg, rest, kw_arg.line + } + | p_kwarg + { + kwarg, = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_kwarg tCOMMA + { + kwarg, _ = val + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, nil, kwarg.line + } + | p_kwrest + { + rest, = val + + result = new_hash_pattern_tail nil, rest, rest.line + } + | p_kwarg tCOMMA p_kwnorest + { + kwarg, _, norest = val + + # TODO? new_unique_key_hash(p, $1, &@$) + result = new_hash_pattern_tail kwarg, norest, kwarg.line + } + | p_kwnorest + { + norest, = val + + result = new_hash_pattern_tail nil, norest, norest.line + } + + p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1) + | p_kwarg tCOMMA p_kw + { + kwarg, _, kw = val + kwarg.concat kw.sexp_body + result = kwarg + } + + p_kw: p_kw_label p_expr + { + # TODO: error_duplicate_pattern_key(p, get_id($1), &@1); + lhs, rhs = val + + result = s(:PAIR, lhs, rhs).line lhs.line + } + | p_kw_label + { + lhs, = val + + # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1); + + # TODO: if ($1 && !is_local_id(get_id($1))) { + # yyerror1(&@1, "key must be valid as local variables"); + # } + + # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$), + # assignable(p, $1, 0, &@$)); + + + case lhs.sexp_type + when :lit then + assignable [lhs.value, lhs.line] + else + # TODO or done? + debug 666 + end + + # TODO PAIR -> LIST ? + result = s(:PAIR, lhs, nil).line lhs.line + } + + p_kw_label: tLABEL + { + result = wrap :lit, val[0] + } + + p_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = s(:kwrest, :"**#{name}").line line + } + | kwrest_mark + { + (_, line), = val + + result = s(:kwrest, :"**").line line + } + + p_kwnorest: kwrest_mark kNIL + { + (_, line), _ = val + + # TODO: or s(:norest)? s(:**nil)? + result = s(:kwrest, :"**nil").line line + } + + p_value: p_primitive + | p_primitive tDOT2 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot2, lhs, rhs).line lhs.line + } + | p_primitive tDOT3 p_primitive + { + lhs, _, rhs = val + + lhs = value_expr lhs + rhs = value_expr rhs + + result = s(:dot3, lhs, rhs).line lhs.line + } + | p_primitive tDOT2 + { + v1, _ = val + + result = s(:dot2, v1, nil).line v1.line + } + | p_primitive tDOT3 + { + v1, _ = val + + result = s(:dot3, v1, nil).line v1.line + } + | p_variable + | p_var_ref + | p_const + | tBDOT2 p_primitive + { + _, v1 = val + + result = s(:dot2, nil, v1).line v1.line + } + | tBDOT3 p_primitive + { + _, v1 = val + + result = s(:dot3, nil, v1).line v1.line + } + + p_primitive: literal + | strings + | xstring + | regexp + | words + { + result = ary_to_pat val[0] + } + | qwords + { + result = ary_to_pat val[0] + } + | symbols + { + result = ary_to_pat val[0] + } + | qsymbols + { + result = ary_to_pat val[0] + } + | keyword_variable + { + # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$); + var, = val + + result = var + } + | lambda + + p_variable: tIDENTIFIER + { + # TODO: error_duplicate_pattern_variable(p, $1, &@1); + # TODO: assignable(p, $1, 0, &@$); + result = wrap :lasgn, val[0] + } + + p_var_ref: tCARET tIDENTIFIER + { + # TODO: check id against env for lvar or dvar + result = wrap :lvar, val[1] + } + + p_const: tCOLON3 cname + { + result = wrap :colon3, val[1] + } + | p_const tCOLON2 cname + { + lhs, _, (id, _line) = val + + l = lhs.line + result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l + } + | tCONSTANT + { + # TODO $$ = gettable(p, $1, &@$); + result = wrap :const, val[0] + } +###################################################################### +#endif + + opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue + { + (_, line), klasses, var, _, body, rest = val + + klasses ||= s(:array) + klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var + klasses.line line + + result = new_resbody(klasses, body) + result << rest if rest # UGH, rewritten above + } + | + { + result = nil + } + + exc_list: arg_value + { + arg, = val + result = s(:array, arg).line arg.line + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + + opt_ensure: k_ensure compstmt + { + (_, line), body = val + + result = body || s(:nil).line(line) + } + | none + + literal: numeric + { + (lit, line), = val + result = s(:lit, lit).line line + } + | symbol + + strings: string + { + str, = val + str = s(:dstr, str.value) if str.sexp_type == :evstr + result = str + } + + string: tCHAR + { + debug 37 + } + | string1 + | string string1 + { + result = self.literal_concat val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + (_, line), str, (_, func) = val + + str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT + + result = str.line line + } + | tSTRING + { + result = new_string val + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstring val + # TODO: dedent?!?! SERIOUSLY?!? + } + + regexp: tREGEXP_BEG regexp_contents tREGEXP_END + { + result = new_regexp val + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tWORDS_BEG word_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + word_list: none + { + result = new_word_list + } + | word_list word tSPACE + { + result = val[0].dup << new_word_list_entry(val) + } + + word: string_content + | word string_content + { + result = self.literal_concat val[0], val[1] + } + + symbols: tSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tSYMBOLS_BEG symbol_list tSTRING_END + { + (_, line), list, (_, line_max), = val + + result = list.line line + result.line_max = line_max + } + + symbol_list: none + { + result = new_symbol_list + } + | symbol_list word tSPACE + { + list, * = val + result = list.dup << new_symbol_list_entry(val) + } + + qwords: tQWORDS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQWORDS_BEG qword_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END + { + (_, line), _, (_, line_max) = val + + result = s(:array).line line + result.line_max = line_max + } + | tQSYMBOLS_BEG qsym_list tSTRING_END + { + (_, line), list, (_, line_max) = val + + result = list.line line + result.line_max = line_max + } + + qword_list: none + { + result = new_qword_list + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qword_list_entry(val) + } + + qsym_list: none + { + result = new_qsym_list + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0].dup << new_qsym_list_entry(val) + } + + string_contents: none + { + line = prev_value_to_lineno _values.last + result = s(:str, +"").line line + } + | string_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + +regexp_contents: none + { + result = nil + } + | regexp_contents string_content + { + v1, v2 = val + result = literal_concat v1, v2 + } + + string_content: tSTRING_CONTENT + { + result = new_string val + } + | tSTRING_DVAR + { + result = lexer.lex_strterm + + lexer.lex_strterm = nil + lexer.lex_state = EXPR_BEG + } + string_dvar + { + _, strterm, str = val + lexer.lex_strterm = strterm + result = s(:evstr, str).line str.line + } + | tSTRING_DBEG + { + result = [lexer.lex_strterm, + lexer.brace_nest, + lexer.string_nest, # TODO: remove + lexer.lex_state, + lexer.lineno, + ] + + lexer.cmdarg.push false + lexer.cond.push false + + lexer.lex_strterm = nil + lexer.brace_nest = 0 + lexer.string_nest = 0 + + lexer.lex_state = EXPR_BEG + } + compstmt + tSTRING_DEND + { + _, memo, stmt, _ = val + + lex_strterm, brace_nest, string_nest, oldlex_state, line = memo + # TODO: heredoc_indent + + lexer.lex_strterm = lex_strterm + lexer.brace_nest = brace_nest + lexer.string_nest = string_nest + + lexer.cond.pop + lexer.cmdarg.pop + + lexer.lex_state = oldlex_state + + case stmt + when Sexp then + case stmt.sexp_type + when :str, :dstr, :evstr then + result = stmt + else + result = s(:evstr, stmt).line line + end + when nil then + result = s(:evstr).line line + else + debug 38 + raise "unknown string body: #{stmt.inspect}" + end + } + + string_dvar: tGVAR + { + result = wrap :gvar, val[0] + } + | tIVAR + { + result = wrap :ivar, val[0] + } + | tCVAR + { + result = wrap :cvar, val[0] + } + | backref + + symbol: ssym + | dsym + + ssym: tSYMBEG sym + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[1] + } + | tSYMBOL + { + lexer.lex_state = EXPR_END + result = wrap :lit, val[0] + } + + sym: fname | tIVAR | tGVAR | tCVAR + + dsym: tSYMBEG string_contents tSTRING_END + { + _, result, _ = val + + lexer.lex_state = EXPR_END + + result ||= s(:str, "").line lexer.lineno + + case result.sexp_type + when :dstr then + result.sexp_type = :dsym + when :str then + result = s(:lit, result.last.to_sym).line result.line + when :evstr then + result = s(:dsym, "", result).line result.line + else + debug 39 + end + } + +#if V == 20 + numeric: tINTEGER + | tFLOAT + | tUMINUS_NUM tINTEGER =tLOWEST +#else + numeric: simple_numeric + | tUMINUS_NUM simple_numeric =tLOWEST +#endif + { + _, (num, line) = val + result = [-num, line] +#if V == 20 + } + | tUMINUS_NUM tFLOAT =tLOWEST + { + _, (num, line) = val + result = [-num, line] +#endif + } + +#if V >= 21 + simple_numeric: tINTEGER + | tFLOAT + | tRATIONAL + | tIMAGINARY + +#endif + user_variable: tIDENTIFIER + | tIVAR + | tGVAR + | tCONSTANT + | tCVAR + +keyword_variable: kNIL { result = s(:nil).line lexer.lineno } + | kSELF { result = s(:self).line lexer.lineno } + | kTRUE { result = s(:true).line lexer.lineno } + | kFALSE { result = s(:false).line lexer.lineno } + | k__FILE__ { result = s(:str, self.file).line lexer.lineno } + | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno } + | k__ENCODING__ + { + l = lexer.lineno + result = + if defined? Encoding then + s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l + else + s(:str, "Unsupported!").line l + end + } + + var_ref: user_variable + { + raise "NO: #{val.inspect}" if Sexp === val.first + (var, line), = val + result = Sexp === var ? var : self.gettable(var) + result.line line + } + | keyword_variable + { + var = val[0] + result = Sexp === var ? var : self.gettable(var) + } + + var_lhs: user_variable + { + result = self.assignable val[0] + } + | keyword_variable + { + result = self.assignable val[0] + debug 40 + } + + backref: tNTH_REF + { + (ref, line), = val + result = s(:nth_ref, ref).line line + } + | tBACK_REF + { + (ref, line), = val + result = s(:back_ref, ref).line line + } + + superclass: tLT + { + lexer.lex_state = EXPR_BEG + lexer.command_start = true + } + expr_value term + { + result = val[2] + } + | none + { + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = end_args val + } +#if V == 27 + | tLPAREN2 f_arg tCOMMA args_forward rparen + { + result = end_args val + } + | tLPAREN2 args_forward rparen + { + result = end_args val + } +#endif + | { + result = self.in_kwarg + self.in_kwarg = true + self.lexer.lex_state |= EXPR_LABEL + } + f_args term + { + result = end_args val + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = args val + } + | f_kwarg opt_f_block_arg + { + result = args val + } + | f_kwrest opt_f_block_arg + { + result = args val + } +#if V >= 27 + | f_no_kwarg opt_f_block_arg + { + result = args val + } +#endif + | f_block_arg + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | + { + result = nil + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_optarg opt_args_tail + { + result = args val + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = args val + } + | f_rest_arg opt_args_tail + { + result = args val + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = args val + } + | args_tail + { + result = args val + } + | + { + result = args val + # result.line lexer.lineno + } + +#if V >= 27 + args_forward: tBDOT3 + { + result = s(:forward_args).line lexer.lineno + } +#endif + + f_bad_arg: tCONSTANT + { + yyerror "formal argument cannot be a constant" + } + | tIVAR + { + yyerror "formal argument cannot be an instance variable" + } + | tGVAR + { + yyerror "formal argument cannot be a global variable" + } + | tCVAR + { + yyerror "formal argument cannot be a class variable" + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + (id, line), = val + identifier = id.to_sym + self.env[identifier] = :lvar + + result = [identifier, line] + } + +#if V >= 22 + f_arg_asgn: f_norm_arg + + f_arg_item: f_arg_asgn + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } +#else + f_arg_item: f_norm_arg + | tLPAREN f_margs rparen + { + _, margs, _ = val + + result = margs + } +#endif + + f_arg: f_arg_item + { + result = new_arg val + } + | f_arg tCOMMA f_arg_item + { + list, _, item = val + + if list.sexp_type == :args then + result = list + else + result = s(:args, list).line list.line + end + + if Sexp === item then + line_max = item.line_max + else + item, line_max = item + end + + result << item + result.line_max = line_max + } + +#if V == 20 + f_kw: tLABEL arg_value +#else + f_label: tLABEL + + f_kw: f_label arg_value +#endif + { + # TODO: new_kw_arg + (label, line), arg = val + + identifier = label.to_sym + self.env[identifier] = :lvar + + kwarg = s(:kwarg, identifier, arg).line line + result = s(:array, kwarg).line line + } +#if V >= 21 + | f_label + { + (label, line), = val + + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } +#endif + +#if V == 20 + f_block_kw: tLABEL primary_value +#else + f_block_kw: f_label primary_value +#endif + { + # TODO: new_kw_arg + (label, line), expr = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id, expr).line(line)).line line + } +#if V >= 21 + | f_label + { + # TODO: new_kw_arg + (label, line), = val + id = label.to_sym + self.env[id] = :lvar + + result = s(:array, s(:kwarg, id).line(line)).line line + } +#endif + + f_block_kwarg: f_block_kw + | f_block_kwarg tCOMMA f_block_kw + { + list, _, item = val + result = list << item.last + } + + f_kwarg: f_kw + | f_kwarg tCOMMA f_kw + { + result = args val + } + + kwrest_mark: tPOW + | tDSTAR + +#if V >= 27 + f_no_kwarg: kwrest_mark kNIL + { + result = :"**nil" + } +#endif + + f_kwrest: kwrest_mark tIDENTIFIER + { + _, (id, line) = val + + name = id.to_sym + self.assignable [name, line] + result = [:"**#{name}", line] + } + | kwrest_mark + { + id = :"**" + self.env[id] = :lvar # TODO: needed?!? + result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno + } + +#if V == 20 + f_opt: tIDENTIFIER tEQL arg_value +#elif V == 21 + f_opt: f_norm_arg tEQL arg_value +#else + f_opt: f_arg_asgn tEQL arg_value +#endif + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + # TODO: detect duplicate names + } + +#if V == 20 + f_block_opt: tIDENTIFIER tEQL primary_value +#elif V == 21 + f_block_opt: f_norm_arg tEQL primary_value +#else + f_block_opt: f_arg_asgn tEQL primary_value +#endif + { + lhs, _, rhs = val + result = self.assignable lhs, rhs + } + + f_block_optarg: f_block_opt + { + optblk, = val + result = s(:block, optblk).line optblk.line + } + | f_block_optarg tCOMMA f_block_opt + { + optarg, _, optblk = val + result = optarg + result << optblk + } + + f_optarg: f_opt + { + opt, = val + result = s(:block, opt).line opt.line + } + | f_optarg tCOMMA f_opt + { + result = self.block_append val[0], val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + # TODO: differs from parse.y - needs tests + _, (id, line) = val + name = id.to_sym + self.assignable [name, line] + result = [:"*#{name}", line] + } + | restarg_mark + { + name = :"*" + self.env[name] = :lvar + result = [name, lexer.lineno] # FIX: tSTAR to include lineno + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + _, (id, line) = val + identifier = id.to_sym + + self.env[identifier] = :lvar + result = ["&#{identifier}".to_sym, line] + } + + opt_f_block_arg: tCOMMA f_block_arg + { + _, arg = val + result = arg + } + | + { + result = nil + } + + singleton: var_ref + | tLPAREN2 + { + lexer.lex_state = EXPR_BEG + } + expr rparen + { + result = val[2] + yyerror "Can't define single method for literals." if + result.sexp_type == :lit + } + + assoc_list: none + { + result = s(:array).line lexer.lineno + } + | assocs trailer + + assocs: assoc + | assocs tCOMMA assoc + { + list = val[0].dup + more = val[2].sexp_body + list.push(*more) unless more.empty? + result = list + result.sexp_type = :hash + } + + assoc: arg_value tASSOC arg_value + { + v1, _, v2 = val + result = s(:array, v1, v2).line v1.line + } + | tLABEL arg_value + { + label, arg = val + + lit = wrap :lit, label + result = s(:array, lit, arg).line lit.line + } +#if V >= 22 + | tSTRING_BEG string_contents tLABEL_END arg_value + { + (_, line), sym, _, value = val + + sym.sexp_type = :dsym + + result = s(:array, sym, value).line line + } +#endif + | tDSTAR arg_value + { + _, arg = val + line = arg.line + result = s(:array, s(:kwsplat, arg).line(line)).line line + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + call_op: tDOT +#if V >= 23 + | tLONELY # TODO: rename tANDDOT? +#endif + + call_op2: call_op + | tCOLON2 + + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + _, close = val + result = [close, lexer.lineno] + } + rbracket: opt_nl tRBRACK + { + _, close = val + result = [close, lexer.lineno] + } +#if V >= 27 + rbrace: opt_nl tRCURLY +#endif + trailer: | tNL | tCOMMA + + term: tSEMI { yyerrok } + | tNL + + terms: term + | terms tSEMI { yyerrok } + + none: { result = nil; } +end + +---- inner + +require "ruby_lexer" +require "ruby_parser_extras" +include RubyLexer::State::Values + +# :stopdoc: + +# Local Variables: ** +# racc-token-length-max:14 ** +# End: ** diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser_extras.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser_extras.rb new file mode 100644 index 000000000..1b446952b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser_extras.rb @@ -0,0 +1,1878 @@ +# encoding: ASCII-8BIT +# frozen_string_literal: true +# TODO: remove encoding comment + +require "sexp" +require "ruby_lexer" +require "timeout" +require "rp_extensions" +require "rp_stringscanner" + +class Sexp + def check_line_numbers + raise "bad nil line for:\n%s" % [self.pretty_inspect] if nil_line? + raise "bad line number for:\n%s" % [self.pretty_inspect] unless + Integer === self.line && + self.line >= 1 && + self.line <= self.line_min + end + + ## + # Returns the minimum line number of the children of self. + + def line_min + @line_min ||= [self.deep_each.map(&:line).min, self.line].compact.min + end + + def nil_line? + self.deep_each.map(&:line).any?(&:nil?) + end +end + +module RubyParserStuff + VERSION = "3.20.3" + + attr_accessor :lexer, :in_def, :in_single, :file, :in_argdef + attr_accessor :in_kwarg + attr_reader :env, :comments + + ## + # Canonicalize conditionals. Eg: + # + # not x ? a : b + # + # becomes: + # + # x ? b : a + + attr_accessor :canonicalize_conditions + + ## + # The last token type returned from #next_token + + attr_accessor :last_token_type + + $good20 = [] + + %w[ + ].map(&:to_i).each do |n| + $good20[n] = n + end + + def debug20 n, v = nil, r = nil + raise "not yet #{n} #{v.inspect} => #{r.inspect}" unless $good20[n] + end + + def self.deprecate old, new + define_method old do |*args| + warn "DEPRECATED: #{old} -> #{new} from #{caller.first}" + send new, *args + end + end + + ## + # for pure ruby systems only + + def do_parse + _racc_do_parse_rb(_racc_setup, false) + end if ENV["PURE_RUBY"] || ENV["CHECK_LINE_NUMS"] + + if ENV["CHECK_LINE_NUMS"] then + def _racc_do_reduce arg, act + x = super + + @racc_vstack.grep(Sexp).each do |sexp| + sexp.check_line_numbers + end + x + end + end + + ARG_TYPES = [:arglist, :call_args, :array, :args].map { |k| + [k, true] + }.to_h + + has_enc = "".respond_to? :encoding + + # This is in sorted order of occurrence according to + # charlock_holmes against 500k files, with UTF_8 forced + # to the top. + # + # Overwrite this contstant if you need something different. + ENCODING_ORDER = [ + Encoding::UTF_8, # moved to top to reflect default in 2.0 + Encoding::ISO_8859_1, + Encoding::ISO_8859_2, + Encoding::ISO_8859_9, + Encoding::SHIFT_JIS, + Encoding::WINDOWS_1252, + Encoding::EUC_JP + ] if has_enc + + JUMP_TYPE = [:return, :next, :break, :yield].map { |k| [k, true] }.to_h + + TAB_WIDTH = 8 + + def initialize(options = {}) + super() + + v = self.class.name[/[23]\d/] + raise "Bad Class name #{self.class}" unless v + + self.lexer = RubyLexer.new v && v.to_i + self.lexer.parser = self + self.in_kwarg = false + self.in_argdef = false + + @env = RubyParserStuff::Environment.new + @comments = [] + + @canonicalize_conditions = true + + self.reset + end + + def arg_concat node1, node2 # TODO: nuke + raise "huh" unless node2 + + splat = s(:splat, node2) + splat.line node2.line + + node1 << splat + end + + def argl x + x = s(:arglist, x) if x and x.sexp_type == :array + x + end + + def args args + result = s(:args) + + ss = args.grep Sexp + if ss.empty? then + result.line lexer.lineno + else + result.line ss.first.line + result.line_max = ss.first.line_max + end + + args.each do |arg| + if arg.instance_of? Array and arg.size == 2 and arg.last.is_a? Numeric then + arg = arg.first + end + + case arg + when Sexp then + case arg.sexp_type + when :args, :block, :array, :call_args then # HACK call_args mismatch + rest = arg.sexp_body + + rest.map! { |x| + if x.instance_of? Array and x.size == 2 and Numeric === x.last then + x.first + else + x + end + } + + result.concat rest + when :forward_args then + self.env[:*] = :lvar # TODO: arg_var(p, idFWD_REST) ? + self.env[:**] = :lvar + self.env[:&] = :lvar + + result << arg + when :block_arg then + result << :"&#{arg.last}" + when :shadow then + name = arg.last + self.env[name] = :lvar + if Sexp === result.last and result.last.sexp_type == :shadow then + result.last << name + else + result << arg + end + when :masgn, :block_pass, :hash then # HACK: remove. prolly call_args + result << arg + else + raise "unhandled: #{arg.sexp_type} in #{args.inspect}" + end + when Symbol then + name = arg.to_s.delete("&*") + self.env[name.to_sym] = :lvar unless name.empty? + result << arg + when true, false then + self.in_kwarg = arg + when ",", "|", ";", "(", ")", nil then + # ignore + else + raise "unhandled: #{arg.inspect} in #{args.inspect}" + end + end + + result + end + + def end_args args + lexer.lex_state = RubyLexer::State::Values::EXPR_BEG + lexer.command_start = true + self.args args + end + + def attrset_id? id + id =~ /^\[\]=$|^\w+=$/ + end + + def endless_method_name defn_or_defs + name = defn_or_defs[1] + name = defn_or_defs[2] unless Symbol === name + + if attrset_id? name then + yyerror "setter method cannot be defined in an endless method definition" + end + + # TODO? token_info_drop(p, "def", loc->beg_pos); + end + + def array_to_hash array + case array.sexp_type + when :kwsplat then + array + else + s(:hash, *array.sexp_body).line array.line + end + end + + def aryset receiver, index + index ||= s() + l = receiver.line + result = s(:attrasgn, receiver, :"[]=", + *index.sexp_body).compact # [].sexp_body => nil + result.line = l + result + end + + def assignable(lhs, value = nil) + id, line = lhs + id = id.to_sym + + result = case id + when /^@@/ then + asgn = in_def || in_single > 0 + s((asgn ? :cvasgn : :cvdecl), id) + when /^@/ then + s(:iasgn, id) + when /^\$/ then + s(:gasgn, id) + when /^[A-Z]/ then + s(:cdecl, id) + else + case self.env[id] + when :lvar, :dvar, nil then + s(:lasgn, id) + else + raise "wtf? unknown type: #{self.env[id]}" + end + end + + self.env[id] ||= :lvar if result.sexp_type == :lasgn + + result << value if value + result.line line + result + end + + def backref_assign_error ref + # TODO: need a test for this... obviously + case ref.sexp_type + when :nth_ref then + raise "write a test 2" + raise SyntaxError, "Can't set variable %p" % ref.last + when :back_ref then + raise "write a test 3" + raise SyntaxError, "Can't set back reference %p" % ref.last + else + raise "Unknown backref type: #{ref.inspect}" + end + end + + def block_append(head, tail) + return head if tail.nil? + return tail if head.nil? + + line = [head.line, tail.line].compact.min + + head = remove_begin(head) + head = s(:block, head).line(line) unless head.sexp_type == :block + + # head.line = line + head << tail + end + + def block_dup_check call_or_args, block + syntax_error "Both block arg and actual block given." if + block and call_or_args.block_pass? + end + + def block_var *args + result = self.args args + result.sexp_type = :masgn + result + end + + def call_args args + result = s(:call_args) + + a = args.grep(Sexp).first + if a then + result.line a.line + else + result.line lexer.lineno + end + + args.each do |arg| + # ruby 3.0+ TODO: next if arg in [String, Integer] # eg ["(", 1] + next if arg.class == Array && arg.map(&:class) == [String, Integer] + + case arg + when Sexp then + case arg.sexp_type + when :array, :args, :call_args then # HACK? remove array at some point + result.concat arg.sexp_body + else + result << arg + end + when Symbol then + result << arg + when Array then + id, _line = arg + result << id + when ",", nil, "(" then + # ignore + else + raise "unhandled: #{arg.inspect} in #{args.inspect}" + end + end + + result + end + + def clean_mlhs sexp + case sexp.sexp_type + when :masgn then + if sexp.size == 2 and sexp[1].sexp_type == :array then + s(:masgn, *sexp[1].sexp_body.map { |sub| clean_mlhs sub }) + else + debug20 5 + sexp + end + when :gasgn, :iasgn, :lasgn, :cvasgn then + if sexp.size == 2 then + sexp.last + else + debug20 7 + sexp # optional value + end + else + raise "unsupported type: #{sexp.inspect}" + end + end + + def cond node + return nil if node.nil? + node = value_expr node + + case node.sexp_type + when :lit then + if Regexp === node.last then + s(:match, node) + else + node + end + when :and then + _, lhs, rhs = node + s(:and, cond(lhs), cond(rhs)) + when :or then + _, lhs, rhs = node + s(:or, cond(lhs), cond(rhs)) + when :dot2 then + label = "flip#{node.hash}" + env[label] = :lvar + _, lhs, rhs = node + s(:flip2, lhs, rhs) # TODO: recurse? + when :dot3 then + label = "flip#{node.hash}" + env[label] = :lvar + _, lhs, rhs = node + s(:flip3, lhs, rhs) + else + node + end.line node.line + end + + def dedent sexp + dedent_count = dedent_size sexp + + skip_one = false + sexp.map { |obj| + case obj + when Symbol then + obj + when String then + obj.lines.map { |l| remove_whitespace_width l, dedent_count }.join + when Sexp then + case obj.sexp_type + when :evstr then + skip_one = true + obj + when :str then + _, str = obj + str = if skip_one then + skip_one = false + s1, *rest = str.lines + s1 + rest.map { |l| remove_whitespace_width l, dedent_count }.join + else + str.lines.map { |l| remove_whitespace_width l, dedent_count }.join + end + + s(:str, str).line obj.line + else + warn "unprocessed sexp %p" % [obj] + end + else + warn "unprocessed: %p" % [obj] + end + } + end + + def dedent_size sexp + skip_one = false + sexp.flat_map { |s| + case s + when Symbol then + next + when String then + s.lines + when Sexp then + case s.sexp_type + when :evstr then + skip_one = true + next + when :str then + _, str = s + lines = str.lines + if skip_one then + skip_one = false + lines.shift + end + lines + else + warn "unprocessed sexp %p" % [s] + end + else + warn "unprocessed: %p" % [s] + end.map { |l| whitespace_width l } + }.compact.min + end + + def dedent_string string, width + characters_skipped = 0 + indentation_skipped = 0 + + string.chars.each do |char| + break if indentation_skipped >= width + if char == " " + characters_skipped += 1 + indentation_skipped += 1 + elsif char == "\t" + proposed = TAB_WIDTH * (indentation_skipped / TAB_WIDTH + 1) + break if proposed > width + characters_skipped += 1 + indentation_skipped = proposed + end + end + string[characters_skipped..-1] + end + + def gettable(id) + id = id.to_sym if String === id + + result = case id.to_s + when /^@@/ then + s(:cvar, id) + when /^@/ then + s(:ivar, id) + when /^\$/ then + s(:gvar, id) + when /^[A-Z]/ then + s(:const, id) + else + type = env[id] + if type then + s(type, id) + else + new_call(nil, id) + end + end + + raise "identifier #{id.inspect} is not valid" unless result + + result + end + + def hack_encoding str, extra = nil + encodings = ENCODING_ORDER.dup + encodings.unshift(extra) unless extra.nil? + + # terrible, horrible, no good, very bad, last ditch effort. + encodings.each do |enc| + begin + str.force_encoding enc + if str.valid_encoding? then + str.encode! Encoding::UTF_8 + break + end + rescue ArgumentError # unknown encoding name + # do nothing + rescue Encoding::InvalidByteSequenceError + # do nothing + rescue Encoding::UndefinedConversionError + # do nothing + end + end + + # no amount of pain is enough for you. + raise "Bad encoding. Need a magic encoding comment." unless + str.encoding.name == "UTF-8" + end + + ## + # Returns a UTF-8 encoded string after processing BOMs and magic + # encoding comments. + # + # Holy crap... ok. Here goes: + # + # Ruby's file handling and encoding support is insane. We need to be + # able to lex a file. The lexer file is explicitly UTF-8 to make + # things cleaner. This allows us to deal with extended chars in + # class and method names. In order to do this, we need to encode all + # input source files as UTF-8. First, we look for a UTF-8 BOM by + # looking at the first line while forcing its encoding to + # ASCII-8BIT. If we find a BOM, we strip it and set the expected + # encoding to UTF-8. Then, we search for a magic encoding comment. + # If found, it overrides the BOM. Finally, we force the encoding of + # the input string to whatever was found, and then encode that to + # UTF-8 for compatibility with the lexer. + + def handle_encoding str + str = str.dup + has_enc = str.respond_to? :encoding + encoding = nil + + header = str.each_line.first(2) + header.map! { |s| s.force_encoding "ASCII-8BIT" } if has_enc + + first = header.first || "" + encoding, str = +"utf-8", str.b[3..-1] if first =~ /\A\xEF\xBB\xBF/ + + encoding = $1.strip if header.find { |s| + s[/^#.*?-\*-.*?coding:\s*([^ ;]+).*?-\*-/, 1] || + s[/^#.*(?:en)?coding(?:\s*[:=])\s*([\w-]+)/, 1] + } + + if encoding then + if has_enc then + encoding.sub!(/utf-8-.+$/, "utf-8") # HACK for stupid emacs formats + hack_encoding str, encoding + else + warn "Skipping magic encoding comment" + end + else + # nothing specified... ugh. try to encode as utf-8 + hack_encoding str if has_enc + end + + str + end + + def invert_block_call val + ret, iter = val + type, call = ret + + iter.insert 1, call + + ret = s(type).line ret.line + + [iter, ret] + end + + def inverted? val + JUMP_TYPE[val[0].sexp_type] + end + + def list_append list, item # TODO: nuke me *sigh* + return s(:array, item) unless list + list = s(:array, list) unless Sexp === list && list.sexp_type == :array + list << item + end + + def list_prepend item, list # TODO: nuke me *sigh* + list = s(:array, list) unless Sexp === list && list.sexp_type == :array + list.insert 1, item + list + end + + def literal_concat head, tail # TODO: ugh. rewrite + return tail unless head + return head unless tail + + htype, ttype = head.sexp_type, tail.sexp_type + + head = s(:dstr, "", head).line head.line if htype == :evstr + + case ttype + when :str then + if htype == :str + a, b = head.last, tail.last + b = b.dup.force_encoding a.encoding unless Encoding.compatible?(a, b) + a << b + elsif htype == :dstr and head.size == 2 then + head.last << tail.last + else + head << tail + end + when :dstr then + if htype == :str then + lineno = head.line + tail[1] = head.last + tail[1] + head = tail + head.line = lineno + else + tail.sexp_type = :array + tail[1] = s(:str, tail[1]).line tail.line + tail.delete_at 1 if tail[1] == s(:str, "") + + head.push(*tail.sexp_body) + end + when :evstr then + if htype == :str then + f, l = head.file, head.line + head = s(:dstr, *head.sexp_body) + head.file = f + head.line = l + end + + if head.size == 2 and tail.size > 1 and tail[1].sexp_type == :str then + head.last << tail[1].last + head.sexp_type = :str if head.size == 2 # HACK ? + else + head.push(tail) + end + else + x = [head, tail] + raise "unknown type: #{x.inspect}" + end + + return head + end + + def local_pop in_def + lexer.cond.pop # group = local_pop + lexer.cmdarg.pop + self.env.unextend + self.in_def = in_def + end + + def logical_op type, left, right + left = value_expr left + + if left and left.sexp_type == type and not left.paren then + node, rhs = left, nil + + loop do + _, _lhs, rhs = node + break unless rhs && rhs.sexp_type == type and not rhs.paren + node = rhs + end + + node.pop + node << s(type, rhs, right).line(rhs.line) + + return left + end + + result = s(type, left, right) + result.line left.line if left.line + result + end + + def new_aref val + val[2] ||= s(:arglist) + val[2].sexp_type = :arglist if val[2].sexp_type == :array # REFACTOR + new_call val[0], :"[]", val[2] + end + + def new_arg val + arg, = val + + case arg + when Symbol then + result = s(:args, arg).line line + when Sexp then + result = arg + when Array then + (arg, line), = val + result = s(:args, arg).line line + else + debug20 32 + raise "Unknown f_arg type: #{val.inspect}" + end + + result + end + + def ary_to_pat ary + pat = ary.dup + pat.sexp_type = :array_TAIL + + new_array_pattern nil, nil, pat, ary.line + end + + def new_array_pattern const, pre_arg, arypat, loc + result = s(:array_pat, const).line loc + result << pre_arg if pre_arg + + if arypat && arypat.sexp_type == :array_TAIL then + result.concat arypat.sexp_body + else + raise "NO?: %p" % [arypat] + end + + result + end + + def array_pat_concat lhs, rhs + case lhs.sexp_type + when :PATTERN then + lhs.sexp_type = :array_pat + end + + if rhs then + case rhs.sexp_type + when :array_pat, :array_TAIL, :PATTERN then + lhs.concat rhs.sexp_body + else + lhs << rhs + end + end + end + + def new_array_pattern_tail pre_args, has_rest, rest_arg, post_args + # TODO: remove has_rest once all tests pass !!! + rest_arg = if has_rest then + :"*#{rest_arg}" + else + nil + end + + result = s(:array_TAIL).line 666 + + array_pat_concat result, pre_args + + result << rest_arg if rest_arg + + array_pat_concat result, post_args + + result + end + + def new_assign lhs, rhs + return nil unless lhs + + rhs = value_expr rhs + + case lhs.sexp_type + when :lasgn, :iasgn, :cdecl, :cvdecl, :gasgn, :cvasgn, :attrasgn, :safe_attrasgn then + lhs << rhs + lhs.line_max = rhs.line_max + when :const then + lhs.sexp_type = :cdecl + lhs << rhs + else + raise "unknown lhs #{lhs.inspect} w/ #{rhs.inspect}" + end + + lhs + end + + def new_attrasgn recv, meth, call_op = :"." + call_op = call_op.first if Array === call_op + + meth = :"#{meth}=" + + result = case call_op.to_sym + when :"." + s(:attrasgn, recv, meth) + when :"&." + s(:safe_attrasgn, recv, meth) + else + raise "unknown call operator: `#{type.inspect}`" + end + + result.line = recv.line + result + end + + def new_begin val + (_, line), _, body, _ = val + + result = body ? s(:begin, body) : s(:nil) + result.line line + + result + end + + def new_body val + body, resbody, elsebody, ensurebody = val + + result = body + + if resbody then + result = s(:rescue) + result << body if body + + res = resbody + + while res do + result << res + res = res.resbody(true) + end + + result << elsebody if elsebody + + result.line = (body || resbody).line + end + + if elsebody and not resbody then + warning("else without rescue is useless") + result = s(:begin, result).line result.line if result + result = block_append(result, elsebody) + end + + if ensurebody + lineno = (result || ensurebody).line + result = s(:ensure, result, ensurebody).compact.line lineno + end + + result + end + + def new_brace_body args, body, lineno + new_iter(nil, args, body).line lineno + end + + def new_call recv, meth, args = nil, call_op = :"." + call_op = call_op.first if Array === call_op + + result = case call_op.to_sym + when :"." + s(:call, recv, meth) + when :"&." + s(:safe_call, recv, meth) + else + raise "unknown call operator: `#{type.inspect}`" + end + + # TODO: need a test with f(&b) to produce block_pass + # TODO: need a test with f(&b) { } to produce warning + + if args then + if ARG_TYPES[args.sexp_type] then + result.concat args.sexp_body + else + result << args + end + result.line_max = args.line_max + end + + # line = result.grep(Sexp).map(&:line).compact.min + result.line = recv.line if recv + result.line ||= lexer.lineno + + result + end + + def new_in pat, body, cases, line + s(:in, pat, body, cases).line line + end + + def new_case expr, body, line + result = s(:case, expr) + + while body and [:when, :in].include? body.sexp_type + result << body + body = body.delete_at 3 + end + + result[2..-1].each do |node| + block = node.block(:delete) + node.concat block.sexp_body if block + end + + # else + body = nil if body == s(:block) + result << body + + result.line = line + result + end + + def new_class val + (_, line), path, superclass, _, body, (_, line_max) = val + + path = path.first if path.instance_of? Array + + result = s(:class, path, superclass) + + if body then + if body.sexp_type == :block then + result.push(*body.sexp_body) + else + result.push body + end + end + + result.line = line + result.line_max = line_max + result.comments = self.comments.pop + result + end + + def new_compstmt val + result = void_stmts(val.grep(Sexp)[0]) + result = remove_begin(result) if result + result + end + + def new_const_op_asgn val + lhs, (asgn_op, _), rhs = val + asgn_op = asgn_op.to_sym + + result = case asgn_op + when :"||" then + s(:op_asgn_or, lhs, rhs) + when :"&&" then + s(:op_asgn_and, lhs, rhs) + else + s(:op_asgn, lhs, asgn_op, rhs) + end + + result.line = lhs.line + result + end + + def new_defn val + _, (name, line), in_def, args, body, (_, line_max) = val + + body ||= s(:nil).line line + + args.line line + + result = s(:defn, name.to_sym, args).line line + result.line_max = line_max + + if body.sexp_type == :block then + result.push(*body.sexp_body) + else + result.push body + end + + result.comments = self.comments.pop + + [result, in_def] + end + + def new_endless_defn val + (name, line, in_def), args, _, body, _, resbody = val + + result = + if resbody then + s(:defn, name, args, + new_rescue(body, + new_resbody(s(:array).line(line), + resbody))).line line + else + s(:defn, name, args, body).line line + end + + local_pop in_def + endless_method_name result + + result.comments = self.comments.pop + + result + end + + def new_endless_defs val + (recv, (name, line, in_def)), args, _, body, _, resbody = val + + result = + if resbody then + s(:defs, recv, name, args, + new_rescue(body, + new_resbody(s(:array).line(line), + resbody))).line line + else + s(:defs, recv, name, args, body).line(line) + end + + self.in_single -= 1 + local_pop in_def + endless_method_name result + + result.comments = self.comments.pop + + result + end + + def new_defs val + _, recv, (name, line), in_def, args, body, (_, line_max) = val + + body ||= s(:nil).line line + + args.line line + + result = s(:defs, recv, name.to_sym, args).line line + result.line_max = line_max + + # TODO: remove_begin + # TODO: reduce_nodes + + if body.sexp_type == :block then + result.push(*body.sexp_body) + else + result.push body + end + + result.comments = self.comments.pop + + [result, in_def] + end + + def new_do_body args, body, lineno + new_iter(nil, args, body).line(lineno) + end + + def new_find_pattern const, pat + pat.sexp_type = :find_pat + pat.insert 1, const + end + + def new_find_pattern_tail lhs, mid, rhs + lhs_id, line = lhs + rhs_id, _line = rhs + + # TODO: fpinfo->pre_rest_arg = pre_rest_arg ? assignable(p, pre_rest_arg, 0, loc) : NODE_SPECIAL_NO_NAME_REST; + + lhs_id = "*#{lhs_id}".to_sym + rhs_id = "*#{rhs_id}".to_sym + + raise "BAD?" unless mid.sexp_type == :array_TAIL + + s(:find_pat_TAIL, lhs_id, *mid.sexp_body, rhs_id).line line + end + + def new_for expr, var, body + result = s(:for, expr, var).line(var.line) + result << body if body + result + end + + def new_hash val + _, line, assocs = val + + s(:hash).line(line).concat assocs.sexp_body + end + + def new_hash_pattern const, hash_pat, loc + _, pat, kw_args, kw_rest_arg = hash_pat + + line = (const||hash_pat).line + + result = s(:hash_pat, const).line line + result.concat pat.sexp_body if pat + result << kw_args if kw_args + result << kw_rest_arg if kw_rest_arg + result + end + + def new_hash_pattern_tail kw_args, kw_rest_arg, line # TODO: remove line arg + # kw_rest_arg = assignable(kw_rest_arg, nil).line line if kw_rest_arg + + result = s(:hash_pat).line line + result << kw_args + + if kw_rest_arg then + name = kw_rest_arg.value + # TODO: I _hate_ this: + assignable [name, kw_rest_arg.line] if name != :** + result << kw_rest_arg + end + + result + end + + def push_pktbl + end + + def pop_pktbl + end + + def push_pvtbl + end + + def pop_pvtbl + end + + def new_if c, t, f + l = [c.line, t && t.line, f && f.line].compact.min + c = cond c + c, t, f = c.last, f, t if c.sexp_type == :not and canonicalize_conditions + s(:if, c, t, f).line(l) + end + + def new_iter call, args, body + body ||= nil + + args ||= s(:args) + args = s(:args, args) if Symbol === args + + result = s(:iter) + result << call if call + result << args + result << body if body + + result.line call.line if call + + unless args == 0 then + args.line call.line if call + args.sexp_type = :args + end + + result + end + + def new_masgn lhs, rhs, wrap = false + _, ary = lhs + + line = rhs.line + rhs = value_expr(rhs) + rhs = ary ? s(:to_ary, rhs) : s(:array, rhs) if wrap + rhs.line line if wrap + + lhs.delete_at 1 if ary.nil? + lhs << rhs + + lhs + end + + def new_masgn_arg rhs, wrap = false + rhs = value_expr(rhs) + # HACK: could be array if lhs isn't right + rhs = s(:to_ary, rhs).line rhs.line if wrap + rhs + end + + def new_match lhs, rhs + if lhs then + case lhs.sexp_type + when :dregx, :dregx_once then + # TODO: no test coverage + return s(:match2, lhs, rhs).line(lhs.line) + when :lit then + return s(:match2, lhs, rhs).line(lhs.line) if Regexp === lhs.last + end + end + + if rhs then + case rhs.sexp_type + when :dregx, :dregx_once then + # TODO: no test coverage + return s(:match3, rhs, lhs).line(lhs.line) + when :lit then + return s(:match3, rhs, lhs).line(lhs.line) if Regexp === rhs.last + end + end + + new_call(lhs, :"=~", argl(rhs)).line lhs.line + end + + def new_module val + (_, line_min), path, _, body, (_, line_max) = val + + path = path.first if path.instance_of? Array + + result = s(:module, path).line line_min + result.line_max = line_max + + if body then # REFACTOR? + if body.sexp_type == :block then + result.push(*body.sexp_body) + else + result.push body + end + end + + result.comments = self.comments.pop + result + end + + def new_op_asgn val + lhs, (op, _line), rhs = val + op = op.to_sym + + name = gettable(lhs.last).line lhs.line + arg = remove_begin rhs + result = case op # REFACTOR + when :"||" then + lhs << arg + s(:op_asgn_or, name, lhs).line lhs.line + when :"&&" then + lhs << arg + s(:op_asgn_and, name, lhs).line lhs.line + else + lhs << new_call(name, op, argl(arg)) + lhs + end + + result + end + + def new_op_asgn1 val + lhs, _, args, _, (op, _), rhs = val + + args.sexp_type = :arglist if args + + result = s(:op_asgn1, lhs, args, op.to_sym, rhs) + result.line lhs.line + result + end + + def new_op_asgn2 val + recv, (call_op, _), (meth, _), (op, _), arg = val + meth = :"#{meth}=" + + result = case call_op.to_sym + when :"." + s(:op_asgn2, recv, meth, op.to_sym, arg) + when :"&." + s(:safe_op_asgn2, recv, meth, op.to_sym, arg) + else + raise "unknown call operator: `#{type.inspect}`" + end + + result.line = recv.line + result + end + + def new_qsym_list + s(:array).line lexer.lineno + end + + def new_qsym_list_entry val + _, (str, line), _ = val + s(:lit, str.to_sym).line line + end + + def new_qword_list + s(:array).line lexer.lineno + end + + def new_qword_list_entry val + _, (str, line), _ = val + str.force_encoding("ASCII-8BIT") unless str.valid_encoding? + s(:str, str).line line + end + + def new_regexp val + (_, line), node, (options, line_max) = val + + node ||= s(:str, "").line line + node.line_max = line_max + + o, k = 0, nil + options.split(//).uniq.each do |c| # FIX: this has a better home + v = { + "x" => Regexp::EXTENDED, + "i" => Regexp::IGNORECASE, + "m" => Regexp::MULTILINE, + "o" => Regexp::ONCE, + "n" => Regexp::ENC_NONE, + "e" => Regexp::ENC_EUC, + "s" => Regexp::ENC_SJIS, + "u" => Regexp::ENC_UTF8, + }[c] + raise "unknown regexp option: #{c}" unless v + o += v + end + + case node.sexp_type + when :str then + node.sexp_type = :lit + node[1] = if k then + Regexp.new(node[1], o, k) + else + begin + Regexp.new(node[1], o) + rescue RegexpError => e + warn "WARNING: #{e.message} for #{node[1].inspect} #{options.inspect}" + begin + warn "WARNING: trying to recover with ENC_UTF8" + Regexp.new(node[1], Regexp::ENC_UTF8) + rescue RegexpError => e + warn "WARNING: trying to recover with ENC_NONE" + Regexp.new(node[1], Regexp::ENC_NONE) + end + end + end + when :dstr then + if options =~ /o/ then + node.sexp_type = :dregx_once + else + node.sexp_type = :dregx + end + node << o if o and o != 0 + else + node = s(:dregx, "", node).line line + node.sexp_type = :dregx_once if options =~ /o/ + node << o if o and o != 0 + end + + node + end + + def new_resbody cond, body + if body && body.sexp_type == :block then + body.shift # remove block and splat it in directly + else + body = [body] + end + + s(:resbody, cond, *body).line cond.line + end + + def new_rescue body, resbody + s(:rescue, body, resbody).line body.line + end + + def new_sclass val + (_, line), _, recv, in_def, _, in_single, body, _ = val + + result = s(:sclass, recv) + + if body then + if body.sexp_type == :block then + result.push(*body.sexp_body) + else + result.push body + end + end + + result.line = line + self.in_def = in_def + self.in_single = in_single + result + end + + def new_string val + (str, line), = val + + str.force_encoding("UTF-8") + # TODO: remove: + str.force_encoding("ASCII-8BIT") unless str.valid_encoding? + s(:str, str).line line + end + + def new_super args + if args && args.sexp_type == :block_pass then + s(:super, args).line args.line + else + args ||= s(:arglist).line lexer.lineno + s(:super, *args.sexp_body).line args.line + end + end + + def new_symbol val + name = val.last + s(:lit, name.to_sym).line lexer.lineno + end + + def new_symbol_list + # TODO: hunt down and try to remove ALL lexer.lineno usage! + s(:array).line lexer.lineno + end + + def new_symbol_list_entry val + _, sym, _ = val + + sym ||= s(:str, "").line lexer.lineno + + case sym.sexp_type + when :dstr then + sym.sexp_type = :dsym + when :str then + sym = s(:lit, sym.last.to_sym).line sym.line + else + sym = s(:dsym, "", sym).line sym.line + end + + sym + end + + def new_undef n, m = nil + if m then + block_append(n, s(:undef, m).line(m.line)) + else + s(:undef, n).line n.line + end + end + + def new_until block, expr, pre + new_until_or_while :until, block, expr, pre + end + + def new_until_or_while type, block, expr, pre + other = type == :until ? :while : :until + line = [block && block.line, expr.line].compact.min + block, pre = block.last, false if block && block.sexp_type == :begin + + expr = cond expr + + result = unless expr.sexp_type == :not and canonicalize_conditions then + s(type, expr, block, pre) + else + s(other, expr.last, block, pre) + end + + result.line = line + result + end + + def new_when cond, body + s(:when, cond, body) + end + + def new_while block, expr, pre + new_until_or_while :while, block, expr, pre + end + + def new_word_list + s(:array).line lexer.lineno + end + + def new_word_list_entry val + _, word, _ = val + word.sexp_type == :evstr ? s(:dstr, "", word).line(word.line) : word + end + + def new_xstring val + _, node = val + + node ||= s(:str, "").line lexer.lineno + + if node then + case node.sexp_type + when :str + node.sexp_type = :xstr + when :dstr + node.sexp_type = :dxstr + else + node = s(:dxstr, "", node).line node.line + end + end + + node + end + + def new_yield args = nil + # TODO: raise args.inspect unless [:arglist].include? args.first # HACK + raise "write a test 4" if args && args.sexp_type == :block_pass + raise SyntaxError, "Block argument should not be given." if + args && args.sexp_type == :block_pass + + args ||= s(:arglist).line lexer.lineno + + args.sexp_type = :arglist if [:call_args, :array].include? args.sexp_type + args = s(:arglist, args).line args.line unless args.sexp_type == :arglist + + s(:yield, *args.sexp_body).line args.line + end + + def prev_value_to_lineno v + s, n = v + if String === s then + n + else + lexer.lineno + end + end + + def next_token + token = self.lexer.next_token + + if token and token.first != RubyLexer::EOF then + self.last_token_type = token + return token + elsif !token + return self.lexer.next_token + else + return [false, false] + end + end + + def on_error(et, ev, values) + ev = ev.first if ev.instance_of?(Array) && ev.size == 2 && ev.last.is_a?(Integer) + super + rescue Racc::ParseError => e + # I don't like how the exception obscures the error message + e.message.replace "%s:%p :: %s" % [self.file, lexer.lineno, e.message.strip] + warn e.message if $DEBUG + raise + end + + ## + # Parse +str+ at path +file+ and return a sexp. Raises + # Timeout::Error if it runs for more than +time+ seconds. + + def process(str, file = "(string)", time = 10) + str.freeze + + Timeout.timeout time do + raise "bad val: #{str.inspect}" unless String === str + + self.lexer.string = handle_encoding str + + self.file = file.dup + + @yydebug = ENV.has_key? "DEBUG" + + do_parse + end + end + + alias parse process + + def remove_begin node + line = node.line + + node = node.last while node and node.sexp_type == :begin and node.size == 2 + + node = s(:nil) if node == s(:begin) + + node.line ||= line + + node + end + + alias value_expr remove_begin # TODO: for now..? could check the tree, but meh? + + def reset + lexer.reset + self.in_def = false + self.in_single = 0 + self.env.reset + self.comments.clear + self.last_token_type = nil + end + + def ret_args node + if node then + raise "write a test 5" if node.sexp_type == :block_pass + + raise SyntaxError, "block argument should not be given" if + node.sexp_type == :block_pass + + node.sexp_type = :array if node.sexp_type == :call_args + node = node.last if node.sexp_type == :array && node.size == 2 + + # HACK matz wraps ONE of the FOUR splats in a newline to + # distinguish. I use paren for now. ugh + node = s(:svalue, node).line node.line if node.sexp_type == :splat and not node.paren + node.sexp_type = :svalue if node.sexp_type == :arglist && node[1].sexp_type == :splat + end + + node + end + + def s(*args) + result = Sexp.new(*args) + # result.line ||= lexer.lineno if lexer.ss unless ENV["CHECK_LINE_NUMS"] # otherwise... + result.file = self.file + result + end + + def debug n + if ENV["PRY"] then + require "pry"; binding.pry + end + + raise RubyParser::SyntaxError, "debug #{n}" + end + + def syntax_error msg + raise RubyParser::SyntaxError, msg + end + + alias yyerror syntax_error + + def void_stmts node + return nil unless node + return node unless node.sexp_type == :block + + if node.respond_to? :sexp_body= then + node.sexp_body = node.sexp_body.map { |n| remove_begin n } + else + node[1..-1] = node[1..-1].map { |n| remove_begin(n) } + end + + node + end + + def warning s + # do nothing for now + end + + def whitespace_width line, remove_width = nil + col = 0 + idx = 0 + + line.chars.each do |c| + break if remove_width && col >= remove_width + case c + when " " then + col += 1 + when "\t" then + n = TAB_WIDTH * (col / TAB_WIDTH + 1) + break if remove_width && n > remove_width + col = n + else + break + end + idx += 1 + end + + if remove_width then + line[idx..-1] + elsif line[idx] == "\n" + nil + else + col + end + end + + alias remove_whitespace_width whitespace_width + + def wrap type, node + value, line = node + value = value.to_sym if value.respond_to? :to_sym + s(type, value).line line + end + + class Keyword + include RubyLexer::State::Values + + class KWtable + attr_accessor :name, :state, :id0, :id1 + def initialize(name, id=[], state=nil) + @name = name + @id0, @id1 = id + @state = state + end + end + + ## + # :stopdoc: + # + # :expr_beg = ignore newline, +/- is a sign. + # :expr_end = newline significant, +/- is an operator. + # :expr_endarg = ditto, and unbound braces. + # :expr_endfn = ditto, and unbound braces. + # :expr_arg = newline significant, +/- is an operator. + # :expr_cmdarg = ditto + # :expr_mid = ditto + # :expr_fname = ignore newline, no reserved words. + # :expr_dot = right after . or ::, no reserved words. + # :expr_class = immediate after class, no here document. + # :expr_label = flag bit, label is allowed. + # :expr_labeled = flag bit, just after a label. + # :expr_fitem = symbol literal as FNAME. + # :expr_value = :expr_beg -- work to remove. Need multi-state support. + + expr_woot = EXPR_FNAME|EXPR_FITEM + + wordlist = [ + ["alias", [:kALIAS, :kALIAS ], expr_woot ], + ["and", [:kAND, :kAND ], EXPR_BEG ], + ["begin", [:kBEGIN, :kBEGIN ], EXPR_BEG ], + ["break", [:kBREAK, :kBREAK ], EXPR_MID ], + ["case", [:kCASE, :kCASE ], EXPR_BEG ], + ["class", [:kCLASS, :kCLASS ], EXPR_CLASS ], + ["def", [:kDEF, :kDEF ], EXPR_FNAME ], + ["defined?", [:kDEFINED, :kDEFINED ], EXPR_ARG ], + ["do", [:kDO, :kDO ], EXPR_BEG ], + ["else", [:kELSE, :kELSE ], EXPR_BEG ], + ["elsif", [:kELSIF, :kELSIF ], EXPR_BEG ], + ["end", [:kEND, :kEND ], EXPR_END ], + ["ensure", [:kENSURE, :kENSURE ], EXPR_BEG ], + ["false", [:kFALSE, :kFALSE ], EXPR_END ], + ["for", [:kFOR, :kFOR ], EXPR_BEG ], + ["if", [:kIF, :kIF_MOD ], EXPR_BEG ], + ["in", [:kIN, :kIN ], EXPR_BEG ], + ["module", [:kMODULE, :kMODULE ], EXPR_BEG ], + ["next", [:kNEXT, :kNEXT ], EXPR_MID ], + ["nil", [:kNIL, :kNIL ], EXPR_END ], + ["not", [:kNOT, :kNOT ], EXPR_ARG ], + ["or", [:kOR, :kOR ], EXPR_BEG ], + ["redo", [:kREDO, :kREDO ], EXPR_END ], + ["rescue", [:kRESCUE, :kRESCUE_MOD ], EXPR_MID ], + ["retry", [:kRETRY, :kRETRY ], EXPR_END ], + ["return", [:kRETURN, :kRETURN ], EXPR_MID ], + ["self", [:kSELF, :kSELF ], EXPR_END ], + ["super", [:kSUPER, :kSUPER ], EXPR_ARG ], + ["then", [:kTHEN, :kTHEN ], EXPR_BEG ], + ["true", [:kTRUE, :kTRUE ], EXPR_END ], + ["undef", [:kUNDEF, :kUNDEF ], expr_woot ], + ["unless", [:kUNLESS, :kUNLESS_MOD ], EXPR_BEG ], + ["until", [:kUNTIL, :kUNTIL_MOD ], EXPR_BEG ], + ["when", [:kWHEN, :kWHEN ], EXPR_BEG ], + ["while", [:kWHILE, :kWHILE_MOD ], EXPR_BEG ], + ["yield", [:kYIELD, :kYIELD ], EXPR_ARG ], + ["BEGIN", [:klBEGIN, :klBEGIN ], EXPR_END ], + ["END", [:klEND, :klEND ], EXPR_END ], + ["__FILE__", [:k__FILE__, :k__FILE__ ], EXPR_END ], + ["__LINE__", [:k__LINE__, :k__LINE__ ], EXPR_END ], + ["__ENCODING__", [:k__ENCODING__, :k__ENCODING__], EXPR_END], + ].map { |args| + KWtable.new(*args) + } + + # :startdoc: + + WORDLIST = Hash[*wordlist.map { |o| [o.name, o] }.flatten] + + def self.keyword str + WORDLIST[str] + end + end + + class Environment + attr_reader :env, :dyn + + def [] k + self.all[k] + end + + def []= k, v + raise "no" if v == true + self.current[k] = v + end + + def all + idx = @dyn.index(false) || 0 + @env[0..idx].reverse.inject { |env, scope| env.merge scope } + end + + def current + @env.first + end + + def extend dyn = false + @dyn.unshift dyn + @env.unshift({}) + end + + def initialize dyn = false + @dyn = [] + @env = [] + self.reset + end + + def reset + @dyn.clear + @env.clear + self.extend + end + + def unextend + @dyn.shift + @env.shift + raise "You went too far unextending env" if @env.empty? + end + end + + class StackState + attr_reader :name + attr_reader :stack + attr_accessor :debug + + def initialize name, debug=false + @name = name + @stack = [false] + @debug = debug + end + + def inspect + "StackState(#{@name}, #{@stack.inspect})" + end + + def is_in_state + log :is_in_state if debug + @stack.last + end + + def lexpop + raise if @stack.size == 0 + a = @stack.pop + b = @stack.pop + @stack.push(a || b) + log :lexpop if debug + end + + def log action + c = caller[1] + c = caller[2] if c =~ /expr_result/ + warn "%s_stack.%s: %p at %s" % [name, action, @stack, c.clean_caller] + nil + end + + def pop + r = @stack.pop + @stack.push false if @stack.empty? + log :pop if debug + r + end + + def push val + @stack.push val + log :push if debug + end + + def reset + @stack = [false] + log :reset if debug + end + + def restore oldstate + @stack.replace oldstate + log :restore if debug + end + + def store base = false + result = @stack.dup + @stack.replace [base] + log :store if debug + result + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/tools/munge.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/tools/munge.rb new file mode 100755 index 000000000..dc7827cc5 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/tools/munge.rb @@ -0,0 +1,256 @@ +#!/usr/bin/env ruby -ws + +$v ||= false + +stack = [] +last_token = nil +reduce_line = nil + +def munge s + renames = [ + "'='", "tEQL", + "'!'", "tBANG", + "'%'", "tPERCENT", + "'&'", "tAMPER2", + "'('", "tLPAREN2", + "')'", "tRPAREN", + "'*'", "tSTAR2", + "'+'", "tPLUS", + "','", "tCOMMA", + "'-'", "tMINUS", + "'.'", "tDOT", + "'/'", "tDIVIDE", + "';'", "tSEMI", + "':'", "tCOLON", + "'<'", "tLT", + "'>'", "tGT", + "'?'", "tEH", + "'['", "tLBRACK", + "'\\n'", "tNL", + "']'", "tRBRACK", + "'^'", "tCARET", + "'`'", "tBACK_REF2", + "'{'", "tLCURLY", + "'|'", "tPIPE", + "'}'", "tRCURLY", + "'~'", "tTILDE", + '"["', "tLBRACK", + + # 2.0 changes? + '"<=>"', "tCMP", + '"=="', "tEQ", + '"==="', "tEQQ", + '"!~"', "tNMATCH", + '"=~"', "tMATCH", + '">="', "tGEQ", + '"<="', "tLEQ", + '"!="', "tNEQ", + '"<<"', "tLSHFT", + '">>"', "tRSHFT", + '"*"', "tSTAR", + + '".."', "tDOT2", + + '"&"', "tAMPER", + '"&&"', "tANDOP", + '"&."', "tLONELY", + '"||"', "tOROP", + + '"..."', "tDOT3", + '"**"', "tPOW", + '"unary+"', "tUPLUS", + '"unary-"', "tUMINUS", + '"[]"', "tAREF", + '"[]="', "tASET", + '"::"', "tCOLON2", + '"{ arg"', "tLBRACE_ARG", + '"( arg"', "tLPAREN_ARG", + '"("', "tLPAREN", + 'rparen', "tRPAREN", + '"{"', "tLBRACE", + '"=>"', "tASSOC", + '"->"', "tLAMBDA", + '":: at EXPR_BEG"', "tCOLON3", + '"**arg"', "tDSTAR", + '","', "tCOMMA", + + # other + + 'kTERMINATOR', "tSTRING_END", + '"kTERMINATOR"', "tSTRING_END", + 'kTRCURLY', "tSTRING_DEND", + + '"symbol literal"', "tSYMBEG", + '"string literal"', "tSTRING_BEG", + '"backtick literal"', "tXSTRING_BEG", + '"regexp literal"', "tREGEXP_BEG", + '"word list"', "tWORDS_BEG", + '"verbatim word list"', "tQWORDS_BEG", + '"symbol list"', "tSYMBOLS_BEG", + '"verbatim symbol list"', "tQSYMBOLS_BEG", + '"terminator"', "tSTRING_END", + '"\'}\'"', "tSTRING_DEND", + + '"string literal"',"tSTRING_BEG", + '"literal content"', "tSTRING_CONTENT", + /\$/, "", # try to remove these lumps? + + 'tLBRACK2', "tLBRACK", # HACK + + "' '", "tSPACE", # needs to be later to avoid bad hits + + "/* empty */", "none", + /^\s*$/, "", + + "keyword_BEGIN", "klBEGIN", + "keyword_END", "klEND", + /keyword_(\w+)/, proc { "k#{$1.upcase}" }, + /\bk_([a-z_]+)/, proc { "k#{$1.upcase}" }, + /modifier_(\w+)/, proc { "k#{$1.upcase}_MOD" }, + "kVARIABLE", "keyword_variable", # ugh + "tCONST", "kCONST", + + # 2.6 collapses klBEGIN to kBEGIN + "klBEGIN", "kBEGIN", + "klEND", "kEND", + + /keyword_(\w+)/, proc { "k#{$1.upcase}" }, + /\bk_([^_][a-z_]+)/, proc { "k#{$1.upcase}" }, + /modifier_(\w+)/, proc { "k#{$1.upcase}_MOD" }, + + "kVARIABLE", "keyword_variable", # ugh: this is a rule name + + # UGH + "k_LINE__", "k__LINE__", + "k_FILE__", "k__FILE__", + "k_ENCODING__", "k__ENCODING__", + + '"defined?"', "kDEFINED", + + "<none>", "none", + + '"do (for condition)"', "kDO_COND", + '"do (for lambda)"', "kDO_LAMBDA", + '"do (for block)"', "kDO_BLOCK", + '"local variable or method"', "tIDENTIFIER", + + /\"(\w+) \(modifier\)\"/, proc { |x| "k#{$1.upcase}_MOD" }, + /\"(\w+)\"/, proc { |x| "k#{$1.upcase}" }, + /\"`(\w+)'\"/, proc { |x| "k#{$1.upcase}" }, + + /@(\d+)(\s+|$)/, "", + /\$?@(\d+) */, "", # TODO: remove? + + /_EXPR/, "", + ] + + renames.each_slice(2) do |(a, b)| + if Proc === b then + s.gsub!(a, &b) + else + s.gsub!(a, b) + end + end + + if s.empty? then + nil + else + s.strip.squeeze " " + end +end + +ARGF.each_line do |line| + case line + when /^(Stack now|Entering state|Shifting|Cleanup|Starting)/ then + # do nothing + when /^vtable_/ then + # do nothing + when /Gem::MissingSpecError/ then + # do nothing -- ruby 2.5 is being bitchy? + when /^Reading a token: Next token is token (.*?) \(\)/ then + token = munge $1 + next if last_token == token + puts "next token is %p" % [token] + last_token = token + when /^Reading a token: / then + next # skip + when /^Reading a token$/ then # wtf? + next # skip + when /^(?:add_delayed_token|parser_dispatch)/ then # dunno what this is yet + next # skip + when /^read\s+:(\w+)/ then # read :tNL(tNL) nil + token = munge $1 + next if last_token == token + puts "next token is %p" % [token] + last_token = token + when /^Next token is token ("[^"]+"|\S+)/ then + token = munge $1 + next if last_token == token + puts "next token is %p" % [token] + last_token = token + when /^read\s+false/ then # read false($end) "$end" + puts "next token is EOF" + when /^Now at end of input./ then + # do nothing + when /^.:scan=>\["([^"]+)"/ then + puts "scan = %p" % [$1] + when /^.:getch=>\["([^"]+)/ then + puts "SCAN = %p" % [$1] + when /^Reducing stack by rule (\d+) \(line (\d+)\):/ then + reduce_line = $2.to_i + when /^ \$\d+ = (?:token|nterm) (.+) \(.*\)/ then + item = $1 + stack << munge(item) + when /^-> \$\$ = (?:token|nterm) (.+) \(.*\)/ then + stack << "none" if stack.empty? + item = munge $1 + x = stack.compact.map { |s| munge s.strip }.compact.join " " + if x != item then # prevent kdef -> kdef + if $v && reduce_line then + puts "reduce #{x} --> #{item} at #{reduce_line}".squeeze " " + else + puts "reduce #{x} --> #{item}".squeeze " " + end + puts + end + reduce_line = nil + stack.clear + when /^reduce/ then # ruby_parser side + s = munge line.chomp + next if s =~ /reduce\s+(\w+) --> \1/ + puts s + puts + when /^(\w+_stack)\.(\w+)/ then + # TODO: make pretty, but still informative w/ line numbers etc + puts line.gsub("true", "1").gsub("false", "0") + # puts "#{$1}(#{$2})" + when /^(\w+_stack(\(\w+\))?: \S+)/ then + # _data = $v ? line.chomp : $1 + # puts line + # TODO: make pretty, but still informative w/ line numbers etc + puts line.gsub("true", "1").gsub("false", "0") + when /^lex_state: :?([\w|()]+) -> :?([\w|]+)(?: (?:at|from) (.*))?/ then + a, b, c = $1.upcase, $2.upcase, $3 + a.gsub!(/EXPR_/, "") + b.gsub!(/EXPR_/, "") + if c && $v then + puts "lex_state: #{a} -> #{b} at #{c}" + else + puts "lex_state: #{a} -> #{b}" + end + when /debug|FUCK/ then + puts line.chomp + when /^(#.*parse error|on )/ then + puts line.chomp + when /^(goto|shift| +\[|$)/ then # racc + # do nothing + # when /^Reading a token: Now at end of input./ then + # # puts "EOF" + # when /^Reading a token: Next token is token (.+)/ then + # puts "READ: #{$1.inspect}" + when /^accept/ then + puts "DONE" + else + puts "unparsed: #{line.chomp}" + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/tools/ripper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/tools/ripper.rb new file mode 100755 index 000000000..80d48924b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/tools/ripper.rb @@ -0,0 +1,46 @@ +#!/usr/bin/env ruby -ws + +$b ||= false # bug mode -- ripper is buggy, use Ripper.sexp +$d ||= false # debug -- turn on yydebug +$p ||= false # Use pp + +require "ripper/sexp" +require "pp" if $p + +if ARGV.empty? then + warn "reading from stdin" + ARGV << "-" +end + +class MySexpBuilder < Ripper::SexpBuilderPP + def on_parse_error msg + Kernel.warn msg + end +end + +ARGV.each do |path| + src = path == "-" ? $stdin.read : File.read(path) + + sexp = nil + + if $b then + sexp = Ripper.sexp src + else + rip = MySexpBuilder.new src + rip.yydebug = $d + sexp = rip.parse + + if rip.error? then + warn "skipping" + next + end + end + + puts "accept" + + if $p then + pp sexp + else + p sexp + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/History.rdoc b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/History.rdoc new file mode 100644 index 000000000..dd5802f5b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/History.rdoc @@ -0,0 +1,493 @@ +=== 4.17.4 / 2025-09-02 + +This release was brought to you by ScotRail free WiFi! + +* 1 minor enhancement: + + * Added 3.4 to pt_testcase.rb. + +=== 4.17.3 / 2024-11-11 + +* 1 bug fix: + + * Fix errors created when string literals are frozen. + +=== 4.17.2 / 2024-07-09 + +* 1 bug fix: + + * Fix errors created when string literals are frozen (in 2.7 only??). + +=== 4.17.1 / 2024-01-15 + +* 1 minor enhancement: + + * Added 3.3 to pt_testcase.rb + +=== 4.17.0 / 2023-05-03 + +* 2 minor enhancements: + + * Added Sexp#line_max=. + * Will load strict_sexp if $SP_DEBUG is set. + +* 3 bug fixes: + + * Sexp#line_max lazy accessor now compacts. + * Sexp#new copies line_max if defined. + * strict_sexp.rb: #first can take an int arg. Fixed mutator wrappers to pass args. + +=== 4.16.1 / 2022-04-09 + +* 1 minor enhancement: + + * Reworked ParseTreeTestCase's notion of versions to make it easier to extend. + +=== 4.16.0 / 2021-10-27 + +* 4 minor enhancements: + + * Added Sexp#value (pushed up from ruby_parser). + * Aliased Sexp#concat to #_concat and use that so it can be overridden. + * Cache the #hash result. + * StrictSexp mode (4) now covers concat. + +* 3 bug fixes: + + * Fix some doco on each_sexp to clarify that it is not recursive. + * Fixed a bug calling enum_for when using each_of_type w/ no block. + * Minor fixes to pt_testcase.rb for custom timeouts and better error handling. + +=== 4.15.3 / 2021-05-15 + +* 1 minor enhancement: + + * Added 3.0 to pt_testcase.rb + +=== 4.15.2 / 2021-01-10 + +* 1 bug fix: + + * Bumped ruby version to include < 4 (trunk). + +=== 4.15.1 / 2020-08-31 + +* 1 bug fix: + + * Bumped ruby version to include 3.0 (trunk). + +=== 4.15.0 / 2020-06-09 + +* 1 minor enhancement: + + * Added `child` and `include` to Sexp::Matcher.parse language. + +=== 4.14.1 / 2020-02-09 + +* 2 bug fixes: + + * Declared support for ruby 2.2+ to gemspec. + * Fixed alias for `not?` to `-` for ruby <= 2.4. (nard-tech). + +=== 4.14.0 / 2020-02-06 + +* 4 minor enhancements: + + * Added '-' as an alias for the 'not?' pattern matching command. + * Added Klass matcher to match on types. + * Added `k` shortcut for Klass & hooked into Sexp::Matcher.parse. + * Added any matcher to pattern parser. + +=== 4.13.0 / 2019-09-24 + +* 4 minor enhancements: + + * Added Sexp.q (query) and deprecated Sexp.s to distinguish better and match inspect output. + * Extended Sexp::Matcher::Parser to allow `not?` patterns. + * Extended Sexp::Matcher::Parser to cover more method names. + * Split out all pattern-oriented code to sexp_matcher.rb. + +* 1 bug fix: + + * Fixed bug w/ ruby's Array#eql? and #hash not looking at ivars. + +=== 4.12.1 / 2019-06-03 + +* 1 minor enhancement: + + * Sexp#line now raises if setting w/ non-integer (eg nil). + +* 3 bug fixes: + + * Fixed pt_testcase.rb for block args w/ trailing commas. + * Fixed pt_testcase.rb for stabby proc sexps. + * Simple fixes for STRICT_SEXP=1. + +=== 4.12.0 / 2019-03-12 + +* 3 bug fixes: + + * Fixed sexp_body to return empty sexp instead of nil when using STRICT_SEXP. + * STRICT_SEXP=4+ fails w/ current use of concat. Removed concat from strictness for now. + * Use concat internally instead of splat. Some people have 20000 node sexps! (presidentbeef) + +=== 4.11.0 / 2018-04-05 + +* 1 minor enhancement: + + * Extended deep_each to skip subtrees if block returns :skip. + +=== 4.10.1 / 2018-02-15 + +* 1 minor enhancement: + + * Tweaked pt_testcase for ruby 2.5 and better ruby2ruby test data. + +=== 4.10.0 / 2017-07-17 + +* 2 major enhancements: + + * Added experimental pattern matcher to Sexp. Forked from sexp_path. + * Extended s to take a block and return a matcher: eg s{ s(:defn, atom, _, ___) } + +* 23 minor enhancements: + + * Added $STRICT_SEXP to crank down Sexp.[] and friends. + * Added Matcher#/ w/ real functionality. + * Added Sexp#/ to search with new patterns. + * Added Sexp#map to ensure you get a Sexp back. + * Added Sexp#new to create a new sexp with the same file/line/comment info. + * Added Sexp#search_each to recursively search w/ new patterns. Returns enum if no block. + * Added Sexp#sexp_body= + * Added Sexp::Matcher.match_subs? and .match_subs= to extend =~ so you can match strictly. + * Added Sexp::Matcher.parse to convert lispy string to safe matcher: "(defn atom _ ___)" + * Added all mutation methods to STRICT_SEXP >= 4 + * Added deprecation message to Sexp#structure for [s(...)] forms. + * Added strict_sexp.rb to help you clamp down for future changes. STRICT_SEXP=1+ + * Auto-require strict_sexp if $STRICT_SEXP is > 0. + * Converted a lot of indexed access to sexp_type/sexp_body, etc. + * Finally enforced SexpProcessor#process to only process sexps, not bare arrays. + * Made Sexp#/ double-dispatch to Matcher#/. + * Made Sexp#gsub work with new patterns. + * Made Sexp#sub work with new patterns. + * Made SexpProcessor STRICT_SEXP=4 compliant. + * Retired SexpMatchSpecial & SexpAny. Never used by anything AFAICT. + * Sexp#=== goes back to default. + * Sexp#=~(pat) calls pat =~ self. + * Sexp#sexp_body now takes optional offset. Use instead of sexp[n..-1]. + +* 9 bug fixes: + + * Extended Sexp::Matcher::Parser.parse to lex more forms of regexp. + * Finished off all missing doco. + * Fixed == methods on all Matcher classes to include ivars. + * Fixed Child#satisfy? to properly return false if failed. + * Fixed Sexp#sexp_body to return a sexp using Sexp#new. + * Fixed map to use Sexp#new. + * Only try to set c_type if it responds to it. Make STRICT_SEXP safe. + * R2C has a hack in SexpProcessor to call sexp_type=. Renamed to c_type= in R2C. + * Removed very obsolete attrset test from pt_testcase.rb + +=== 4.10.0b1 / 2017-06-13 + +Beta of the above. + +=== 4.9.0 / 2017-04-13 + +* 9 minor enhancements: + + * Added Sexp.depth + * Added Sexp.sexp_type= + * Cache Sexp.line_max. Massively speeds up large flay runs. + * Cleaned up SexpProcessor.process handling of result node type. + * Extend pt_testcase for ruby 2.4 tests. + * Extended Sexp.method_missing to only print on every invocation if $VERBOSE=1 + * Extended Sexp.method_missing to warn if the expected sub-sexp is not found. + * Rewrote Sexp.mass to be MUCH faster. Helps tremendously with flay on large files. + * Warn that Sexp#method_missing was tripped if $DEBUG. + +=== 4.8.0 / 2017-02-01 + +* 2 minor enhancements: + + * Added Sexp#line_max + * Extended MethodBasedSexpProcessor#in_method to take line_max and record span. + +=== 4.7.0 / 2016-02-18 + +* 2 minor enhancements: + + * Expand to support 2.3 in tests. (presidentbeef) + * Return enumerable for deep_each, each_sexp, and each_of_type. (ridiculous) + +=== 4.6.1 / 2016-01-21 + +* 1 bug fix: + + * defs should have a nil node if body is empty. + +=== 4.6.0 / 2015-05-28 + +* 2 minor enhancements: + + * Extended generate_test to deal with 19 and up. + * Extended pt_testcase.rb so add_19tests means 19 and up. + +* 1 bug fix: + + * Added and normalized tests to deal with canonicalized block args from ruby_parser. + +=== 4.5.1 / 2015-04-27 + +* 1 minor enhancement: + + * Cache processors and rewriters. Significant speedup. (presidentbeef) + +=== 4.5.0 / 2015-03-09 + +* 1 minor enhancement: + + * Added SexpProcessor::expand_dirs_to_files as a utility to cmdline tools. + +=== 4.4.5 / 2015-01-16 + +* 1 bug fix: + + * Removed shebangs in tests because of bugs (aka 'features') in RPM packaging tools. + +=== 4.4.4 / 2014-08-14 + +* 1 bug fix: + + * MethodBasedSexpProcessor#in_klass clears out the method_stack for the duration of the block. + +=== 4.4.3 / 2014-03-24 + +* 1 bug fix: + + * Fixed a bunch of pt_testcase entries for 1.9/2.0 wrt ruby2ruby. + +=== 4.4.2 / 2014-03-14 + +* 2 minor enhancements: + + * Changed skipped versioned tests to return, not skip. Reduces noise so you can focus on real skips. + * Extended versioned tests to include 2.0 and 2.1. + +=== 4.4.1 / 2013-12-13 + +* 1 bug fix: + + * Added parenthesis to fix the structure_remove_begin_1 testcase. (bocete) + +=== 4.4.0 / 2013-10-18 + +* 1 minor enhancement: + + * Added MethodBasedSexpProcessor, extracted from Flog. + +=== 4.3.0 / 2013-08-19 + +* 1 minor enhancement: + + * Switched ParseTreeTestCase to minitest 5. + +=== 4.2.1 / 2013-04-09 + +* 1 bug fix: + + * Removed structure_unused_literal_wwtt because I just don't care anymore + +=== 4.2.0 / 2013-03-18 + +* 2 minor enhancements: + + * Added SexpInterpreter since it is such a common pattern + * Added aliases Sexp#head & Sexp#rest for readability + +=== 4.1.5 / 2013-02-14 + +* 2 bug fixes: + + * Clarified role of s method. Fixes #12. + * maglev: Workaround for bug in Array#shift + +=== 4.1.4 / 2013-01-22 + +* 1 minor enhancement: + + * Gave Sexp#structure a ~10% boost + +* 2 bug fixes: + + * Fixed Sexp#mass lying when using auto_shifted sexps. + * Stupid fix for ruby 2.0 method_missing 'bug'. + +=== 4.1.3 / 2012-12-06 + +* 2 bug fixes: + + * Code cleanup... what was I thinking??? + * Explicitly setting pt_testcase.rb to US-ASCII to avoid encoding hell + +=== 4.1.2 / 2012-11-03 + +* 1 bug fix: + + * Sexp#structure should grep for Sexps, not Arrays + +=== 4.1.1 / 2012-11-02 + +* 1 minor enhancement: + + * iter args revamp for ruby_parser 3 changes. + +=== 4.1.0 / 2012-10-22 + +* 1 minor enhancement: + + * Added Environment#current so you can explicitly shadow variables. (meh) + +=== 4.0.1 / 2012-07-03 + +* 4 minor enhancements: + + * 1.9: Had to version split all my 'not' tests since 1.9 is insane. + * 1.9: f (args) is not allowed in 1.9. + * 1.9: f(hash, *splat) is not allowed in 1.9. + * Added module2 test to verify module w/ 2+ entities + +* 2 bug fixes: + + * 1.9: Changed !@ to ! since that is what you implement + * True to my wtf comment, there was a bug in my case_splat test + +=== 4.0.0 / 2012-06-07 + +* 5 major enhancements: + + * Removed :arglist from everything except :op_asgn1. + * Removed block from resbody + * Removed block from when node + * Removed block nodes inside of scope nodes (defn/defs/class/sclass). + * Removed scope nodes in defn/defs/class/sclass nodes. + +* 1 minor enhancement: + + * Added Sexp#deep_each and Sexp#each_sexp. Refactored from Flay + +=== 3.2.0 / 2012-04-15 + +* 5 minor enhancements: + + * Added a ton of block arg tests. + * Added add19_edgecases to help refactor a bunch of tests that all have the same output. + * Added better debugging output for rewrites. + * Cleaned and added a bunch of stabby proc tests. + * Moved RawParseTree test data to ParseTree project. + +* 2 bug fixes: + + * Fixed a bunch of entries for r2r changes against edgecase parse/lex tests + * Fixes for R2R + +=== 3.1.0 / 2012-02-29 + +* 4 minor enhancements: + + * Added test_call_arglist_trailing_comma__19 (presidentbeef) + * Added test_fcall_inside_parens. (presidentbeef) + * Added test_if_args_no_space_symbol__18. (presidentbeef) + * Added tests for new hash syntax and ternaries in 1.9 (lastobelus) + +=== 3.0.10 / 2012-01-04 + +* 1 minor enhancement: + + * Added test for bare hash at end of array in 1.9. (presidentbeef) + +* 1 bug fix: + + * Fixed 1.9.3 warnings + +=== 3.0.9 / 2011-12-07 + +* 1 minor enhancement: + + * Add missing test for a ternary with nil without a space before the colon (brynary) + +=== 3.0.8 / 2011-11-16 + +* 4 minor enhancements: + + * Add 6 missing ruby 1.9 tests (brynary) + * Added new 1.9 hash tests to pt_testcase.rb + * Version specific tests are now skipped at runtime, not test creation time + * Added new block arg tests. + +=== 3.0.7 / 2011-09-21 + +* 2 bug fixes: + + * Fixed and test to not have mandatory parens + * Fixed r2r's handling of dregexp options + +=== 3.0.6 / 2011-08-16 + +* 5 minor enhancements: + + * Added ParseTreeTestCase#add_19tests + * Added a bunch of FAILING 1.9 tests stolen from presidentbeef's repo! yay! + * Added add_19tests and add_18tests to segregate version specific parsing. + * Moved pt_testcase.rb to sexp_processor + * Segregated a bunch of 1.8 specific tests using add_18tests. + +=== 3.0.5 / 2010-09-01 + +* 2 minor enhancements: + + * Added in_context to clean up code. + * optimize inspect to avoid needlessly caching @line + +=== 3.0.4 / 2010-03-27 + +* 1 minor enhancement: + + * Added line number to pretty_print output if $VERBOSE + +=== 3.0.3 / 2009-08-14 + +* 1 minor enhancement: + + * Pulled #mass up from flog/flay + +=== 3.0.2 / 2009-06-23 + +* 2 minor enhancements: + + * Pulled unique.rb from ParseTree to sexp_processor. + * Switched to minitest. + +=== 3.0.1 / 2009-01-20 + +* 3 minor enhancements: + + * Filled out README + * Promoted file/line/comments from ruby_parser. + * Added sexp_type to compliment sexp_body. + +=== 3.0.0 / 2008-10-22 + +* 2 major enhancements: + + * Released as its own project, splitting from ParseTree + * Added Environment to SexpProcessor and built it in. YAY! + +* 6 minor enhancements: + + * Allowed CompositeSexpProcessor to be more ducktypey. + * Refactored Sexp#method_missing into find_node and find_nodes. + * Removed Sexp#for and other PT specific code. + * SexpProcessor#process now runs rewriters before everything else. + * SexpProcessor#rewrite context only for subs, EMPTY for top level rewrites. + * SexpProcessor#rewrite will stop iterating if the result isn't another Sexp. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/Manifest.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/Manifest.txt new file mode 100644 index 000000000..6a1ac5fc1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/Manifest.txt @@ -0,0 +1,15 @@ +History.rdoc +Manifest.txt +README.rdoc +Rakefile +lib/composite_sexp_processor.rb +lib/pt_testcase.rb +lib/sexp.rb +lib/sexp_matcher.rb +lib/sexp_processor.rb +lib/strict_sexp.rb +lib/unique.rb +test/test_composite_sexp_processor.rb +test/test_environment.rb +test/test_sexp.rb +test/test_sexp_processor.rb diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/README.rdoc b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/README.rdoc new file mode 100644 index 000000000..4c58a1ba4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/README.rdoc @@ -0,0 +1,93 @@ += SexpProcessor + +home :: https://github.com/seattlerb/sexp_processor +rdoc :: http://docs.seattlerb.org/sexp_processor + +== DESCRIPTION: + +sexp_processor branches from ParseTree bringing all the generic sexp +processing tools with it. Sexp, SexpProcessor, Environment, etc... all +for your language processing pleasure. + +== FEATURES/PROBLEMS: + +* Includes SexpProcessor and CompositeSexpProcessor. + + * Allows you to write very clean filters. + +* Includes MethodBasedSexpProcessor + + * Makes writing language processors even easier! + +* Sexp provides a simple and clean interface to creating and manipulating ASTs. + + * Includes new pattern matching system. + +== SYNOPSIS: + +You can use SexpProcessor to do all kinds of language processing. Here +is a simple example of a simple documentation printer: + + class ArrrDoc < MethodBasedSexpProcessor + def process_class exp + super do + puts "#{self.klass_name}: #{exp.comments}" + end + end + + def process_defn exp + super do + args, *_body = exp + + puts "#{self.method_name}(#{process_args args}): #{exp.comments}" + end + end + end + +Sexp provides a lot of power with the new pattern matching system. +Here is an example that parses all the test files using RubyParser and +then quickly finds all the test methods and prints their names: + + >> require "ruby_parser"; + >> rp = RubyParser.new; + >> matcher = Sexp::Matcher.parse "(defn [m /^test_/] ___)" + => q(:defn, m(/^test_/), ___) + >> paths = Dir["test/**/*.rb"]; + >> sexps = s(:block, *paths.map { |path| rp.process File.read(path), path }); + >> (sexps / matcher).size + => 189 + ?> (sexps / matcher).map { |(_, name, *_rest)| name }.sort + => [:test_all, :test_amp, :test_and_satisfy_eh, :test_any_search, ...] + +== REQUIREMENTS: + +* rubygems + +== INSTALL: + +* sudo gem install sexp_processor + +== LICENSE: + +(The MIT License) + +Copyright (c) Ryan Davis, seattle.rb + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/composite_sexp_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/composite_sexp_processor.rb new file mode 100644 index 000000000..d59848f11 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/composite_sexp_processor.rb @@ -0,0 +1,49 @@ +require "sexp_processor" + +## +# Implements the Composite pattern on SexpProcessor. Need we say more? +# +# Yeah... probably. Implements a SexpProcessor of SexpProcessors so +# you can easily chain multiple to each other. At some stage we plan +# on having all of them run +process+ and but only ever output +# something when +generate+ is called, allowing for deferred final +# processing. + +class CompositeSexpProcessor < SexpProcessor + + ## + # The list o' processors to run. + + attr_reader :processors + + def initialize # :nodoc: + super + @processors = [] + end + + ## + # Add a +processor+ to the list of processors to run. + + def << processor + raise ArgumentError, "Can only add sexp processors" unless + SexpProcessor === processor || processor.respond_to?(:process) + @processors << processor + end + + ## + # Run +exp+ through all of the processors, returning the final + # result. + + def process exp + @processors.each do |processor| + exp = processor.process(exp) + end + exp + end + + def on_error_in node_type, &block + @processors.each do |processor| + processor.on_error_in(node_type, &block) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/pt_testcase.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/pt_testcase.rb new file mode 100644 index 000000000..745777568 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/pt_testcase.rb @@ -0,0 +1,3137 @@ +# encoding: US-ASCII + +$TESTING = true +# :stopdoc: + +require "minitest/test" +require "sexp_processor" # for deep_clone + +# key: +# wwtt = what were they thinking? + +class Examples + attr_reader :reader + attr_writer :writer + + def a_method x; x+1; end + alias an_alias a_method + + define_method(:bmethod_noargs) do + x + 1 + end + + define_method(:unsplatted) do |x| + x + 1 + end + + define_method :splatted do |*args| + y = args.first + y + 42 + end + + define_method :dmethod_added, instance_method(:a_method) if + RUBY_VERSION < "1.9" +end + +class ParseTreeTestCase < Minitest::Test + all_versions = %w[18 19 20 21 22 23 24 25 26 27 30 31 32 33 34] + most_versions = all_versions.drop(1) + + TEST_SUFFIX = "_#{most_versions.join "_"}" + VER_RE = /(#{Regexp.union(*all_versions)})/ + + attr_accessor :processor # to be defined by subclass + + def setup + super + @processor = nil + end + + def after_process_hook klass, node, data, input_name, output_name + end + + def before_process_hook klass, node, data, input_name, output_name + end + + def self.add_test name, data, klass = self.name[4..-1] + name = name.to_s + klass = klass.to_s + + if testcases.has_key? name then + if testcases[name].has_key? klass then + warn "testcase #{klass}##{name} already has data" + else + testcases[name][klass] = data + end + else + warn "testcase #{name} does not exist" + end + end + + def self.add_tests name, hash + name = name.to_s + + hash.each do |klass, data| + warn "testcase #{klass}##{name} already has data" if + testcases[name].has_key? klass + testcases[name][klass] = data + end + end + + def self.add_18tests name, hash + add_tests "#{name}__18", hash + end + + def self.add_19tests name, hash + add_tests "#{name}_#{TEST_SUFFIX}", hash # HACK? + end + + def self.add_19edgecases ruby, sexp, cases + cases.each do |name, code| + add_19tests name, "Ruby" => code, "ParseTree" => sexp, "Ruby2Ruby" => ruby + end + end + + def self.clone_same + @@testcases.each do |node, data| + data.each do |key, val| + if val == :same then + prev_key = self.previous(key) + data[key] = data[prev_key].deep_clone + end + end + end + end + + def self.copy_test_case nonverbose, klass + verbose = nonverbose + "_mri_verbose_flag" + testcases[verbose][klass] = testcases[nonverbose][klass] + end + + def self.generate_test klass, node, data, input_name, output_name + klass.send :define_method, "test_#{node}" do + flunk "Processor is nil" if processor.nil? + + tversions = node[/(?:_#{VER_RE})+$/] + if tversions then + cversion = self.class.name[/#{VER_RE}/] + + assert true # shut up prove_it! + + # can't push this up because it may be generating into an + # abstract test class and the actual subclass is versioned. + return "version specific test" unless tversions.include? cversion if cversion + end + + assert data.has_key?(input_name), "Unknown input data" + assert data.has_key?(output_name), "Missing test data" + + $missing[node] << output_name unless data.has_key? output_name + + input = data[input_name].deep_clone + expected = data[output_name].deep_clone + + case expected + when :unsupported then + assert_raises(UnsupportedNodeError) do + processor.process(input) + end + else + extra_expected = [] + extra_input = [] + + _, expected, extra_expected = *expected if + Array === expected and expected.sexp_type == :defx + _, input, extra_input = *input if + Array === input and input.sexp_type == :defx + + # OMG... I can't believe I have to do this this way. these + # hooks are here instead of refactoring this define_method + # body into an assertion. It'll allow subclasses to hook in + # and add behavior before or after the processor does it's + # thing. If you go the body refactor route, some of the + # RawParseTree test cases fail for completely bogus reasons. + + before_process_hook klass, node, data, input_name, output_name + refute_nil data[input_name], "testcase does not exist?" + timeout = (ENV["RP_TIMEOUT"] || 10).to_i + @result = processor.process input, "(string)", timeout + assert_equal(expected, @result, + "failed on input: #{data[input_name].inspect}") + after_process_hook klass, node, data, input_name, output_name + + extra_input.each do |extra| + processor.process(extra) + end + extra = if processor.respond_to?(:extra_methods) then + processor.extra_methods + else + [] + end + assert_equal extra_expected, extra + end + end + end + + def self.generate_tests klass + install_missing_reporter + clone_same + + output_name = klass.name.to_s.sub(/^Test/, "") + + input_name = self.previous(output_name) + + @@testcases.each do |node, data| + next if [:skip, :unsupported].include? data[input_name] + next if data[output_name] == :skip + + generate_test klass, node, data, input_name, output_name + end + end + + def self.inherited klass + super + + generate_tests klass unless klass.name =~ /TestCase/ + end + + def self.install_missing_reporter + unless defined? $missing then + $missing = Hash.new { |h,k| h[k] = [] } + at_exit { + at_exit { + warn "" + $missing.sort.each do |name, klasses| + warn "add_tests(#{name.inspect}," + klasses.map! { |klass| " #{klass.inspect} => :same" } + warn klasses.join("\n") + ")" + end + warn "" + } + } + end + end + + def self.previous key, extra=0 # FIX: remove R2C code + idx = @@testcase_order.index(key) + + raise "Unknown class #{key} in @@testcase_order" if idx.nil? + + case key + when "RubyToRubyC" then + idx -= 1 + end + @@testcase_order[idx - 1 - extra] + end + + def self.testcase_order; @@testcase_order; end + def self.testcases; @@testcases; end + + def self.unsupported_tests *tests + tests.flatten.each do |name| + add_test name, :unsupported + end + end + + ############################################################ + # Shared TestCases: + + @@testcase_order = %w(Ruby ParseTree) + + @@testcases = Hash.new { |h,k| h[k] = {} } + + ### + # 1.8 specific tests + + add_18tests("call_arglist_norm_hash_splat", + "Ruby" => "o.m(42, :a => 1, :b => 2, *c)", + "ParseTree" => s(:call, + s(:call, nil, :o), :m, + s(:lit, 42), + s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2)), + s(:splat, s(:call, nil, :c)))) + + add_18tests("call_arglist_space", + "Ruby" => "a (1,2,3)", + "ParseTree" => s(:call, nil, :a, + s(:lit, 1), s(:lit, 2), s(:lit, 3)), + "Ruby2Ruby" => "a(1, 2, 3)") + + add_18tests("fcall_arglist_norm_hash_splat", + "Ruby" => "m(42, :a => 1, :b => 2, *c)", + "ParseTree" => s(:call, nil, :m, + s(:lit, 42), + s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2)), + s(:splat, s(:call, nil, :c)))) + + add_18tests("if_args_no_space_symbol", + "Ruby" => "x if y:z", + "ParseTree" => s(:if, + s(:call, nil, :y, s(:lit, :z)), + s(:call, nil, :x), + nil), + "Ruby2Ruby" => "x if y(:z)") + + add_18tests("if_post_not", + "Ruby" => "a if not b", + "ParseTree" => s(:if, s(:call, nil, :b), nil, + s(:call, nil, :a)), + "Ruby2Ruby" => "a unless b") + + add_18tests("if_pre_not", + "Ruby" => "if not b then a end", + "ParseTree" => s(:if, s(:call, nil, :b), nil, + s(:call, nil, :a)), + "Ruby2Ruby" => "a unless b") + + add_18tests("iter_args_ivar", + "Ruby" => "a { |@a| 42 }", + "ParseTree" => s(:iter, + s(:call, nil, :a), + s(:args, :@a), + s(:lit, 42))) + + add_18tests("iter_masgn_args_ivar", + "Ruby" => "a { |a, @b| 42 }", + "ParseTree" => s(:iter, + s(:call, nil, :a), + s(:args, :a, :@b), + s(:lit, 42))) + + add_18tests("not", + "Ruby" => "(not true)", + "ParseTree" => s(:not, s(:true))) + + add_18tests("str_question_control", + "Ruby" => '?\M-\C-a', + "ParseTree" => s(:lit, 129), + "Ruby2Ruby" => "129") + + add_18tests("str_question_escape", + "Ruby" => '?\n', + "ParseTree" => s(:lit, 10), + "Ruby2Ruby" => "10") + + add_18tests("str_question_literal", + "Ruby" => "?a", + "ParseTree" => s(:lit, 97), + "Ruby2Ruby" => "97") + + add_18tests("unless_post_not", + "Ruby" => "a unless not b", + "ParseTree" => s(:if, s(:call, nil, :b), + s(:call, nil, :a), nil), + "Ruby2Ruby" => "a if b") + + add_18tests("unless_pre_not", + "Ruby" => "unless not b then a end", + "ParseTree" => s(:if, s(:call, nil, :b), + s(:call, nil, :a), nil), + "Ruby2Ruby" => "a if b") + + add_18tests("until_post_not", + "Ruby" => "begin\n (1 + 1)\nend until not true", + "ParseTree" => s(:while, s(:true), + s(:call, s(:lit, 1), :+, s(:lit, 1)), false), + "Ruby2Ruby" => "begin\n (1 + 1)\nend while true") + + add_18tests("until_pre_not", + "Ruby" => "until not true do\n (1 + 1)\nend", + "ParseTree" => s(:while, s(:true), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "while true do\n (1 + 1)\nend") + + add_18tests("until_pre_not_mod", + "Ruby" => "(1 + 1) until not true", + "ParseTree" => s(:while, s(:true), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "while true do\n (1 + 1)\nend") + + add_18tests("while_post_not", + "Ruby" => "begin\n (1 + 1)\nend while not true", + "ParseTree" => s(:until, s(:true), + s(:call, s(:lit, 1), :+, s(:lit, 1)), false), + "Ruby2Ruby" => "begin\n (1 + 1)\nend until true") + + add_18tests("while_pre_not", + "Ruby" => "while not true do\n (1 + 1)\nend", + "ParseTree" => s(:until, s(:true), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "until true do\n (1 + 1)\nend") + + add_18tests("while_pre_not_mod", + "Ruby" => "(1 + 1) while not true", + "ParseTree" => s(:until, s(:true), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "until true do\n (1 + 1)\nend") # FIX + + ### + # 1.9 specific tests + + add_19edgecases("-> () { (x + 1) }", + s(:iter, + s(:lambda), + s(:args), + s(:call, s(:call, nil, :x), :+, s(:lit, 1))), + "stabby_args" => "->() { (x + 1) }", + "stabby_args_doend" => "->() do (x + 1) end") + + add_19edgecases("-> { (x + 1) }", + s(:iter, + s(:lambda), + 0, + s(:call, s(:call, nil, :x), :+, s(:lit, 1))), + "stabby_args_0_no_parens" => "-> { (x + 1) }", + "stabby_args_0_no_parens_doend" => "-> do (x + 1) end", + "stabby_args_0_spacebar_broken" => "->{x+1}") # I hate you + + add_19edgecases("-> (x, y) { (x + y) }", + s(:iter, + s(:lambda), + s(:args, :x, :y), + s(:call, s(:lvar, :x), :+, s(:lvar, :y))), + "stabby_args_2" => "->(x, y) { (x + y) }", + "stabby_args_2_doend" => "->(x, y) do (x + y) end", + "stabby_args_2_no_parens" => "-> x, y { (x + y) }", + "stabby_args_2_no_parens_doend" => "-> x, y do (x + y) end") + + add_19edgecases("-> (x) { (x + 1) }", + s(:iter, + s(:lambda), + s(:args, :x), + s(:call, s(:lvar, :x), :+, s(:lit, 1))), + "stabby_args_1" => "->(x) { (x + 1) }", + "stabby_args_1_doend" => "->(x) do (x + 1) end", + "stabby_args_1_no_parens" => "-> x { (x + 1) }", + "stabby_args_1_no_parens_doend" => "-> x do (x + 1) end") + + add_19tests("array_bare_hash", + "Ruby" => "[:a, :b => :c]", + "ParseTree" => s(:array, + s(:lit, :a), + s(:hash, + s(:lit, :b), + s(:lit, :c))), + "Ruby2Ruby" => "[:a, { :b => :c }]") + + add_19tests("array_bare_hash_labels", + "Ruby" => "[:a, b: :c]", + "ParseTree" => s(:array, + s(:lit, :a), + s(:hash, + s(:lit, :b), + s(:lit, :c))), + "Ruby2Ruby" => "[:a, { :b => :c }]") + + add_19tests("call_arglist_norm_hash_colons", + "Ruby" => "o.m(42, a: 1, b: 2)", + "ParseTree" => s(:call, + s(:call, nil, :o), + :m, + s(:lit, 42), + s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2))), + "Ruby2Ruby" => "o.m(42, :a => 1, :b => 2)") + + add_19tests("call_arglist_trailing_comma", + "Ruby" => "a(1,2,3,)", + "ParseTree" => s(:call, + nil, + :a, + s(:lit, 1), s(:lit, 2), s(:lit, 3)), + "Ruby2Ruby" => "a(1, 2, 3)") + + add_19tests("call_bang", + "Ruby" => "!a", + "ParseTree" => s(:call, + s(:call, nil, :a), + :"!"), + "Ruby2Ruby" => "(not a)") + + add_19tests("call_bang_empty", + "Ruby" => "! ()", + "ParseTree" => s(:call, s(:nil), :"!"), + "Ruby2Ruby" => "(not nil)") + + add_19tests("call_fonz", + "Ruby" => "a.()", + "ParseTree" => s(:call, s(:call, nil, :a), :call), + "Ruby2Ruby" => "a.call") + + add_19tests("call_fonz_cm", + "Ruby" => "a::()", + "ParseTree" => s(:call, s(:call, nil, :a), :call), + "Ruby2Ruby" => "a.call") + + add_19tests("call_not", + "Ruby" => "not (42)", + "ParseTree" => s(:call, s(:lit, 42), :"!"), + "Ruby2Ruby" => "(not 42)") + + # add_19tests("call_not_empty", + # "Ruby" => "not ()", + # "ParseTree" => s(:call, s(:lit, 42), :"!")) + + add_19tests("call_not_equal", + "Ruby" => "a != b", + "ParseTree" => s(:call, + s(:call, nil, :a), + :"!=", + s(:call, nil, :b)), + "Ruby2Ruby" => "(a != b)") + + add_19tests("call_splat_mid", + "Ruby" => "def f(a = nil, *b, c)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, s(:lasgn, :a, s(:nil)), :"*b", :c), + s(:nil))) + + add_19tests("defn_args_mand_opt_mand", + "Ruby" => "def f(mand1, opt = 42, mand2)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :mand1, s(:lasgn, :opt, s(:lit, 42)), :mand2), + s(:nil))) + + add_19tests("defn_args_mand_opt_splat_mand", + "Ruby" => "def f(mand1, opt = 42, *rest, mand2)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :mand1, s(:lasgn, :opt, s(:lit, 42)), :"*rest", :mand2), + s(:nil))) + + add_19tests("defn_args_opt_mand", + "Ruby" => "def f(opt = 42, mand)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, s(:lasgn, :opt, s(:lit, 42)), :mand), + s(:nil))) + + add_19tests("defn_args_opt_splat_mand", + "Ruby" => "def f(opt = 42, *rest, mand)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, s(:lasgn, :opt, s(:lit, 42)), :"*rest", :mand), + s(:nil))) + + add_19tests("defn_args_splat_mand", + "Ruby" => "def f(*rest, mand)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :"*rest", :mand), + s(:nil))) + + add_19tests("defn_args_splat_middle", + "Ruby" => "def f(first, *middle, last)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :first, :"*middle", :last), + s(:nil))) + + add_19tests("fcall_arglist_hash_colons", + "Ruby" => "m(a: 1, b: 2)", + "ParseTree" => s(:call, nil, :m, + s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2))), + "Ruby2Ruby" => "m(:a => 1, :b => 2)") + + add_19tests("hash_new", + "Ruby" => "{ a: 1, b: 2 }", + "ParseTree" => s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2)), + "Ruby2Ruby" => "{ :a => 1, :b => 2 }") + + add_19tests("hash_new_no_space", + "Ruby" => "{a:1,b:2}", + "ParseTree" => s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2)), + "Ruby2Ruby" => "{ :a => 1, :b => 2 }") + + add_19tests("hash_new_with_keyword", + "Ruby" => "{ true: 1, b: 2 }", + "ParseTree" => s(:hash, + s(:lit, :true), s(:lit, 1), + s(:lit, :b), s(:lit, 2)), + "Ruby2Ruby" => "{ :true => 1, :b => 2 }") + + add_19tests("if_post_not", + "Ruby" => "a if not b", + "ParseTree" => s(:if, s(:call, s(:call, nil, :b), :"!"), + s(:call, nil, :a), + nil), + "Ruby2Ruby" => "a unless b") + + add_19tests("if_pre_not", + "Ruby" => "if not b then a end", + "ParseTree" => s(:if, s(:call, s(:call, nil, :b), :"!"), + s(:call, nil, :a), + nil), + "Ruby2Ruby" => "a unless b") + + add_19tests("label_in_bare_hash_in_array_in_ternary", + "Ruby" => "1 ? [:a, b: 2] : 1", + "ParseTree" => s(:if, s(:lit, 1), + s(:array, + s(:lit, :a), + s(:hash, s(:lit, :b), s(:lit, 2))), + s(:lit, 1)), + "Ruby2Ruby" => "1 ? ([:a, { :b => 2 }]) : (1)") + + add_19tests("label_in_callargs_in_ternary", + "Ruby" => "1 ? m(a: 2) : 1", + "ParseTree" => s(:if, s(:lit, 1), + s(:call, nil, :m, + s(:hash, s(:lit, :a), s(:lit, 2))), + s(:lit, 1)), + "Ruby2Ruby" => "1 ? (m(:a => 2)) : (1)") + + add_19tests("not", + "Ruby" => "(not true)", + "ParseTree" => s(:call, s(:true), :"!")) + + add_19tests("splat_fcall_middle", + "Ruby" => "meth(1, *[2], 3)", + "ParseTree" => s(:call, + nil, + :meth, + s(:lit, 1), + s(:splat, s(:array, s(:lit, 2))), + s(:lit, 3))) + + add_19tests("str_question_control", + "Ruby" => '?\M-\C-a', + "ParseTree" => s(:str, "\x81"), + "Ruby2Ruby" => "\"\\x81\"") + + add_19tests("str_question_escape", + "Ruby" => '?\n', + "ParseTree" => s(:str, "\n"), + "Ruby2Ruby" => "\"\\n\"") + + add_19tests("str_question_literal", + "Ruby" => "?a", + "ParseTree" => s(:str, "a"), + "Ruby2Ruby" => '"a"') + + add_19tests("unless_post_not", + "Ruby" => "a unless not b", + "ParseTree" => s(:if, s(:call, s(:call, nil, :b), :"!"), + nil, + s(:call, nil, :a)), + "Ruby2Ruby" => "a if b") + + add_19tests("unless_pre_not", + "Ruby" => "unless not b then a end", + "ParseTree" => s(:if, s(:call, s(:call, nil, :b), :"!"), + nil, + s(:call, nil, :a)), + "Ruby2Ruby" => "a if b") + + add_19tests("until_post_not", + "Ruby" => "begin\n (1 + 1)\nend until not true", + "ParseTree" => s(:until, s(:call, s(:true), :"!"), + s(:call, s(:lit, 1), :+, s(:lit, 1)), false), + "Ruby2Ruby" => "begin\n (1 + 1)\nend while true") + + add_19tests("until_pre_not", + "Ruby" => "until not true do\n (1 + 1)\nend", + "ParseTree" => s(:until, s(:call, s(:true), :"!"), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "while true do\n (1 + 1)\nend") + + add_19tests("until_pre_not_mod", + "Ruby" => "(1 + 1) until not true", + "ParseTree" => s(:until, s(:call, s(:true), :"!"), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "while true do\n (1 + 1)\nend") + + add_19tests("while_post_not", + "Ruby" => "begin\n (1 + 1)\nend while not true", + "ParseTree" => s(:while, s(:call, s(:true), :"!"), + s(:call, s(:lit, 1), :+, s(:lit, 1)), false), + "Ruby2Ruby" => "begin\n (1 + 1)\nend until true") + + add_19tests("while_pre_not", + "Ruby" => "while not true do\n (1 + 1)\nend", + "ParseTree" => s(:while, s(:call, s(:true), :"!"), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "until true do\n (1 + 1)\nend") + + add_19tests("while_pre_not_mod", + "Ruby" => "(1 + 1) while not true", + "ParseTree" => s(:while, s(:call, s(:true), :"!"), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "until true do\n (1 + 1)\nend") # FIX + + ### + # Shared tests: + + add_tests("alias", + "Ruby" => "class X\n alias :y :x\nend", + "ParseTree" => s(:class, :X, nil, + s(:alias, s(:lit, :y), s(:lit, :x)))) + + add_tests("alias_ugh", + "Ruby" => "class X\n alias y x\nend", + "ParseTree" => s(:class, :X, nil, + s(:alias, s(:lit, :y), s(:lit, :x))), + "Ruby2Ruby" => "class X\n alias :y :x\nend") + + add_tests("and", + "Ruby" => "a and b", + "ParseTree" => s(:and, + s(:call, nil, :a), + s(:call, nil, :b))) + + add_tests("argscat_inside", + "Ruby" => "a = [b, *c]", + "ParseTree" => s(:lasgn, :a, + s(:array, + s(:call, nil, :b), + s(:splat, s(:call, nil, :c))))) + + add_tests("argscat_svalue", + "Ruby" => "a = b, c, *d", + "ParseTree" => s(:lasgn, :a, + s(:svalue, + s(:array, + s(:call, nil, :b), + s(:call, nil, :c), + s(:splat, + s(:call, nil, :d)))))) + + add_tests("argspush", + "Ruby" => "a[*b] = c", + "ParseTree" => s(:attrasgn, + s(:call, nil, :a), + :[]=, + s(:splat, + s(:call, nil, :b)), + s(:call, nil, :c))) + + add_tests("array", + "Ruby" => "[1, :b, \"c\"]", + "ParseTree" => s(:array, s(:lit, 1), s(:lit, :b), s(:str, "c"))) + + add_tests("array_pct_W", + "Ruby" => "%W[a b c]", + "ParseTree" => s(:array, + s(:str, "a"), s(:str, "b"), s(:str, "c")), + "Ruby2Ruby" => "[\"a\", \"b\", \"c\"]") + + add_tests("array_pct_W_dstr", + "Ruby" => "%W[a #\{@b} c]", + "ParseTree" => s(:array, + s(:str, "a"), + s(:dstr, "", s(:evstr, s(:ivar, :@b))), + s(:str, "c")), + "Ruby2Ruby" => "[\"a\", \"#\{@b}\", \"c\"]") + + add_tests("array_pct_w", + "Ruby" => "%w[a b c]", + "ParseTree" => s(:array, + s(:str, "a"), s(:str, "b"), s(:str, "c")), + "Ruby2Ruby" => "[\"a\", \"b\", \"c\"]") + + add_tests("array_pct_w_dstr", + "Ruby" => "%w[a #\{@b} c]", + "ParseTree" => s(:array, + s(:str, "a"), + s(:str, "#\{@b}"), + s(:str, "c")), + "Ruby2Ruby" => "[\"a\", \"\\\#{@b}\", \"c\"]") # TODO: huh? + + add_tests("attrasgn", + "Ruby" => "y = 0\n42.method = y\n", + "ParseTree" => s(:block, + s(:lasgn, :y, s(:lit, 0)), + s(:attrasgn, + s(:lit, 42), :method=, s(:lvar, :y)))) + + add_tests("attrasgn_index_equals", + "Ruby" => "a[42] = 24", + "ParseTree" => s(:attrasgn, + s(:call, nil, :a), + :[]=, + s(:lit, 42), s(:lit, 24))) + + add_tests("attrasgn_index_equals_space", + "Ruby" => "a = []; a [42] = 24", + "ParseTree" => s(:block, + s(:lasgn, :a, s(:array)), + s(:attrasgn, s(:lvar, :a), :[]=, + s(:lit, 42), s(:lit, 24))), + "Ruby2Ruby" => "a = []\na[42] = 24\n") + + add_tests("back_ref", + "Ruby" => "[$&, $`, $', $+]", + "ParseTree" => s(:array, + s(:back_ref, :&), + s(:back_ref, :"`"), + s(:back_ref, :"'"), + s(:back_ref, :+))) + + add_tests("begin", + "Ruby" => "begin\n (1 + 1)\nend", + "ParseTree" => s(:call, s(:lit, 1), :+, s(:lit, 1)), + "Ruby2Ruby" => "(1 + 1)") + + add_tests("begin_def", + "Ruby" => "def m\n begin\n\n end\nend", + "ParseTree" => s(:defn, :m, s(:args), s(:nil)), + "Ruby2Ruby" => "def m\n # do nothing\nend") + + add_tests("begin_rescue_ensure", + "Ruby" => "begin\n a\nrescue\n # do nothing\nensure\n # do nothing\nend", + "ParseTree" => s(:ensure, + s(:rescue, + s(:call, nil, :a), + s(:resbody, s(:array), nil)), + s(:nil))) + + add_tests("begin_rescue_ensure_all_empty", + "Ruby" => "begin\n # do nothing\nrescue\n # do nothing\nensure\n # do nothing\nend", + "ParseTree" => s(:ensure, + s(:rescue, + s(:resbody, s(:array), nil)), + s(:nil))) + + add_tests("begin_rescue_twice", + "Ruby" => "begin\n a\nrescue => mes\n # do nothing\nend\nbegin\n b\nrescue => mes\n # do nothing\nend\n", + "ParseTree" => s(:block, + s(:rescue, + s(:call, nil, :a), + s(:resbody, + s(:array, s(:lasgn, :mes, s(:gvar, :$!))), + nil)), + s(:rescue, + s(:call, nil, :b), + s(:resbody, + s(:array, + s(:lasgn, :mes, s(:gvar, :$!))), + nil)))) + copy_test_case "begin_rescue_twice", "Ruby" + copy_test_case "begin_rescue_twice", "ParseTree" + + add_tests("block_attrasgn", + "Ruby" => "def self.setup(ctx)\n bind = allocate\n bind.context = ctx\n return bind\nend", + "ParseTree" => s(:defs, s(:self), :setup, + s(:args, :ctx), + s(:lasgn, :bind, s(:call, nil, :allocate)), + s(:attrasgn, + s(:lvar, :bind), :context=, s(:lvar, :ctx)), + s(:return, s(:lvar, :bind)))) + + add_tests("block_lasgn", + "Ruby" => "x = (y = 1\n(y + 2))", + "ParseTree" => s(:lasgn, :x, + s(:block, + s(:lasgn, :y, s(:lit, 1)), + s(:call, s(:lvar, :y), :+, s(:lit, 2))))) + + add_tests("block_mystery_block", + "Ruby" => "a(b) do\n if b then\n true\n else\n c = false\n d { |x| c = true }\n c\n end\nend", + "ParseTree" => s(:iter, + s(:call, nil, :a, s(:call, nil, :b)), + 0, + s(:if, + s(:call, nil, :b), + s(:true), + s(:block, + s(:lasgn, :c, s(:false)), + s(:iter, + s(:call, nil, :d), + s(:args, :x), + s(:lasgn, :c, s(:true))), + s(:lvar, :c))))) + + add_tests("block_pass_args_and_splat", + "Ruby" => "def blah(*args, &block)\n other(42, *args, &block)\nend", + "ParseTree" => s(:defn, :blah, s(:args, :"*args", :"&block"), + s(:call, nil, :other, + s(:lit, 42), + s(:splat, s(:lvar, :args)), + s(:block_pass, s(:lvar, :block))))) + + add_tests("block_pass_call_0", + "Ruby" => "a.b(&c)", + "ParseTree" => s(:call, + s(:call, nil, :a), + :b, + s(:block_pass, s(:call, nil, :c)))) + + add_tests("block_pass_call_1", + "Ruby" => "a.b(4, &c)", + "ParseTree" => s(:call, + s(:call, nil, :a), + :b, + s(:lit, 4), + s(:block_pass, s(:call, nil, :c)))) + + add_tests("block_pass_call_n", + "Ruby" => "a.b(1, 2, 3, &c)", + "ParseTree" => s(:call, + s(:call, nil, :a), + :b, + s(:lit, 1), s(:lit, 2), s(:lit, 3), + s(:block_pass, s(:call, nil, :c)))) + + add_tests("block_pass_fcall_0", + "Ruby" => "a(&b)", + "ParseTree" => s(:call, nil, :a, + s(:block_pass, s(:call, nil, :b)))) + + add_tests("block_pass_fcall_1", + "Ruby" => "a(4, &b)", + "ParseTree" => s(:call, nil, :a, + s(:lit, 4), + s(:block_pass, s(:call, nil, :b)))) + + add_tests("block_pass_fcall_n", + "Ruby" => "a(1, 2, 3, &b)", + "ParseTree" => s(:call, nil, :a, + s(:lit, 1), s(:lit, 2), s(:lit, 3), + s(:block_pass, s(:call, nil, :b)))) + + add_tests("block_pass_omgwtf", + "Ruby" => "define_attr_method(:x, :sequence_name, &Proc.new { |*args| nil })", + "ParseTree" => s(:call, nil, :define_attr_method, + s(:lit, :x), + s(:lit, :sequence_name), + s(:block_pass, + s(:iter, + s(:call, s(:const, :Proc), :new), + s(:args, :"*args"), + s(:nil))))) + + add_tests("block_pass_splat", + "Ruby" => "def blah(*args, &block)\n other(*args, &block)\nend", + "ParseTree" => s(:defn, :blah, + s(:args, :"*args", :"&block"), + s(:call, nil, :other, + s(:splat, s(:lvar, :args)), + s(:block_pass, s(:lvar, :block))))) + + add_tests("block_pass_thingy", + "Ruby" => "r.read_body(dest, &block)", + "ParseTree" => s(:call, + s(:call, nil, :r), + :read_body, + s(:call, nil, :dest), + s(:block_pass, s(:call, nil, :block)))) + + add_tests("block_stmt_after", + "Ruby" => "def f\n begin\n b\n rescue\n c\n end\n\n d\nend", + "ParseTree" => s(:defn, :f, s(:args), + s(:rescue, + s(:call, nil, :b), + s(:resbody, + s(:array), + s(:call, nil, :c))), + s(:call, nil, :d)), + "Ruby2Ruby" => "def f\n b rescue c\n d\nend") + copy_test_case "block_stmt_after", "Ruby" + copy_test_case "block_stmt_after", "ParseTree" + copy_test_case "block_stmt_after", "Ruby2Ruby" + + add_tests("block_stmt_before", + "Ruby" => "def f\n a\n begin\n b\n rescue\n c\n end\nend", + "ParseTree" => s(:defn, :f, s(:args), + s(:call, nil, :a), + s(:rescue, s(:call, nil, :b), + s(:resbody, + s(:array), + s(:call, nil, :c)))), + "Ruby2Ruby" => "def f\n a\n b rescue c\nend") + # oddly... this one doesn't HAVE any differences when verbose... new? + copy_test_case "block_stmt_before", "Ruby" + copy_test_case "block_stmt_before", "ParseTree" + copy_test_case "block_stmt_before", "Ruby2Ruby" + + add_tests("block_stmt_both", + "Ruby" => "def f\n a\n begin\n b\n rescue\n c\n end\n d\nend", + "ParseTree" => s(:defn, :f, s(:args), + s(:call, nil, :a), + s(:rescue, + s(:call, nil, :b), + s(:resbody, + s(:array), + s(:call, nil, :c))), + s(:call, nil, :d)), + "Ruby2Ruby" => "def f\n a\n b rescue c\n d\nend") + copy_test_case "block_stmt_both", "Ruby" + copy_test_case "block_stmt_both", "ParseTree" + copy_test_case "block_stmt_both", "Ruby2Ruby" + + add_tests("bmethod", + "Ruby" => [Examples, :unsplatted], + "ParseTree" => s(:defn, :unsplatted, s(:args, :x), + s(:call, s(:lvar, :x), :+, s(:lit, 1))), + "Ruby2Ruby" => "def unsplatted(x)\n (x + 1)\nend") + + add_tests("bmethod_noargs", + "Ruby" => [Examples, :bmethod_noargs], + "ParseTree" => s(:defn, :bmethod_noargs, s(:args), + s(:call, + s(:call, nil, :x), + :"+", + s(:lit, 1))), + "Ruby2Ruby" => "def bmethod_noargs\n (x + 1)\nend") + + add_tests("bmethod_splat", + "Ruby" => [Examples, :splatted], + "ParseTree" => s(:defn, :splatted, s(:args, :"*args"), + s(:lasgn, :y, + s(:call, s(:lvar, :args), :first)), + s(:call, s(:lvar, :y), :+, s(:lit, 42))), + "Ruby2Ruby" => "def splatted(*args)\n y = args.first\n (y + 42)\nend") + + add_tests("break", + "Ruby" => "loop { break if true }", + "ParseTree" => s(:iter, + s(:call, nil, :loop), + 0, + s(:if, s(:true), s(:break), nil))) + + add_tests("break_arg", + "Ruby" => "loop { break 42 if true }", + "ParseTree" => s(:iter, + s(:call, nil, :loop), + 0, + s(:if, s(:true), s(:break, s(:lit, 42)), nil))) + + add_tests("call", + "Ruby" => "self.method", + "ParseTree" => s(:call, s(:self), :method)) + + add_tests("call_arglist", + "Ruby" => "o.puts(42)", + "ParseTree" => s(:call, s(:call, nil, :o), :puts, s(:lit, 42))) + + add_tests("call_arglist_hash", + "Ruby" => "o.m(:a => 1, :b => 2)", + "ParseTree" => s(:call, + s(:call, nil, :o), :m, + s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2)))) + + add_tests("call_arglist_norm_hash", + "Ruby" => "o.m(42, :a => 1, :b => 2)", + "ParseTree" => s(:call, + s(:call, nil, :o), :m, + s(:lit, 42), + s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2)))) + + add_tests("call_command", + "Ruby" => "1.b(c)", + "ParseTree" => s(:call, + s(:lit, 1), + :b, + s(:call, nil, :c))) + + add_tests("call_expr", + "Ruby" => "(v = (1 + 1)).zero?", + "ParseTree" => s(:call, + s(:lasgn, :v, + s(:call, s(:lit, 1), :+, s(:lit, 1))), + :zero?)) + + add_tests("call_index", + "Ruby" => "a = []\na[42]\n", + "ParseTree" => s(:block, + s(:lasgn, :a, s(:array)), + s(:call, s(:lvar, :a), :[], s(:lit, 42)))) + + add_tests("call_index_no_args", + "Ruby" => "a[]", + "ParseTree" => s(:call, s(:call, nil, :a), + :[])) + + add_tests("call_index_space", + "Ruby" => "a = []\na [42]\n", + "ParseTree" => s(:block, + s(:lasgn, :a, s(:array)), + s(:call, s(:lvar, :a), :[], s(:lit, 42))), + "Ruby2Ruby" => "a = []\na[42]\n") + + add_tests("call_no_space_symbol", + "Ruby" => "foo:bar", + "ParseTree" => s(:call, nil, :foo, s(:lit, :bar)), + "Ruby2Ruby" => "foo(:bar)") + + add_tests("call_unary_neg", + "Ruby" => "-2**31", + "ParseTree" => s(:call, + s(:call, s(:lit, 2), :**, s(:lit, 31)), + :-@), + "Ruby2Ruby" => "-(2 ** 31)") + + add_tests("case", + "Ruby" => "var = 2\nresult = \"\"\ncase var\nwhen 1 then\n puts(\"something\")\n result = \"red\"\nwhen 2, 3 then\n result = \"yellow\"\nwhen 4 then\n # do nothing\nelse\n result = \"green\"\nend\ncase result\nwhen \"red\" then\n var = 1\nwhen \"yellow\" then\n var = 2\nwhen \"green\" then\n var = 3\nend\n", + "ParseTree" => s(:block, + s(:lasgn, :var, s(:lit, 2)), + s(:lasgn, :result, s(:str, "")), + s(:case, + s(:lvar, :var), + s(:when, + s(:array, s(:lit, 1)), + s(:call, nil, :puts, s(:str, "something")), + s(:lasgn, :result, s(:str, "red"))), + s(:when, + s(:array, s(:lit, 2), s(:lit, 3)), + s(:lasgn, :result, s(:str, "yellow"))), + s(:when, s(:array, s(:lit, 4)), nil), + s(:lasgn, :result, s(:str, "green"))), + s(:case, + s(:lvar, :result), + s(:when, s(:array, s(:str, "red")), + s(:lasgn, :var, s(:lit, 1))), + s(:when, s(:array, s(:str, "yellow")), + s(:lasgn, :var, s(:lit, 2))), + s(:when, s(:array, s(:str, "green")), + s(:lasgn, :var, s(:lit, 3))), + nil))) + + add_tests("case_nested", + "Ruby" => "var1 = 1\nvar2 = 2\nresult = nil\ncase var1\nwhen 1 then\n case var2\n when 1 then\n result = 1\n when 2 then\n result = 2\n else\n result = 3\n end\nwhen 2 then\n case var2\n when 1 then\n result = 4\n when 2 then\n result = 5\n else\n result = 6\n end\nelse\n result = 7\nend\n", + "ParseTree" => s(:block, + s(:lasgn, :var1, s(:lit, 1)), + s(:lasgn, :var2, s(:lit, 2)), + s(:lasgn, :result, s(:nil)), + s(:case, + s(:lvar, :var1), + s(:when, s(:array, s(:lit, 1)), + s(:case, + s(:lvar, :var2), + s(:when, s(:array, s(:lit, 1)), + s(:lasgn, :result, s(:lit, 1))), + s(:when, s(:array, s(:lit, 2)), + s(:lasgn, :result, s(:lit, 2))), + s(:lasgn, :result, s(:lit, 3)))), + s(:when, s(:array, s(:lit, 2)), + s(:case, + s(:lvar, :var2), + s(:when, s(:array, s(:lit, 1)), + s(:lasgn, :result, s(:lit, 4))), + s(:when, s(:array, s(:lit, 2)), + s(:lasgn, :result, s(:lit, 5))), + s(:lasgn, :result, s(:lit, 6)))), + s(:lasgn, :result, s(:lit, 7))))) + + add_tests("case_nested_inner_no_expr", + "Ruby" => "case a\nwhen b then\n case\n when (d and e) then\n f\n end\nend", + "ParseTree" => s(:case, s(:call, nil, :a), + s(:when, + s(:array, s(:call, nil, :b)), + s(:case, nil, + s(:when, + s(:array, + s(:and, + s(:call, nil, :d), + s(:call, nil, :e))), + s(:call, nil, :f)), + nil)), + nil)) + + add_tests("case_no_expr", + "Ruby" => "case\nwhen (a == 1) then\n :a\nwhen (a == 2) then\n :b\nelse\n :c\nend", + "ParseTree" => s(:case, nil, + s(:when, + s(:array, + s(:call, + s(:call, nil, :a), + :==, + s(:lit, 1))), + s(:lit, :a)), + s(:when, + s(:array, + s(:call, + s(:call, nil, :a), + :==, + s(:lit, 2))), + s(:lit, :b)), + s(:lit, :c))) + + add_tests("case_splat", + "Ruby" => "case a\nwhen :b, *c then\n d\nelse\n e\nend", + "ParseTree" => s(:case, s(:call, nil, :a), + s(:when, + s(:array, + s(:lit, :b), + s(:splat, s(:call, nil, :c))), + s(:call, nil, :d)), + s(:call, nil, :e))) + + add_tests("cdecl", + "Ruby" => "X = 42", + "ParseTree" => s(:cdecl, :X, s(:lit, 42))) + + add_tests("class_plain", + "Ruby" => "class X\n puts((1 + 1))\n \n def blah\n puts(\"hello\")\n end\nend", + "ParseTree" => s(:class, :X, nil, + s(:call, nil, :puts, + s(:call, s(:lit, 1), :+, s(:lit, 1))), + s(:defn, :blah, s(:args), + s(:call, nil, :puts, s(:str, "hello"))))) + + add_tests("class_scoped", + "Ruby" => "class X::Y\n c\nend", + "ParseTree" => s(:class, s(:colon2, s(:const, :X), :Y), nil, + s(:call, nil, :c))) + + add_tests("class_scoped3", + "Ruby" => "class ::Y\n c\nend", + "ParseTree" => s(:class, s(:colon3, :Y), nil, + s(:call, nil, :c))) + + add_tests("class_super_array", + "Ruby" => "class X < Array\nend", + "ParseTree" => s(:class, :X, s(:const, :Array))) + + add_tests("class_super_expr", + "Ruby" => "class X < expr\nend", + "ParseTree" => s(:class, :X, s(:call, nil, :expr))) + + add_tests("class_super_object", + "Ruby" => "class X < Object\nend", + "ParseTree" => s(:class, :X, s(:const, :Object))) + + add_tests("colon2", + "Ruby" => "X::Y", + "ParseTree" => s(:colon2, s(:const, :X), :Y)) + + add_tests("colon3", + "Ruby" => "::X", + "ParseTree" => s(:colon3, :X)) + + add_tests("const", + "Ruby" => "X", + "ParseTree" => s(:const, :X)) + + add_tests("constX", + "Ruby" => "X = 1", + "ParseTree" => s(:cdecl, :X, s(:lit, 1))) + + add_tests("constY", + "Ruby" => "::X = 1", + "ParseTree" => s(:cdecl, s(:colon3, :X), s(:lit, 1))) + + add_tests("constZ", + "Ruby" => "X::Y = 1", + "ParseTree" => s(:cdecl, + s(:colon2, s(:const, :X), :Y), + s(:lit, 1))) + + add_tests("cvar", + "Ruby" => "@@x", + "ParseTree" => s(:cvar, :@@x)) + + add_tests("cvasgn", + "Ruby" => "def x\n @@blah = 1\nend", + "ParseTree" => s(:defn, :x, s(:args), + s(:cvasgn, :@@blah, s(:lit, 1)))) + + add_tests("cvasgn_cls_method", + "Ruby" => "def self.quiet_mode=(boolean)\n @@quiet_mode = boolean\nend", + "ParseTree" => s(:defs, s(:self), :quiet_mode=, + s(:args, :boolean), + s(:cvasgn, :@@quiet_mode, + s(:lvar, :boolean)))) + + add_tests("cvdecl", + "Ruby" => "class X\n @@blah = 1\nend", + "ParseTree" => s(:class, :X, nil, + s(:cvdecl, :@@blah, s(:lit, 1)))) + + add_tests("dasgn_0", + "Ruby" => "a.each { |x| b.each { |y| x = (x + 1) } if true }", + "ParseTree" => s(:iter, + s(:call, s(:call, nil, :a), :each), + s(:args, :x), + s(:if, s(:true), + s(:iter, + s(:call, s(:call, nil, :b), :each), + s(:args, :y), + s(:lasgn, :x, + s(:call, s(:lvar, :x), :+, s(:lit, 1)))), + nil))) + + add_tests("dasgn_1", + "Ruby" => "a.each { |x| b.each { |y| c = (c + 1) } if true }", + "ParseTree" => s(:iter, + s(:call, s(:call, nil, :a), :each), + s(:args, :x), + s(:if, s(:true), + s(:iter, + s(:call, s(:call, nil, :b), :each), + s(:args, :y), + s(:lasgn, :c, + s(:call, s(:lvar, :c), :+, s(:lit, 1)))), + nil))) + + add_tests("dasgn_2", + "Ruby" => "a.each do |x|\n if true then\n c = 0\n b.each { |y| c = (c + 1) }\n end\nend", + "ParseTree" => s(:iter, + s(:call, s(:call, nil, :a), :each), + s(:args, :x), + s(:if, s(:true), + s(:block, + s(:lasgn, :c, s(:lit, 0)), + s(:iter, + s(:call, s(:call, nil, :b), :each), + s(:args, :y), + s(:lasgn, :c, + s(:call, s(:lvar, :c), :+, + s(:lit, 1))))), + nil))) + + add_tests("dasgn_curr", + "Ruby" => "data.each do |x, y|\n a = 1\n b = a\n b = a = x\nend", + "ParseTree" => s(:iter, + s(:call, s(:call, nil, :data), :each), + s(:args, :x, :y), + s(:block, + s(:lasgn, :a, s(:lit, 1)), + s(:lasgn, :b, s(:lvar, :a)), + s(:lasgn, :b, s(:lasgn, :a, s(:lvar, :x)))))) + + add_tests("dasgn_icky", + "Ruby" => "a do\n v = nil\n assert_block(full_message) do\n begin\n yield\n rescue Exception => v\n break\n end\n end\nend", + "ParseTree" => s(:iter, + s(:call, nil, :a), + 0, + s(:block, + s(:lasgn, :v, s(:nil)), + s(:iter, + s(:call, nil, :assert_block, + s(:call, nil, :full_message)), + 0, + s(:rescue, + s(:yield), + s(:resbody, + s(:array, + s(:const, :Exception), + s(:lasgn, :v, s(:gvar, :$!))), + s(:break))))))) + + add_tests("dasgn_mixed", + "Ruby" => "t = 0\nns.each { |n| t += n }\n", + "ParseTree" => s(:block, + s(:lasgn, :t, s(:lit, 0)), + s(:iter, + s(:call, s(:call, nil, :ns), :each), + s(:args, :n), + s(:lasgn, :t, + s(:call, s(:lvar, :t), :+, s(:lvar, :n))))), + "Ruby2Ruby" => "t = 0\nns.each { |n| t = (t + n) }\n") + + add_tests("defined", + "Ruby" => "defined? $x", + "ParseTree" => s(:defined, s(:gvar, :$x))) + + add_tests("defn_args_block", # TODO: make all the defn_args* p their arglist + "Ruby" => "def f(&block)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, s(:args, :"&block"), + s(:nil))) + + add_tests("defn_args_mand", + "Ruby" => "def f(mand)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, s(:args, :mand), + s(:nil))) + + add_tests("defn_args_mand_block", + "Ruby" => "def f(mand, &block)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, s(:args, :mand, :"&block"), + s(:nil))) + + add_tests("defn_args_mand_opt", + "Ruby" => "def f(mand, opt = 42)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :mand, s(:lasgn, :opt, s(:lit, 42))), + s(:nil))) + + add_tests("defn_args_mand_opt_block", + "Ruby" => "def f(mand, opt = 42, &block)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :mand, s(:lasgn, :opt, s(:lit, 42)), :"&block"), + s(:nil))) + + add_tests("defn_args_mand_opt_splat", + "Ruby" => "def f(mand, opt = 42, *rest)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :mand, s(:lasgn, :opt, s(:lit, 42)), :"*rest"), + s(:nil))) + + add_tests("defn_args_mand_opt_splat_block", + "Ruby" => "def f(mand, opt = 42, *rest, &block)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :mand, s(:lasgn, :opt, s(:lit, 42)), :"*rest", :"&block"), + s(:nil))) + + add_tests("defn_args_mand_opt_splat_no_name", + "Ruby" => "def x(a, b = 42, *)\n # do nothing\nend", + "ParseTree" => s(:defn, :x, + s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :"*"), + s(:nil))) + + add_tests("defn_args_mand_splat", + "Ruby" => "def f(mand, *rest)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :mand, :"*rest"), + s(:nil))) + + add_tests("defn_args_mand_splat_block", + "Ruby" => "def f(mand, *rest, &block)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, :mand, :"*rest", :"&block"), + s(:nil))) + + add_tests("defn_args_mand_splat_no_name", + "Ruby" => "def x(a, *args)\n p(a, args)\nend", + "ParseTree" => s(:defn, :x, s(:args, :a, :"*args"), + s(:call, nil, :p, + s(:lvar, :a), s(:lvar, :args)))) + + add_tests("defn_args_none", + "Ruby" => "def empty\n # do nothing\nend", + "ParseTree" => s(:defn, :empty, s(:args), + s(:nil))) + + add_tests("defn_args_opt", + "Ruby" => "def f(opt = 42)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, s(:lasgn, :opt, s(:lit, 42))), + s(:nil))) + + add_tests("defn_args_opt_block", + "Ruby" => "def f(opt = 42, &block)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, s(:lasgn, :opt, s(:lit, 42)), :"&block"), + s(:nil))) + + add_tests("defn_args_opt_splat", + "Ruby" => "def f(opt = 42, *rest)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, s(:lasgn, :opt, s(:lit, 42)), :"*rest"), + s(:nil))) + + add_tests("defn_args_opt_splat_block", + "Ruby" => "def f(opt = 42, *rest, &block)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, + s(:args, + s(:lasgn, :opt, s(:lit, 42)), + :"*rest", :"&block"), + s(:nil))) + + add_tests("defn_args_opt_splat_no_name", + "Ruby" => "def x(b = 42, *)\n # do nothing\nend", + "ParseTree" => s(:defn, :x, + s(:args, s(:lasgn, :b, s(:lit, 42)), :"*"), + s(:nil))) + + add_tests("defn_args_splat", + "Ruby" => "def f(*rest)\n # do nothing\nend", + "ParseTree" => s(:defn, :f, s(:args, :"*rest"), + s(:nil))) + + add_tests("defn_args_splat_no_name", + "Ruby" => "def x(*)\n # do nothing\nend", + "ParseTree" => s(:defn, :x, s(:args, :"*"), + s(:nil))) + + add_tests("defn_or", + "Ruby" => "def |(o)\n # do nothing\nend", + "ParseTree" => s(:defn, :|, s(:args, :o), + s(:nil))) + + add_tests("defn_rescue", + "Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid)\nrescue\n false\nend", + "ParseTree" => s(:defn, :eql?, + s(:args, :resource), + s(:rescue, + s(:call, + s(:call, s(:self), :uuid), + :==, + s(:call, s(:lvar, :resource), :uuid)), + s(:resbody, s(:array), s(:false)))), + "Ruby2Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid) rescue false\nend") + + add_tests("defn_rescue_mri_verbose_flag", + "Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid)\nrescue\n false\nend", + "ParseTree" => s(:defn, :eql?, + s(:args, :resource), + s(:rescue, + s(:call, + s(:call, s(:self), :uuid), + :==, + s(:call, s(:lvar, :resource), :uuid)), + s(:resbody, s(:array), s(:false)))), + "Ruby2Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid) rescue false\nend") + + add_tests("defn_something_eh", + "Ruby" => "def something?\n # do nothing\nend", + "ParseTree" => s(:defn, :something?, + s(:args), + s(:nil))) + + add_tests("defn_splat_no_name", + "Ruby" => "def x(a, *)\n p(a)\nend", + "ParseTree" => s(:defn, :x, + s(:args, :a, :"*"), + s(:call, nil, :p, s(:lvar, :a)))) + + add_tests("defn_zarray", + "Ruby" => "def zarray\n a = []\n return a\nend", + "ParseTree" => s(:defn, :zarray, + s(:args), + s(:lasgn, :a, s(:array)), + s(:return, s(:lvar, :a)))) + + add_tests("defs", + "Ruby" => "def self.x(y)\n (y + 1)\nend", + "ParseTree" => s(:defs, s(:self), :x, + s(:args, :y), + s(:call, s(:lvar, :y), :+, s(:lit, 1)))) + + add_tests("defs_empty", + "Ruby" => "def self.empty\n # do nothing\nend", + "ParseTree" => s(:defs, s(:self), :empty, s(:args), s(:nil))) + + add_tests("defs_empty_args", + "Ruby" => "def self.empty(*)\n # do nothing\nend", + "ParseTree" => s(:defs, s(:self), :empty, + s(:args, :*), + s(:nil))) + + add_tests("defs_expr_wtf", + "Ruby" => "def (a.b).empty(*)\n # do nothing\nend", + "ParseTree" => s(:defs, + s(:call, s(:call, nil, :a), :b), + :empty, + s(:args, :*), + s(:nil))) + + add_tests("dmethod", + "Ruby" => [Examples, :dmethod_added], + "ParseTree" => s(:defn, :dmethod_added, + s(:args, :x), + s(:call, s(:lvar, :x), :+, s(:lit, 1))), + "Ruby2Ruby" => "def dmethod_added(x)\n (x + 1)\nend") + + add_tests("dot2", + "Ruby" => "(a..b)", + "ParseTree" => s(:dot2, + s(:call, nil, :a), + s(:call, nil, :b))) + + add_tests("dot3", + "Ruby" => "(a...b)", + "ParseTree" => s(:dot3, + s(:call, nil, :a), + s(:call, nil, :b))) + + add_tests("dregx", + "Ruby" => "/x#\{(1 + 1)}y/", + "ParseTree" => s(:dregx, "x", + s(:evstr, + s(:call, s(:lit, 1), :+, s(:lit, 1))), + s(:str, "y"))) + + add_tests("dregx_interp", + "Ruby" => "/#\{@rakefile}/", + "ParseTree" => s(:dregx, "", s(:evstr, s(:ivar, :@rakefile)))) + + add_tests("dregx_interp_empty", + "Ruby" => "/a#\{}b/", + "ParseTree" => s(:dregx, "a", s(:evstr), s(:str, "b"))) + + add_tests("dregx_n", + "Ruby" => '/#{1}/n', + "ParseTree" => s(:dregx, "", + s(:evstr, s(:lit, 1)), /x/n.options)) + + add_tests("dregx_once", + "Ruby" => "/x#\{(1 + 1)}y/o", + "ParseTree" => s(:dregx_once, "x", + s(:evstr, + s(:call, s(:lit, 1), :+, s(:lit, 1))), + s(:str, "y"))) + + add_tests("dregx_once_n_interp", + "Ruby" => "/#\{IAC}#\{SB}/no", + "ParseTree" => s(:dregx_once, "", + s(:evstr, s(:const, :IAC)), + s(:evstr, s(:const, :SB)), /x/n.options)) + + add_tests("dstr", + "Ruby" => "argl = 1\n\"x#\{argl}y\"\n", + "ParseTree" => s(:block, + s(:lasgn, :argl, s(:lit, 1)), + s(:dstr, "x", s(:evstr, s(:lvar, :argl)), + s(:str, "y")))) + + add_tests("dstr_2", + "Ruby" => "argl = 1\n\"x#\{(\"%.2f\" % 3.14159)}y\"\n", + "ParseTree" => s(:block, + s(:lasgn, :argl, s(:lit, 1)), + s(:dstr, + "x", + s(:evstr, + s(:call, s(:str, "%.2f"), :%, + s(:lit, 3.14159))), + s(:str, "y")))) + + add_tests("dstr_3", + "Ruby" => "max = 2\nargl = 1\n\"x#\{(\"%.#\{max}f\" % 3.14159)}y\"\n", + "ParseTree" => s(:block, + s(:lasgn, :max, s(:lit, 2)), + s(:lasgn, :argl, s(:lit, 1)), + s(:dstr, "x", + s(:evstr, + s(:call, + s(:dstr, "%.", + s(:evstr, s(:lvar, :max)), + s(:str, "f")), + :%, + s(:lit, 3.14159))), + s(:str, "y")))) + + add_tests("dstr_concat", + "Ruby" => '"#{22}aa" "cd#{44}" "55" "#{66}"', + "ParseTree" => s(:dstr, + "", + s(:evstr, s(:lit, 22)), + s(:str, "aa"), + s(:str, "cd"), + s(:evstr, s(:lit, 44)), + s(:str, "55"), + s(:evstr, s(:lit, 66))), + "Ruby2Ruby" => '"#{22}aacd#{44}55#{66}"') + + add_tests("dstr_gross", + "Ruby" => '"a #$global b #@ivar c #@@cvar d"', + "ParseTree" => s(:dstr, "a ", + s(:evstr, s(:gvar, :$global)), + s(:str, " b "), + s(:evstr, s(:ivar, :@ivar)), + s(:str, " c "), + s(:evstr, s(:cvar, :@@cvar)), + s(:str, " d")), + "Ruby2Ruby" => '"a #{$global} b #{@ivar} c #{@@cvar} d"') + + add_tests("dstr_heredoc_expand", + "Ruby" => "<<EOM\n blah\n#\{1 + 1}blah\nEOM\n", + "ParseTree" => s(:dstr, " blah\n", + s(:evstr, s(:call, s(:lit, 1), :+, s(:lit, 1))), + s(:str, "blah\n")), + "Ruby2Ruby" => "\" blah\\n#\{(1 + 1)}blah\\n\"") + + add_tests("dstr_heredoc_windoze_sucks", + "Ruby" => "<<-EOF\r\ndef test_#\{action}_valid_feed\r\n EOF\r\n", + "ParseTree" => s(:dstr, + "def test_", + s(:evstr, s(:call, nil, :action)), + s(:str, "_valid_feed\n")), + "Ruby2Ruby" => "\"def test_#\{action}_valid_feed\\n\"") + + add_tests("dstr_heredoc_yet_again", + "Ruby" => "<<-EOF\ns1 '#\{RUBY_PLATFORM}' s2\n#\{__FILE__}\n EOF\n", + "ParseTree" => s(:dstr, "s1 '", + s(:evstr, s(:const, :RUBY_PLATFORM)), + s(:str, "' s2\n"), + s(:str, "(string)"), + s(:str, "\n")), + "Ruby2Ruby" => "\"s1 '#\{RUBY_PLATFORM}' s2\\n(string)\\n\"") + + add_tests("dstr_nest", + "Ruby" => "%Q[before [#\{nest}] after]", + "ParseTree" => s(:dstr, "before [", + s(:evstr, s(:call, nil, :nest)), + s(:str, "] after")), + "Ruby2Ruby" => "\"before [#\{nest}] after\"") + + add_tests("dstr_str_lit_start", + "Ruby" => '"#{"blah"}#{__FILE__}:#{__LINE__}: warning: #{$!.message} (#{$!.class})"', + "ParseTree" => s(:dstr, + "blah(string):", + s(:evstr, s(:lit, 1)), + s(:str, ": warning: "), + s(:evstr, s(:call, s(:gvar, :$!), :message)), + s(:str, " ("), + s(:evstr, s(:call, s(:gvar, :$!), :class)), + s(:str, ")")), + "Ruby2Ruby" => '"blah(string):#{1}: warning: #{$!.message} (#{$!.class})"') + + add_tests("dstr_the_revenge", + "Ruby" => '"before #{from} middle #{to} (#{__FILE__}:#{__LINE__})"', + "ParseTree" => s(:dstr, + "before ", + s(:evstr, s(:call, nil, :from)), + s(:str, " middle "), + s(:evstr, s(:call, nil, :to)), + s(:str, " ("), + s(:str, "(string)"), + s(:str, ":"), + s(:evstr, s(:lit, 1)), + s(:str, ")")), + "Ruby2Ruby" => '"before #{from} middle #{to} ((string):#{1})"') + + add_tests("dsym", + "Ruby" => ":\"x#\{(1 + 1)}y\"", + "ParseTree" => s(:dsym, "x", + s(:evstr, s(:call, s(:lit, 1), :+, s(:lit, 1))), + s(:str, "y"))) + + add_tests("dxstr", + "Ruby" => "t = 5\n`touch #\{t}`\n", + "ParseTree" => s(:block, + s(:lasgn, :t, s(:lit, 5)), + s(:dxstr, "touch ", s(:evstr, s(:lvar, :t))))) + + add_tests("ensure", + "Ruby" => "begin\n (1 + 1)\nrescue SyntaxError => e1\n 2\nrescue Exception => e2\n 3\nelse\n 4\nensure\n 5\nend", + "ParseTree" => s(:ensure, + s(:rescue, + s(:call, s(:lit, 1), :+, s(:lit, 1)), + s(:resbody, + s(:array, + s(:const, :SyntaxError), + s(:lasgn, :e1, s(:gvar, :$!))), + s(:lit, 2)), + s(:resbody, + s(:array, + s(:const, :Exception), + s(:lasgn, :e2, s(:gvar, :$!))), + s(:lit, 3)), + s(:lit, 4)), + s(:lit, 5))) + + add_tests("false", + "Ruby" => "false", + "ParseTree" => s(:false)) + + add_tests("fbody", + "Ruby" => [Examples, :an_alias], + "ParseTree" => s(:defn, :an_alias, s(:args, :x), + s(:call, s(:lvar, :x), :+, s(:lit, 1))), + "Ruby2Ruby" => "def an_alias(x)\n (x + 1)\nend") + + add_tests("fcall_arglist", + "Ruby" => "m(42)", + "ParseTree" => s(:call, nil, :m, s(:lit, 42))) + + add_tests("fcall_arglist_hash", + "Ruby" => "m(:a => 1, :b => 2)", + "ParseTree" => s(:call, nil, :m, + s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2)))) + + add_tests("fcall_arglist_norm_hash", + "Ruby" => "m(42, :a => 1, :b => 2)", + "ParseTree" => s(:call, nil, :m, + s(:lit, 42), + s(:hash, + s(:lit, :a), s(:lit, 1), + s(:lit, :b), s(:lit, 2)))) + + add_tests("fcall_block", + "Ruby" => "a(:b) { :c }", + "ParseTree" => s(:iter, + s(:call, nil, :a, s(:lit, :b)), + 0, + s(:lit, :c))) + + add_tests("fcall_index_space", + "Ruby" => "a [42]", + "ParseTree" => s(:call, nil, :a, s(:array, s(:lit, 42))), + "Ruby2Ruby" => "a([42])") + + add_tests("fcall_inside_parens", + "Ruby" => "( a (b), c)", + "ParseTree" => s(:call, nil, :a, + s(:call, nil, :b), s(:call, nil, :c)), + "Ruby2Ruby" => "a(b, c)") + + add_tests("fcall_keyword", + "Ruby" => "42 if block_given?", + "ParseTree" => s(:if, + s(:call, nil, :block_given?), + s(:lit, 42), nil)) + + add_tests("flip2", + "Ruby" => "x = if ((i % 4) == 0)..((i % 3) == 0) then\n i\nelse\n nil\nend", + "ParseTree" => s(:lasgn, + :x, + s(:if, + s(:flip2, + s(:call, + s(:call, s(:call, nil, :i), + :%, + s(:lit, 4)), + :==, + s(:lit, 0)), + s(:call, + s(:call, s(:call, nil, :i), + :%, + s(:lit, 3)), + :==, + s(:lit, 0))), + s(:call, nil, :i), + s(:nil)))) + + add_tests("flip2_method", + "Ruby" => "if 1..2.a?(b) then\n nil\nend", + "ParseTree" => s(:if, + s(:flip2, + s(:lit, 1), + s(:call, s(:lit, 2), :a?, s(:call, nil, :b))), + s(:nil), + nil)) + + add_tests("flip3", + "Ruby" => "x = if ((i % 4) == 0)...((i % 3) == 0) then\n i\nelse\n nil\nend", + "ParseTree" => s(:lasgn, + :x, + s(:if, + s(:flip3, + s(:call, + s(:call, s(:call, nil, :i), + :%, + s(:lit, 4)), + :==, + s(:lit, 0)), + s(:call, + s(:call, s(:call, nil, :i), + :%, + s(:lit, 3)), + :==, + s(:lit, 0))), + s(:call, nil, :i), + s(:nil)))) + + add_tests("for", + "Ruby" => "for o in ary do\n puts(o)\nend", + "ParseTree" => s(:for, + s(:call, nil, :ary), + s(:lasgn, :o), + s(:call, nil, :puts, s(:lvar, :o)))) + + add_tests("for_no_body", + "Ruby" => "for i in (0..max) do\n # do nothing\nend", + "ParseTree" => s(:for, + s(:dot2, + s(:lit, 0), + s(:call, nil, :max)), + s(:lasgn, :i))) + + add_tests("gasgn", + "Ruby" => "$x = 42", + "ParseTree" => s(:gasgn, :$x, s(:lit, 42))) + + add_tests("global", + "Ruby" => "$stderr", + "ParseTree" => s(:gvar, :$stderr)) + + add_tests("gvar", + "Ruby" => "$x", + "ParseTree" => s(:gvar, :$x)) + + add_tests("gvar_underscore", + "Ruby" => "$_", + "ParseTree" => s(:gvar, :$_)) + + add_tests("gvar_underscore_blah", + "Ruby" => "$__blah", + "ParseTree" => s(:gvar, :$__blah)) + + add_tests("hash", + "Ruby" => "{ 1 => 2, 3 => 4 }", + "ParseTree" => s(:hash, + s(:lit, 1), s(:lit, 2), + s(:lit, 3), s(:lit, 4))) + + add_tests("hash_rescue", + "Ruby" => "{ 1 => (2 rescue 3) }", + "ParseTree" => s(:hash, + s(:lit, 1), + s(:rescue, + s(:lit, 2), + s(:resbody, s(:array), s(:lit, 3))))) + + add_tests("iasgn", + "Ruby" => "@a = 4", + "ParseTree" => s(:iasgn, :@a, s(:lit, 4))) + + add_tests("if_block_condition", + "Ruby" => "if (x = 5\n(x + 1)) then\n nil\nend", + "ParseTree" => s(:if, + s(:block, + s(:lasgn, :x, s(:lit, 5)), + s(:call, s(:lvar, :x), :+, s(:lit, 1))), + s(:nil), + nil)) + + add_tests("if_lasgn_short", + "Ruby" => "if x = obj.x then\n x.do_it\nend", + "ParseTree" => s(:if, + s(:lasgn, :x, + s(:call, + s(:call, nil, :obj), + :x)), + s(:call, s(:lvar, :x), :do_it), + nil)) + + add_tests("if_nested", + "Ruby" => "return if false unless true", + "ParseTree" => s(:if, s(:true), nil, + s(:if, s(:false), s(:return), nil))) + + add_tests("if_post", + "Ruby" => "a if b", + "ParseTree" => s(:if, s(:call, nil, :b), + s(:call, nil, :a), nil)) + + add_tests("if_pre", + "Ruby" => "if b then a end", + "ParseTree" => s(:if, s(:call, nil, :b), + s(:call, nil, :a), nil), + "Ruby2Ruby" => "a if b") + + add_tests("iter_call_arglist_space", + "Ruby" => "a (1) {|c|d}", + "ParseTree" => s(:iter, + s(:call, nil, :a, s(:lit, 1)), + s(:args, :c), + s(:call, nil, :d)), + "Ruby2Ruby" => "a(1) { |c| d }") + + add_tests("iter_dasgn_curr_dasgn_madness", + "Ruby" => "as.each { |a|\n b += a.b(false) }", + "ParseTree" => s(:iter, + s(:call, s(:call, nil, :as), :each), + s(:args, :a), + s(:lasgn, :b, + s(:call, + s(:lvar, :b), + :+, + s(:call, s(:lvar, :a), :b, s(:false))))), + "Ruby2Ruby" => "as.each { |a| b = (b + a.b(false)) }") + + add_tests("iter_downto", + "Ruby" => "3.downto(1) { |n| puts(n.to_s) }", + "ParseTree" => s(:iter, + s(:call, s(:lit, 3), :downto, s(:lit, 1)), + s(:args, :n), + s(:call, nil, :puts, + s(:call, s(:lvar, :n), :to_s)))) + + add_tests("iter_each_lvar", + "Ruby" => "array = [1, 2, 3]\narray.each { |x| puts(x.to_s) }\n", + "ParseTree" => s(:block, + s(:lasgn, :array, + s(:array, + s(:lit, 1), s(:lit, 2), s(:lit, 3))), + s(:iter, + s(:call, s(:lvar, :array), :each), + s(:args, :x), + s(:call, nil, :puts, + s(:call, s(:lvar, :x), :to_s))))) + + add_tests("iter_each_nested", + "Ruby" => "array1 = [1, 2, 3]\narray2 = [4, 5, 6, 7]\narray1.each do |x|\n array2.each do |y|\n puts(x.to_s)\n puts(y.to_s)\n end\nend\n", + "ParseTree" => s(:block, + s(:lasgn, :array1, + s(:array, + s(:lit, 1), s(:lit, 2), s(:lit, 3))), + s(:lasgn, :array2, + s(:array, + s(:lit, 4), s(:lit, 5), + s(:lit, 6), s(:lit, 7))), + s(:iter, + s(:call, s(:lvar, :array1), :each), + s(:args, :x), + s(:iter, + s(:call, s(:lvar, :array2), :each), + s(:args, :y), + s(:block, + s(:call, nil, :puts, + s(:call, s(:lvar, :x), :to_s)), + s(:call, nil, :puts, + s(:call, s(:lvar, :y), :to_s))))))) + + add_tests("iter_loop_empty", + "Ruby" => "loop { }", + "ParseTree" => s(:iter, s(:call, nil, :loop), 0)) + + add_tests("iter_masgn_2", + "Ruby" => "a { |b, c| p(c) }", + "ParseTree" => s(:iter, + s(:call, nil, :a), + s(:args, :b, :c), + s(:call, nil, :p, s(:lvar, :c)))) + + add_tests("iter_masgn_args_splat", + "Ruby" => "a { |b, c, *d| p(c) }", + "ParseTree" => s(:iter, + s(:call, nil, :a), + s(:args, :b, :c, :"*d"), + s(:call, nil, :p, s(:lvar, :c)))) + + add_tests("iter_masgn_args_splat_no_name", + "Ruby" => "a { |b, c, *| p(c) }", + "ParseTree" => s(:iter, + s(:call, nil, :a), + s(:args, :b, :c, :*), + s(:call, nil, :p, s(:lvar, :c)))) + + add_tests("iter_masgn_splat", + "Ruby" => "a { |*c| p(c) }", + "ParseTree" => s(:iter, + s(:call, nil, :a), + s(:args, :"*c"), + s(:call, nil, :p, s(:lvar, :c)))) + + add_tests("iter_masgn_splat_no_name", + "Ruby" => "a { |*| p(c) }", + "ParseTree" => s(:iter, + s(:call, nil, :a), + s(:args, :*), + s(:call, nil, :p, s(:call, nil, :c)))) + + add_tests("iter_shadowed_var", + "Ruby" => "a do |x|\n b do |x|\n puts x\n end\nend", + "ParseTree" => s(:iter, + s(:call, nil, :a), + s(:args, :x), + s(:iter, + s(:call, nil, :b), + s(:args, :x), + s(:call, nil, :puts, s(:lvar, :x)))), + "Ruby2Ruby" => "a { |x| b { |x| puts(x) } }") + + add_tests("iter_upto", + "Ruby" => "1.upto(3) { |n| puts(n.to_s) }", + "ParseTree" => s(:iter, + s(:call, s(:lit, 1), :upto, s(:lit, 3)), + s(:args, :n), + s(:call, nil, :puts, + s(:call, s(:lvar, :n), :to_s)))) + + add_tests("iter_while", + "Ruby" => "argl = 10\nwhile (argl >= 1) do\n puts(\"hello\")\n argl = (argl - 1)\nend\n", + "ParseTree" => s(:block, + s(:lasgn, :argl, s(:lit, 10)), + s(:while, + s(:call, s(:lvar, :argl), :">=", s(:lit, 1)), + s(:block, + s(:call, nil, :puts, s(:str, "hello")), + s(:lasgn, + :argl, + s(:call, s(:lvar, :argl), :"-", + s(:lit, 1)))), + true))) + + add_tests("ivar", + "Ruby" => [Examples, :reader], + "ParseTree" => s(:defn, :reader, s(:args), + s(:ivar, :@reader)), + "Ruby2Ruby" => "attr_reader :reader") + + add_tests("lambda_args_anon_star", + "Ruby" => "lambda { |*| nil }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :*), + s(:nil))) + + add_tests("lambda_args_anon_star_block", + "Ruby" => "lambda { |*, &block| block }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :*, :"&block"), + s(:lvar, :block))) + + add_tests("lambda_args_block", + "Ruby" => "lambda { |&block| block }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :"&block"), + s(:lvar, :block))) + + add_tests("lambda_args_norm_anon_star", + "Ruby" => "lambda { |a, *| a }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :a, :*), + s(:lvar, :a))) + + add_tests("lambda_args_norm_anon_star_block", + "Ruby" => "lambda { |a, *, &block| block }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :a, :*, :"&block"), + s(:lvar, :block))) + + add_tests("lambda_args_norm_block", + "Ruby" => "lambda { |a, &block| block }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :a, :"&block"), + s(:lvar, :block))) + + add_tests("lambda_args_norm_comma", + "Ruby" => "lambda { |a,| a }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :a, nil), + s(:lvar, :a))) + + add_tests("lambda_args_norm_comma2", + "Ruby" => "lambda { |a, b,| a }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :a, :b, nil), + s(:lvar, :a))) + + add_tests("lambda_args_norm_star", + "Ruby" => "lambda { |a, *star| star }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :a, :"*star"), + s(:lvar, :star))) + + add_tests("lambda_args_norm_star_block", + "Ruby" => "lambda { |a, *star, &block| block }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :a, :"*star", :"&block"), + s(:lvar, :block))) + + add_tests("lambda_args_star", + "Ruby" => "lambda { |*star| star }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :"*star"), + s(:lvar, :star))) + + add_tests("lambda_args_star_block", + "Ruby" => "lambda { |*star, &block| block }", + "ParseTree" => s(:iter, + s(:call, nil, :lambda), + s(:args, :"*star", :"&block"), + s(:lvar, :block))) + + add_tests("lasgn_array", + "Ruby" => "var = [\"foo\", \"bar\"]", + "ParseTree" => s(:lasgn, :var, + s(:array, + s(:str, "foo"), + s(:str, "bar")))) + + add_tests("lasgn_call", + "Ruby" => "c = (2 + 3)", + "ParseTree" => s(:lasgn, :c, + s(:call, s(:lit, 2), :+, s(:lit, 3)))) + + add_tests("lit_bool_false", + "Ruby" => "false", + "ParseTree" => s(:false)) + + add_tests("lit_bool_true", + "Ruby" => "true", + "ParseTree" => s(:true)) + + add_tests("lit_float", + "Ruby" => "1.1", + "ParseTree" => s(:lit, 1.1)) + + add_tests("lit_long", + "Ruby" => "1", + "ParseTree" => s(:lit, 1)) + + add_tests("lit_long_negative", + "Ruby" => "-1", + "ParseTree" => s(:lit, -1)) + + add_tests("lit_range2", + "Ruby" => "(1..10)", + "ParseTree" => s(:lit, 1..10)) + + add_tests("lit_range3", + "Ruby" => "(1...10)", + "ParseTree" => s(:lit, 1...10)) + + add_tests("lit_regexp", + "Ruby" => "/x/", + "ParseTree" => s(:lit, /x/)) + + add_tests("lit_regexp_i_wwtt", + "Ruby" => "str.split(//i)", + "ParseTree" => s(:call, + s(:call, nil, :str), + :split, + s(:lit, //i))) + + add_tests("lit_regexp_n", + "Ruby" => "/x/n", # HACK differs on 1.9 - this is easiest + "ParseTree" => s(:lit, /x/n), + "Ruby2Ruby" => /x/n.inspect) + + add_tests("lit_regexp_once", + "Ruby" => "/x/o", + "ParseTree" => s(:lit, /x/), + "Ruby2Ruby" => "/x/") + + add_tests("lit_sym", + "Ruby" => ":x", + "ParseTree" => s(:lit, :x)) + + add_tests("lit_sym_splat", + "Ruby" => ":\"*args\"", + "ParseTree" => s(:lit, :"*args")) + + add_tests("lvar_def_boundary", + "Ruby" => "b = 42\ndef a\n c do\n begin\n do_stuff\n rescue RuntimeError => b\n puts(b)\n end\n end\nend\n", + "ParseTree" => s(:block, + s(:lasgn, :b, s(:lit, 42)), + s(:defn, :a, s(:args), + s(:iter, + s(:call, nil, :c), + 0, + s(:rescue, + s(:call, nil, :do_stuff), + s(:resbody, + s(:array, + s(:const, :RuntimeError), + s(:lasgn, :b, s(:gvar, :$!))), + s(:call, nil, :puts, + s(:lvar, :b)))))))) + + add_tests("masgn", + "Ruby" => "a, b = c, d", + "ParseTree" => s(:masgn, + s(:array, s(:lasgn, :a), s(:lasgn, :b)), + s(:array, s(:call, nil, :c), + s(:call, nil, :d)))) + + add_tests("masgn_argscat", + "Ruby" => "a, b, *c = 1, 2, *[3, 4]", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:lasgn, :b), + s(:splat, s(:lasgn, :c))), + s(:array, + s(:lit, 1), s(:lit, 2), + s(:splat, + s(:array, s(:lit, 3), s(:lit, 4)))))) + + add_tests("masgn_attrasgn", + "Ruby" => "a, b.c = d, e", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:attrasgn, + s(:call, nil, :b), + :c=)), + s(:array, + s(:call, nil, :d), + s(:call, nil, :e)))) + + add_tests("masgn_attrasgn_array_rhs", + "Ruby" => "a.b, a.c, _ = q", + "ParseTree" => s(:masgn, + s(:array, + s(:attrasgn, + s(:call, nil, :a), + :b=), + s(:attrasgn, + s(:call, nil, :a), + :c=), + s(:lasgn, :_)), + s(:to_ary, + s(:call, nil, :q)))) + + add_tests("masgn_attrasgn_idx", + "Ruby" => "a, i, j = [], 1, 2\na[i], a[j] = a[j], a[i]\n", + "ParseTree" => s(:block, + s(:masgn, + s(:array, + s(:lasgn, :a), + s(:lasgn, :i), s(:lasgn, :j)), + s(:array, s(:array), s(:lit, 1), s(:lit, 2))), + s(:masgn, + s(:array, + s(:attrasgn, + s(:lvar, :a), :[]=, s(:lvar, :i)), + s(:attrasgn, + s(:lvar, :a), :[]=, s(:lvar, :j))), + s(:array, + s(:call, + s(:lvar, :a), :[], s(:lvar, :j)), + s(:call, + s(:lvar, :a), :[], s(:lvar, :i)))))) + + add_tests("masgn_cdecl", + "Ruby" => "A, B, C = 1, 2, 3", + "ParseTree" => s(:masgn, + s(:array, s(:cdecl, :A), s(:cdecl, :B), + s(:cdecl, :C)), + s(:array, s(:lit, 1), s(:lit, 2), s(:lit, 3)))) + + add_tests("masgn_iasgn", + "Ruby" => "a, @b = c, d", + "ParseTree" => s(:masgn, + s(:array, s(:lasgn, :a), s(:iasgn, :"@b")), + s(:array, + s(:call, nil, :c), + s(:call, nil, :d)))) + + add_tests("masgn_masgn", + "Ruby" => "a, (b, c) = [1, [2, 3]]", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:masgn, + s(:array, + s(:lasgn, :b), + s(:lasgn, :c)))), + s(:to_ary, + s(:array, + s(:lit, 1), + s(:array, + s(:lit, 2), + s(:lit, 3)))))) + + add_tests("masgn_splat_lhs", + "Ruby" => "a, b, *c = d, e, f, g", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:lasgn, :b), + s(:splat, s(:lasgn, :c))), + s(:array, + s(:call, nil, :d), + s(:call, nil, :e), + s(:call, nil, :f), + s(:call, nil, :g)))) + + add_tests("masgn_splat_no_name_to_ary", + "Ruby" => "a, b, * = c", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:lasgn, :b), + s(:splat)), + s(:to_ary, s(:call, nil, :c)))) + + add_tests("masgn_splat_no_name_trailing", + "Ruby" => "a, b, = c", + "ParseTree" => s(:masgn, + s(:array, s(:lasgn, :a), s(:lasgn, :b)), + s(:to_ary, s(:call, nil, :c))), + "Ruby2Ruby" => "a, b = c") # TODO: check this is right + + add_tests("masgn_splat_rhs_1", + "Ruby" => "a, b = *c", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:lasgn, :b)), + s(:splat, s(:call, nil, :c)))) + + add_tests("masgn_splat_rhs_n", + "Ruby" => "a, b = c, d, *e", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:lasgn, :b)), + s(:array, + s(:call, nil, :c), + s(:call, nil, :d), + s(:splat, s(:call, nil, :e))))) + + add_tests("masgn_splat_to_ary", + "Ruby" => "a, b, *c = d", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:lasgn, :b), + s(:splat, s(:lasgn, :c))), + s(:to_ary, s(:call, nil, :d)))) + + add_tests("masgn_splat_to_ary2", + "Ruby" => "a, b, *c = d.e(\"f\")", + "ParseTree" => s(:masgn, + s(:array, + s(:lasgn, :a), + s(:lasgn, :b), + s(:splat, s(:lasgn, :c))), + s(:to_ary, + s(:call, + s(:call, nil, :d), + :e, + s(:str, "f"))))) + + add_tests("match", + "Ruby" => "1 if /x/", + "ParseTree" => s(:if, s(:match, s(:lit, /x/)), s(:lit, 1), nil)) + + add_tests("match2", + "Ruby" => "/x/ =~ \"blah\"", + "ParseTree" => s(:match2, s(:lit, /x/), s(:str, "blah"))) + + add_tests("match3", + "Ruby" => "\"blah\" =~ /x/", + "ParseTree" => s(:match3, s(:lit, /x/), s(:str, "blah"))) + + add_tests("module", + "Ruby" => "module X\n def y\n # do nothing\n end\nend", + "ParseTree" => s(:module, :X, + s(:defn, :y, s(:args), s(:nil)))) + + add_tests("module2", + "Ruby" => "module X\n def y\n # do nothing\n end\n \n def z\n # do nothing\n end\nend", + "ParseTree" => s(:module, :X, + s(:defn, :y, s(:args), s(:nil)), + s(:defn, :z, s(:args), s(:nil)))) + + add_tests("module_scoped", + "Ruby" => "module X::Y\n c\nend", + "ParseTree" => s(:module, s(:colon2, s(:const, :X), :Y), + s(:call, nil, :c))) + + add_tests("module_scoped3", + "Ruby" => "module ::Y\n c\nend", + "ParseTree" => s(:module, s(:colon3, :Y), + s(:call, nil, :c))) + + add_tests("next", + "Ruby" => "loop { next if false }", + "ParseTree" => s(:iter, + s(:call, nil, :loop), + 0, + s(:if, s(:false), s(:next), nil))) + + add_tests("next_arg", + "Ruby" => "loop { next 42 if false }", + "ParseTree" => s(:iter, + s(:call, nil, :loop), + 0, + s(:if, s(:false), s(:next, s(:lit, 42)), nil))) + + add_tests("nth_ref", + "Ruby" => "$1", + "ParseTree" => s(:nth_ref, 1)) + + add_tests("op_asgn1", + "Ruby" => "b = []\nb[1] ||= 10\nb[2] &&= 11\nb[3] += 12\n", + "ParseTree" => s(:block, + s(:lasgn, :b, s(:array)), + s(:op_asgn1, s(:lvar, :b), + s(:arglist, s(:lit, 1)), :"||", s(:lit, 10)), + s(:op_asgn1, s(:lvar, :b), + s(:arglist, s(:lit, 2)), :"&&", s(:lit, 11)), + s(:op_asgn1, s(:lvar, :b), + s(:arglist, s(:lit, 3)), :+, s(:lit, 12)))) + + add_tests("op_asgn1_ivar", + "Ruby" => "@b = []\n@b[1] ||= 10\n@b[2] &&= 11\n@b[3] += 12\n", + "ParseTree" => s(:block, + s(:iasgn, :@b, s(:array)), + s(:op_asgn1, s(:ivar, :@b), + s(:arglist, s(:lit, 1)), :"||", s(:lit, 10)), + s(:op_asgn1, s(:ivar, :@b), + s(:arglist, s(:lit, 2)), :"&&", s(:lit, 11)), + s(:op_asgn1, s(:ivar, :@b), + s(:arglist, s(:lit, 3)), :+, s(:lit, 12)))) + + add_tests("op_asgn2", + "Ruby" => "s = Struct.new(:var)\nc = s.new(nil)\nc.var ||= 20\nc.var &&= 21\nc.var += 22\nc.d.e.f ||= 42\n", + "ParseTree" => s(:block, + s(:lasgn, :s, + s(:call, + s(:const, :Struct), + :new, + s(:lit, :var))), + s(:lasgn, :c, + s(:call, s(:lvar, :s), :new, s(:nil))), + s(:op_asgn2, s(:lvar, :c), + :var=, :"||", s(:lit, 20)), + s(:op_asgn2, s(:lvar, :c), + :var=, :"&&", s(:lit, 21)), + s(:op_asgn2, s(:lvar, :c), + :var=, :+, s(:lit, 22)), + s(:op_asgn2, + s(:call, + s(:call, s(:lvar, :c), :d), + :e), + :f=, :"||", s(:lit, 42)))) + + add_tests("op_asgn2_self", + "Ruby" => "self.Bag ||= Bag.new", + "ParseTree" => s(:op_asgn2, s(:self), :"Bag=", :"||", + s(:call, s(:const, :Bag), :new))) + + add_tests("op_asgn_and", + "Ruby" => "a = 0\na &&= 2\n", + "ParseTree" => s(:block, + s(:lasgn, :a, s(:lit, 0)), + s(:op_asgn_and, + s(:lvar, :a), s(:lasgn, :a, s(:lit, 2))))) + + add_tests("op_asgn_and_ivar2", + "Ruby" => "@fetcher &&= new(Gem.configuration[:http_proxy])", + "ParseTree" => s(:op_asgn_and, + s(:ivar, :@fetcher), + s(:iasgn, + :@fetcher, + s(:call, nil, + :new, + s(:call, + s(:call, s(:const, :Gem), :configuration), + :[], + s(:lit, :http_proxy)))))) + + add_tests("op_asgn_or", + "Ruby" => "a = 0\na ||= 1\n", + "ParseTree" => s(:block, + s(:lasgn, :a, s(:lit, 0)), + s(:op_asgn_or, + s(:lvar, :a), s(:lasgn, :a, s(:lit, 1))))) + + add_tests("op_asgn_or_block", + "Ruby" => "a ||= begin\n b\n rescue\n c\n end", + "ParseTree" => s(:op_asgn_or, + s(:lvar, :a), + s(:lasgn, :a, + s(:rescue, + s(:call, nil, :b), + s(:resbody, s(:array), + s(:call, nil, :c))))), + "Ruby2Ruby" => "a ||= b rescue c") + + add_tests("op_asgn_or_ivar", + "Ruby" => "@v ||= {}", + "ParseTree" => s(:op_asgn_or, + s(:ivar, :@v), + s(:iasgn, :@v, s(:hash)))) + + add_tests("op_asgn_or_ivar2", + "Ruby" => "@fetcher ||= new(Gem.configuration[:http_proxy])", + "ParseTree" => s(:op_asgn_or, + s(:ivar, :@fetcher), + s(:iasgn, + :@fetcher, + s(:call, nil, :new, + s(:call, + s(:call, s(:const, :Gem), :configuration), + :[], + s(:lit, :http_proxy)))))) + + add_tests("or", + "Ruby" => "(a or b)", + "ParseTree" => s(:or, + s(:call, nil, :a), + s(:call, nil, :b))) + + add_tests("or_big", + "Ruby" => "((a or b) or (c and d))", + "ParseTree" => s(:or, + s(:or, + s(:call, nil, :a), + s(:call, nil, :b)), + s(:and, + s(:call, nil, :c), + s(:call, nil, :d)))) + + add_tests("or_big2", + "Ruby" => "((a || b) || (c && d))", + "ParseTree" => s(:or, + s(:or, + s(:call, nil, :a), + s(:call, nil, :b)), + s(:and, + s(:call, nil, :c), + s(:call, nil, :d))), + "Ruby2Ruby" => "((a or b) or (c and d))") + + add_tests("parse_floats_as_args", + "Ruby" => "def x(a=0.0,b=0.0)\n a+b\nend", + "ParseTree" => s(:defn, :x, + s(:args, + s(:lasgn, :a, s(:lit, 0.0)), + s(:lasgn, :b, s(:lit, 0.0))), + s(:call, s(:lvar, :a), :+, s(:lvar, :b))), + "Ruby2Ruby" => "def x(a = 0.0, b = 0.0)\n (a + b)\nend") + + add_tests("postexe", + "Ruby" => "END { 1 }", + "ParseTree" => s(:iter, s(:postexe), 0, s(:lit, 1))) + + add_tests("proc_args_0", + "Ruby" => "proc { || (x + 1) }", + "ParseTree" => s(:iter, + s(:call, nil, :proc), + s(:args), + s(:call, s(:call, nil, :x), :+, s(:lit, 1)))) + + add_tests("proc_args_1", + "Ruby" => "proc { |x| (x + 1) }", + "ParseTree" => s(:iter, + s(:call, nil, :proc), + s(:args, :x), + s(:call, s(:lvar, :x), :+, s(:lit, 1)))) + + add_tests("proc_args_2", + "Ruby" => "proc { |x, y| (x + y) }", + "ParseTree" => s(:iter, + s(:call, nil, :proc), + s(:args, :x, :y), + s(:call, s(:lvar, :x), :+, s(:lvar, :y)))) + + add_tests("proc_args_no", + "Ruby" => "proc { (x + 1) }", + "ParseTree" => s(:iter, + s(:call, nil, :proc), + 0, + s(:call, s(:call, nil, :x), :+, s(:lit, 1)))) + + add_tests("redo", + "Ruby" => "loop { redo if false }", + "ParseTree" => s(:iter, + s(:call, nil, :loop), + 0, + s(:if, s(:false), s(:redo), nil))) + + add_tests("rescue", # TODO: need a resbody w/ multiple classes and a splat + "Ruby" => "blah rescue nil", + "ParseTree" => s(:rescue, + s(:call, nil, :blah), + s(:resbody, s(:array), s(:nil)))) + + add_tests("rescue_block_body", + "Ruby" => "begin\n a\nrescue => e\n c\n d\nend", + "ParseTree" => s(:rescue, + s(:call, nil, :a), + s(:resbody, + s(:array, s(:lasgn, :e, s(:gvar, :$!))), + s(:call, nil, :c), + s(:call, nil, :d)))) + + add_tests("rescue_block_body_3", + "Ruby" => "begin\n a\nrescue A\n b\nrescue B\n c\nrescue C\n d\nend", + "ParseTree" => s(:rescue, + s(:call, nil, :a), + s(:resbody, s(:array, s(:const, :A)), + s(:call, nil, :b)), + s(:resbody, s(:array, s(:const, :B)), + s(:call, nil, :c)), + s(:resbody, s(:array, s(:const, :C)), + s(:call, nil, :d)))) + + add_tests("rescue_block_body_ivar", + "Ruby" => "begin\n a\nrescue => @e\n c\n d\nend", + "ParseTree" => s(:rescue, + s(:call, nil, :a), + s(:resbody, + s(:array, s(:iasgn, :@e, s(:gvar, :$!))), + s(:call, nil, :c), + s(:call, nil, :d)))) + + add_tests("rescue_block_nada", + "Ruby" => "begin\n blah\nrescue\n # do nothing\nend", + "ParseTree" => s(:rescue, + s(:call, nil, :blah), + s(:resbody, s(:array), nil))) + + add_tests("rescue_exceptions", + "Ruby" => "begin\n blah\nrescue RuntimeError => r\n # do nothing\nend", + "ParseTree" => s(:rescue, + s(:call, nil, :blah), + s(:resbody, + s(:array, + s(:const, :RuntimeError), + s(:lasgn, :r, s(:gvar, :$!))), + nil))) + + add_tests("rescue_iasgn_var_empty", + "Ruby" => "begin\n 1\nrescue => @e\n # do nothing\nend", + "ParseTree" => s(:rescue, + s(:lit, 1), + s(:resbody, + s(:array, s(:iasgn, :@e, s(:gvar, :$!))), + nil))) + + add_tests("rescue_lasgn", + "Ruby" => "begin\n 1\nrescue\n var = 2\nend", + "ParseTree" => s(:rescue, + s(:lit, 1), + s(:resbody, + s(:array), + s(:lasgn, :var, s(:lit, 2)))), + "Ruby2Ruby" => "1 rescue var = 2") + + add_tests("rescue_lasgn_var", + "Ruby" => "begin\n 1\nrescue => e\n var = 2\nend", + "ParseTree" => s(:rescue, + s(:lit, 1), + s(:resbody, + s(:array, s(:lasgn, :e, s(:gvar, :$!))), + s(:lasgn, :var, s(:lit, 2))))) + + add_tests("rescue_lasgn_var_empty", + "Ruby" => "begin\n 1\nrescue => e\n # do nothing\nend", + "ParseTree" => s(:rescue, + s(:lit, 1), + s(:resbody, + s(:array, s(:lasgn, :e, s(:gvar, :$!))), + nil))) + + add_tests("retry", + "Ruby" => "retry", + "ParseTree" => s(:retry)) + + add_tests("return_0", + "Ruby" => "return", + "ParseTree" => s(:return)) + + add_tests("return_1", + "Ruby" => "return 1", + "ParseTree" => s(:return, s(:lit, 1))) + + add_tests("return_1_splatted", + "Ruby" => "return *1", + "ParseTree" => s(:return, s(:svalue, s(:splat, s(:lit, 1))))) + + add_tests("return_n", + "Ruby" => "return 1, 2, 3", + "ParseTree" => s(:return, s(:array, + s(:lit, 1), s(:lit, 2), s(:lit, 3))), + "Ruby2Ruby" => "return [1, 2, 3]") + + add_tests("sclass", + "Ruby" => "class << self\n 42\nend", + "ParseTree" => s(:sclass, s(:self), s(:lit, 42))) + + add_tests("sclass_multiple", + "Ruby" => "class << self\n x\n y\nend", + "ParseTree" => s(:sclass, s(:self), + s(:call, nil, :x), s(:call, nil, :y))) + + add_tests("sclass_trailing_class", + "Ruby" => "class A\n class << self\n a\n end\n \n class B\n end\nend", + "ParseTree" => s(:class, :A, nil, + s(:sclass, s(:self), + s(:call, nil, :a)), + s(:class, :B, nil))) + + add_tests("splat", + "Ruby" => "def x(*b)\n a(*b)\nend", + "ParseTree" => s(:defn, :x, + s(:args, :"*b"), + s(:call, nil, :a, s(:splat, s(:lvar, :b))))) + + add_tests("splat_array", + "Ruby" => "[*[1]]", + "ParseTree" => s(:array, s(:splat, s(:array, s(:lit, 1))))) + + add_tests("splat_break", + "Ruby" => "break *[1]", + "ParseTree" => s(:break, s(:svalue, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_break_array", + "Ruby" => "break [*[1]]", + "ParseTree" => s(:break, s(:array, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_fcall", + "Ruby" => "meth(*[1])", + "ParseTree" => s(:call, + nil, + :meth, + s(:splat, s(:array, s(:lit, 1))))) + + add_tests("splat_fcall_array", + "Ruby" => "meth([*[1]])", + "ParseTree" => s(:call, nil, :meth, + s(:array, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_lasgn", + "Ruby" => "x = *[1]", + "ParseTree" => s(:lasgn, :x, s(:svalue, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_lasgn_array", + "Ruby" => "x = [*[1]]", + "ParseTree" => s(:lasgn, :x, s(:array, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_lit_1", + "Ruby" => "[*1]", +# UGH - damn MRI + "ParseTree" => s(:array, s(:splat, s(:lit, 1)))) + + add_tests("splat_lit_n", + "Ruby" => "[1, *2]", + "ParseTree" => s(:array, s(:lit, 1), s(:splat, s(:lit, 2)))) + + add_tests("splat_next", + "Ruby" => "next *[1]", + "ParseTree" => s(:next, s(:svalue, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_next_array", + "Ruby" => "next [*[1]]", + "ParseTree" => s(:next, s(:array, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_return", + "Ruby" => "return *[1]", + "ParseTree" => s(:return, s(:svalue, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_return_array", + "Ruby" => "return [*[1]]", + "ParseTree" => s(:return, s(:array, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_super", + "Ruby" => "super(*[1])", + "ParseTree" => s(:super, s(:splat, s(:array, s(:lit, 1))))) + + add_tests("splat_super_array", + "Ruby" => "super([*[1]])", + "ParseTree" => s(:super, s(:array, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("splat_yield", + "Ruby" => "yield(*[1])", + "ParseTree" => s(:yield, s(:splat, s(:array, s(:lit, 1))))) + + add_tests("splat_yield_array", + "Ruby" => "yield([*[1]])", + "ParseTree" => s(:yield, s(:array, s(:splat, s(:array, s(:lit, 1)))))) + + add_tests("str", + "Ruby" => '"x"', + "ParseTree" => s(:str, "x")) + + add_tests("str_concat_newline", # FIX? make prettier? possible? + "Ruby" => '"before" \\ + " after"', + "ParseTree" => s(:str, "before after"), + "Ruby2Ruby" => '"before after"') + + add_tests("str_concat_space", + "Ruby" => '"before" " after"', + "ParseTree" => s(:str, "before after"), + "Ruby2Ruby" => '"before after"') + + add_tests("str_heredoc", + "Ruby" => "<<'EOM'\n blah\nblah\nEOM", + "ParseTree" => s(:str, " blah\nblah\n"), + "Ruby2Ruby" => "\" blah\\nblah\\n\"") + + add_tests("str_heredoc_call", + "Ruby" => "<<'EOM'.strip\n blah\nblah\nEOM", + "ParseTree" => s(:call, s(:str, " blah\nblah\n"), + :strip), + "Ruby2Ruby" => "\" blah\\nblah\\n\".strip") + + add_tests("str_heredoc_double", + "Ruby" => "a += <<-H1 + b + <<-H2\n first\nH1\n second\nH2", + "ParseTree" => s(:lasgn, :a, + s(:call, + s(:lvar, :a), + :+, + s(:call, + s(:call, + s(:str, " first\n"), + :+, + s(:call, nil, :b)), + :+, + s(:str, " second\n")))), + "Ruby2Ruby" => "a = (a + ((\" first\\n\" + b) + \" second\\n\"))") + + add_tests("str_heredoc_empty", # yes... tarded + "Ruby" => "<<'EOM'\nEOM", + "ParseTree" => s(:str, ""), + "Ruby2Ruby" => '""') + + add_tests("str_heredoc_indent", + "Ruby" => "<<-EOM\n blah\nblah\n\n EOM", + "ParseTree" => s(:str, " blah\nblah\n\n"), + "Ruby2Ruby" => "\" blah\\nblah\\n\\n\"") + + add_tests("str_interp_file", + "Ruby" => '"file = #{__FILE__}\n"', + "ParseTree" => s(:str, "file = (string)\n"), + "Ruby2Ruby" => '"file = (string)\\n"') + + add_tests("structure_extra_block_for_dvar_scoping", + "Ruby" => "a.b do |c, d|\n unless e.f(c) then\n g = false\n d.h { |x, i| g = true }\n end\nend", + "ParseTree" => s(:iter, + s(:call, s(:call, nil, :a), :b), + s(:args, :c, :d), + s(:if, + s(:call, s(:call, nil, :e), :f, s(:lvar, :c)), + nil, + s(:block, + s(:lasgn, :g, s(:false)), + s(:iter, + s(:call, s(:lvar, :d), :h), + s(:args, :x, :i), + s(:lasgn, :g, s(:true))))))) + + add_tests("structure_remove_begin_1", + "Ruby" => "a << begin\n b\n rescue\n c\n end", + "ParseTree" => s(:call, s(:call, nil, :a), :<<, + s(:rescue, + s(:call, nil, :b), + s(:resbody, s(:array), + s(:call, nil, :c)))), + "Ruby2Ruby" => "(a << (b rescue c))") + + add_tests("structure_remove_begin_2", + "Ruby" => "a = if c\n begin\n b\n rescue\n nil\n end\n end\na", + "ParseTree" => s(:block, + s(:lasgn, + :a, + s(:if, s(:call, nil, :c), + s(:rescue, s(:call, nil, :b), + s(:resbody, + s(:array), s(:nil))), + nil)), + s(:lvar, :a)), + "Ruby2Ruby" => "a = b rescue nil if c\na\n") # OMG that's awesome + + add_tests("super_0", + "Ruby" => "def x\n super()\nend", + "ParseTree" => s(:defn, :x, s(:args), s(:super))) + + add_tests("super_1", + "Ruby" => "def x\n super(4)\nend", + "ParseTree" => s(:defn, :x, s(:args), + s(:super, s(:lit, 4)))) + + add_tests("super_1_array", + "Ruby" => "def x\n super([24, 42])\nend", + "ParseTree" => s(:defn, :x, s(:args), + s(:super, s(:array, s(:lit, 24), s(:lit, 42))))) + + add_tests("super_block_pass", + "Ruby" => "super(a, &b)", + "ParseTree" => s(:super, + s(:call, nil, :a), + s(:block_pass, + s(:call, nil, :b)))) + + add_tests("super_block_splat", + "Ruby" => "super(a, *b)", + "ParseTree" => s(:super, + s(:call, nil, :a), + s(:splat, s(:call, nil, :b)))) + + add_tests("super_n", + "Ruby" => "def x\n super(24, 42)\nend", + "ParseTree" => s(:defn, :x, s(:args), + s(:super, s(:lit, 24), s(:lit, 42)))) + + add_tests("svalue", + "Ruby" => "a = *b", + "ParseTree" => s(:lasgn, :a, + s(:svalue, + s(:splat, s(:call, nil, :b))))) + + add_tests("ternary_nil_no_space", + "Ruby" => "1 ? nil: 1", + "ParseTree" => s(:if, s(:lit, 1), s(:nil), s(:lit, 1)), + "Ruby2Ruby" => "1 ? (nil) : (1)") + + add_tests("ternary_symbol_no_spaces", + "Ruby" => "1?:x:1", + "ParseTree" => s(:if, s(:lit, 1), s(:lit, :x), s(:lit, 1)), + "Ruby2Ruby" => "1 ? (:x) : (1)") + + add_tests("to_ary", + "Ruby" => "a, b = c", + "ParseTree" => s(:masgn, + s(:array, s(:lasgn, :a), s(:lasgn, :b)), + s(:to_ary, s(:call, nil, :c)))) + + add_tests("true", + "Ruby" => "true", + "ParseTree" => s(:true)) + + add_tests("undef", + "Ruby" => "undef :x", + "ParseTree" => s(:undef, s(:lit, :x))) + + add_tests("undef_2", + "Ruby" => "undef :x, :y", + "ParseTree" => s(:block, + s(:undef, s(:lit, :x)), + s(:undef, s(:lit, :y))), + "Ruby2Ruby" => "undef :x\nundef :y\n") + + add_tests("undef_3", + "Ruby" => "undef :x, :y, :z", + "ParseTree" => s(:block, + s(:undef, s(:lit, :x)), + s(:undef, s(:lit, :y)), + s(:undef, s(:lit, :z))), + "Ruby2Ruby" => "undef :x\nundef :y\nundef :z\n") + + add_tests("undef_block_1", + "Ruby" => "f1\nundef :x\n", # TODO: don't like the extra return + "ParseTree" => s(:block, + s(:call, nil, :f1), + s(:undef, s(:lit, :x)))) + + add_tests("undef_block_2", + "Ruby" => "f1\nundef :x, :y", + "ParseTree" => s(:block, + s(:call, nil, :f1), + s(:block, + s(:undef, s(:lit, :x)), + s(:undef, s(:lit, :y)))), + "Ruby2Ruby" => "f1\n(undef :x\nundef :y)\n") + + add_tests("undef_block_3", + "Ruby" => "f1\nundef :x, :y, :z", + "ParseTree" => s(:block, + s(:call, nil, :f1), + s(:block, + s(:undef, s(:lit, :x)), + s(:undef, s(:lit, :y)), + s(:undef, s(:lit, :z)))), + "Ruby2Ruby" => "f1\n(undef :x\nundef :y\nundef :z)\n") + + add_tests("undef_block_3_post", + "Ruby" => "undef :x, :y, :z\nf2", + "ParseTree" => s(:block, + s(:undef, s(:lit, :x)), + s(:undef, s(:lit, :y)), + s(:undef, s(:lit, :z)), + s(:call, nil, :f2)), + "Ruby2Ruby" => "undef :x\nundef :y\nundef :z\nf2\n") + + add_tests("undef_block_wtf", + "Ruby" => "f1\nundef :x, :y, :z\nf2", + "ParseTree" => s(:block, + s(:call, nil, :f1), + s(:block, + s(:undef, s(:lit, :x)), + s(:undef, s(:lit, :y)), + s(:undef, s(:lit, :z))), + s(:call, nil, :f2)), + "Ruby2Ruby" => "f1\n(undef :x\nundef :y\nundef :z)\nf2\n") + + add_tests("unless_post", + "Ruby" => "a unless b", + "ParseTree" => s(:if, s(:call, nil, :b), nil, + s(:call, nil, :a))) + + add_tests("unless_pre", + "Ruby" => "unless b then a end", + "ParseTree" => s(:if, s(:call, nil, :b), nil, + s(:call, nil, :a)), + "Ruby2Ruby" => "a unless b") + + add_tests("until_post", + "Ruby" => "begin\n (1 + 1)\nend until false", + "ParseTree" => s(:until, s(:false), + s(:call, s(:lit, 1), :+, s(:lit, 1)), false)) + + add_tests("until_pre", + "Ruby" => "until false do\n (1 + 1)\nend", + "ParseTree" => s(:until, s(:false), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true)) + + add_tests("until_pre_mod", + "Ruby" => "(1 + 1) until false", + "ParseTree" => s(:until, s(:false), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "until false do\n (1 + 1)\nend") + + add_tests("valias", + "Ruby" => "alias $y $x", + "ParseTree" => s(:valias, :$y, :$x)) + + add_tests("vcall", + "Ruby" => "method", + "ParseTree" => s(:call, nil, :method)) + + add_tests("while_post", + "Ruby" => "begin\n (1 + 1)\nend while false", + "ParseTree" => s(:while, s(:false), + s(:call, s(:lit, 1), :+, s(:lit, 1)), false)) + + add_tests("while_post2", + "Ruby" => "begin\n (1 + 2)\n (3 + 4)\nend while false", + "ParseTree" => s(:while, s(:false), + s(:block, + s(:call, s(:lit, 1), :+, s(:lit, 2)), + s(:call, s(:lit, 3), :+, s(:lit, 4))), + false)) + + add_tests("while_pre", + "Ruby" => "while false do\n (1 + 1)\nend", + "ParseTree" => s(:while, s(:false), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true)) + + add_tests("while_pre_mod", + "Ruby" => "(1 + 1) while false", + "ParseTree" => s(:while, s(:false), + s(:call, s(:lit, 1), :+, s(:lit, 1)), true), + "Ruby2Ruby" => "while false do\n (1 + 1)\nend") # FIX can be one liner + + add_tests("while_pre_nil", + "Ruby" => "while false do\nend", + "ParseTree" => s(:while, s(:false), nil, true)) + + add_tests("xstr", + "Ruby" => "`touch 5`", + "ParseTree" => s(:xstr, "touch 5")) + + add_tests("yield_0", + "Ruby" => "yield", + "ParseTree" => s(:yield)) + + add_tests("yield_1", + "Ruby" => "yield(42)", + "ParseTree" => s(:yield, s(:lit, 42))) + + add_tests("yield_array_0", + "Ruby" => "yield([])", + "ParseTree" => s(:yield, s(:array))) + + add_tests("yield_array_1", + "Ruby" => "yield([42])", + "ParseTree" => s(:yield, s(:array, s(:lit, 42)))) + + add_tests("yield_array_n", + "Ruby" => "yield([42, 24])", + "ParseTree" => s(:yield, s(:array, s(:lit, 42), s(:lit, 24)))) + + add_tests("yield_n", + "Ruby" => "yield(42, 24)", + "ParseTree" => s(:yield, s(:lit, 42), s(:lit, 24))) + + add_tests("zarray", + "Ruby" => "a = []", + "ParseTree" => s(:lasgn, :a, s(:array))) + + add_tests("zsuper", + "Ruby" => "def x\n super\nend", + "ParseTree" => s(:defn, :x, s(:args), s(:zsuper))) + +# TODO: discuss and decide which lit we like +# it "converts a regexp to an sexp" do +# "/blah/".to_sexp.should == s(:regex, "blah", 0) +# "/blah/i".to_sexp.should == s(:regex, "blah", 1) +# "/blah/u".to_sexp.should == s(:regex, "blah", 64) +# end + +end + +# :startdoc: diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp.rb new file mode 100644 index 000000000..00da8b62f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp.rb @@ -0,0 +1,397 @@ +$TESTING ||= false # unless defined $TESTING + +## +# Sexps are the basic storage mechanism of SexpProcessor. Sexps have +# a +type+ (to be renamed +node_type+) which is the first element of +# the Sexp. The type is used by SexpProcessor to determine whom to +# dispatch the Sexp to for processing. + +class Sexp < Array # ZenTest FULL + ## + # A setter for the line this sexp was found on. Usually set by ruby_parser. + + attr_writer :line + + ## + # Set the maximum line number for this sexp. Often set by ruby_parser. + + attr_writer :line_max + + ## + # Accessors for the file. Usually set by ruby_parser. + + attr_accessor :file + + ## + # Optional comments above/aside this sexp. Usually set by ruby_parser. + + attr_accessor :comments + + @@array_types = [ :array, :args ] # TODO: remove + + ## + # Create a new Sexp containing +args+. + + def initialize *args + super(args) + end + + alias _concat concat + + ## + # Creates a new Sexp from Array +a+. + + def self.from_array a + ary = Array === a ? a : [a] + + self.new._concat(ary.map { |x| + case x + when Sexp + x + when Array + self.from_array(x) + else + x + end + }) + end + + ## + # Creates a new sexp with the new contents of +body+, but with the + # same +file+, +line+, and +comment+ as self. + + def new(*body) + r = self.class.new._concat(body) # ensures a sexp from map + r.file = self.file if self.file + r.line = self.line if self.line + r.line_max = self.line_max if defined?(@line_max) + r.comments = self.comments if self.comments + r + end + + def map &blk # :nodoc: + self.new._concat(super(&blk)) # ensures a sexp from map + end + + def == obj # :nodoc: + obj.class == self.class and super # only because of a bug in ruby + end + + def eql? o + self.class == o.class && super + end + + def hash + @hash ||= [self.class, *self].hash + end + + ## + # Returns true if the node_type is +array+ or +args+. + # + # REFACTOR: to TypedSexp - we only care when we have units. + + def array_type? + warn "DEPRECATED: please file an issue if you actually use this. from #{caller.first}" + type = self.sexp_type + @@array_types.include? type + end + + def compact # :nodoc: + self.delete_if(&:nil?) + end + + ## + # Recursively enumerates the sexp yielding to +block+ for every sub-Sexp. + # + # Returning :skip will stop traversing that subtree: + # + # sexp.deep_each do |s| + # next :skip if s.sexp_type == :if + # # ... + # end + + def deep_each &block + return enum_for(:deep_each) unless block_given? + + self.each_sexp do |sexp| + next if block[sexp] == :skip + sexp.deep_each(&block) + end + end + + ## + # Return the maximum depth of the sexp. One-based. + + def depth + 1 + (each_sexp.map(&:depth).max || 0) + end + + ## + # Enumeratates the sexp yielding to +b+ when the node_type == +t+. + + def each_of_type t, &b + return enum_for(:each_of_type, t) unless block_given? + + each_sexp do | sexp | + sexp.each_of_type(t, &b) + yield sexp if sexp.sexp_type == t + end + end + + ## + # Enumerates all sub-sexps skipping non-Sexp elements. + + def each_sexp + return enum_for(:each_sexp) unless block_given? + + self.each do |sexp| + next unless Sexp === sexp + + yield sexp + end + end + + ## + # Replaces all elements whose node_type is +from+ with +to+. Used + # only for the most trivial of rewrites. + + def find_and_replace_all from, to + each_with_index do | elem, index | + if Sexp === elem then + elem.find_and_replace_all(from, to) + elsif elem == from + self[index] = to + end + end + end + + ## + # Replaces all Sexps matching +pattern+ with Sexp +repl+. + + def gsub pattern, repl + return repl if pattern == self + + new = self.map { |subset| + case subset + when Sexp then + if Matcher === pattern && pattern.satisfy?(subset) then # TODO: make === be satisfy? maybe? + repl.dup rescue repl + else + subset.gsub pattern, repl + end + else + subset + end + } + + Sexp.from_array new + end + + def inspect # :nodoc: + sexp_str = self.map(&:inspect).join ", " + if ENV["VERBOSE"] && line then + "s(#{sexp_str}).line(#{line})" + else + "s(#{sexp_str})" + end + end + + def find_node name, delete = false # :nodoc: + matches = find_nodes name + + case matches.size + when 0 then + nil + when 1 then + match = matches.first + delete match if delete + match + else + raise NoMethodError, "multiple nodes for #{name} were found in #{inspect}" + end + end + + ## + # Find every node with type +name+. + + def find_nodes name + each_sexp.find_all { |sexp| sexp.sexp_type == name } + end + + UNASSIGNED = Object.new + + ## + # If passed a line number, sets the line and returns self. Otherwise + # returns the line number. This allows you to do message cascades + # and still get the sexp back. + + def line n = UNASSIGNED + if n != UNASSIGNED then + raise ArgumentError, "setting %p.line %p" % [self, n] unless Integer === n + @line = n + self + else + @line ||= nil + end + end + + ## + # Returns the maximum line number of the children of self. + + def line_max + @line_max ||= self.deep_each.map(&:line).compact.max + end + + ## + # Returns the size of the sexp, flattened. + + def mass + @mass ||= inject(1) { |t, s| Sexp === s ? t + s.mass : t } + end + + ## + # Returns the node named +node+, deleting it if +delete+ is true. + + def method_missing meth, delete = false + r = find_node meth, delete + if ENV["DEBUG"] then + if r.nil? then + warn "%p.method_missing(%p) => nil from %s" % [self, meth, caller.first] + elsif ENV["VERBOSE"] + warn "%p.method_missing(%p) from %s" % [self, meth, caller.first] + end + end + r + end + + def respond_to? msg, private = false # :nodoc: + # why do I need this? Because ruby 2.0 is broken. That's why. + super + end + + def pretty_print q # :nodoc: + nnd = +")" + nnd << ".line(#{line})" if line && ENV["VERBOSE"] + + q.group(1, "s(", nnd) do + q.seplist(self) {|v| q.pp v } + end + end + + ## + # Returns the node type of the Sexp. + + def sexp_type + first + end + + ## + # Sets the node type of the Sexp. + + def sexp_type= v + self[0] = v + end + + ## + # Returns the Sexp body (starting at +from+, defaulting to 1), ie + # the values without the node type. + + def sexp_body from = 1 + self.new._concat(self[from..-1] || []) + end + + ## + # Sets the Sexp body to new content. + + def sexp_body= v + self[1..-1] = v + end + + alias :head :sexp_type + alias :rest :sexp_body + + ## + # If run with debug, Sexp will raise if you shift on an empty + # Sexp. Helps with debugging. + + def shift + raise "I'm empty" if self.empty? + super + end if ($DEBUG or $TESTING) + + ## + # Returns the bare bones structure of the sexp. + # s(:a, :b, s(:c, :d), :e) => s(:a, s(:c)) + + def structure + if Array === self.sexp_type then + warn "NOTE: form s(s(:subsexp)).structure is deprecated. Removing in 5.0" + s(:bogus, *self).structure # TODO: remove >= 4.2.0 + else + s(self.sexp_type, *each_sexp.map(&:structure)) + end + end + + ## + # Replaces the Sexp matching +pattern+ with +repl+. + + def sub pattern, repl + return repl.dup if pattern == self + return repl.dup if Matcher === pattern && pattern.satisfy?(self) + + done = false + + new = self.map do |subset| + if done then + subset + else + case subset + when Sexp then + if pattern == subset then + done = true + repl.dup rescue repl + elsif Matcher === pattern && pattern.satisfy?(subset) then + done = true + repl.dup rescue repl + else + subset.sub pattern, repl + end + else + subset + end + end + end + + Sexp.from_array new + end + + def to_a # :nodoc: + self.map { |o| Sexp === o ? o.to_a : o } + end + + alias to_s inspect # :nodoc: + + ## + # Return the value (last item) of a single element sexp (eg `s(:lit, 42)`). + + def value + raise "multi item sexp" if size > 2 + last + end +end + +## +# This is a very important shortcut to make using Sexps much more awesome. +# +# In its normal form +s(...)+, creates a Sexp instance. If passed a +# block, it creates a Sexp::Matcher using the factory methods on Sexp. +# +# See Matcher and other factory class methods on Sexp. + +def s *args, &blk + return Sexp.class_eval(&blk) if blk + Sexp.new(*args) +end + +require "sexp_matcher" unless defined? Sexp::Matcher +require "strict_sexp" if ENV["SP_DEBUG"] || ENV["STRICT_SEXP"].to_i > 0 diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp_matcher.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp_matcher.rb new file mode 100644 index 000000000..ed46e0603 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp_matcher.rb @@ -0,0 +1,1100 @@ +class Sexp #:nodoc: + ## + # Verifies that +pattern+ is a Matcher and then dispatches to its + # #=~ method. + # + # See Matcher.=~ + + def =~ pattern + raise ArgumentError, "Not a pattern: %p" % [pattern] unless Matcher === pattern + pattern =~ self + end + + ## + # Verifies that +pattern+ is a Matcher and then dispatches to its + # #satisfy? method. + # + # TODO: rename match? + + def satisfy? pattern + raise ArgumentError, "Not a pattern: %p" % [pattern] unless Matcher === pattern + pattern.satisfy? self + end + + ## + # Verifies that +pattern+ is a Matcher and then dispatches to its #/ + # method. + # + # TODO: rename grep? match_all ? find_all ? + + def / pattern + raise ArgumentError, "Not a pattern: %p" % [pattern] unless Matcher === pattern + pattern / self + end + + ## + # Recursively searches for the +pattern+ yielding the matches. + + def search_each pattern, &block # TODO: rename to grep? + raise ArgumentError, "Needs a pattern" unless pattern.kind_of? Matcher + + return enum_for(:search_each, pattern) unless block_given? + + if pattern.satisfy? self then + yield self + end + + self.each_sexp do |subset| + subset.search_each pattern, &block + end + end + + ## + # Recursively searches for the +pattern+ yielding each match, and + # replacing it with the result of the block. + # + + def replace_sexp pattern, &block # TODO: rename to gsub? + raise ArgumentError, "Needs a pattern" unless pattern.kind_of? Matcher + + return yield self if pattern.satisfy? self + + # TODO: Needs #new_from(*new_body) to copy file/line/comment + self.class.new(*self.map { |subset| + case subset + when Sexp then + subset.replace_sexp pattern, &block + else + subset + end + }) + end + + ## + # Matches an S-Expression. + # + # See Matcher for examples. + + def self.q *args + Matcher.new(*args) + end + + def self.s *args + where = caller.first.split(/:/, 3).first(2).join ":" + warn "DEPRECATED: use Sexp.q(...) instead. From %s" % [where] + q(*args) + end + + ## + # Matches any single item. + # + # See Wild for examples. + + def self._ + Wild.new + end + + # TODO: reorder factory methods and classes to match + + ## + # Matches all remaining input. + # + # See Remaining for examples. + + def self.___ + Remaining.new + end + + ## + # Matches an expression or any expression that includes the child. + # + # See Include for examples. + + def self.include child # TODO: rename, name is generic ruby + Include.new(child) + end + + ## + # Matches any atom. + # + # See Atom for examples. + + def self.atom + Atom.new + end + + ## + # Matches when any of the sub-expressions match. + # + # This is also available via Matcher#|. + # + # See Any for examples. + + def self.any *args + Any.new(*args) + end + + ## + # Matches only when all sub-expressions match. + # + # This is also available via Matcher#&. + # + # See All for examples. + + def self.all *args + All.new(*args) + end + + ## + # Matches when sub-expression does not match. + # + # This is also available via Matcher#-@. + # + # See Not for examples. + + def self.not? arg + Not.new arg + end + + class << self + alias - not? + end + + # TODO: add Sibling factory method? + + ## + # Matches anything that has a child matching the sub-expression. + # + # See Child for examples. + + def self.child child + Child.new child + end + + ## + # Matches anything having the same sexp_type, which is the first + # value in a Sexp. + # + # See Type for examples. + + def self.t name + Type.new name + end + + ## + # Matches any atom who's string representation matches the patterns + # passed in. + # + # See Pattern for examples. + + def self.m *values + res = values.map { |value| + case value + when Regexp then + value + else + re = Regexp.escape value.to_s + Regexp.new "\\A%s\\Z" % re + end + } + Pattern.new Regexp.union(*res) + end + + ## + # Matches an atom of the specified +klass+ (or module). + # + # See Pattern for examples. + + def self.k klass + Klass.new klass + end + + ## + # Defines a family of objects that can be used to match sexps to + # certain types of patterns, much like regexps can be used on + # strings. Generally you won't use this class directly. + # + # You would normally create a matcher using the top-level #s method, + # but with a block, calling into the Sexp factory methods. For example: + # + # s{ s(:class, m(/^Test/), _, ___) } + # + # This creates a matcher for classes whose names start with "Test". + # It uses Sexp.m to create a Sexp::Matcher::Pattern matcher, Sexp._ + # to create a Sexp::Matcher::Wild matcher, and Sexp.___ to create a + # Sexp::Matcher::Remaining matcher. It works like this: + # + # s{ # start to create a pattern + # s( # create a sexp matcher + # :class. # for class nodes + # m(/^Test/), # matching name slots that start with "Test" + # _, # any superclass value + # ___ # and whatever is in the class + # ) + # } + # + # Then you can use that with #=~, #/, Sexp#replace_sexp, and others. + # + # For more examples, see the various Sexp class methods, the examples, + # and the tests supplied with Sexp. + # + # * For pattern creation, see factory methods: Sexp::_, Sexp::___, etc. + # * For matching returning truthy/falsey results, see Sexp#=~. + # * For case expressions, see Matcher#===. + # * For getting all subtree matches, see Sexp#/. + # + # If rdoc didn't suck, these would all be links. + + class Matcher < Sexp + ## + # Should #=~ match sub-trees? + + def self.match_subs? + @@match_subs + end + + ## + # Setter for +match_subs?+. + + def self.match_subs= o + @@match_subs = o + end + + self.match_subs = true + + ## + # Does this matcher actually match +o+? Returns falsey if +o+ is + # not a Sexp or if any sub-tree of +o+ is not satisfied by or + # equal to its corresponding sub-matcher. + # + #-- + # TODO: push this up to Sexp and make this the workhorse + # TODO: do the same with ===/satisfy? + + def satisfy? o + return unless o.kind_of?(Sexp) && + (length == o.length || Matcher === last && last.greedy?) + + each_with_index.all? { |child, i| + sexp = o.at i + if Sexp === child then # TODO: when will this NOT be a matcher? + sexp = o.sexp_body i if child.respond_to?(:greedy?) && child.greedy? + child.satisfy? sexp + else + child == sexp + end + } + end + + ## + # Tree equivalent to String#=~, returns true if +self+ matches + # +sexp+ as a whole or in a sub-tree (if +match_subs?+). + # + # TODO: maybe this should NOT be aliased to === ? + # + # TODO: example + + def =~ sexp + raise ArgumentError, "Can't both be matchers: %p" % [sexp] if Matcher === sexp + + self.satisfy?(sexp) || + (self.class.match_subs? && sexp.each_sexp.any? { |sub| self =~ sub }) + end + + alias === =~ # TODO?: alias === satisfy? + + ## + # Searches through +sexp+ for all sub-trees that match this + # matcher and returns a MatchCollection for each match. + # + # TODO: redirect? + # Example: + # Q{ s(:b) } / s(:a, s(:b)) => [s(:b)] + + def / sexp + raise ArgumentError, "can't both be matchers" if Matcher === sexp + + # TODO: move search_each into matcher? + MatchCollection.new sexp.search_each(self).to_a + end + + ## + # Combines the Matcher with another Matcher, the resulting one will + # be satisfied if either Matcher would be satisfied. + # + # TODO: redirect + # Example: + # s(:a) | s(:b) + + def | other + Any.new self, other + end + + ## + # Combines the Matcher with another Matcher, the resulting one will + # be satisfied only if both Matchers would be satisfied. + # + # TODO: redirect + # Example: + # t(:a) & include(:b) + + def & other + All.new self, other + end + + ## + # Returns a Matcher that matches whenever this Matcher would not have matched + # + # Example: + # -s(:a) + + def -@ + Not.new self + end + + ## + # Returns a Matcher that matches if this has a sibling +o+ + # + # Example: + # s(:a) >> s(:b) + + def >> other + Sibling.new self, other + end + + ## + # Is this matcher greedy? Defaults to false. + + def greedy? + false + end + + def inspect # :nodoc: + s = super.dup + s[0] = "q" + s + end + + def pretty_print q # :nodoc: + q.group 1, "q(", ")" do + q.seplist self do |v| + q.pp v + end + end + end + + ## + # Parse a lispy string representation of a matcher into a Matcher. + # See +Parser+. + + def self.parse s + Parser.new(s).parse + end + + ## + # Converts from a lispy string to Sexp matchers in a safe manner. + # + # "(a 42 _ (c) [t x] ___)" => s{ s(:a, 42, _, s(:c), t(:x), ___) } + + class Parser + + ## + # The stream of tokens to parse. See #lex. + + attr_accessor :tokens + + ## + # Create a new Parser instance on +s+ + + def initialize s + self.tokens = lex s + end + + ## + # Converts +s+ into a stream of tokens and adds them to +tokens+. + + def lex s + s.scan %r%[()\[\]]|\"[^"]*\"|/[^/]*/|:?[\w?!=~-]+% + end + + ## + # Returns the next token and removes it from the stream or raises if empty. + + def next_token + raise SyntaxError, "unbalanced input" if tokens.empty? + tokens.shift + end + + ## + # Returns the next token without removing it from the stream. + + def peek_token + tokens.first + end + + ## + # Parses tokens and returns a +Matcher+ instance. + + def parse + result = parse_sexp until tokens.empty? + result + end + + ## + # Parses a string into a sexp matcher: + # + # SEXP : "(" SEXP:args* ")" => Sexp.q(*args) + # | "[" CMD:cmd sexp:args* "]" => Sexp.cmd(*args) + # | "nil" => nil + # | /\d+/:n => n.to_i + # | "___" => Sexp.___ + # | "_" => Sexp._ + # | /^\/(.*)\/$/:re => Regexp.new re[0] + # | /^"(.*)"$/:s => String.new s[0] + # | UP_NAME:name => Object.const_get name + # | NAME:name => name.to_sym + # UP_NAME: /[A-Z]\w*/ + # NAME : /:?[\w?!=~-]+/ + # CMD : t | k | m | atom | not? | - | any | child | include + + def parse_sexp + token = next_token + + case token + when "(" then + parse_list + when "[" then + parse_cmd + when "nil" then + nil + when /^\d+$/ then + token.to_i + when "___" then + Sexp.___ + when "_" then + Sexp._ + when %r%^/(.*)/$% then + re = $1 + raise SyntaxError, "Not allowed: /%p/" % [re] unless + re =~ /\A([\w()|.*+^$]+)\z/ + Regexp.new re + when /^"(.*)"$/ then + $1 + when /^([A-Z]\w*)$/ then + Object.const_get $1 + when /^:?([\w?!=~-]+)$/ then + $1.to_sym + else + raise SyntaxError, "unhandled token: %p" % [token] + end + end + + ## + # Parses a balanced list of expressions and returns the + # equivalent matcher. + + def parse_list + result = [] + + result << parse_sexp while peek_token && peek_token != ")" + next_token # pop off ")" + + Sexp.q(*result) + end + + ## + # A collection of allowed commands to convert into matchers. + + ALLOWED = [:t, :m, :k, :atom, :not?, :-, :any, :child, :include].freeze + + ## + # Parses a balanced command. A command is denoted by square + # brackets and must conform to a whitelisted set of allowed + # commands (see +ALLOWED+). + + def parse_cmd + args = [] + args << parse_sexp while peek_token && peek_token != "]" + next_token # pop off "]" + + cmd = args.shift + args = Sexp.q(*args) + + raise SyntaxError, "bad cmd: %p" % [cmd] unless ALLOWED.include? cmd + + result = Sexp.send cmd, *args + + result + end + end # class Parser + end # class Matcher + + ## + # Matches any single item. + # + # examples: + # + # s(:a) / s{ _ } #=> [s(:a)] + # s(:a, s(s(:b))) / s{ s(_) } #=> [s(s(:b))] + + class Wild < Matcher + ## + # Matches any single element. + + def satisfy? o + true + end + + def inspect # :nodoc: + "_" + end + + def pretty_print q # :nodoc: + q.text "_" + end + end + + ## + # Matches all remaining input. If remaining comes before any other + # matchers, they will be ignored. + # + # examples: + # + # s(:a) / s{ s(:a, ___ ) } #=> [s(:a)] + # s(:a, :b, :c) / s{ s(:a, ___ ) } #=> [s(:a, :b, :c)] + + class Remaining < Matcher + ## + # Always satisfied once this is reached. Think of it as a var arg. + + def satisfy? o + true + end + + def greedy? + true + end + + def inspect # :nodoc: + "___" + end + + def pretty_print q # :nodoc: + q.text "___" + end + end + + ## + # Matches when any of the sub-expressions match. + # + # This is also available via Matcher#|. + # + # examples: + # + # s(:a) / s{ any(s(:a), s(:b)) } #=> [s(:a)] + # s(:a) / s{ s(:a) | s(:b) } #=> [s(:a)] # same thing via | + # s(:a) / s{ any(s(:b), s(:c)) } #=> [] + + class Any < Matcher + ## + # The collection of sub-matchers to match against. + + attr_reader :options + + ## + # Create an Any matcher which will match any of the +options+. + + def initialize *options + @options = options + end + + ## + # Satisfied when any sub expressions match +o+ + + def satisfy? o + options.any? { |exp| + Sexp === exp && exp.satisfy?(o) || exp == o + } + end + + def == o # :nodoc: + super && self.options == o.options + end + + def inspect # :nodoc: + options.map(&:inspect).join(" | ") + end + + def pretty_print q # :nodoc: + q.group 1, "any(", ")" do + q.seplist options do |v| + q.pp v + end + end + end + end + + ## + # Matches only when all sub-expressions match. + # + # This is also available via Matcher#&. + # + # examples: + # + # s(:a) / s{ all(s(:a), s(:b)) } #=> [] + # s(:a, :b) / s{ t(:a) & include(:b)) } #=> [s(:a, :b)] + + class All < Matcher + ## + # The collection of sub-matchers to match against. + + attr_reader :options + + ## + # Create an All matcher which will match all of the +options+. + + def initialize *options + @options = options + end + + ## + # Satisfied when all sub expressions match +o+ + + def satisfy? o + options.all? { |exp| + exp.kind_of?(Sexp) ? exp.satisfy?(o) : exp == o + } + end + + def == o # :nodoc: + super && self.options == o.options + end + + def inspect # :nodoc: + options.map(&:inspect).join(" & ") + end + + def pretty_print q # :nodoc: + q.group 1, "all(", ")" do + q.seplist options do |v| + q.pp v + end + end + end + end + + ## + # Matches when sub-expression does not match. + # + # This is also available via Matcher#-@. + # + # examples: + # + # s(:a) / s{ not?(s(:b)) } #=> [s(:a)] + # s(:a) / s{ -s(:b) } #=> [s(:a)] + # s(:a) / s{ s(not? :a) } #=> [] + + class Not < Matcher + + ## + # The value to negate in the match. + + attr_reader :value + + ## + # Creates a Matcher which will match any Sexp that does not match the +value+ + + def initialize value + @value = value + end + + def == o # :nodoc: + super && self.value == o.value + end + + ## + # Satisfied if a +o+ does not match the +value+ + + def satisfy? o + !(value.kind_of?(Sexp) ? value.satisfy?(o) : value == o) + end + + def inspect # :nodoc: + "not?(%p)" % [value] + end + + def pretty_print q # :nodoc: + q.group 1, "not?(", ")" do + q.pp value + end + end + end + + ## + # Matches anything that has a child matching the sub-expression + # + # example: + # + # s(s(s(s(s(:a))))) / s{ child(s(:a)) } #=> [s(s(s(s(s(:a))))), + # s(s(s(s(:a)))), + # s(s(s(:a))), + # s(s(:a)), + # s(:a)] + + class Child < Matcher + ## + # The child to match. + + attr_reader :child + + ## + # Create a Child matcher which will match anything having a + # descendant matching +child+. + + def initialize child + @child = child + end + + ## + # Satisfied if matches +child+ or +o+ has a descendant matching + # +child+. + + def satisfy? o + child.satisfy?(o) || + (o.kind_of?(Sexp) && o.search_each(child).any?) + end + + def == o # :nodoc: + super && self.child == o.child + end + + def inspect # :nodoc: + "child(%p)" % [child] + end + + def pretty_print q # :nodoc: + q.group 1, "child(", ")" do + q.pp child + end + end + end + + ## + # Matches any atom (non-Sexp). + # + # examples: + # + # s(:a) / s{ s(atom) } #=> [s(:a)] + # s(:a, s(:b)) / s{ s(atom) } #=> [s(:b)] + + class Atom < Matcher + ## + # Satisfied when +o+ is an atom. + + def satisfy? o + !(o.kind_of? Sexp) + end + + def inspect #:nodoc: + "atom" + end + + def pretty_print q # :nodoc: + q.text "atom" + end + end + + ## + # Matches any atom who's string representation matches the patterns + # passed in. + # + # examples: + # + # s(:a) / s{ m('a') } #=> [s(:a)] + # s(:a) / s{ m(/\w/,/\d/) } #=> [s(:a)] + # s(:tests, s(s(:test_a), s(:test_b))) / s{ m(/test_\w/) } #=> [s(:test_a), + # + # TODO: maybe don't require non-sexps? This does respond to =~ now. + + class Pattern < Matcher + + ## + # The regexp to match for the pattern. + + attr_reader :pattern + + def == o # :nodoc: + super && self.pattern == o.pattern + end + + ## + # Create a Patten matcher which will match any atom that either + # matches the input +pattern+. + + def initialize pattern + @pattern = pattern + end + + ## + # Satisfied if +o+ is an atom, and +o+ matches +pattern+ + + def satisfy? o + !o.kind_of?(Sexp) && o.to_s =~ pattern # TODO: question to_s + end + + def inspect # :nodoc: + "m(%p)" % pattern + end + + def pretty_print q # :nodoc: + q.group 1, "m(", ")" do + q.pp pattern + end + end + + def eql? o + super and self.pattern.eql? o.pattern + end + + def hash + [super, pattern].hash + end + end + + ## + # Matches any atom that is an instance of the specified class or module. + # + # examples: + # + # s(:lit, 6.28) / s{ q(:lit, k(Float)) } #=> [s(:lit, 6.28)] + + class Klass < Pattern + def satisfy? o + o.kind_of? self.pattern + end + + def inspect # :nodoc: + "k(%p)" % pattern + end + + def pretty_print q # :nodoc: + q.group 1, "k(", ")" do + q.pp pattern + end + end + end + + ## + # Matches anything having the same sexp_type, which is the first + # value in a Sexp. + # + # examples: + # + # s(:a, :b) / s{ t(:a) } #=> [s(:a, :b)] + # s(:a, :b) / s{ t(:b) } #=> [] + # s(:a, s(:b, :c)) / s{ t(:b) } #=> [s(:b, :c)] + + class Type < Matcher + attr_reader :sexp_type + + ## + # Creates a Matcher which will match any Sexp who's type is +type+, where a type is + # the first element in the Sexp. + + def initialize type + @sexp_type = type + end + + def == o # :nodoc: + super && self.sexp_type == o.sexp_type + end + + ## + # Satisfied if the sexp_type of +o+ is +type+. + + def satisfy? o + o.kind_of?(Sexp) && o.sexp_type == sexp_type + end + + def inspect # :nodoc: + "t(%p)" % sexp_type + end + + def pretty_print q # :nodoc: + q.group 1, "t(", ")" do + q.pp sexp_type + end + end + end + + ## + # Matches an expression or any expression that includes the child. + # + # examples: + # + # s(:a, :b) / s{ include(:b) } #=> [s(:a, :b)] + # s(s(s(:a))) / s{ include(:a) } #=> [s(:a)] + + class Include < Matcher + ## + # The value that should be included in the match. + + attr_reader :value + + ## + # Creates a Matcher which will match any Sexp that contains the + # +value+. + + def initialize value + @value = value + end + + ## + # Satisfied if a +o+ is a Sexp and one of +o+'s elements matches + # value + + def satisfy? o + Sexp === o && o.any? { |c| + # TODO: switch to respond_to?? + Sexp === value ? value.satisfy?(c) : value == c + } + end + + def == o # :nodoc: + super && self.value == o.value + end + + def inspect # :nodoc: + "include(%p)" % [value] + end + + def pretty_print q # :nodoc: + q.group 1, "include(", ")" do + q.pp value + end + end + end + + ## + # See Matcher for sibling relations: <,<<,>>,> + + class Sibling < Matcher + + ## + # The LHS of the matcher. + + attr_reader :subject + + ## + # The RHS of the matcher. + + attr_reader :sibling + + ## + # An optional distance requirement for the matcher. + + attr_reader :distance + + ## + # Creates a Matcher which will match any pair of Sexps that are siblings. + # Defaults to matching the immediate following sibling. + + def initialize subject, sibling, distance = nil + @subject = subject + @sibling = sibling + @distance = distance + end + + ## + # Satisfied if o contains +subject+ followed by +sibling+ + + def satisfy? o + # Future optimizations: + # * Shortcut matching sibling + subject_matches = index_matches(subject, o) + return nil if subject_matches.empty? + + sibling_matches = index_matches(sibling, o) + return nil if sibling_matches.empty? + + subject_matches.any? { |i1, _data_1| + sibling_matches.any? { |i2, _data_2| + distance ? (i2-i1 == distance) : i2 > i1 + } + } + end + + def == o # :nodoc: + super && + self.subject == o.subject && + self.sibling == o.sibling && + self.distance == o.distance + end + + def inspect # :nodoc: + "%p >> %p" % [subject, sibling] + end + + def pretty_print q # :nodoc: + if distance then + q.group 1, "sibling(", ")" do + q.seplist [subject, sibling, distance] do |v| + q.pp v + end + end + else + q.group 1 do + q.pp subject + q.text " >> " + q.pp sibling + end + end + end + + private + + def index_matches pattern, o + indexes = [] + return indexes unless o.kind_of? Sexp + + o.each_with_index do |e, i| + data = {} + if pattern.kind_of?(Sexp) ? pattern.satisfy?(e) : pattern == o[i] + indexes << [i, data] + end + end + + indexes + end + end # class Sibling + + ## + # Wraps the results of a Sexp query. MatchCollection defines + # MatchCollection#/ so that you can chain queries. + # + # For instance: + # res = s(:a, s(:b)) / s{ s(:a,_) } / s{ s(:b) } + + class MatchCollection < Array + ## + # See Traverse#search + + def / pattern + inject(self.class.new) { |result, match| + result.concat match / pattern + } + end + + def inspect # :nodoc: + "MatchCollection.new(%s)" % self.to_a.inspect[1..-2] + end + + alias :to_s :inspect # :nodoc: + + def pretty_print q # :nodoc: + q.group 1, "MatchCollection.new(", ")" do + q.seplist(self) {|v| q.pp v } + end + end + end # class MatchCollection +end # class Sexp diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp_processor.rb new file mode 100644 index 000000000..21c284942 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/sexp_processor.rb @@ -0,0 +1,754 @@ +$TESTING = false unless defined? $TESTING + +require "sexp" + +## +# SexpProcessor provides a uniform interface to process Sexps. +# +# In order to create your own SexpProcessor subclass you'll need +# to call super in the initialize method, then set any of the +# Sexp flags you want to be different from the defaults. +# +# SexpProcessor uses a Sexp's type to determine which process method +# to call in the subclass. For Sexp <code>s(:lit, 1)</code> +# SexpProcessor will call #process_lit, if it is defined. +# +# You can also specify a default method to call for any Sexp types +# without a process_<type> method or use the default processor provided to +# skip over them. +# +# Here is a simple example: +# +# class MyProcessor < SexpProcessor +# def initialize +# super +# self.strict = false +# end +# +# def process_lit(exp) +# val = exp.shift +# return val +# end +# end + +class SexpProcessor + + # duh + VERSION = "4.17.4" + + ## + # Automatically shifts off the Sexp type before handing the + # Sexp to process_<type> + + attr_accessor :auto_shift_type + + ## + # Return a stack of contexts. Most recent node is first. + + attr_reader :context + + ## + # A Hash of Sexp types and Regexp. + # + # Print a debug message if the Sexp type matches the Hash key + # and the Sexp's #inspect output matches the Regexp. + + attr_accessor :debug + + ## + # A default method to call if a process_<type> method is not found + # for the Sexp type. + + attr_accessor :default_method + + ## + # Expected result class + + attr_accessor :expected + + ## + # Raise an exception if the Sexp is not empty after processing + + attr_accessor :require_empty + + ## + # Raise an exception if no process_<type> method is found for a Sexp. + + attr_accessor :strict + + ## + # An array that specifies node types that are unsupported by this + # processor. SexpProcessor will raise UnsupportedNodeError if you try + # to process one of those node types. + + attr_accessor :unsupported + + ## + # Emit a warning when the method in #default_method is called. + + attr_accessor :warn_on_default + + ## + # A scoped environment to make you happy. + + attr_reader :env + + ## + # Expand an array of directories into a flattened array of paths, eg: + # + # MyProcessor.run MyProcessor.expand_dirs_to_files ARGV + + def self.expand_dirs_to_files *dirs + extensions = %w[rb rake] + + dirs.flatten.map { |p| + if File.directory? p then + Dir[File.join(p, "**", "*.{#{extensions.join ","}}")] + else + p + end + }.flatten.sort + end + + ## + # Cache processor methods per class. + + def self.processors + @processors ||= {} + end + + ## + # Cache rewiter methods per class. + + def self.rewriters + @rewriters ||= {} + end + + ## + # Creates a new SexpProcessor. Use super to invoke this + # initializer from SexpProcessor subclasses, then use the + # attributes above to customize the functionality of the + # SexpProcessor + + def initialize + @default_method = nil + @warn_on_default = true + @auto_shift_type = false + @strict = false + @unsupported = [:alloca, :cfunc, :cref, :ifunc, :last, :memo, + :newline, :opt_n, :method] + @unsupported_checked = false + @debug = {} + @expected = Sexp + @require_empty = true + @exceptions = {} + + # we do this on an instance basis so we can subclass it for + # different processors. + @processors = self.class.processors + @rewriters = self.class.rewriters + @context = [] + + if @processors.empty? + public_methods.each do |name| + case name + when /^process_(.*)/ then + @processors[$1.to_sym] = name.to_sym + when /^rewrite_(.*)/ then + @rewriters[$1.to_sym] = name.to_sym + end + end + end + end + + ## + # Raise if +exp+ is not empty. + + def assert_empty meth, exp, exp_orig + unless exp.empty? then + msg = "exp not empty after #{self.class}.#{meth} on #{exp.inspect}" + msg += " from #{exp_orig.inspect}" if $DEBUG + raise NotEmptyError, msg + end + end + + ## + # Rewrite +exp+ using rewrite_* method for +exp+'s sexp_type, if one + # exists. + + def rewrite exp + type = exp.sexp_type + + comments = exp.comments + + if @debug.key? type then + str = exp.inspect + puts "// DEBUG (original ): #{str}" if str =~ @debug[type] + end + + in_context type do + exp = exp.map { |sub| Array === sub ? rewrite(sub) : sub } + end + + loop do + meth = @rewriters[type] + exp = self.send(meth, exp) if meth + break unless Sexp === exp + + if @debug.key? type then + str = exp.inspect + puts "// DEBUG (rewritten): #{str}" if str =~ @debug[type] + end + + old_type, type = type, exp.sexp_type + break if old_type == type + end + + exp.comments = comments + + exp + end + + ## + # Default Sexp processor. Invokes process_<type> methods matching + # the Sexp type given. Performs additional checks as specified by + # the initializer. + + def process exp + return nil if exp.nil? + + unless Sexp === exp then + raise SexpTypeError, "exp must be a Sexp, was #{exp.class}:#{exp.inspect}" + end + + if self.context.empty? then + p :rewriting unless debug.empty? + exp = self.rewrite(exp) + p :done_rewriting unless debug.empty? + end + + unless @unsupported_checked then + m = public_methods.grep(/^process_/) { |o| o.to_s.sub(/^process_/, "").to_sym } + supported = m - (m - @unsupported) + + raise UnsupportedNodeError, "#{supported.inspect} shouldn't be in @unsupported" unless supported.empty? + + @unsupported_checked = true + end + + result = self.expected.new + + type = exp.sexp_type + raise "type should be a Symbol, not: #{exp.first.inspect}" unless + Symbol === type + + in_context type do + if @debug.key? type then + str = exp.inspect + puts "// DEBUG:(original ): #{str}" if str =~ @debug[type] + end + + exp_orig = nil + exp_orig = exp.deep_clone if $DEBUG or + @debug.key? type or @exceptions.key?(type) + + raise UnsupportedNodeError, "'#{type}' is not a supported node type" if + @unsupported.include? type + + # now do a pass with the real processor (or generic) + meth = @processors[type] || @default_method + if meth then + + if @warn_on_default and meth == @default_method then + warn "WARNING: Using default method #{meth} for #{type}" + end + + exp = exp.sexp_body if @auto_shift_type and meth != @default_method # HACK + + result = error_handler(type, exp_orig) { + self.send meth, exp + } + + if @debug.key? type then + str = exp.inspect + puts "// DEBUG (processed): #{str}" if str =~ @debug[type] + end + + raise SexpTypeError, "Result of #{type} must be a #{@expected}, was #{result.class}:#{result.inspect}" unless + @expected === result + + self.assert_empty(meth, exp, exp_orig) if @require_empty + else + unless @strict then + until exp.empty? do + sub_exp, *exp = exp # HACK + sub_result = nil + if Array === sub_exp then + sub_result = error_handler(type, exp_orig) do + process(sub_exp) + end + raise "Result is a bad type" unless Array === sub_exp + raise "Result does not have a type in front: #{sub_exp.inspect}" unless + Symbol === sub_exp.sexp_type unless + sub_exp.empty? + else + sub_result = sub_exp + end + # result << sub_result + result = result.class.new(*result, sub_result) # HACK + end + + # NOTE: this is costly, but we are in the generic processor + # so we shouldn't hit it too much with RubyToC stuff at least. + result.c_type ||= exp.c_type if Sexp === exp and exp.respond_to?(:c_type) + else + msg = "Bug! Unknown node-type #{type.inspect} to #{self.class}" + msg += " in #{exp_orig.inspect} from #{caller.inspect}" if $DEBUG + raise UnknownNodeError, msg + end + end + end + + result + end + + ## + # Raises unless the Sexp type for +list+ matches +typ+ + + def assert_type list, typ + raise SexpTypeError, "Expected type #{typ.inspect} in #{list.inspect}" if + not Array === list or list.sexp_type != typ + end + + def error_handler type, exp = nil # :nodoc: + yield + rescue StandardError => err + return @exceptions[type].call self, exp, err if @exceptions.key? type + + warn "#{err.class} Exception thrown while processing #{type} for sexp #{exp.inspect} #{caller.inspect}" if + $DEBUG + + raise + end + + ## + # Registers an error handler for +node+ + + def on_error_in node_type, &block + @exceptions[node_type] = block + end + + ## + # A fairly generic processor for a dummy node. Dummy nodes are used + # when your processor is doing a complicated rewrite that replaces + # the current sexp with multiple sexps. + # + # Bogus Example: + # + # def process_something(exp) + # return s(:dummy, process(exp), s(:extra, 42)) + # end + + def process_dummy exp + result = @expected.new(:dummy) rescue @expected.new + result << self.process(exp.shift) until exp.empty? + result + end + + ## + # Add a scope level to the current env. Eg: + # + # def process_defn exp + # name = exp.shift + # args = process(exp.shift) + # scope do + # body = process(exp.shift) + # # ... + # end + # end + # + # env[:x] = 42 + # scope do + # env[:x] # => 42 + # env[:y] = 24 + # end + # env[:y] # => nil + + def scope &block + env.scope(&block) + end + + ## + # Track a stack of contexts that the processor is in, pushing on + # +type+ yielding, and then removing the context from the stack. + + def in_context type + self.context.unshift type + + yield + + ensure + self.context.shift + end + + ## + # I really hate this here, but I hate subdirs in my lib dir more... + # I guess it is kinda like shaving... I'll split this out when it + # itches too much... + + class Environment + def initialize #:nodoc: + @env = [] + @env.unshift({}) + end + + ## + # Flatten out all scopes and return all key/value pairs. + + def all + @env.reverse.inject { |env, scope| env.merge scope } + end + + ## + # Return the current number of scopes. + + def depth + @env.length + end + + # TODO: depth_of + + ## + # Get +name+ from env at whatever scope it is defined in, or return nil. + + def [] name + hash = @env.find { |closure| closure.key? name } + hash[name] if hash + end + + ## + # If +name+ exists in the env, set it to +val+ in whatever scope + # it is in. If it doesn't exist, set +name+ to +val+ in the + # current scope. + + def []= name, val + hash = @env.find { |closure| closure.key? name } || current + hash[name] = val + end + + ## + # Get the current/top environment. + + def current + @env.first + end + + ## + # Create a new scope and yield to the block passed. + + def scope + @env.unshift({}) + begin + yield + ensure + @env.shift + raise "You went too far unextending env" if @env.empty? + end + end + end +end + +## +# A simple subclass of SexpProcessor that defines a pattern I commonly +# use: non-mutative and strict process that return assorted values; +# AKA, an interpreter. + +class SexpInterpreter < SexpProcessor + def initialize #:nodoc: + super + + self.expected = Object + self.require_empty = false + self.strict = true + end +end + +## +# A simple subclass of SexpProcessor that tracks method and class +# stacks for you. Use #method_name, #klass_name, or #signature to +# refer to where you're at in processing. If you have to subclass +# process_(class|module|defn|defs) you _must_ call super. + +class MethodBasedSexpProcessor < SexpProcessor + @@no_class = :main + @@no_method = :none + + ## + # A stack of the classes/modules that are being processed + + attr_reader :class_stack + + ## + # A stack of the methods that are being processed. You'd think it'd + # only ever be 1 deep, but you'd be wrong. People do terrible things + # in/to ruby. + + attr_reader :method_stack + + ## + # A stack of the singleton classes that are being processed. + + attr_reader :sclass + + ## + # A lookup table of all the method locations that have been + # processed so far. + + attr_reader :method_locations + + def initialize #:nodoc: + super + @sclass = [] + @class_stack = [] + @method_stack = [] + @method_locations = {} + self.require_empty = false + end + + ## + # Adds name to the class stack, for the duration of the block + + def in_klass name + if Sexp === name then + name = case name.sexp_type + when :colon2 then + name = name.flatten + name.delete :const + name.delete :colon2 + name.join("::") + when :colon3 then + name.last.to_s + else + raise "unknown type #{name.inspect}" + end + end + + @class_stack.unshift name + + with_new_method_stack do + yield + end + ensure + @class_stack.shift + end + + ## + # Adds name to the method stack, for the duration of the block + + def in_method name, file, line, line_max = nil + method_name = Regexp === name ? name.inspect : name.to_s + @method_stack.unshift method_name + line_max = "-#{line_max}" if line_max + @method_locations[signature] = "#{file}:#{line}#{line_max}" + yield + ensure + @method_stack.shift + end + + ## + # Tracks whether we're in a singleton class or not. Doesn't track + # actual receiver. + + def in_sklass + @sclass.push true + + with_new_method_stack do + yield + end + ensure + @sclass.pop + end + + ## + # Returns the first class in the list, or @@no_class if there are + # none. + + def klass_name + name = @class_stack.first + + raise "you shouldn't see me" if Sexp === name + + if @class_stack.any? + @class_stack.reverse.join("::").sub(/\([^\)]+\)$/, "") + else + @@no_class + end + end + + ## + # Returns the first method in the list, or "#none" if there are + # none. + + def method_name + m = @method_stack.first || @@no_method + m = "##{m}" unless m =~ /::/ + m + end + + ## + # Process a class node until empty. Tracks all nesting. If you have + # to subclass and override this method, you can call super with a + # block. + + def process_class exp + exp.shift unless auto_shift_type # node type + in_klass exp.shift do + if block_given? then + yield + else + process_until_empty exp + end + end + s() + end + + ## + # Process a method node until empty. Tracks your location. If you + # have to subclass and override this method, you can clall super + # with a block. + + def process_defn exp + exp.shift unless auto_shift_type # node type + name = @sclass.empty? ? exp.shift : "::#{exp.shift}" + + in_method name, exp.file, exp.line, exp.line_max do + if block_given? then + yield + else + process_until_empty exp + end + end + s() + end + + ## + # Process a singleton method node until empty. Tracks your location. + # If you have to subclass and override this method, you can clall + # super with a block. + + def process_defs exp + exp.shift unless auto_shift_type # node type + process exp.shift # recv + in_method "::#{exp.shift}", exp.file, exp.line, exp.line_max do + if block_given? then + yield + else + process_until_empty exp + end + end + s() + end + + ## + # Process a module node until empty. Tracks all nesting. If you have + # to subclass and override this method, you can clall super with a + # block. + + def process_module exp + exp.shift unless auto_shift_type # node type + in_klass exp.shift do + if block_given? then + yield + else + process_until_empty exp + end + end + s() + end + + ## + # Process a singleton class node until empty. Tracks all nesting. If + # you have to subclass and override this method, you can clall super + # with a block. + + def process_sclass exp + exp.shift unless auto_shift_type # node type + in_sklass do + if block_given? then + yield + else + process_until_empty exp + end + end + s() + end + + ## + # Process each element of #exp in turn. + + def process_until_empty exp + until exp.empty? + sexp = exp.shift + process sexp if Sexp === sexp + end + end + + ## + # Returns the method signature for the current method. + + def signature + "#{klass_name}#{method_name}" + end + + ## + # Reset the method stack for the duration of the block. Used for + # class scoping. + + def with_new_method_stack + old_method_stack, @method_stack = @method_stack, [] + + yield + ensure + @method_stack = old_method_stack + end +end + +class Object # :nodoc: + + ## + # deep_clone is the usual Marshalling hack to make a deep copy. + # It is rather slow, so use it sparingly. Helps with debugging + # SexpProcessors since you usually shift off sexps. + + def deep_clone + Marshal.load(Marshal.dump(self)) + end +end + +## +# SexpProcessor base exception class. + +class SexpProcessorError < StandardError; end + +## +# Raised by SexpProcessor if it sees a node type listed in its +# unsupported list. + +class UnsupportedNodeError < SexpProcessorError; end + +## +# Raised by SexpProcessor if it is in strict mode and sees a node for +# which there is no processor available. + +class UnknownNodeError < SexpProcessorError; end + +## +# Raised by SexpProcessor if a processor did not process every node in +# a sexp and @require_empty is true. + +class NotEmptyError < SexpProcessorError; end + +## +# Raised if assert_type encounters an unexpected sexp type. + +class SexpTypeError < SexpProcessorError; end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/strict_sexp.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/strict_sexp.rb new file mode 100644 index 000000000..cabeb8129 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/strict_sexp.rb @@ -0,0 +1,149 @@ +# :stopdoc: + +## +# I'm starting to warm up to this idea! +# ENV["STRICT_SEXP"] turns on various levels of conformance checking +# +# 1 = sexp[0] => sexp_type +# 1 = sexp.first => sexp_type +# 1 = sexp[0] = x => sexp_type = x +# 1 = sexp[1..-1] => sexp_body +# 1 = sexp[1..-1] = x => sexp_body = x +# 1 = sexp[-1] => last +# 2 = sexp[1] => no +# 2 = sexp[1] = x => no +# 3 = sexp[n] => no +# 3 = sexp[n] = x => no +# 3 = sexp.node_name => no (ie, method_missing) +# 4 = sexp.replace x => no +# 4 = sexp.concat x => no +# 4 = sexp.collect! => no +# 4 = sexp.compact! => no +# 4 = sexp.flatten! => no +# 4 = sexp.map! => no +# 4 = sexp.reject! => no +# 4 = sexp.reverse! => no +# 4 = sexp.rotate! => no +# 4 = sexp.select! => no +# 4 = sexp.shuffle! => no +# 4 = sexp.slice! => no +# 4 = sexp.sort! => no +# 4 = sexp.sort_by! => no +# 4 = sexp.uniq! => no +# 4 = sexp.unshift => no +# 4 = sexp.push => no +# 4 = sexp.pop => no +# 4 = sexp << => no + +class Sexp + # alias :_concat :concat in sexp.rb so we have access to the original + alias :safe_idx :[] + alias :safe_asgn :[]= + alias :sexp_type= :sexp_type= + alias :sexp_body= :sexp_body= + alias :shift :shift + + def self.nuke_method name, level + return unless __strict >= level + define_method name do |*args| + raise "no mutation allowed on sexps: %s.%s %s" % [self, name, args] + end + end + + def self.__strict + ENV["STRICT_SEXP"].to_i + end + + def __strict + self.class.__strict + end + + undef_method :method_missing if __strict > 2 + + def method_missing msg, *args + raise "don't call method_missing on Sexps: %p.(%s)" % [msg, args.inspect[1..-2]] + end if __strict > 2 + + def [] i + raise "no idx: #{inspect}[#{i}]" if __strict > 2 + raise "no idx>1: #{inspect}[#{i}]" if Integer === i && i > 1 if __strict > 1 + raise "use sexp_type" if i == 0 + raise "use sexp_body" if i == (1..-1) + raise "use last" if i == -1 + self.safe_idx i + end + + def []= i, v + raise "use sexp_type=" if i == 0 + raise "use sexp_body=" if i == (1..-1) + raise "no asgn>1: #{inspect}[#{i}] = #{v.inspect}" if Integer === i && i > 1 if + __strict > 1 + raise "no asgn: #{inspect}[#{i}] = #{v.inspect}" if + __strict > 2 + self.safe_asgn i, v + end + + def first(n = nil) + raise "use sexp_type" unless n + super + end + + nuke_method :collect!, 4 + nuke_method :compact!, 4 + nuke_method :concat, 4 # HACK: using self.class.new.concat(...) for speed + nuke_method :flatten!, 4 + nuke_method :map!, 4 + nuke_method :pop, 4 + nuke_method :push, 4 + nuke_method :reject!, 4 + nuke_method :replace, 4 + nuke_method :reverse!, 4 + nuke_method :rotate!, 4 + nuke_method :select!, 4 + nuke_method :shuffle!, 4 + nuke_method :slice!, 4 + nuke_method :sort!, 4 + nuke_method :sort_by!, 4 + nuke_method :uniq!, 4 + nuke_method :unshift, 4 + nuke_method :<<, 5 + nuke_method :shift, 5 + + def sexp_type + safe_idx 0 + end + + def sexp_body from = 1 + self.new._concat(safe_idx(from..-1) || []) + end + + def sexp_type= v + self.safe_asgn 0, v + end + + def sexp_body= v + self.safe_asgn 1..-1, v + end +end unless Sexp.new.respond_to? :safe_asgn if ENV["STRICT_SEXP"] + +if ENV["SP_DEBUG"] && !ENV["STRICT_SEXP"] then + class Sexp + mutators = %i[ + []= clear collect! compact! concat delete delete_at + delete_if drop drop_while fill flatten! replace insert + keep_if map! pop push reject! reverse! rotate! select! + shift shuffle! slice! sort! sort_by! transpose uniq! + unshift + ] + + mutators.each do |method| + define_method method do |*args| + warn "Sexp modified by %p at %s" % [__method__, caller.first] if + ENV["VERBOSE"] or (defined?(@hash) and @hash) + super(*args) + end + end + end +end + +# :startdoc: diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/unique.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/unique.rb new file mode 100644 index 000000000..c5725d259 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/sexp_processor-4.17.4/lib/unique.rb @@ -0,0 +1,21 @@ +## +# Unique creates unique variable names. + +class Unique + ## + # Reset current count back to zero. Mainly used for testing. + + def self.reset + @@curr = 0 + end + + ## + # Get the next unique variable name. + + def self.next + @@curr += 1 + "temp_#{@@curr}".intern + end + + reset +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/CHANGES b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/CHANGES new file mode 100644 index 000000000..ff5fa0dbe --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/CHANGES @@ -0,0 +1,496 @@ +5.2.1 (2024-01-20) + + * Support Ruby 3.3 + * Update Gem metadata + +5.2.0 (2023-11-11) + + * Fix logic less bug - #783 + * Support Rails 7.1 - #936 + * Fix splat arguments on Rails 7.1 - #942 + +5.1.1 (2023-05-16) + + * Support lambda functions as shortcuts - #677 #813 #903 + * Support --enable-frozen-string-literal - #851 + +5.1.0 (2023-03-06) + + * Allow whitespace markers for verbatim text: `|<`, `|>`, and `|<>` - #912 + * Do not swallow single quote after output line indicator - #911 + * Support Tilt 2.1.0 - #910 + * Fix Railtie load error - #904 + * Fix attribute parsing with square brackets - #796 + +5.0.0 (2023-01-23) + + * Fix markdown interpolation #773 + * Support case/in #884 + * Extract slim/railtie #850 + * css: doesn't add type='text/css' anymore #828 + * Remove deprecated whitespace syntax =' etc + * Add support for annotate_rendered_view_with_filenames #867, #878, #901 + * Remove deprecated syntax + * Add option to hyphenate underscore attributes - #852 + * Update CI/CD testing and dependencies + +4.1.0 (2020-05-07) + * Add support for Tailwind CSS - #841 + * Update dependencies and testing + +4.0.1 (2018-09-02) + + * Fix incompatibility issue with Slim Include plugin and new ability to specifiy attributes for embedded engines #819 + +4.0.0 (2018-08-26) + + * Add ability to specify attributes for embedded engines using TagEngine - #653 + * Set Tilt's default encoding to utf-8 - #800 + * Prevent generation of invalid Ruby code in heredoc - #770 + * Don't convert underscores to dashes on data attributes - #807 [Backward incompatible] + * Update description in README.jp.md - #795 + * Removed support for embedded engines: Asciidoc, Builder, Creole, Erb, Nokogiri, Opal, Org-Ruby, Styl, Wikicloth + * Fix tests + +3.0.9 (2017-11-09) + + * Fixed Cross-site Scripting in splat attributes names (See #767) + * Restrict access to public methods in logic_less templates (See #781) + +3.0.8 (2017-05-06) + + * Added splat_prefix configuration option for Angular2 syntax support + * Require Ruby >= 2.0.0 + * Relax temple dependency + +3.0.7 (2016-05-22) + + * Add additional attributes feature to shortcuts + * Freeze string literals + +3.0.6 (2015-06-05) + + * Fix warnings #625 + +3.0.4 (2015-06-02) + + * javascript: doesn't add type='text/javascript' anymore + * slimrb: --require added + * Fix #624 + +3.0.3 (2015-03-06) + + * Fix #392, capturing for splat attributes didn't work correctly under Rails + +3.0.2 (2015-02-02) + + * slimrb: Add option --locals + * Fix issues in the test suite (#576), thanks @dmke! + +3.0.1 (2014-12-22) + + * Allow more special characters in html attribute names (See https://html.spec.whatwg.org/multipage/syntax.html#attributes-2), #567 + * Fix: Code attributes mutate their argument (#571) + +3.0.0 (2014-12-07) + + * Drop 1.8.7 support + * Deprecate default_options in favor of options + * Support xml pretty printing with format: :xml + * Deprecate `='`, `=='` and `tag'` syntax for trailing whitespace. Use `=<` etc. instead. + * slimrb: Remove deprecated plugin options -l and -t + +2.1.0 (2014-10-15) + + * Parser: Require pairwise braces in quoted attributes + * Parser: add :attr_list_delims and :code_attr_delims + * Parser: deprecate :attr_delims + * Parser: relax text indentation requirements: + | line + next line + tag some text + more text + * Parser: allow first line to be indented + * Parser: allow inline embedded languages: + .content: markdown: This is **important** + * Parser: allow line breaks in quoted attributes + * Added Opal as embedded engine + * slimrb: Change meaning of -r, deprecate -t and -l + * Fix issue with inserted end (#485) + * Add experimental 'slim/include' plugin (Might change in the future) + * Add experimental 'slim/smart' plugin (Might change in the future) + * Drop jruby18 support + * Fix rails error reporting #587 (Manipulate stacktrace) + * Splat: handle html_safe + +2.0.3 (2014-07-04) + + * slimrb: Don't update HTML output on exceptions + * Allow dashes at the beginning of class names (#474) + * Render empty attributes as standalone in html mode (#480) + * Fix #482: problem with whitespace modifier `tag=<` + * Fix #485: missing end for empty `if` control blocks + * Fix #510: double dash in class name + +2.0.2 (2013-10-27) + + * Add option :attr_delims + +2.0.1 (2013-07-31) + + * Support multiple attributes per shortcut (See issue #415) + * Add support for org-ruby embedded engine + * Render true boolean attributes with empty value + * Support case-when statements + * Fix issue #431 + * Also escape ' to ' + +2.0.0 (2013-05-27) + + * IMPORTANT: Backward incompatible syntax change: '{...}' and '[...]' are not + allowed as ruby attribute wrappers anymore. Use parentheses '(...)' + if you want to wrap code with spaces. This allows to write arrays and hashes directly. + Old: + div id={'obj' + name} data=({:a => 1, :b => 2}) class=['alpha', 'beta'] + New: + div id=('obj' + name) data={:a => 1, :b => 2} class=['alpha', 'beta'] + * Quoted attributes are escaped by default + Old: + a href='http://github.com/slim-template/slim/?a=1&b=2' + New: + a href='http://github.com/slim-template/slim/?a=1&b=2' + a href=='http://github.com/slim-template/slim/?a=1&b=2' + You can always disable escaping completly by using :disable_escape if you don't want to write '=='. + * Added hyphenation support for data attributes (Option :hyphen_attrs) + Example: div data={key1_key2: 2, key1: {key3: 3}} will render as '<div data-key1-key2="2" data-key1-key3="3"></div>' + * Removed deprecated options: + - :escape_quoted_attrs + - :remove_empty_attrs + - :chain + - :attr_wrapper (renamed to :attr_quote) + - :attr_delimiter (renamed to :merge_attrs) + - Slim::LogicLess :wrapped dictionary + - Slim::Parser :shortcut string option + * Allow spaces around attributes, e.g 'a [ href = url ] text' and 'a href = url text' + * Add unicode support for tags and attributes (Issue #212) + * Generate missing `do` keywords for code blocks (see #342) + * Logic-less: Add keyword `self` for string access + * Added Slim::ERBConverter, require 'slim/erb_converter' + * Added option '-e' for ERB conversion to slimrb + * Add syntax for trailing or leading whitespace after tag, e.g. input>, input< + * Add syntax for trailing or leading whitespace after output, e.g. =>, =< + +1.3.8 (2013-04-11) + + * Disable some superflous deprecation warnings + +1.3.7 (2013-04-10) + + * Fixed issue #374, rescue and ensure blocks + * Fixed issue #333 (Throw syntax error if you write text after closed tag) + * Deprecated :attr_delimiter (renamed to :merge_attrs) + * Deprecated :attr_wrapper (renamed to :attr_quote) + * Warn if you use curly braces or brackets for ruby attributes since + curly braces and brackets will be interpreted as Hash/Array in Slim 2.0.0 + Old syntax: + div id={person && person.id} + div id=[person && person.id] + New syntax in 2.0.0: + div id=(person && person.id) + * Deprecated :escape_quoted_attrs (done by default in 2.0) + * Warn if quoted attributes might be double escaped in Slim 2.0.0 + Old syntax: + a href='http://github.com/slim-template/slim/?a=1&b=2' + a href=='http://github.com/slim-template/slim/?a=1&b=2' + New syntax in 2.0.0: + a href='http://github.com/slim-template/slim/?a=1&b=2' + a href=='http://github.com/slim-template/slim/?a=1&b=2' + * Improved pretty printing (Issue #202) + * Renamed Slim::EmbeddedEngine to Slim::Embedded (Old constant still available until 2.0) + * Renamed Slim::ControlStructures to Slim::Controls + * Tab expansion improved (tab + space is interpreted as equivalent to tab) + * Support for wrapping javascript in HTML comments or CDATA (Issue #340) + * Asciidoc embedded engine added + +1.3.6 (2013-01-06) + + * Allow attribute values to be broken with `\` (Issue #331) + * Tag shortcuts implemented (Issue #306) + * Hash format of Slim::Parser option :shortcut changed, old configuration deprecated but still supported + +1.3.5 (2012-12-19) + + * Logic-less: + - Rewrote logic-less mode (Issue #326, #327) + - Logic-less mode supports lambdas + - Option :dictionary_access made more powerful, value :wrapped deprecated + +1.3.4 (2012-11-15) + + * Fixed #314 + * Logic-less test cases added + +1.3.3 (2012-10-16) + + * Attribute handling made consistent: + - Splat attributes, static and dynamic attributes are now all handled the same + - Merged attributes are removed if empty (in the default configuration this is only "class") + - Dynamic attributes which are not merged are checked for false or nil and removed if this is the case + - Dynamic attributes which are not merged are checked for true and generated as attribute-name="attribute-name" + * Rename class BooleanAttributes to CodeAttributes + * Add literate test suite (still incomplete), run with `rake test:literate` + * Remove UTF BOM when parsing Slim code + * Fixed issue #303 + +1.3.2 (2012-09-26) + + * Fix boolean attributes #299 + +1.3.1 (2012-09-23) + + * Support inline html at the beginning of a line (New line indicator <). No pipe symbol is | necessary. + It is even possible to wrap other Slim syntax in such a html block. + * Code restructured - Handling of boolean and splat attributes improved and PERFORMANCE improved. + * BACKWARD INCOMPATIBLE CHANGE - Dynamic attributes which return empty value "" are not removed anymore + (this means "" is now interpreted as true), whereas false and nil are still removed. + This corresponds to the definition of boolean attributes in XHTML and HTML5. + * Deprecated option :remove_empty_attrs + * Add option :escape_quoted_attrs to escape quoted attributes, use == if you don't want that. + The default is false to stay backward compatible. + * Use Temple::FilterError exception + * Use Temple::Parser + * / is not escaped anymore to / + * Parser: check for missing closing quote in quoted attributes + * Use new temple option validation to make Slim configuration more user friendly. + * Support thread options Slim::Engine.with_options which especially useful for Rails + * Add explicit column number to SyntaxError.to_s + +1.3.0 (2012-09-04) + + * Parser wraps text blocks in [:slim, :text, ...] (Used by Translator/I18n plugin) + * Added Translator/I18n plugin which uses GetText or FastGettext (require 'slim/translator') + * Moved logic less mode out of the core to plugin (require 'slim/logic_less') + +1.2.2 (2012-06-21) + + * Fix issue #264 + +1.2.1 (2012-05-22) + + * Support stylus as embedded engine + * Fix issue #257 + +1.2.0 (2012-03-30) + + * Add option :shortcut which configures attribute shortcuts + Default setting: + Slim::Parser.default_options[:shortcut] = {'#' => 'id', '.' => 'class', '*' => '*'} + Define custom shortcut attribute (e.g. a@ajax-link renders <a role="ajax-link"></a>) + Slim::Parser.default_options[:shortcut] = {'@' => 'role'} + Define custom shortcut attribute with tag (e.g. @ajax-link renders <a role="ajax-link"></a>) + Slim::Parser.default_options[:shortcut] = {'@' => 'a role'} + * Add syntax for splat attributes (#109) + * Support for dynamic tags, e.g. *{:tag => 'img', :src => 'image.jpg'} + +1.1.1 (2012-02-29) + + * Evaluating a html attribute now happens only once (#219) + * Code with trailing comma is treated as broken line (#226) + * Support option :remove_empty_attrs (default true) + * Require temple 0.4.0 + +1.1.0 (2012-01-06) + + * Support for special characters in class/id shortcut removed + * Do not allow : in class/id shortcut + * Add support for block expansion syntax + * Support options :indent, :sort_attrs + * Require temple 0.3.5 + +1.0.4 (2011-11-03) + + * Pass options to embedded Tilt engine + Slim::EmbeddedEngine.set_default_options :markdown => {...} + * Add test case for precompiled embedded engine 'builder' + * Bug #204 fixed, tabs were not parsed correctly + +1.0.3 (2011-10-08) + + * Fix rubinius test cases + * Fix line numbers for embedded engines + * Require temple 0.3.4 + * Remove dynamic embedded engines Haml, Liquid, Radius, Markaby + * More thorough integration testing using travis-ci + See http://travis-ci.org/#!/stonean/slim + * Empty static attributes are not removed anymore + * Line indicator =' is supported in tags + +1.0.2 (2011-08-26) + + * Support for Rails 3.1 streaming (Temple > 0.3.2 required) + * Switch to default format xhtml (supports all doctypes, including html5) + * Improve parsing of #{interpolation} in quoted attributes (issue #159) + * Use travis-ci for continous integration testing + +1.0.1 (2011-08-07) + + * Only delimiting brackets must be balanced in ruby attributes + e.g this is possible now `a href=(ruby_code "{") + * Skip empty lines in text block (#156) + +1.0.0 (2011-07-24) + + * Fixed html attribute issue in sections mode (#127) + * Obsolete directive syntax removed + * Syntax for trailing whitespace added (==' and =') + * Deprecated file 'slim/rails.rb' removed + * Parsing of #{interpolation} in markdown fixed + * Support for attributes which span multiple lines + * Dynamic attributes with value true/false are interpreted as boolean + * Support boolean attributes without value e.g. option(selected id="abc") + +0.9.3 (2011-05-15) + + * Allow for bypassing escaping in attributes + * check if string encoding is valid + * support for html conditional comments + * Use new Temple html attribute expression [:html, :attrs, [:html, :attr, ...], ...] + * Use new slim html attribute expression (similiar to Temple) + * Option :id_delimiter replaced with :attr_delimiter + * Attribute value merging improved (nil/empty values are ignored now) + * Arrays attribute values are joined + * Boolean attributes (e.g. selected=true is converted to selected="selected") + * Option :debug removed + * Slim expression grammar provided, Temple validator used in tests + * Option :auto_escape replaced with inverse option :disable_escape + * Require temple 0.3.0 + +0.9.2 (2011-03-30) + + * add SassEngine which respects :pretty + * embedded engine code refactored + * temple supports denser template registration + * deprecate slim/rails (just require 'slim') + * use temple rails and tilt templates + * add encoding option to Slim::Parser/Slim::Engine to enforce template encoding + * vim support is now an external project + +0.9.1 (2011-03-10) + + * add new doctype syntax without ! + * slim directive expression has type and args + +0.9.0 (2011-01-30) + + * slim should not be registered as the default template handler. + * add support for unescaped text interpolation + +0.8.4 (2011-01-26) + + * Added the option to turn off automatic HTML escaping. + * update to tilt 1.2.2 + * allow call to yield in logic less mode + * allow doctype declaration to be capitalized + +0.8.3 (2010-12-23) + + * Added support for html comments. The parser uses the :static filter instead of the :comment filter due to the way the parser is constructed. + +0.8.2 (2010-12-22) + + * fix issue #96 + * Added the Temple Debugger filter. + * Rails problems fixed + +0.8.1 (2010-12-17) + + * remove backtick slim syntax -- no longer supported + * slim executable conflict. issue #91 + * vim syntax support improved + +0.8.0 (2010-11-29) + + * rails logic less support + +0.7.4 (2010-11-22) + + * use ' for text block with trailing whitespace + * allow to disable/enable embedded engines + +0.7.3 (2010-11-16) + + * fix #82 + * basic rails test added + +0.7.2 (2010-11-09) + + * get rid of rails deprecation warning + * use_html_safe is activated automatically by temple + +0.7.1 (2010-11-03) + + * logic less mode + * add syntax for explicitly closed tags + +0.7.0 (2010-10-25) + + * slim-mode.el for emacs added (modified haml-mode.el, needs some work to be fully functional for slim) + * embedded engines + * escape interpolated strings/attributes + * Slim#Filter now uses optional configuration hash + * Initial implementation for Rail's `html_safe`. Closes #25 + * fallback to escape_html stolen from cgi.rb if escape_utils is unavailable, use normal requires because slim is on the load path + * Limit the allowed characters used for attributes delimiters (now only allows parentheses, square brackets and curly braces). See #16 for more info. + * Default to HTML5-mode + * Slim now uses Temple and Tilt. + * Choose your own attribute delimiter! + +0.6.1 (2010-10-17) + + * can wrap parens around attributes if you so desire + * added erubis to the benchmarks + +0.6.0 (2010-10-17) + + * Added slim itself, haml and mustache to the development env for easier benchmarking. + * added escape_html functionality. need to tweak for speed + +0.5.1 (2010-10-08) + + * Consecutive condition statements now working as expected. + +0.5.0 (2010-10-07) + + * Added 'unless' to the list of control words. + * Fixes for inline conditions. There must be a better way of doing this?? + * '-' is a valid character in HTML attributes, so let's allow that. + * Improved the regex so that control code now supports code blocks. + * Output code (start with '=') can now accept code blocks. + * Method calls no longer need parenthesis. We need more tests to ensure the implementation's robustness. + +0.4.1 (2010-10-03) + + * Added '|' as an alias of '`' for parsing plain text. This simulates the syntax of the Jade template engine. + * Added instructions of how to use the gem. + +0.4.0 (2010-09-21) + + * support for nesting lines under backtick + * make it so that one space is the left margin. any additional spaces will be copied over + * support for using indentation after backtick to denote paragraphs. useful for script tags and paragraphs + +0.3.1 (2010-09-17) + + * fix bug with adding end to nesting ruby code + +0.3.0 (2010-09-17) + + * Optimize compiled string to reduce number of concatentations to the buffer + +0.2.0 (2010-09-17) + + * can now make code call on same line as tag + +0.1.0 (2010-09-15) + + * Initial release diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/Gemfile b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/Gemfile new file mode 100644 index 000000000..f88590a2f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/Gemfile @@ -0,0 +1,43 @@ +source 'https://rubygems.org/' + +gemspec + +gem 'minitest', '~> 5.15' +gem 'rake', '~> 13.0' +gem 'kramdown', '~> 2.4' + +if ENV['TEMPLE'] && ENV['TEMPLE'] != 'master' + gem 'temple', "= #{ENV['TEMPLE']}" +else + # Test against temple master by default + gem 'temple', github: 'judofyr/temple' +end + +if ENV['TILT'] + if ENV['TILT'] == 'master' + gem 'tilt', github: 'jeremyevans/tilt' + else + gem 'tilt', "= #{ENV['TILT']}" + end +end + +if ENV['RAILS'] + gem 'rails-controller-testing' + + # we need some smarter test logic for the different Rails versions + if ENV['RAILS'] == 'main' + gem 'rails', github: 'rails/rails', branch: 'main' + else + gem 'rails', "= #{ENV['RAILS']}" + end +end + +if ENV['SINATRA'] + gem 'rack-test' + + if ENV['SINATRA'] == 'main' + gem 'sinatra', github: 'sinatra/sinatra' + else + gem 'sinatra', "= #{ENV['SINATRA']}" + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/LICENSE b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/LICENSE new file mode 100644 index 000000000..b915f0e24 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010 - 2023 Slim Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/README.jp.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/README.jp.md new file mode 100644 index 000000000..32496ff12 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/README.jp.md @@ -0,0 +1,1276 @@ +# Slim + +[![Gem Version](https://img.shields.io/gem/v/slim.svg)](http://rubygems.org/gems/slim) +![Build Status](https://github.com/slim-template/slim/actions/workflows/test.yml/badge.svg) +[![GitHub Sponsors](https://img.shields.io/github/sponsors/slim-template)](https://github.com/sponsors/slim-template) + +Slim は 不可解にならない程度に view の構文を本質的な部品まで減らすことを目指したテンプレート言語です。標準的な HTML テンプレートからどれだけのものを減らせるか、検証するところから始まりました。(<, >, 閉じタグなど) 多くの人が Slim に興味を持ったことで, 機能的で柔軟な構文に成長しました。 + +簡単な特徴 + +* すっきりした構文 + * 閉じタグの無い短い構文 (代わりにインデントを用いる) + * 閉じタグを用いた HTML 形式の構文 + * 設定可能なショートカットタグ (デフォルトでは `#` は `<div id="...">` に, `.` は `<div class="...">` に) +* 安全性 + * デフォルトで自動 HTML エスケープ + * Rails の `html_safe?` に対応 +* 柔軟な設定 +* プラグインを用いた拡張性: + * Mustache と同様のロジックレスモード + * インクルード + * 多言語化/I18n +* 高性能 + * ERB/Erubis に匹敵するスピード + * Rails のストリーミングに対応 +* 全てのメジャーフレームワークが対応 (Rails, Sinatra, ...) +* タグや属性の Unicode に完全対応 +* Markdown や Textile のような埋め込みエンジン + +## リンク + +* ホームページ: <https://slim-template.github.io> +* ソース: <https://github.com/slim-template/slim> +* バグ: <https://github.com/slim-template/slim/issues> +* API ドキュメント: + * 最新の Gem: <https://rubydoc.info/gems/slim/frames> + * GitHub main: <https://rubydoc.info/github/slim-template/slim/main/frames> + +## イントロダクション + +### Slim とは? + +Slim は __Rails5 以降__ に対応した高速, 軽量なテンプレートエンジンです。主要な Ruby の実装全てでしっかりテストされています。 +私たちは継続的インテグレーションを採用しています。(github actions) + +Slim の核となる構文は1つの考えによって導かれています: "この動作を行うために最低限必要なものは何か。" + +多くの人々の Slim への貢献によって, 彼らが使う [Haml](https://github.com/haml/haml) や [Jade](https://github.com/visionmedia/jade) の影響を受け構文の追加が行われています。 Slim の開発チームは美は見る人の目の中にあることを分っているので、こういった追加にオープンです。 + +Slim は 構文解析/コンパイルに [Temple](https://github.com/judofyr/temple) を使い [Tilt](https://github.com/jeremyevans/tilt) に組み込まれます。これにより [Sinatra](https://github.com/sinatra/sinatra) やプレーンな [Rack](https://github.com/rack/rack) とも一緒に使えます。 + +Temple のアーキテクチャはとても柔軟で, モンキーパッチなしで構文解析とコンパイルのプロセスの拡張が可能です。これはロジックレスのプラグインや I18n が提供する翻訳プラグインに +使用されます。ロジックレスモードでは HTML をビルドするために Slim の構文を使いたいが, テンプレートの中で Ruby を書きたくない場合にも Slim を使うことができます。 + +### なぜ Slim を使うのか? + +* Slim によって メンテナンスが容易な限りなく最小限のテンプレートを作成でき, 正しい文法の HTML や XML が書けることを保証します。 +* Slim の構文は美しく, テンプレートを書くのがより楽しくなります。Slim は主要なフレームワークで互換性があるので, 簡単に始めることができます。 +* Slim のアーキテクチャは非常に柔軟なので, 構文の拡張やプラグインを書くことができます。 + +___そう, Slim は速い!___ Slim は開発当初からパフォーマンスに注意して開発されてきました。 +この数字が信じられませんか? それは仕方ないことです。是非 rake タスクを使って自分でベンチマークを取ってみてください! + +私たちの考えでは, あなたは Slim の機能と構文を使うべきです。Slim はあなたのアプリケーションのパフォーマンスに悪影響を与えないことを保証します。 + +### どうやって使い始めるの? + +Slim を gem としてインストール: + +~~~ +gem install slim +~~~ + +あなたの Gemfile に `gem 'slim'` と書いてインクルードするか, ファイルに `require 'slim'` と書く必要があります。これだけです! 後は拡張子に .slim を使うだけで準備完了です。 + +### 構文例 + +Slim テンプレートがどのようなものか簡単な例を示します: + +~~~ slim +doctype html +html + head + title Slim のファイル例 + meta name="keywords" content="template language" + meta name="author" content=author + link rel="icon" type="image/png" href=file_path("favicon.png") + javascript: + alert('Slim は javascript の埋め込みに対応しています!') + + body + h1 マークアップ例 + + #content + p このマークアップ例は Slim の典型的なファイルがどのようなものか示します。 + + == yield + + - if items.any? + table#items + - for item in items + tr + td.name = item.name + td.price = item.price + - else + p アイテムが見つかりませんでした。いくつか目録を追加してください。 + ありがとう! + + div id="footer" + == render 'footer' + | Copyright © #{@year} #{@author} +~~~ + +インデントについて, インデントの深さはあなたの好みで選択できます。もしあなたが最初のインデントをスペース2つ, その次に5スペースを使いたい場合, それも自由です。マークアップを入れ子にするには最低1つのスペースによるインデントが必要なだけです。 + +## ラインインジケータ + +### テキスト `|` + +パイプを使うと, Slim はパイプよりも深くインデントされた全ての行をコピーします。行中の処理は基本的にどのようなものでもエスケープされます。 + +~~~ slim +body + p + | + これはテキストブロックのテストです。 +~~~ + + 構文解析結果は以下: + +~~~ html +<body><p>これはテキストブロックのテストです。</p></body> +~~~ + + ブロックの左端はパイプ +1 スペースのインデントに設定されています。 + 追加のスペースはコピーされます。 + +~~~ slim +body + p + | この行は左端になります。 + この行はスペース 1 つを持つことになります。 + この行はスペース 2 つを持つことになります。 + 以下同様に... +~~~ + +テキスト行に HTML を埋め込むこともできます。 + +~~~ slim +- articles.each do |a| + | <tr><td>#{a.name}</td><td>#{a.description}</td></tr> +~~~ + +### 末尾スペース付きのテキスト `'` + +シングルクォートは `|` と同様に行をコピーしますが, 末尾にスペースが1つ追加されます。 + +### インライン html `<` (HTML 形式) + +HTML タグを直接 Slim の中に書くことができます。Slim では, 閉じタグを使った HTML タグ形式や HTML と Slim を混ぜてテンプレートの中に書くことができます。 +行頭が '<' の場合, 暗黙的に `|` があるものとして動作します: + +~~~ slim +<html> + head + title Example + <body> + - if articles.empty? + - else + table + - articles.each do |a| + <tr><td>#{a.name}</td><td>#{a.description}</td></tr> + </body> +</html> +~~~ + +### 制御コード `-` + +ダッシュは制御コードを意味します。制御コードの例としてループと条件文があります。`end` は `-` の後ろに置くことができません。ブロックはインデントによってのみ定義されます。 +複数行にわたる Ruby のコードが必要な場合, 行末にバックスラッシュ `\` を追加します。行末がカンマ `,` で終わる場合 (例 関数呼び出し) には, 行末にバックスラッシュを追加する必要はありません。 + +~~~ slim +body + - if articles.empty? + | 在庫なし +~~~ + +### 出力 `=` + +イコールはバッファに追加する出力を生成する Ruby コードの呼び出しを Slim に命令します。Ruby のコードが複数行にわたる場合, 例のように行末にバックスラッシュを追加します。 + +~~~ slim += javascript_include_tag \ + "jquery", + "application" +~~~ + +行末がカンマ `,` で終わる場合 (例 関数呼び出し) には行末にバックスラッシュを追加する必要はありません。行末・行頭にスペースを追加するために修飾子の `>` や `<` がサポートされています。 + +* `=>` は末尾のスペースを伴った出力をします。 末尾のスペースが追加されることを除いて, 単一の等合 (`=`) と同じです。 +* `=<` は先頭のスペースを伴った出力をします。先頭のスペースが追加されることを除いて, 単一の等号 (`=`) と同じです。 + +### HTML エスケープを伴わない出力 `==` + +単一のイコール (`=`) と同じですが, `escape_html` メソッドを経由しません。 末尾や先頭のスペースを追加するための修飾子 `>` と `<` はサポートされています。 + +* `==>` は HTML エスケープを行わずに, 末尾のスペースを伴った出力をします。末尾のスペースが追加されることを除いて, 二重等号 (`==`) と同じです。 +* `==<` は HTML エスケープを行わずに, 先頭のスペースを伴った出力をします。先頭のスペースが追加されることを除いて, 二重等号 (`==`) と同じです。 + +### コードコメント `/` + +コードコメントにはスラッシュを使います。スラッシュ以降は最終的なレンダリング結果に表示されません。コードコメントには `/` を, html コメントには `/!` を使います。 + +~~~ slim +body + p + / この行は表示されません。 + この行も表示されません。 + /! html コメントとして表示されます。 +~~~ + + 構文解析結果は以下: + +~~~ html +<body><p><!--html コメントとして表示されます。--></p></body> +~~~ + +### HTML コメント `/!` + +html コメントにはスラッシュの直後にエクスクラメーションマークを使います (`<!-- ... -->`)。 + +### IE コンディショナルコメント `/[...]` + +~~~ slim +/[if IE] + p もっといいブラウザを使ってください。 +~~~ + +レンダリング結果: + +~~~ html +<!--[if IE]><p>もっといいブラウザを使ってください。</p><![endif]--> +~~~ + +## HTML タグ + +### <!DOCTYPE> 宣言 + +doctype キーワードでは, とても簡単な方法で複雑な DOCTYPE を生成できます。 + +XML バージョン + +~~~ slim +doctype xml + <?xml version="1.0" encoding="utf-8" ?> + +doctype xml ISO-8859-1 + <?xml version="1.0" encoding="iso-8859-1" ?> +~~~ + +XHTML DOCTYPES + +~~~ slim +doctype html + <!DOCTYPE html> + +doctype 5 + <!DOCTYPE html> + +doctype 1.1 + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> + +doctype strict + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +doctype frameset + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> + +doctype mobile + <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" + "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"> + +doctype basic + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" + "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"> + +doctype transitional + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +~~~ + +HTML 4 DOCTYPES + +~~~ slim +doctype strict + <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> + +doctype frameset + <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" + "http://www.w3.org/TR/html4/frameset.dtd"> + +doctype transitional + <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +~~~ + +### 閉じタグ (末尾の `/`) + +末尾に `/` を付けることで明示的にタグを閉じることができます。 + +~~~ slim +img src="image.png"/ +~~~ + +(注) 標準的な html タグ (img, br, ...) は自動的にタグを閉じるので, +通常必要ありません。 + +### 行頭・行末にスペースを追加する (`<`, `>`) + +a タグの後に > を追加することで末尾にスペースを追加するよう Slim に強制することができます。 + +~~~ slim +a> href='url1' リンク1 +a> href='url2' リンク2 +~~~ + +< を追加することで先頭にスペースを追加できます。 + +~~~ slim +a< href='url1' リンク1 +a< href='url2' リンク2 +~~~ + +これらを組み合わせて使うこともできます。 + +~~~ slim +a<> href='url1' リンク1 +~~~ + +### インラインタグ + +タグをよりコンパクトにインラインにしたくなることがあるかもしれません。 + +~~~ slim +ul + li.first: a href="/a" A リンク + li: a href="/b" B リンク +~~~ + +可読性のために, 属性を囲むことができるのを忘れないでください。 + +~~~ slim +ul + li.first: a[href="/a"] A リンク + li: a[href="/b"] B リンク +~~~ + +### テキストコンテンツ + +タグと同じ行で開始するか + +~~~ slim +body + h1 id="headline" 私のサイトへようこそ。 +~~~ + +入れ子にするかのどちらかです。エスケープ処理を行うためにはパイプかシングルクォートを使わなければなりません。 + + +~~~ slim +body + h1 id="headline" + | 私のサイトへようこそ。 +~~~ + +スマートテキストモードを有効化して利用する場合 + +~~~ slim +body + h1 id="headline" + 私のサイトへようこそ。 +~~~ + +### 動的コンテンツ (`=` と `==`) + +同じ行で呼び出すか + +~~~ slim +body + h1 id="headline" = page_headline +~~~ + +入れ子にすることができます。 + +~~~ slim +body + h1 id="headline" + = page_headline +~~~ + +### 属性 + +タグの後に直接属性を書きます。通常の属性記述にはダブルクォート `"` か シングルクォート `'` を使わなければなりません (引用符で囲まれた属性)。 + +~~~ slim +a href="https://slim-template.github.io" title='Slim のホームページ' Slim のホームページへ +~~~ + +引用符で囲まれたテキストを属性として使えます。 + +#### 属性の囲み + +区切り文字が構文を読みやすくするのであれば, +`{...}`, `(...)`, `[...]` で属性を囲むことができます。 +これらの記号は設定で変更できます (`:attr_list_delims` オプション参照)。 + +~~~ slim +body + h1(id="logo") = page_logo + h2[id="tagline" class="small tagline"] = page_tagline +~~~ + +属性を囲んだ場合, 属性を複数行にわたって書くことができます: + +~~~ slim +h2[id="tagline" + class="small tagline"] = page_tagline +~~~ + +属性の囲みや変数まわりにスペースを使うことができます: + +~~~ slim +h1 id = "logo" = page_logo +h2 [ id = "tagline" ] = page_tagline +~~~ + +#### 引用符で囲まれた属性 + +例: + +~~~ slim +a href="https://slim-template.github.io" title='Slim のホームページ' Slim のホームページへ +~~~ + +引用符で囲まれたテキストを属性として使えます: + +~~~ slim +a href="http://#{url}" #{url} へ +~~~ + +属性値はデフォルトでエスケープされます。属性のエスケープを無効にしたい場合 == を使います。 + +~~~ slim +a href=="&" +~~~ + +引用符で囲まれた属性をバックスラッシュ `\` で改行できます。 + +~~~ slim +a data-title="help" data-content="極めて長い長い長いヘルプテキストで\ + 続けてその後はまたやり直して繰り返し...." +~~~ + +#### Ruby コードを用いた属性 + +`=` の後に直接 Ruby コードを書きます。コードにスペースが含まれる場合, +`(...)` の括弧でコードを囲まなければなりません。ハッシュを `{...}` に, 配列を `[...]` に書くこともできます。 + +~~~ slim +body + table + - for user in users + td id="user_#{user.id}" class=user.role + a href=user_action(user, :edit) Edit #{user.name} + a href=(path_to_user user) = user.name +~~~ + +属性値はデフォルトでエスケープされます。属性のエスケープを無効にしたい場合 == を使います。 + +~~~ slim +a href==action_path(:start) +~~~ + +Ruby コードの属性は, コントロールセクションにあるようにバックスラッシュ `\` や `,` を用いて改行できます。 + +#### 真偽値属性 + +属性値の `true`, `false` や `nil` は真偽値として +評価されます。属性を括弧で囲む場合, 属性値の指定を省略することができます。 + +~~~ slim +input type="text" disabled="disabled" +input type="text" disabled=true +input(type="text" disabled) + +input type="text" +input type="text" disabled=false +input type="text" disabled=nil +~~~ + +#### 属性の結合 + +複数の属性が与えられた場合に属性をまとめるように設定することができます (`:merge_attrs` 参照)。デフォルト設定では + class 属性はスペース区切りで結合されます。 + +~~~ slim +a.menu class="highlight" href="https://slim-template.github.io/" slim-template.github.io +~~~ + +レンダリング結果: + +~~~ html +<a class="menu highlight" href="https://slim-template.github.io/">slim-template.github.io</a> +~~~ + +また, `Array` を属性値として使うと、配列要素が区切り文字で結合されます。 + +~~~ slim +a class=["menu","highlight"] +a class=:menu,:highlight +~~~ + +#### アスタリスク属性 `*` + +アスタリスクによってハッシュを属性/値のペアとして使うことができます。 + +~~~ slim +.card*{'data-url'=>place_path(place), 'data-id'=>place.id} = place.name +~~~ + +レンダリング結果: + +~~~ html +<div class="card" data-id="1234" data-url="/place/1234">Slim の家</div> +~~~ + +次のようにハッシュを返すメソッドやインスタンス変数を使うこともできます。 + +~~~ slim +.card *method_which_returns_hash = place.name +.card *@hash_instance_variable = place.name +~~~ + +属性の結合 (Slim オプション `:merge_attrs` 参照) に対応するハッシュ属性には `Array` を与えることもできます。 + +~~~ slim +.first *{class: [:second, :third]} テキスト +~~~ + +レンダリング結果 + +~~~ slim +div class="first second third" +~~~ + +アスタリスク(スプラット)属性のプレフィックスは `splat_prefix` オプションで設定できます。デフォルト値は `'*'` です。 + +#### 動的タグ `*` + +アスタリスク属性を使用することで完全に動的なタグを作ることができます。:tag をキーにもつハッシュを返すメソッドを +作るだけです。 + +~~~ slim +ruby: + def a_unless_current + @page_current ? {tag: 'span'} : {tag: 'a', href: 'https://slim-template.github.io/'} + end +- @page_current = true +*a_unless_current リンク +- @page_current = false +*a_unless_current リンク +~~~ + +レンダリング結果: + +~~~ html +<span>リンク</span><a href="https://slim-template.github.io/">リンク</a> +~~~ + +### ショートカット + +#### タグショートカット + +`:shortcut` オプションを設定することで独自のタグショートカットを定義できます。Rails アプリケーションでは, `config/initializers/slim.rb` のようなイニシャライザに定義します。Sinatra アプリでは, `require 'slim'` を書いた行以降であれば, どこにでも設定を定義することができます。 + +~~~ ruby +Slim::Engine.set_options shortcut: {'c' => {tag: 'container'}, '#' => {attr: 'id'}, '.' => {attr: 'class'} } +~~~ + +Slim コードの中でこの様に使用できます。 + +~~~ slim +c.content テキスト +~~~ + +レンダリング結果 + +~~~ html +<container class="content">テキスト</container> +~~~ + +#### 属性のショートカット + +カスタムショートカットを定義することができます (id の`#` , class の `.` のように)。 + +例として, type 属性付きの input 要素のショートカット `&` を追加します。 + +~~~ ruby +Slim::Engine.set_options shortcut: {'&' => {tag: 'input', attr: 'type'}, '#' => {attr: 'id'}, '.' => {attr: 'class'}} +~~~ + +Slim コードの中でこの様に使用できます。 + +~~~ slim +&text name="user" +&password name="pw" +&submit +~~~ + +レンダリング結果 + +~~~ html +<input type="text" name="user" /> +<input type="password" name="pw" /> +<input type="submit" /> +~~~ + +別の例として, role 属性のショートカット `@` を追加します。 + +~~~ ruby +Slim::Engine.set_options shortcut: {'@' => 'role', '#' => 'id', '.' => 'class'} +~~~ + +Slim コードの中でこの様に使用できます。 + +~~~ slim +.person@admin = person.name +~~~ + +レンダリング結果 + +~~~ html +<div class="person" role="admin">Daniel</div> +~~~ + +1つのショートカットを使って複数の属性を設定することもできます。 + +~~~ ruby +Slim::Engine.set_options shortcut: {'@' => {attr: %w(data-role role)}} +~~~ + +Slim の中で次のように使用すると, + +~~~ slim +.person@admin = person.name +~~~ + +このようにレンダリングされます。 + +~~~ html +<div class="person" role="admin" data-role="admin">Daniel</div> +~~~ + +次のように追加の属性固定値を設定することもできます。 + +~~~ ruby +Slim::Engine.set_options shortcut: {'^' => {tag: 'script', attr: 'data-binding', + additional_attrs: { type: "text/javascript" }}} +~~~ + +このように使用します。 + +~~~ slim +^products + == @products.to_json +~~~ + +レンダリング結果です。 + +~~~ html +<script data-binding="products" type="text/javascript"> +[{"name": "product1", "price": "$100"}, + {"name": "prodcut2", "price": "$200"}] +</script> +~~~ + +#### ID ショートカット `#` と class ショートカット `.` + +`id` と `class` の属性を次のショートカットで指定できます。 + +~~~ slim +body + h1#headline + = page_headline + h2#tagline.small.tagline + = page_tagline + .content + = show_content +~~~ + +これは次に同じです + +~~~ slim +body + h1 id="headline" + = page_headline + h2 id="tagline" class="small tagline" + = page_tagline + div class="content" + = show_content +~~~ + +## ヘルパ, キャプチャとインクルード + +いくつかのヘルパを使用してテンプレートを拡張することもできます。次のヘルパが定義されているとして, + +~~~ruby +module Helpers + def headline(&block) + if defined?(::Rails) + # Rails の場合には capture メソッドを使う + "<h1>#{capture(&block)}</h1>" + else + # フレームワークなしで Slim を使う場合(Tilt の場合), + # そのまま出力する + "<h1>#{yield}</h1>" + end + end +end +~~~ + +実行する Slim のテンプレートコードのスコープにインクルードされます。このヘルパは, Slim テンプレートの中で次のように使用することができます。 + +~~~ slim +p + = headline do + ' Hello + = user.name +~~~ + +`do` ブロック内のコンテンツが自動的にキャプチャされ `yield` を通してヘルパに渡されます。糖衣構文として +`do` キーワードを省略して書くこともできます。 + +~~~ slim +p + = headline + ' Hello + = user.name +~~~ + +### ローカル変数のキャプチャ + +次のように `Binding` を使ってローカル変数をキャプチャすることができます: + +~~~ruby +module Helpers + def capture_to_local(var, &block) + set_var = block.binding.eval("lambda {|x| #{var} = x }") + # Rails では capture! を使います + # Slim をフレームワークなしで使う場合 (Tilt のみを使う場合), + # キャプチャブロックを取得するには yield だけが利用できます + set_var.call(defined?(::Rails) ? capture(&block) : yield) + end +end +~~~ + +このヘルパは次のように使用できます + +~~~ slim +/ captured_content 変数は Binding 前に定義されていなければいけません。 += capture_to_local captured_content=:captured_content + p この段落は captured_content 変数にキャプチャされます += captured_content +~~~ + +別の興味深いユースケースは, enumerableを使いそれぞれの要素をキャプチャすることです。ヘルパは, このようになります。 + +~~~ ruby +module Capture + def capture(var, enumerable = nil, &block) + value = enumerable ? enumerable.map(&block) : yield + block.binding.eval("lambda {|x| #{var} = x }").call(value) + nil + end +end +~~~ + +そして, 次のように使用出来ます。 + +~~~ slim +- links = { 'https://slim-template.github.io' => 'The Slim Template Language' } += capture link_list=:link_list, links do |url, text| + a href=url = text +~~~ + +その後は, `link_list`はキャプチャしたコンテンツを含みます。 + +### インクルードヘルパ + +コンパイル時にインクルード機能を使いたい場合には, [パーシャルのインクルード](doc/jp/include.md) を見てください。 +実行時にサブテンプレートを実行すること ( Rails の `#render` のように) もできます。インクルードヘルパを自分で用意する必要があります: + +~~~ ruby +module Helpers + def include_slim(name, options = {}, &block) + Slim::Template.new("#{name}.slim", options).render(self, &block) + end +end +~~~ + +このヘルパは次のように使用できます + +~~~ slim +nav = include_slim 'menu' +section = include_slim 'content' +~~~ + +しかし, このヘルパはキャッシュを行いません。その為, 目的にあったよりインテリジェントなバージョンを +実装する必要があります。また, ほとんどのフレームワークにはすでに同様のヘルパが含まれるので注意してください。(例: Rails の `render` メソッド) + +## テキストの展開 + +Ruby の標準的な展開方法を使用します。テキストはデフォルトで html エスケープされます。2 重括弧にすることでエスケープしないこともできます。 + +~~~ slim +body + h1 ようこそ #{current_user.name} ショーへ。 + | エスケープしない #{{content}} こともできます。 +~~~ + +展開したテキストのエスケープ方法 (言い換えればそのままのレンダリング) + +~~~ slim +body + h1 ようこそ \#{current_user.name} ショーへ。 +~~~ + +## 埋め込みエンジン (Markdown, ...) + +[Tilt](https://github.com/jeremyevans/tilt)のおかげで, Slim は他のテンプレートエンジンの埋め込みに見事に対応しています。 + +例: + +~~~ slim + coffee: + square = (x) -> x * x + + markdown: + #Header + #{"Markdown"} からこんにちわ! + 2行目! + +p: markdown: Tag with **inline** markdown! +~~~ + +対応エンジン: + +| フィルタ | 必要な gems | 種類 | 説明 | +| -------- | ----------- | ---- | ----------- | +| ruby: | なし | ショートカット | Ruby コードを埋め込むショートカット | +| javascript: | なし | ショートカット | javascript コードを埋め込み、script タグで囲む | +| css: | なし | ショートカット | css コードを埋め込み、style タグで囲む | +| sass: | sass-embedded または sassc または sass | コンパイル時 | sass コードを埋め込み、style タグで囲む | +| scss: | sass-embedded または sassc または sass | コンパイル時 | scss コードを埋め込み、style タグで囲む | +| less: | less | コンパイル時 | less コードを埋め込み、style タグで囲む | +| coffee: | coffee-script | コンパイル時 | CoffeeScript をコンパイルし、 script タグで囲む | +| markdown: | redcarpet/rdiscount/kramdown | コンパイル時 + 展開 | Markdown をコンパイルし、テキスト中の # \{variables} を展開 | +| textile: | redcloth | コンパイル時 + 展開 | textile をコンパイルし、テキスト中の # \{variables} を展開 | +| rdoc: | rdoc | コンパイル時 + 展開 | RDoc をコンパイルし、テキスト中の # \{variables} を展開 | + +埋め込みエンジンは Slim の `Slim::Embedded` フィルタのオプションで直接設定されます。例: + +~~~ ruby +Slim::Embedded.options[:markdown] = {auto_ids: false} +~~~ + +以下埋め込みエンジンの場合はHTMLのattributeも指定できます: + +* Javascript +* CSS +* CoffeeScript +* LESS +* SASS +* SCSS + +例: + +~~~ scss +scss class="myClass": + $color: #f00; + body { color: $color; } +~~~ + +レンダリング結果: + +~~~ html +<style class="myClass" type="text/css">body{color:red}</style> +~~~ + +## Slim の設定 + +Slim とその基礎となる [Temple](https://github.com/judofyr/temple) は非常に柔軟に設定可能です。 +Slim を設定する方法はコンパイル機構に少し依存します。(Rails や [Tilt](https://github.com/jeremyevans/tilt))。デフォルトオプションの設定は `Slim::Engine` クラスでいつでも可能です。Rails の 環境設定ファイルで設定可能です。例えば, config/environments/developers.rb で設定したいとします: + +### デフォルトオプション + +~~~ ruby +# デバック用に html をきれいにインデントし属性をソートしない +Slim::Engine.set_options pretty: true, sort_attrs: false +~~~ + +ハッシュで直接オプションにアクセスすることもできます: + +~~~ ruby +Slim::Engine.options[:pretty] = true +~~~ + +### 実行時のオプション設定 + +実行時のオプション設定の方法は2つあります。Tilt テンプレート (`Slim::Template`) の場合, テンプレートを +インスタンス化する時にオプションを設定できます。 + +~~~ ruby +Slim::Template.new('template.slim', optional_option_hash).render(scope) +~~~ + +他の方法は Rails に主に関係がありますがスレッド毎にオプション設定を行う方法です: + +~~~ slim +Slim::Engine.with_options(option_hash) do + # ここで作成される Slim エンジンは option_hash を使用します + # Rails での使用例: + render :page, layout: true +end +~~~ + +Rails ではコンパイルされたテンプレートエンジンのコードとオプションはテンプレート毎にキャッシュされ, 後でオプションを変更できないことに注意する必要があります。 + +~~~ slim +# 最初のレンダリング呼び出し +Slim::Engine.with_options(pretty: true) do + render :page, layout: true +end + +# 2回目のレンダリング呼び出し +Slim::Engine.with_options(pretty: false) do + render :page, layout: true # :pretty is still true because it is cached +end +~~~ + +### 設定可能なオプション + +次のオプションが `Slim::Engine` によって用意され `Slim::Engine.set_options` で設定することができます。 +沢山ありますが, 素晴らしいことに, Slim は設定キーをチェックし, 無効な設定キーを使用しようとしていた場合, エラーを返してくれます。 + + +| 型 | 名前 | デフォルト | 用途 | +| ---- | ---- | ---------- | ---- | +| String | :file | nil | 解析対象のファイル名。 Slim::Template によって自動的に設定されます | +| Integer | :tabsize | 4 | 1 タブあたりのスペース数 (構文解析で利用されます) | +| String | :encoding | "utf-8" | テンプレートのエンコーディングを設定 | +| String | :default_tag | "div" | タグ名が省略されている場合デフォルトのタグとして使用される | +| Hash | :shortcut | \{'.' => {attr: 'class'}, '#' => {attr: 'id'}} | 属性のショートカット | +| Hash | :code_attr_delims | \{'(' => ')', '[' => ']', '{' => '}'} | Ruby コードの属性区切り文字 | +| Hash | :attr_list_delims | \{'(' => ')', '[' => ']', '{' => '}'} | 属性リスト区切り文字 | +| Array<Symbol,String> | :enable_engines | nil <i>(すべて有効)</i> | 有効な埋め込みエンジンリスト (ホワイトリスト) | +| Array<Symbol,String> | :disable_engines | nil <i>(無効なし)</i> | 無効な埋め込みエンジンリスト (ブラックリスト) | +| Boolean | :disable_capture | false (Rails では true) | ブロック内キャプチャ無効 (ブロックはデフォルトのバッファに書き込む) | +| Boolean | :disable_escape | false | Stringの自動エスケープ無効 | +| Boolean | :use_html_safe | false (Rails では true) | ActiveSupport の String# html_safe? を使う (:disable_escape と一緒に機能する) | +| Symbol | :format | :xhtml | HTML の出力フォーマット (対応フォーマット :html, :xhtml, :xml) | +| String | :attr_quote | '"' | HTML の属性を囲む文字 (' または " が可能) | +| Hash | :merge_attrs | \{'class' => ' '} | 複数の html 属性が与えられたときに, 結合に使われる文字 (例: class="class1 class2") | +| Array<String> | :hyphen_attrs | %w(data) | 属性にハッシュが与えられたとき, ハイフンで区切られます。(例: data={a:1, b:2} は data-a="1" data-b="2" のように) | +| Boolean | :sort_attrs | true | 名前順に属性をソート | +| Symbol | :js_wrapper | nil | :commentや :cdata , :both で JavaScript をラップします。:guess を指定することで :format オプションに基いて設定することもできます | +| Boolean | :pretty | false | HTML を綺麗にインデントします。ブロック要素のタグでのみ、インデントされます。 <b>(遅くなります!)</b> | +| String | :indent | ' ' | インデントに使用される文字列 | +| Boolean | :streaming | false (Rails では true, 無効化するにはストリーミングを参照) | ストリーミング出力の有効化, 体感的なパフォーマンスの向上 | +| Class | :generator | Temple::Generators::StringBuffer/ RailsOutputBuffer | Temple コードジェネレータ (デフォルトのジェネレータはStringバッファを生成します) | +| String | :buffer | '_buf' (Rails では '@output_buffer') | バッファに使用される変数 | +| String | :splat_prefix | '*' | アスタリスク(スプラット)属性のプレフィックス | + +Temple フィルタによってもっと多くのオプションがサポートされていますが一覧には載せず公式にはサポートしません。 +Slim と Temple のコードを確認しなければなりません。 + +### オプションの優先順位と継承 + +Slim や Temple のアーキテクチャについてよく知っている開発者は, 別の場所で設定を +上書きすることができます。 Temple はサブクラスがスーパークラスのオプションを上書きできるように +継承メカニズムを採用しています。オプションの優先順位は次のとおりです: + +1. `Slim::Template` オプションはエンジン初期化時に適用されます +2. `Slim::Template.options` +3. `Slim::Engine.thread_options`, `Slim::Engine.options` +5. Praser/Filter/Generator `thread_options`, `options` (例: `Slim::Parser`, `Slim::Compiler`) + +`Temple::Engine` のようにスーパークラスのオプションを設定することも可能です。しかし, こうするとすべての Temple テンプレートエンジンに影響します。 + +~~~ ruby +Slim::Engine < Temple::Engine +Slim::Compiler < Temple::Filter +~~~ + +## プラグイン + +Slim はロジックレスモードと I18n, インクルードプラグインを提供しています。プラグインのドキュメントを確認してください。 + +* [ロジックレスモード](doc/jp/logic_less.md) +* [パーシャルのインクルード](doc/jp/include.md) +* [多言語化/I18n](doc/jp/translator.md) +* [スマートテキストモード](doc/jp/smart.md) + +## フレームワークサポート + +### Tilt + +Slim は生成されたコードをコンパイルするために [Tilt](https://github.com/jeremyevans/tilt) を使用します。Slim テンプレートを直接使いたい場合, Tilt インターフェイスが使用できます。 + +~~~ ruby +Tilt.new['template.slim'].render(scope) +Slim::Template.new('template.slim', optional_option_hash).render(scope) +Slim::Template.new(optional_option_hash) { source }.render(scope) +~~~ + +optional_option_hash は前述のオプションを持つことができます。スコープはコードが実行されるテンプレートの +オブジェクトです。 + +### Sinatra + +~~~ ruby +require 'sinatra' +require 'slim' + +get('/') { slim :index } + + __END__ +@@ index +doctype html +html + head + title Slim で Sinatra + body + h1 Slim は楽しい! +~~~ + +### Rails + +Rails のジェネレータは [slim-rails](https://github.com/slim-template/slim-rails) によって提供されます。 +slim-rails は Rails で Slim を使用する場合に必須ではありません。Slim をインストールし Gemfile に `gem 'slim'` を追加するだけです。 +後は .slim 拡張子を使うだけです。 + +#### ストリーミング + +HTTP ストリーミングをサポートしているバージョンの Rails であれば, デフォルトで有効化されています。しかし, ストリーミングは体感的なパフォーマンスを改善しているだけであることに注意してください。 +レンダリング時間は増加するでしょう。ストリーミングを無効化したい場合, 以下のように設定します: + +~~~ ruby +Slim::RailsTemplate.set_options streaming: false +~~~ + +### Angular2 + +Slim は Angular2 の構文に対応しています。ただし, いくつかのオプションを設定する必要があります: + +#### `splat_prefix` オプション + +このオプションは, アスタリスク(スプラット)属性に使用する構文をパーサに指定します。 +デフォルト値はアスタリスクです: `splat_prefix: '*'` +アスタリスクは Angular2 でも構造ディレクティブとして `*ngIf` などで使われます。デフォルトの設定値では, Slim と Angular2 の構文は衝突します。 + +解決方法は 2 つあります: + +* `splat_prefix` に 2重アスタリスクのようなカスタム値(`splat_prefix: '**'`)を設定します。これで構造ディレクティブは期待通りに機能するはずです。アスタリスク属性は設定したカスタム値のプレフィックスで書かなければならないので注意してください。 +* アスタリスクではない代わりのディレクティブ構文を使います。 + +#### 属性区切り文字 + +Angular と Slim はそれぞれの構文で括弧を使います。この場合も解決方法は 2 つあります: +* バインディングに代わりの構文を使う (`bind-...` など) +* 属性区切り文字を波括弧に限定する +``` +code_attr_delims: { + '{' => '}', +}, +attr_list_delims: { + '{' => '}', +}, +``` + +これで次のように書けます: +``` +h1{ #var (bind1)="test" [bind2]="ok" [(bind3)]="works?" *ngIf="expr" *ngFor="expression" } {{it works}} +``` + +コンパイル結果: +``` +<h1 #var="" (bind1)="test" [bind2]="ok" [(bind3)]="works?" *ngIf="expr" *ngFor="expression"> + {{it works}} +</h1> +``` + +## ツール + +### Slim コマンド 'slimrb' + +gem の 'slim' にはコマンドラインから Slim をテストするための小さなツール 'slimrb' が付属します。 + +<pre> +$ slimrb --help +Usage: slimrb [options] + -s, --stdin Read input from standard input instead of an input file + --trace Show a full traceback on error + -c, --compile Compile only but do not run + -e, --erb Convert to ERB + --rails Generate rails compatible code (Implies --compile) + -r, --require library Load library or plugin with -r slim/plugin + -p, --pretty Produce pretty html + -o, --option name=code Set slim option + -l, --locals Hash|YAML|JSON Set local variables + -h, --help Show this message + -v, --version Print version +</pre> + +'slimrb' で起動し, コードをタイプし Ctrl-d で EOF を送ります。Windows のコマンドプロンプトでは Ctrl-z で EOF を送ります。使い方例: + +<pre> +$ slimrb +markdown: + 最初の段落。 + + 2つ目の段落。 + + * 1つ + * 2つ + * 3つ + +//Enter Ctrl-d +<p>最初の段落。 </p> + +<p>2つめの段落。 </p> + +<ul> +<li>1つ</li> +<li>2つ</li> +<li>3つ</li> +</ul> +</pre> + +### 構文ハイライト + +様々なテキストエディタ(Vim や Emacs, Textmateなど)のためのプラグインがあります。: + +* [Vim](https://github.com/slim-template/vim-slim) +* [Emacs](https://github.com/slim-template/emacs-slim) +* [Textmate / Sublime Text](https://github.com/slim-template/ruby-slim.tmbundle) +* [Espresso text editor](https://github.com/slim-template/Slim-Sugar) +* [Coda](https://github.com/slim-template/Coda-2-Slim.mode) +* [Atom](https://github.com/slim-template/language-slim) + +### テンプレート変換 (HAML, ERB, ...) + +* Slim は gem に含まれる `slimrb` や `Slim::ERBConverter` を用いて ERB に変換できます。 +* [Haml2Slim converter](https://github.com/slim-template/haml2slim) +* [ERB2Slim, HTML2Slim converter](https://github.com/slim-template/html2slim) + +## テスト + +### ベンチマーク + + *そうです, Slim は最速の Ruby のテンプレートエンジンです! + production モードの Slim は Erubis (最速のテンプレートエンジン) と同じくらい高速です。 + どんな理由であれ, あなたが Slim を選択していただければ嬉しいし, 私たちは + パフォーマンスが障害にならないだろうことを保証します。* + +ベンチマークは `rake bench` で実行します。時間が余計にかかりますが遅い解析ベンチマークを +実行したい場合 `slow` オプションを追加できます。 + +~~~ +rake bench slow=1 iterations=1000 +~~~ + +### テストスイートと継続的インテグレーション + +Slim は minitest ベースの拡張性のあるテストスイートを提供します。テストは 'rake test' または +rails のインテグレーションテストの場合 'rake test:rails' で実行できます。 + +私たちは現在 markdown ファイルで書かれ, 人間が読み書きしやすいテストを試しています: [TESTS.md](test/literate/TESTS.md) + +Slim は主要な Ruby 実装全てで動作します: + +* Ruby 2.5 +* JRuby + +## 貢献 + +Slim の改良を支援したい場合, Git で管理されているプロジェクトを clone してください。 + +~~~ +$ git clone git://github.com/slim-template/slim +~~~ + +魔法をかけた後 pull request を送ってください。私たちは pull request が大好きです! + +Ruby の 2.5.0 でテストをすることを覚えておいてください。 + +もしドキュメントの不足を見つけたら, README.md をアップデートして私たちを助けて下さい。Slim に割ける時間がないが, 私たちが知っておくべきことを見つけた場合には issue を送ってください。 + +## License + +Slim は [MIT license](http://www.opensource.org/licenses/MIT) に基づいてリリースされています。 + +## 作者 + +* [Daniel Mendler](https://github.com/minad) (Lead developer) +* [Andrew Stone](https://github.com/stonean) +* [Fred Wu](https://github.com/fredwu) + +## 寄付と支援 + +このプロジェクトをサポートしたい場合, GitHub sponsors のページを見てください。 + +[![GitHub Sponsors](https://img.shields.io/github/sponsors/slim-template)](https://github.com/sponsors/slim-template) + +## 関連プロジェクト + +テンプレートのコンパイルフレームワーク: + +* [Temple](https://github.com/judofyr/temple) + +フレームワークサポート: + +* [Rails generators (slim-rails)](https://github.com/slim-template/slim-rails) + * [slimkeyfy - Translation string extraction](https://github.com/phrase/slimkeyfy) + +構文ハイライト: + +* [Vim](https://github.com/slim-template/vim-slim) +* [Emacs](https://github.com/slim-template/emacs-slim) +* [Textmate / Sublime Text](https://github.com/slim-template/ruby-slim.tmbundle) +* [Espresso text editor](https://github.com/slim-template/Slim-Sugar) +* [Coda](https://github.com/slim-template/Coda-2-Slim.mode) +* [Atom](https://github.com/slim-template/language-slim) + +静的コード解析: + +* [Slim-Lint](https://github.com/sds/slim-lint) +* [SublimeLinter-slim-lint](https://github.com/elstgav/SublimeLinter-slim-lint) + +テンプレート変換 (HAML, ERB, ...): + +* [Haml2Slim converter](https://github.com/slim-template/haml2slim) +* [ERB2Slim, HTML2Slim converter](https://github.com/slim-template/html2slim) + +移植言語/同様の言語: + +* [Sliq (Slim/Liquid integration)](https://github.com/slim-template/sliq) +* [Slm (Slim port to Javascript)](https://github.com/slm-lang/slm) +* [Coffee script plugin for Slim](https://github.com/yury/coffee-views) +* [Clojure port of Slim](https://github.com/chaslemley/slim.clj) +* [Hamlet.rb (Similar template language)](https://github.com/gregwebs/hamlet.rb) +* [Plim (Python port of Slim)](https://github.com/2nd/plim) +* [Skim (Slim for Javascript)](https://github.com/jfirebaugh/skim) +* [Emblem.js (Javascript, similar to Slim)](https://github.com/machty/emblem.js) +* [Hamlit (High performance Haml implementation, based on Temple like Slim)](https://github.com/k0kubun/hamlit) +* [Faml (Faster Haml implementation, also using Temple like Slim)](https://github.com/eagletmt/faml) +* [Haml (Older engine which inspired Slim)](https://github.com/haml/haml) +* [Jade (Similar engine for javascript)](https://github.com/visionmedia/jade) +* [Pug (Successor of Jade, Similar engine for javascript)](https://github.com/pugjs/pug) +* [Sweet (Similar engine which also allows to write classes and functions)](https://github.com/joaomdmoura/sweet) +* [Amber (Similar engine for Go)](https://github.com/eknkc/amber) +* [Slang (Slim-inspired templating language for Crystal)](https://github.com/jeromegn/slang) diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/README.md new file mode 100644 index 000000000..8093a01b8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/README.md @@ -0,0 +1,1313 @@ +# Slim + +[![Gem Version](https://img.shields.io/gem/v/slim.svg)](http://rubygems.org/gems/slim) +![Build Status](https://github.com/slim-template/slim/actions/workflows/test.yml/badge.svg) +[![GitHub Sponsors](https://img.shields.io/github/sponsors/slim-template)](https://github.com/sponsors/slim-template) + +Slim is a template language whose goal is to reduce the view syntax to the essential parts without becoming cryptic. It started as an exercise to see how much could be removed from a standard html template (<, >, closing tags, etc...). As more people took an interest in Slim, the functionality grew and so did the flexibility of the syntax. + +A short list of the features... + +* Elegant syntax + * Short syntax without closing tags (Using indentation instead) + * HTML style mode with closing tags + * Configurable shortcut tags (`#` for `<div id="...">` and `.` for `<div class="...">` in the default configuration) +* Safety + * Automatic HTML escaping by default + * Support for Rails' `html_safe?` +* Highly configurable +* Extensible via the following plugins: + * Logic less mode similar to Mustache + * Includes + * Translator/I18n +* High performance + * Comparable speed to ERB/Erubis + * Streaming support in Rails +* Supported by all major frameworks (Rails, Sinatra, ...) +* Full Unicode support for tags and attributes +* Embedded engines like Markdown and Textile + +## Links + +* Homepage: <https://slim-template.github.io> +* Source: <https://github.com/slim-template/slim> +* Bugs: <https://github.com/slim-template/slim/issues> +* API documentation: + * Latest Gem: <https://rubydoc.info/gems/slim/frames> + * GitHub main: <https://rubydoc.info/github/slim-template/slim/main/frames> + +## Introduction + +### What is Slim? + +Slim is a fast, lightweight templating engine with support for __Rails 5 and later__. It has been heavily tested on all major ruby implementations. We use +continuous integration (github actions). + +Slim's core syntax is guided by one thought: "What's the minimum required to make this work". + +As more people have contributed to Slim, there have been syntax additions influenced from their use of [Haml](https://github.com/haml/haml) and [Jade](https://github.com/visionmedia/jade). The Slim team is open to these additions because we know beauty is in the eye of the beholder. + +Slim uses [Temple](https://github.com/judofyr/temple) for parsing/compilation and is also integrated into [Tilt](https://github.com/jeremyevans/tilt), so it can be used together with [Sinatra](https://github.com/sinatra/sinatra) or plain [Rack](https://github.com/rack/rack). + +The architecture of Temple is very flexible and allows the extension of the parsing and compilation process without monkey-patching. This is used +by the logic less plugin and the translator plugin which provides I18n. In logic-less mode you can use Slim if you like the Slim syntax to build your HTML but don't want to write Ruby in your templates. + +### Why use Slim? + +* Slim allows you to write very minimal templates which are easy to maintain and pretty much guarantees that you write well-formed HTML and XML +* The Slim syntax is aesthetic and makes it more fun to write templates. Since you can use Slim as a drop-in replacement in all the major frameworks it is easy to adopt. +* The Slim architecture is very flexible and allows you to write syntax extensions and plugins. + +___Yes, Slim is speedy!___ Slim was developed right from the start with performance in mind. +Don't trust the numbers? That's as it should be. Please try the benchmark rake task yourself! + +However in our opinion you should use Slim because of its features and syntax. We just ensure that Slim doesn't have a negative impact on the performance of your application. + +### How to start? + +Install Slim as a gem: + +~~~ +gem install slim +~~~ + +Include Slim in your Gemfile with `gem 'slim'` or require it with `require 'slim'`. That's it! Now, just use the .slim extension and you're good to go. + +### Syntax example + +Here's a quick example to demonstrate what a Slim template looks like: + +~~~ slim +doctype html +html + head + title Slim Examples + meta name="keywords" content="template language" + meta name="author" content=author + link rel="icon" type="image/png" href=file_path("favicon.png") + javascript: + alert('Slim supports embedded javascript!') + + body + h1 Markup examples + + #content + p This example shows you how a basic Slim file looks. + + == yield + + - if items.any? + table#items + - for item in items + tr + td.name = item.name + td.price = item.price + - else + p No items found. Please add some inventory. + Thank you! + + div id="footer" + == render 'footer' + | Copyright © #{@year} #{@author} +~~~ + +Indentation matters, but the indentation depth can be chosen as you like. If you want to first indent 2 spaces, then 5 spaces, it's your choice. To nest markup you only need to indent by one space, the rest is gravy. + +## Line indicators + +### Verbatim text `|` + +The pipe tells Slim to just copy the line. It essentially escapes any processing. +Each following line that is indented greater than the pipe is copied over. + +~~~ slim +body + p + | + This is a test of the text block. +~~~ + + The parsed result of the above: + +~~~ html +<body><p>This is a test of the text block.</p></body> +~~~ + + If the text starts on the same line, the left margin is set at the indent of the pipe + one space. + Any additional spaces will be copied over. + +~~~ slim +body + p + | This line is on the left margin. + This line will have one space in front of it. + This line will have two spaces in front of it. + And so on... +~~~ + +You can also embed html in the text line + +~~~ slim +- articles.each do |a| + | <tr><td>#{a.name}</td><td>#{a.description}</td></tr> +~~~ + +#### Verbatim text with leading and/or trailing white space `|<` `|>` `|<>` + +You can add white space around verbatim text in the same way as for `=` output: +~~~ slim +| This line will not have any extra white space. +| This line will have a leading space, but it is difficult to see. +|< This line will have a leading white space. +|> This line will have a trailing white space. +|<> This line will have both leading and trailing white space. +~~~ + +### Verbatim text with trailing white space `'` + +The single quote tells Slim to copy the line (similar to `|`), but makes sure that a single trailing white space is appended. + +### Inline html `<` + +You can write html tags directly in Slim which allows you to write your templates in a more html like style with closing tags or mix html and Slim style. +The leading `<` works like an implicit `|`: + +~~~ slim +<html> + head + title Example + <body> + - if articles.empty? + - else + table + - articles.each do |a| + <tr><td>#{a.name}</td><td>#{a.description}</td></tr> + </body> +</html> +~~~ + +### Control code `-` + +The dash denotes control code. Examples of control code are loops and conditionals. `end` is forbidden behind `-`. Blocks are defined only by indentation. +If your ruby code needs to use multiple lines, append a backslash `\` at the end of the lines. If your line ends with comma `,` (e.g because of a method call) you don't need the additional backslash before the linebreak. + +~~~ slim +body + - if articles.empty? + | No inventory +~~~ + +### Output `=` + +The equals sign tells Slim it's a Ruby call that produces output to add to the buffer. If your ruby code needs to use multiple lines, append a backslash `\` at the end of the lines. For example: + +~~~ slim += javascript_include_tag \ + "jquery", + "application" +~~~ + +If your line ends with comma `,` (e.g because of a method call) you don't need the additional backslash before the linebreak. For trailing or leading whitespace the modifiers `>` and `<` are supported. + +* Output with trailing white space `=>`. Same as the single equals sign (`=`), except that it adds a trailing white space. +* Output with leading white space `=<`. Same as the single equals sign (`=`), except that it adds a leading white space. + +### Output without HTML escaping `==` + +Same as the single equals sign (`=`), but does not go through the `escape_html` method. For trailing or leading whitespace the modifiers `>` and `<` are supported. + +* Output without HTML escaping and trailing white space `==>`. Same as the double equals sign (`==`), except that it adds a trailing white space. +* Output without HTML escaping and leading white space `==<`. Same as the double equals sign (`==`), except that it adds a leading white space. + +### Code comment `/` + +Use the forward slash for code comments - anything after it won't get displayed in the final render. Use `/` for code comments and `/!` for html comments + +~~~ slim +body + p + / This line won't get displayed. + Neither does this line. + /! This will get displayed as html comments. +~~~ + + The parsed result of the above: + +~~~ html +<body><p><!--This will get displayed as html comments.--></p></body> +~~~ + +### HTML comment `/!` + +Use the forward slash immediately followed by an exclamation mark for html comments (`<!-- ... -->`). + +### IE conditional comment `/[...]` + +~~~ slim +/[if IE] + p Get a better browser. +~~~ + +This renders as: + +~~~ html +<!--[if IE]><p>Get a better browser.</p><![endif]--> +~~~ + +## HTML tags + +### <!DOCTYPE> declaration + +The doctype keyword can be used to generate the complex doctypes in a very simple manner. + +XML VERSION + +~~~ slim +doctype xml + <?xml version="1.0" encoding="utf-8" ?> + +doctype xml ISO-8859-1 + <?xml version="1.0" encoding="iso-8859-1" ?> +~~~ + +XHTML DOCTYPES + +~~~ slim +doctype html + <!DOCTYPE html> + +doctype 5 + <!DOCTYPE html> + +doctype 1.1 + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> + +doctype strict + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +doctype frameset + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> + +doctype mobile + <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" + "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"> + +doctype basic + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" + "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"> + +doctype transitional + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +~~~ + +HTML 4 DOCTYPES + +~~~ slim +doctype strict + <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> + +doctype frameset + <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" + "http://www.w3.org/TR/html4/frameset.dtd"> + +doctype transitional + <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +~~~ + +### Closed tags (trailing `/`) + +You can close tags explicitly by appending a trailing `/`. + +~~~ slim +img src="image.png"/ +~~~ + +Note, that this is usually not necessary since the standard html +tags (img, br, ...) are closed automatically. + +### Trailing and leading whitespace (`<`, `>`) + +You can force Slim to add a trailing whitespace after a tag by adding a `>`. + +~~~ slim +a> href='url1' Link1 +a> href='url2' Link2 +~~~ + +You can add a leading whitespace by adding `<`. + +~~~ slim +a< href='url1' Link1 +a< href='url2' Link2 +~~~ + +You can also combine both. + +~~~ slim +a<> href='url1' Link1 +~~~ + +### Inline tags + +Sometimes you may want to be a little more compact and inline the tags. + +~~~ slim +ul + li.first: a href="/a" A link + li: a href="/b" B link +~~~ + +For readability, don't forget you can wrap the attributes. + +~~~ slim +ul + li.first: a[href="/a"] A link + li: a[href="/b"] B link +~~~ + +### Text content + +Either start on the same line as the tag + +~~~ slim +body + h1 id="headline" Welcome to my site. +~~~ + +Or nest it. You must use a pipe or an apostrophe to escape processing + + +~~~ slim +body + h1 id="headline" + | Welcome to my site. +~~~ + +Or enable and rely on smart text instead + +~~~ slim +body + h1 id="headline" + Welcome to my site. +~~~ + +### Dynamic content (`=` and `==`) + +Can make the call on the same line + +~~~ slim +body + h1 id="headline" = page_headline +~~~ + +Or nest it. + +~~~ slim +body + h1 id="headline" + = page_headline +~~~ + +### Attributes + +You write attributes directly after the tag. For normal text attributes you must use double `"` or single quotes `'` (Quoted attributes). + +~~~ slim +a href="https://slim-template.github.io" title='Slim Homepage' Goto the Slim homepage +~~~ + +You can use text interpolation in the quoted attributes. + +#### Attributes wrapper + +If a delimiter makes the syntax more readable for you, +you can use the characters `{...}`, `(...)`, `[...]` to wrap the attributes. +You can configure these symbols (See option `:attr_list_delims`). + +~~~ slim +body + h1(id="logo") = page_logo + h2[id="tagline" class="small tagline"] = page_tagline +~~~ + +If you wrap the attributes, you can spread them across multiple lines: + +~~~ slim +h2[id="tagline" + class="small tagline"] = page_tagline +~~~ + +You may use spaces around the wrappers and assignments: + +~~~ slim +h1 id = "logo" = page_logo +h2 [ id = "tagline" ] = page_tagline +~~~ + +#### Quoted attributes + +Example: + +~~~ slim +a href="https://slim-template.github.io" title='Slim Homepage' Goto the Slim homepage +~~~ + +You can use text interpolation in the quoted attributes: + +~~~ slim +a href="http://#{url}" Goto the #{url} +~~~ + +The attribute value will be escaped by default. Use == if you want to disable escaping in the attribute. + +~~~ slim +a href=="&" +~~~ + +You can break quoted attributes with backslash `\` + +~~~ slim +a data-title="help" data-content="extremely long help text that goes on\ + and on and on and then starts over...." +~~~ + +#### Ruby attributes + +Write the ruby code directly after the `=`. If the code contains spaces you have to wrap +the code into parentheses `(...)`. You can also directly write hashes `{...}` and arrays `[...]`. + +~~~ slim +body + table + - for user in users + td id="user_#{user.id}" class=user.role + a href=user_action(user, :edit) Edit #{user.name} + a href=(path_to_user user) = user.name +~~~ + +The attribute value will be escaped by default. Use == if you want to disable escaping in the attribute. + +~~~ slim +a href==action_path(:start) +~~~ + +You can also break ruby attributes with backslash `\` or trailing `,` as described for control sections. + +#### Boolean attributes + +The attribute values `true`, `false` and `nil` are interpreted +as booleans. If you use the attribute wrapper you can omit the attribute assigment. + +~~~ slim +input type="text" disabled="disabled" +input type="text" disabled=true +input(type="text" disabled) + +input type="text" +input type="text" disabled=false +input type="text" disabled=nil +~~~ + +#### Attribute merging + +You can configure attributes to be merged if multiple are given (See option `:merge_attrs`). In the default configuration +this is done for class attributes with the white space as delimiter. + +~~~ slim +a.menu class="highlight" href="https://slim-template.github.io/" slim-template.github.io +~~~ + +This renders as: + +~~~ html +<a class="menu highlight" href="https://slim-template.github.io/">slim-template.github.io</a> +~~~ + +You can also use an `Array` as attribute value and the array elements will be merged using the delimiter. + +~~~ slim +a class=["menu","highlight"] +a class=:menu,:highlight +~~~ + +#### Splat attributes `*` + +The splat shortcut allows you to turn a hash into attribute/value pairs. + +~~~ slim +.card*{'data-url'=>place_path(place), 'data-id'=>place.id} = place.name +~~~ + +This renders as: + +~~~ html +<div class="card" data-id="1234" data-url="/place/1234">Slim's house</div> +~~~ + +You can also use methods or instance variables which return a hash as shown here: + +~~~ slim +.card *method_which_returns_hash = place.name +.card *@hash_instance_variable = place.name +~~~ + +The hash attributes which support attribute merging (see Slim option `:merge_attrs`) can be given as an `Array` + +~~~ slim +.first *{class: [:second, :third]} Text +~~~ + +This renders as: + +~~~ html +div class="first second third" +~~~ + +Splat attributes prefix may be configured via `splat_prefix` option. Default value is `'*'` + +#### Dynamic tags `*` + +You can create completely dynamic tags using the splat attributes. Just create a method which returns a hash +with the :tag key. + +~~~ slim +ruby: + def a_unless_current + @page_current ? {tag: 'span'} : {tag: 'a', href: 'https://slim-template.github.io/'} + end +- @page_current = true +*a_unless_current Link +- @page_current = false +*a_unless_current Link +~~~ + +This renders as: + +~~~ html +<span>Link</span><a href="https://slim-template.github.io/">Link</a> +~~~ + +### Shortcuts + +#### Tag shortcuts + +You can define custom tag shortcuts by setting the option `:shortcut`. In Rails apps, you need to put this code for your shortcuts into an initializer like `config/initializers/slim.rb`. In Sinatra, you simply add the same configuration anywhere below the line where you `require 'slim'`. + +~~~ ruby +Slim::Engine.set_options shortcut: {'c' => {tag: 'container'}, '#' => {attr: 'id'}, '.' => {attr: 'class'} } +~~~ + +We can use it in Slim code like this + +~~~ slim +c.content Text +~~~ + +which renders to + +~~~ html +<container class="content">Text</container> +~~~ + +#### Attribute shortcuts + +You can define custom shortcuts (Similar to `#` for id and `.` for class). + +In this example we add `&` to create a shortcut for the input elements with type attribute. + +~~~ ruby +Slim::Engine.set_options shortcut: {'&' => {tag: 'input', attr: 'type'}, '#' => {attr: 'id'}, '.' => {attr: 'class'}} +~~~ + +We can use it in Slim code like this + +~~~ slim +&text name="user" +&password name="pw" +&submit +~~~ + +which renders to + +~~~ html +<input type="text" name="user" /> +<input type="password" name="pw" /> +<input type="submit" /> +~~~ + +In another example we add `@` to create a shortcut for the role attribute. + +~~~ ruby +Slim::Engine.set_options shortcut: {'@' => {attr: 'role'}, '#' => {attr: 'id'}, '.' => {attr: 'class'}} +~~~ + +We can use it in Slim code like this + +~~~ slim +.person@admin = person.name +~~~ + +which renders to + +~~~ html +<div class="person" role="admin">Daniel</div> +~~~ + +You can also set multiple attributes with same value at once using one shortcut. + +~~~ ruby +Slim::Engine.set_options shortcut: {'@' => {attr: %w(data-role role)}} +~~~ + +We can use it in Slim code like this + +~~~ slim +.person@admin = person.name +~~~ + +which renders to + +~~~ html +<div class="person" role="admin" data-role="admin">Daniel</div> +~~~ + +You can also set additional fixed value attributes to a shortcut. + +~~~ ruby +Slim::Engine.set_options shortcut: {'^' => {tag: 'script', attr: 'data-binding', + additional_attrs: { type: "text/javascript" }}} +~~~ + +Then + +~~~ slim +^products + == @products.to_json +~~~ + +which renders to + +~~~ html +<script data-binding="products" type="text/javascript"> +[{"name": "product1", "price": "$100"}, + {"name": "prodcut2", "price": "$200"}] +</script> +~~~ + +#### Lambda shortcuts + +You can define custom shortcuts using lambdas. + +In this example we add `~` to create a shortcut with a special processing (adding a prefix) for the class attribute. + +~~~ ruby +Slim::Engine.set_options shortcut: {'~' => {attr: ->(v) {{class: "styled-#{v}"}}}} +~~~ + +We can use it in Slim code like this + +~~~ slim +h1~title Hello +~text~question.paragraph How are you? +~~~ + +which renders to + +~~~ html +<h1 class="styled-title">Hello</h1> +<div class="styled-text styled-question paragraph">How are you?</div> +~~~ + +#### ID shortcut `#` and class shortcut `.` + +You can specify the `id` and `class` attributes in the following shortcut form + +~~~ slim +body + h1#headline + = page_headline + h2#tagline.small.tagline + = page_tagline + .content + = show_content +~~~ + +This is the same as + +~~~ slim +body + h1 id="headline" + = page_headline + h2 id="tagline" class="small tagline" + = page_tagline + div class="content" + = show_content +~~~ + +## Helpers, capturing and includes + +If you use Slim you might want to extend your template with some helpers. Assume that you have the following helper + +~~~ruby +module Helpers + def headline(&block) + if defined?(::Rails) + # In Rails we have to use capture! + "<h1>#{capture(&block)}</h1>" + else + # If we are using Slim without a framework (Plain Tilt), + # this works directly. + "<h1>#{yield}</h1>" + end + end +end +~~~ + +which is included in the scope that executes the Slim template code. The helper can then be used in the Slim template as follows + +~~~ slim +p + = headline do + ' Hello + = user.name +~~~ + +The content in the `do` block is then captured automatically and passed to the helper via `yield`. As a syntactic +sugar you can omit the `do` keyword and write only + +~~~ slim +p + = headline + ' Hello + = user.name +~~~ + +### Capturing to local variables + +Using the `Binding` you can capture to local variables as follows: + +~~~ruby +module Helpers + def capture_to_local(var, &block) + set_var = block.binding.eval("lambda {|x| #{var} = x }") + # In Rails we have to use capture! + # If we are using Slim without a framework (Plain Tilt), + # you can just yield to get the captured block. + set_var.call(defined?(::Rails) ? capture(&block) : yield) + end +end +~~~ + +The helper can then be used in the Slim template as follows + +~~~ slim +/ The captured_content variable must be known by the Binding beforehand. += capture_to_local captured_content=:captured_content + p This will be captured in the variable captured_content += captured_content +~~~ + +Another interesting use case is to use an enumerable and capture for each element. The helper could look like this + +~~~ ruby +module Capture + def capture(var, enumerable = nil, &block) + value = enumerable ? enumerable.map(&block) : yield + block.binding.eval("lambda {|x| #{var} = x }").call(value) + nil + end +end +~~~ + +and it would be used as follows + +~~~ slim +- links = { 'https://slim-template.github.io' => 'The Slim Template Language' } += capture link_list=:link_list, links do |url, text| + a href=url = text +~~~ + +Afterwards, `link_list` contains the captured content. + +### Include helper + +If you want includes which are processed at compile time, you can take a look at [Include partials](doc/include.md). +However you can also execute subtemplates at runtime (similar to Rails' `#render`). You have to write your own include helper: + +~~~ ruby +module Helpers + def include_slim(name, options = {}, &block) + Slim::Template.new("#{name}.slim", options).render(self, &block) + end +end +~~~ + +This helper can then be used as follows + +~~~ slim +nav = include_slim 'menu' +section = include_slim 'content' +~~~ + +However this helper doesn't do any caching. You should therefore implement a more intelligent version of the helper which +fits your purposes. You should also be aware that most frameworks already bring their own include helper, e.g. Rails has `render`. + +## Text interpolation + +Use standard Ruby interpolation. The text will be html escaped by default, but you can avoid escaping by using double braces. + +~~~ slim +body + h1 Welcome #{current_user.name} to the show. + | Unescaped #{{content}} is also possible. +~~~ + +To escape the interpolation (i.e. render as is) + +~~~ slim +body + h1 Welcome \#{current_user.name} to the show. +~~~ + +## Embedded engines (Markdown, ...) + +Thanks to [Tilt](https://github.com/jeremyevans/tilt), Slim has extensive support for embedding other template engines. + +Examples: + +~~~ slim +coffee: + square = (x) -> x * x + +markdown: + #Header + Hello from #{"Markdown!"} + Second Line! + +p: markdown: Tag with **inline** markdown! +~~~ + +Supported engines: + +| Filter | Required gems | Type | Description | +| ------ | ------------- | ---- | ----------- | +| ruby: | none | Shortcut | Shortcut to embed ruby code | +| javascript: | none | Shortcut | Shortcut to embed javascript code and wrap in script tag | +| css: | none | Shortcut | Shortcut to embed css code and wrap in style tag | +| sass: | sass-embedded or sassc or sass | Compile time | Embed sass code and wrap in style tag | +| scss: | sass-embedded or sassc or sass | Compile time | Embed scss code and wrap in style tag | +| less: | less | Compile time | Embed less css code and wrap in style tag | +| coffee: | coffee-script | Compile time | Compile coffee script code and wrap in script tag | +| markdown: | redcarpet/rdiscount/kramdown | Compile time + Interpolation | Compile markdown code and interpolate #\{variables} in text | +| textile: | redcloth | Compile time + Interpolation | Compile textile code and interpolate #\{variables} in text | +| rdoc: | rdoc | Compile time + Interpolation | Compile rdoc code and interpolate #\{variables} in text | + +The embedded engines can be configured in Slim by setting the options directly on the `Slim::Embedded` filter. Example: + +~~~ ruby +Slim::Embedded.options[:markdown] = {auto_ids: false} +~~~ + +You can also specify HTML attributes for the following embedded engines: +* Javascript +* CSS +* CoffeeScript +* LESS +* SASS +* SCSS + +Example: + +~~~ scss +scss class="myClass": + $color: #f00; + body { color: $color; } +~~~ + +This will generate the following HTML: + +~~~ html +<style class="myClass" type="text/css">body{color:red}</style> +~~~ + +## Configuring Slim + +Slim and the underlying [Temple](https://github.com/judofyr/temple) framework are highly configurable. +The way how you configure Slim depends a bit on the compilation mechanism (Rails or [Tilt](https://github.com/rtomayko/tilt)). It is always possible to set default options per `Slim::Engine` class. This can be done in Rails' environment files. For instance, in config/environments/development.rb you probably want: + +### Default options + +~~~ ruby +# Indent html for pretty debugging and do not sort attributes +Slim::Engine.set_options pretty: true, sort_attrs: false +~~~ + +You can also access the option hash directly: + +~~~ ruby +Slim::Engine.options[:pretty] = true +~~~ + +### Setting options at runtime + +There are two ways to set options at runtime. For Tilt templates (`Slim::Template`) you can set +the options when you instantiate the template: + +~~~ ruby +Slim::Template.new('template.slim', optional_option_hash).render(scope) +~~~ + +The other possibility is to set the options per thread which is interesting mostly for Rails: + +~~~ ruby +Slim::Engine.with_options(option_hash) do + # Any Slim engines which are created here use the option_hash + # For example in Rails: + render :page, layout: true +end +~~~ + +You have to be aware that the compiled engine code and the options are cached per template in Rails and you cannot change the option afterwards. + +~~~ ruby +# First render call +Slim::Engine.with_options(pretty: true) do + render :page, layout: true +end + +# Second render call +Slim::Engine.with_options(pretty: false) do + render :page, layout: true # :pretty is still true because it is cached +end +~~~ + +### Available options + +The following options are exposed by the `Slim::Engine` and can be set with `Slim::Engine.set_options`. +There are a lot of them but the good thing is, that Slim checks the configuration keys and reports an error if you try to use an invalid configuration key. + + +| Type | Name | Default | Purpose | +| ---- | ---- | ------- | ------- | +| String | :file | nil | Name of parsed file, set automatically by Slim::Template | +| Integer | :tabsize | 4 | Number of white spaces per tab (used by the parser) | +| String | :encoding | "utf-8" | Set encoding of template | +| String | :default_tag | "div" | Default tag to be used if tag name is omitted | +| Hash | :shortcut | \{'.' => {attr: 'class'}, '#' => {attr: 'id'}} | Attribute shortcuts | +| Hash | :code_attr_delims | \{'(' => ')', '[' => ']', '{' => '}'} | Attribute delimiters for Ruby code attributes | +| Hash | :attr_list_delims | \{'(' => ')', '[' => ']', '{' => '}'} | Attribute list delimiter | +| Array<Symbol,String> | :enable_engines | nil <i>(All enabled)</i> | List of enabled embedded engines (whitelist) | +| Array<Symbol,String> | :disable_engines | nil <i>(None disabled)</i> | List of disabled embedded engines (blacklist) | +| Boolean | :disable_capture | false (true in Rails) | Disable capturing in blocks (blocks write to the default buffer | +| Boolean | :disable_escape | false | Disable automatic escaping of strings | +| Boolean | :use_html_safe | false (true in Rails) | Use String#html_safe? from ActiveSupport (Works together with :disable_escape) | +| Symbol | :format | :xhtml | HTML output format (Possible formats :html, :xhtml, :xml) | +| String | :attr_quote | '"' | Character to wrap attributes in html (can be ' or ") | +| Hash | :merge_attrs | \{'class' => ' '} | Joining character used if multiple html attributes are supplied (e.g. class="class1 class2") | +| Array<String> | :hyphen_attrs | %w(data) | Attributes which will be hyphenated if a Hash is given (e.g. data={a_foo:1,b:2} will render as data-a_foo="1" data-b="2") | +| Boolean | :hyphen_underscore_attrs | false | Attributes that have underscores in their names will be hyphenated (e.g. data={a_foo:1,b_bar:2} will render as data-a-foo="1" data-b-bar="2") | +| Boolean | :sort_attrs | true | Sort attributes by name | +| Symbol | :js_wrapper | nil | Wrap javascript by :comment, :cdata or :both. You can also :guess the wrapper based on :format. | +| Boolean | :pretty | false | Pretty HTML indenting, only block level tags are indented <b>(This is slower!)</b> | +| String | :indent | ' ' | Indentation string | +| Boolean | :streaming | false (true in Rails, see below how to disable it!) | Enable output streaming, improves the perceived performance | +| Class | :generator | Temple::Generators::StringBuffer/ RailsOutputBuffer | Temple code generator (default generator generates string buffer) | +| String | :buffer | '_buf' ('@output_buffer' in Rails) | Variable used for buffer | +| String | :splat_prefix | '*' | Prefix used for splat attributes | + +There are more options which are supported by the Temple filters but which are not exposed and are not officially supported. You +have to take a look at the Slim and Temple code for that. + +### Option priority and inheritance + +For developers who know more about Slim and Temple architecture it is possible to override default +options at different positions. Temple uses an inheritance mechanism to allow subclasses to override +options of the superclass. The option priorities are as follows: + +1. `Slim::Template` options passed at engine instantiation +2. `Slim::Template.options` +3. `Slim::Engine.thread_options`, `Slim::Engine.options` +5. Parser/Filter/Generator `thread_options`, `options` (e.g `Slim::Parser`, `Slim::Compiler`) + +It is also possible to set options for superclasses like `Temple::Engine`. But this will affect all temple template engines then. + +~~~ ruby +Slim::Engine < Temple::Engine +Slim::Compiler < Temple::Filter +~~~ + +## Plugins + +Slim currently provides plugins for logic less mode, includes and I18n. See the plugin documentation. + +* [Logic less mode](doc/logic_less.md) +* [Include partials](doc/include.md) +* [Translator/I18n](doc/translator.md) +* [Smart text mode](doc/smart.md) + +## Framework support + +### Tilt + +Slim uses [Tilt](https://github.com/jeremyevans/tilt) to compile the generated code. If you want to use the Slim template directly, you can use the Tilt interface. + +~~~ ruby +Tilt.new['template.slim'].render(scope) +Slim::Template.new('template.slim', optional_option_hash).render(scope) +Slim::Template.new(optional_option_hash) { source }.render(scope) +~~~ + +The optional option hash can have to options which were documented in the section above. The scope is the object in which the template +code is executed. + +### Sinatra + +~~~ ruby +require 'sinatra' +require 'slim' + +get('/') { slim :index } + + __END__ +@@ index +doctype html +html + head + title Sinatra With Slim + body + h1 Slim Is Fun! +~~~ + +### Rails + +Rails generators are provided by [slim-rails](https://github.com/slim-template/slim-rails). slim-rails +is not necessary to use Slim in Rails though. Just install Slim and add it to your Gemfile with `gem 'slim'`. +Then just use the .slim extension and you're good to go. + +#### Streaming + +HTTP streaming is enabled by default if you use a Rails version which supports it. However you have to be aware that streaming only improves the perceived +performance. The rendering time in total will increase. If you want to disable it use: + +~~~ ruby +Slim::RailsTemplate.set_options streaming: false +~~~ + +### Angular2 + +Slim now supports Angular2 syntax. But you need to set some configuration options: + +#### `splat_prefix` option + +This option tells parser what syntax to use for splat attributes. +Default value is asterisk: `splat_prefix: '*'` +Asterisk is also used in Angular2 for structural directives such as `*ngIf` and others, so default configuration causes a conflict between slim and angular2 syntax. + +There are two ways to resolve it: + +* Set `splat_prefix` to any custom value, double asterisk, for example: `splat_prefix: '**'`. Now structural directives should work as expected. Remember that now splat attributes should be written with new custom prefix before them. +* Use alternative directive syntax without asterisk. + +#### Attribute delimeters + +Angular and slim both uses brackets in their syntax. So there are also two ways: +* Use alternative syntax for binding (`bind-...` and so on) +* Limit attribute delimeters to curly braces only: +``` +code_attr_delims: { + '{' => '}', +}, +attr_list_delims: { + '{' => '}', +}, +``` + +Now you can use something like this: +``` +h1{ #var (bind1)="test" [bind2]="ok" [(bind3)]="works?" *ngIf="expr" *ngFor="expression" } {{it works}} +``` + +Will be compiled to: +``` +<h1 #var="" (bind1)="test" [bind2]="ok" [(bind3)]="works?" *ngIf="expr" *ngFor="expression"> + {{it works}} +</h1> +``` + +## Tools + +### Slim Command 'slimrb' + +The gem 'slim' comes with the small tool 'slimrb' to test Slim from the command line. + +<pre> +$ slimrb --help +Usage: slimrb [options] + -s, --stdin Read input from standard input instead of an input file + --trace Show a full traceback on error + -c, --compile Compile only but do not run + -e, --erb Convert to ERB + --rails Generate rails compatible code (Implies --compile) + -r, --require library Load library or plugin with -r slim/plugin + -p, --pretty Produce pretty html for debugging purposes + -o, --option name=code Set slim option + -l, --locals Hash|YAML|JSON Set local variables + -h, --help Show this message + -v, --version Print version +</pre> + +Start 'slimrb', type your code and press Ctrl-d to send EOF. In Windows Command Prompt press Ctrl-z, Enter to send EOF. Example usage: + +<pre> +$ slimrb +markdown: + First paragraph. + + Second paragraph. + + * one + * two + * three + +//Enter Ctrl-d +<p>First paragraph </p> + +<p>Second paragraph </p> + +<ul> +<li>one</li> +<li>two</li> +<li>three</li> +</ul> +</pre> + +### Syntax Highlighters + +There are plugins for various text editors (including the most important ones - Vim, Emacs and Textmate): + +* [Vim](https://github.com/slim-template/vim-slim) +* [Emacs](https://github.com/slim-template/emacs-slim) +* [Textmate / Sublime Text](https://github.com/slim-template/ruby-slim.tmbundle) +* [Espresso text editor](https://github.com/slim-template/Slim-Sugar) +* [Coda](https://github.com/slim-template/Coda-2-Slim.mode) +* [Atom](https://github.com/slim-template/language-slim) +* VS Code ([Official marketplace](https://marketplace.visualstudio.com/items?itemName=sianglim.slim), [Open VSX registry](https://open-vsx.org/extension/sianglim/slim)) + +### Template Converters (HAML, ERB, ...) + +* Slim can be converted to ERB using `slimrb` or `Slim::ERBConverter' which are both included in the Slim gem +* [Haml2Slim converter](https://github.com/slim-template/haml2slim) +* [ERB2Slim, HTML2Slim converter](https://github.com/slim-template/html2slim) + +## Testing + +### Benchmarks + + *Yes, Slim is one of the fastest Ruby template engines out there! + In production mode Slim is nearly as fast as Erubis (which is the fastest template engine). + But we would be happy if you chose Slim also for any other reason, we assure + you performance will not be an obstacle.* + +Run the benchmarks with `rake bench`. You can add the option `slow` to +run the slow parsing benchmark which needs more time. You can also increase the number of iterations. + +~~~ +$ rake bench slow=1 iterations=1000 +~~~ + +### Test suite and continuous integration + +Slim provides an extensive test-suite based on minitest. You can run the tests +with 'rake test' and the rails integration tests with 'rake test:rails'. + +We are currently experimenting with human-readable literate tests which are written as markdown files: [TESTS.md](test/literate/TESTS.md) + +Slim is working well on all major Ruby implementations: + +* Ruby 2.5 and newer +* JRuby + +## Contributing + +If you'd like to help improve Slim, clone the project with Git by running: + +~~~ +$ git clone git://github.com/slim-template/slim +~~~ + +Work your magic and then submit a pull request. We love pull requests! + +Please remember to keep the compatibility with Ruby versions 2.5 and newer. + +If you find the documentation lacking, help us out and update this README.md. If you don't have the time to work on Slim, but found something we should know about, please submit an issue. + +## License + +Slim is released under the [MIT license](http://www.opensource.org/licenses/MIT). + +## Authors + +* [Daniel Mendler](https://github.com/minad) (Lead developer) +* [Andrew Stone](https://github.com/stonean) +* [Fred Wu](https://github.com/fredwu) + +## Donations and sponsoring + +If you want to support this project please visit the GitHub sponsors page. + +[![GitHub Sponsors](https://img.shields.io/github/sponsors/slim-template)](https://github.com/sponsors/slim-template) + +## Related projects + +Template compilation framework: + +* [Temple](https://github.com/judofyr/temple) + +Framework support: + +* [Rails generators (slim-rails)](https://github.com/slim-template/slim-rails) + * [slimkeyfy - Translation string extraction](https://github.com/phrase/slimkeyfy) + +Syntax highlighting: + +* [Vim](https://github.com/slim-template/vim-slim) +* [Emacs](https://github.com/slim-template/emacs-slim) +* [Textmate / Sublime Text](https://github.com/slim-template/ruby-slim.tmbundle) +* [Espresso text editor](https://github.com/slim-template/Slim-Sugar) +* [Coda](https://github.com/slim-template/Coda-2-Slim.mode) +* [Atom](https://github.com/slim-template/language-slim) + +Static code analysis: + +* [Slim-Lint](https://github.com/sds/slim-lint) +* [SublimeLinter-slim-lint](https://github.com/elstgav/SublimeLinter-slim-lint) + +Template Converters (HAML, ERB, ...): + +* [ERB 2 Slim](http://erb2slim.com/) +* [Haml2Slim converter](https://github.com/slim-template/haml2slim) +* [ERB2Slim, HTML2Slim converter](https://github.com/slim-template/html2slim) + +Language ports/Similar languages: + +* [Sliq (Slim/Liquid integration)](https://github.com/slim-template/sliq) +* [Slm (Slim port to Javascript)](https://github.com/slm-lang/slm) +* [Coffee script plugin for Slim](https://github.com/yury/coffee-views) +* [Clojure port of Slim](https://github.com/chaslemley/slim.clj) +* [Hamlet.rb (Similar template language)](https://github.com/gregwebs/hamlet.rb) +* [Plim (Python port of Slim)](https://github.com/2nd/plim) +* [Skim (Slim for Javascript)](https://github.com/jfirebaugh/skim) +* [Emblem.js (Javascript, similar to Slim)](https://github.com/machty/emblem.js) +* [Hamlit (High performance Haml implementation, based on Temple like Slim)](https://github.com/k0kubun/hamlit) +* [Faml (Faster Haml implementation, also using Temple like Slim)](https://github.com/eagletmt/faml) +* [Haml (Older engine which inspired Slim)](https://github.com/haml/haml) +* [Pug (Similar engine for javascript)](https://github.com/pugjs/pug) +* [Sweet (Similar engine which also allows to write classes and functions)](https://github.com/joaomdmoura/sweet) +* [Amber (Similar engine for Go)](https://github.com/eknkc/amber) +* [Slang (Slim-inspired templating language for Crystal)](https://github.com/jeromegn/slang) diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim.rb new file mode 100644 index 000000000..17bd2bae1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +require 'temple' +require 'slim/parser' +require 'slim/filter' +require 'slim/do_inserter' +require 'slim/end_inserter' +require 'slim/embedded' +require 'slim/interpolation' +require 'slim/controls' +require 'slim/splat/filter' +require 'slim/splat/builder' +require 'slim/code_attributes' +require 'slim/engine' +require 'slim/template' +require 'slim/version' +require 'slim/railtie' if defined?(Rails::Railtie) diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/code_attributes.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/code_attributes.rb new file mode 100644 index 000000000..a7328e07b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/code_attributes.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true +module Slim + # @api private + class CodeAttributes < Filter + define_options :merge_attrs + + # Handle attributes expression `[:html, :attrs, *attrs]` + # + # @param [Array] attrs Array of temple expressions + # @return [Array] Compiled temple expression + def on_html_attrs(*attrs) + [:multi, *attrs.map { |a| compile(a) }] + end + + # Handle attribute expression `[:html, :attr, name, value]` + # + # @param [String] name Attribute name + # @param [Array] value Value expression + # @return [Array] Compiled temple expression + def on_html_attr(name, value) + if value[0] == :slim && value[1] == :attrvalue && !options[:merge_attrs][name] + # We handle the attribute as a boolean attribute + escape, code = value[2], value[3] + case code + when 'true' + [:html, :attr, name, [:multi]] + when 'false', 'nil' + [:multi] + else + tmp = unique_name + [:multi, + [:code, "#{tmp} = #{code}"], + [:if, tmp, + [:if, "#{tmp} == true", + [:html, :attr, name, [:multi]], + [:html, :attr, name, [:escape, escape, [:dynamic, tmp]]]]]] + end + else + # Attribute with merging + @attr = name + super + end + end + + # Handle attribute expression `[:slim, :attrvalue, escape, code]` + # + # @param [Boolean] escape Escape html + # @param [String] code Ruby code + # @return [Array] Compiled temple expression + def on_slim_attrvalue(escape, code) + # We perform attribute merging on Array values + if delimiter = options[:merge_attrs][@attr] + tmp = unique_name + [:multi, + [:code, "#{tmp} = #{code}"], + [:if, "Array === #{tmp}", + [:multi, + [:code, "#{tmp} = #{tmp}.flatten"], + [:code, "#{tmp}.map!(&:to_s)"], + [:code, "#{tmp}.reject!(&:empty?)"], + [:escape, escape, [:dynamic, "#{tmp}.join(#{delimiter.inspect})"]]], + [:escape, escape, [:dynamic, tmp]]]] + else + [:escape, escape, [:dynamic, code]] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/command.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/command.rb new file mode 100644 index 000000000..8690984a2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/command.rb @@ -0,0 +1,122 @@ +# frozen_string_literal: true +require 'slim' +require 'optparse' + +module Slim + Engine.set_options pretty: false + + # Slim commandline interface + # @api private + class Command + def initialize(args) + @args = args + @options = {} + end + + # Run command + def run + @opts = OptionParser.new(&method(:set_opts)) + @opts.parse!(@args) + process + end + + private + + # Configure OptionParser + def set_opts(opts) + opts.on('-s', '--stdin', 'Read input from standard input instead of an input file') do + @options[:input] = $stdin + end + + opts.on('--trace', 'Show a full traceback on error') do + @options[:trace] = true + end + + opts.on('-c', '--compile', 'Compile only but do not run') do + @options[:compile] = true + end + + opts.on('-e', '--erb', 'Convert to ERB') do + @options[:erb] = true + end + + opts.on('--rails', 'Generate rails compatible code (Implies --compile)') do + Engine.set_options disable_capture: true, generator: Temple::Generators::RailsOutputBuffer + @options[:compile] = true + end + + opts.on('-r', '--require library', 'Load library or plugin with -r slim/plugin') do |lib| + require lib.strip + end + + opts.on('-p', '--pretty', 'Produce pretty html') do + Engine.set_options pretty: true + end + + opts.on('-o', '--option name=code', String, 'Set slim option') do |str| + parts = str.split('=', 2) + Engine.options[parts.first.gsub(/\A:/, '').to_sym] = eval(parts.last) + end + + opts.on('-l', '--locals Hash|YAML|JSON', String, 'Set local variables') do |locals| + @options[:locals] = + if locals =~ /\A\s*\{\s*\p{Word}+:/ + eval(locals) + else + require 'yaml' + YAML.load(locals) + end + end + + opts.on_tail('-h', '--help', 'Show this message') do + puts opts + exit + end + + opts.on_tail('-v', '--version', 'Print version') do + puts "Slim #{VERSION}" + exit + end + end + + # Process command + def process + args = @args.dup + unless @options[:input] + file = args.shift + if file + @options[:file] = file + @options[:input] = File.open(file, 'r') + else + @options[:file] = 'STDIN' + @options[:input] = $stdin + end + end + + locals = @options.delete(:locals) || {} + result = + if @options[:erb] + require 'slim/erb_converter' + ERBConverter.new(file: @options[:file]).call(@options[:input].read) + elsif @options[:compile] + Engine.new(file: @options[:file]).call(@options[:input].read) + else + Template.new(@options[:file]) { @options[:input].read }.render(nil, locals) + end + + rescue Exception => ex + raise ex if @options[:trace] || SystemExit === ex + $stderr.print "#{ex.class}: " if ex.class != RuntimeError + $stderr.puts ex.message + $stderr.puts ' Use --trace for backtrace.' + exit 1 + else + unless @options[:output] + file = args.shift + @options[:output] = file ? File.open(file, 'w') : $stdout + end + @options[:output].puts(result) + exit 0 + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/controls.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/controls.rb new file mode 100644 index 000000000..1386a4c68 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/controls.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true +module Slim + # @api private + class Controls < Filter + define_options :disable_capture + + IF_RE = /\A(if|unless)\b|\bdo\s*(\|[^\|]*\|)?\s*$/ + + # Handle control expression `[:slim, :control, code, content]` + # + # @param [String] code Ruby code + # @param [Array] content Temple expression + # @return [Array] Compiled temple expression + def on_slim_control(code, content) + [:multi, + [:code, code], + compile(content)] + end + + # Handle output expression `[:slim, :output, escape, code, content]` + # + # @param [Boolean] escape Escape html + # @param [String] code Ruby code + # @param [Array] content Temple expression + # @return [Array] Compiled temple expression + def on_slim_output(escape, code, content) + if code =~ IF_RE + tmp = unique_name + + [:multi, + # Capture the result of the code in a variable. We can't do + # `[:dynamic, code]` because it's probably not a complete + # expression (which is a requirement for Temple). + [:block, "#{tmp} = #{code}", + + # Capture the content of a block in a separate buffer. This means + # that `yield` will not output the content to the current buffer, + # but rather return the output. + # + # The capturing can be disabled with the option :disable_capture. + # Output code in the block writes directly to the output buffer then. + # Rails handles this by replacing the output buffer for helpers. + options[:disable_capture] ? compile(content) : [:capture, unique_name, compile(content)]], + + # Output the content. + [:escape, escape, [:dynamic, tmp]]] + else + [:multi, [:escape, escape, [:dynamic, code]], content] + end + end + + # Handle text expression `[:slim, :text, type, content]` + # + # @param [Symbol] type Text type + # @param [Array] content Temple expression + # @return [Array] Compiled temple expression + def on_slim_text(type, content) + compile(content) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/do_inserter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/do_inserter.rb new file mode 100644 index 000000000..02768d2fb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/do_inserter.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true +module Slim + # In Slim you don't need the do keyword sometimes. This + # filter adds the missing keyword. + # + # - 10.times + # | Hello + # + # @api private + class DoInserter < Filter + BLOCK_REGEX = /(\A(if|unless|else|elsif|when|in|begin|rescue|ensure|case)\b)|\bdo\s*(\|[^\|]*\|\s*)?\Z/ + + # Handle control expression `[:slim, :control, code, content]` + # + # @param [String] code Ruby code + # @param [Array] content Temple expression + # @return [Array] Compiled temple expression + def on_slim_control(code, content) + code += ' do' unless code =~ BLOCK_REGEX || empty_exp?(content) + [:slim, :control, code, compile(content)] + end + + # Handle output expression `[:slim, :output, escape, code, content]` + # + # @param [Boolean] escape Escape html + # @param [String] code Ruby code + # @param [Array] content Temple expression + # @return [Array] Compiled temple expression + def on_slim_output(escape, code, content) + code += ' do' unless code =~ BLOCK_REGEX || empty_exp?(content) + [:slim, :output, escape, code, compile(content)] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/embedded.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/embedded.rb new file mode 100644 index 000000000..a6af61436 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/embedded.rb @@ -0,0 +1,248 @@ +# frozen_string_literal: true +module Slim + # @api private + class TextCollector < Filter + def call(exp) + @collected = ''.dup + super(exp) + @collected + end + + def on_slim_interpolate(text) + @collected << text + nil + end + end + + # @api private + class NewlineCollector < Filter + def call(exp) + @collected = [:multi] + super(exp) + @collected + end + + def on_newline + @collected << [:newline] + nil + end + end + + # @api private + class OutputProtector < Filter + def call(exp) + @protect, @collected, @tag = [], ''.dup, object_id.abs.to_s(36) + super(exp) + @collected + end + + def on_static(text) + @collected << text + nil + end + + def on_slim_output(escape, text, content) + @collected << "%#{@tag}%#{@protect.length}%" + @protect << [:slim, :output, escape, text, content] + nil + end + + def unprotect(text) + block = [:multi] + while text =~ /%#{@tag}%(\d+)%/ + block << [:static, $`] + block << @protect[$1.to_i] + text = $' + end + block << [:static, text] + end + end + + # Temple filter which processes embedded engines + # @api private + class Embedded < Filter + @engines = {} + + class << self + attr_reader :engines + + # Register embedded engine + # + # @param [String] name Name of the engine + # @param [Class] klass Engine class + # @param option_filter List of options to pass to engine. + # Last argument can be default option hash. + def register(name, klass, *option_filter) + name = name.to_sym + local_options = option_filter.last.respond_to?(:to_hash) ? option_filter.pop.to_hash : {} + define_options(name, *option_filter) + klass.define_options(name) + engines[name.to_sym] = proc do |options| + klass.new({}.update(options).delete_if {|k,v| !option_filter.include?(k) && k != name }.update(local_options)) + end + end + + def create(name, options) + constructor = engines[name] || raise(Temple::FilterError, "Embedded engine #{name} not found") + constructor.call(options) + end + end + + define_options :enable_engines, :disable_engines + + def initialize(opts = {}) + super + @engines = {} + @enabled = normalize_engine_list(options[:enable_engines]) + @disabled = normalize_engine_list(options[:disable_engines]) + end + + def on_slim_embedded(name, body, attrs) + name = name.to_sym + raise(Temple::FilterError, "Embedded engine #{name} is disabled") unless enabled?(name) + @engines[name] ||= self.class.create(name, options) + @engines[name].on_slim_embedded(name, body, attrs) + end + + def enabled?(name) + (!@enabled || @enabled.include?(name)) && + (!@disabled || !@disabled.include?(name)) + end + + protected + + def normalize_engine_list(list) + raise(ArgumentError, "Option :enable_engines/:disable_engines must be String or Symbol list") unless !list || Array === list + list && list.map(&:to_sym) + end + + class Engine < Filter + protected + + def collect_text(body) + @text_collector ||= TextCollector.new + @text_collector.call(body) + end + + def collect_newlines(body) + @newline_collector ||= NewlineCollector.new + @newline_collector.call(body) + end + end + + # Basic tilt engine + class TiltEngine < Engine + def on_slim_embedded(engine, body, attrs) + tilt_engine = Tilt[engine] || raise(Temple::FilterError, "Tilt engine #{engine} is not available.") + tilt_options = options[engine.to_sym] || {} + tilt_options[:default_encoding] ||= 'utf-8' + [:multi, tilt_render(tilt_engine, tilt_options, collect_text(body)), collect_newlines(body)] + end + + protected + + def tilt_render(tilt_engine, tilt_options, text) + [:static, tilt_engine.new(tilt_options) { text }.render] + end + end + + # Sass engine which supports :pretty option + class SassEngine < TiltEngine + define_options :pretty + + protected + + def tilt_render(tilt_engine, tilt_options, text) + text = tilt_engine.new(tilt_options.merge( + style: options[:pretty] ? :expanded : :compressed + )) { text }.render + text = text.chomp + [:static, text] + end + end + + # Static template with interpolated ruby code + class InterpolateTiltEngine < TiltEngine + def collect_text(body) + output_protector.call(interpolation.call(body)) + end + + def tilt_render(tilt_engine, tilt_options, text) + output_protector.unprotect(tilt_engine.new(tilt_options) { text }.render) + end + + private + + def interpolation + @interpolation ||= Interpolation.new + end + + def output_protector + @output_protector ||= OutputProtector.new + end + end + + # Tag wrapper engine + # Generates a html tag and wraps another engine (specified via :engine option) + class TagEngine < Engine + disable_option_validator! + set_options attributes: {} + + def on_slim_embedded(engine, body, attrs) + unless options[:attributes].empty? + options[:attributes].map do |k, v| + attrs << [:html, :attr, k, [:static, v]] + end + end + + if options[:engine] + opts = {}.update(options) + opts.delete(:engine) + opts.delete(:tag) + opts.delete(:attributes) + @engine ||= options[:engine].new(opts) + body = @engine.on_slim_embedded(engine, body, attrs) + end + + [:html, :tag, options[:tag], attrs, body] + end + end + + # Javascript wrapper engine. + # Like TagEngine, but can wrap content in html comment or cdata. + class JavaScriptEngine < TagEngine + disable_option_validator! + + set_options tag: :script + + def on_slim_embedded(engine, body, attrs) + super(engine, [:html, :js, body], attrs) + end + end + + # Embeds ruby code + class RubyEngine < Engine + def on_slim_embedded(engine, body, attrs) + [:multi, [:newline], [:code, "#{collect_text(body)}\n"]] + end + end + + # These engines are executed at compile time, embedded ruby is interpolated + register :markdown, InterpolateTiltEngine + register :textile, InterpolateTiltEngine + register :rdoc, InterpolateTiltEngine + + # These engines are executed at compile time + register :coffee, JavaScriptEngine, engine: TiltEngine + register :less, TagEngine, tag: :style, engine: TiltEngine + register :sass, TagEngine, :pretty, tag: :style, engine: SassEngine + register :scss, TagEngine, :pretty, tag: :style, engine: SassEngine + + # Embedded javascript/css + register :javascript, JavaScriptEngine + register :css, TagEngine, tag: :style + + # Embedded ruby code + register :ruby, RubyEngine + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/end_inserter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/end_inserter.rb new file mode 100644 index 000000000..e6de7cbd4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/end_inserter.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true +module Slim + # In Slim you don't need to close any blocks: + # + # - if Slim.awesome? + # | But of course it is! + # + # However, the parser is not smart enough (and that's a good thing) to + # automatically insert end's where they are needed. Luckily, this filter + # does *exactly* that (and it does it well!) + # + # @api private + class EndInserter < Filter + IF_RE = /\A(if|begin|unless|else|elsif|when|in|rescue|ensure)\b|\bdo\s*(\|[^\|]*\|)?\s*$/ + ELSE_RE = /\A(else|elsif|when|in|rescue|ensure)\b/ + END_RE = /\Aend\b/ + + # Handle multi expression `[:multi, *exps]` + # + # @return [Array] Corrected Temple expression with ends inserted + def on_multi(*exps) + result = [:multi] + # This variable is true if the previous line was + # (1) a control code and (2) contained indented content. + prev_indent = false + + exps.each do |exp| + if control?(exp) + raise(Temple::FilterError, 'Explicit end statements are forbidden') if exp[2] =~ END_RE + + # Two control code in a row. If this one is *not* + # an else block, we should close the previous one. + append_end(result) if prev_indent && exp[2] !~ ELSE_RE + + # Indent if the control code starts a block. + prev_indent = exp[2] =~ IF_RE + elsif exp[0] != :newline && prev_indent + # This is *not* a control code, so we should close the previous one. + # Ignores newlines because they will be inserted after each line. + append_end(result) + prev_indent = false + end + + result << compile(exp) + end + + # The last line can be a control code too. + prev_indent ? append_end(result) : result + end + + private + + # Appends an end + def append_end(result) + result << [:code, 'end'] + end + + # Checks if an expression is a Slim control code + def control?(exp) + exp[0] == :slim && exp[1] == :control + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/engine.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/engine.rb new file mode 100644 index 000000000..c96d70974 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/engine.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true +# The Slim module contains all Slim related classes (e.g. Engine, Parser). +# Plugins might also reside within the Slim module (e.g. Include, Smart). +# @api public +module Slim + # Slim engine which transforms slim code to executable ruby code + # @api public + class Engine < Temple::Engine + # This overwrites some Temple default options or sets default options for Slim specific filters. + # It is recommended to set the default settings only once in the code and avoid duplication. Only use + # `define_options` when you have to override some default settings. + define_options pretty: false, + sort_attrs: true, + format: :xhtml, + attr_quote: '"', + merge_attrs: {'class' => ' '}, + generator: Temple::Generators::StringBuffer, + default_tag: 'div' + + filter :Encoding + filter :RemoveBOM + use Slim::Parser + use Slim::Embedded + use Slim::Interpolation + use Slim::Splat::Filter + use Slim::DoInserter + use Slim::EndInserter + use Slim::Controls + html :AttributeSorter + html :AttributeMerger + use Slim::CodeAttributes + use(:AttributeRemover) { Temple::HTML::AttributeRemover.new(remove_empty_attrs: options[:merge_attrs].keys) } + html :Pretty + filter :Ambles + filter :Escapable + filter :StaticAnalyzer + filter :ControlFlow + filter :MultiFlattener + filter :StaticMerger + use(:Generator) { options[:generator] } + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/erb_converter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/erb_converter.rb new file mode 100644 index 000000000..75fe9b418 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/erb_converter.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +require 'slim' + +module Slim + # Slim to ERB converter + # + # @example Conversion + # Slim::ERBConverter.new(options).call(slim_code) # outputs erb_code + # + # @api public + class ERBConverter < Engine + replace :StaticMerger, Temple::Filters::CodeMerger + replace :Generator, Temple::Generators::ERB + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/filter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/filter.rb new file mode 100644 index 000000000..7dee8ecc1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/filter.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +module Slim + # Base class for Temple filters used in Slim + # + # This base filter passes everything through and allows + # to override only some methods without affecting the rest + # of the expression. + # + # @api private + class Filter < Temple::HTML::Filter + # Pass-through handler + def on_slim_text(type, content) + [:slim, :text, type, compile(content)] + end + + # Pass-through handler + def on_slim_embedded(type, content, attrs) + [:slim, :embedded, type, compile(content), attrs] + end + + # Pass-through handler + def on_slim_control(code, content) + [:slim, :control, code, compile(content)] + end + + # Pass-through handler + def on_slim_output(escape, code, content) + [:slim, :output, escape, code, compile(content)] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/grammar.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/grammar.rb new file mode 100644 index 000000000..14b32724f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/grammar.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module Slim + # Slim expression grammar + # @api private + module Grammar + extend Temple::Grammar + + TextTypes << :verbatim | :explicit | :implicit | :inline + + Expression << + [:slim, :control, String, Expression] | + [:slim, :output, Bool, String, Expression] | + [:slim, :interpolate, String] | + [:slim, :embedded, String, Expression, HTMLAttrGroup] | + [:slim, :text, TextTypes, Expression] | + [:slim, :attrvalue, Bool, String] + + HTMLAttr << + [:slim, :splat, String] + + HTMLAttrGroup << + [:html, :attrs, 'HTMLAttr*'] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/include.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/include.rb new file mode 100644 index 000000000..93846e8ca --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/include.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true +require 'slim' + +module Slim + # Handles inlined includes + # + # Slim files are compiled, non-Slim files are included as text with `#{interpolation}` + # + # @api private + class Include < Slim::Filter + define_options :file, include_dirs: [Dir.pwd, '.'] + + def on_html_tag(tag, attributes, content = nil) + return super if tag != 'include' + name = content.to_a.flatten.select {|s| String === s }.join + raise ArgumentError, 'Invalid include statement' unless attributes == [:html, :attrs] && !name.empty? + unless file = find_file(name) + name = "#{name}.slim" if name !~ /\.slim\Z/i + file = find_file(name) + end + raise Temple::FilterError, "'#{name}' not found in #{options[:include_dirs].join(':')}" unless file + content = File.read(file) + if file =~ /\.slim\Z/i + Thread.current[:slim_include_engine].call(content) + else + [:slim, :interpolate, content] + end + end + + protected + + def find_file(name) + current_dir = File.dirname(File.expand_path(options[:file])) + options[:include_dirs].map {|dir| File.expand_path(File.join(dir, name), current_dir) }.find {|file| File.file?(file) } + end + end + + class Engine + after Slim::Parser, Slim::Include + after Slim::Include, :stop do |exp| + throw :stop, exp if Thread.current[:slim_include_level] > 1 + exp + end + + # @api private + alias call_without_include call + + # @api private + def call(input) + Thread.current[:slim_include_engine] = self + Thread.current[:slim_include_level] ||= 0 + Thread.current[:slim_include_level] += 1 + catch(:stop) { call_without_include(input) } + ensure + Thread.current[:slim_include_engine] = nil if (Thread.current[:slim_include_level] -= 1) == 0 + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/interpolation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/interpolation.rb new file mode 100644 index 000000000..ef8d2b8ea --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/interpolation.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true +module Slim + # Perform interpolation of #{var_name} in the + # expressions `[:slim, :interpolate, string]`. + # + # @api private + class Interpolation < Filter + # Handle interpolate expression `[:slim, :interpolate, string]` + # + # @param [String] string Static interpolate + # @return [Array] Compiled temple expression + def on_slim_interpolate(string) + # Interpolate variables in text (#{variable}). + # Split the text into multiple dynamic and static parts. + block = [:multi] + begin + case string + when /\A\\#\{/ + # Escaped interpolation + block << [:static, '#{'] + string = $' + when /\A#\{((?>[^{}]|(\{(?>[^{}]|\g<1>)*\}))*)\}/ + # Interpolation + string, code = $', $1 + escape = code !~ /\A\{.*\}\Z/ + block << [:slim, :output, escape, escape ? code : code[1..-2], [:multi]] + when /\A([#\\]?[^#\\]*([#\\][^\\#\{][^#\\]*)*)/ + # Static text + block << [:static, $&] + string = $' + end + end until string.empty? + block + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less.rb new file mode 100644 index 000000000..9082ca88e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +require 'slim' +require 'slim/logic_less/filter' +require 'slim/logic_less/context' + +Slim::Engine.after Slim::Interpolation, Slim::LogicLess diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less/context.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less/context.rb new file mode 100644 index 000000000..328953693 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less/context.rb @@ -0,0 +1,126 @@ +# frozen_string_literal: true +module Slim + class LogicLess + # @api private + class Context + def initialize(dict, lookup) + @scope = [Scope.new(dict, lookup)] + end + + def [](name) + scope[name] + end + + def lambda(name) + scope.lambda(name) do |*dict| + if dict.empty? + yield + else + new_scope do + dict.inject(''.dup) do |result, d| + scope.dict = d + result << yield + end + end + end + end + end + + def section(name) + if dict = scope[name] + if !dict.respond_to?(:has_key?) && dict.respond_to?(:each) + new_scope do + dict.each do |d| + scope.dict = d + yield + end + end + else + new_scope(dict) { yield } + end + end + end + + def inverted_section(name) + value = scope[name] + yield if !value || (value.respond_to?(:empty?) && value.empty?) + end + + def to_s + scope.to_s + end + + private + + class Scope + attr_reader :lookup + attr_writer :dict + + def initialize(dict, lookup, parent = nil) + @dict, @lookup, @parent = dict, lookup, parent + end + + def lambda(name, &block) + @lookup.each do |lookup| + case lookup + when :method + return @dict.public_send(name, &block) if @dict.respond_to?(name, false) + when :symbol + return @dict[name].call(&block) if has_key?(name) + when :string + return @dict[name.to_s].call(&block) if has_key?(name.to_s) + when :instance_variable + var_name = "@#{name}" + return @dict.instance_variable_get(var_name).call(&block) if instance_variable?(var_name) + end + end + @parent.lambda(name, &block) if @parent + end + + def [](name) + @lookup.each do |lookup| + case lookup + when :method + return @dict.public_send(name) if @dict.respond_to?(name, false) + when :symbol + return @dict[name] if has_key?(name) + when :string + return @dict[name.to_s] if has_key?(name.to_s) + when :instance_variable + var_name = "@#{name}" + return @dict.instance_variable_get(var_name) if instance_variable?(var_name) + end + end + @parent[name] if @parent + end + + def to_s + @dict.to_s + end + + private + + def has_key?(name) + @dict.respond_to?(:has_key?) && @dict.has_key?(name) + end + + def instance_variable?(name) + @dict.instance_variable_defined?(name) + rescue NameError + false + end + end + + def scope + @scope.last + end + + def new_scope(dict = nil) + @scope << Scope.new(dict, scope.lookup, scope) + yield + ensure + @scope.pop + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less/filter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less/filter.rb new file mode 100644 index 000000000..6cfde3eac --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/logic_less/filter.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true +module Slim + # Handle logic less mode + # This filter can be activated with the option "logic_less" + # @api private + class LogicLess < Filter + # Default dictionary access order, change it with the option :dictionary_access + DEFAULT_ACCESS_ORDER = [:symbol, :string, :method, :instance_variable].freeze + + define_options logic_less: true, + dictionary: 'self', + dictionary_access: DEFAULT_ACCESS_ORDER + + def initialize(opts = {}) + super + access = [options[:dictionary_access]].flatten.compact + access.each do |type| + raise ArgumentError, "Invalid dictionary access #{type.inspect}" unless DEFAULT_ACCESS_ORDER.include?(type) + end + raise ArgumentError, 'Option dictionary access is missing' if access.empty? + @access = access.inspect + end + + def call(exp) + if options[:logic_less] + @context = unique_name + [:multi, + [:code, "#{@context} = ::Slim::LogicLess::Context.new(#{options[:dictionary]}, #{@access})"], + super] + else + exp + end + end + + # Interpret control blocks as sections or inverted sections + def on_slim_control(name, content) + method = + if name =~ /\A!\s*(.*)/ + name = $1 + 'inverted_section' + else + 'section' + end + [:block, "#{@context}.#{method}(#{name.to_sym.inspect}) do", compile(content)] + end + + def on_slim_output(escape, name, content) + [:slim, :output, escape, empty_exp?(content) ? access(name) : + "#{@context}.lambda(#{name.to_sym.inspect}) do", compile(content)] + end + + def on_slim_attrvalue(escape, value) + [:slim, :attrvalue, escape, access(value)] + end + + def on_slim_splat(code) + [:slim, :splat, access(code)] + end + + def on_dynamic(code) + raise Temple::FilterError, 'Embedded code is forbidden in logic less mode' + end + + def on_code(code) + raise Temple::FilterError, 'Embedded code is forbidden in logic less mode' + end + + private + + def access(name) + case name + when 'yield' + 'yield' + when 'self' + "#{@context}.to_s" + else + "#{@context}[#{name.to_sym.inspect}]" + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/parser.rb new file mode 100644 index 000000000..94135e99a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/parser.rb @@ -0,0 +1,535 @@ +# frozen_string_literal: true +module Slim + # Parses Slim code and transforms it to a Temple expression + # @api private + class Parser < Temple::Parser + define_options :file, + :default_tag, + tabsize: 4, + code_attr_delims: { + '(' => ')', + '[' => ']', + '{' => '}', + }, + attr_list_delims: { + '(' => ')', + '[' => ']', + '{' => '}', + }, + shortcut: { + '#' => { attr: 'id' }, + '.' => { attr: 'class' } + }, + splat_prefix: '*' + + class SyntaxError < StandardError + attr_reader :error, :file, :line, :lineno, :column + + def initialize(error, file, line, lineno, column) + @error = error + @file = file || '(__TEMPLATE__)' + @line = line.to_s + @lineno = lineno + @column = column + end + + def to_s + line = @line.lstrip + column = @column + line.size - @line.size + %{#{error} + #{file}, Line #{lineno}, Column #{@column} + #{line} + #{' ' * column}^ +} + end + end + + def initialize(opts = {}) + super + @attr_list_delims = options[:attr_list_delims] + @code_attr_delims = options[:code_attr_delims] + tabsize = options[:tabsize] + if tabsize > 1 + @tab_re = /\G((?: {#{tabsize}})*) {0,#{tabsize - 1}}\t/ + @tab = '\1' + ' ' * tabsize + else + @tab_re = "\t" + @tab = ' ' + end + @tag_shortcut, @attr_shortcut, @additional_attrs = {}, {}, {} + options[:shortcut].each do |k,v| + raise ArgumentError, 'Shortcut requires :tag and/or :attr' unless (v[:attr] || v[:tag]) && (v.keys - [:attr, :tag, :additional_attrs]).empty? + @tag_shortcut[k] = v[:tag] || options[:default_tag] + if v.include?(:attr) || v.include?(:additional_attrs) + raise ArgumentError, 'You can only use special characters for attribute shortcuts' if k =~ /(\p{Word}|-)/ + end + if v.include?(:attr) + @attr_shortcut[k] = v[:attr].is_a?(Proc) ? v[:attr] : [v[:attr]].flatten + end + if v.include?(:additional_attrs) + @additional_attrs[k] = v[:additional_attrs] + end + end + keys = Regexp.union @attr_shortcut.keys.sort_by { |k| -k.size } + @attr_shortcut_re = /\A(#{keys}+)((?:\p{Word}|-|\/\d+|:(\w|-)+)*)/ + keys = Regexp.union @tag_shortcut.keys.sort_by { |k| -k.size } + @tag_re = /\A(?:#{keys}|\*(?=[^\s]+)|(\p{Word}(?:\p{Word}|:|-)*\p{Word}|\p{Word}+))/ + keys = Regexp.escape @code_attr_delims.keys.join + @code_attr_delims_re = /\A[#{keys}]/ + keys = Regexp.escape @attr_list_delims.keys.join + @attr_list_delims_re = /\A\s*([#{keys}])/ + @embedded_re = /\A(#{Regexp.union(Embedded.engines.keys.map(&:to_s))})(?:\s*(?:(.*)))?:(\s*)/ + keys = Regexp.escape ('"\'></='.split(//) + @attr_list_delims.flatten + @code_attr_delims.flatten).uniq.join + @attr_name = "\\A\\s*([^\\0\\s#{keys}]+)" + @quoted_attr_re = /#{@attr_name}\s*=(=?)\s*("|')/ + @code_attr_re = /#{@attr_name}\s*=(=?)\s*/ + + splat_prefix = Regexp.escape(options[:splat_prefix]) + splat_regexp_source = '\A\s*' + splat_prefix + '(?=[^\s]+)' + @splat_attrs_regexp = Regexp.new(splat_regexp_source) + end + + # Compile string to Temple expression + # + # @param [String] str Slim code + # @return [Array] Temple expression representing the code + def call(str) + result = [:multi] + reset(str.split(/\r?\n/), [result]) + + parse_line while next_line + + reset + result + end + + protected + + def reset(lines = nil, stacks = nil) + # Since you can indent however you like in Slim, we need to keep a list + # of how deeply indented you are. For instance, in a template like this: + # + # doctype # 0 spaces + # html # 0 spaces + # head # 1 space + # title # 4 spaces + # + # indents will then contain [0, 1, 4] (when it's processing the last line.) + # + # We uses this information to figure out how many steps we must "jump" + # out when we see an de-indented line. + @indents = [] + + # Whenever we want to output something, we'll *always* output it to the + # last stack in this array. So when there's a line that expects + # indentation, we simply push a new stack onto this array. When it + # processes the next line, the content will then be outputted into that + # stack. + @stacks = stacks + + @lineno = 0 + @lines = lines + @line = @orig_line = nil + end + + def next_line + if @lines.empty? + @orig_line = @line = nil + else + @orig_line = @lines.shift + @lineno += 1 + @line = @orig_line.dup + end + end + + def get_indent(line) + # Figure out the indentation. Kinda ugly/slow way to support tabs, + # but remember that this is only done at parsing time. + line[/\A[ \t]*/].gsub(@tab_re, @tab).size + end + + def parse_line + if @line =~ /\A\s*\Z/ + @stacks.last << [:newline] + return + end + + indent = get_indent(@line) + + # Choose first indentation yourself + @indents << indent if @indents.empty? + + # Remove the indentation + @line.lstrip! + + # If there's more stacks than indents, it means that the previous + # line is expecting this line to be indented. + expecting_indentation = @stacks.size > @indents.size + + if indent > @indents.last + # This line was actually indented, so we'll have to check if it was + # supposed to be indented or not. + syntax_error!('Unexpected indentation') unless expecting_indentation + + @indents << indent + else + # This line was *not* indented more than the line before, + # so we'll just forget about the stack that the previous line pushed. + @stacks.pop if expecting_indentation + + # This line was deindented. + # Now we're have to go through the all the indents and figure out + # how many levels we've deindented. + while indent < @indents.last && @indents.size > 1 + @indents.pop + @stacks.pop + end + + # This line's indentation happens to lie "between" two other line's + # indentation: + # + # hello + # world + # this # <- This should not be possible! + syntax_error!('Malformed indentation') if indent != @indents.last + end + + parse_line_indicators + end + + def parse_line_indicators + case @line + when /\A\/!( ?)/ + # HTML comment + @stacks.last << [:html, :comment, [:slim, :text, :verbatim, parse_text_block($', @indents.last + $1.size + 2)]] + when /\A\/\[\s*(.*?)\s*\]\s*\Z/ + # HTML conditional comment + block = [:multi] + @stacks.last << [:html, :condcomment, $1, block] + @stacks << block + when /\A\// + # Slim comment + parse_comment_block + when /\A([\|'])([<>]{1,2}(?: |\z)| ?)/ + # Found verbatim text block. + leading_ws = $2.include?('<'.freeze) + trailing_ws = ($1 == "'") || $2.include?('>'.freeze) + @stacks.last << [:static, ' '] if leading_ws + @stacks.last << [:slim, :text, :verbatim, parse_text_block($', @indents.last + $2.count(' ') + 1)] + @stacks.last << [:static, ' '] if trailing_ws + when /\A</ + # Inline html + block = [:multi] + @stacks.last << [:multi, [:slim, :interpolate, @line], block] + @stacks << block + when /\A-/ + # Found a code block. + # We expect the line to be broken or the next line to be indented. + @line.slice!(0) + block = [:multi] + @stacks.last << [:slim, :control, parse_broken_line, block] + @stacks << block + when /\A=(=?)([<>]*)/ + # Found an output block. + # We expect the line to be broken or the next line to be indented. + @line = $' + leading_ws = $2.include?('<'.freeze) + trailing_ws = $2.include?('>'.freeze) + block = [:multi] + @stacks.last << [:static, ' '] if leading_ws + @stacks.last << [:slim, :output, $1.empty?, parse_broken_line, block] + @stacks.last << [:static, ' '] if trailing_ws + @stacks << block + when @embedded_re + # Embedded template detected. It is treated as block. + @line = $2 + attrs = parse_attributes + @stacks.last << [:slim, :embedded, $1, parse_text_block($', @orig_line.size - $'.size + $2.size), attrs] + when /\Adoctype\b/ + # Found doctype declaration + @stacks.last << [:html, :doctype, $'.strip] + when @tag_re + # Found a HTML tag. + @line = $' if $1 + parse_tag($&) + else + unknown_line_indicator + end + @stacks.last << [:newline] + end + + # Unknown line indicator found. Overwrite this method if + # you want to add line indicators to the Slim parser. + # The default implementation throws a syntax error. + def unknown_line_indicator + syntax_error! 'Unknown line indicator' + end + + def parse_comment_block + while !@lines.empty? && (@lines.first =~ /\A\s*\Z/ || get_indent(@lines.first) > @indents.last) + next_line + @stacks.last << [:newline] + end + end + + def parse_text_block(first_line = nil, text_indent = nil) + result = [:multi] + if !first_line || first_line.empty? + text_indent = nil + else + result << [:slim, :interpolate, first_line] + end + + empty_lines = 0 + until @lines.empty? + if @lines.first =~ /\A\s*\Z/ + next_line + result << [:newline] + empty_lines += 1 if text_indent + else + indent = get_indent(@lines.first) + break if indent <= @indents.last + + if empty_lines > 0 + result << [:slim, :interpolate, "\n" * empty_lines] + empty_lines = 0 + end + + next_line + @line.lstrip! + + # The text block lines must be at least indented + # as deep as the first line. + offset = text_indent ? indent - text_indent : 0 + if offset < 0 + text_indent += offset + offset = 0 + end + result << [:newline] << [:slim, :interpolate, (text_indent ? "\n" : '') + (' ' * offset) + @line] + + # The indentation of first line of the text block + # determines the text base indentation. + text_indent ||= indent + end + end + result + end + + def parse_broken_line + broken_line = @line.strip + while broken_line =~ /[,\\]\Z/ + expect_next_line + broken_line << "\n" << @line + end + broken_line + end + + def parse_tag(tag) + if @tag_shortcut[tag] + @line.slice!(0, tag.size) unless @attr_shortcut[tag] + tag = @tag_shortcut[tag] + end + + # Find any shortcut attributes + attributes = [:html, :attrs] + while @line =~ @attr_shortcut_re + # The class/id attribute is :static instead of :slim :interpolate, + # because we don't want text interpolation in .class or #id shortcut + syntax_error!('Illegal shortcut') unless shortcut = @attr_shortcut[$1] + + if shortcut.is_a?(Proc) + shortcut.call($2).each { |a, v| attributes << [:html, :attr, a, [:static, v]] } + else + shortcut.each {|a| attributes << [:html, :attr, a, [:static, $2]] } + end + + if additional_attr_pairs = @additional_attrs[$1] + additional_attr_pairs.each do |k,v| + attributes << [:html, :attr, k.to_s, [:static, v]] + end + end + @line = $' + end + + @line =~ /\A[<>']*/ + @line = $' + trailing_ws = $&.include?('>'.freeze) + leading_ws = $&.include?('<'.freeze) + + parse_attributes(attributes) + + tag = [:html, :tag, tag, attributes] + + @stacks.last << [:static, ' '] if leading_ws + @stacks.last << tag + @stacks.last << [:static, ' '] if trailing_ws + + case @line + when /\A\s*:\s*/ + # Block expansion + @line = $' + if @line =~ @embedded_re + + # Parse attributes + @line = $2 + attrs = parse_attributes + tag << [:slim, :embedded, $1, parse_text_block($', @orig_line.size - $'.size + $2.size), attrs] + else + (@line =~ @tag_re) || syntax_error!('Expected tag') + @line = $' if $1 + content = [:multi] + tag << content + i = @stacks.size + @stacks << content + parse_tag($&) + @stacks.delete_at(i) + end + when /\A\s*=(=?)(['<>]*)/ + # Handle output code + @line = $' + trailing_ws2 = $2.include?('>'.freeze) + block = [:multi] + @stacks.last.insert(-2, [:static, ' ']) if !leading_ws && $2.include?('<'.freeze) + tag << [:slim, :output, $1 != '=', parse_broken_line, block] + @stacks.last << [:static, ' '] if !trailing_ws && trailing_ws2 + @stacks << block + when /\A\s*\/\s*/ + # Closed tag. Do nothing + @line = $' + syntax_error!('Unexpected text after closed tag') unless @line.empty? + when /\A\s*\Z/ + # Empty content + content = [:multi] + tag << content + @stacks << content + when /\A ?/ + # Text content + tag << [:slim, :text, :inline, parse_text_block($', @orig_line.size - $'.size)] + end + end + + def parse_attributes(attributes = [:html, :attrs]) + # Check to see if there is a delimiter right after the tag name + delimiter = nil + if @line =~ @attr_list_delims_re + delimiter = @attr_list_delims[$1] + @line = $' + end + + if delimiter + boolean_attr_re = /#{@attr_name}(?=(\s|#{Regexp.escape delimiter}|\Z))/ + end_re = /\A\s*#{Regexp.escape delimiter}/ + end + + while true + case @line + when @splat_attrs_regexp + # Splat attribute + @line = $' + attributes << [:slim, :splat, parse_ruby_code(delimiter)] + when @quoted_attr_re + # Value is quoted (static) + @line = $' + attributes << [:html, :attr, $1, + [:escape, $2.empty?, [:slim, :interpolate, parse_quoted_attribute($3)]]] + when @code_attr_re + # Value is ruby code + @line = $' + name = $1 + escape = $2.empty? + value = parse_ruby_code(delimiter) + syntax_error!('Invalid empty attribute') if value.empty? + attributes << [:html, :attr, name, [:slim, :attrvalue, escape, value]] + else + break unless delimiter + + case @line + when boolean_attr_re + # Boolean attribute + @line = $' + attributes << [:html, :attr, $1, [:multi]] + when end_re + # Find ending delimiter + @line = $' + break + else + # Found something where an attribute should be + @line.lstrip! + syntax_error!('Expected attribute') unless @line.empty? + + # Attributes span multiple lines + @stacks.last << [:newline] + syntax_error!("Expected closing delimiter #{delimiter}") if @lines.empty? + next_line + end + end + end + attributes || [:html, :attrs] + end + + def parse_ruby_code(outer_delimiter) + code, count, delimiter, close_delimiter = ''.dup, 0, nil, nil + + # Attribute ends with space or attribute delimiter + end_re = /\A[\s#{Regexp.escape outer_delimiter.to_s}]/ + + until @line.empty? || (count == 0 && @line =~ end_re) + if @line =~ /\A[,\\]\Z/ + code << @line << "\n" + expect_next_line + else + if count > 0 + if @line[0] == delimiter[0] + count += 1 + elsif @line[0] == close_delimiter[0] + count -= 1 + end + elsif @line =~ @code_attr_delims_re + count = 1 + delimiter, close_delimiter = $&, @code_attr_delims[$&] + end + code << @line.slice!(0) + end + end + syntax_error!("Expected closing delimiter #{close_delimiter}") if count != 0 + code + end + + def parse_quoted_attribute(quote) + value, count = ''.dup, 0 + + until count == 0 && @line[0] == quote[0] + if @line =~ /\A(\\)?\Z/ + value << ($1 ? ' ' : "\n") + expect_next_line + else + if @line[0] == '{' + count += 1 + elsif @line[0] == '}' + count -= 1 + end + value << @line.slice!(0) + end + end + + @line.slice!(0) + value + end + + # Helper for raising exceptions + def syntax_error!(message) + raise SyntaxError.new(message, options[:file], @orig_line, @lineno, + @orig_line && @line ? @orig_line.size - @line.size : 0) + rescue SyntaxError => ex + # HACK: Manipulate stacktrace for Rails and other frameworks + # to find the right file. + ex.backtrace.unshift "#{options[:file]}:#{@lineno}" + raise + end + + def expect_next_line + next_line || syntax_error!('Unexpected end of file') + @line.strip! + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/railtie.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/railtie.rb new file mode 100644 index 000000000..5eb1517c4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/railtie.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Slim + class Railtie < ::Rails::Railtie + initializer 'initialize slim template handler' do + ActiveSupport.on_load(:action_view) do + Slim::RailsTemplate = Temple::Templates::Rails(Slim::Engine, + register_as: :slim, + # Use rails-specific generator. This is necessary + # to support block capturing and streaming. + generator: Temple::Generators::RailsOutputBuffer, + # Disable the internal slim capturing. + # Rails takes care of the capturing by itself. + disable_capture: true, + streaming: true) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart.rb new file mode 100644 index 000000000..0291003da --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +require 'slim' +require 'slim/smart/filter' +require 'slim/smart/escaper' +require 'slim/smart/parser' + +Slim::Engine.replace Slim::Parser, Slim::Smart::Parser +Slim::Engine.after Slim::Smart::Parser, Slim::Smart::Filter +Slim::Engine.after Slim::Interpolation, Slim::Smart::Escaper diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/escaper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/escaper.rb new file mode 100644 index 000000000..671bfeb8c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/escaper.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true +module Slim + module Smart + # Perform smart entity escaping in the + # expressions `[:slim, :text, type, Expression]`. + # + # @api private + class Escaper < ::Slim::Filter + define_options smart_text_escaping: true + + def call(exp) + if options[:smart_text_escaping] + super + else + exp + end + end + + def on_slim_text(type, content) + [:escape, type != :verbatim, [:slim, :text, type, compile(content)]] + end + + def on_static(string) + # Prevent obvious &foo; and Ӓ and ÿ entities from escaping. + block = [:multi] + until string.empty? + case string + when /\A&([a-z][a-z0-9]*|#x[0-9a-f]+|#\d+);/i + # Entity. + block << [:escape, false, [:static, $&]] + string = $' + when /\A&?[^&]*/ + # Other text. + block << [:static, $&] + string = $' + end + end + block + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/filter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/filter.rb new file mode 100644 index 000000000..fa571e207 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/filter.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: true +module Slim + module Smart + # Perform newline processing in the + # expressions `[:slim, :text, type, Expression]`. + # + # @api private + class Filter < ::Slim::Filter + define_options smart_text: true, + smart_text_end_chars: '([{', + smart_text_begin_chars: ',.;:!?)]}' + + def initialize(opts = {}) + super + @active = @prepend = @append = false + @prepend_re = /\A#{chars_re(options[:smart_text_begin_chars])}/ + @append_re = /#{chars_re(options[:smart_text_end_chars])}\Z/ + end + + def call(exp) + if options[:smart_text] + super + else + exp + end + end + + def on_multi(*exps) + # The [:multi] blocks serve two purposes. + # On outer level, they collect the building blocks like + # tags, verbatim text, and implicit/explicit text. + # Within a text block, they collect the individual + # lines in [:slim, :interpolate, string] blocks. + # + # Our goal here is to decide when we want to prepend and + # append newlines to those individual interpolated lines. + # We basically want the text to come out as it was originally entered, + # while removing newlines next to the enclosing tags. + # + # On outer level, we choose to prepend every time, except + # right after the opening tag or after other text block. + # We also use the append flag to recognize the last expression + # before the closing tag, as we don't want to append newline there. + # + # Within text block, we prepend only before the first line unless + # the outer level tells us not to, and we append only after the last line, + # unless the outer level tells us it is the last line before the closing tag. + # Of course, this is later subject to the special begin/end characters + # which may further suppress the newline at the corresponding line boundary. + # Also note that the lines themselves are already correctly separated by newlines, + # so we don't have to worry about that at all. + block = [:multi] + prev = nil + last_exp = exps.reject { |exp| exp.first == :newline }.last unless @active && @append + exps.each do |exp| + @append = exp.equal?(last_exp) + if @active + @prepend = false if prev + else + @prepend = prev && (prev.first != :slim || prev[1] != :text) + end + block << compile(exp) + prev = exp unless exp.first == :newline + end + block + end + + def on_slim_text(type, content) + @active = type != :verbatim + [:slim, :text, type, compile(content)] + ensure + @active = false + end + + def on_slim_text_inline(content) + # Inline text is not wrapped in multi block, so set it up as if it was. + @prepend = false + @append = true + on_slim_text(:inline, content) + end + + def on_slim_interpolate(string) + if @active + string = "\n" + string if @prepend && string !~ @prepend_re + string += "\n" if @append && string !~ @append_re + end + [:slim, :interpolate, string] + end + + private + + def chars_re(string) + Regexp.union(string.split(//)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/parser.rb new file mode 100644 index 000000000..078310724 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/smart/parser.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true +module Slim + module Smart + # @api private + class Parser < ::Slim::Parser + define_options implicit_text: true + + def initialize(opts = {}) + super + word_re = options[:implicit_text] ? '[_a-z0-9]' : '\p{Word}' + attr_keys = Regexp.union(@attr_shortcut.keys.sort_by { |k| -k.size }) + @attr_shortcut_re = /\A(#{attr_keys}+)((?:\p{Word}|-)*)/ + tag_keys = Regexp.union((@tag_shortcut.keys - @attr_shortcut.keys).sort_by { |k| -k.size }) + @tag_re = /\A(?:#{attr_keys}(?=-*\p{Word})|#{tag_keys}|\*(?=[^\s]+)|(#{word_re}(?:#{word_re}|:|-)*#{word_re}|#{word_re}+))/ + end + + def unknown_line_indicator + if @line =~ /\A>( ?)/ + # Found explicit text block. + @stacks.last << [:slim, :text, :explicit, parse_text_block($', @indents.last + $1.size + 1)] + else + unless options[:implicit_text] + syntax_error! 'Illegal shortcut' if @line =~ @attr_shortcut_re + super + end + # Found implicit smart text block. + if line = @lines.first + indent = (line =~ /\A\s*\Z/ ? @indents.last + 1 : get_indent(line)) + end + @stacks.last << [:slim, :text, :implicit, parse_text_block(@line, indent)] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/splat/builder.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/splat/builder.rb new file mode 100644 index 000000000..c7463a213 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/splat/builder.rb @@ -0,0 +1,115 @@ +# frozen_string_literal: true +module Slim + class InvalidAttributeNameError < StandardError; end + module Splat + # @api private + class Builder + # https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + INVALID_ATTRIBUTE_NAME_REGEX = /[ \0"'>\/=]/ + + def initialize(options) + @options = options + @attrs = {} + end + + def code_attr(name, escape, value) + if delim = @options[:merge_attrs][name] + value = Array === value ? value.join(delim) : value.to_s + attr(name, escape_html(escape, value)) unless value.empty? + elsif @options[:hyphen_attrs].include?(name) && Hash === value + hyphen_attr(name, escape, value) + elsif value != false && value != nil + attr(name, escape_html(escape, value)) + end + end + + def splat_attrs(splat) + splat.each do |name, value| + code_attr(name.to_s, true, value) + end + end + + def attr(name, value) + if name =~ INVALID_ATTRIBUTE_NAME_REGEX + raise InvalidAttributeNameError, "Invalid attribute name '#{name}' was rendered" + end + if @attrs[name] + if delim = @options[:merge_attrs][name] + @attrs[name] = @attrs[name].to_s + delim + value.to_s + else + raise("Multiple #{name} attributes specified") + end + else + @attrs[name] = value + end + end + + def build_tag(&block) + tag = @attrs.delete('tag').to_s + tag = @options[:default_tag] if tag.empty? + if block + # This is a bit of a hack to get a universal capturing. + # + # TODO: Add this as a helper somewhere to solve these capturing issues + # once and for all. + # + # If we have Slim capturing disabled and the scope defines the method `capture` (i.e. Rails) + # we use this method to capture the content. + # + # otherwise we just use normal Slim capturing (yield). + # + # See https://github.com/slim-template/slim/issues/591 + # https://github.com/slim-template/slim#helpers-capturing-and-includes + # + content = + if @options[:disable_capture] && (scope = block.binding.eval('self')).respond_to?(:capture) + scope.capture(&block) + else + yield + end + "<#{tag}#{build_attrs}>#{content}</#{tag}>" + else + "<#{tag}#{build_attrs} />" + end + end + + def build_attrs + attrs = @options[:sort_attrs] ? @attrs.sort_by(&:first) : @attrs + attrs.map do |k, v| + if v == true + if @options[:format] == :xhtml + " #{k}=#{@options[:attr_quote]}#{@options[:attr_quote]}" + else + " #{k}" + end + else + " #{k}=#{@options[:attr_quote]}#{v}#{@options[:attr_quote]}" + end + end.join + end + + private + + def hyphen_attr(name, escape, value) + if Hash === value + if @options[:hyphen_underscore_attrs] + value.each do |n, v| + hyphen_attr("#{name}-#{n.to_s.tr('_', '-')}", escape, v) + end + else + value.each do |n, v| + hyphen_attr("#{name}-#{n}", escape, v) + end + end + else + attr(name, escape_html(escape, value)) + end + end + + def escape_html(escape, value) + return value if !escape || value == true + @options[:use_html_safe] ? Temple::Utils.escape_html_safe(value) : Temple::Utils.escape_html(value) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/splat/filter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/splat/filter.rb new file mode 100644 index 000000000..a61e89430 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/splat/filter.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true +module Slim + module Splat + # @api private + class Filter < ::Slim::Filter + define_options :merge_attrs, :attr_quote, :sort_attrs, :default_tag, :format, :disable_capture, + hyphen_attrs: %w(data aria), use_html_safe: ''.respond_to?(:html_safe?), + hyphen_underscore_attrs: false + + def call(exp) + @splat_options = nil + exp = compile(exp) + if @splat_options + opts = options.to_hash.reject { |k, v| !Filter.options.valid_key?(k) }.inspect + [:multi, [:code, "#{@splat_options} = #{opts}"], exp] + else + exp + end + end + + # Handle tag expression `[:html, :tag, name, attrs, content]` + # + # @param [String] name Tag name + # @param [Array] attrs Temple expression + # @param [Array] content Temple expression + # @return [Array] Compiled temple expression + def on_html_tag(name, attrs, content = nil) + return super if name != '*' + builder, block = make_builder(attrs[2..-1]) + if content + [:multi, + block, + [:slim, :output, false, + "#{builder}.build_tag #{empty_exp?(content) ? '{}' : 'do'}", + compile(content)]] + else + [:multi, + block, + [:dynamic, "#{builder}.build_tag"]] + end + end + + # Handle attributes expression `[:html, :attrs, *attrs]` + # + # @param [Array] attrs Array of temple expressions + # @return [Array] Compiled temple expression + def on_html_attrs(*attrs) + if attrs.any? { |attr| splat?(attr) } + builder, block = make_builder(attrs) + [:multi, + block, + [:dynamic, "#{builder}.build_attrs"]] + else + super + end + end + + protected + + def splat?(attr) + # Splat attribute given + attr[0] == :slim && attr[1] == :splat || + # Hyphenated attribute also needs splat handling + (attr[0] == :html && attr[1] == :attr && options[:hyphen_attrs].include?(attr[2]) && + attr[3][0] == :slim && attr[3][1] == :attrvalue) + end + + def make_builder(attrs) + @splat_options ||= unique_name + builder = unique_name + result = [:multi, [:code, "#{builder} = ::Slim::Splat::Builder.new(#{@splat_options})"]] + attrs.each do |attr| + result << + if attr[0] == :html && attr[1] == :attr + if attr[3][0] == :slim && attr[3][1] == :attrvalue + [:code, "#{builder}.code_attr(#{attr[2].inspect}, #{attr[3][2]}, (#{attr[3][3]}))"] + else + tmp = unique_name + [:multi, + [:capture, tmp, compile(attr[3])], + [:code, "#{builder}.attr(#{attr[2].inspect}, #{tmp})"]] + end + elsif attr[0] == :slim && attr[1] == :splat + [:code, "#{builder}.splat_attrs((#{attr[2]}))"] + else + attr + end + end + [builder, result] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/template.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/template.rb new file mode 100644 index 000000000..12f68f066 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/template.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +module Slim + # Tilt template implementation for Slim + # @api public + Template = Temple::Templates::Tilt(Slim::Engine, register_as: :slim) +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/translator.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/translator.rb new file mode 100644 index 000000000..f9b46e5dc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/translator.rb @@ -0,0 +1,119 @@ +# frozen_string_literal: true +require 'slim' + +module Slim + # @api private + class Translator < Filter + define_options :tr, + tr_mode: :dynamic, + tr_fn: '_' + + if defined?(::I18n) + set_options tr_fn: '::Slim::Translator.i18n_text', + tr: true + elsif defined?(::GetText) + set_options tr_fn: '::GetText._', + tr: true + elsif defined?(::FastGettext) + set_options tr_fn: '::FastGettext::Translation._', + tr: true + end + + def self.i18n_text(text) + I18n.t!(text) + rescue I18n::MissingTranslationData + text + end + + def self.i18n_key(text) + key = text.parameterize.underscore + I18n.t!(key) + rescue I18n::MissingTranslationData + text + end + + def call(exp) + options[:tr] ? super : exp + end + + def initialize(opts = {}) + super + case options[:tr_mode] + when :static + @translator = StaticTranslator.new(tr_fn: options[:tr_fn]) + when :dynamic + @translator = DynamicTranslator.new(tr_fn: options[:tr_fn]) + else + raise ArgumentError, "Invalid translator mode #{options[:tr_mode].inspect}" + end + end + + def on_slim_text(type, exp) + [:slim, :text, type, @translator.call(exp)] + end + + private + + class StaticTranslator < Filter + define_options :tr_fn + + def initialize(opts = {}) + super + @translate = eval("proc {|string| #{options[:tr_fn]}(string) }") + end + + def call(exp) + @text, @captures = ''.dup, [] + result = compile(exp) + + text = @translate.call(@text) + while text =~ /%(\d+)/ + result << [:static, $`] << @captures[$1.to_i - 1] + text = $' + end + result << [:static, text] + end + + def on_static(text) + @text << text + [:multi] + end + + def on_slim_output(escape, code, content) + @captures << [:slim, :output, escape, code, content] + @text << "%#{@captures.size}" + [:multi] + end + end + + class DynamicTranslator < Filter + define_options :tr_fn + + def call(exp) + @captures_count, @captures_var, @text = 0, unique_name, ''.dup + + result = compile(exp) + + if @captures_count > 0 + result.insert(1, [:code, "#{@captures_var}=[]"]) + result << [:slim, :output, false, "#{options[:tr_fn]}(#{@text.inspect}).gsub(/%(\\d+)/) { #{@captures_var}[$1.to_i-1] }", [:multi]] + else + result << [:slim, :output, false, "#{options[:tr_fn]}(#{@text.inspect})", [:multi]] + end + end + + def on_static(text) + @text << text + [:multi] + end + + def on_slim_output(escape, code, content) + @captures_count += 1 + @text << "%#{@captures_count}" + [:capture, "#{@captures_var}[#{@captures_count - 1}]", [:slim, :output, escape, code, content]] + end + end + end +end + +Slim::Engine.before Slim::EndInserter, Slim::Translator diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/version.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/version.rb new file mode 100644 index 000000000..0d772a582 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/lib/slim/version.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +module Slim + # Slim version string + # @api public + VERSION = '5.2.1' +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/slim.gemspec b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/slim.gemspec new file mode 100644 index 000000000..5f3c88152 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/slim-5.2.1/slim.gemspec @@ -0,0 +1,33 @@ +require File.dirname(__FILE__) + '/lib/slim/version' +require 'date' + +Gem::Specification.new do |s| + s.name = 'slim' + s.version = Slim::VERSION + s.date = Date.today.to_s + s.authors = ['Daniel Mendler', 'Andrew Stone', 'Fred Wu'] + s.email = ['mail@daniel-mendler.de', 'andy@stonean.com', 'ifredwu@gmail.com'] + s.summary = 'Slim is a template language.' + s.description = 'Slim is a template language whose goal is reduce the syntax to the essential parts without becoming cryptic.' + s.homepage = 'https://slim-template.github.io/' + s.license = 'MIT' + + s.metadata = { + "bug_tracker_uri" => "https://github.com/slim-template/slim/issues", + "changelog_uri" => "https://github.com/slim-template/slim/blob/main/CHANGES", + "documentation_uri" => "https://rubydoc.info/gems/slim/frames", + "homepage_uri" => "https://slim-template.github.io/", + "source_code_uri" => "https://github.com/slim-template/slim", + "wiki_uri" => "https://github.com/slim-template/slim/wiki", + "funding_uri" => "https://github.com/sponsors/slim-template" + } + + s.files = `git ls-files`.split("\n") + s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.require_paths = %w(lib) + + s.required_ruby_version = '>= 2.5.0' + + s.add_runtime_dependency('temple', ['~> 0.10.0']) + s.add_runtime_dependency('tilt', ['>= 2.1.0']) +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/CHANGES b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/CHANGES new file mode 100644 index 000000000..0f234dfb6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/CHANGES @@ -0,0 +1,302 @@ +0.10.4 + + * Fix Ruby 3.4 compatibility (#152) + +0.10.3 + + * Remove test files from the gem package (#146) + * Add DynamicMerger filter (#147) + +0.10.2 + + * Fix Sinatra capture_generator problem (#145) + +0.10.1 + + * Use specified :capture_generator for nested captures (#112, #144) + * Compatibility with frozen string literals + +0.10.0 + + * Regression: Revert changes to :capture_generator since 0.8.2 (#112, #113, #137) + * Regression: Ensure that output buffer is not reused for capturing in Rails (#135) + * Drop support for Rails 4.x + +0.9.1 + + * Fix Slim's error in AttributeMerger due to 0.9.0's :capture_generator (#137) + * Use specified :capture_generator for nested captures (#112) + * Fix Temple::ERB::Engine's <%= to not escape and <%== to escape expressions + +0.9.0 + + * Require Ruby 2.5+ (#131) + * Change default :capture_generator to self (#113) + * Improve compatibility with Rails 7.1 (#135) + * Support Rails 6.1's annotate_rendered_view_with_filenames + with Temple::Filters::Ambles (#134) + * Fix a crash in StringSplitter filter (#138) + * Fix a warning by Object#=~ since Ruby 2.6 (#129) + * Fix deprecated Tilt template mime type (#108) + * Stop using deprecated EscapeUtils from Temple::Utils (#136) + +0.8.2 + + * Support TruffleRuby in Temple::Filters::StaticAnalyzer (#127) + * Support TruffleRuby in Temple::Filters::StringSplitter (#127) + +0.8.1 + + * Stop relying on deprecated method in Rails (#121) + * Fix issue with --enable-frozen-string-literal + * Escape html in markdown + +0.8.0 + + * Add Temple::StaticAnalyzer to analyze Ruby expressions + * Support newlines in Temple::Filters::StaticAnalyzer + +0.7.8 + + * Fix a warning in StaticAnalyzer + +0.7.7 + + * Add Temple::Filters::StaticAnalyzer, Temple::Filters::StringSplitter + * Freeze string literals + +0.7.6 + + * EngineDSL - add support for use(:Filter) { FilterClassName } + +0.7.5 + + * HTML::Pretty Fix indentation issue (https://github.com/slim-template/slim-rails/issues/78) + +0.7.4 + + * EngineDSL: allow to replace/remove with regexp + * Fix deprecation warning (#83) + +0.7.3 + + * Temple::ERB::Trimming - replace option trim_mode with trim and switch to erubis-like trimming + +0.7.2 + + * Remove Filters::StaticFreezer, the generator does the freezing + +0.7.1 + + * Rename *Hash to *Map + * Add Filters::StaticFreezer + +0.7.0 + + * Drop Ruby 1.8.7 support + * EngineDSL: Remove option filter + * HTML: Deprecate :html4, :html5 formats + * HTML: Add format :xml + * Rename DefaultOptions to ClassOptions + * Deprecate default_options in favor of options + * Add Utils.indent_dynamic + +0.6.10 + + * Tilt template: Support :outvar and save/restore buffer to make the behaviour compatible with ERB + +0.6.9 + + * HTML::Pretty: Fix wrong line numbers + * Tilt template: Don't overwrite buffer always + * Generator: add preamble and postamble which do nothing + * Tilt template: don't overwrite streaming option + * OptionHash: inherit valid keys + * temple/html/safe: add poor man's html_safe? implementation (not required automatically) + * Temple::Mixins::GrammarDSL - Add some missing match? methods + * Temple::Utils.escape_html_safe - Add parameter safe + +0.6.8 + + * HTML::Fast add svg doctype + * Render standalone html 5 attributes + +0.6.7 + + * HTML::Pretty - change some block level tags + * Reduce memory allocations in immutable hash + +0.6.6 + + * Use default encoding utf-8 + * Escape also ' + * Try to load escape_utils by default + +0.6.5 + + * Added Filters::CodeMerger + * Added Filters::Encoding + * Added Filters::RemoveBOM + * Added Generators::ERB + +0.6.4 + + * Check for ActionView instead of Rails (#72) + +0.6.3 + + * Fix HTML escaping for HTML::Pretty (Issue #69) + +0.6.2 + + * [:html, :js, code] abstraction added + +0.6.1 + + * HTML::Pretty improved + +0.6.0 + + * HTML::AttributeMerger: rename option :attr_delimiter to :merge_attrs + * HTML: rename option :attr_wrapper to :attr_quote + +0.5.5 + + * HTML pretty: Do not remove empty lines, add newline after doctype + +0.5.4 + + * HTML::AttributeMerger fixed, it didn't remove first empty attribute values + * Add HTML::AttributeRemover back, :remove_empty_attrs must be an Array of Strings now + of the attributes to be removed if empty + * Simplify [:case] expression grammar + * Ignore parameter :outvar by sinatra since sinatra assumes also that the buffer is a String, + they should set :buffer and :generator explicitly if they need the access + +0.5.3 + + * Only print an message if invalid options are passed to Temple filters or engines + since many libraries seem to use Slim and Temple in an incorrect way + +0.5.2 + + * Fix the :outvar problem really + +0.5.1 + + * Support Sinatra :outvar option in Tilt template + +0.5.0 + + * Added exception Temple::FilterError which should be thrown by filters + * Added Temple::Parser as default base class for parsers + * escape_html doesn't escape / anymore + * HTML::AttributeSorter uses stable sorting now + * HTML::AttributeRemover removed (Was too Slim specific) + * Engine option :chain removed + * Option validation implemented (Use define_options in your filters) + * Deprecated options implemented (Use deprecated_options in your filters) + * ThreadOptions added, Method #with_options + +0.4.1 + + * Generators: produce optimized code + * remove deprecated method EngineDSL#wildcard + * Set tilt template default_mime_type to text/html + * HTML: Support conditional comments [:html, :condcomment, ...] + +0.4.0 + + * Split Temple::HTML::AttributeMerger in AttributeSorter, + AttributeMerger and AttributeRemover + * Fix issue #58 + +0.3.5 + + * Temple::HTML::Pretty improved + * :sort_attrs option (default: true) added to HTML::AttributeMerger; + if set to false, the attributes will appear in the insertion order + * Temple::Mixins::EngineDSL api changed ("wildcard" is deprecated, use "use" instead) + * Temple::Mixins::CompiledDispatcher supports arbitrary levels now + * Don't use gsub! on incoming strings (#57) + * Fix newlines in erb parser (#46) + +0.3.4 + + * Bugfix release (0.3.3 was yanked) + +0.3.3 + + * Support for rails 3.1 streaming + * Add EngineDSL#wildcard + * HTML::Fast/Pretty supports only :xhtml and :html formats from now on + * HTML::AttributeMerger extracted from HTML::Fast + +0.3.1, 0.3.2 + + * Don't modify strings destructively with gsub! in HTML::Pretty. + This doesn't work with Rails safe buffers in version >= 3.0.8. + +0.3.0 + + * Compiled expression dispatching + * Method temple_dispatch is obsolete + * EscapeHTML renamed to Escapable + * Control flow filter added + * HTML filter: Tag and attribute expressions changed + * Expression grammar added + * Expression validator added + * Debugger filter removed (Validator is better replacement) + +0.2.0 + + * Add mutable/immutable hashes for option inheritance + * Rails template support added + * Rename Filter#compile to Filter#call + * Engine chain reconfiguration (append, prepend, replace, ...) + * HTML filter: Don't output empty attributes + * Escape expression changed [:escape, true/false, Expression] + +0.1.8 + + * HTML filter: Support :format => :html (alias for :html5) + +0.1.7 + + * HTML::Pretty indents dynamic content only if it doesn't contain + preformatted tags + +0.1.6 + + * Flexible chain building + +0.1.5 + + * Default options for engines + +0.1.4 + + * HTML::Pretty added + * Tilt-based template class added + * Escaping filter added + * Filter base class added + * Fix capturing (Issue #15) + +0.1.3 + + * Close issue #10 + * Refactoring + +0.1.2 + + * Add HTML filter + * Remove Escapable filter + * Add method for checking if expression is empty + +0.1.1 + + * Test added + +0.1.0 + + * Initial release diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/EXPRESSIONS.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/EXPRESSIONS.md new file mode 100644 index 000000000..5641b4baa --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/EXPRESSIONS.md @@ -0,0 +1,262 @@ +Temple expression documentation +=============================== + +Temple uses S-expressions to represent the parsed template code. The S-expressions +are passed from filter to filter until the generator. The generator transforms +the S-expression to a ruby code string. See the {file:README.md README} for an introduction. + +In this document we documented all the expressions which are used by Temple. There is also +a formal grammar which can validate expressions. + +The Core Abstraction +-------------------- + +The core abstraction is what every template evetually should be compiled +to. Currently it consists of six types: +multi, static, dynamic, code, newline and capture. + +When compiling, there's two different strings we'll have to think about. +First we have the generated code. This is what your engine (from Temple's +point of view) spits out. If you construct this carefully enough, you can +make exceptions report correct line numbers, which is very convenient. + +Then there's the result. This is what your engine (from the user's point +of view) spits out. It's what happens if you evaluate the generated code. + +### [:multi, *sexp] + +Multi is what glues everything together. It's simply a sexp which combines +several others sexps: + + [:multi, + [:static, "Hello "], + [:dynamic, "@world"]] + +### [:static, string] + +Static indicates that the given string should be appended to the result. + +Example: + + [:static, "Hello World"] +is the same as: + _buf << "Hello World" + + [:static, "Hello \n World"] +is the same as + _buf << "Hello\nWorld" + +### [:dynamic, ruby] + +Dynamic indicates that the given Ruby code should be evaluated and then +appended to the result. + +The Ruby code must be a complete expression in the sense that you can pass +it to eval() and it would not raise SyntaxError. + +Example: + + [:dynamic, 'Math::PI * r**2'] + +### [:code, ruby] + +Code indicates that the given Ruby code should be evaluated, and may +change the control flow. Any \n causes a newline in the generated code. + +Example: + + [:code, 'area = Math::PI * r**2'] + +### [:newline] + +Newline causes a newline in the generated code, but not in the result. + +### [:capture, variable_name, sexp] + +Evaluates the Sexp using the rules above, but instead of appending to the +result, it sets the content to the variable given. + +Example: + + [:multi, + [:static, "Some content"], + [:capture, "foo", [:static, "More content"]], + [:dynamic, "foo.downcase"]] +is the same as: + _buf << "Some content" + foo = "More content" + _buf << foo.downcase + +Control flow abstraction +------------------------ + +Control flow abstractions can be used to write common ruby control flow constructs. +These expressions are compiled to [:code, ruby] by Temple::Filters::ControlFlow + +### [:if, condition, if-sexp, optional-else-sexp] + +Example: + + [:if, + "1+1 == 2", + [:static, "Yes"], + [:static, "No"]] +is the same as: + if 1+1 == 2 + _buf << "Yes" + else + _buf << "No" + end + +### [:block, ruby, sexp] + +Example: + + [:block, + '10.times do', + [:static, 'Hello']] +is the same as: + 10.times do + _buf << 'Hello' + end + +### [:case, argument, [condition, sexp], [condition, sexp], ...] + +Example: + + [:case, + 'value', + ["1", "value is 1"], + ["2", "value is 2"], + [:else, "don't know"]] +is the same as: + case value + when 1 + _buf << "value is 1" + when 2 + _buf << "value is 2" + else + _buf << "don't know" + end + +### [:cond, [condition, sexp], [condition, sexp], ...] + + [:cond, + ["a", "a is true"], + ["b", "b is true"], + [:else, "a and b are false"]] +is the same as: + case + when a + _buf << "a is true" + when b + _buf << "b is true" + else + _buf << "a and b are false" + end + +Escape abstraction +------------------ + +The Escape abstraction is processed by Temple::Filters::Escapable. + +### [:escape, bool, sexp] + +The boolean flag switches escaping on or off for the content sexp. Dynamic and static +expressions are manipulated. + +Example: + + [:escape, true, + [:multi, + [:dynamic, "code"], + [:static, "<"], + [:escape, false, [:static, ">"]]]] +is transformed to + [:multi, + [:dynamic, 'escape_html(code)'], + [:static, '<'], + [:static, '>']] + +HTML abstraction +---------------- + +The HTML abstraction is processed by the html filters (Temple::HTML::Fast and Temple::HTML::Pretty). + +### [:html, :doctype, string] + +Example: + [:html, :doctype, '5'] +generates + <!DOCTYPE html> + +Supported doctypes: + +<table> +<tr><td><b>Name</b></td><td><b>Generated doctype</b></td></tr> +<tr><td>1.1</td><td><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"></td></tr> +<tr><td>html, 5</td><td><!DOCTYPE html></td></tr> +<tr><td>strict</td><td><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"></td></tr> +<tr><td>frameset</td><td><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"></td></tr> +<tr><td>mobile</td><td><!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"></td></tr> +<tr><td>basic</td><td><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"></td></tr> +<tr><td>transitional</td><td><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></td></tr> +</table> + +### [:html, :comment, sexp] + +Example: + [:html, :comment, [:static, 'comment']] +generates: + <!--comment--> + +### [:html, :condcomment, condition, sexp] + +Example: + [:html, :condcomment, 'IE', [:static, 'comment']] +generates: + <!--[if IE]>comment<![endif]--> + +### [:html, :tag, identifier, attributes, optional-sexp] + +HTML tag abstraction. Identifier can be a String or a Symbol. If the optional content Sexp is omitted +the tag is closed (e.g. `<br/>` `<img/>`). The tag is also closed if the content Sexp is empty +(consists only of :multi and :newline expressions) and the tag is registered as auto-closing. + +Example: + [:html, :tag, 'img', [:html, :attrs, [:html, :attr, 'src', 'image.png']]] + [:html, :tag, 'p', [:multi], [:static, 'Content']] +generates: + + <img src="image.png"/> + <p>Content</p> + +### [:html, :attrs, attributes] + +List of html attributes [:html, :attr, identifier, sexp] + +### [:html, :attr, identifier, sexp] + +HTML attribute abstraction. Identifier can be a String or a Symbol. + +### [:html, :js, code] + +HTML javascript abstraction which wraps the js code in a HTML comment or CDATA depending on document format. + +Formal grammar +-------------- + +Validate expressions with Temple::Grammar.match? and Temple::Grammar.validate! + + Temple::Grammar.match? [:multi, [:static, 'Valid Temple Expression']] + Temple::Grammar.validate! [:multi, 'Invalid Temple Expression'] + +The formal grammar is given in a Ruby DSL similar to EBNF and should be easy to understand if you know EBNF. Repeated tokens +are given by appending ?, * or + as in regular expressions. + +* ? means zero or one occurence +* \* means zero or more occurences +* \+ means one or more occurences + +<!-- Find a better way to include the grammar --> +<script src="http://gist-it.appspot.com/github/judofyr/temple/raw/master/lib/temple/grammar.rb"></script> diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/Gemfile b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/Gemfile new file mode 100644 index 000000000..9784aee9d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org/' +gemspec diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/LICENSE b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/LICENSE new file mode 100644 index 000000000..f881a6e0e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2010 Magnus Holm + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/README.md new file mode 100644 index 000000000..e09723933 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/README.md @@ -0,0 +1,267 @@ +Temple +====== + +[![test](https://github.com/judofyr/temple/actions/workflows/test.yml/badge.svg)](https://github.com/judofyr/temple/actions/workflows/test.yml) [![Code Climate](https://codeclimate.com/github/judofyr/temple.svg)](https://codeclimate.com/github/judofyr/temple) [![Gem Version](https://badge.fury.io/rb/temple.svg)](https://rubygems.org/gems/temple) [![Yard Docs](https://img.shields.io/badge/yard-docs-blue.svg)](http://rubydoc.info/gems/temple/frames) + +Temple is an abstraction and a framework for compiling templates to pure Ruby. +It's all about making it easier to experiment, implement and optimize template +languages. If you're interested in implementing your own template language, or +anything else related to the internals of a template engine: You've come to +the right place. + +Have a look around, and if you're still wondering: Ask on the mailing list and +we'll try to do our best. In fact, it doesn't have to be related to Temple at +all. As long as it has something to do with template languages, we're +interested: <http://groups.google.com/group/guardians-of-the-temple>. + +Links +----- + +* Source: <http://github.com/judofyr/temple> +* Bugs: <http://github.com/judofyr/temple/issues> +* List: <http://groups.google.com/group/guardians-of-the-temple> +* API documentation: + * Latest Gem: <http://rubydoc.info/gems/temple/frames> + * GitHub master: <http://rubydoc.info/github/judofyr/temple/master/frames> +* Abstractions: <http://github.com/judofyr/temple/blob/master/EXPRESSIONS.md> + +Overview +-------- + +Temple is built on a theory that every template consists of three elements: + +* Static text +* Dynamic text (pieces of Ruby which are evaluated and sent to the client) +* Codes (pieces of Ruby which are evaluated and *not* sent to the client, but + might change the control flow). + +The goal of a template engine is to take the template and eventually compile +it into *the core abstraction*: + +```ruby + [:multi, + [:static, "Hello "], + [:dynamic, "@user.name"], + [:static, "!\n"], + [:code, "if @user.birthday == Date.today"], + [:static, "Happy birthday!"], + [:code, "end"]] +``` + +Then you can apply some optimizations, feed it to Temple and it generates fast +Ruby code for you: + +```ruby + _buf = [] + _buf << ("Hello #{@user.name}!\n") + if @user.birthday == Date.today + _buf << "Happy birthday!" + end + _buf.join +``` + +S-expression +------------ + +In Temple, an Sexp is simply an array (or a subclass) where the first element +is the *type* and the rest are the *arguments*. The type must be a symbol and +it's recommended to only use strings, symbols, arrays and numbers as +arguments. + +Temple uses Sexps to represent templates because it's a simple and +straightforward data structure, which can easily be written by hand and +manipulated by computers. + +Some examples: + +```ruby + [:static, "Hello World!"] + + [:multi, + [:static, "Hello "], + [:dynamic, "@world"]] + + [:html, :tag, "em", [:html, :attrs], [:static, "Hey hey"]] +``` + +*NOTE:* SexpProcessor, a library written by Ryan Davis, includes a `Sexp` +class. While you can use this class (since it's a subclass of Array), it's not +what Temple mean by "Sexp". + +Abstractions +------------ + +The idea behind Temple is that abstractions are good, and it's better to have +too many than too few. While you should always end up with the core +abstraction, you shouldn't stress about it. Take one step at a time, and only +do one thing at every step. + +So what's an abstraction? An abstraction is when you introduce a new types: + +```ruby + # Instead of: + [:static, "<strong>Use the force</strong>"] + + # You use: + [:html, :tag, "strong", [:html, :attrs], [:static, "Use the force"]] +``` + +### Why are abstractions so important? + +First of all, it means that several template engines can share code. Instead +of having two engines which goes all the way to generating HTML, you have two +smaller engines which only compiles to the HTML abstraction together with +something that compiles the HTML abstraction to the core abstraction. + +Often you also introduce abstractions because there's more than one way to do +it. There's not a single way to generate HTML. Should it be indented? If so, +with tabs or spaces? Or should it remove as much whitespace as possible? +Single or double quotes in attributes? Escape all weird UTF-8 characters? + +With an abstraction you can easily introduce a completely new HTML compiler, +and whatever is below doesn't have to care about it *at all*. They just +continue to use the HTML abstraction. Maybe you even want to write your +compiler in another language? Sexps are easily serialized and if you don't +mind working across processes, it's not a problem at all. + +All abstractions used by Temple are documented in [EXPRESSIONS.md](EXPRESSIONS.md). + +Compilers +--------- + +A *compiler* is simply an object which responds a method called #call which +takes one argument and returns a value. It's illegal for a compiler to mutate +the argument, and it should be possible to use the same instance several times +(although not by several threads at the same time). + +While a compiler can be any object, you very often want to structure it as a +class. Temple then assumes the initializer takes an optional option hash: + +```ruby + class MyCompiler + def initialize(options = {}) + @options = options + end + + def call(exp) + # do stuff + end + end +``` + +### Parsers + +In Temple, a parser is also a compiler, because a compiler is just something +that takes some input and produces some output. A parser is then something +that takes a string and returns an Sexp. + +It's important to remember that the parser *should be dumb*. No optimization, +no guesses. It should produce an Sexp that is as close to the source as +possible. You should invent your own abstraction. Maybe you even want to +separate the parsers into several parts and introduce several abstractions on +the way? + +### Filters + +A filter is a compiler which take an Sexp and returns an Sexp. It might turn +convert it one step closer to the core-abstraction, it might create a new +abstraction, or it might just optimize in the current abstraction. Ultimately, +it's still just a compiler which takes an Sexp and returns an Sexp. + +For instance, Temple ships with {Temple::Filters::DynamicInliner} and +{Temple::Filters::StaticMerger} which are general optimization filters which +works on the core abstraction. + +An HTML compiler would be a filter, since it would take an Sexp in the HTML +abstraction and compile it down to the core abstraction. + +### Generators + +A generator is a compiler which takes an Sexp and returns a string which is +valid Ruby code. + +Most of the time you would just use {Temple::Generators::ArrayBuffer} or any of the +other generators in {Temple::Generators}, but nothing stops you from writing your +own. + +In fact, one of the great things about Temple is that if you write a new +generator which turns out to be a lot faster then the others, it's going to +make *every single engine* based on Temple faster! So if you have any ideas, +please share them - it's highly appreciated. + +Engines +------- + +When you have a chain of a parsers, some filters and a generator you can finally create your *engine*. Temple provides {Temple::Engine} which makes this very easy: + +```ruby + class MyEngine < Temple::Engine + # First run MyParser + use MyParser + + # Then a custom filter + use MyFilter + + # Then some general optimizations filters + filter :MultiFlattener + filter :StaticMerger + filter :DynamicInliner + + # Finally the generator + generator :ArrayBuffer + end + + engine = MyEngine.new(strict: "For MyParser") + engine.call(something) +``` + +And then? +--------- + +You've ran the template through the parser, some filters and in the end a +generator. What happens next? + +Temple provides helpers to create template classes for [Tilt](http://github.com/rtomayko/tilt) and +Rails. + +```ruby + require 'tilt' + + # Create template class MyTemplate and register your file extension + MyTemplate = Temple::Templates::Tilt(MyEngine, register_as: 'ext') + + Tilt.new('example.ext').render # => Render a file + MyTemplate.new { "String" }.render # => Render a string +``` + +Installation +------------ + +You need at least Ruby 1.9.3 to work with Temple. Temple is published as a Ruby Gem which can be installed +as following: + +```bash + $ gem install temple +``` + +Engines using Temple +-------------------- + +* [Slim](https://github.com/slim-template/slim) +* [Hamlit](https://github.com/k0kubun/hamlit) +* [Faml](https://github.com/eagletmt/faml) +* [Sal](https://github.com/stonean/sal.rb) +* [Temple-Mustache (Example implementation)](https://github.com/minad/temple-mustache) +* Temple ERB example implementation (Temple::ERB::Template) +* [WLang](https://github.com/blambeau/wlang) + +Acknowledgements +---------------- + +Thanks to [_why](http://en.wikipedia.org/wiki/Why_the_lucky_stiff) for +creating an excellent template engine (Markaby) which is quite slow. That's +how I started experimenting with template engines in the first place. + +I also owe [Ryan Davis](http://zenspider.com/) a lot for his excellent +projects ParserTree, RubyParser, Ruby2Ruby and SexpProcessor. Temple is +heavily inspired by how these tools work. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple.rb new file mode 100644 index 000000000..33ab5580f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true +require 'temple/version' + +module Temple + autoload :InvalidExpression, 'temple/exceptions' + autoload :FilterError, 'temple/exceptions' + autoload :Generator, 'temple/generator' + autoload :Parser, 'temple/parser' + autoload :Engine, 'temple/engine' + autoload :Utils, 'temple/utils' + autoload :Filter, 'temple/filter' + autoload :Templates, 'temple/templates' + autoload :Grammar, 'temple/grammar' + autoload :ImmutableMap, 'temple/map' + autoload :MutableMap, 'temple/map' + autoload :OptionMap, 'temple/map' + autoload :StaticAnalyzer, 'temple/static_analyzer' + + module Mixins + autoload :Dispatcher, 'temple/mixins/dispatcher' + autoload :CompiledDispatcher, 'temple/mixins/dispatcher' + autoload :EngineDSL, 'temple/mixins/engine_dsl' + autoload :GrammarDSL, 'temple/mixins/grammar_dsl' + autoload :Options, 'temple/mixins/options' + autoload :ClassOptions, 'temple/mixins/options' + autoload :Template, 'temple/mixins/template' + end + + module ERB + autoload :Engine, 'temple/erb/engine' + autoload :Parser, 'temple/erb/parser' + autoload :Trimming, 'temple/erb/trimming' + autoload :Template, 'temple/erb/template' + end + + module Generators + autoload :ERB, 'temple/generators/erb' + autoload :Array, 'temple/generators/array' + autoload :ArrayBuffer, 'temple/generators/array_buffer' + autoload :StringBuffer, 'temple/generators/string_buffer' + autoload :RailsOutputBuffer, 'temple/generators/rails_output_buffer' + end + + module Filters + autoload :Ambles, 'temple/filters/ambles' + autoload :CodeMerger, 'temple/filters/code_merger' + autoload :ControlFlow, 'temple/filters/control_flow' + autoload :MultiFlattener, 'temple/filters/multi_flattener' + autoload :StaticAnalyzer, 'temple/filters/static_analyzer' + autoload :StaticMerger, 'temple/filters/static_merger' + autoload :StringSplitter, 'temple/filters/string_splitter' + autoload :DynamicInliner, 'temple/filters/dynamic_inliner' + autoload :DynamicMerger, 'temple/filters/dynamic_merger' + autoload :Escapable, 'temple/filters/escapable' + autoload :Eraser, 'temple/filters/eraser' + autoload :Validator, 'temple/filters/validator' + autoload :Encoding, 'temple/filters/encoding' + autoload :RemoveBOM, 'temple/filters/remove_bom' + end + + module HTML + autoload :Dispatcher, 'temple/html/dispatcher' + autoload :Filter, 'temple/html/filter' + autoload :Fast, 'temple/html/fast' + autoload :Pretty, 'temple/html/pretty' + autoload :AttributeMerger, 'temple/html/attribute_merger' + autoload :AttributeRemover, 'temple/html/attribute_remover' + autoload :AttributeSorter, 'temple/html/attribute_sorter' + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/engine.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/engine.rb new file mode 100644 index 000000000..001ce12ff --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/engine.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true +module Temple + # An engine is simply a chain of compilers (that often includes a parser, + # some filters and a generator). + # + # class MyEngine < Temple::Engine + # # First run MyParser, passing the :strict option + # use MyParser, :strict + # + # # Then a custom filter + # use MyFilter + # + # # Then some general optimizations filters + # filter :MultiFlattener + # filter :StaticMerger + # filter :DynamicInliner + # + # # Finally the generator + # generator :ArrayBuffer, :buffer + # end + # + # class SpecialEngine < MyEngine + # append MyCodeOptimizer + # before :ArrayBuffer, Temple::Filters::Validator + # replace :ArrayBuffer, Temple::Generators::RailsOutputBuffer + # end + # + # engine = MyEngine.new(strict: "For MyParser") + # engine.call(something) + # + # @api public + class Engine + include Mixins::Options + include Mixins::EngineDSL + extend Mixins::EngineDSL + + define_options :file, :streaming, :buffer, :save_buffer + + attr_reader :chain + + def self.chain + @chain ||= superclass.respond_to?(:chain) ? superclass.chain.dup : [] + end + + def initialize(opts = {}) + super + @chain = self.class.chain.dup + end + + def call(input) + call_chain.inject(input) {|m, e| e.call(m) } + end + + protected + + def chain_modified! + @call_chain = nil + end + + def call_chain + @call_chain ||= @chain.map do |name, constructor| + f = constructor.call(self) + raise "Constructor #{name} must return callable object" if f && !f.respond_to?(:call) + f + end.compact + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/engine.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/engine.rb new file mode 100644 index 000000000..7aa28e7fb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/engine.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true +module Temple + module ERB + # Example ERB engine implementation + # + # @api public + class Engine < Temple::Engine + use Temple::ERB::Parser + use Temple::ERB::Trimming + filter :Escapable + filter :StringSplitter + filter :StaticAnalyzer + filter :MultiFlattener + filter :StaticMerger + generator :ArrayBuffer + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/parser.rb new file mode 100644 index 000000000..ca91eff2c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/parser.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true +module Temple + module ERB + # Example ERB parser + # + # @api public + class Parser < Temple::Parser + ERB_PATTERN = /(\n|<%%|%%>)|<%(==?|\#)?(.*?)?-?%>/m + + def call(input) + result = [:multi] + pos = 0 + input.scan(ERB_PATTERN) do |token, indicator, code| + text = input[pos...$~.begin(0)] + pos = $~.end(0) + if token + case token + when "\n" + result << [:static, "#{text}\n"] << [:newline] + when '<%%', '%%>' + result << [:static, text] unless text.empty? + token.slice!(1) + result << [:static, token] + end + else + result << [:static, text] unless text.empty? + case indicator + when '#' + result << [:code, "\n" * code.count("\n")] + when /=/ + result << [:escape, indicator.size == 2, [:dynamic, code]] + else + result << [:code, code] + end + end + end + result << [:static, input[pos..-1]] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/template.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/template.rb new file mode 100644 index 000000000..efda47c27 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/template.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +module Temple + # ERB example implementation + # + # Example usage: + # Temple::ERB::Template.new { "<%= 'Hello, world!' %>" }.render + # + module ERB + # ERB Template class + Template = Temple::Templates::Tilt(Engine) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/trimming.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/trimming.rb new file mode 100644 index 000000000..8d9bcc894 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/erb/trimming.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module Temple + module ERB + # ERB trimming like in erubis + # Deletes spaces around '<% %>' and leave spaces around '<%= %>'. + # @api public + class Trimming < Filter + define_options trim: true + + def on_multi(*exps) + exps = exps.each_with_index.map do |e,i| + if e.first == :static && i > 0 && exps[i-1].first == :code + [:static, e.last.lstrip] + elsif e.first == :static && i < exps.size-1 && exps[i+1].first == :code + [:static, e.last.rstrip] + else + e + end + end if options[:trim] + [:multi, *exps] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/exceptions.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/exceptions.rb new file mode 100644 index 000000000..c6ca38438 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/exceptions.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Temple + # Exception raised if invalid temple expression is found + # + # @api public + class InvalidExpression < RuntimeError + end + + # Exception raised if something bad happens in a Temple filter + # + # @api public + class FilterError < RuntimeError + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filter.rb new file mode 100644 index 000000000..c985ed3dc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filter.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Temple + # Temple base filter + # @api public + class Filter + include Utils + include Mixins::Dispatcher + include Mixins::Options + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/ambles.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/ambles.rb new file mode 100644 index 000000000..ba50306a0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/ambles.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Temple + module Filters + class Ambles < Filter + define_options :preamble, :postamble + + def initialize(*) + super + @preamble = options[:preamble] + @postamble = options[:postamble] + end + + def call(ast) + ret = [:multi] + ret << [:static, @preamble] if @preamble + ret << ast + ret << [:static, @postamble] if @postamble + ret + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/code_merger.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/code_merger.rb new file mode 100644 index 000000000..25b3a4e10 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/code_merger.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +module Temple + module Filters + # @api public + class CodeMerger < Filter + def on_multi(*exps) + result = [:multi] + code = nil + + exps.each do |exp| + if exp.first == :code + if code + code << '; ' unless code =~ /\n\Z/ + code << exp.last + else + code = exp.last.dup + result << [:code, code] + end + elsif code && exp.first == :newline + code << "\n" + else + result << compile(exp) + code = nil + end + end + + result.size == 2 ? result[1] : result + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/control_flow.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/control_flow.rb new file mode 100644 index 000000000..57db56b20 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/control_flow.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true +module Temple + module Filters + # Control flow filter which processes [:if, condition, yes-exp, no-exp] + # and [:block, code, content] expressions. + # This is useful for ruby code generation with lots of conditionals. + # + # @api public + class ControlFlow < Filter + def on_if(condition, yes, no = nil) + result = [:multi, [:code, "if #{condition}"], compile(yes)] + while no && no.first == :if + result << [:code, "elsif #{no[1]}"] << compile(no[2]) + no = no[3] + end + result << [:code, 'else'] << compile(no) if no + result << [:code, 'end'] + result + end + + def on_case(arg, *cases) + result = [:multi, [:code, arg ? "case (#{arg})" : 'case']] + cases.map do |c| + condition, exp = c + result << [:code, condition == :else ? 'else' : "when #{condition}"] << compile(exp) + end + result << [:code, 'end'] + result + end + + def on_cond(*cases) + on_case(nil, *cases) + end + + def on_block(code, exp) + [:multi, + [:code, code], + compile(exp), + [:code, 'end']] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/dynamic_inliner.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/dynamic_inliner.rb new file mode 100644 index 000000000..6ff2a281a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/dynamic_inliner.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true +module Temple + module Filters + # Inlines several static/dynamic into a single dynamic. + # + # @api public + class DynamicInliner < Filter + def on_multi(*exps) + result = [:multi] + curr = nil + prev = [] + state = :looking + + exps.each do |exp| + type, arg = exp + + case type + when :newline + if state == :looking + # We haven't found any static/dynamic, so let's just add it + result << exp + else + # We've found something, so let's make sure the generated + # dynamic contains a newline by escaping a newline and + # starting a new string: + # + # "Hello "\ + # "#{@world}" + prev << exp + curr[1] << "\"\\\n\"" + end + when :dynamic, :static + case state + when :looking + # Found a single static/dynamic. We don't want to turn this + # into a dynamic yet. Instead we store it, and if we find + # another one, we add both then. + state = :single + prev = [exp] + curr = [:dynamic, '"'.dup] + when :single + # Yes! We found another one. Add the current dynamic to the result. + state = :several + result << curr + end + curr[1] << (type == :static ? arg.inspect[1..-2] : "\#{#{arg}}") + else + if state != :looking + # We need to add the closing quote. + curr[1] << '"' + # If we found a single exp last time, let's add it. + result.concat(prev) if state == :single + end + # Compile the current exp + result << compile(exp) + # Now we're looking for more! + state = :looking + end + end + + if state != :looking + # We need to add the closing quote. + curr[1] << '"' + # If we found a single exp last time, let's add it. + result.concat(prev) if state == :single + end + + result.size == 2 ? result[1] : result + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/dynamic_merger.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/dynamic_merger.rb new file mode 100644 index 000000000..413fe9baf --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/dynamic_merger.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true +module Temple + module Filters + # Compile [:multi, [:static, 'foo'], [:dynamic, 'bar']] to [:dynamic, '"foo#{bar}"'] + class DynamicMerger < Filter + def on_multi(*exps) + exps = exps.dup + result = [:multi] + buffer = [] + + until exps.empty? + type, arg = exps.first + if type == :dynamic && arg.count("\n") == 0 + buffer << exps.shift + elsif type == :static && exps.size > (count = arg.count("\n")) && + exps[1, count].all? { |e| e == [:newline] } + (1 + count).times { buffer << exps.shift } + elsif type == :newline && exps.size > (count = count_newline(exps)) && + exps[count].first == :static && count == exps[count].last.count("\n") + (count + 1).times { buffer << exps.shift } + else + result.concat(merge_dynamic(buffer)) + buffer = [] + result << compile(exps.shift) + end + end + result.concat(merge_dynamic(buffer)) + + result.size == 2 ? result[1] : result + end + + private + + def merge_dynamic(exps) + # Merge exps only when they have both :static and :dynamic + unless exps.any? { |type,| type == :static } && exps.any? { |type,| type == :dynamic } + return exps + end + + strlit_body = String.new + exps.each do |type, arg| + case type + when :static + strlit_body << arg.dump.sub!(/\A"/, '').sub!(/"\z/, '').gsub('\n', "\n") + when :dynamic + strlit_body << "\#{#{arg}}" + when :newline + # newline is added by `gsub('\n', "\n")` + else + raise "unexpected type #{type.inspect} is given to #merge_dynamic" + end + end + [[:dynamic, "%Q\0#{strlit_body}\0"]] + end + + def count_newline(exps) + count = 0 + exps.each do |exp| + if exp == [:newline] + count += 1 + else + return count + end + end + return count + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/encoding.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/encoding.rb new file mode 100644 index 000000000..3a9c9277c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/encoding.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true +module Temple + module Filters + # Try to encode input string + # + # @api public + class Encoding < Parser + define_options encoding: 'utf-8' + + def call(s) + if options[:encoding] && s.respond_to?(:encoding) + old_enc = s.encoding + s = +s + s.force_encoding(options[:encoding]) + # Fall back to old encoding if new encoding is invalid + unless s.valid_encoding? + s.force_encoding(old_enc) + s.force_encoding(::Encoding::BINARY) unless s.valid_encoding? + end + end + s + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/eraser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/eraser.rb new file mode 100644 index 000000000..00f802663 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/eraser.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +module Temple + module Filters + # Erase expressions with a certain type + # + # @api public + class Eraser < Filter + # [] is the empty type => keep all + define_options :erase, keep: [[]] + + def compile(exp) + exp.first == :multi || (do?(:keep, exp) && !do?(:erase, exp)) ? + super(exp) : [:multi] + end + + protected + + def do?(list, exp) + options[list].to_a.map {|type| [*type] }.any? {|type| exp[0,type.size] == type } + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/escapable.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/escapable.rb new file mode 100644 index 000000000..59af5e6f4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/escapable.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true +module Temple + module Filters + # Escape dynamic or static expressions. + # This filter must be used after Temple::HTML::* and before the generators. + # It can be enclosed with Temple::Filters::DynamicInliner filters to + # reduce calls to Temple::Utils#escape_html. + # + # @api public + class Escapable < Filter + # Activate the usage of html_safe? if it is available (for Rails 3 for example) + define_options :escape_code, + :disable_escape, + use_html_safe: ''.respond_to?(:html_safe?) + + def initialize(opts = {}) + super + @escape_code = options[:escape_code] || + "::Temple::Utils.escape_html#{options[:use_html_safe] ? '_safe' : ''}((%s))" + @escaper = eval("proc {|v| #{@escape_code % 'v'} }") + @escape = false + end + + def on_escape(flag, exp) + old = @escape + @escape = flag && !options[:disable_escape] + compile(exp) + ensure + @escape = old + end + + def on_static(value) + [:static, @escape ? @escaper[value] : value] + end + + def on_dynamic(value) + [:dynamic, @escape ? @escape_code % value : value] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/multi_flattener.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/multi_flattener.rb new file mode 100644 index 000000000..0f7696f32 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/multi_flattener.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +module Temple + module Filters + # Flattens nested multi expressions + # + # @api public + class MultiFlattener < Filter + def on_multi(*exps) + # If the multi contains a single element, just return the element + return compile(exps.first) if exps.size == 1 + result = [:multi] + + exps.each do |exp| + exp = compile(exp) + if exp.first == :multi + result.concat(exp[1..-1]) + else + result << exp + end + end + + result + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/remove_bom.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/remove_bom.rb new file mode 100644 index 000000000..2e49e82e0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/remove_bom.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Temple + module Filters + # Remove BOM from input string + # + # @api public + class RemoveBOM < Parser + def call(s) + return s if s.encoding.name !~ /^UTF-(8|16|32)(BE|LE)?/ + s.gsub(Regexp.new("\\A\uFEFF".encode(s.encoding.name)), ''.freeze) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/static_analyzer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/static_analyzer.rb new file mode 100644 index 000000000..d2f254633 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/static_analyzer.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +module Temple + module Filters + # Convert [:dynamic, code] to [:static, text] if code is static Ruby expression. + class StaticAnalyzer < Filter + def call(exp) + # Optimize only when Ripper is available. + if ::Temple::StaticAnalyzer.available? + super + else + exp + end + end + + def on_dynamic(code) + if ::Temple::StaticAnalyzer.static?(code) + exp = [:static, eval(code).to_s] + + newlines = code.count("\n") + if newlines == 0 + exp + else + [:multi, exp, *newlines.times.map { [:newline] }] + end + else + [:dynamic, code] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/static_merger.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/static_merger.rb new file mode 100644 index 000000000..2349db9df --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/static_merger.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true +module Temple + module Filters + # Merges several statics into a single static. Example: + # + # [:multi, + # [:static, "Hello "], + # [:static, "World!"]] + # + # Compiles to: + # + # [:static, "Hello World!"] + # + # @api public + class StaticMerger < Filter + def on_multi(*exps) + result = [:multi] + text = nil + + exps.each do |exp| + if exp.first == :static + if text + text << exp.last + else + text = exp.last.dup + result << [:static, text] + end + else + result << compile(exp) + text = nil unless exp.first == :newline + end + end + + result.size == 2 ? result[1] : result + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/string_splitter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/string_splitter.rb new file mode 100644 index 000000000..44fab596c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/string_splitter.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: true +begin + require 'ripper' +rescue LoadError +end + +module Temple + module Filters + # Compile [:dynamic, "foo#{bar}"] to [:multi, [:static, 'foo'], [:dynamic, 'bar']] + class StringSplitter < Filter + if defined?(Ripper) && Ripper.respond_to?(:lex) + class << self + # `code` param must be valid string literal + def compile(code) + [].tap do |exps| + tokens = Ripper.lex(code.strip) + tokens.pop while tokens.last && [:on_comment, :on_sp].include?(tokens.last[1]) + + if tokens.size < 2 + raise(FilterError, "Expected token size >= 2 but got: #{tokens.size}") + end + compile_tokens!(exps, tokens) + end + end + + private + + def strip_quotes!(tokens) + _, type, beg_str = tokens.shift + if type != :on_tstring_beg + raise(FilterError, "Expected :on_tstring_beg but got: #{type}") + end + + _, type, end_str = tokens.pop + if type != :on_tstring_end + raise(FilterError, "Expected :on_tstring_end but got: #{type}") + end + + [beg_str, end_str] + end + + def compile_tokens!(exps, tokens) + beg_str, end_str = strip_quotes!(tokens) + + until tokens.empty? + _, type, str = tokens.shift + + case type + when :on_tstring_content + beg_str, end_str = escape_quotes(beg_str, end_str) + exps << [:static, eval("#{beg_str}#{str}#{end_str}").to_s] + when :on_embexpr_beg + embedded = shift_balanced_embexpr(tokens) + exps << [:dynamic, embedded] unless embedded.empty? + end + end + end + + # Some quotes are split-unsafe. Replace such quotes with null characters. + def escape_quotes(beg_str, end_str) + case [beg_str[-1], end_str] + when ['(', ')'], ['[', ']'], ['{', '}'] + [beg_str.sub(/.\z/) { "\0" }, "\0"] + else + [beg_str, end_str] + end + end + + def shift_balanced_embexpr(tokens) + String.new.tap do |embedded| + embexpr_open = 1 + + until tokens.empty? + _, type, str = tokens.shift + case type + when :on_embexpr_beg + embexpr_open += 1 + when :on_embexpr_end + embexpr_open -= 1 + break if embexpr_open == 0 + end + + embedded << str + end + end + end + end + + def on_dynamic(code) + return [:dynamic, code] unless string_literal?(code) + return [:dynamic, code] if code.include?("\n") + + temple = [:multi] + StringSplitter.compile(code).each do |type, content| + case type + when :static + temple << [:static, content] + when :dynamic + temple << on_dynamic(content) + end + end + temple + end + + private + + def string_literal?(code) + return false if SyntaxChecker.syntax_error?(code) + + type, instructions = Ripper.sexp(code) + return false if type != :program + return false if instructions.size > 1 + + type, _ = instructions.first + type == :string_literal + end + + class SyntaxChecker < Ripper + class ParseError < StandardError; end + + def self.syntax_error?(code) + self.new(code).parse + false + rescue ParseError + true + end + + private + + def on_parse_error(*) + raise ParseError + end + end + else + # Do nothing if ripper is unavailable + def call(ast) + ast + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/validator.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/validator.rb new file mode 100644 index 000000000..464cb378e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/filters/validator.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +module Temple + module Filters + # Validates temple expression with given grammar + # + # @api public + class Validator < Filter + define_options grammar: Temple::Grammar + + def compile(exp) + options[:grammar].validate!(exp) + exp + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generator.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generator.rb new file mode 100644 index 000000000..8fa1a7645 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generator.rb @@ -0,0 +1,91 @@ +# frozen_string_literal: true +module Temple + # Abstract generator base class + # Generators should inherit this class and + # compile the Core Abstraction to ruby code. + # + # @api public + class Generator + include Utils + include Mixins::CompiledDispatcher + include Mixins::Options + + define_options :save_buffer, + capture_generator: 'StringBuffer', + buffer: '_buf', + freeze_static: true + + def call(exp) + [preamble, compile(exp), postamble].flatten.compact.join('; ') + end + + def preamble + [save_buffer, create_buffer] + end + + def postamble + [return_buffer, restore_buffer] + end + + def save_buffer + "begin; #{@original_buffer = unique_name} = #{buffer} if defined?(#{buffer})" if options[:save_buffer] + end + + def restore_buffer + "ensure; #{buffer} = #{@original_buffer}; end" if options[:save_buffer] + end + + def create_buffer + end + + def return_buffer + 'nil' + end + + def on(*exp) + raise InvalidExpression, "Generator supports only core expressions - found #{exp.inspect}" + end + + def on_multi(*exp) + exp.map {|e| compile(e) }.join('; '.freeze) + end + + def on_newline + "\n" + end + + def on_capture(name, exp) + capture_generator.new(capture_generator: options[:capture_generator], + freeze_static: options[:freeze_static], + buffer: name).call(exp) + end + + def on_static(text) + concat(options[:freeze_static] ? "#{text.inspect}.freeze" : text.inspect) + end + + def on_dynamic(code) + concat(code) + end + + def on_code(code) + code + end + + protected + + def buffer + options[:buffer] + end + + def capture_generator + @capture_generator ||= Class === options[:capture_generator] ? + options[:capture_generator] : + Generators.const_get(options[:capture_generator]) + end + + def concat(str) + "#{buffer} << (#{str})" + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/array.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/array.rb new file mode 100644 index 000000000..49cdab3bc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/array.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Temple + module Generators + # Implements an array buffer. + # + # _buf = [] + # _buf << "static" + # _buf << dynamic + # _buf + # + # @api public + class Array < Generator + def create_buffer + "#{buffer} = []" + end + + def return_buffer + buffer + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/array_buffer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/array_buffer.rb new file mode 100644 index 000000000..ce4f04944 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/array_buffer.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true +module Temple + module Generators + # Just like Array, but calls #join on the array. + # + # _buf = [] + # _buf << "static" + # _buf << dynamic + # _buf.join("") + # + # @api public + class ArrayBuffer < Array + def call(exp) + case exp.first + when :static + [save_buffer, "#{buffer} = #{exp.last.inspect}", restore_buffer].compact.join('; ') + when :dynamic + [save_buffer, "#{buffer} = (#{exp.last}).to_s", restore_buffer].compact.join('; ') + else + super + end + end + + def return_buffer + freeze = options[:freeze_static] ? '.freeze' : '' + "#{buffer} = #{buffer}.join(\"\"#{freeze})" + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/erb.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/erb.rb new file mode 100644 index 000000000..28446fcd7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/erb.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true +module Temple + module Generators + # Implements an ERB generator. + # + # @api public + class ERB < Generator + def call(exp) + compile(exp) + end + + def on_multi(*exp) + exp.map {|e| compile(e) }.join('') + end + + def on_capture(name, exp) + on_code(super) + end + + def on_static(text) + text + end + + def on_dynamic(code) + "<%= #{code} %>" + end + + def on_code(code) + "<% #{code} %>" + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/rails_output_buffer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/rails_output_buffer.rb new file mode 100644 index 000000000..0c7539827 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/rails_output_buffer.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true +module Temple + module Generators + # Implements a rails output buffer. + # + # @output_buffer = ActiveSupport::SafeBuffer + # @output_buffer.safe_concat "static" + # @output_buffer.safe_concat dynamic.to_s + # @output_buffer + # + # @api public + class RailsOutputBuffer < StringBuffer + define_options :streaming, # ignored + buffer_class: 'ActionView::OutputBuffer', + buffer: '@output_buffer', + capture_generator: RailsOutputBuffer + + def call(exp) + [preamble, compile(exp), postamble].flatten.compact.join('; '.freeze) + end + + def create_buffer + if buffer == '@output_buffer' + "#{buffer} = output_buffer || #{options[:buffer_class]}.new" + else + "#{buffer} = #{options[:buffer_class]}.new" + end + end + + def concat(str) + "#{buffer}.safe_concat((#{str}))" + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/string_buffer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/string_buffer.rb new file mode 100644 index 000000000..e346eca1c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/generators/string_buffer.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +module Temple + module Generators + # Implements a string buffer. + # + # _buf = '' + # _buf << "static" + # _buf << dynamic.to_s + # _buf + # + # @api public + class StringBuffer < ArrayBuffer + def create_buffer + "#{buffer} = ''.dup" + end + + def return_buffer + buffer + end + + def on_dynamic(code) + concat("(#{code}).to_s") + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/grammar.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/grammar.rb new file mode 100644 index 000000000..ee9dc6ccd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/grammar.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true +module Temple + # Temple expression grammar which can be used to validate Temple expressions. + # + # Example: + # Temple::Grammar.match? [:static, 'Valid Temple Expression'] + # Temple::Grammar.validate! [:multi, 'Invalid Temple Expression'] + # + # See {file:EXPRESSIONS.md Expression documentation}. + # + # @api public + module Grammar + extend Mixins::GrammarDSL + + Expression << + # Core abstraction + [:multi, 'Expression*'] | + [:static, String] | + [:dynamic, String] | + [:code, String] | + [:capture, String, Expression] | + [:newline] | + # Control flow abstraction + [:if, String, Expression, 'Expression?'] | + [:block, String, Expression] | + [:case, String, 'Case*'] | + [:cond, 'Case*'] | + # Escape abstraction + [:escape, Bool, Expression] | + # HTML abstraction + [:html, :doctype, String] | + [:html, :comment, Expression] | + [:html, :condcomment, String, Expression]| + [:html, :js, Expression] | + [:html, :tag, HTMLIdentifier, Expression, 'Expression?'] | + [:html, :attrs, 'HTMLAttr*'] | + HTMLAttr + + EmptyExp << + [:newline] | [:multi, 'EmptyExp*'] + + HTMLAttr << + [:html, :attr, HTMLIdentifier, Expression] + + HTMLIdentifier << + Symbol | String + + Case << + [Condition, Expression] + + Condition << + String | :else + + Bool << + true | false + + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_merger.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_merger.rb new file mode 100644 index 000000000..546939c7d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_merger.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true +module Temple + module HTML + # This filter merges html attributes (e.g. used for id and class) + # @api public + class AttributeMerger < Filter + define_options merge_attrs: {'id' => '_', 'class' => ' '} + + def on_html_attrs(*attrs) + values = {} + + attrs.each do |_, _, name, value| + name = name.to_s + if values[name] + raise(FilterError, "Multiple #{name} attributes specified") unless options[:merge_attrs][name] + values[name] << value + else + values[name] = [value] + end + end + + attrs = values.map do |name, value| + if (delimiter = options[:merge_attrs][name]) && value.size > 1 + exp = [:multi] + if value.all? {|v| contains_nonempty_static?(v) } + exp << value.first + value[1..-1].each {|v| exp << [:static, delimiter] << v } + else + captures = unique_name + exp << [:code, "#{captures} = []"] + value.each_with_index {|v, i| exp << [:capture, "#{captures}[#{i}]", v] } + exp << [:dynamic, "#{captures}.reject(&:empty?).join(#{delimiter.inspect})"] + end + else + exp = value.first + end + [:html, :attr, name, exp] + end + [:html, :attrs, *attrs] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_remover.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_remover.rb new file mode 100644 index 000000000..d0150f4fd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_remover.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true +module Temple + module HTML + # This filter removes empty attributes + # @api public + class AttributeRemover < Filter + define_options remove_empty_attrs: %w(id class) + + def initialize(opts = {}) + super + raise ArgumentError, "Option :remove_empty_attrs must be an Array of Strings" unless Array === options[:remove_empty_attrs] && + options[:remove_empty_attrs].all? {|a| String === a } + end + + def on_html_attrs(*attrs) + [:multi, *attrs.map {|attr| compile(attr) }] + end + + def on_html_attr(name, value) + return super unless options[:remove_empty_attrs].include?(name.to_s) + + if empty_exp?(value) + value + elsif contains_nonempty_static?(value) + [:html, :attr, name, value] + else + tmp = unique_name + [:multi, + [:capture, tmp, compile(value)], + [:if, "!#{tmp}.empty?", + [:html, :attr, name, [:dynamic, tmp]]]] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_sorter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_sorter.rb new file mode 100644 index 000000000..4c2330a41 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/attribute_sorter.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Temple + module HTML + # This filter sorts html attributes. + # @api public + class AttributeSorter < Filter + define_options sort_attrs: true + + def call(exp) + options[:sort_attrs] ? super : exp + end + + def on_html_attrs(*attrs) + n = 0 # Use n to make sort stable. This is important because the merger could be executed afterwards. + [:html, :attrs, *attrs.sort_by do |attr| + raise(InvalidExpression, 'Attribute is not a html attr') if attr[0] != :html || attr[1] != :attr + [attr[2].to_s, n += 1] + end] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/dispatcher.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/dispatcher.rb new file mode 100644 index 000000000..243721fbd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/dispatcher.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true +module Temple + module HTML + # @api private + module Dispatcher + def on_html_attrs(*attrs) + [:html, :attrs, *attrs.map {|a| compile(a) }] + end + + def on_html_attr(name, content) + [:html, :attr, name, compile(content)] + end + + def on_html_comment(content) + [:html, :comment, compile(content)] + end + + def on_html_condcomment(condition, content) + [:html, :condcomment, condition, compile(content)] + end + + def on_html_js(content) + [:html, :js, compile(content)] + end + + def on_html_tag(name, attrs, content = nil) + result = [:html, :tag, name, compile(attrs)] + content ? (result << compile(content)) : result + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/fast.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/fast.rb new file mode 100644 index 000000000..8be3f8185 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/fast.rb @@ -0,0 +1,131 @@ +# frozen_string_literal: true +module Temple + module HTML + # @api public + class Fast < Filter + DOCTYPES = { + xml: { + '1.1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">', + '5' => '<!DOCTYPE html>', + 'html' => '<!DOCTYPE html>', + 'strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">', + 'frameset' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">', + 'mobile' => '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">', + 'basic' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">', + 'transitional' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">', + 'svg' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">' + }, + html: { + '5' => '<!DOCTYPE html>', + 'html' => '<!DOCTYPE html>', + 'strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">', + 'frameset' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">', + 'transitional' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' + } + } + DOCTYPES[:xhtml] = DOCTYPES[:xml] + DOCTYPES.freeze + + # See http://www.w3.org/html/wg/drafts/html/master/single-page.html#void-elements + HTML_VOID_ELEMENTS = %w[area base br col embed hr img input keygen link menuitem meta param source track wbr] + + define_options format: :xhtml, + attr_quote: '"', + autoclose: HTML_VOID_ELEMENTS, + js_wrapper: nil + + def initialize(opts = {}) + super + @format = options[:format] + unless [:xhtml, :html, :xml].include?(@format) + if @format == :html4 || @format == :html5 + warn "Format #{@format.inspect} is deprecated, use :html" + @format = :html + else + raise ArgumentError, "Invalid format #{@format.inspect}" + end + end + wrapper = options[:js_wrapper] + wrapper = @format == :xml || @format == :xhtml ? :cdata : :comment if wrapper == :guess + @js_wrapper = + case wrapper + when :comment + [ "<!--\n", "\n//-->" ] + when :cdata + [ "\n//<![CDATA[\n", "\n//]]>\n" ] + when :both + [ "<!--\n//<![CDATA[\n", "\n//]]>\n//-->" ] + when nil + when Array + wrapper + else + raise ArgumentError, "Invalid JavaScript wrapper #{wrapper.inspect}" + end + end + + def on_html_doctype(type) + type = type.to_s.downcase + + if type =~ /^xml(\s+(.+))?$/ + raise(FilterError, 'Invalid xml directive in html mode') if @format == :html + w = options[:attr_quote] + str = "<?xml version=#{w}1.0#{w} encoding=#{w}#{$2 || 'utf-8'}#{w} ?>" + else + str = DOCTYPES[@format][type] || raise(FilterError, "Invalid doctype #{type}") + end + + [:static, str] + end + + def on_html_comment(content) + [:multi, + [:static, '<!--'], + compile(content), + [:static, '-->']] + end + + def on_html_condcomment(condition, content) + on_html_comment [:multi, + [:static, "[#{condition}]>"], + content, + [:static, '<![endif]']] + end + + def on_html_tag(name, attrs, content = nil) + name = name.to_s + closed = !content || (empty_exp?(content) && (@format == :xml || options[:autoclose].include?(name))) + result = [:multi, [:static, "<#{name}"], compile(attrs)] + result << [:static, (closed && @format != :html ? ' /' : '') + '>'] + result << compile(content) if content + result << [:static, "</#{name}>"] if !closed + result + end + + def on_html_attrs(*attrs) + [:multi, *attrs.map {|attr| compile(attr) }] + end + + def on_html_attr(name, value) + if @format == :html && empty_exp?(value) + [:static, " #{name}"] + else + [:multi, + [:static, " #{name}=#{options[:attr_quote]}"], + compile(value), + [:static, options[:attr_quote]]] + end + end + + def on_html_js(content) + if @js_wrapper + [:multi, + [:static, @js_wrapper.first], + compile(content), + [:static, @js_wrapper.last]] + else + compile(content) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/filter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/filter.rb new file mode 100644 index 000000000..2f48b7020 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/filter.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Temple + module HTML + # @api public + class Filter < Temple::Filter + include Dispatcher + + def contains_nonempty_static?(exp) + case exp.first + when :multi + exp[1..-1].any? {|e| contains_nonempty_static?(e) } + when :escape + contains_nonempty_static?(exp.last) + when :static + !exp.last.empty? + else + false + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/pretty.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/pretty.rb new file mode 100644 index 000000000..61435734f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/pretty.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true +module Temple + module HTML + # @api public + class Pretty < Fast + define_options indent: ' ', + pretty: true, + indent_tags: %w(article aside audio base body datalist dd div dl dt + fieldset figure footer form head h1 h2 h3 h4 h5 h6 + header hgroup hr html li link meta nav ol option p + rp rt ruby section script style table tbody td tfoot + th thead tr ul video doctype).freeze, + pre_tags: %w(code pre textarea).freeze + + def initialize(opts = {}) + super + @indent_next = nil + @indent = 0 + @pretty = options[:pretty] + @pre_tags = @format != :xml && Regexp.union(options[:pre_tags].map {|t| "<#{t}" }) + end + + def call(exp) + @pretty ? [:multi, preamble, compile(exp)] : super + end + + def on_static(content) + return [:static, content] unless @pretty + unless @pre_tags && @pre_tags =~ content + content = content.sub(/\A\s*\n?/, "\n".freeze) if @indent_next + content = content.gsub("\n".freeze, indent) + end + @indent_next = false + [:static, content] + end + + def on_dynamic(code) + return [:dynamic, code] unless @pretty + indent_next, @indent_next = @indent_next, false + [:dynamic, "::Temple::Utils.indent_dynamic((#{code}), #{indent_next.inspect}, #{indent.inspect}#{@pre_tags ? ', ' + @pre_tags_name : ''})"] + end + + def on_html_doctype(type) + return super unless @pretty + [:multi, [:static, tag_indent('doctype')], super] + end + + def on_html_comment(content) + return super unless @pretty + result = [:multi, [:static, tag_indent('comment')], super] + @indent_next = false + result + end + + def on_html_tag(name, attrs, content = nil) + return super unless @pretty + + name = name.to_s + closed = !content || (empty_exp?(content) && options[:autoclose].include?(name)) + + @pretty = false + result = [:multi, [:static, "#{tag_indent(name)}<#{name}"], compile(attrs)] + result << [:static, (closed && @format != :html ? ' /' : '') + '>'] + + @pretty = !@pre_tags || !options[:pre_tags].include?(name) + if content + @indent += 1 + result << compile(content) + @indent -= 1 + end + unless closed + indent = tag_indent(name) + result << [:static, "#{content && !empty_exp?(content) ? indent : ''}</#{name}>"] + end + @pretty = true + result + end + + protected + + def preamble + return [:multi] unless @pre_tags + @pre_tags_name = unique_name + [:code, "#{@pre_tags_name} = /#{@pre_tags.source}/"] + end + + def indent + "\n" + (options[:indent] || '') * @indent + end + + # Return indentation before tag + def tag_indent(name) + if @format == :xml + flag = @indent_next != nil + @indent_next = true + else + flag = @indent_next != nil && (@indent_next || options[:indent_tags].include?(name)) + @indent_next = options[:indent_tags].include?(name) + end + flag ? indent : '' + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/safe.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/safe.rb new file mode 100644 index 000000000..85a3cee05 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/html/safe.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module Temple + module HTML + class SafeString < String + def html_safe?; true end + def html_safe; self end + def to_s; self end + end + end +end + +class Object + def html_safe?; false end +end + +class Numeric + def html_safe?; true end +end + +class String + def html_safe + Temple::HTML::SafeString.new(self) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/map.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/map.rb new file mode 100644 index 000000000..a71b90ac5 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/map.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true +module Temple + # Immutable map class which supports map merging + # @api public + class ImmutableMap + include Enumerable + + def initialize(*map) + @map = map.compact + end + + def include?(key) + @map.any? {|h| h.include?(key) } + end + + def [](key) + @map.each {|h| return h[key] if h.include?(key) } + nil + end + + def each + keys.each {|k| yield(k, self[k]) } + end + + def keys + @map.inject([]) {|keys, h| keys.concat(h.keys) }.uniq + end + + def values + keys.map {|k| self[k] } + end + + def to_hash + result = {} + each {|k, v| result[k] = v } + result + end + end + + # Mutable map class which supports map merging + # @api public + class MutableMap < ImmutableMap + def initialize(*map) + super({}, *map) + end + + def []=(key, value) + @map.first[key] = value + end + + def update(map) + @map.first.update(map) + end + end + + class OptionMap < MutableMap + def initialize(*map, &block) + super(*map) + @handler = block + @valid = {} + @deprecated = {} + end + + def []=(key, value) + validate_key!(key) + super + end + + def update(map) + validate_map!(map) + super + end + + def valid_keys + (keys + @valid.keys + + @map.map {|h| h.valid_keys if h.respond_to?(:valid_keys) }.compact.flatten).uniq + end + + def add_valid_keys(*keys) + keys.flatten.each { |key| @valid[key] = true } + end + + def add_deprecated_keys(*keys) + keys.flatten.each { |key| @valid[key] = @deprecated[key] = true } + end + + def validate_map!(map) + map.to_hash.keys.each {|key| validate_key!(key) } + end + + def validate_key!(key) + @handler.call(self, key, :deprecated) if deprecated_key?(key) + @handler.call(self, key, :invalid) unless valid_key?(key) + end + + def deprecated_key?(key) + @deprecated.include?(key) || + @map.any? {|h| h.deprecated_key?(key) if h.respond_to?(:deprecated_key?) } + end + + def valid_key?(key) + include?(key) || @valid.include?(key) || + @map.any? {|h| h.valid_key?(key) if h.respond_to?(:valid_key?) } + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/dispatcher.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/dispatcher.rb new file mode 100644 index 000000000..2446edb9f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/dispatcher.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true +module Temple + module Mixins + # @api private + module CoreDispatcher + def on_multi(*exps) + multi = [:multi] + exps.each {|exp| multi << compile(exp) } + multi + end + + def on_capture(name, exp) + [:capture, name, compile(exp)] + end + end + + # @api private + module EscapeDispatcher + def on_escape(flag, exp) + [:escape, flag, compile(exp)] + end + end + + # @api private + module ControlFlowDispatcher + def on_if(condition, *cases) + [:if, condition, *cases.compact.map {|e| compile(e) }] + end + + def on_case(arg, *cases) + [:case, arg, *cases.map {|condition, exp| [condition, compile(exp)] }] + end + + def on_block(code, content) + [:block, code, compile(content)] + end + + def on_cond(*cases) + [:cond, *cases.map {|condition, exp| [condition, compile(exp)] }] + end + end + + # @api private + module CompiledDispatcher + def call(exp) + compile(exp) + end + + def compile(exp) + dispatcher(exp) + end + + private + + def dispatcher(exp) + replace_dispatcher(exp) + end + + def replace_dispatcher(exp) + tree = DispatchNode.new + dispatched_methods.each do |method| + method.split('_'.freeze)[1..-1].inject(tree) {|node, type| node[type.to_sym] }.method = method + end + self.class.class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def dispatcher(exp) + return replace_dispatcher(exp) if self.class != #{self.class} + #{tree.compile.gsub("\n", "\n ")} + end + RUBY + dispatcher(exp) + end + + def dispatched_methods + re = /^on(_[a-zA-Z0-9]+)*$/ + self.methods.map(&:to_s).select(&re.method(:=~)) + end + + # @api private + class DispatchNode < Hash + attr_accessor :method + + def initialize + super { |hsh,key| hsh[key] = DispatchNode.new } + @method = nil + end + + def compile(level = 0, call_parent = nil) + call_method = method ? (level == 0 ? "#{method}(*exp)" : + "#{method}(*exp[#{level}..-1])") : call_parent + if empty? + raise 'Invalid dispatcher node' unless method + call_method + else + code = String.new + code << "case(exp[#{level}])\n" + each do |key, child| + code << "when #{key.inspect}\n " << + child.compile(level + 1, call_method).gsub("\n".freeze, "\n ".freeze) << "\n".freeze + end + code << "else\n " << (call_method || 'exp') << "\nend" + end + end + end + end + + # @api public + # + # Implements a compatible call-method + # based on the including classe's methods. + # + # It uses every method starting with + # "on" and uses the rest of the method + # name as prefix of the expression it + # will receive. So, if a dispatcher + # has a method named "on_x", this method + # will be called with arg0,..,argN + # whenever an expression like [:x, arg0,..,argN ] + # is encountered. + # + # This works with longer prefixes, too. + # For example a method named "on_y_z" + # will be called whenever an expression + # like [:y, :z, .. ] is found. Furthermore, + # if additionally a method named "on_y" + # is present, it will be called when an + # expression starts with :y but then does + # not contain with :z. This way a + # dispatcher can implement namespaces. + # + # @note + # Processing does not reach into unknown + # expression types by default. + # + # @example + # class MyAwesomeDispatch + # include Temple::Mixins::Dispatcher + # def on_awesome(thing) # keep awesome things + # return [:awesome, thing] + # end + # def on_boring(thing) # make boring things awesome + # return [:awesome, thing+" with bacon"] + # end + # def on(type,*args) # unknown stuff is boring too + # return [:awesome, 'just bacon'] + # end + # end + # filter = MyAwesomeDispatch.new + # # Boring things are converted: + # filter.call([:boring, 'egg']) #=> [:awesome, 'egg with bacon'] + # # Unknown things too: + # filter.call([:foo]) #=> [:awesome, 'just bacon'] + # # Known but not boring things won't be touched: + # filter.call([:awesome, 'chuck norris']) #=>[:awesome, 'chuck norris'] + # + module Dispatcher + include CompiledDispatcher + include CoreDispatcher + include EscapeDispatcher + include ControlFlowDispatcher + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/engine_dsl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/engine_dsl.rb new file mode 100644 index 000000000..4025a82a9 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/engine_dsl.rb @@ -0,0 +1,146 @@ +# frozen_string_literal: true +module Temple + module Mixins + # @api private + module EngineDSL + def chain_modified! + end + + def append(*args, &block) + chain << chain_element(args, block) + chain_modified! + end + + def prepend(*args, &block) + chain.unshift(chain_element(args, block)) + chain_modified! + end + + def remove(name) + name = chain_name(name) + raise "#{name} not found" unless chain.reject! {|i| name === i.first } + chain_modified! + end + + alias use append + + def before(name, *args, &block) + name = chain_name(name) + e = chain_element(args, block) + chain.map! {|f| name === f.first ? [e, f] : [f] }.flatten!(1) + raise "#{name} not found" unless chain.include?(e) + chain_modified! + end + + def after(name, *args, &block) + name = chain_name(name) + e = chain_element(args, block) + chain.map! {|f| name === f.first ? [f, e] : [f] }.flatten!(1) + raise "#{name} not found" unless chain.include?(e) + chain_modified! + end + + def replace(name, *args, &block) + name = chain_name(name) + e = chain_element(args, block) + chain.map! {|f| name === f.first ? e : f } + raise "#{name} not found" unless chain.include?(e) + chain_modified! + end + + # Shortcuts to access namespaces + { filter: Temple::Filters, + generator: Temple::Generators, + html: Temple::HTML }.each do |method, mod| + define_method(method) do |name, *options| + use(name, mod.const_get(name), *options) + end + end + + private + + def chain_name(name) + case name + when Class + name.name.to_sym + when Symbol, String + name.to_sym + when Regexp + name + else + raise(ArgumentError, 'Name argument must be Class, Symbol, String or Regexp') + end + end + + def chain_class_constructor(filter, local_options) + define_options(filter.options.valid_keys) if respond_to?(:define_options) && filter.respond_to?(:options) + proc do |engine| + opts = {}.update(engine.options) + opts.delete_if {|k,v| !filter.options.valid_key?(k) } if filter.respond_to?(:options) + opts.update(local_options) if local_options + filter.new(opts) + end + end + + def chain_proc_constructor(name, filter) + raise(ArgumentError, 'Proc or blocks must have arity 0 or 1') if filter.arity > 1 + method_name = "FILTER #{name}" + c = Class === self ? self : singleton_class + filter = c.class_eval { define_method(method_name, &filter); instance_method(method_name) } + proc do |engine| + if filter.arity == 1 + # the proc takes one argument, e.g. use(:Filter) {|exp| exp } + filter.bind(engine) + else + f = filter.bind(engine).call + if f.respond_to? :call + # the proc returns a callable object, e.g. use(:Filter) { Filter.new } + f + else + raise(ArgumentError, 'Proc or blocks must return a Callable or a Class') unless f.respond_to? :new + # the proc returns a class, e.g. use(:Filter) { Filter } + f.new(f.respond_to?(:options) ? engine.options.to_hash.select {|k,v| f.options.valid_key?(k) } : engine.options) + end + end + end + end + + def chain_element(args, block) + name = args.shift + if Class === name + filter = name + name = filter.name.to_sym + else + raise(ArgumentError, 'Name argument must be Class or Symbol') unless Symbol === name + end + + if block + raise(ArgumentError, 'Class and block argument are not allowed at the same time') if filter + filter = block + end + + filter ||= args.shift + + case filter + when Proc + # Proc or block argument + # The proc is converted to a method of the engine class. + # The proc can then access the option hash of the engine. + raise(ArgumentError, 'Too many arguments') unless args.empty? + [name, chain_proc_constructor(name, filter)] + when Class + # Class argument (e.g Filter class) + # The options are passed to the classes constructor. + raise(ArgumentError, 'Too many arguments') if args.size > 1 + [name, chain_class_constructor(filter, args.first)] + else + # Other callable argument (e.g. Object of class which implements #call or Method) + # The callable has no access to the option hash of the engine. + raise(ArgumentError, 'Too many arguments') unless args.empty? + raise(ArgumentError, 'Class or callable argument is required') unless filter.respond_to?(:call) + [name, proc { filter }] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/grammar_dsl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/grammar_dsl.rb new file mode 100644 index 000000000..2eaf01e91 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/grammar_dsl.rb @@ -0,0 +1,172 @@ +# frozen_string_literal: true +module Temple + module Mixins + # @api private + module GrammarDSL + class Rule + def initialize(grammar) + @grammar = grammar + end + + def match?(exp) + match(exp, []) + end + alias === match? + alias =~ match? + + def |(rule) + Or.new(@grammar, self, rule) + end + + def copy_to(grammar) + copy = dup.instance_eval { @grammar = grammar; self } + copy.after_copy(self) if copy.respond_to?(:after_copy) + copy + end + end + + class Or < Rule + def initialize(grammar, *children) + super(grammar) + @children = children.map {|rule| @grammar.Rule(rule) } + end + + def <<(rule) + @children << @grammar.Rule(rule) + self + end + + alias | << + + def match(exp, unmatched) + tmp = [] + @children.any? {|rule| rule.match(exp, tmp) } || (unmatched.concat(tmp) && false) + end + + def after_copy(source) + @children = @children.map {|child| child.copy_to(@grammar) } + end + end + + class Root < Or + def initialize(grammar, name) + super(grammar) + @name = name.to_sym + end + + def match(exp, unmatched) + success = super + unmatched << [@name, exp] unless success + success + end + + def validate!(exp) + unmatched = [] + unless match(exp, unmatched) + require 'pp' + entry = unmatched.first + unmatched.reverse_each do |u| + entry = u if u.flatten.size < entry.flatten.size + end + raise(InvalidExpression, PP.pp(entry.last, "#{@grammar}::#{entry.first} did not match\n".dup)) + end + end + + def copy_to(grammar) + grammar.const_defined?(@name) ? grammar.const_get(@name) : super + end + + def after_copy(source) + @grammar.const_set(@name, self) + super + end + end + + class Element < Or + def initialize(grammar, rule) + super(grammar) + @rule = grammar.Rule(rule) + end + + def match(exp, unmatched) + return false unless Array === exp && !exp.empty? + head, *tail = exp + @rule.match(head, unmatched) && super(tail, unmatched) + end + + def after_copy(source) + @children = @children.map do |child| + child == source ? self : child.copy_to(@grammar) + end + @rule = @rule.copy_to(@grammar) + end + end + + class Value < Rule + def initialize(grammar, value) + super(grammar) + @value = value + end + + def match(exp, unmatched) + @value === exp + end + end + + def extended(mod) + mod.extend GrammarDSL + constants.each do |name| + const_get(name).copy_to(mod) if Rule === const_get(name) + end + end + + def match?(exp) + const_get(:Expression).match?(exp) + end + alias === match? + alias =~ match? + + def validate!(exp) + const_get(:Expression).validate!(exp) + end + + def Value(value) + Value.new(self, value) + end + + def Rule(rule) + case rule + when Rule + rule + when Symbol, Class, true, false, nil + Value(rule) + when Array + start = Or.new(self) + curr = [start] + rule.each do |elem| + case elem + when /^(.*)(\*|\?|\+)$/ + elem = Element.new(self, const_get($1)) + curr.each {|c| c << elem } + elem << elem if $2 != '?' + curr = $2 == '+' ? [elem] : (curr << elem) + else + elem = Element.new(self, elem) + curr.each {|c| c << elem } + curr = [elem] + end + end + elem = Value([]) + curr.each {|c| c << elem } + start + else + raise ArgumentError, "Invalid grammar rule '#{rule.inspect}'" + end + end + + def const_missing(name) + const_set(name, Root.new(self, name)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/options.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/options.rb new file mode 100644 index 000000000..1349a1215 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/options.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true +module Temple + module Mixins + # @api public + module ClassOptions + def set_default_options(opts) + warn 'set_default_options has been deprecated, use set_options' + set_options(opts) + end + + def default_options + warn 'default_options has been deprecated, use options' + options + end + + def set_options(opts) + options.update(opts) + end + + def options + @options ||= OptionMap.new(superclass.respond_to?(:options) ? + superclass.options : nil) do |hash, key, what| + warn "#{self}: Option #{key.inspect} is #{what}" unless @option_validator_disabled + end + end + + def define_options(*opts) + if opts.last.respond_to?(:to_hash) + hash = opts.pop.to_hash + options.add_valid_keys(hash.keys) + options.update(hash) + end + options.add_valid_keys(opts) + end + + def define_deprecated_options(*opts) + if opts.last.respond_to?(:to_hash) + hash = opts.pop.to_hash + options.add_deprecated_keys(hash.keys) + options.update(hash) + end + options.add_deprecated_keys(opts) + end + + def disable_option_validator! + @option_validator_disabled = true + end + end + + module ThreadOptions + def with_options(options) + old_options = thread_options + Thread.current[thread_options_key] = ImmutableMap.new(options, thread_options) + yield + ensure + Thread.current[thread_options_key] = old_options + end + + def thread_options + Thread.current[thread_options_key] + end + + protected + + def thread_options_key + @thread_options_key ||= "#{self.name}-thread-options".to_sym + end + end + + # @api public + module Options + def self.included(base) + base.class_eval do + extend ClassOptions + extend ThreadOptions + end + end + + attr_reader :options + + def initialize(opts = {}) + self.class.options.validate_map!(opts) + self.class.options.validate_map!(self.class.thread_options) if self.class.thread_options + @options = ImmutableMap.new({}.update(self.class.options).update(self.class.thread_options || {}).update(opts)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/template.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/template.rb new file mode 100644 index 000000000..0b1e190ec --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/mixins/template.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +module Temple + module Mixins + # @api private + module Template + include ClassOptions + + def compile(code, options) + engine = options.delete(:engine) + raise 'No engine configured' unless engine + engine.new(options).call(code) + end + + def register_as(*names) + raise NotImplementedError + end + + def create(engine, options) + register_as = options.delete(:register_as) + template = Class.new(self) + template.disable_option_validator! + template.options[:engine] = engine + template.options.update(options) + template.register_as(*register_as) if register_as + template + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/parser.rb new file mode 100644 index 000000000..ea5fc8b22 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/parser.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +module Temple + # Temple base parser + # @api public + class Parser + include Utils + include Mixins::Options + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/static_analyzer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/static_analyzer.rb new file mode 100644 index 000000000..5592a689b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/static_analyzer.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true +begin + require 'ripper' +rescue LoadError +end + +module Temple + module StaticAnalyzer + STATIC_TOKENS = [ + :on_tstring_beg, :on_tstring_end, :on_tstring_content, + :on_embexpr_beg, :on_embexpr_end, + :on_lbracket, :on_rbracket, + :on_qwords_beg, :on_words_sep, :on_qwords_sep, + :on_lparen, :on_rparen, + :on_lbrace, :on_rbrace, :on_label, + :on_int, :on_float, :on_imaginary, + :on_comma, :on_sp, :on_ignored_nl, + ].freeze + + DYNAMIC_TOKENS = [ + :on_ident, :on_period, + ].freeze + + STATIC_KEYWORDS = [ + 'true', 'false', 'nil', + ].freeze + + STATIC_OPERATORS = [ + '=>', + ].freeze + + class << self + def available? + defined?(Ripper) && Ripper.respond_to?(:lex) + end + + def static?(code) + return false if code.nil? || code.strip.empty? + return false if syntax_error?(code) + + Ripper.lex(code).each do |_, token, str| + case token + when *STATIC_TOKENS + # noop + when :on_kw + return false unless STATIC_KEYWORDS.include?(str) + when :on_op + return false unless STATIC_OPERATORS.include?(str) + when *DYNAMIC_TOKENS + return false + else + return false + end + end + true + end + + def syntax_error?(code) + SyntaxChecker.new(code).parse + false + rescue SyntaxChecker::ParseError + true + end + end + + if defined?(Ripper) + class SyntaxChecker < Ripper + class ParseError < StandardError; end + + private + + def on_parse_error(*) + raise ParseError + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates.rb new file mode 100644 index 000000000..201f0d61f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +module Temple + # @api public + module Templates + autoload :Tilt, 'temple/templates/tilt' + autoload :Rails, 'temple/templates/rails' + + def self.method_missing(name, engine, options = {}) + const_get(name).create(engine, options) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates/rails.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates/rails.rb new file mode 100644 index 000000000..169b21d70 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates/rails.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +module Temple + module Templates + class Rails + extend Mixins::Template + + def call(template, source = nil) + opts = {}.update(self.class.options).update(file: template.identifier) + if ActionView::Base.try(:annotate_rendered_view_with_filenames) && template.format == :html + opts[:preamble] = "<!-- BEGIN #{template.short_identifier} -->\n" + opts[:postamble] = "<!-- END #{template.short_identifier} -->\n" + end + self.class.compile((source || template.source), opts) + end + + def supports_streaming? + self.class.options[:streaming] + end + + def self.register_as(*names) + raise 'Rails is not loaded - Temple::Templates::Rails cannot be used' unless defined?(::ActionView) + if ::ActiveSupport::VERSION::MAJOR < 5 + raise "Temple supports only Rails 5 and greater, your Rails version is #{::ActiveSupport::VERSION::STRING}" + end + names.each do |name| + ::ActionView::Template.register_template_handler name.to_sym, new + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates/tilt.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates/tilt.rb new file mode 100644 index 000000000..bc2f3a836 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/templates/tilt.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true +require 'tilt' + +module Temple + module Templates + class Tilt < ::Tilt::Template + extend Mixins::Template + + define_options mime_type: 'text/html' + + # Prepare Temple template + # + # Called immediately after template data is loaded. + # + # @return [void] + def prepare + opts = {}.update(self.class.options).update(options).update(file: eval_file) + metadata[:mime_type] = opts.delete(:mime_type) + if opts.include?(:outvar) + opts[:buffer] = opts.delete(:outvar) + opts[:save_buffer] = true + end + @src = self.class.compile(data, opts) + end + + # A string containing the (Ruby) source code for the template. + # + # @param [Hash] locals Local variables + # @return [String] Compiled template ruby code + def precompiled_template(locals = {}) + @src + end + + def self.register_as(*names) + ::Tilt.register(self, *names.map(&:to_s)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/utils.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/utils.rb new file mode 100644 index 000000000..eddd6df00 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/utils.rb @@ -0,0 +1,91 @@ +# frozen_string_literal: true +begin + require 'cgi/escape' +rescue LoadError +end + +module Temple + # @api public + module Utils + extend self + + # Returns an escaped copy of `html`. + # Strings which are declared as html_safe are not escaped. + # + # @param html [String] The string to escape + # @return [String] The escaped string + def escape_html_safe(html) + s = html.to_s + s.html_safe? || html.html_safe? ? s : escape_html(s) + end + + if defined?(CGI.escapeHTML) + # Returns an escaped copy of `html`. + # + # @param html [String] The string to escape + # @return [String] The escaped string + def escape_html(html) + CGI.escapeHTML(html.to_s) + end + else + # Used by escape_html + # @api private + ESCAPE_HTML = { + '&' => '&', + '"' => '"', + '\'' => ''', + '<' => '<', + '>' => '>' + }.freeze + + ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys) + + # Returns an escaped copy of `html`. + # + # @param html [String] The string to escape + # @return [String] The escaped string + def escape_html(html) + html.to_s.gsub(ESCAPE_HTML_PATTERN, ESCAPE_HTML) + end + end + + # Generate unique variable name + # + # @param prefix [String] Variable name prefix + # @return [String] Variable name + def unique_name(prefix = nil) + @unique_name ||= 0 + prefix ||= (@unique_prefix ||= self.class.name.gsub('::'.freeze, '_'.freeze).downcase) + "_#{prefix}#{@unique_name += 1}" + end + + # Check if expression is empty + # + # @param exp [Array] Temple expression + # @return true if expression is empty + def empty_exp?(exp) + case exp[0] + when :multi + exp[1..-1].all? {|e| empty_exp?(e) } + when :newline + true + else + false + end + end + + def indent_dynamic(text, indent_next, indent, pre_tags = nil) + text = text.to_s + safe = text.respond_to?(:html_safe?) && text.html_safe? + return text if pre_tags && text =~ pre_tags + + level = text.scan(/^\s*/).map(&:size).min + text = text.gsub(/(?!\A)^\s{#{level}}/, '') if level > 0 + + text = text.sub(/\A\s*\n?/, "\n".freeze) if indent_next + text = text.gsub("\n".freeze, indent) + + safe ? text.html_safe : text + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/version.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/version.rb new file mode 100644 index 000000000..571a168e6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/lib/temple/version.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true +module Temple + VERSION = '0.10.4' +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/temple.gemspec b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/temple.gemspec new file mode 100644 index 000000000..5441047ea --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/temple-0.10.4/temple.gemspec @@ -0,0 +1,27 @@ +require File.dirname(__FILE__) + '/lib/temple/version' +require 'date' + +Gem::Specification.new do |s| + s.name = 'temple' + s.version = Temple::VERSION + s.date = Date.today.to_s + + s.authors = ['Magnus Holm', 'Daniel Mendler'] + s.email = ['judofyr@gmail.com', 'mail@daniel-mendler.de'] + s.homepage = 'https://github.com/judofyr/temple' + s.summary = 'Template compilation framework in Ruby' + + s.require_paths = %w(lib) + s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec)/}) } + s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.license = 'MIT' + + s.required_ruby_version = '>= 2.5.0' + + # Tilt is only development dependency because most parts of Temple + # can be used without it. + s.add_development_dependency('tilt') + s.add_development_dependency('rspec') + s.add_development_dependency('rake') + s.add_development_dependency('erubi') +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Gemfile b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Gemfile new file mode 100644 index 000000000..735dba7c2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in test-gem.gemspec +gemspec + +gem 'tins', '~> 1.0.0' # Ruby 1.9 compat diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/History.rdoc b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/History.rdoc new file mode 100644 index 000000000..6efc22f29 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/History.rdoc @@ -0,0 +1,149 @@ +4.0.0 / 2025-01-28 +================== + +- Non-unicode characters are no longer supported. They will be replaced. +- Headings may be set to nil. +- unicode-display-width version 3 supported. + +3.0.2 / 2021-09-19 +================== + +- fix align_column for nil values and colspan + +3.0.1 / 2021-05-10 +================== + +- Support for unicode-display_width 2.0 +- Fix issue where last row of an empty table changed format + +3.0.0 / 2020-01-27 +================== + +- Support for (optional) Unicode border styles on tables. In order to support decent looking Unicode borders, different types of intersections get different types of intersection characters. This has the side effect of subtle formatting differences even for the ASCII table border case due to removal of certain intersections near colspans. + +For example, previously the output of a table may be: + +------+-----+ + | Title | + +------+-----+ + | Char | Num | + +------+-----+ + | a | 1 | + | b | 2 | + | c | 3 | + +------+-----+ + +And now the `+` character above the word Title is removed, as it is no longer considered an intersection: + + +------------+ + | Title | + +------+-----+ + | Char | Num | + +------+-----+ + | a | 1 | + | b | 2 | + +------+-----+ + +- The default border remains an ASCII border for backwards compatibility, however multiple border classes are included / documented, and user defined border types can be applied as needed. + +In support of this update, the following issues were addressed: +- colspan creates conflict with colorize (#95) +- Use nice UTF box-drawing characters by default (#99) + - Note that `AsciiBorder` is stll the default +- Border-left and border-right style (#100) +- Helper function to style as Markdown (#111) + - Achieved using `MarkdownBorder` + +2.0.0 / 2020-10-28 +================== + +- Drops official support for Ruby 1.9.x with and of life on 2015-02-23 +- Drops official support for Ruby 2.0.x with and of life on 2016-02-24 +- Drops official support for Ruby 2.1.x with and of life on 2017-03-31 +- Drops official support for Ruby 2.2.x with and of life on 2018-03-31 +- Drops official support for Ruby 2.3.x with and of life on 2019-03-31 + +1.8.0 / 2017-05-16 +================== + +* Top and bottom borders can be disabled (@kubakrzempek, #83) +* `unicode-display-width` dependency relaxes (@mvz, #88) + +* Readme and docs fixes (@loualrid, #82 and @leoarnold, #86) +* Fixed some test-related warnings (@juanitofatas, #81 and @mvz, #89) + +1.7.3 / 2016-09-21 +================== + +* Fixed compatibility issues for Ruby 1.9, 2.0, 2.1. (@vivekbisen, #80) + +1.7.2 / 2016-09-09 +================== + +* Fix packing table to a minimal width (@vizv, #76) + +1.7.1 / 2016-08-29 +================== + +* Update `unicode-display_width` to fix behavior with signal traps [#78, @jrmhaig] + +1.7.0 / 2016-08-29 +================== + +All props to @vizv for this release! + + * Fixed some spec failures + * Added support for full-width characters (East Asian alphabets, etc) + +1.6.0 / 2016-06-06 +================== + + * Added table styles - margin_left, all_separators. + +1.4.3 / 2011-10-13 +================== + + * Optimize for faster table output. + +1.4.2 / 2010-01-14 +================== + + * Fixed some bugs with colspan + +=== 1.4.1 / 2009-12-18 + +* Fix column alignment with separators. + +=== 1.4.0 / 2009-12-18 + +* Can now add :seperator arbitrarily in a table [thanks splattael] +* Fix common typo: seperator -> separator [thanks splattael] + +=== 1.3.0 / 2009-10-16 + +* Major refactoring (functionality remains the same) + +=== 1.2.0 / 2009-08-06 + +* Added colspan support to table + +=== 1.1.0 / 2009-08-06 + +* Added colspan support to table + +=== 1.1.0 / 2009-07-13 + +* Added Table#== + +=== 1.0.5 / 2009-03-14 + +* Allowing nil to be passed to table for headings +* Revised doc to show that rows can be splatted now +* Misc refactoring + +=== 1.0.3 / 2009-01-15 + +* Moved yield or eval to Terminal::Table initialize where it belongs + +=== 1.0.0 / 2009-01-13 + +* Initial release diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/LICENSE.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/LICENSE.txt new file mode 100644 index 000000000..e888cec5d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2008-2017 TJ Holowaychuk <tj@vision-media.ca> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Manifest b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Manifest new file mode 100644 index 000000000..3cc314071 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Manifest @@ -0,0 +1,27 @@ +Gemfile +History.rdoc +README.rdoc +Rakefile +Todo.rdoc +examples/examples.rb +lib/terminal-table.rb +lib/terminal-table/cell.rb +lib/terminal-table/import.rb +lib/terminal-table/row.rb +lib/terminal-table/separator.rb +lib/terminal-table/style.rb +lib/terminal-table/table.rb +lib/terminal-table/table_helper.rb +lib/terminal-table/version.rb +spec/cell_spec.rb +spec/row_spec.rb +spec/spec_helper.rb +spec/table_helper_spec.rb +spec/table_spec.rb +tasks/docs.rake +tasks/gemspec.rake +tasks/spec.rake +terminal-table.gemspec +terminal-table.sublime-project +terminal-table.sublime-workspace +Manifest diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/README.md new file mode 100644 index 000000000..5f0ecc99d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/README.md @@ -0,0 +1,417 @@ +[![CI status](https://github.com/tj/terminal-table/workflows/CI/badge.svg)](https://github.com/tj/terminal-table/actions) +[![Gem Version](https://badge.fury.io/rb/terminal-table.svg)](https://badge.fury.io/rb/terminal-table) + +# Terminal Table + +## Description + +Terminal Table is a fast and simple, yet feature rich table generator +written in Ruby. It supports ASCII and Unicode formatted tables. + +## Installation + +``` +$ gem install terminal-table +``` +## Usage + +### Basics + +To use Terminal Table: + +```ruby +require 'terminal-table' +``` +To generate a table, provide an array of arrays (which are interpreted as +rows): + +```ruby +rows = [] +rows << ['One', 1] +rows << ['Two', 2] +rows << ['Three', 3] +table = Terminal::Table.new :rows => rows + +# > puts table +# +# +-------+---+ +# | One | 1 | +# | Two | 2 | +# | Three | 3 | +# +-------+---+ +``` +The constructor can also be given a block which is either yielded the Table +object or instance evaluated: + +```ruby +table = Terminal::Table.new do |t| + t.rows = rows +end + +table = Terminal::Table.new do + self.rows = rows +end +``` +Adding rows one by one: + +```ruby +table = Terminal::Table.new do |t| + t << ['One', 1] + t.add_row ['Two', 2] +end +``` +To add separators between rows: + +```ruby +table = Terminal::Table.new do |t| + t << ['One', 1] # Using << (push) as an alias for add_row + t << :separator # Using << with :separator as an alias for add_separator + t.add_row ['Two', 2] + t.add_separator # Note - this version allows setting the separator's border_type + t.add_row ['Three', 3] +end + +# > puts table +# +# +-------+---+ +# | One | 1 | +# +-------+---+ +# | Two | 2 | +# +-------+---+ +# | Three | 3 | +# +-------+---+ +``` +Cells can handle multiline content: + +```ruby +table = Terminal::Table.new do |t| + t << ['One', 1] + t << :separator + t.add_row ["Two\nDouble", 2] + t.add_separator + t.add_row ['Three', 3] +end + +# > puts table +# +# +--------+---+ +# | One | 1 | +# +--------+---+ +# | Two | 2 | +# | Double | | +# +--------+---+ +# | Three | 3 | +# +--------+---+ +``` +### Head + +To add a head to the table: + +```ruby +table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows + +# > puts table +# +# +-------+--------+ +# | Word | Number | +# +-------+--------+ +# | One | 1 | +# | Two | 2 | +# | Three | 3 | +# +-------+--------+ +``` +### Title + +To add a title to the table: + +```ruby +table = Terminal::Table.new :title => "Cheatsheet", :headings => ['Word', 'Number'], :rows => rows + +# > puts table +# +# +---------------------+ +# | Cheatsheet | +# +------------+--------+ +# | Word | Number | +# +------------+--------+ +# | One | 1 | +# | Two | 2 | +# | Three | 3 | +# +------------+--------+ +``` +### Alignment + +To align the second column to the right: + +```ruby +table.align_column(1, :right) + +# > puts table +# +# +-------+--------+ +# | Word | Number | +# +-------+--------+ +# | One | 1 | +# | Two | 2 | +# | Three | 3 | +# +-------+--------+ +``` +To align an individual cell, you specify the cell value in a hash along the +alignment: + +```ruby +table << ["Four", {:value => 4.0, :alignment => :center}] + +# > puts table +# +# +-------+--------+ +# | Word | Number | +# +-------+--------+ +# | One | 1 | +# | Two | 2 | +# | Three | 3 | +# | Four | 4.0 | +# +-------+--------+ +``` +### Style + +To specify style options: + +```ruby +table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows, :style => {:width => 80} + +# > puts table +# +# +--------------------------------------+---------------------------------------+ +# | Word | Number | +# +--------------------------------------+---------------------------------------+ +# | One | 1 | +# | Two | 2 | +# | Three | 3 | +# +--------------------------------------+---------------------------------------+ +``` +And change styles on the fly: + +```ruby +table.style = {:width => 40, :padding_left => 3, :border_x => "=", :border_i => "x"} + +# > puts table +# +# x======================================x +# | Cheatsheet | +# x====================x=================x +# | Word | Number | +# x====================x=================x +# | One | 1 | +# | Two | 2 | +# | Three | 3 | +# x====================x=================x +``` +You can also use styles to add a separator after every row: + +```ruby +table = Terminal::Table.new do |t| + t.add_row [1, 'One'] + t.add_row [2, 'Two'] + t.add_row [3, 'Three'] + t.style = {:all_separators => true} +end + +# > puts table +# +# +---+-------+ +# | 1 | One | +# +---+-------+ +# | 2 | Two | +# +---+-------+ +# | 3 | Three | +# +---+-------+ +``` +You can also use styles to disable top and bottom borders of the table. + +```ruby +table = Terminal::Table.new do |t| + t.headings = ['id', 'name'] + t.rows = [[1, 'One'], [2, 'Two'], [3, 'Three']] + t.style = { :border_top => false, :border_bottom => false } +end + +# > puts table +# | id | name | +# +----+-------+ +# | 1 | One | +# | 2 | Two | +# | 3 | Three | +``` + +And also to disable left and right borders of the table. + +```ruby +table = Terminal::Table.new do |t| + t.headings = ['id', 'name'] + t.rows = [[1, 'One'], [2, 'Two'], [3, 'Three']] + t.style = { :border_left => false, :border_right => false } +end + +# > puts table +# ----+------- +# id | name +# ----+------- +# 1 | One +# 2 | Two +# 3 | Three +# ----+------- +``` + +To change the default style options: + +```ruby +Terminal::Table::Style.defaults = {:width => 80} +``` +All Table objects created afterwards will inherit these defaults. + +### Constructor options and setter methods + +Valid options for the constructor are `:rows`, `:headings`, `:style` and `:title` - +and all options can also be set on the created table object by their setter +method: + +```ruby +table = Terminal::Table.new +table.title = "Cheatsheet" +table.headings = ['Word', 'Number'] +table.rows = rows +table.style = {:width => 40} +``` + +## New Formatting + +### Unicode Table Borders +Support for Unicode 'box art' borders presented a challenge, as the original terminal-table only handled three border types: horizontal (x), vertical (y), and intersection (i). For proper box-art, it became necessary to enable different types of corners/edges for multiple intersection types. + +For the sake of backward compatiblity, the previous interface is still supported, as this gem has been around a long time and making breaking changes would have been inconvenient. The new interface is required for any complex and/or Unicode style bordering. A few variations on border style are supported via some new classes and creation of additional classes (or modification of characters used in existing ones) will allow for customized border types. + +The simplest way to use an alternate border is one of the following: +``` +table.style = { :border => :unicode } +table.style = { :border => :unicode_round } +table.style = { :border => :unicode_thick_edge } +``` + +These are a convenience wrapper around setting border using an instance of a class that inherits from Table::Terminal::Border +``` +table.style = { :border => Terminal::Table::UnicodeBorder.new() } +table.style = { :border => Terminal::Table::UnicodeRoundBorder.new() } +table.style = { :border => Terminal::Table::UnicodeThickEdgeBorder.new() } +``` + +If you define a custom class and wish to use the symbol shortcut, you must namespace within `Terminal::Table` and end your class name with `Border`. + +### Markdown Compatiblity +Per popular request, Markdown formatted tables can be generated by using the following border style: + +``` +table.style = { :border => :markdown } +``` + +### Ascii Borders +Ascii borders are default, but can be explicitly set with: +``` +table.style = { :border => :ascii } +``` + +### Customizing Borders +Inside the `UnicodeBorder` class, there are definitions for a variety of corner/intersection and divider types. + +```ruby +@data = { + nil => nil, + nw: "┌", nx: "─", n: "┬", ne: "┐", + yw: "│", y: "│", ye: "│", + aw: "╞", ax: "═", ai: "╪", ae: "╡", ad: '╤', au: "╧", # double + bw: "┝", bx: "━", bi: "┿", be: "┥", bd: '┯', bu: "┷", # heavy/bold/thick + w: "├", x: "─", i: "┼", e: "┤", dn: "┬", up: "┴", # normal div + sw: "└", sx: "─", s: "┴", se: "┘", + # alternative dots/dashes + x_dot4: '┈', x_dot3: '┄', x_dash: '╌', + bx_dot4: '┉', bx_dot3: '┅', bx_dash: '╍', +} +``` + +Note that many are defined as directional (:nw == north-west), others defined in terms of 'x' or 'y'. +The border that separates headings (below each heading) is of type `:double` and is defined with `a*` entries. +Alternate `:heavy` types that can be applied to separators can be defined with `b*` entries. + +When defining a new set of borders, it's probably easiest to define a new class that inherits from UnicodeBorder and replaces the `@data` Hash. +However, these elements can be these can be overridden by poking setting the Hash, should the need arise: + +``` +table.style = {border: :unicode} +table.style.border[:nw] = '*' # Override the north-west corner of the table +``` + +### Customizing row separators + +Row-separators can now be customized in a variety of ways. The default separator's border_type is referred to as `:div`. Additional separator border types (e.g. `:double`, `:heavy`, `:dash` - see full list below) can be applied to separate the sections (e.g. header/footer/title). + +The separator's `border_type` may be specified when a user-defined separator is added. Alternatively, borders may be adjusted after the table's rows are elaborated, but before the table is rendered. + +Separator `border_type`s can be adjusted to be heavy, use double-lines, and different dash/dot styles. The border type should be one of: + + div dash dot3 dot4 + thick thick_dash thick_dot3 thick_dot4 + heavy heavy_dash heavy_dot3 heavy_dot4 + bold bold_dash bold_dot3 bold_dot4 + double + +To manually set the separator border_type, the `add_separator` method may be called. +```ruby +add_separator(border_type: :heavy_dash) +``` + +Alternatively, if `style: :all_separators` is used at the table level, it may be necessary to elaborate the implicit Separator rows prior to rendering. +```ruby +table = Terminal::Table.new do |t| + t.add_row [1, 'One'] + t.add_row [2, 'Two'] + t.add_row [3, 'Three'] + t.style = {:all_separators => true} +end +rows = table.elaborate_rows +rows[2].border_type = :heavy # modify separator row: emphasize below title +puts table.render +``` + +## Example: Displaying a small CSV spreadsheet + +This example code demonstrates using Terminal-table and CSV to display a small spreadsheet. + +```ruby +#!/usr/bin/env ruby +require "csv" +require "terminal-table" +use_stdin = ARGV[0].nil? || (ARGV[0] == '-') +io_object = use_stdin ? $stdin : File.open(ARGV[0], 'r') +csv = CSV.new(io_object) +csv_array = csv.to_a +user_table = Terminal::Table.new do |v| + v.style = { :border => :unicode_round } # >= v3.0.0 + v.title = "Some Title" + v.headings = csv_array[0] + v.rows = csv_array[1..-1] +end +puts user_table +``` + +See also `examples/show_csv_table.rb` in the source distribution. + +## More examples + +For more examples, please see the `examples` directory included in the +source distribution. + +## Author + +TJ Holowaychuk <tj@vision-media.ca> + +Unicode table support by Ben Bowers https://github.com/nanobowers diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Todo.rdoc b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Todo.rdoc new file mode 100644 index 000000000..071b20227 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/Todo.rdoc @@ -0,0 +1,14 @@ + +== Major: + +* Nothing + +== Minor: + +* Programmatically add separator rows +* Add multi-column sorting +* Change; pre-create Cell and Heading objects to clean up Table a bit + +== Brainstorming: + +* Nothing \ No newline at end of file diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table.rb new file mode 100644 index 000000000..ebea2594f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table.rb @@ -0,0 +1,26 @@ +#-- +# Copyright (c) 2008-2009 TJ Holowaychuk <tj@vision-media.ca> +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +#++ + +%w(cell row separator style table table_helper util version).each do |file| + require_relative "./terminal-table/#{file}" +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/cell.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/cell.rb new file mode 100644 index 000000000..f6cd0bf62 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/cell.rb @@ -0,0 +1,94 @@ +require 'unicode/display_width' + +module Terminal + class Table + class Cell + ## + # Cell value. + + attr_reader :value + + ## + # Column span. + + attr_reader :colspan + + ## + # Initialize with _options_. + + def initialize options = nil + @value, options = options, {} unless Hash === options + @value = options.fetch :value, value + @alignment = options.fetch :alignment, nil + @colspan = options.fetch :colspan, 1 + @width = options.fetch :width, @value.to_s.size + @index = options.fetch :index + @table = options.fetch :table + end + + def alignment? + !@alignment.nil? + end + + def alignment + @alignment || @table.style.alignment || :left + end + + def alignment=(val) + supported = %w(left center right) + if supported.include?(val.to_s) + @alignment = val + else + raise "Aligment must be one of: #{supported.join(' ')}" + end + end + + def align(val, position, length) + positions = { :left => :ljust, :right => :rjust, :center => :center } + val.public_send(positions[position], length) + end + def lines + @value.to_s.encode("utf-8", invalid: :replace).split(/\n/) + end + + ## + # Render the cell. + + def render(line = 0) + left = " " * @table.style.padding_left + right = " " * @table.style.padding_right + display_width = Unicode::DisplayWidth.of(Util::ansi_escape(lines[line])) + render_width = lines[line].to_s.size - display_width + width + align("#{left}#{lines[line]}#{right}", alignment, render_width + @table.cell_padding) + end + alias :to_s :render + + ## + # Returns the longest line in the cell and + # removes all ANSI escape sequences (e.g. color) + + def value_for_column_width_recalc + lines.map{ |s| Util::ansi_escape(s) }.max_by{ |s| Unicode::DisplayWidth.of(s) } + end + + ## + # Returns the width of this cell + + def width + padding = (colspan - 1) * @table.cell_spacing + inner_width = (1..@colspan).to_a.inject(0) do |w, counter| + w + @table.column_width(@index + counter - 1) + end + inner_width + padding + end + + def inspect + fields = %i[alignment colspan index value width].map do |name| + val = self.instance_variable_get('@'+name.to_s) + "@#{name}=#{val.inspect}" + end.join(', ') + return "#<#{self.class} #{fields}>" + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/import.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/import.rb new file mode 100644 index 000000000..33b2791f5 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/import.rb @@ -0,0 +1,3 @@ +require 'terminal-table' #required as some people require this file directly from their Gemfiles + +include Terminal::Table::TableHelper diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/row.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/row.rb new file mode 100644 index 000000000..a54900828 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/row.rb @@ -0,0 +1,66 @@ +module Terminal + class Table + class Row + + ## + # Row cells + + attr_reader :cells + + attr_reader :table + + ## + # Initialize with _width_ and _options_. + + def initialize table, array = [], **_kwargs + @cell_index = 0 + @table = table + @cells = [] + array.each { |item| self << item } + end + + def add_cell item + options = item.is_a?(Hash) ? item : {:value => item} + cell = Cell.new(options.merge(:index => @cell_index, :table => @table)) + @cell_index += cell.colspan + @cells << cell + end + alias << add_cell + + def [] index + cells[index] + end + + def height + cells.map { |c| c.lines.count }.max || 0 + end + + def render + vleft, vcenter, vright = @table.style.vertical + (0...height).to_a.map do |line| + vleft + cells.map do |cell| + cell.render(line) + end.join(vcenter) + vright + end.join("\n") + end + + def number_of_columns + @cells.collect(&:colspan).inject(0, &:+) + end + + # used to find indices where we have table '+' crossings. + # in cases where the colspan > 1, then we will skip over some numbers + # if colspan is always 1, then the list should be incrementing by 1. + # + # skip 0 entry, because it's the left side. + # skip last entry, because it's the right side. + # we only care about "+/T" style crossings. + def crossings + idx = 0 + @cells[0...-1].map { |c| idx += c.colspan } + end + + end + + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/separator.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/separator.rb new file mode 100644 index 000000000..0413925ae --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/separator.rb @@ -0,0 +1,66 @@ +module Terminal + class Table + class Separator < Row + + ## + # `prevrow`, `nextrow` contain references to adjacent rows. + # + # `border_type` is a symbol used to control which type of border is used + # on the separator (:top for top-edge, :bot for bottom-edge, + # :div for interior, and :strong for emphasized-interior) + # + # `implicit` is false for user-added separators, and true for + # implicit/auto-generated separators. + + def initialize(*args, border_type: :div, implicit: false) + super + @prevrow, @nextrow = nil, nil + @border_type = border_type + @implicit = implicit + end + + attr_accessor :border_type + attr_reader :implicit + + def render + left_edge, ctrflat, ctrud, right_edge, ctrdn, ctrup = @table.style.horizontal(border_type) + + prev_crossings = @prevrow.respond_to?(:crossings) ? @prevrow.crossings : [] + next_crossings = @nextrow.respond_to?(:crossings) ? @nextrow.crossings : [] + rval = [left_edge] + numcols = @table.number_of_columns + (0...numcols).each do |idx| + rval << ctrflat * (@table.column_width(idx) + @table.cell_padding) + pcinc = prev_crossings.include?(idx+1) + ncinc = next_crossings.include?(idx+1) + border_center = if pcinc && ncinc + ctrud + elsif pcinc + ctrup + elsif ncinc + ctrdn + elsif !ctrud.empty? + # special case if the center-up-down intersection is empty + # which happens when verticals/intersections are removed. in that case + # we do not want to replace with a flat element so return empty-string in else block + ctrflat + else + '' + end + rval << border_center if idx < numcols-1 + end + + rval << right_edge + rval.join + end + + # Save off neighboring rows, so that we can use them later in determining + # which types of table edges to use. + def save_adjacent_rows(prevrow, nextrow) + @prevrow = prevrow + @nextrow = nextrow + end + + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/style.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/style.rb new file mode 100644 index 000000000..dc897370c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/style.rb @@ -0,0 +1,284 @@ +# coding: utf-8 +require 'forwardable' + +module Terminal + class Table + + class Border + + attr_accessor :data, :top, :bottom, :left, :right + def initialize + @top, @bottom, @left, @right = true, true, true, true + end + def []=(key, val) + @data[key] = val + end + def [](key) + @data[key] + end + def initialize_dup(other) + super + @data = other.data.dup + end + def remove_verticals + self.class.const_get("VERTICALS").each { |key| @data[key] = "" } + self.class.const_get("INTERSECTIONS").each { |key| @data[key] = "" } + end + def remove_horizontals + self.class.const_get("HORIZONTALS").each { |key| @data[key] = "" } + end + + # If @left, return the edge else empty-string. + def maybeleft(key) ; @left ? @data[key] : '' ; end + + # If @right, return the edge else empty-string. + def mayberight(key) ; @right ? @data[key] : '' ; end + + end + + class AsciiBorder < Border + HORIZONTALS = %i[x] + VERTICALS = %i[y] + INTERSECTIONS = %i[i] + + def initialize + super + @data = { x: "-", y: "|", i: "+" } + end + + # Get vertical border elements + # @return [Array] 3-element list of [left, center, right] + def vertical + [maybeleft(:y), @data[:y], mayberight(:y)] # left, center, right + end + + # Get horizontal border elements + # @return [Array] a 6 element list of: [i-left, horizontal-bar, i-up/down, i-right, i-down, i-up] + def horizontal(_type) + x, i = @data[:x], @data[:i] + [maybeleft(:i), x, i, mayberight(:i), i, i] + end + end + + class MarkdownBorder < AsciiBorder + def initialize + super + @top, @bottom = false, false + @data = { x: "-", y: "|", i: "|" } + end + end + + class UnicodeBorder < Border + + ALLOWED_SEPARATOR_BORDER_STYLES = %i[ + top bot + div dash dot3 dot4 + thick thick_dash thick_dot3 thick_dot4 + heavy heavy_dash heavy_dot3 heavy_dot4 + bold bold_dash bold_dot3 bold_dot4 + double + ] + + HORIZONTALS = %i[x sx ax bx nx bx_dot3 bx_dot4 bx_dash x_dot3 x_dot4 x_dash] + VERTICALS = %i[y yw ye] + INTERSECTIONS = %i[nw n ne nd + aw ai ae ad au + bw bi be bd bu + w i e dn up + sw s se su] + def initialize + super + @data = { + nil => nil, + nw: "┌", nx: "─", n: "┬", ne: "┐", + yw: "│", y: "│", ye: "│", + aw: "╞", ax: "═", ai: "╪", ae: "╡", ad: '╤', au: "╧", # double + bw: "┝", bx: "━", bi: "┿", be: "┥", bd: '┯', bu: "┷", # heavy/bold/thick + w: "├", x: "─", i: "┼", e: "┤", dn: "┬", up: "┴", # normal div + sw: "└", sx: "─", s: "┴", se: "┘", + # alternative dots/dashes + x_dot4: '┈', x_dot3: '┄', x_dash: '╌', + bx_dot4: '┉', bx_dot3: '┅', bx_dash: '╍', + } + end + # Get vertical border elements + # @return [Array] 3-element list of [left, center, right] + def vertical + [maybeleft(:yw), @data[:y], mayberight(:ye)] + end + + # Get horizontal border elements + # @return [Array] a 6 element list of: [i-left, horizontal-bar, i-up/down, i-right, i-down, i-up] + def horizontal(type) + raise ArgumentError, "Border type is #{type.inspect}, must be one of #{ALLOWED_SEPARATOR_BORDER_STYLES.inspect}" unless ALLOWED_SEPARATOR_BORDER_STYLES.include?(type) + lookup = case type + when :top + [:nw, :nx, :n, :ne, :n, nil] + when :bot + [:sw, :sx, :s, :se, nil, :s] + when :double + # typically used for the separator below the heading row or above a footer row) + [:aw, :ax, :ai, :ae, :ad, :au] + when :thick, :thick_dash, :thick_dot3, :thick_dot4, + :heavy, :heavy_dash, :heavy_dot3, :heavy_dot4, + :bold, :bold_dash, :bold_dot3, :bold_dot4 + # alternate thick/bold border + xref = type.to_s.sub(/^(thick|heavy|bold)/,'bx').to_sym + [:bw, xref, :bi, :be, :bd, :bu] + when :dash, :dot3, :dot4 + # alternate thin dividers + xref = "x_#{type}".to_sym + [:w, xref, :i, :e, :dn, :up] + else # :div (center, non-emphasized) + [:w, :x, :i, :e, :dn, :up] + end + rval = lookup.map { |key| @data.fetch(key) } + rval[0] = '' unless @left + rval[3] = '' unless @right + rval + end + end + + # Unicode Border With rounded edges + class UnicodeRoundBorder < UnicodeBorder + def initialize + super + @data.merge!({nw: '╭', ne: '╮', sw: '╰', se: '╯'}) + end + end + + # Unicode Border with thick outer edges + class UnicodeThickEdgeBorder < UnicodeBorder + def initialize + super + @data = { + nil => nil, + nw: "┏", nx: "━", n: "┯", ne: "┓", nd: nil, + yw: "┃", y: "│", ye: "┃", + aw: "┣", ax: "═", ai: "╪", ae: "┫", ad: '╤', au: "╧", # double + bw: "┣", bx: "━", bi: "┿", be: "┫", bd: '┯', bu: "┷", # heavy/bold/thick + w: "┠", x: "─", i: "┼", e: "┨", dn: "┬", up: "┴", # normal div + sw: "┗", sx: "━", s: "┷", se: "┛", su: nil, + # alternative dots/dashes + x_dot4: '┈', x_dot3: '┄', x_dash: '╌', + bx_dot4: '┉', bx_dot3: '┅', bx_dash: '╍', + } + end + end + + # A Style object holds all the formatting information for a Table object + # + # To create a table with a certain style, use either the constructor + # option <tt>:style</tt>, the Table#style object or the Table#style= method + # + # All these examples have the same effect: + # + # # by constructor + # @table = Table.new(:style => {:padding_left => 2, :width => 40}) + # + # # by object + # @table.style.padding_left = 2 + # @table.style.width = 40 + # + # # by method + # @table.style = {:padding_left => 2, :width => 40} + # + # To set a default style for all tables created afterwards use Style.defaults= + # + # Terminal::Table::Style.defaults = {:width => 80} + # + class Style + extend Forwardable + def_delegators :@border, :vertical, :horizontal, :remove_verticals, :remove_horizontals + + @@defaults = { + :border => AsciiBorder.new, + :padding_left => 1, :padding_right => 1, + :margin_left => '', + :width => nil, :alignment => nil, + :all_separators => false, + } + + ## settors/gettor for legacy ascii borders + def border_x=(val) ; @border[:x] = val ; end + def border_y=(val) ; @border[:y] = val ; end + def border_i=(val) ; @border[:i] = val ; end + def border_y ; @border[:y] ; end + def border_y_width ; Util::ansi_escape(@border[:y]).length ; end + + # Accessor for instance of Border + attr_reader :border + def border=(val) + if val.is_a? Symbol + # convert symbol name like :foo_bar to get class FooBarBorder + klass_str = val.to_s.split('_').collect(&:capitalize).join + "Border" + begin + klass = Terminal::Table::const_get(klass_str) + @border = klass.new + rescue NameError + raise "Cannot lookup class Terminal::Table::#{klass_str} from symbol #{val.inspect}" + end + else + @border = val + end + end + + def border_top=(val) ; @border.top = val ; end + def border_bottom=(val) ; @border.bottom = val ; end + def border_left=(val) ; @border.left = val ; end + def border_right=(val) ; @border.right = val ; end + + def border_top ; @border.top ; end + def border_bottom ; @border.bottom ; end + def border_left ; @border.left ; end + def border_right ; @border.right ; end + + + attr_accessor :padding_left + attr_accessor :padding_right + + attr_accessor :margin_left + + attr_accessor :width + attr_accessor :alignment + + attr_accessor :all_separators + + + def initialize options = {} + apply self.class.defaults.merge(options) + end + + def apply options + options.each do |m, v| + __send__ "#{m}=", v + end + end + + class << self + def defaults + klass_defaults = @@defaults.dup + # border is an object that needs to be duplicated on instantiation, + # otherwise everything will be referencing the same object-id. + klass_defaults[:border] = klass_defaults[:border].dup + klass_defaults + end + + def defaults= options + @@defaults = defaults.merge(options) + end + + end + + def on_change attr + method_name = :"#{attr}=" + old_method = method method_name + define_singleton_method(method_name) do |value| + old_method.call value + yield attr.to_sym, value + end + end + + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/table.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/table.rb new file mode 100644 index 000000000..560f7faf4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/table.rb @@ -0,0 +1,374 @@ +require 'unicode/display_width' + +module Terminal + class Table + + attr_reader :title + attr_reader :headings + + ## + # Generates a ASCII/Unicode table with the given _options_. + + def initialize options = {}, &block + @elaborated = false + @headings = [] + @rows = [] + @column_widths = [] + self.style = options.fetch :style, {} + self.headings = options.fetch :headings, [] + self.rows = options.fetch :rows, [] + self.title = options.fetch :title, nil + yield_or_eval(&block) if block + + style.on_change(:width) { require_column_widths_recalc } + end + + ## + # Align column _n_ to the given _alignment_ of :center, :left, or :right. + + def align_column n, alignment + # nil forces the column method to return the cell itself + column(n, nil).each do |cell| + cell.alignment = alignment unless cell.alignment? + end + end + + ## + # Add a row. + + def add_row array + row = array == :separator ? Separator.new(self) : Row.new(self, array) + @rows << row + require_column_widths_recalc unless row.is_a?(Separator) + end + alias :<< :add_row + + ## + # Add a separator. + + def add_separator(border_type: :div) + @rows << Separator.new(self, border_type: border_type) + end + + def cell_spacing + cell_padding + style.border_y_width + end + + def cell_padding + style.padding_left + style.padding_right + end + + ## + # Return column _n_. + + def column n, method = :value, array = rows + array.map { |row| + # for each cells in a row, find the column with index + # just greater than the required one, and go back one. + index = col = 0 + row.cells.each do |cell| + break if index > n + index += cell.colspan + col += 1 + end + cell = row[col - 1] + cell && method ? cell.__send__(method) : cell + }.compact + end + + ## + # Return _n_ column including headings. + + def column_with_headings n, method = :value + column n, method, headings_with_rows + end + + ## + # Return columns. + + def columns + (0...number_of_columns).map { |n| column n } + end + + ## + # Return length of column _n_. + + def column_width n + column_widths[n] || 0 + end + alias length_of_column column_width # for legacy support + + ## + # Return total number of columns available. + + def number_of_columns + headings_with_rows.map { |r| r.number_of_columns }.max || 0 + end + + ## + # Set the headings + + def headings= arrays + return if arrays.nil? + + arrays = [arrays] unless arrays.first.is_a?(Array) + @headings = arrays.map do |array| + row = Row.new(self, array) + require_column_widths_recalc + row + end + end + + ## + # Elaborate rows to form an Array of Rows and Separators with adjacency properties added. + # + # This is separated from the String rendering so that certain features may be tweaked + # before the String is built. + + def elaborate_rows + + buffer = style.border_top ? [Separator.new(self, border_type: :top, implicit: true)] : [] + unless @title.nil? + buffer << Row.new(self, [title_cell_options]) + buffer << Separator.new(self, implicit: true) + end + @headings.each do |row| + unless row.cells.empty? + buffer << row + buffer << Separator.new(self, border_type: :double, implicit: true) + end + end + if style.all_separators + @rows.each_with_index do |row, idx| + # last separator is bottom, others are :div + border_type = (idx == @rows.size - 1) ? :bot : :div + buffer << row + buffer << Separator.new(self, border_type: border_type, implicit: true) + end + else + buffer += @rows + buffer << Separator.new(self, border_type: :bot, implicit: true) if style.border_bottom + end + + # After all implicit Separators are inserted we need to save off the + # adjacent rows so that we can decide what type of intersections to use + # based on column spans in the adjacent row(s). + buffer.each_with_index do |r, idx| + if r.is_a?(Separator) + prev_row = idx > 0 ? buffer[idx - 1] : nil + next_row = buffer.fetch(idx + 1, nil) + r.save_adjacent_rows(prev_row, next_row) + end + end + + @elaborated = true + @rows = buffer + end + + ## + # Render the table. + + def render + elaborate_rows unless @elaborated + @rows.map { |r| style.margin_left + r.render.rstrip }.join("\n") + end + alias :to_s :render + + ## + # Return rows without separator rows. + + def rows + @rows.reject { |row| row.is_a? Separator } + end + + def rows= array + @rows = [] + array.each { |arr| self << arr } + end + + def style=(options) + style.apply options + end + + def style + @style ||= Style.new + end + + def title=(title) + @title = title + require_column_widths_recalc + end + + ## + # Check if _other_ is equal to self. _other_ is considered equal + # if it contains the same headings and rows. + + def == other + if other.respond_to? :render and other.respond_to? :rows + self.headings == other.headings and self.rows == other.rows + end + end + + private + + def columns_width + column_widths.inject(0) { |s, i| s + i + cell_spacing } + style.border_y_width + end + + def recalc_column_widths + @require_column_widths_recalc = false + n_cols = number_of_columns + space_width = cell_spacing + return if n_cols == 0 + + # prepare rows + all_rows = headings_with_rows + all_rows << Row.new(self, [title_cell_options]) unless @title.nil? + + # DP states, dp[colspan][index][split_offset] => column_width. + dp = [] + + # prepare initial value for DP. + all_rows.each do |row| + index = 0 + row.cells.each do |cell| + cell_value = cell.value_for_column_width_recalc + cell_width = Unicode::DisplayWidth.of(cell_value.to_s) + colspan = cell.colspan + + # find column width from each single cell. + dp[colspan] ||= [] + dp[colspan][index] ||= [0] # add a fake cell with length 0. + dp[colspan][index][colspan] ||= 0 # initialize column length to 0. + + # the last index `colspan` means width of the single column (split + # at end of each column), not a width made up of multiple columns. + single_column_length = [cell_width, dp[colspan][index][colspan]].max + dp[colspan][index][colspan] = single_column_length + + index += colspan + end + end + + # run DP. + (1..n_cols).each do |colspan| + dp[colspan] ||= [] + (0..n_cols-colspan).each do |index| + dp[colspan][index] ||= [1] + (1...colspan).each do |offset| + # processed level became reverse map from width => [offset, ...]. + left_colspan = offset + left_index = index + left_width = dp[left_colspan][left_index].keys.first + + right_colspan = colspan - left_colspan + right_index = index + offset + right_width = dp[right_colspan][right_index].keys.first + + dp[colspan][index][offset] = left_width + right_width + space_width + end + + # reverse map it for resolution (max width and short offset first). + rmap = {} + dp[colspan][index].each_with_index do |width, offset| + rmap[width] ||= [] + rmap[width] << offset + end + + # sort reversely and store it back. + dp[colspan][index] = Hash[rmap.sort.reverse] + end + end + + resolve = lambda do |colspan, full_width, index = 0| + # stop if reaches the bottom level. + return @column_widths[index] = full_width if colspan == 1 + + # choose best split offset for partition, or second best result + # if first one is not dividable. + candidate_offsets = dp[colspan][index].collect(&:last).flatten + offset = candidate_offsets[0] + offset = candidate_offsets[1] if offset == colspan + + # prepare for next round. + left_colspan = offset + left_index = index + left_width = dp[left_colspan][left_index].keys.first + + right_colspan = colspan - left_colspan + right_index = index + offset + right_width = dp[right_colspan][right_index].keys.first + + # calculate reference column width, give remaining spaces to left. + total_non_space_width = full_width - (colspan - 1) * space_width + ref_column_width = total_non_space_width / colspan + remainder = total_non_space_width % colspan + rem_left_width = [remainder, left_colspan].min + rem_right_width = remainder - rem_left_width + ref_left_width = ref_column_width * left_colspan + + (left_colspan - 1) * space_width + rem_left_width + ref_right_width = ref_column_width * right_colspan + + (right_colspan - 1) * space_width + rem_right_width + + # at most one width can be greater than the reference width. + if left_width <= ref_left_width and right_width <= ref_right_width + # use refernce width (evenly partition). + left_width = ref_left_width + right_width = ref_right_width + else + # the wider one takes its value, shorter one takes the rest. + if left_width > ref_left_width + right_width = full_width - left_width - space_width + else + left_width = full_width - right_width - space_width + end + end + + # run next round. + resolve.call(left_colspan, left_width, left_index) + resolve.call(right_colspan, right_width, right_index) + end + + full_width = dp[n_cols][0].keys.first + unless style.width.nil? + new_width = style.width - space_width - style.border_y_width + if new_width < full_width + raise "Table width exceeds wanted width " + + "of #{style.width} characters." + end + full_width = new_width + end + + resolve.call(n_cols, full_width) + end + + ## + # Return headings combined with rows. + + def headings_with_rows + @headings + rows + end + + def yield_or_eval &block + return unless block + if block.arity > 0 + yield self + else + self.instance_eval(&block) + end + end + + def title_cell_options + {:value => @title, :alignment => :center, :colspan => number_of_columns} + end + + def require_column_widths_recalc + @require_column_widths_recalc = true + end + + def column_widths + recalc_column_widths if @require_column_widths_recalc + @column_widths + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/table_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/table_helper.rb new file mode 100644 index 000000000..5a853259c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/table_helper.rb @@ -0,0 +1,9 @@ +module Terminal + class Table + module TableHelper + def table headings = [], *rows, &block + Terminal::Table.new :headings => headings.to_a, :rows => rows, &block + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/util.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/util.rb new file mode 100644 index 000000000..a584c3d1b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/util.rb @@ -0,0 +1,13 @@ +module Terminal + class Table + module Util + # removes all ANSI escape sequences (e.g. color) + def ansi_escape(line) + line.to_s.gsub(/\x1b(\[|\(|\))[;?0-9]*[0-9A-Za-z]/, ''). + gsub(/\x1b(\[|\(|\))[;?0-9]*[0-9A-Za-z]/, ''). + gsub(/(\x03|\x1a)/, '') + end + module_function :ansi_escape + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/version.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/version.rb new file mode 100644 index 000000000..285fdf16c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/lib/terminal-table/version.rb @@ -0,0 +1,5 @@ +module Terminal + class Table + VERSION = '4.0.0' + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/terminal-table.gemspec b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/terminal-table.gemspec new file mode 100644 index 000000000..d7974ce98 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/terminal-table-4.0.0/terminal-table.gemspec @@ -0,0 +1,25 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'terminal-table/version' + +Gem::Specification.new do |spec| + spec.name = "terminal-table" + spec.version = Terminal::Table::VERSION + spec.authors = ["TJ Holowaychuk", "Scott J. Goldman"] + spec.email = ["tj@vision-media.ca"] + + spec.summary = "Simple, feature rich ascii table generation library" + spec.homepage = "https://github.com/tj/terminal-table" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + spec.require_paths = ["lib"] + + spec.add_development_dependency "bundler", "~> 2" + spec.add_development_dependency "rake", "~> 13.0" + spec.add_development_dependency "rspec", ">= 3.0" + spec.add_development_dependency "pry" + + spec.add_runtime_dependency "unicode-display_width", [">= 1.1.1", "< 4"] +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/COPYING b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/COPYING new file mode 100644 index 000000000..f90e7bd36 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/COPYING @@ -0,0 +1,19 @@ +Copyright (c) 2010-2016 Ryan Tomayko <http://tomayko.com/about> +Copyright (c) 2015-2023 Jeremy Evans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt.rb new file mode 100644 index 000000000..1f462f2db --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt.rb @@ -0,0 +1,192 @@ +# frozen_string_literal: true +require_relative 'tilt/mapping' +require_relative 'tilt/template' + +# Namespace for Tilt. This module is not intended to be included anywhere. +module Tilt + # Current version. + VERSION = '2.6.1' + + EMPTY_ARRAY = [].freeze + private_constant :EMPTY_ARRAY + + EMPTY_HASH = {}.freeze + private_constant :EMPTY_HASH + + @default_mapping = Mapping.new + @extract_fixed_locals = false + + # Replace the default mapping with a finalized version of the default + # mapping. This can be done to improve performance after the template + # libraries you desire to use have already been loaded. Once this is + # is called, all attempts to modify the default mapping will fail. + # This also freezes Tilt itself. + def self.finalize! + return self if @default_mapping.is_a?(FinalizedMapping) + + class << self + prepend(Module.new do + def lazy_map(*) + raise "Tilt.#{__callee__} not supported after Tilt.finalize! has been called" + end + alias register lazy_map + alias register_lazy lazy_map + alias register_pipeline lazy_map + alias prefer lazy_map + end) + end + + @default_mapping = @default_mapping.finalized + + freeze + end + + # @private + def self.lazy_map + @default_mapping.lazy_map + end + + # @see Tilt::Mapping#register + def self.register(template_class, *extensions) + @default_mapping.register(template_class, *extensions) + end + + # @see Tilt::Mapping#register_lazy + def self.register_lazy(class_name, file, *extensions) + @default_mapping.register_lazy(class_name, file, *extensions) + end + + # @see Tilt::Mapping#register_pipeline + def self.register_pipeline(ext, options=EMPTY_HASH) + @default_mapping.register_pipeline(ext, options) + end + + # @see Tilt::Mapping#registered? + def self.registered?(ext) + @default_mapping.registered?(ext) + end + + # @see Tilt::Mapping#new + def self.new(file, line=nil, options=nil, &block) + @default_mapping.new(file, line, options, &block) + end + + # @see Tilt::Mapping#[] + def self.[](file) + @default_mapping[file] + end + + # @see Tilt::Mapping#template_for + def self.template_for(file) + @default_mapping.template_for(file) + end + + # @see Tilt::Mapping#templates_for + def self.templates_for(file) + @default_mapping.templates_for(file) + end + + class << self + # @return [Tilt::Mapping] the main mapping object + attr_reader :default_mapping + + # Whether to extract fixed locals from templates by scanning the + # template content. + attr_accessor :extract_fixed_locals + + # Alias register as prefer for Tilt 1.x compatibility. + alias prefer register + end + + # Extremely simple template cache implementation. Calling applications + # create a Tilt::Cache instance and use #fetch with any set of hashable + # arguments (such as those to Tilt.new): + # + # cache = Tilt::Cache.new + # cache.fetch(path, line, options) { Tilt.new(path, line, options) } + # + # Subsequent invocations return the already loaded template object. + # + # @note + # Tilt::Cache is a thin wrapper around Hash. It has the following + # limitations: + # * Not thread-safe. + # * Size is unbounded. + # * Keys are not copied defensively, and should not be modified after + # being passed to #fetch. More specifically, the values returned by + # key#hash and key#eql? should not change. + # If this is too limiting for you, use a different cache implementation. + class Cache + def initialize + @cache = {} + end + + # Caches a value for key, or returns the previously cached value. + # If a value has been previously cached for key then it is + # returned. Otherwise, block is yielded to and its return value + # which may be nil, is cached under key and returned. + # @yield + # @yieldreturn the value to cache for key + def fetch(*key) + @cache.fetch(key) do + @cache[key] = yield + end + end + + # Clears the cache. + def clear + @cache = {} + end + end + # :nocov: + # TILT3: Remove Tilt::Cache + deprecate_constant :Cache if respond_to?(:deprecate_constant, true) + # :nocov: + + # Template Implementations ================================================ + + # ERB + register_lazy :ERBTemplate, 'tilt/erb', 'erb', 'rhtml' + register_lazy :ErubiTemplate, 'tilt/erubi', 'erb', 'rhtml', 'erubi' + + # Markdown + register_lazy :KramdownTemplate, 'tilt/kramdown', 'markdown', 'mkd', 'md' + register_lazy :RDiscountTemplate, 'tilt/rdiscount', 'markdown', 'mkd', 'md' + register_lazy :RedcarpetTemplate, 'tilt/redcarpet', 'markdown', 'mkd', 'md' + register_lazy :CommonMarkerTemplate, 'tilt/commonmarker', 'markdown', 'mkd', 'md' + register_lazy :PandocTemplate, 'tilt/pandoc', 'markdown', 'mkd', 'md' + + # Rest (sorted by name) + register_lazy :AsciidoctorTemplate, 'tilt/asciidoc', 'ad', 'adoc', 'asciidoc' + register_lazy :BabelTemplate, 'tilt/babel', 'es6', 'babel', 'jsx' + register_lazy :BuilderTemplate, 'tilt/builder', 'builder' + register_lazy :CSVTemplate, 'tilt/csv', 'rcsv' + register_lazy :CoffeeScriptTemplate, 'tilt/coffee', 'coffee' + register_lazy :CoffeeScriptLiterateTemplate, 'tilt/coffee', 'litcoffee' + register_lazy :CreoleTemplate, 'tilt/creole', 'wiki', 'creole' + register_lazy :EtanniTemplate, 'tilt/etanni', 'etn', 'etanni' + register_lazy :HamlTemplate, 'tilt/haml', 'haml' + register_lazy :LiquidTemplate, 'tilt/liquid', 'liquid' + register_lazy :LiveScriptTemplate, 'tilt/livescript','ls', 'livescript' + register_lazy :MarkabyTemplate, 'tilt/markaby', 'mab' + register_lazy :NokogiriTemplate, 'tilt/nokogiri', 'nokogiri' + register_lazy :PlainTemplate, 'tilt/plain', 'html' + register_lazy :PrawnTemplate, 'tilt/prawn', 'prawn' + register_lazy :RDocTemplate, 'tilt/rdoc', 'rdoc' + register_lazy :RadiusTemplate, 'tilt/radius', 'radius' + register_lazy :RedClothTemplate, 'tilt/redcloth', 'textile' + register_lazy :RstPandocTemplate, 'tilt/rst-pandoc', 'rst' + register_lazy :SassTemplate, 'tilt/sass', 'sass' + register_lazy :ScssTemplate, 'tilt/sass', 'scss' + register_lazy :SlimTemplate, 'tilt/slim', 'slim' + register_lazy :StringTemplate, 'tilt/string', 'str' + register_lazy :TypeScriptTemplate, 'tilt/typescript', 'ts', 'tsx' + register_lazy :YajlTemplate, 'tilt/yajl', 'yajl' + + # TILT3: Remove + # Deprecated lazy loading of external template engines + register_lazy 'Tilt::HandlebarsTemplate', 'tilt/_handlebars', 'handlebars', 'hbs' + register_lazy 'Tilt::OrgTemplate', 'tilt/_org', 'org' + register_lazy 'Tilt::OrgTemplate', 'tilt/_emacs_org', 'org' + register_lazy 'Tilt::JbuilderTemplate', 'tilt/_jbuilder', 'jbuilder' +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_emacs_org.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_emacs_org.rb new file mode 100644 index 000000000..bcab8a1bb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_emacs_org.rb @@ -0,0 +1,2 @@ +warn "Lazy loading of emacs org templates is deprecated and will be removed in Tilt 3. Require tilt/emacs_org manually.", uplevel: 1 +require "tilt/emacs_org" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_handlebars.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_handlebars.rb new file mode 100644 index 000000000..47efff8e8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_handlebars.rb @@ -0,0 +1,2 @@ +warn "Lazy loading of handlebars templates is deprecated and will be removed in Tilt 3. Require tilt/handlebars manually.", uplevel: 1 +require "tilt/handlebars" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_jbuilder.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_jbuilder.rb new file mode 100644 index 000000000..d92dcf5a2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_jbuilder.rb @@ -0,0 +1,2 @@ +warn "Lazy loading of jbuilder templates is deprecated and will be removed in Tilt 3. Require tilt/jbuilder manually.", uplevel: 1 +require "tilt/jbuilder" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_org.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_org.rb new file mode 100644 index 000000000..909f611e5 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/_org.rb @@ -0,0 +1,2 @@ +warn "Lazy loading of org templates is deprecated and will be removed in Tilt 3. Require org-ruby manually.", uplevel: 1 +require "org-ruby" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/asciidoc.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/asciidoc.rb new file mode 100644 index 000000000..0684ae0fc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/asciidoc.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +require_relative 'template' +require 'asciidoctor' +# AsciiDoc see: http://asciidoc.org/ + +# Asciidoctor implementation for AsciiDoc see: +# http://asciidoctor.github.com/ +# +# Asciidoctor is an open source, pure-Ruby processor for +# converting AsciiDoc documents or strings into HTML 5, +# DocBook 4.5 and other formats. +Tilt::AsciidoctorTemplate = Tilt::StaticTemplate.subclass do + @options[:header_footer] = false if @options[:header_footer].nil? + Asciidoctor.render(@data, @options) +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/babel.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/babel.rb new file mode 100644 index 000000000..d1e749d1a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/babel.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +require_relative 'template' +require 'babel/transpiler' + +Tilt::BabelTemplate = Tilt::StaticTemplate.subclass(mime_type: 'application/javascript') do + @options[:filename] ||= @file + Babel::Transpiler.transform(@data)["code"] +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/builder.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/builder.rb new file mode 100644 index 000000000..6349a6ca3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/builder.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true +require_relative 'template' +require 'builder' + +module Tilt + # Builder template implementation. + class BuilderTemplate < Template + self.default_mime_type = 'text/xml' + + def prepare + @options[:indent] ||= 2 + end + + def evaluate(scope, locals, &block) + if @data.respond_to?(:to_str) + unless locals[:xml] + locals = Hash[locals] + locals[:xml] = xml_builder + end + return super + end + + xml = locals[:xml] || xml_builder + @data.call(xml) + xml.target! + end + + def precompiled_postamble(locals) + "xml.target!" + end + + def precompiled_template(locals) + @data.to_str + end + + private + + def xml_builder + ::Builder::XmlMarkup.new(options) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/cli.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/cli.rb new file mode 100644 index 000000000..89a6b2540 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/cli.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true +require_relative '../tilt' +require 'optparse' + +module Tilt::CLI + USAGE = (<<USAGE).freeze +Usage: tilt <options> <file> +Process template <file> and write output to stdout. With no <file> or +when <file> is '-', read template from stdin and use the --type option +to determine the template's type. + +Options + -l, --list List template engines + file patterns and exit + -t, --type=<pattern> Use this template engine; required if no <file> + -y, --layout=<file> Use <file> as a layout template + + -D<name>=<value> Define variable <name> as <value> + -d, --define-file=<file> Load YAML from <file> and use for variables + --vars=<ruby> Evaluate <ruby> to Hash and use for variables + + -h, --help Show this help message + +Convert markdown to HTML: + $ tilt foo.markdown > foo.html + +Process ERB template: + $ echo "Answer: <%= 2 + 2 %>" | tilt -t erb + Answer: 4 + +Define variables: + $ echo "Answer: <%= 2 + n %>" | tilt -t erb --vars="{:n=>40}" + Answer: 42 + $ echo "Answer: <%= 2 + n.to_i %>" | tilt -t erb -Dn=40 + Answer: 42 +USAGE + private_constant :USAGE + + # Backbone of the tilt command line utility. Allows mocking input/output + # for simple testing. Returns program exit code. + def self.run(argv: ARGV, stdout: $stdout, stdin: $stdin, stderr: $stderr, script_name: File.basename($0)) + pattern = nil + layout = nil + locals = {} + abort = proc do |msg| + stderr.puts msg + return 1 + end + + OptionParser.new do |o| + o.program_name = script_name + + # list all available template engines + o.on("-l", "--list") do + groups = {} + Tilt.lazy_map.each do |pattern,engines| + engines.each do |engine,| + engine = engine.split('::').last.sub(/Template\z/, '') + (groups[engine] ||= []) << pattern + end + end + groups.sort { |(k1,v1),(k2,v2)| k1 <=> k2 }.each do |engine,files| + stdout.printf "%-20s %s\n", engine, files.sort.join(', ') + end + return 0 + end + + # the template type / pattern + o.on("-t", "--type=PATTERN", String) do |val| + abort.("unknown template type: #{val}") unless Tilt[val] + pattern = val + end + + # pass template output into the specified layout template + o.on("-y", "--layout=FILE", String) do |file| + paths = [file, "~/.tilt/#{file}", "/etc/tilt/#{file}"] + layout = paths. + map { |p| File.expand_path(p) }. + find { |p| File.exist?(p) } + abort.("no such layout: #{file}") if layout.nil? + end + + # define a local variable + o.on("-D", "--define=PAIR", String) do |pair| + key, value = pair.split(/[=:]/, 2) + locals[key.to_sym] = value + end + + # define local variables from YAML or JSON + o.on("-d", "--define-file=FILE", String) do |file| + require 'yaml' + abort.("no such define file: #{file}") unless File.exist? file + hash = File.open(file, 'r:bom|utf-8') { |f| YAML.load(f.read) } + abort.("vars must be a Hash, not instance of #{hash.class}") unless hash.is_a?(Hash) + hash.each { |key, value| locals[key.to_sym] = value } + end + + # define local variables using a Ruby hash + o.on("--vars=RUBY") do |ruby| + hash = eval(ruby) + abort.("vars must be a Hash, not instance of #{hash.class}") unless hash.is_a?(Hash) + hash.each { |key, value| locals[key.to_sym] = value } + end + + o.on_tail("-h", "--help") do + stdout.puts USAGE + return 0 + end + end.parse!(argv) + + file = argv.first || '-' + pattern = file if pattern.nil? + abort.("template type not given. see: #{script_name} --help") if ['-', ''].include?(pattern) + + engine = Tilt[pattern] + abort.("template engine not found for: #{pattern}") unless engine + + template = + engine.new(file) { + if file == '-' + stdin.read + else + File.read(file) + end + } + output = template.render(self, locals) + + # process layout + output = Tilt.new(layout).render(self, locals) { output } if layout + + stdout.write(output) + + 0 + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/coffee.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/coffee.rb new file mode 100644 index 000000000..95dfbd255 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/coffee.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true +require_relative 'template' +require 'coffee_script' + +module Tilt + # CoffeeScript template implementation. See: + # http://coffeescript.org/ + # + # CoffeeScript templates do not support object scopes, locals, or yield. + class CoffeeScriptTemplate < StaticTemplate + self.default_mime_type = 'application/javascript' + + @default_bare = false + class << self + attr_accessor :default_bare + end + + def self.literate? + false + end + + def prepare + if !@options.key?(:bare) and !@options.key?(:no_wrap) + @options[:bare] = self.class.default_bare + end + @options[:literate] ||= self.class.literate? + @output = CoffeeScript.compile(@data, @options) + end + end + + class CoffeeScriptLiterateTemplate < CoffeeScriptTemplate + @default_bare = false + + def self.literate? + true + end + end +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/commonmarker.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/commonmarker.rb new file mode 100644 index 000000000..d55acd176 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/commonmarker.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true +require_relative 'template' +require 'commonmarker' + +if defined?(::Commonmarker) + aliases = { + :smartypants => :smart + }.freeze + parse_opts = [ + :smart, + :default_info_string, + ].freeze + render_opts = [ + :hardbreaks, + :github_pre_lang, + :width, + :unsafe, + :escape, + :sourcepos, + ].freeze + exts = [ + :strikethrough, + :tagfilter, + :table, + :autolink, + :tasklist, + :superscript, + :header_ids, + :footnotes, + :description_lists, + :front_matter_delimiter, + :shortcodes, + ].freeze + + Tilt::CommonMarkerTemplate = Tilt::StaticTemplate.subclass do + parse_options = @options.select { |key, _| parse_opts.include?(key.downcase) }.transform_keys(&:downcase) + parse_options.merge!(@options.select { |key, _| aliases.has_key?(key) }.transform_keys { |key| aliases[key] }) + render_options = @options.select { |key, _| render_opts.include?(key.downcase) }.transform_keys(&:downcase) + extensions = @options.select { |key, _| exts.include?(key) }.transform_keys(&:downcase) + + Commonmarker.to_html(@data, options: { parse: parse_options, render: render_options, extension: extensions }) + end +# :nocov: +else + aliases = { + :smartypants => :SMART + }.freeze + parse_opts = [ + :FOOTNOTES, + :LIBERAL_HTML_TAG, + :SMART, + :smartypants, + :STRIKETHROUGH_DOUBLE_TILDE, + :UNSAFE, + :VALIDATE_UTF8, + ].freeze + render_opts = [ + :FOOTNOTES, + :FULL_INFO_STRING, + :GITHUB_PRE_LANG, + :HARDBREAKS, + :NOBREAKS, + :SAFE, # Removed in v0.18.0 (2018-10-17) + :SOURCEPOS, + :TABLE_PREFER_STYLE_ATTRIBUTES, + :UNSAFE, + ].freeze + exts = [ + :autolink, + :strikethrough, + :table, + :tagfilter, + :tasklist, + ].freeze + + Tilt::CommonMarkerTemplate = Tilt::StaticTemplate.subclass do + extensions = exts.select do |extension| + @options[extension] + end + + parse_options, render_options = [parse_opts, render_opts].map do |opts| + opts = opts.select do |option| + @options[option] + end.map! do |option| + aliases[option] || option + end + + opts = :DEFAULT unless opts.any? + opts + end + + CommonMarker.render_doc(@data, parse_options, extensions).to_html(render_options, extensions) + end +end +# :nocov: diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/creole.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/creole.rb new file mode 100644 index 000000000..4e40aa9bd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/creole.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +require_relative 'template' +require 'creole' + +warn 'tilt/creole is deprecated, as creole requires modifying string literals', uplevel: 1 + +allowed_opts = [:allowed_schemes, :extensions, :no_escape].freeze + +# Creole implementation. See: http://www.wikicreole.org/ +Tilt::CreoleTemplate = Tilt::StaticTemplate.subclass do + opts = {} + allowed_opts.each do |k| + opts[k] = @options[k] if @options[k] + end + Creole::Parser.new(@data, opts).to_html +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/csv.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/csv.rb new file mode 100644 index 000000000..2a9c3e7f5 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/csv.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true +require_relative 'template' +require 'csv' + +module Tilt + + # CSV Template implementation. See: + # http://ruby-doc.org/stdlib/libdoc/csv/rdoc/CSV.html + # + # == Example + # + # # Example of csv template + # tpl = <<-EOS + # # header + # csv << ['NAME', 'ID'] + # + # # data rows + # @people.each do |person| + # csv << [person[:name], person[:id]] + # end + # EOS + # + # @people = [ + # {:name => "Joshua Peek", :id => 1}, + # {:name => "Ryan Tomayko", :id => 2}, + # {:name => "Simone Carletti", :id => 3} + # ] + # + # template = Tilt::CSVTemplate.new { tpl } + # template.render(self) + # + class CSVTemplate < Template + self.default_mime_type = 'text/csv' + + def prepare + @outvar = @options.delete(:outvar) || '_csvout' + end + + def precompiled_template(locals) + <<-RUBY + #{@outvar} = CSV.generate(**#{@options}) do |csv| + #{@data} + end + RUBY + end + + def precompiled(locals) + source, offset = super + [source, offset + 1] + end + + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/erb.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/erb.rb new file mode 100644 index 000000000..a250c6988 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/erb.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true +require_relative 'template' +require 'erb' + +module Tilt + # ERB template implementation. See: + # http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html + class ERBTemplate < Template + SUPPORTS_KVARGS = ::ERB.instance_method(:initialize).parameters.assoc(:key) rescue false + + def prepare + @freeze_string_literals = !!@options[:freeze] + @outvar = @options[:outvar] || '_erbout' + trim = case @options[:trim] + when false + nil + when nil, true + '<>' + else + @options[:trim] + end + @engine = if SUPPORTS_KVARGS + ::ERB.new(@data, trim_mode: trim, eoutvar: @outvar) + # :nocov: + else + ::ERB.new(@data, options[:safe], trim, @outvar) + # :nocov: + end + end + + def precompiled_template(locals) + source = @engine.src + source + end + + def precompiled_preamble(locals) + <<-RUBY + begin + __original_outvar = #{@outvar} if defined?(#{@outvar}) + #{super} + RUBY + end + + def precompiled_postamble(locals) + <<-RUBY + #{super} + ensure + #{@outvar} = __original_outvar + end + RUBY + end + + # ERB generates a line to specify the character coding of the generated + # source in 1.9. Account for this in the line offset. + def precompiled(locals) + source, offset = super + [source, offset + 1] + end + + def freeze_string_literals? + @freeze_string_literals + end + end +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/erubi.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/erubi.rb new file mode 100644 index 000000000..34d788308 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/erubi.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true +require_relative 'template' +require 'erubi' + +module Tilt + # Erubi (a simplified version of Erubis) template implementation. + # See https://github.com/jeremyevans/erubi + # + # ErubiTemplate supports the following additional options, in addition + # to the options supported by the Erubi engine: + # + # :engine_class :: allows you to specify a custom engine class to use + # instead of the default (which is ::Erubi::Engine). + class ErubiTemplate < Template + def prepare + @options[:preamble] = false + @options[:postamble] = false + @options[:ensure] = true + + engine_class = @options[:engine_class] || Erubi::Engine + + # If :freeze option is given, the intent is to setup frozen string + # literals in the template. So enable frozen string literals in the + # code Tilt generates if the :freeze option is given. + if @freeze_string_literals = !!@options[:freeze] + # Passing the :freeze option to Erubi sets the + # frozen-string-literal magic comment, which doesn't have an effect + # with Tilt as Tilt wraps the resulting code. Worse, the magic + # comment appearing not at the top of the file can cause a warning. + # So remove the :freeze option before passing to Erubi. + @options.delete(:freeze) + + # Erubi by default appends .freeze to template literals on Ruby 2.1+, + # but that is not necessary and slows down code when Tilt is using + # frozen string literals, so pass the :freeze_template_literals + # option to not append .freeze. + @options[:freeze_template_literals] = false + end + + @engine = engine_class.new(@data, @options) + @outvar = @engine.bufvar + @src = @engine.src + + @engine + end + + def precompiled_template(locals) + @src + end + + def freeze_string_literals? + @freeze_string_literals + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/etanni.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/etanni.rb new file mode 100644 index 000000000..7d273d8a0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/etanni.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true +require_relative 'template' + +module Tilt + class EtanniTemplate < Template + def prepare + separator = data.hash.abs + chomp = "<<#{separator}.chomp" + start = "\n_out_ << #{chomp}\n" + stop = "\n#{separator}\n" + replacement = "#{stop}\\1#{start}" + + temp = @data.strip + temp.gsub!(/<\?r\s+(.*?)\s+\?>/m, replacement) + + @code = "_out_ = [<<#{separator}.chomp]\n#{temp}#{stop}_out_.join" + end + + def precompiled_template(locals) + @code + end + + def precompiled(locals) + source, offset = super + [source, offset + 1] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/haml.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/haml.rb new file mode 100644 index 000000000..3751a31c7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/haml.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true +require_relative 'template' +require 'haml' + +module Tilt + # Haml template implementation. See: + # http://haml.hamptoncatlin.com/ + if defined?(Haml::Template) && Haml::Template < Tilt::Template + # Haml >= 6 ships its own template, prefer it when available. + HamlTemplate = Haml::Template + else + class HamlTemplate < Template + self.default_mime_type = 'text/html' + + # `Gem::Version.correct?` may return false because of Haml::VERSION #=> "3.1.8 (Separated Sally)". After Haml 4, it's always correct. + if Gem::Version.correct?(Haml::VERSION) && Gem::Version.new(Haml::VERSION) >= Gem::Version.new('5.0.0.beta.2') + def prepare + @options[:filename] = eval_file + @options[:line] = @line + if @options.include?(:outvar) + @options[:buffer] = @options.delete(:outvar) + @options[:save_buffer] = true + end + @engine = ::Haml::TempleEngine.new(@options) + @engine.compile(@data) + end + + def evaluate(scope, locals, &block) + raise ArgumentError, 'invalid scope: must not be frozen' if scope.frozen? + super + end + + def precompiled_template(locals) + @engine.precompiled_with_ambles( + [], + after_preamble: <<-RUBY + __in_erb_template = true + _haml_locals = locals + RUBY + ) + end + else # Following definitions are for Haml <= 4 and deprecated. + def prepare + @options[:filename] = eval_file + @options[:line] = @line + @engine = ::Haml::Engine.new(@data, @options) + end + + def evaluate(scope, locals, &block) + raise ArgumentError, 'invalid scope: must not be frozen' if scope.frozen? + + if @engine.respond_to?(:precompiled_method_return_value, true) + super + else + @engine.render(scope, locals, &block) + end + end + + # Precompiled Haml source. Taken from the precompiled_with_ambles + # method in Haml::Precompiler: + # http://github.com/nex3/haml/blob/master/lib/haml/precompiler.rb#L111-126 + def precompiled_template(locals) + @engine.precompiled + end + + def precompiled_preamble(locals) + local_assigns = super + @engine.instance_eval do + <<-RUBY + begin + extend Haml::Helpers + _hamlout = @haml_buffer = Haml::Buffer.new(haml_buffer, #{options_for_buffer.inspect}) + _erbout = _hamlout.buffer + __in_erb_template = true + _haml_locals = locals + #{local_assigns} + RUBY + end + end + + def precompiled_postamble(locals) + @engine.instance_eval do + <<-RUBY + #{precompiled_method_return_value} + ensure + @haml_buffer = @haml_buffer.upper if haml_buffer + end + RUBY + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/kramdown.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/kramdown.rb new file mode 100644 index 000000000..df0aeaf40 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/kramdown.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +require_relative 'template' +require 'kramdown' + +dumb_quotes = [39, 39, 34, 34].freeze + +# Kramdown Markdown implementation. See: https://kramdown.gettalong.org/ +Tilt::KramdownTemplate = Tilt::StaticTemplate.subclass do + # dup as Krawmdown modifies the passed option with map! + @options[:smart_quotes] = dumb_quotes.dup unless @options[:smartypants] + + Kramdown::Document.new(@data, @options).to_html +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/liquid.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/liquid.rb new file mode 100644 index 000000000..fe65d04c7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/liquid.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +require_relative 'template' +require 'liquid' + +module Tilt + # Liquid template implementation. See: + # http://liquidmarkup.org/ + # + # Liquid is designed to be a *safe* template system and therefore + # does not provide direct access to execuatable scopes. In order to + # support a +scope+, the +scope+ must be able to represent itself + # as a hash by responding to #to_h. If the +scope+ does not respond + # to #to_h it will be ignored. + # + # LiquidTemplate does not support yield blocks. + class LiquidTemplate < Template + def prepare + @options[:line_numbers] = true unless @options.has_key?(:line_numbers) + @engine = ::Liquid::Template.parse(@data, @options) + end + + def evaluate(scope, locs) + locals = {} + if scope.respond_to?(:to_h) + scope.to_h.each{|k, v| locals[k.to_s] = v} + end + locs.each{|k, v| locals[k.to_s] = v} + locals['yield'] = block_given? ? yield : '' + locals['content'] = locals['yield'] + @engine.render(locals) + end + + def allows_script? + false + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/livescript.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/livescript.rb new file mode 100644 index 000000000..ab975f907 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/livescript.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +require_relative 'template' +require 'livescript' + +# LiveScript template implementation. See: +# http://livescript.net/ +# +# LiveScript templates do not support object scopes, locals, or yield. +Tilt::LiveScriptTemplate = Tilt::StaticTemplate.subclass(mime_type: 'application/javascript') do + LiveScript.compile(@data, @options) +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/mapping.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/mapping.rb new file mode 100644 index 000000000..a4cb3b3db --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/mapping.rb @@ -0,0 +1,412 @@ +# frozen_string_literal: true +require_relative 'pipeline' + +module Tilt + # Private internal base class for both Mapping and FinalizedMapping, for the shared methods. + class BaseMapping + # Instantiates a new template class based on the file. + # + # @raise [RuntimeError] if there is no template class registered for the + # file name. + # + # @example + # mapping.new('index.mt') # => instance of MyEngine::Template + # + # @see Tilt::Template.new + def new(file, line=nil, options={}, &block) + if template_class = self[file] + template_class.new(file, line, options, &block) + else + fail "No template engine registered for #{File.basename(file)}" + end + end + + # Looks up a template class based on file name and/or extension. + # + # @example + # mapping['views/hello.erb'] # => Tilt::ERBTemplate + # mapping['hello.erb'] # => Tilt::ERBTemplate + # mapping['erb'] # => Tilt::ERBTemplate + # + # @return [template class] + def [](file) + _, ext = split(file) + ext && lookup(ext) + end + + alias template_for [] + + # Looks up a list of template classes based on file name. If the file name + # has multiple extensions, it will return all template classes matching the + # extensions from the end. + # + # @example + # mapping.templates_for('views/index.haml.erb') + # # => [Tilt::ERBTemplate, Tilt::HamlTemplate] + # + # @return [Array<template class>] + def templates_for(file) + templates = [] + + while true + prefix, ext = split(file) + break unless ext + templates << lookup(ext) + file = prefix + end + + templates + end + + private + + def split(file) + pattern = file.to_s.downcase + full_pattern = pattern.dup + + until registered?(pattern) + return if pattern.empty? + pattern = File.basename(pattern) + pattern.sub!(/\A[^.]*\.?/, '') + end + + prefix_size = full_pattern.size - pattern.size + [full_pattern[0,prefix_size-1], pattern] + end + end + private_constant :BaseMapping + + # Tilt::Mapping associates file extensions with template implementations. + # + # mapping = Tilt::Mapping.new + # mapping.register(Tilt::RDocTemplate, 'rdoc') + # mapping['index.rdoc'] # => Tilt::RDocTemplate + # mapping.new('index.rdoc').render + # + # You can use {#register} to register a template class by file + # extension, {#registered?} to see if a file extension is mapped, + # {#[]} to lookup template classes, and {#new} to instantiate template + # objects. + # + # Mapping also supports *lazy* template implementations. Note that regularly + # registered template implementations *always* have preference over lazily + # registered template implementations. You should use {#register} if you + # depend on a specific template implementation and {#register_lazy} if there + # are multiple alternatives. + # + # mapping = Tilt::Mapping.new + # mapping.register_lazy('RDiscount::Template', 'rdiscount/template', 'md') + # mapping['index.md'] + # # => RDiscount::Template + # + # {#register_lazy} takes a class name, a filename, and a list of file + # extensions. When you try to lookup a template name that matches the + # file extension, Tilt will automatically try to require the filename and + # constantize the class name. + # + # Unlike {#register}, there can be multiple template implementations + # registered lazily to the same file extension. Tilt will attempt to load the + # template implementations in order (registered *last* would be tried first), + # returning the first which doesn't raise LoadError. + # + # If all of the registered template implementations fails, Tilt will raise + # the exception of the first, since that was the most preferred one. + # + # mapping = Tilt::Mapping.new + # mapping.register_lazy('Kramdown::Template', 'kramdown/template', 'md') + # mapping.register_lazy('RDiscount::Template', 'rdiscount/template', 'md') + # mapping['index.md'] + # # => RDiscount::Template + # + # In the previous example we say that RDiscount has a *higher priority* than + # Kramdown. Tilt will first try to `require "rdiscount/template"`, falling + # back to `require "kramdown/template"`. If none of these are successful, + # the first error will be raised. + class Mapping < BaseMapping + LOCK = Mutex.new + + # @private + attr_reader :lazy_map, :template_map + + def initialize + @template_map = Hash.new + @lazy_map = Hash.new { |h, k| h[k] = [] } + end + + # @private + def initialize_copy(other) + LOCK.synchronize do + @template_map = other.template_map.dup + @lazy_map = other.lazy_map.dup + end + end + + # Return a finalized mapping. A finalized mapping will only include + # support for template libraries already loaded, and will not + # allow registering new template libraries or lazy loading template + # libraries not yet loaded. Finalized mappings improve performance + # by not requiring synchronization and ensure that the mapping will + # not attempt to load additional files (useful when restricting + # file system access after template libraries in use are loaded). + def finalized + LOCK.synchronize{@lazy_map.dup}.each do |pattern, classes| + register_defined_classes(LOCK.synchronize{classes.map(&:first)}, pattern) + end + + # Check if a template class is already present + FinalizedMapping.new(LOCK.synchronize{@template_map.dup}.freeze) + end + + # Registers a lazy template implementation by file extension. You + # can have multiple lazy template implementations defined on the + # same file extension, in which case the template implementation + # defined *last* will be attempted loaded *first*. + # + # @param class_name [String] Class name of a template class. + # @param file [String] Filename where the template class is defined. + # @param extensions [Array<String>] List of extensions. + # @return [void] + # + # @example + # mapping.register_lazy 'MyEngine::Template', 'my_engine/template', 'mt' + # + # defined?(MyEngine::Template) # => false + # mapping['index.mt'] # => MyEngine::Template + # defined?(MyEngine::Template) # => true + def register_lazy(class_name, file, *extensions) + # Internal API + if class_name.is_a?(Symbol) + Tilt.autoload class_name, file + class_name = "Tilt::#{class_name}" + end + + v = [class_name, file].freeze + extensions.each do |ext| + LOCK.synchronize{@lazy_map[ext].unshift(v)} + end + end + + # Registers a template implementation by file extension. There can only be + # one template implementation per file extension, and this method will + # override any existing mapping. + # + # @param template_class + # @param extensions [Array<String>] List of extensions. + # @return [void] + # + # @example + # mapping.register MyEngine::Template, 'mt' + # mapping['index.mt'] # => MyEngine::Template + def register(template_class, *extensions) + if template_class.respond_to?(:to_str) + # Support register(ext, template_class) too + extensions, template_class = [template_class], extensions[0] + end + + extensions.each do |ext| + ext = ext.to_s + LOCK.synchronize do + @template_map[ext] = template_class + end + end + end + + # Register a new template class using the given extension that + # represents a pipeline of multiple existing template, where the + # output from the previous template is used as input to the next + # template. + # + # This will register a template class that processes the input + # with the *erb* template processor, and takes the output of + # that and feeds it to the *scss* template processor, returning + # the output of the *scss* template processor as the result of + # the pipeline. + # + # @param ext [String] Primary extension to register + # @option :templates [Array<String>] Extensions of templates + # to execute in order (defaults to the ext.split('.').reverse) + # @option :extra_exts [Array<String>] Additional extensions to register + # @option String [Hash] Options hash for individual template in the + # pipeline (key is extension). + # @return [void] + # + # @example + # mapping.register_pipeline('scss.erb') + # mapping.register_pipeline('scss.erb', 'erb'=>{:outvar=>'@foo'}) + # mapping.register_pipeline('scsserb', :extra_exts => 'scss.erb', + # :templates=>['erb', 'scss']) + def register_pipeline(ext, options=EMPTY_HASH) + templates = options[:templates] || ext.split('.').reverse + templates = templates.map{|t| [self[t], options[t] || EMPTY_HASH]} + + klass = Class.new(Pipeline) + klass.send(:const_set, :TEMPLATES, templates) + + register(klass, ext, *Array(options[:extra_exts])) + klass + end + + # Unregisters an extension. This removes the both normal registrations + # and lazy registrations. + # + # @param extensions [Array<String>] List of extensions. + # @return nil + # + # @example + # mapping.register MyEngine::Template, 'mt' + # mapping['index.mt'] # => MyEngine::Template + # mapping.unregister('mt') + # mapping['index.mt'] # => nil + def unregister(*extensions) + extensions.each do |ext| + ext = ext.to_s + LOCK.synchronize do + @template_map.delete(ext) + @lazy_map.delete(ext) + end + end + + nil + end + + # Checks if a file extension is registered (either eagerly or + # lazily) in this mapping. + # + # @param ext [String] File extension. + # + # @example + # mapping.registered?('erb') # => true + # mapping.registered?('nope') # => false + def registered?(ext) + ext_downcase = ext.downcase + LOCK.synchronize{@template_map.has_key?(ext_downcase)} or lazy?(ext) + end + + # Finds the extensions the template class has been registered under. + # @param [template class] template_class + def extensions_for(template_class) + res = [] + LOCK.synchronize{@template_map.to_a}.each do |ext, klass| + res << ext if template_class == klass + end + LOCK.synchronize{@lazy_map.to_a}.each do |ext, choices| + res << ext if LOCK.synchronize{choices.dup}.any? { |klass, file| template_class.to_s == klass } + end + res.uniq! + res + end + + private + + def lazy?(ext) + ext = ext.downcase + LOCK.synchronize{@lazy_map.has_key?(ext) && !@lazy_map[ext].empty?} + end + + def lookup(ext) + LOCK.synchronize{@template_map[ext]} || lazy_load(ext) + end + + def register_defined_classes(class_names, pattern) + class_names.each do |class_name| + template_class = constant_defined?(class_name) + if template_class + register(template_class, pattern) + yield template_class if block_given? + end + end + end + + def lazy_load(pattern) + choices = LOCK.synchronize{@lazy_map[pattern].dup} + + # Check if a template class is already present + register_defined_classes(choices.map(&:first), pattern) do |template_class| + return template_class + end + + first_failure = nil + + # Load in order + choices.each do |class_name, file| + begin + require file + # It's safe to eval() here because constant_defined? will + # raise NameError on invalid constant names + template_class = eval(class_name) + rescue LoadError => ex + first_failure ||= ex + else + register(template_class, pattern) + return template_class + end + end + + raise first_failure + end + + # The proper behavior (in MRI) for autoload? is to + # return `false` when the constant/file has been + # explicitly required. + # + # However, in JRuby it returns `true` even after it's + # been required. In that case it turns out that `defined?` + # returns `"constant"` if it exists and `nil` when it doesn't. + # This is actually a second bug: `defined?` should resolve + # autoload (aka. actually try to require the file). + # + # We use the second bug in order to resolve the first bug. + + def constant_defined?(name) + name.split('::').inject(Object) do |scope, n| + return false if scope.autoload?(n) || !scope.const_defined?(n) + scope.const_get(n) + end + end + end + + # Private internal class for finalized mappings, which are frozen and + # cannot be modified. + class FinalizedMapping < BaseMapping + # Set the template map to use. The template map should already + # be frozen, but this is an internal class, so it does not + # explicitly check for that. + def initialize(template_map) + @template_map = template_map + freeze + end + + # Returns receiver, since instances are always frozen. + def dup + self + end + + # Returns receiver, since instances are always frozen. + def clone(freeze: false) + self + end + + # Return whether the given file extension has been registered. + def registered?(ext) + @template_map.has_key?(ext.downcase) + end + + # Returns an aarry of all extensions the template class will + # be used for. + def extensions_for(template_class) + res = [] + @template_map.each do |ext, klass| + res << ext if template_class == klass + end + res.uniq! + res + end + + private + + def lookup(ext) + @template_map[ext] + end + end + private_constant :FinalizedMapping +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/markaby.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/markaby.rb new file mode 100644 index 000000000..5dbdd45c4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/markaby.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true +require_relative 'template' +require 'markaby' + +module Tilt + # Markaby + # http://github.com/markaby/markaby + class MarkabyTemplate < Template + def self.builder_class + @builder_class ||= Class.new(Markaby::Builder) do + def __capture_markaby_tilt__(&block) + __run_markaby_tilt__ do + text capture(&block) + end + end + end + end + + def evaluate(scope, locals, &block) + builder = self.class.builder_class.new({}, scope) + builder.locals = locals + + if @data.kind_of? Proc + (class << builder; self end).send(:define_method, :__run_markaby_tilt__, &@data) + else + builder.instance_eval <<-CODE, __FILE__, __LINE__ + def __run_markaby_tilt__ + #{@data} + end + CODE + end + + if block + builder.__capture_markaby_tilt__(&block) + else + builder.__run_markaby_tilt__ + end + + builder.to_s + end + end +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/nokogiri.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/nokogiri.rb new file mode 100644 index 000000000..fac92bbd7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/nokogiri.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +require_relative 'template' +require 'nokogiri' + +module Tilt + # Nokogiri template implementation. See: + # http://nokogiri.org/ + class NokogiriTemplate < Template + DOCUMENT_HEADER = /\A<\?xml version=\"1\.0\"\?>\n?/ + self.default_mime_type = 'text/xml' + + def evaluate(scope, locals) + if @data.respond_to?(:to_str) + if block_given? + super(scope, locals){yield.sub(DOCUMENT_HEADER, "")} + else + super + end + else + ::Nokogiri::XML::Builder.new(&@data).to_xml + end + end + + def precompiled_preamble(locals) + return super if locals.include? :xml + "xml = ::Nokogiri::XML::Builder.new { |xml| }\n#{super}" + end + + def precompiled_postamble(locals) + "xml.to_xml" + end + + def precompiled_template(locals) + @data.to_str + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/pandoc.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/pandoc.rb new file mode 100644 index 000000000..4572a8eee --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/pandoc.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true +require_relative 'template' +require 'pandoc-ruby' + +# Pandoc markdown implementation. See: http://pandoc.org/ +Tilt::PandocTemplate = Tilt::StaticTemplate.subclass do + # turn options hash into an array + # Map tilt options to pandoc options + # Replace hash keys with value true with symbol for key + # Remove hash keys with value false + # Leave other hash keys untouched + pandoc_options = [] + from = "markdown" + smart_extension = "-smart" + @options.each do |k,v| + case k + when :smartypants + smart_extension = "+smart" if v + when :escape_html + from = "markdown-raw_html" if v + when :commonmark + from = "commonmark" if v + when :markdown_strict + from = "markdown_strict" if v + else + case v + when true + pandoc_options << k + when false + # do nothing + else + pandoc_options << { k => v } + end + end + end + pandoc_options << { :f => from + smart_extension } + + PandocRuby.new(@data, *pandoc_options).to_html.strip +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/pipeline.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/pipeline.rb new file mode 100644 index 000000000..6d6621f47 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/pipeline.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true +require_relative 'template' + +module Tilt + # Superclass used for pipeline templates. Should not be used directly. + class Pipeline < Template + def prepare + @pipeline = self.class::TEMPLATES.inject(proc{|*| data}) do |data, (klass, options)| + proc do |s,l,&sb| + klass.new(file, line, options, &proc{|*| data.call(s, l, &sb)}).render(s, l, &sb) + end + end + end + + def evaluate(scope, locals, &block) + @pipeline.call(scope, locals, &block) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/plain.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/plain.rb new file mode 100644 index 000000000..6414b1033 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/plain.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +require_relative 'template' + +# Raw text (no template functionality). +Tilt::PlainTemplate = Tilt::StaticTemplate.subclass{@data} diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/prawn.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/prawn.rb new file mode 100644 index 000000000..35ad8a332 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/prawn.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true +require_relative 'template' +require 'prawn' + +module Tilt + # Prawn template implementation. See: http://prawnpdf.org + class PrawnTemplate < Template + self.default_mime_type = 'application/pdf' + + def prepare + @options[:page_size] = 'A4' unless @options.has_key?(:page_size) + @options[:page_layout] = :portrait unless @options.has_key?(:page_layout) + @engine = ::Prawn::Document.new(@options) + end + + def evaluate(scope, locals, &block) + pdf = @engine + locals = locals.dup + locals[:pdf] = pdf + super + pdf.render + end + + def precompiled_template(locals) + @data.to_str + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/radius.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/radius.rb new file mode 100644 index 000000000..fb07d0e37 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/radius.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true +require_relative 'template' +require 'radius' + +module Tilt + # Radius Template + # http://github.com/jlong/radius/ + class RadiusTemplate < Template + class ContextClass < Radius::Context + attr_accessor :tilt_scope + + def tag_missing(name, attributes) + tilt_scope.__send__(name) + end + + def dup + i = super + i.tilt_scope = tilt_scope + i + end + end + + def evaluate(scope, locals, &block) + context = ContextClass.new + context.tilt_scope = scope + context.define_tag("yield", &block) if block + locals.each do |tag, value| + context.define_tag(tag) do + value + end + end + + @options[:tag_prefix] = 'r' unless @options.has_key?(:tag_prefix) + Radius::Parser.new(context, @options).parse(@data) + end + + def allows_script? + false + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rdiscount.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rdiscount.rb new file mode 100644 index 000000000..5d59405fc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rdiscount.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +require_relative 'template' +require 'rdiscount' + +aliases = { + :escape_html => :filter_html, + :smartypants => :smart +}.freeze + +_flags = [:smart, :filter_html, :smartypants, :escape_html].freeze + +# Discount Markdown implementation. See: +# http://github.com/rtomayko/rdiscount +# +# RDiscount is a simple text filter. It does not support +scope+ or +# +locals+. The +:smart+ and +:filter_html+ options may be set true +# to enable those flags on the underlying RDiscount object. +Tilt::RDiscountTemplate = Tilt::StaticTemplate.subclass do + flags = _flags.select { |flag| @options[flag] }. + map! { |flag| aliases[flag] || flag } + + RDiscount.new(@data, *flags).to_html +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rdoc.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rdoc.rb new file mode 100644 index 000000000..8da6d11c3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rdoc.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +require_relative 'template' +require 'rdoc' +require 'rdoc/markup' +require 'rdoc/markup/to_html' +require 'rdoc/options' + +# RDoc template. See: https://github.com/ruby/rdoc +Tilt::RDocTemplate = Tilt::StaticTemplate.subclass do + RDoc::Markup::ToHtml.new(RDoc::Options.new, nil).convert(@data).to_s +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/redcarpet.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/redcarpet.rb new file mode 100644 index 000000000..ae82047ff --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/redcarpet.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +require_relative 'template' +require 'redcarpet' + +aliases = {:escape_html => :filter_html, :smartypants => :smart}.freeze + +Tilt::RedcarpetTemplate = Tilt::StaticTemplate.subclass do + aliases.each do |opt, aka| + if options.key?(aka) || !@options.key?(opt) + @options[opt] = @options.delete(aka) + end + end + + # only raise an exception if someone is trying to enable :escape_html + @options.delete(:escape_html) unless @options[:escape_html] + + renderer = @options.delete(:renderer) || ::Redcarpet::Render::HTML.new(@options) + if options.delete(:smartypants) && !(renderer.is_a?(Class) && renderer <= ::Redcarpet::Render::SmartyPants) + renderer = if renderer == ::Redcarpet::Render::XHTML + ::Redcarpet::Render::SmartyHTML.new(:xhtml => true) + elsif renderer == ::Redcarpet::Render::HTML + ::Redcarpet::Render::SmartyHTML + elsif renderer.is_a? Class + Class.new(renderer) { include ::Redcarpet::Render::SmartyPants } + else + renderer.extend ::Redcarpet::Render::SmartyPants + end + end + + Redcarpet::Markdown.new(renderer, @options).render(@data) +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/redcloth.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/redcloth.rb new file mode 100644 index 000000000..69e4156cb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/redcloth.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +require_relative 'template' +require 'redcloth' + +# RedCloth implementation. See: https://github.com/jgarber/redcloth +Tilt::RedClothTemplate = Tilt::StaticTemplate.subclass do + engine = RedCloth.new(@data) + @options.each do |k, v| + m = :"#{k}=" + engine.send(m, v) if engine.respond_to? m + end + engine.to_html +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rst-pandoc.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rst-pandoc.rb new file mode 100644 index 000000000..afff5d7c2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/rst-pandoc.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +require_relative 'template' +require_relative 'pandoc' + +rst = {:f => "rst"}.freeze + +# Pandoc reStructuredText implementation. See: # http://pandoc.org/ +Tilt::RstPandocTemplate = Tilt::StaticTemplate.subclass do + PandocRuby.new(@data, rst).to_html.strip +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/sass.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/sass.rb new file mode 100644 index 000000000..149d0b8ae --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/sass.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true +require_relative 'template' + +module Tilt + # Sass template implementation for generating CSS. See: https://sass-lang.com/ + # + # Sass templates do not support object scopes, locals, or yield. + class SassTemplate < StaticTemplate + self.default_mime_type = 'text/css' + + begin + require 'sass-embedded' + # :nocov: + require 'uri' + + ALLOWED_KEYS = (defined?(::Sass::Compiler) ? ::Sass::Compiler : ::Sass::Embedded). + instance_method(:compile_string). + parameters. + map{|k, v| v if k == :key}. + compact rescue nil + private_constant :ALLOWED_KEYS + + private + + def _prepare_output + ::Sass.compile_string(@data, **sass_options).css + end + + def sass_options + path = File.absolute_path(eval_file) + path = '/' + path unless path.start_with?('/') + opts = @options.dup + opts[:url] = ::URI::File.build([nil, ::URI::DEFAULT_PARSER.escape(path)]).to_s + opts[:syntax] = :indented + opts.delete_if{|k| !ALLOWED_KEYS.include?(k)} if ALLOWED_KEYS + opts + end + rescue LoadError => err + begin + require 'sassc' + Engine = ::SassC::Engine + rescue LoadError + begin + require 'sass' + Engine = ::Sass::Engine + rescue LoadError + raise err + end + end + + private + + def _prepare_output + Engine.new(@data, sass_options).render + end + + def sass_options + @options[:filename] = eval_file + @options[:line] = @line + @options[:syntax] = :sass + @options + end + # :nocov: + end + end + + class ScssTemplate < SassTemplate + self.default_mime_type = 'text/css' + + private + + def sass_options + opts = super + opts[:syntax] = :scss + opts + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/slim.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/slim.rb new file mode 100644 index 000000000..2b50c4c14 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/slim.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +require_relative 'template' +require 'slim' + +Tilt::SlimTemplate = Slim::Template diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/string.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/string.rb new file mode 100644 index 000000000..59b2a2aa3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/string.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +require_relative 'template' + +module Tilt + # The template source is evaluated as a Ruby string. The #{} interpolation + # syntax can be used to generated dynamic output. + class StringTemplate < Template + def prepare + hash = "TILT#{@data.hash.abs}" + @freeze_string_literals = !!@options[:freeze] + @code = String.new("<<#{hash}.chomp\n#{@data}\n#{hash}") + end + + def precompiled_template(locals) + @code + end + + def precompiled(locals) + source, offset = super + [source, offset + 1] + end + + def freeze_string_literals? + @freeze_string_literals + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/template.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/template.rb new file mode 100644 index 000000000..3e19b24cc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/template.rb @@ -0,0 +1,611 @@ +# frozen_string_literal: true +module Tilt + # @private + module CompiledTemplates + end + + # @private + TOPOBJECT = CompiledTemplates + + # @private + LOCK = Mutex.new + + # Base class for template implementations. Subclasses must implement + # the #prepare method and one of the #evaluate or #precompiled_template + # methods. + class Template + # Template source; loaded from a file or given directly. + attr_reader :data + + # The name of the file where the template data was loaded from. + attr_reader :file + + # The line number in #file where template data was loaded from. + attr_reader :line + + # A Hash of template engine specific options. This is passed directly + # to the underlying engine and is not used by the generic template + # interface. + attr_reader :options + + # A path ending in .rb that the template code will be written to, then + # required, instead of being evaled. This is useful for determining + # coverage of compiled template code, or to use static analysis tools + # on the compiled template code. + attr_reader :compiled_path + + class << self + # An empty Hash that the template engine can populate with various + # metadata. + def metadata + @metadata ||= {} + end + + # Use `.metadata[:mime_type]` instead. + def default_mime_type + metadata[:mime_type] + end + + # Use `.metadata[:mime_type] = val` instead. + def default_mime_type=(value) + metadata[:mime_type] = value + end + end + + # Create a new template with the file, line, and options specified. By + # default, template data is read from the file. When a block is given, + # it should read template data and return as a String. When file is nil, + # a block is required. + # + # All arguments are optional. The following options are respected and + # are used by Tilt::Template itself and not the underlying template + # libraries: + # + # :default_encoding :: Force the encoding of the template to the given + # encoding. + # :skip_compiled_encoding_detection :: Do not scan template code for + # an encoding magic comment. + # :fixed_locals :: Force a specific method parameter signature, and call + # the method with a splat of locals, instead of passing + # the locals hash as a positional argument, and + # extracting locals from that. Should be a string + # containing the parameters for the compiled method, + # surrounded by parentheses. Can be set to false to + # disable the scan for embedded fixed locals. + # :extract_fixed_locals :: Whether embedded fixed locals should be scanned for + # and extracted from the template code. + # :default_fixed_locals :: Similar to fixed_locals, but lowest priority, + # only used if :fixed_locals is not provided + # and no embedded locals are found (or scanned for). + # :scope_class :: Force the scope class used for the method. By default, + # uses the class of the scope provided to render. + def initialize(file=nil, line=nil, options=nil) + @file, @line, @options = nil, 1, nil + + process_arg(options) + process_arg(line) + process_arg(file) + + raise ArgumentError, "file or block required" unless @file || block_given? + + @options ||= {} + + # Force a specific scope class, instead of using the class of the provided + # scope as the scope class. + @scope_class = @options.delete :scope_class + + # Force the encoding of the input data + @default_encoding = @options.delete :default_encoding + + # Skip encoding detection from magic comments and forcing that encoding + # for compiled templates + @skip_compiled_encoding_detection = @options.delete :skip_compiled_encoding_detection + + # Compiled path to use. This must be specified as an option if + # providing the :scope_class option and using fixed locals, + # since template compilation occurs during initialization in that case. + if compiled_path = @options.delete(:compiled_path) + self.compiled_path = compiled_path + end + + # load template data and prepare (uses binread to avoid encoding issues) + @data = block_given? ? yield(self) : read_template_file + + if @data.respond_to?(:force_encoding) + if default_encoding + @data = _dup_string_if_frozen(@data) + @data.force_encoding(default_encoding) + end + + if !@data.valid_encoding? + raise Encoding::InvalidByteSequenceError, "#{eval_file} is not valid #{@data.encoding}" + end + end + + set_fixed_locals + prepare + set_compiled_method_cache + end + + # Render the template in the given scope with the locals specified. If a + # block is given, it is typically available within the template via + # +yield+. + def render(scope=nil, locals=nil, &block) + evaluate(scope || Object.new, locals || EMPTY_HASH, &block) + end + + # The basename of the template file. + def basename(suffix='') + File.basename(@file, suffix) if @file + end + + # The template file's basename with all extensions chomped off. + def name + if bname = basename + bname.split('.', 2).first + end + end + + # The filename used in backtraces to describe the template. + def eval_file + @file || '(__TEMPLATE__)' + end + + # Whether the template uses fixed locals. + def fixed_locals? + @fixed_locals ? true : false + end + + # An empty Hash that the template engine can populate with various + # metadata. + def metadata + if respond_to?(:allows_script?) + self.class.metadata.merge(:allows_script => allows_script?) + else + self.class.metadata + end + end + + # Set the prefix to use for compiled paths, similar to using the + # :compiled_path template option. Note that this only + # has affect for future template compilations. When using the + # :scope_class template option, and using fixed_locals, calling + # this after the template is created has no effect, since the + # template is compiled during initialization in that case. It + # is recommended to use the :compiled_path template option + # instead of this method in new code. + def compiled_path=(path) + if path + # Use expanded paths when loading, since that is helpful + # for coverage. Remove any .rb suffix, since that will + # be added back later. + path = File.expand_path(path.sub(/\.rb\z/i, '')) + end + @compiled_path = path + end + + # The compiled method for the locals keys and scope_class provided. + # Returns an UnboundMethod, which can be used to define methods + # directly on the scope class, which are much faster to call than + # Tilt's normal rendering. + def compiled_method(locals_keys, scope_class=nil) + if @fixed_locals + if @scope_class + return @compiled_method + else + key = scope_class + end + elsif @scope_class + key = locals_keys.dup.freeze + else + key = [scope_class, locals_keys].freeze + end + + LOCK.synchronize do + if meth = @compiled_method[key] + return meth + end + end + meth = compile_template_method(locals_keys, scope_class) + LOCK.synchronize do + @compiled_method[key] = meth + end + meth + end + + protected + + # @!group For template implementations + + # The encoding of the source data. Defaults to the + # default_encoding-option if present. You may override this method + # in your template class if you have a better hint of the data's + # encoding. + attr_reader :default_encoding + + def skip_compiled_encoding_detection? + @skip_compiled_encoding_detection + end + + # Do whatever preparation is necessary to setup the underlying template + # engine. Called immediately after template data is loaded. Instance + # variables set in this method are available when #evaluate is called. + # + # Empty by default as some subclasses do not need separate preparation. + def prepare + end + + CLASS_METHOD = Kernel.instance_method(:class) + USE_BIND_CALL = RUBY_VERSION >= '3' + + # Execute the compiled template and return the result string. Template + # evaluation is guaranteed to be performed in the scope object with the + # locals specified and with support for yielding to the block. + # + # This method is only used by source generating templates. Subclasses that + # override render() may not support all features. + def evaluate(scope, locals, &block) + if @fixed_locals + locals_keys = EMPTY_ARRAY + else + locals_keys = locals.keys + locals_keys.sort!{|x, y| x.to_s <=> y.to_s} + end + + unless scope_class = @scope_class + scope_class = case scope + when Object + Module === scope ? scope : scope.class + else + # :nocov: + USE_BIND_CALL ? CLASS_METHOD.bind_call(scope) : CLASS_METHOD.bind(scope).call + # :nocov: + end + end + + evaluate_method(compiled_method(locals_keys, scope_class), scope, locals, &block) + end + + # Generates all template source by combining the preamble, template, and + # postamble and returns a two-tuple of the form: [source, offset], where + # source is the string containing (Ruby) source code for the template and + # offset is the integer line offset where line reporting should begin. + # + # Template subclasses may override this method when they need complete + # control over source generation or want to adjust the default line + # offset. In most cases, overriding the #precompiled_template method is + # easier and more appropriate. + def precompiled(local_keys) + preamble = precompiled_preamble(local_keys) + template = precompiled_template(local_keys) + postamble = precompiled_postamble(local_keys) + source = String.new + + unless skip_compiled_encoding_detection? + # Ensure that our generated source code has the same encoding as the + # the source code generated by the template engine. + template_encoding = extract_encoding(template){|t| template = t} + + if template.encoding != template_encoding + # template should never be frozen here. If it was frozen originally, + # then extract_encoding should yield a dup. + template.force_encoding(template_encoding) + end + end + + source.force_encoding(template.encoding) + source << preamble << "\n" << template << "\n" << postamble + + [source, preamble.count("\n")+1] + end + + # A string containing the (Ruby) source code for the template. The + # default Template#evaluate implementation requires either this + # method or the #precompiled method be overridden. When defined, + # the base Template guarantees correct file/line handling, locals + # support, custom scopes, proper encoding, and support for template + # compilation. + def precompiled_template(local_keys) + raise NotImplementedError + end + + def precompiled_preamble(local_keys) + '' + end + + def precompiled_postamble(local_keys) + '' + end + + # !@endgroup + + private + + if RUBY_VERSION >= '2.3' + def _dup_string_if_frozen(string) + +string + end + # :nocov: + else + def _dup_string_if_frozen(string) + string.frozen? ? string.dup : string + end + end + # :nocov: + + def process_arg(arg) + if arg + case + when arg.respond_to?(:to_str) ; @file = arg.to_str + when arg.respond_to?(:to_int) ; @line = arg.to_int + when arg.respond_to?(:to_hash) ; @options = arg.to_hash.dup + when arg.respond_to?(:path) ; @file = arg.path + when arg.respond_to?(:to_path) ; @file = arg.to_path + else raise TypeError, "Can't load the template file. Pass a string with a path " + + "or an object that responds to 'to_str', 'path' or 'to_path'" + end + end + end + + def read_template_file + data = File.binread(file) + # Set it to the default external (without verifying) + # :nocov: + data.force_encoding(Encoding.default_external) if Encoding.default_external + # :nocov: + data + end + + def set_compiled_method_cache + @compiled_method = if @fixed_locals && @scope_class + # No hash needed, only a single compiled method per template. + compile_template_method(EMPTY_ARRAY, @scope_class) + else + {} + end + end + + def local_extraction(local_keys) + assignments = local_keys.map do |k| + if k.to_s =~ /\A[a-z_][a-zA-Z_0-9]*\z/ + "#{k} = locals[#{k.inspect}]" + else + raise "invalid locals key: #{k.inspect} (keys must be variable names)" + end + end + + s = "locals = locals[:locals]" + if assignments.delete(s) + # If there is a locals key itself named `locals`, delete it from the ordered keys so we can + # assign it last. This is important because the assignment of all other locals depends on the + # `locals` local variable still matching the `locals` method argument given to the method + # created in `#compile_template_method`. + assignments << s + end + + assignments.join("\n") + end + + if USE_BIND_CALL + def evaluate_method(method, scope, locals, &block) + if @fixed_locals + method.bind_call(scope, **locals, &block) + else + method.bind_call(scope, locals, &block) + end + end + # :nocov: + else + def evaluate_method(method, scope, locals, &block) + if @fixed_locals + if locals.empty? + # Empty keyword splat on Ruby 2.0-2.6 passes empty hash + method.bind(scope).call(&block) + else + method.bind(scope).call(**locals, &block) + end + else + method.bind(scope).call(locals, &block) + end + end + end + # :nocov: + + def compile_template_method(local_keys, scope_class=nil) + source, offset = precompiled(local_keys) + if @fixed_locals + method_args = @fixed_locals + else + method_args = "(locals)" + local_code = local_extraction(local_keys) + end + + method_name = "__tilt_#{Thread.current.object_id.abs}" + method_source = String.new + method_source.force_encoding(source.encoding) + + if freeze_string_literals? + method_source << "# frozen-string-literal: true\n" + end + + # Don't indent method source, to avoid indentation warnings when using compiled paths + method_source << "::Tilt::TOPOBJECT.class_eval do\ndef #{method_name}#{method_args}\n#{local_code}\n" + + offset += method_source.count("\n") + method_source << source + method_source << "\nend;end;" + + bind_compiled_method(method_source, offset, scope_class) + unbind_compiled_method(method_name) + end + + def bind_compiled_method(method_source, offset, scope_class) + path = compiled_path + if path && scope_class.name + path = path.dup + + if defined?(@compiled_path_counter) + path << '-' << @compiled_path_counter.succ! + else + @compiled_path_counter = "0".dup + end + path << ".rb" + + # Wrap method source in a class block for the scope, so constant lookup works + if freeze_string_literals? + method_source_prefix = "# frozen-string-literal: true\n" + method_source = method_source.sub(/\A# frozen-string-literal: true\n/, '') + end + method_source = "#{method_source_prefix}class #{scope_class.name}\n#{method_source}\nend" + + load_compiled_method(path, method_source) + else + if path + warn "compiled_path (#{compiled_path.inspect}) ignored on template with anonymous scope_class (#{scope_class.inspect})" + end + + eval_compiled_method(method_source, offset, scope_class) + end + end + + def eval_compiled_method(method_source, offset, scope_class) + (scope_class || Object).class_eval(method_source, eval_file, line - offset) + end + + def load_compiled_method(path, method_source) + # Write to a temporary path specific to the current process, and + # rename after writing. This prevents issues during parallel + # coverage testing. + tmp_path = "#{path}-#{$$}" + File.binwrite(tmp_path, method_source) + File.rename(tmp_path, path) + + # Use load and not require, so unbind_compiled_method does not + # break if the same path is used more than once. + load path + end + + def unbind_compiled_method(method_name) + method = TOPOBJECT.instance_method(method_name) + TOPOBJECT.class_eval { remove_method(method_name) } + method + end + + # Set the fixed locals for the template, which may be nil if no fixed locals can + # be determined. + def set_fixed_locals + fixed_locals = @options.delete(:fixed_locals) + extract_fixed_locals = @options.delete(:extract_fixed_locals) + default_fixed_locals = @options.delete(:default_fixed_locals) + + if fixed_locals.nil? + if extract_fixed_locals.nil? + extract_fixed_locals = Tilt.extract_fixed_locals + end + + if extract_fixed_locals + fixed_locals = extract_fixed_locals() + end + + if fixed_locals.nil? + fixed_locals = default_fixed_locals + end + end + + @fixed_locals = fixed_locals + end + + # Extract fixed locals from the template code string. Should return nil + # if there are no fixed locals specified, or a method argument string + # surrounded by parentheses if there are fixed locals. The method + # argument string will be used when defining the template method if given. + def extract_fixed_locals + if @data.is_a?(String) && (match = /\#\s*locals:\s*(\(.*\))/.match(@data)) + match[1] + end + end + + def extract_encoding(script, &block) + extract_magic_comment(script, &block) || script.encoding + end + + def extract_magic_comment(script) + was_frozen = script.frozen? + script = _dup_string_if_frozen(script) + + if was_frozen + yield script + end + + binary(script) do + script[/\A[ \t]*\#.*coding\s*[=:]\s*([[:alnum:]\-_]+).*$/n, 1] + end + end + + def freeze_string_literals? + false + end + + def binary(string) + original_encoding = string.encoding + string.force_encoding(Encoding::BINARY) + yield + ensure + string.force_encoding(original_encoding) + end + end + + # Static templates are templates that return the same output for every render + # + # Instead of inheriting from the StaticTemplate class, you will use the .subclass + # method with a block which processes @data and returns the transformed value. + # + # Basic example which transforms the template to uppercase: + # + # UppercaseTemplate = Tilt::StaticTemplate.subclass do + # @data.upcase + # end + class StaticTemplate < Template + def self.subclass(mime_type: 'text/html', &block) + Class.new(self) do + self.default_mime_type = mime_type + + private + + define_method(:_prepare_output, &block) + end + end + + # Static templates always return the prepared output. + def render(scope=nil, locals=nil) + @output + end + + # Raise NotImplementedError, since static templates + # do not support compiled methods. + def compiled_method(locals_keys, scope_class=nil) + raise NotImplementedError + end + + # Static templates never allow script. + def allows_script? + false + end + + protected + + def prepare + @output = _prepare_output + end + + private + + # Do nothing, since compiled method cache is not used. + def set_compiled_method_cache + end + + # Do nothing, since fixed locals are not used. + def set_fixed_locals + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/typescript.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/typescript.rb new file mode 100644 index 000000000..19bcc0200 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/typescript.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true +require_relative 'template' +require 'typescript-node' + +Tilt::TypeScriptTemplate = Tilt::StaticTemplate.subclass(mime_type: 'application/javascript') do + option_args = [] + + @options.each do |key, value| + next unless value + + option_args << "--#{key}" + + if value != true + option_args << value.to_s + end + end + + TypeScript::Node.compile(@data, *option_args) +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/yajl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/yajl.rb new file mode 100644 index 000000000..852daa075 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/tilt-2.6.1/lib/tilt/yajl.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true +require_relative 'template' +require 'yajl' + +module Tilt + # Yajl Template implementation + # + # Yajl is a fast JSON parsing and encoding library for Ruby + # See https://github.com/brianmario/yajl-ruby + # + # The template source is evaluated as a Ruby string, + # and the result is converted #to_json. + # + # == Example + # + # # This is a template example. + # # The template can contain any Ruby statement. + # tpl <<-EOS + # @counter = 0 + # + # # The json variable represents the buffer + # # and holds the data to be serialized into json. + # # It defaults to an empty hash, but you can override it at any time. + # json = { + # :"user#{@counter += 1}" => { :name => "Joshua Peek", :id => @counter }, + # :"user#{@counter += 1}" => { :name => "Ryan Tomayko", :id => @counter }, + # :"user#{@counter += 1}" => { :name => "Simone Carletti", :id => @counter }, + # } + # + # # Since the json variable is a Hash, + # # you can use conditional statements or any other Ruby statement + # # to populate it. + # json[:"user#{@counter += 1}"] = { :name => "Unknown" } if 1 == 2 + # + # # The last line doesn't affect the returned value. + # nil + # EOS + # + # template = Tilt::YajlTemplate.new { tpl } + # template.render(self) + # + class YajlTemplate < Template + self.default_mime_type = 'application/json' + + def evaluate(scope, locals, &block) + decorate(super) + end + + def precompiled_preamble(locals) + return super if locals.include? :json + "json = {}\n#{super}" + end + + def precompiled_postamble(locals) + "Yajl::Encoder.new.encode(json)" + end + + def precompiled_template(locals) + @data.to_str + end + + # Decorates the +json+ input according to given +options+. + # + # json - The json String to decorate. + # options - The option Hash to customize the behavior. + # + # Returns the decorated String. + def decorate(json) + callback, variable = @options[:callback], @options[:variable] + if callback && variable + "var #{variable} = #{json}; #{callback}(#{variable});" + elsif variable + "var #{variable} = #{json};" + elsif callback + "#{callback}(#{json});" + else + json + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/CHANGELOG.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/CHANGELOG.md new file mode 100644 index 000000000..70a8fe931 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/CHANGELOG.md @@ -0,0 +1,299 @@ +# CHANGELOG + +## 3.2.0 + +- Unicode 17.0 + +## 3.1.5 + +- Cache Emoji support level for performance reasons #30, patch by @Earlopain: + +## 3.1.4 + +- Fix that skin tone modifiers were ignored when used in a non-ZWJ sequence + context (= single emoji char + modifier) #29 +- Add more docs and specs about modifier handling + +## 3.1.3 + +Better handling of non-UTF-8 strings, patch by @Earlopain: + +- Data with *BINARY* encoding is interpreted as UTF-8, if possible +- Use `invalid: :replace` and `undef: :replace` options when converting to UTF-8 + +## 3.1.2 + +- Performance improvements + +## 3.1.1 + +- Performance improvements + +## 3.1.0 + +**Improve Emoji support:** + +- Emoji modes: Differentiate between well-formed Emoji (`:possible`) and any + ZWJ/modifier sequence (`:all`). The latter is more common and more efficient + to implement. +- Unify `:rgi_{fqe,mqe,uqe}` options to just `:rgi` to keep things simpler (corresponds to + the former `:rgi_uqe` option). Most terminals that want to support the RGI set + will probably want to catch Emoji sequences with missing VS16s. +- Add new `:all_no_vs16` and `:rgi_at` modes to be able to support some terminals + that needs these quirks +- Add alias `emoji: :auto` for `emoji: true` and `emoji: :none` for `emoji: false` +- `:auto` mode: Only consider terminal cells when recommending Emoji support level + (Emoji themselves might display differently) +- `:auto` mode: Set default Emoji mode for unknown/unsupported terminals to `:none` +- Rename `:basic` mode to `:vs16` + +## 3.0.1 + + +- Add WezTerm and foot as good Emoji terminals + +## 3.0.0 + +**Rework Emoji support:** + +- Emoji widths are now enabled by default +- Only reduce Emoji width to 2 when RGI Emoji detected (configurable) +- VS16 turns Emoji characters of width 1 into full-width +- Please note that Emoji parsing has a notable impact on performance. + You can use the `emoji: false` option to disable Emoji adjustments +- Tries to detect terminal's Emoji support level automatically (from ENV vars) + +**Index fixes and updates:** + +- Private-use characters are considered ambiguous (were given width 1 before) +- Fix that a few zero-width ignorable codepoints from recent Unicode were missing +- Consider the following separators to be zero-width: + - U+2028 - LINE SEPARATOR - Zl + - U+2029 - PARAGRAPH SEPARATOR - Zp + +**Other:** + +- Add keyword arguments to `Unicode::DisplayWidth.of`. If you are using a hash + with overwrite values as third parameter, be sure to put it in curly braces. +- Using third parameter or explicit hash as fourth parameter is deprecated, + please migrate to the keyword arguments API +- Gem raises `ArgumentError` for ambiguous values other than 1 or 2 +- Performance optimizations +- Require Ruby 2.5 + +## 2.6.0 + +- Unicode 16 + +## 2.5.0 + +- Unicode 15.1 + +## 2.4.2 + +More performance improvements: + +- Optimize lookup of first 4096 codepoints +- Avoid overwrite lookup if no overwrites are set + +## 2.4.1 + +- Improve general performance! +- Further improve performance for ASCII strings + +*You should really upgrade - it's much faster now!* + +## 2.4.0 +- Improve performance for ASCII-only strings, by @fatkodima +- Require Ruby 2.4 + +## 2.3.0 + +- Unicode 15.0 + +## 2.2.0 + +- Add *Hangul Jamo Extended-B* block to zero-width chars, thanks @ninjalj #22 + +## 2.1.0 + +- Unicode 14.0 + +## 2.0.0 + +Add Support for Ruby 3.0 + +### Breaking Changes + +Some features of this library were marked deprecated for a long time and have been removed with Version 2.0: + +- Aliases of display\_width (…\_size, …\_length) have been removed +- Auto-loading of string core extension has been removed: + +If you are relying on the `String#display_width` string extension to be automatically loaded (old behavior), please load it explicitly now: + +```ruby +require "unicode/display_width/string_ext" +``` + +You could also change your `Gemfile` line to achieve this: + +```ruby +gem "unicode-display_width", require: "unicode/display_width/string_ext" +``` + +## 2.0.0.pre2 + +- Update 2.0 branch to Unicode 13 + +## 2.0.0.pre1 + +Will be published as non-pre version on rubygems.org when Ruby 3.0 is released (December 2020) + +- Introduce new class-based API, which remembers your string-width configuration. See README for details. +- Remove auto-loading of string extension + - You can: `require "unicode/display_width/string_ext"` to continue to use the string extension + - The manual opt-out `require "unicode/display_width/no_string_ext"` is not needed anymore and will + issue a warning in the future +- Remove (already deprecated) String#display_size and String#display_width aliases + +Refactorings / Internal Changes: + +- Freeze string literals +- The Unicode::DisplayWidth now is class, instead of a module, this enables the new config-object API + +## 1.8.0 + +- Unicode 14.0 (last release of 1.x) + +## 1.7.0 + +- Unicode 13 + +## 1.6.1 + +- Fix that ambiguous and overwrite options where ignored for emoji-measuring + +## 1.6.0 + +- Unicode 12.1 + +## 1.5.0 + +- Unicode 12 + +## 1.4.1 + +- Only bundle required lib/* and data/* files in actual rubygem, patch by @tas50 + +## 1.4.0 + +- Unicode 11 + +## 1.3.3 + +- Replace Gem::Util.gunzip with direct zlib implementation + This removes the dependency on rubygems, fixes #17 + +## 1.3.2 + +- Explicitly load rubygems/util, fixes regression in 1.3.1 (autoload issue) + +## 1.3.1 + +- Use `Gem::Util` for `gunzip`, removes deprecation warning, patch by @Schwad + +## 1.3.0 + +- Unicode 10 + +## 1.2.1 + +- Fix bug that `emoji: true` would fail for emoji without modifier + +## 1.2.0 + +- Add zero-width codepoint ranges: U+2060..U+206F, U+FFF0..U+FFF8, U+E0000..U+E0FFF +- Add full-witdh codepoint ranges: U+3400..U+4DBF, U+4E00..U+9FFF, U+F900..U+FAFF, U+20000..U+2FFFD, U+30000..U+3FFFD +- Experimental emoji support using the [unicode-emoji](https://github.com/janlelis/unicode-emoji) gem +- Fix minor bug in index compression scheme + +## 1.1.3 + +- Fix that non-UTF-8 encodings do not throw errors, patch by @windwiny + +## 1.1.2 + +- Reduce memory consumption and increase performance, patch by @rrosenblum + +## 1.1.1 + +- Always load index into memory, fixes #9 + +## 1.1.0 + +- Support Unicode 9.0 + +## 1.0.5 + +- Actually include new index from 1.0.4 + +## 1.0.4 + +- New index format (much smaller) and internal API changes +- Move index generation to a builder plugin for the unicoder gem +- No public API changes + +## 1.0.3 + +- Avoid circular dependency warning + +## 1.0.2 + +- Fix error that gemspec might be invalid under some circumstances (see gh#6) + +## 1.0.1 + +- Inofficially allow Ruby 1.9 + +## 1.0.0 + +- Faster than 0.3.1 +- Advanced determination of character width +- This includes: Treat width of most chars of general categories (Mn, Me, Cf) as 0 +- This includes: Introduce list of characters with special widths +- Allow custom overrides for specific codepoints +- Set required Ruby version to 2.0 +- Add NO_STRING_EXT mode to disable monkey patching +- Internal API & index format changed drastically +- Remove require 'unicode/display_size' (use 'unicode/display_width' instead) + +## 0.3.1 + +- Faster than 0.3.0 +- Deprecate usage of aliases: String#display_size and String#display_length +- Eliminate Ruby warnings (@amatsuda) + +## 0.3.0 + +- Update EastAsianWidth from 7.0 to 8.0 +- Add rake task to update EastAsianWidth.txt +- Move code to generate index from library to Rakefile +- Update project's meta files +- Deprecate requiring 'unicode-display_size' + +## 0.2.0 + +- Update EastAsianWidth from 6.0 to 7.0 +- Don't build index table automatically when not available +- Don't include EastAsianWidth.txt in gem (only index) + + +## 0.1.0 + +- Fix github issue #1 + + +## 0.1.0 + +- Initial release diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/MIT-LICENSE.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/MIT-LICENSE.txt new file mode 100644 index 000000000..7caa2d0ef --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/MIT-LICENSE.txt @@ -0,0 +1,22 @@ +The MIT LICENSE + +Copyright (c) 2011, 2015-2024 Jan Lelis + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/README.md new file mode 100644 index 000000000..0bbff4343 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/README.md @@ -0,0 +1,194 @@ +# Unicode::DisplayWidth [![[version]](https://badge.fury.io/rb/unicode-display_width.svg)](https://badge.fury.io/rb/unicode-display_width) [<img src="https://github.com/janlelis/unicode-display_width/workflows/Test/badge.svg" />](https://github.com/janlelis/unicode-display_width/actions?query=workflow%3ATest) + +Determines the monospace display width of a string in Ruby, which is useful for all kinds of terminal-based applications. The implementation is based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt), the [Emoji specfication](https://www.unicode.org/reports/tr51/) and other data, 100% in Ruby. It does not rely on the OS vendor ([wcwidth](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width in terminals. + +Unicode version: **17.0.0** (September 2025) + +## Gem Version 3 — Improved Emoji Support + +**Emoji support is now enabled by default.** See below for description and configuration possibilities. + +**Unicode::DisplayWidth.of now takes keyword arguments:** { ambiguous:, emoji:, overwrite: } + +See [CHANGELOG](/CHANGELOG.md) for details. + +## Gem Version 2.4.2 — Performance Updates + +**If you use this gem, you should really upgrade to 2.4.2 or newer. It's often 100x faster, sometimes even 1000x and more!** + +This is possible because the gem now detects if you use very basic (and common) characters, like ASCII characters. Furthermore, the character width lookup code has been optimized, so even when the string involves full-width or ambiguous characters, the gem is much faster now. + +## Introduction to Character Widths + +Guessing the correct space a character will consume on terminals is not easy. There is no single standard. Most implementations combine data from [East Asian Width](https://www.unicode.org/reports/tr11/), some [General Categories](https://en.wikipedia.org/wiki/Unicode_character_property#General_Category), and hand-picked adjustments. + +### How this Library Handles Widths + +Further at the top means higher precedence. Please expect changes to this algorithm with every MINOR version update (the X in 1.X.0)! + +Width | Characters | Comment +-------|------------------------------|-------------------------------------------------- +? | (user defined) | Overwrites any other values +? | Emoji | See "How this Library Handles Emoji Width" below +-1 | `"\b"` | Backspace (total width never below 0) +0 | `"\0"`, `"\x05"`, `"\a"`, `"\n"`, `"\v"`, `"\f"`, `"\r"`, `"\x0E"`, `"\x0F"` | [C0 control codes](https://en.wikipedia.org/wiki/C0_and_C1_control_codes#C0_.28ASCII_and_derivatives.29) which do not change horizontal width +1 | `"\u{00AD}"` | SOFT HYPHEN +2 | `"\u{2E3A}"` | TWO-EM DASH +3 | `"\u{2E3B}"` | THREE-EM DASH +0 | General Categories: Mn, Me, Zl, Zp, Cf (non-arabic)| Excludes ARABIC format characters +0 | Derived Property: Default_Ignorable_Code_Point | Ignorable ranges +0 | `"\u{1160}".."\u{11FF}"`, `"\u{D7B0}".."\u{D7FF}"` | HANGUL JUNGSEONG +2 | East Asian Width: F, W | Full-width characters +2 | `"\u{3400}".."\u{4DBF}"`, `"\u{4E00}".."\u{9FFF}"`, `"\u{F900}".."\u{FAFF}"`, `"\u{20000}".."\u{2FFFD}"`, `"\u{30000}".."\u{3FFFD}"` | Full-width ranges +1 or 2 | East Asian Width: A | Ambiguous characters, user defined, default: 1 +1 | All other codepoints | - + +## Install + +Install the gem with: + + $ gem install unicode-display_width + +Or add to your Gemfile: + + gem 'unicode-display_width' + +## Usage + +```ruby +require 'unicode/display_width' + +Unicode::DisplayWidth.of("⚀") # => 1 +Unicode::DisplayWidth.of("一") # => 2 +``` + +### Ambiguous Characters + +The second parameter defines the value returned by characters defined as ambiguous: + +```ruby +Unicode::DisplayWidth.of("·", 1) # => 1 +Unicode::DisplayWidth.of("·", 2) # => 2 +``` + +### Encoding Notes + +- Data with *BINARY* encoding is interpreted as UTF-8, if possible +- Non-UTF-8 strings are converted to UTF-8 before measuring, using the [`{invalid: :replace, undef: :replace}`) options](https://ruby-doc.org/3.3.5/encodings_rdoc.html#label-Encoding+Options) + +### Custom Overwrites + +You can overwrite how to handle specific code points by passing a hash (or even a proc) as `overwrite:` parameter: + +```ruby +Unicode::DisplayWidth.of("a\tb", 1, overwrite: { "\t".ord => 10 })) # => TAB counted as 10, result is 12 +``` + +Please note that using overwrites disables some perfomance optimizations of this gem. + +### Emoji + +If your terminal supports it, the gem detects Emoji and Emoji sequences and adjusts the width of the measured string. This can be disabled by passing `emoji: false` as an argument: + +```ruby +Unicode::DisplayWidth.of "🤾🏽‍♀️", emoji: :all # => 2 +Unicode::DisplayWidth.of "🤾🏽‍♀️", emoji: false # => 5 +``` + +#### How this Library Handles Emoji Width + +There are many Emoji which get constructed by combining other Emoji in a sequence. This makes measuring the width complicated, since terminals might either display the combined Emoji or the separate parts of the Emoji individually. + +Another aspect where terminals disagree is whether Emoji characters which have a text presentation by default (width 1) should be turned into full-width (width 2) when combined with Variation Selector 16 (*U+FEOF*). + +Finally, it varies if Skin Tone Modifiers can be applied to all characters or just to those with the "Emoji Base" property. + +Emoji Type | Width / Comment +------------|---------------- +Basic/Single Emoji character without Variation Selector | No special handling +Basic/Single Emoji character with VS15 (Text) | No special handling +Basic/Single Emoji character with VS16 (Emoji) | 2 or East Asian Width (see table below) +Single Emoji character with Skin Tone Modifier | 2 unless Emoji mode is `:none` or `vs16` +Skin Tone Modifier used in isolation or with invalid base | 2 if Emoji mode is `:rgi` / `:rgi_at` +Emoji Sequence | 2 if Emoji belongs to configured Emoji set (see table below) + +#### Emoji Modes + +The `emoji:` option can be used to configure which type of Emoji should be considered to have a width of 2 and if VS16-Emoji should be widened. Other sequences are treated as non-combined Emoji, so the widths of all partial Emoji add up (e.g. width of one basic Emoji + one skin tone modifier + another basic Emoji). The following Emoji settings can be used: + +`emoji:` Option | VS16-Emoji Width | Emoji Sequences Width / Comment | Example Terminals +----------------|------------------|---------------------------------|------------------ +`true` or `:auto` | - | Automatically use recommended Emoji setting for your terminal | - +`:all` | 2 | 2 for all ZWJ/modifier/keycap sequences, even if they are not well-formed Emoji sequences | iTerm, foot +`:all_no_vs16` | EAW (1 or 2) | 2 for all ZWJ/modifier/keycap sequences, even if they are not well-formed Emoji sequences | WezTerm +`:possible`| 2 | 2 for all possible/well-formed Emoji sequences | ? +`:rgi` | 2 | 2 for all [RGI Emoji](https://www.unicode.org/reports/tr51/#def_rgi_set) sequences | ? +`:rgi_at` | EAW (1 or 2) | 1 or 2: Like `:rgi`, but Emoji sequences starting with a default-text Emoji have EAW | Apple Terminal +`:vs16` | 2 | 2 * number of partial Emoji (sequences never considered to represent a combined Emoji) | kitty? +`false` or `:none` | EAW (1 or 2) | No Emoji adjustments | gnome-terminal, many older terminals + +- *EAW:* East Asian Width +- *RGI Emoji:* Emoji Recommended for General Interchange +- *ZWJ:* Zero-width Joiner: Codepoint `U+200D`,used in many Emoji sequences + +#### Emoji Support in Terminals + +Unfortunately, the level of Emoji support varies a lot between terminals. While some of them are able to display (almost) all Emoji sequences correctly, others fall back to displaying sequences of basic Emoji. When `emoji: true` or `emoji: :auto` is used, the gem will attempt to set the best fitting Emoji setting for you (e.g. `:rgi_at` on "Apple_Terminal" or `false` on Gnome's terminal widget). + +Please note that Emoji display and number of terminal columns used might differs a lot. For example, it might be the case that a terminal does not understand which Emoji to display, but still manages to calculate the proper amount of terminal cells. The automatic Emoji support level per terminal only considers the latter (cursor position), not the actual Emoji image(s) displayed. Please [open an issue](https://github.com/janlelis/unicode-display_width/issues/new) if you notice your terminal application could use a better default value. Also see the [ucs-detect project](https://ucs-detect.readthedocs.io/results.html), which is a great resource that compares various terminal's Unicode/Emoji capabilities. You can visually check how your terminals renders different kind of Emoji types with the [terminal-emoji-width.rb script](https://github.com/janlelis/unicode-display_width/blob/main/misc/terminal-emoji-width.rb). + +**To terminal implementors reading this:** Although the practice of giving all Emoji/ZWJ sequences a width of 2 (`:all` mode described above) has some advantages, it does not lead to a particularly good developer experience. Since there is always the possibility of well-formed Emoji that are currently not supported (non-RGI / future Unicode) appearing, those sequences will take more cells. Instead of overflowing, cutting off sequences or displaying placeholder-Emoji, could it be worthwile to implement the `:rgi` option (only known Emoji get width 2) and give those unknown Emoji the space they need? This would support the idea that the meaning of an unknown Emoji sequence can still be conveyed (without messing up the terminal at the same time). Just a thought… + +### Usage with String Extension + +```ruby +require 'unicode/display_width/string_ext' + +"⚀".display_width # => 1 +'一'.display_width # => 2 +``` + +### Usage with Config Object + +You can use a config object that allows you to save your configuration for later-reuse. This requires an extra line of code, but has the advantage that you'll need to define your string-width options only once: + +```ruby +require 'unicode/display_width' + +display_width = Unicode::DisplayWidth.new( + # ambiguous: 1, + overwrite: { "A".ord => 100 }, + emoji: :all, +) + +display_width.of "⚀" # => 1 +display_width.of "🤠‍🤢" # => 2 +display_width.of "A" # => 100 +``` + +### Usage from the Command-Line + +Use this one-liner to print out display widths for strings from the command-line: + +``` +$ gem install unicode-display_width +$ ruby -r unicode/display_width -e 'puts Unicode::DisplayWidth.of $*[0]' -- "一" +``` +Replace "一" with the actual string to measure + +## Other Implementations & Discussion + +- Python: https://github.com/jquast/wcwidth +- JavaScript: https://github.com/mycoboco/wcwidth.js +- C: https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c +- C for Julia: https://github.com/JuliaLang/utf8proc/issues/2 +- Golang: https://github.com/rivo/uniseg + +See [unicode-x](https://github.com/janlelis/unicode-x) for more Unicode related micro libraries. + +## Copyright & Info + +- Copyright (c) 2011, 2015-2025 Jan Lelis, https://janlelis.com, released under the MIT +license +- Early versions based on runpaint's unicode-data interface: Copyright (c) 2009 Run Paint Run Run +- Unicode data: https://www.unicode.org/copyright.html#Exhibit1 diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/data/display_width.marshal.gz b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/data/display_width.marshal.gz new file mode 100644 index 000000000..6aa6969e0 Binary files /dev/null and b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/data/display_width.marshal.gz differ diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width.rb new file mode 100644 index 000000000..a95a77ee2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width.rb @@ -0,0 +1,247 @@ +# frozen_string_literal: true + +require "unicode/emoji" + +require_relative "display_width/constants" +require_relative "display_width/index" +require_relative "display_width/emoji_support" + +module Unicode + class DisplayWidth + DEFAULT_AMBIGUOUS = 1 + INITIAL_DEPTH = 0x10000 + ASCII_NON_ZERO_REGEX = /[\0\x05\a\b\n-\x0F]/ + ASCII_NON_ZERO_STRING = "\0\x05\a\b\n-\x0F" + ASCII_BACKSPACE = "\b" + AMBIGUOUS_MAP = { + 1 => :WIDTH_ONE, + 2 => :WIDTH_TWO, + } + FIRST_AMBIGUOUS = { + WIDTH_ONE: 768, + WIDTH_TWO: 161, + } + NOT_COMMON_NARROW_REGEX = { + WIDTH_ONE: /[^\u{10}-\u{2FF}]/m, + WIDTH_TWO: /[^\u{10}-\u{A1}]/m, + } + FIRST_4096 = { + WIDTH_ONE: decompress_index(INDEX[:WIDTH_ONE][0][0], 1), + WIDTH_TWO: decompress_index(INDEX[:WIDTH_TWO][0][0], 1), + } + EMOJI_SEQUENCES_REGEX_MAPPING = { + rgi: :REGEX_INCLUDE_MQE_UQE, + rgi_at: :REGEX_INCLUDE_MQE_UQE, + possible: :REGEX_WELL_FORMED, + } + REGEX_EMOJI_VS16 = Regexp.union( + Regexp.compile( + Unicode::Emoji::REGEX_TEXT_PRESENTATION.source + + "(?<![#*0-9])" + + "\u{FE0F}" + ), + Unicode::Emoji::REGEX_EMOJI_KEYCAP + ) + + # ebase = Unicode::Emoji::REGEX_PROP_MODIFIER_BASE.source + REGEX_EMOJI_ALL_SEQUENCES = Regexp.union(/.[\u{1F3FB}-\u{1F3FF}\u{FE0F}]?(\u{200D}.[\u{1F3FB}-\u{1F3FF}\u{FE0F}]?)+|.[\u{1F3FB}-\u{1F3FF}]/, Unicode::Emoji::REGEX_EMOJI_KEYCAP) + REGEX_EMOJI_ALL_SEQUENCES_AND_VS16 = Regexp.union(REGEX_EMOJI_ALL_SEQUENCES, REGEX_EMOJI_VS16) + + # Returns monospace display width of string + def self.of(string, ambiguous = nil, overwrite = nil, old_options = {}, **options) + # Binary strings don't make much sense when calculating display width. + # Assume it's valid UTF-8 + if string.encoding == Encoding::BINARY && !string.force_encoding(Encoding::UTF_8).valid_encoding? + # Didn't work out, go back to binary + string.force_encoding(Encoding::BINARY) + end + + string = string.encode(Encoding::UTF_8, invalid: :replace, undef: :replace) unless string.encoding == Encoding::UTF_8 + options = normalize_options(string, ambiguous, overwrite, old_options, **options) + + width = 0 + + unless options[:overwrite].empty? + width, string = width_custom(string, options[:overwrite]) + end + + if string.ascii_only? + return width + width_ascii(string) + end + + ambiguous_index_name = AMBIGUOUS_MAP[options[:ambiguous]] + + unless string.match?(NOT_COMMON_NARROW_REGEX[ambiguous_index_name]) + return width + string.size + end + + # Retrieve Emoji width + if options[:emoji] != :none + e_width, string = emoji_width( + string, + options[:emoji], + options[:ambiguous], + ) + width += e_width + + unless string.match?(NOT_COMMON_NARROW_REGEX[ambiguous_index_name]) + return width + string.size + end + end + + index_full = INDEX[ambiguous_index_name] + index_low = FIRST_4096[ambiguous_index_name] + first_ambiguous = FIRST_AMBIGUOUS[ambiguous_index_name] + + string.each_codepoint{ |codepoint| + if codepoint > 15 && codepoint < first_ambiguous + width += 1 + elsif codepoint < 0x1001 + width += index_low[codepoint] || 1 + else + d = INITIAL_DEPTH + w = index_full[codepoint / d] + while w.instance_of? Array + w = w[(codepoint %= d) / (d /= 16)] + end + + width += w || 1 + end + } + + # Return result + prevent negative lengths + width < 0 ? 0 : width + end + + # Returns width of custom overwrites and remaining string + def self.width_custom(string, overwrite) + width = 0 + + string = string.each_codepoint.select{ |codepoint| + if overwrite[codepoint] + width += overwrite[codepoint] + nil + else + codepoint + end + }.pack("U*") + + [width, string] + end + + # Returns width for ASCII-only strings. Will consider zero-width control symbols. + def self.width_ascii(string) + if string.match?(ASCII_NON_ZERO_REGEX) + res = string.delete(ASCII_NON_ZERO_STRING).bytesize - string.count(ASCII_BACKSPACE) + return res < 0 ? 0 : res + end + + string.bytesize + end + + # Returns width of all considered Emoji and remaining string + def self.emoji_width(string, mode = :all, ambiguous = DEFAULT_AMBIGUOUS) + res = 0 + + if emoji_set_regex = EMOJI_SEQUENCES_REGEX_MAPPING[mode] + emoji_width_via_possible( + string, + Unicode::Emoji.const_get(emoji_set_regex), + mode == :rgi_at, + ambiguous, + ) + + elsif mode == :all_no_vs16 + no_emoji_string = string.gsub(REGEX_EMOJI_ALL_SEQUENCES){ res += 2; "" } + [res, no_emoji_string] + + elsif mode == :vs16 + no_emoji_string = string.gsub(REGEX_EMOJI_VS16){ res += 2; "" } + [res, no_emoji_string] + + elsif mode == :all + no_emoji_string = string.gsub(REGEX_EMOJI_ALL_SEQUENCES_AND_VS16){ res += 2; "" } + [res, no_emoji_string] + + else + [0, string] + + end + end + + # Match possible Emoji first, then refine + def self.emoji_width_via_possible(string, emoji_set_regex, strict_eaw = false, ambiguous = DEFAULT_AMBIGUOUS) + res = 0 + + # For each string possibly an emoji + no_emoji_string = string.gsub(REGEX_EMOJI_ALL_SEQUENCES_AND_VS16){ |emoji_candidate| + # Check if we have a combined Emoji with width 2 (or EAW an Apple Terminal) + if emoji_candidate == emoji_candidate[emoji_set_regex] + if strict_eaw + res += self.of(emoji_candidate[0], ambiguous, emoji: false) + else + res += 2 + end + "" + + # We are dealing with a default text presentation emoji or a well-formed sequence not matching the above Emoji set + else + if !strict_eaw + # Ensure all explicit VS16 sequences have width 2 + emoji_candidate.gsub!(REGEX_EMOJI_VS16){ res += 2; "" } + end + + emoji_candidate + end + } + + [res, no_emoji_string] + end + + def self.normalize_options(string, ambiguous = nil, overwrite = nil, old_options = {}, **options) + unless old_options.empty? + warn "Unicode::DisplayWidth: Please migrate to keyword arguments - #{old_options.inspect}" + options.merge! old_options + end + + options[:ambiguous] = ambiguous if ambiguous + options[:ambiguous] ||= DEFAULT_AMBIGUOUS + + if options[:ambiguous] != 1 && options[:ambiguous] != 2 + raise ArgumentError, "Unicode::DisplayWidth: Ambiguous width must be 1 or 2" + end + + if overwrite && !overwrite.empty? + warn "Unicode::DisplayWidth: Please migrate to keyword arguments - overwrite: #{overwrite.inspect}" + options[:overwrite] = overwrite + end + options[:overwrite] ||= {} + + if [nil, true, :auto].include?(options[:emoji]) + options[:emoji] = EmojiSupport.recommended + elsif options[:emoji] == false + options[:emoji] = :none + end + + options + end + + def initialize(ambiguous: DEFAULT_AMBIGUOUS, overwrite: {}, emoji: true) + @ambiguous = ambiguous + @overwrite = overwrite + @emoji = emoji + end + + def get_config(**kwargs) + { + ambiguous: kwargs[:ambiguous] || @ambiguous, + overwrite: kwargs[:overwrite] || @overwrite, + emoji: kwargs[:emoji] || @emoji, + } + end + + def of(string, **kwargs) + self.class.of(string, **get_config(**kwargs)) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/constants.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/constants.rb new file mode 100644 index 000000000..d14edfe96 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/constants.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module Unicode + class DisplayWidth + VERSION = "3.2.0" + UNICODE_VERSION = "17.0.0" + DATA_DIRECTORY = File.expand_path(File.dirname(__FILE__) + "/../../../data/") + INDEX_FILENAME = DATA_DIRECTORY + "/display_width.marshal.gz" + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/emoji_support.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/emoji_support.rb new file mode 100644 index 000000000..46f927a3c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/emoji_support.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module Unicode + class DisplayWidth + module EmojiSupport + # Tries to find out which terminal emulator is used to + # set emoji: config to best suiting value + # + # Please also see section in README.md and + # misc/terminal-emoji-width.rb + # + # Please note: Many terminals do not set any ENV vars, + # maybe CSI queries can help? + def self.recommended + @recommended ||= _recommended + end + + def self._recommended + if ENV["CI"] + return :rqi + end + + case ENV["TERM_PROGRAM"] + when "iTerm.app" + return :all + when "Apple_Terminal" + return :rgi_at + when "WezTerm" + return :all_no_vs16 + end + + case ENV["TERM"] + when "contour","foot" + # konsole: all, how to detect? + return :all + when /kitty/ + return :vs16 + end + + if ENV["WT_SESSION"] # Windows Terminal + return :vs16 + end + + # As of last time checked: gnome-terminal, vscode, alacritty + :none + end + + # Maybe: Implement something like https://github.com/jquast/ucs-detect + # which uses the terminal cursor to check for best support level + # at runtime + # def self.detect! + # end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/index.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/index.rb new file mode 100644 index 000000000..f81df7f07 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/index.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require "zlib" +require_relative "constants" + +module Unicode + class DisplayWidth + File.open(INDEX_FILENAME, "rb") do |file| + serialized_data = Zlib::GzipReader.new(file).read + serialized_data.force_encoding Encoding::BINARY + INDEX = Marshal.load(serialized_data) + end + + def self.decompress_index(index, level) + index.flat_map{ |value| + if level > 0 + if value.instance_of?(Array) + value[15] ||= nil + decompress_index(value, level - 1) + else + decompress_index([value] * 16, level - 1) + end + else + if value.instance_of?(Array) + value[15] ||= nil + value + else + [value] * 16 + end + end + } + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/no_string_ext.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/no_string_ext.rb new file mode 100644 index 000000000..26014972a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/no_string_ext.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +warn "You are loading 'unicode-display_width/no_string_ext'\n" \ + "Beginning with version 2.0, this is not necessary anymore\n"\ + "You can just require 'unicode-display_width' now and no\n"\ + "string extension will be loaded" + +require_relative "../display_width" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/reline_ext.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/reline_ext.rb new file mode 100644 index 000000000..3d5507a50 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/reline_ext.rb @@ -0,0 +1,14 @@ +# Experimental +# Patches Reline's get_mbchar_width to use Unicode::DisplayWidth + +require "reline" +require "reline/unicode" + +require_relative "../display_width" + +class Reline::Unicode + def self.get_mbchar_width(mbchar) + Unicode::DisplayWidth.of(mbchar, Reline.ambiguous_width) + end +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/string_ext.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/string_ext.rb new file mode 100644 index 000000000..e19cff8e9 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/string_ext.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require_relative "../display_width" + +class String + def display_width(ambiguous = nil, overwrite = nil, old_options = {}, **options) + Unicode::DisplayWidth.of(self, ambiguous, overwrite, old_options = {}, **options) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/CHANGELOG.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/CHANGELOG.md new file mode 100644 index 000000000..e80a0165b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/CHANGELOG.md @@ -0,0 +1,196 @@ +# CHANGELOG + +## 4.1.0 + +- Unicode 17 +- Update valid subdivisions to CLDR 47 (no changes) + +## 4.0.4 + +- Add `REGEX_TEXT_PRESENTATION` to be able to match for raw default-text Emoji codepoints + +## 4.0.3 + +- Remove emoji-test.txt from Rubygems package + +## 4.0.2 + +- Directly use `RbConfig::CONFIG["UNICODE_EMOJI_VERSION"]` to detect Ruby's Emoji version, + drop unicode-version dependency + +## 4.0.0 + +- **Breaking change:** Regexes now include single skin tone modifiers (`🏻`) and hair components (`🦰`). + They were previously considered to be invalid partial Emoji, however since they are supposed to be + displayed as Emoji in isolation, they are now part of the regexes (see *ED-20* in UTS51). +- **Breaking change:** Drop `REGEX_ANY` in favor of `REGEX_PROP_EMOJI` +- Expose regexes for Emoji props (`REGEX_PROP_*`). The advantage over using the native regex properties + directly is that you will be able to use the Emoji support level of this gem instead of Ruby's. + For example, as of releasing this, the current Emoji version is 16.0, while Ruby is at 15.0. + Also see README for a table listing the regexes that match Emoji properties. +- Add `REGEX_EMOJI_KEYCAP` for matching specifically Emoji keycaps +- Use character class instead of lookbehind for native text emoji and non-emoji pictographic regexes + +## 3.8.0 + +- Add new RGI-based regexes `REGEX_INCLUDE_MQE` and `REGEX_INCLUDE_MQE_UQE` which allows to match + for minimally-qualified and unqualified RGI sequences (Emoji that lack some VS16) +- Add specs running through `emoji-text.txt` and classify qualification statuses per regex +- Improve documentation and add detailed table about which regex has which features +- Native regexes: Use native Emoji props for Emoji text presentation +- Update CLDR to v46 (valid subdivisions) +- Further improvements (see commit log) + +## 3.7.0 + +- Bump required Ruby slightly to 2.5 +- Introduce new `REGEX_POSSIBLE` which contains the regex described in + https://www.unicode.org/reports/tr51/#EBNF_and_Regex +- Fix that some valid subdivisions were not decompressed (`REGEX_VALID`) +- Be stricter about selection of tag characters in `REGEX_WELL_FORMED` + - Only U+E0030..U+E0039, U+E0061..U+E007A allowed + - Max tag sequence length +- Use native `/\p{RI}/` regex for regional indicators +- Separately autoload emoji list, so it can be loaded when other indexes + are not needed + +## 3.6.0 + +- `Unicode::Emoji::REGEX_TEXT` now matches non-emoji keycaps like "3⃣" (U+0033 U+20E3) +- Minor refactorings + +## 3.5.0 + +- Emoji 16.0 + +## 3.4.0 + +- Emoji 15.1 + +## 3.3.2 + +- Update valid subdivisions to CLDR 43 (no changes) + -> there won't be any new RGI subdivision flags in Emoji + +## 3.3.1 + +- Update valid subdivisions to CLDR 42 (no changes) + +## 3.3.0 + +- Emoji 15.0 + +## 3.2.0 + +- Update valid subdivisions to CLDR 41 + +## 3.1.1 + +- Fix `REGEX` to be able to match complete family emoji, instead of + sub-matching partial families, thanks @matt17r + +## 3.1.0 + +- Update valid subdivisions to CLDR 40 + +## 3.0.0 + +- Vastly improve memory usage, patch by @radarek + - Emoji regexes are now pre-generated and bundled with the release + - Regexes use character classes instead of unions when possible + - Most constants (e.g. regexes) now get autoloaded + - See https://github.com/janlelis/unicode-emoji/pull/9 for more details + +## 2.9.0 + +- Emoji 14.0 + +## 2.8.0 + +- Update valid subdivisions to CLDR 39 + +## 2.7.1 + +- Update valid subdivisions to CLDR 38.1 + +## 2.7.0 + +- Update valid subdivisions to CLDR 38 +- Loosen Ruby dependency to allow Ruby 3.0 + +## 2.6.0 + +- Emoji 13.1 + +## 2.5.0 + +- Use native Emoji regex properties when current Ruby's Emoji support is the same as our current Emoji version +- Update valid subdivisions to CLDR 37 + +## 2.4.0 + +- Emoji 13.0 + +## 2.3.1 + +- Fix index to actually include Emoji 12.1 + +## 2.3.0 + +- Emoji 12.1 + +## 2.2.0 + +- Update subdivisions to CLDR 36 + +## 2.1.0 + +- Add `REGEX_PICTO` which matches codepoints with the **Extended_Pictographic** property +- Add `REGEX_PICTO_NO_EMOJI` which matches codepoints with the **Extended_Pictographic** property, but no **Emoji** property + +## 2.0.0 + +- Emoji 12.0 data (including valid subdivisions) +- Introduce new `REGEX_WELL_FORMED` to be able to match for invalid tag and region sequences +- Introduce new `*_INCLUDE_TEXT` regexes which include matching for textual presentation emoji +- Refactoring: Update Emoji matching to latest standard while keeping naming close to standard +- Issue warning when using `#list` method to retrieve outdated category +- Change matching for ZWJ sequences: Do not limit sequence to a maximum of 3 ZWJs + +## 1.1.0 + +- Emoji 11.0 +- Do not depend on rubygems (only use zlib stdlib for unzipping) + +## 1.0.3 + +- Explicitly load rubygems/util, fixes regression in 1.2.1 + +## 1.0.2 + +- Use `Gem::Util` for `gunzip`, removes deprecation warning + +## 1.0.1 + +- Actually set required Ruby version to 2.3 in gemspec + +## 1.0.0 + +- Drop support for Ruby below 2.3, use 0.9 if you need to +- Internal refactorings, no API change + +## 0.9.3 + +- Implement native Emoji regex matchers, but do not activate or document, yet + +## 0.9.2 + +- REGEX_TEXT: Do not match if the text emoji is followed by a emoji modifier + +## 0.9.1 + +- Include a categorized list of recommended Emoji + +## 0.9.0 + +- Initial release (Emoji version 5.0) diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/CODE_OF_CONDUCT.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..1e1a5b2b3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at opensource@janlelis.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/Gemfile b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/Gemfile new file mode 100644 index 000000000..bdb3ecd0f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/Gemfile @@ -0,0 +1,7 @@ +source "https://rubygems.org" + +gemspec + +gem "minitest" +gem "rake" +gem "irb" unless RUBY_ENGINE == "jruby" diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/Gemfile.lock b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/Gemfile.lock new file mode 100644 index 000000000..54ca1b722 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/Gemfile.lock @@ -0,0 +1,33 @@ +PATH + remote: . + specs: + unicode-emoji (4.1.0) + +GEM + remote: https://rubygems.org/ + specs: + io-console (0.6.0) + irb (1.8.1) + rdoc + reline (>= 0.3.8) + minitest (5.20.0) + psych (5.1.0) + stringio + rake (13.0.6) + rdoc (6.5.0) + psych (>= 4.0.0) + reline (0.3.8) + io-console (~> 0.5) + stringio (3.0.8) + +PLATFORMS + ruby + +DEPENDENCIES + irb + minitest + rake + unicode-emoji! + +BUNDLED WITH + 2.5.21 diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/MIT-LICENSE.txt b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/MIT-LICENSE.txt new file mode 100644 index 000000000..1b6fd0101 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2017-2024 Jan Lelis, https://janlelis.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/README.md b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/README.md new file mode 100644 index 000000000..7e7ddd348 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/README.md @@ -0,0 +1,205 @@ +# Unicode::Emoji [![[version]](https://badge.fury.io/rb/unicode-emoji.svg)](https://badge.fury.io/rb/unicode-emoji) [![[ci]](https://github.com/janlelis/unicode-emoji/workflows/Test/badge.svg)](https://github.com/janlelis/unicode-emoji/actions?query=workflow%3ATest) + +Provides various sophisticated regular expressions to work with Emoji in strings, +incorporating the latest Unicode / Emoji standards. + +Additional features: + +- A categorized list of Emoji (RGI: Recommended for General Interchange) +- Retrieve Emoji properties info about specific codepoints (Emoji_Modifier, Emoji_Presentation, etc.) + +Emoji version: **17.0** (September 2025) + +CLDR version (used for sub-region flags): **47** (March 2025) + +## Gemfile + +```ruby +gem "unicode-emoji" +``` + +## Usage – Regex Matching + +The gem includes multiple Emoji regexes, which are compiled out of various Emoji Unicode data sources. + +```ruby +require "unicode/emoji" + +string = "String which contains all types of Emoji sequences: + +- Basic Emoji: 😴 +- Textual Emoji with Emoji variation (VS16): ▶️ +- Emoji with skin tone modifier: 🛌🏽 +- Region flag: 🇵🇹 +- Sub-Region flag: 🏴󠁧󠁢󠁳󠁣󠁴󠁿 +- Keycap sequence: 2️⃣ +- Skin tone modifier: 🏻 +- Sequence using ZWJ (zero width joiner): 🤾🏽‍♀️ +" + +string.scan(Unicode::Emoji::REGEX) # => ["😴", "▶️", "🛌🏽", "🇵🇹", "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "2️⃣", "🏻", "🤾🏽‍♀️"] +``` + +Depending on your exact usecase, you can choose between multiple levels of Emoji detection: + +### Main Regexes + +Regex | Description | Example Matches | Example Non-Matches +------------------------------|-------------|-----------------|-------------------- +`Unicode::Emoji::REGEX` | **Use this one if unsure!** Matches (non-textual) Basic Emoji and all kinds of *recommended* Emoji sequences (RGI/FQE) | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🤾🏽‍♀️`, `🏻` | `🤾🏽‍♀`, `🏌‍♂️`, `😴︎`, `▶`, `🇵🇵`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤠‍🤢`, `1`, `1⃣` +`Unicode::Emoji::REGEX_VALID` | Matches (non-textual) Basic Emoji and all kinds of *valid* Emoji sequences | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀` ,`🏌‍♂️`, `🤠‍🤢`, `🏻` | `😴︎`, `▶`, `🇵🇵`, `1`, `1⃣` +`Unicode::Emoji::REGEX_WELL_FORMED` | Matches (non-textual) Basic Emoji and all kinds of *well-formed* Emoji sequences | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀`,`🏌‍♂️` , `🤠‍🤢`, `🇵🇵`, `🏻` | `😴︎`, `▶`, `1`, `1⃣` +`Unicode::Emoji::REGEX_POSSIBLE` | Matches all singleton Emoji, all kinds of Emoji sequences, and even non-Emoji singleton components like digits. Only exception: Unqualified keycap sequences are not matched | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀`, `🏌‍♂️`, `🤠‍🤢`, `🇵🇵`, `😴︎`, `▶`, `🏻`, `1` | `1⃣` + +#### Include Text Emoji + +By default, textual Emoji (emoji characters with text variation selector or those that have a default text presentation) will not be included in the default regexes (except in `REGEX_POSSIBLE`). However, if you wish to match for them too, you can include them in your regex by appending the `_INCLUDE_TEXT` suffix: + +Regex | Description | Example Matches | Example Non-Matches +------------------------------|-------------|-----------------|-------------------- +`Unicode::Emoji::REGEX_INCLUDE_TEXT` | `REGEX` + `REGEX_TEXT` | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🤾🏽‍♀️`, `😴︎`, `▶`, `1⃣` , `🏻`| `🤾🏽‍♀`, `🏌‍♂️`, `🇵🇵`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤠‍🤢`, `1` +`Unicode::Emoji::REGEX_VALID_INCLUDE_TEXT` | `REGEX_VALID` + `REGEX_TEXT` | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀`, `🏌‍♂️`, `🤠‍🤢`, `😴︎`, `▶`, `1⃣` , `🏻` | `🇵🇵`, `1` +`Unicode::Emoji::REGEX_WELL_FORMED_INCLUDE_TEXT` | `REGEX_WELL_FORMED` + `REGEX_TEXT` | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀`, `🏌‍♂️`, `🤠‍🤢`, `🇵🇵`, `😴︎`, `▶`, `1⃣` , `🏻` | `1` + +#### Minimally-qualified and Unqualified Sequences + +Regex | Description | Example Matches | Example Non-Matches +------------------------------|-------------|-----------------|-------------------- +`Unicode::Emoji::REGEX_INCLUDE_MQE` | Like `REGEX`, but additionally includes Emoji with missing Emoji Presentation Variation Selectors, where the first partial Emoji has all required Variation Selectors | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀`, `🏻` | `🏌‍♂️`, `😴︎`, `▶`, `🇵🇵`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤠‍🤢`, `1`, `1⃣` +`Unicode::Emoji::REGEX_INCLUDE_MQE_UQE` | Like `REGEX`, but additionally includes Emoji with missing Emoji Presentation Variation Selectors | `😴`, `▶️`, `🛌🏽`, `🇵🇹`, `2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀`, `🏌‍♂️`, `🏻` | `😴︎`, `▶`, `🇵🇵`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤠‍🤢`, `1`, `1⃣` + +[List of MQE and UQE Emoji sequences](https://character.construction/unqualified-emoji) + +#### Singleton Regexes + +Matches only simple one-codepoint (+ optional variation selector) Emoji: + +Regex | Description | Example Matches | Example Non-Matches +------------------------------|-------------|-----------------|-------------------- +`Unicode::Emoji::REGEX_BASIC` | Matches (non-textual) Basic Emoji, but no sequences at all | `😴`, `▶️`, `🏻` | `😴︎`, `▶`, `🛌🏽`, `🇵🇹`, `🇵🇵`,`2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀`, `🏌‍♂️`, `🤠‍🤢`, `1` +`Unicode::Emoji::REGEX_TEXT` | Matches only textual singleton Emoji | `😴︎`, `▶` | `😴`, `▶️`, `🏻`, `🛌🏽`, `🇵🇹`, `🇵🇵`,`2️⃣`, `🏴󠁧󠁢󠁳󠁣󠁴󠁿`, `🏴󠁧󠁢󠁡󠁧󠁢󠁿`, `🤾🏽‍♀️`, `🤾🏽‍♀`, `🏌‍♂️`, `🤠‍🤢`, `1` + +Here is a list of all Emoji that can be matched using the two regexes: [character.construction/emoji-vs-text](https://character.construction/emoji-vs-text). The `REGEX_BASIC` regex also matches [visual Emoji components](https://character.construction/emoji-components) (skin tone modifiers and hair components). + +While `REGEX_BASIC` is part of the above regexes, `REGEX_TEXT` is only included in the `*_INCLUDE_TEXT` or `*_UQE` variants. + +### Comparison + +1) Fully-qualified RGI Emoji ZWJ sequence +2) Minimally-qualified RGI Emoji ZWJ sequence (lacks Emoji Presentation Selectors, but not in the first Emoji character) +3) Unqualified RGI Emoji ZWJ sequence (lacks Emoji Presentation Selector, including in the first Emoji character). Unqualified Emoji include all basic Emoji in Text Presentation (see column 11/12). +4) Non-RGI Emoji ZWJ sequence +5) Valid Region made from a pair of Regional Indicators +6) Any Region made from a pair of Regional Indicators +7) RGI Flag Emoji Tag Sequences (England, Scotland, Wales) +8) Valid Flag Emoji Tag Sequences (any known subdivision) +9) Any Emoji Tag Sequences (any tag sequence with any base) +10) Basic Default Emoji Presentation Characters or Text characters with Emoji Presentation Selector +11) Basic Default Text Presentation Characters or Basic Emoji with Text Presentation Selector +12) Non-Emoji (unqualified) keycap + +Regex | 1 RGI/FQE | 2 RGI/MQE | 3 RGI/UQE | 4 Non-RGI | 5 Valid Re­gion | 6 Any Re­gion | 7 RGI Tag | 8 Valid Tag | 9 Any Tag | 10 Basic Emoji | 11 Basic Text | 12 Text Key­cap +-|-|-|-|-|-|-|-|-|-|-|-|- +REGEX | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ +REGEX INCLUDE TEXT | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ +REGEX INCLUDE MQE | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ +REGEX INCLUDE MQE UQE | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ +REGEX VALID | ✅ | ✅ | (✅)¹ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ +REGEX VALID INCLUDE TEXT | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ +REGEX WELL FORMED | ✅ | ✅ | (✅)¹ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ +REGEX WELL FORMED INCLUDE TEXT | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ +REGEX POSSIBLE | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ +REGEX BASIC | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ +REGEX TEXT | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ + +¹ Matches all unqualified Emoji, except for textual singleton Emoji (see columns 11, 12) + +See [spec files](/spec) for detailed examples about which regex matches which kind of Emoji. + +### Picking the Right Emoji Regex + +- Usually you just want `REGEX` (recommended Emoji set, RGI) +- Use `REGEX_INCLUDE_MQE` or `REGEX_INCLUDE_MQE_UQE` if you want to catch Emoji sequences with missing Variation Selectors. +- If you want broader matching (any ZWJ sequences, more sub-region flags), choose `REGEX_VALID` +- If you need to match any region flag and any tag sequence, choose `REGEX_WELL_FORMED` +- Use the `_INCLUDE_TEXT` suffix with any of the above base regexes, if you want to also match basic textual Emoji +- And finally, there is also the option to use `REGEX_POSSIBLE`, which is a simplified test for possible Emoji, comparable to `REGEX_WELL_FORMED*`. It might contain false positives, however, the regex is less complex and [suggested in the Unicode standard itself](https://www.unicode.org/reports/tr51/#EBNF_and_Regex) as a first check. + +### Examples + +Desc | Emoji | Escaped | `REGEX` (RGI/FQE) | `REGEX_INCLUDE_MQE` (RGI/MQE) | `REGEX_VALID` | `REGEX_WELL_FORMED` / `REGEX_POSSIBLE` +-----|-------|---------|---------------|-----------------------|-----------------------------------|----------------- +RGI ZWJ Sequence | 🤾🏽‍♀️ | `\u{1F93E 1F3FD 200D 2640 FE0F}` | ✅ | ✅ | ✅ | ✅ +RGI ZWJ Sequence MQE | 🤾🏽‍♀ | `\u{1F93E 1F3FD 200D 2640}` | ❌ | ✅ | ✅ | ✅ +Valid ZWJ Sequence, Non-RGI | 🤠‍🤢 | `\u{1F920 200D 1F922}` | ❌ | ❌ | ✅ | ✅ +Known Region | 🇵🇹 | `\u{1F1F5 1F1F9}` | ✅ | ✅ | ✅ | ✅ +Unknown Region | 🇵🇵 | `\u{1F1F5 1F1F5}` | ❌ | ❌ | ❌ | ✅ +RGI Tag Sequence | 🏴󠁧󠁢󠁳󠁣󠁴󠁿 | `\u{1F3F4 E0067 E0062 E0073 E0063 E0074 E007F}` | ✅ | ✅ | ✅ | ✅ +Valid Tag Sequence | 🏴󠁧󠁢󠁡󠁧󠁢󠁿 | `\u{1F3F4 E0067 E0062 E0061 E0067 E0062 E007F}` | ❌ | ❌ | ✅ | ✅ +Well-formed Tag Sequence | 😴󠁧󠁢󠁡󠁡󠁡󠁿 | `\u{1F634 E0067 E0062 E0061 E0061 E0061 E007F}` | ❌ | ❌ | ❌ | ✅ + +Please see [the standard](https://www.unicode.org/reports/tr51/#Emoji_Sets) for more details, examples, explanations. + +More info about valid vs. recommended Emoji can also be found in this [blog article on Emojipedia](https://blog.emojipedia.org/unicode-behind-the-curtain/). + +### Emoji Property Regexes + +Ruby includes native regex Emoji properties, as listed in the following table. You can also opt-in to use the `*_PROP_*` regexes to get the Emoji support level of this gem (instead of Ruby's). [Which Emoji version does Ruby support?](https://idiosyncratic-ruby.com/73-unicode-version-mapping.html#ruby--emoji) + +Gem Regex (`Unicode::Emoji`'s Emoji support level) | Native Regex (Ruby's Emoji support level) +---------------------------------------------------|------------------------------------------ +`Unicode::Emoji::REGEX_PROP_EMOJI` | `/\p{Emoji}/` +`Unicode::Emoji::REGEX_PROP_MODIFIER` | `/\p{EMod}/` +`Unicode::Emoji::REGEX_PROP_MODIFIER_BASE` | `/\p{EBase}/` +`Unicode::Emoji::REGEX_PROP_COMPONENT` | `/\p{EComp}/` +`Unicode::Emoji::REGEX_PROP_PRESENTATION` | `/\p{EPres}/` +`Unicode::Emoji::REGEX_TEXT_PRESENTATION` | `/[\p{Emoji}&&\P{EPres}]/` + +#### Extended Pictographic Regex + +`Unicode::Emoji::REGEX_PICTO` matches single codepoints with the **Extended_Pictographic** property. For example, it will match `✀` BLACK SAFETY SCISSORS. + +`Unicode::Emoji::REGEX_PICTO_NO_EMOJI` matches single codepoints with the **Extended_Pictographic** property, but excludes Emoji characters. + +See [character.construction/picto](https://character.construction/picto) for a list of all non-Emoji pictographic characters. + +## Usage – List + +Use `Unicode::Emoji::LIST` or the **list** method to get a ordered and categorized list of Emoji: + +```ruby +Unicode::Emoji.list.keys +# => ["Smileys & Emotion", "People & Body", "Component", "Animals & Nature", "Food & Drink", "Travel & Places", "Activities", "Objects", "Symbols", "Flags"] + +Unicode::Emoji.list("Food & Drink").keys +# => ["food-fruit", "food-vegetable", "food-prepared", "food-asian", "food-marine", "food-sweet", "drink", "dishware"] + +Unicode::Emoji.list("Food & Drink", "food-asian") +=> ["🍱", "🍘", "🍙", "🍚", "🍛", "🍜", "🍝", "🍠", "🍢", "🍣", "🍤", "🍥", "🥮", "🍡", "🥟", "🥠", "🥡"] +``` + +Please note that categories might change with future versions of the Emoji standard, although this has not happened often. + +A list of all Emoji (generated from this gem) can be found at [character.construction/emoji](https://character.construction/emoji). + +## Usage – Properties Data + +Allows you to access the codepoint data for a single character form Unicode's [emoji-data.txt](https://www.unicode.org/Public/16.0.0/ucd/emoji/emoji-data.txt) file: + +```ruby +require "unicode/emoji" + +Unicode::Emoji.properties "☝" # => ["Emoji", "Emoji_Modifier_Base"] +``` + +## Also See + +- [Unicode® Technical Standard #51](https://www.unicode.org/reports/tr51/) +- [Emoji categories](https://unicode.org/emoji/charts/emoji-ordering.html) +- Ruby gem which displays [Emoji sequence names](https://github.com/janlelis/unicode-sequence_name) ([as website](https://character.construction/name)) +- Part of [unicode-x](https://github.com/janlelis/unicode-x) + +## MIT + +- Copyright (C) 2017-2025 Jan Lelis <https://janlelis.com>. Released under the MIT license. +- Unicode data: https://www.unicode.org/copyright.html#Exhibit1 diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/data/emoji.marshal.gz b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/data/emoji.marshal.gz new file mode 100644 index 000000000..582767686 Binary files /dev/null and b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/data/emoji.marshal.gz differ diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/data/generate_constants.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/data/generate_constants.rb new file mode 100644 index 000000000..7034e05cf --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/data/generate_constants.rb @@ -0,0 +1,344 @@ +require_relative '../lib/unicode/emoji/constants' +require_relative '../lib/unicode/emoji/index' +require_relative '../lib/unicode/emoji/lazy_constants' + +include Unicode::Emoji + +def write_regexes(regexes, dirpath) + regexes.each do |const_name, regex| + write_regex(const_name, regex, dirpath) + end +end + +def write_regex(const_name, regex, dirpath) + filename = const_name.to_s.downcase + filepath = File.join(dirpath, "#{filename}.rb") + + File.write(filepath, <<~CONTENT) + # This file was generated by a script, please do not edit it by hand. + # See `$ rake generate_constants` and data/generate_constants.rb for more info. + + module Unicode + module Emoji + #{const_name} = #{regex.inspect} + end + end + CONTENT + puts "#{const_name} written to #{filepath}" +end + +# Converts [1, 2, 3, 5, 6, 20, 21, 22, 23, 100] (it does not need to be sorted) to [[1, 2, 3], [5, 6], [20, 21, 22, 23], [100]] +def groupify(arr) + arr = arr.sort + prev = nil + arr.slice_before do |el| + (prev.nil? || el != prev + 1).tap { prev = el } + end +end + +# Converts [1, 2, 3, 5, 6, 20, 21, 22, 23, 100] (it does not need to be sorted) to [1..3, 5, 6, 20..23, 100] +def rangify(arr) + groupify(arr).map do |group| + group.size < 3 ? group : Range.new(group.first, group.last) + end.flatten +end + +def pack(ord) + Regexp.escape(Array(ord).pack("U*")) +end + +def join(*strings) + "(?:" + strings.join("|") + ")" +end + +def character_class(ords_with_ranges) + "[" + ords_with_ranges.map{ |ord_or_range| + ord_or_range.is_a?(Range) ? + pack(ord_or_range.first) + "-" + pack(ord_or_range.last) : + pack(ord_or_range) + }.join + + "]" +end + +def pack_and_join(ords) + if ords.any? { |e| e.is_a?(Array) } + join(*ords.map { |ord| pack(ord) }) + else + character_class(rangify(ords)) + end +end + +def compile(emoji_character:, emoji_modifier:, emoji_modifier_base:, emoji_component:, emoji_presentation:, text_presentation:, picto:, picto_no_emoji:) + visual_component = pack_and_join(VISUAL_COMPONENT) + + emoji_presentation_sequence = \ + join( + text_presentation + pack(EMOJI_VARIATION_SELECTOR), + emoji_presentation + "(?!" + pack(TEXT_VARIATION_SELECTOR) + ")" + pack(EMOJI_VARIATION_SELECTOR) + "?", + ) + + non_component_emoji_presentation_sequence = \ + "(?!" + emoji_component + ")" + emoji_presentation_sequence + + basic_emoji = \ + join( + non_component_emoji_presentation_sequence, + visual_component, + ) + + text_keycap_sequence = \ + pack_and_join(EMOJI_KEYCAPS) + pack(EMOJI_KEYCAP_SUFFIX) + + text_presentation_sequence = \ + join( + text_presentation + "(?!" + join(emoji_modifier, pack(EMOJI_VARIATION_SELECTOR)) + ")" + pack(TEXT_VARIATION_SELECTOR) + "?", + emoji_presentation + pack(TEXT_VARIATION_SELECTOR), + ) + + text_emoji = \ + join( + "(?!" + emoji_component + ")" + text_presentation_sequence, + text_keycap_sequence, + ) + + emoji_modifier_sequence = \ + emoji_modifier_base + emoji_modifier + + emoji_keycap_sequence = \ + pack_and_join(EMOJI_KEYCAPS) + pack([EMOJI_VARIATION_SELECTOR, EMOJI_KEYCAP_SUFFIX]) + + emoji_valid_flag_sequence = \ + pack_and_join(VALID_REGION_FLAGS) + + emoji_well_formed_flag_sequence = \ + '\p{RI}{2}' + + emoji_core_sequence = \ + join( + emoji_keycap_sequence, + emoji_modifier_sequence, + non_component_emoji_presentation_sequence, + ) + + # Sort to make sure complex sequences match first + emoji_rgi_tag_sequence = \ + pack_and_join(RECOMMENDED_SUBDIVISION_FLAGS.sort_by(&:length).reverse) + + emoji_valid_tag_sequence = \ + "(?:" + + pack(EMOJI_TAG_BASE_FLAG) + + "(?:" + VALID_SUBDIVISIONS.sort_by(&:length).reverse.map{ |sd| + sd.tr("\u{30}-\u{39}\u{61}-\u{7A}", "\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}") + }.join("|") + ")" + + pack(CANCEL_TAG) + + ")" + + emoji_well_formed_tag_sequence = \ + "(?:" + + join( + non_component_emoji_presentation_sequence, + emoji_modifier_sequence, + ) + + pack_and_join(SPEC_TAGS) + "{1,30}" + + pack(CANCEL_TAG) + + ")" + + # Sort to make sure complex sequences match first + emoji_rgi_zwj_sequence = \ + pack_and_join(RECOMMENDED_ZWJ_SEQUENCES.sort_by(&:length).reverse) + + # FQE+MQE: Make VS16 optional after ZWJ has appeared + emoji_rgi_include_mqe_zwj_sequence = emoji_rgi_zwj_sequence.gsub( + /#{ pack(ZWJ) }[^|]+?\K#{ pack(EMOJI_VARIATION_SELECTOR) }/, + pack(EMOJI_VARIATION_SELECTOR) + "?" + ) + + # FQE+MQE+UQE: Make all VS16 optional + emoji_rgi_include_mqe_uqe_zwj_sequence = emoji_rgi_zwj_sequence.gsub( + pack(EMOJI_VARIATION_SELECTOR), + pack(EMOJI_VARIATION_SELECTOR) + "?", + ) + + emoji_valid_zwj_element = \ + join( + emoji_modifier_sequence, + emoji_presentation_sequence, + emoji_character, + ) + + emoji_valid_zwj_sequence = \ + "(?:" + + "(?:" + emoji_valid_zwj_element + pack(ZWJ) + ")+" + emoji_valid_zwj_element + + ")" + + emoji_rgi_sequence = \ + join( + emoji_rgi_zwj_sequence, + emoji_rgi_tag_sequence, + emoji_valid_flag_sequence, + emoji_core_sequence, + visual_component, + ) + + emoji_rgi_sequence_include_text = \ + join( + emoji_rgi_zwj_sequence, + emoji_rgi_tag_sequence, + emoji_valid_flag_sequence, + emoji_core_sequence, + visual_component, + text_emoji, + ) + + emoji_rgi_include_mqe_sequence = \ + join( + emoji_rgi_include_mqe_zwj_sequence, + emoji_rgi_tag_sequence, + emoji_valid_flag_sequence, + emoji_core_sequence, + visual_component, + ) + + emoji_rgi_include_mqe_uqe_sequence = \ + join( + emoji_rgi_include_mqe_uqe_zwj_sequence, + text_emoji, # also uqe + emoji_rgi_tag_sequence, + emoji_valid_flag_sequence, + emoji_core_sequence, + visual_component, + ) + + emoji_valid_sequence = \ + join( + emoji_valid_zwj_sequence, + emoji_valid_tag_sequence, + emoji_valid_flag_sequence, + emoji_core_sequence, + visual_component, + ) + + emoji_valid_sequence_include_text = \ + join( + emoji_valid_zwj_sequence, + emoji_valid_tag_sequence, + emoji_valid_flag_sequence, + emoji_core_sequence, + visual_component, + text_emoji, + ) + + emoji_well_formed_sequence = \ + join( + emoji_valid_zwj_sequence, + emoji_well_formed_tag_sequence, + emoji_well_formed_flag_sequence, + emoji_core_sequence, + visual_component, + ) + + emoji_well_formed_sequence_include_text = \ + join( + emoji_valid_zwj_sequence, + emoji_well_formed_tag_sequence, + emoji_well_formed_flag_sequence, + emoji_core_sequence, + visual_component, + text_emoji, + ) + + emoji_possible_modification = \ + join( + emoji_modifier, + pack([EMOJI_VARIATION_SELECTOR, EMOJI_KEYCAP_SUFFIX]) + "?", + "[󠀠-󠁾]+󠁿" # raw tags + ) + + emoji_possible_zwj_element = \ + join( + emoji_well_formed_flag_sequence, + emoji_character + emoji_possible_modification + "?" + ) + + emoji_possible = \ + emoji_possible_zwj_element + "(?:" + pack(ZWJ) + emoji_possible_zwj_element + ")*" + + regexes = {} + + # Matches basic singleton emoji and all kind of sequences, but restrict zwj and tag sequences to known sequences (rgi) + regexes[:REGEX] = Regexp.compile(emoji_rgi_sequence) + + # rgi + singleton text + regexes[:REGEX_INCLUDE_TEXT] = Regexp.compile(emoji_rgi_sequence_include_text) + + # Matches basic singleton emoji and all kind of sequences, but restrict zwj and tag sequences to known sequences (rgi) + # Also make VS16 optional if not at first emoji character + regexes[:REGEX_INCLUDE_MQE] = Regexp.compile(emoji_rgi_include_mqe_sequence) + + # Matches basic singleton emoji and all kind of sequences, but restrict zwj and tag sequences to known sequences (rgi) + # Also make VS16 optional even at first emoji character + regexes[:REGEX_INCLUDE_MQE_UQE] = Regexp.compile(emoji_rgi_include_mqe_uqe_sequence) + + # Matches basic singleton emoji and all kind of valid sequences + regexes[:REGEX_VALID] = Regexp.compile(emoji_valid_sequence) + + # valid + singleton text + regexes[:REGEX_VALID_INCLUDE_TEXT] = Regexp.compile(emoji_valid_sequence_include_text) + + # Matches basic singleton emoji and all kind of sequences + regexes[:REGEX_WELL_FORMED] = Regexp.compile(emoji_well_formed_sequence) + + # well-formed + singleton text + regexes[:REGEX_WELL_FORMED_INCLUDE_TEXT] = Regexp.compile(emoji_well_formed_sequence_include_text) + + # Quick test which might lead to false positves + # See https://www.unicode.org/reports/tr51/#EBNF_and_Regex + regexes[:REGEX_POSSIBLE] = Regexp.compile(emoji_possible) + + # Matches only basic single, non-textual emoji, ignores some components like simple digits + regexes[:REGEX_BASIC] = Regexp.compile(basic_emoji) + + # Matches only basic single, textual emoji, ignores components like modifiers or simple digits + regexes[:REGEX_TEXT] = Regexp.compile(text_emoji) + regexes[:REGEX_TEXT_PRESENTATION] = Regexp.compile(text_presentation) + + # Export regexes for Emoji properties so they can be used with newer Unicode than Ruby's + regexes[:REGEX_PROP_EMOJI] = Regexp.compile(emoji_character) + regexes[:REGEX_PROP_MODIFIER] = Regexp.compile(emoji_modifier) + regexes[:REGEX_PROP_MODIFIER_BASE] = Regexp.compile(emoji_modifier_base) + regexes[:REGEX_PROP_COMPONENT] = Regexp.compile(emoji_component) + regexes[:REGEX_PROP_PRESENTATION] = Regexp.compile(emoji_presentation) + + # Same goes for ExtendedPictographic + regexes[:REGEX_PICTO] = Regexp.compile(picto) + regexes[:REGEX_PICTO_NO_EMOJI] = Regexp.compile(picto_no_emoji) + + # Emoji keycaps + regexes[:REGEX_EMOJI_KEYCAP] = Regexp.compile(emoji_keycap_sequence) + + regexes +end + +regexes = compile( + emoji_character: pack_and_join(EMOJI_CHAR), + emoji_modifier: pack_and_join(EMOJI_MODIFIERS), + emoji_modifier_base: pack_and_join(EMOJI_MODIFIER_BASES), + emoji_component: pack_and_join(EMOJI_COMPONENT), + emoji_presentation: pack_and_join(EMOJI_PRESENTATION), + text_presentation: pack_and_join(TEXT_PRESENTATION), + picto: pack_and_join(EXTENDED_PICTOGRAPHIC), + picto_no_emoji: pack_and_join(EXTENDED_PICTOGRAPHIC_NO_EMOJI) +) +write_regexes(regexes, File.expand_path("../lib/unicode/emoji/generated", __dir__)) + +native_regexes = compile( + emoji_character: "\\p{Emoji}", + emoji_modifier: "\\p{EMod}", + emoji_modifier_base: "\\p{EBase}", + emoji_component: "\\p{EComp}", + emoji_presentation: "\\p{EPres}", + text_presentation: "[\\p{Emoji}&&\\P{EPres}]", + picto: "\\p{ExtPict}", + picto_no_emoji: "[\\p{ExtPict}&&\\P{Emoji}]" +) +write_regexes(native_regexes, File.expand_path("../lib/unicode/emoji/generated_native", __dir__)) diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji.rb new file mode 100644 index 000000000..e344054f7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +require_relative "emoji/constants" + +module Unicode + module Emoji + autoload :INDEX, File.expand_path('emoji/index', __dir__) + + %w[ + EMOJI_CHAR + EMOJI_PRESENTATION + TEXT_PRESENTATION + EMOJI_COMPONENT + EMOJI_MODIFIER_BASES + EMOJI_MODIFIERS + EXTENDED_PICTOGRAPHIC + EXTENDED_PICTOGRAPHIC_NO_EMOJI + EMOJI_KEYCAPS + VALID_REGION_FLAGS + VALID_SUBDIVISIONS + RECOMMENDED_SUBDIVISION_FLAGS + RECOMMENDED_ZWJ_SEQUENCES + ].each do |const_name| + autoload const_name, File.expand_path('emoji/lazy_constants', __dir__) + end + + %w[ + LIST + LIST_REMOVED_KEYS + ].each do |const_name| + autoload const_name, File.expand_path('emoji/list', __dir__) + end + + generated_constants_dirpath = File.expand_path( + EMOJI_VERSION == RbConfig::CONFIG["UNICODE_EMOJI_VERSION"] ? "emoji/generated_native/" : "emoji/generated/", + __dir__ + ) + + %w[ + REGEX + REGEX_INCLUDE_TEXT + REGEX_INCLUDE_MQE + REGEX_INCLUDE_MQE_UQE + REGEX_VALID + REGEX_VALID_INCLUDE_TEXT + REGEX_WELL_FORMED + REGEX_WELL_FORMED_INCLUDE_TEXT + REGEX_POSSIBLE + REGEX_BASIC + REGEX_TEXT + REGEX_TEXT_PRESENTATION + REGEX_PROP_EMOJI + REGEX_PROP_MODIFIER + REGEX_PROP_MODIFIER_BASE + REGEX_PROP_COMPONENT + REGEX_PROP_PRESENTATION + REGEX_PICTO + REGEX_PICTO_NO_EMOJI + REGEX_EMOJI_KEYCAP + ].each do |const_name| + autoload const_name, File.join(generated_constants_dirpath, const_name.downcase) + end + + # Return Emoji properties of character as an Array or nil + # See PROPERTY_NAMES constant for possible properties + # + # Source: see https://www.unicode.org/Public/16.0.0/ucd/emoji/emoji-data.txt + def self.properties(char) + ord = get_codepoint_value(char) + props = INDEX[:PROPERTIES][ord] + + if props + props.map{ |prop| PROPERTY_NAMES[prop] } + else + # nothing + end + end + + # Returns ordered list of Emoji, categorized in a three-level deep Hash structure + def self.list(key = nil, sub_key = nil) + return LIST unless key || sub_key + if LIST_REMOVED_KEYS.include?(key) + $stderr.puts "Warning(unicode-emoji): The category of #{key} does not exist anymore" + end + LIST.dig(*[key, sub_key].compact) + end + + def self.get_codepoint_value(char) + ord = nil + + if char.valid_encoding? + ord = char.ord + elsif char.encoding.name == "UTF-8" + begin + ord = char.unpack("U*")[0] + rescue ArgumentError + end + end + + if ord + ord + else + raise(ArgumentError, "Unicode::Emoji must be given a valid string") + end + end + + class << self + private :get_codepoint_value + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/constants.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/constants.rb new file mode 100644 index 000000000..cd5f3cf8d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/constants.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Unicode + module Emoji + VERSION = "4.1.0" + EMOJI_VERSION = "17.0" + CLDR_VERSION = "47" + DATA_DIRECTORY = File.expand_path('../../../data', __dir__).freeze + INDEX_FILENAME = (DATA_DIRECTORY + "/emoji.marshal.gz").freeze + + # Unicode properties, see https://www.unicode.org/Public/16.0.0/ucd/emoji/emoji-data.txt + PROPERTY_NAMES = { + E: "Emoji", + B: "Emoji_Modifier_Base", + M: "Emoji_Modifier", + C: "Emoji_Component", + P: "Emoji_Presentation", + X: "Extended_Pictographic", + }.freeze + + # Variation Selector 16 (VS16), enables emoji presentation mode for preceding codepoint + EMOJI_VARIATION_SELECTOR = 0xFE0F + + # Variation Selector 15 (VS15), enables text presentation mode for preceding codepoint + TEXT_VARIATION_SELECTOR = 0xFE0E + + # First codepoint of tag-based subdivision flags + EMOJI_TAG_BASE_FLAG = 0x1F3F4 + + # Last codepoint of tag-based subdivision flags + CANCEL_TAG = 0xE007F + + # Tags characters allowed in tag-based subdivision flags + SPEC_TAGS = [*0xE0030..0xE0039, *0xE0061..0xE007A].freeze + + # Combining Enclosing Keycap character + EMOJI_KEYCAP_SUFFIX = 0x20E3 + + # Zero-width-joiner to enable combination of multiple Emoji in a sequence + ZWJ = 0x200D + + # Two regional indicators make up a region + REGIONAL_INDICATORS = [*0x1F1E6..0x1F1FF].freeze + + # The current list of Emoji components that should have a visual representation + # Currently skin tone modifiers + hair components + VISUAL_COMPONENT = [*0x1F3FB..0x1F3FF, *0x1F9B0..0x1F9B3].freeze + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex.rb new file mode 100644 index 000000000..5a8c9b8ed --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX = /(?:(?:👩🏾‍❤️‍💋‍👩🏻|👩🏾‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👨🏾|👨🏽‍❤️‍💋‍👨🏻|👨🏽‍❤️‍💋‍👨🏼|👨🏽‍❤️‍💋‍👨🏽|👨🏽‍❤️‍💋‍👨🏾|👨🏽‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👨🏽|👩🏾‍❤️‍💋‍👨🏼|👩🏾‍❤️‍💋‍👨🏻|👨🏾‍❤️‍💋‍👨🏻|👨🏾‍❤️‍💋‍👨🏼|👨🏾‍❤️‍💋‍👨🏽|👨🏾‍❤️‍💋‍👨🏾|👨🏾‍❤️‍💋‍👨🏿|👩🏽‍❤️‍💋‍👩🏿|👩🏿‍❤️‍💋‍👩🏽|👩🏿‍❤️‍💋‍👩🏼|👩🏿‍❤️‍💋‍👩🏻|👩🏿‍❤️‍💋‍👨🏿|👩🏿‍❤️‍💋‍👨🏾|👩🏿‍❤️‍💋‍👨🏽|👩🏿‍❤️‍💋‍👨🏼|👩🏿‍❤️‍💋‍👨🏻|👨🏼‍❤️‍💋‍👨🏻|👨🏼‍❤️‍💋‍👨🏼|👨🏼‍❤️‍💋‍👨🏽|👨🏼‍❤️‍💋‍👨🏾|👨🏼‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👩🏿|👩🏾‍❤️‍💋‍👩🏾|👩🏾‍❤️‍💋‍👩🏽|👩🏾‍❤️‍💋‍👩🏼|👩🏼‍❤️‍💋‍👩🏼|👩🏼‍❤️‍💋‍👩🏻|👩🏼‍❤️‍💋‍👨🏿|👩🏼‍❤️‍💋‍👨🏾|👩🏼‍❤️‍💋‍👨🏽|👩🏼‍❤️‍💋‍👨🏼|👩🏼‍❤️‍💋‍👨🏻|👩🏻‍❤️‍💋‍👨🏻|👩🏻‍❤️‍💋‍👨🏼|👩🏻‍❤️‍💋‍👨🏽|👩🏻‍❤️‍💋‍👨🏾|👩🏻‍❤️‍💋‍👨🏿|👩🏻‍❤️‍💋‍👩🏻|👩🏻‍❤️‍💋‍👩🏼|👩🏻‍❤️‍💋‍👩🏽|👩🏻‍❤️‍💋‍👩🏾|👩🏻‍❤️‍💋‍👩🏿|👩🏽‍❤️‍💋‍👩🏾|👩🏽‍❤️‍💋‍👩🏽|👩🏽‍❤️‍💋‍👩🏼|👩🏽‍❤️‍💋‍👩🏻|👩🏽‍❤️‍💋‍👨🏿|👩🏽‍❤️‍💋‍👨🏾|👩🏽‍❤️‍💋‍👨🏽|👩🏽‍❤️‍💋‍👨🏼|👩🏽‍❤️‍💋‍👨🏻|👨🏿‍❤️‍💋‍👨🏻|👨🏿‍❤️‍💋‍👨🏼|👨🏿‍❤️‍💋‍👨🏽|👨🏿‍❤️‍💋‍👨🏾|👨🏿‍❤️‍💋‍👨🏿|👩🏼‍❤️‍💋‍👩🏿|👩🏼‍❤️‍💋‍👩🏾|👨🏻‍❤️‍💋‍👨🏼|👨🏻‍❤️‍💋‍👨🏻|🧑🏼‍❤️‍💋‍🧑🏻|🧑🏼‍❤️‍💋‍🧑🏽|🧑🏼‍❤️‍💋‍🧑🏾|🧑🏼‍❤️‍💋‍🧑🏿|🧑🏽‍❤️‍💋‍🧑🏻|🧑🏽‍❤️‍💋‍🧑🏼|🧑🏽‍❤️‍💋‍🧑🏾|🧑🏽‍❤️‍💋‍🧑🏿|🧑🏾‍❤️‍💋‍🧑🏻|🧑🏾‍❤️‍💋‍🧑🏼|🧑🏾‍❤️‍💋‍🧑🏽|🧑🏾‍❤️‍💋‍🧑🏿|🧑🏿‍❤️‍💋‍🧑🏾|🧑🏿‍❤️‍💋‍🧑🏽|🧑🏿‍❤️‍💋‍🧑🏻|🧑🏿‍❤️‍💋‍🧑🏼|👩🏼‍❤️‍💋‍👩🏽|👩🏿‍❤️‍💋‍👩🏾|👩🏿‍❤️‍💋‍👩🏿|🧑🏻‍❤️‍💋‍🧑🏼|🧑🏻‍❤️‍💋‍🧑🏽|🧑🏻‍❤️‍💋‍🧑🏾|🧑🏻‍❤️‍💋‍🧑🏿|👨🏻‍❤️‍💋‍👨🏿|👨🏻‍❤️‍💋‍👨🏾|👨🏻‍❤️‍💋‍👨🏽|👩🏽‍❤️‍👩🏻|👩🏽‍❤️‍👨🏿|👩🏽‍❤️‍👨🏾|👩🏽‍❤️‍👨🏽|👩🏽‍❤️‍👨🏼|👩🏽‍❤️‍👨🏻|🧑🏿‍❤️‍🧑🏾|🚶🏿‍♀️‍➡️|🚶🏾‍♂️‍➡️|🚶🏾‍♀️‍➡️|🏃🏿‍♂️‍➡️|👩🏽‍❤️‍👩🏼|👩🏽‍❤️‍👩🏽|👩🏽‍❤️‍👩🏾|🚶🏿‍♂️‍➡️|🧑🏿‍❤️‍🧑🏽|🧑🏿‍❤️‍🧑🏼|🧑🏿‍❤️‍🧑🏻|🏃🏻‍♂️‍➡️|🏃🏻‍♀️‍➡️|👩🏼‍❤️‍👨🏻|👩🏼‍❤️‍👨🏼|👩🏼‍❤️‍👨🏽|🏃🏼‍♀️‍➡️|🏃🏼‍♂️‍➡️|👩🏼‍❤️‍👨🏾|🏃🏽‍♀️‍➡️|🏃🏽‍♂️‍➡️|🏃🏾‍♀️‍➡️|👩🏼‍❤️‍👨🏿|👩🏼‍❤️‍👩🏻|👩🏼‍❤️‍👩🏼|👩🏼‍❤️‍👩🏽|🏃🏾‍♂️‍➡️|🏃🏿‍♀️‍➡️|👩🏼‍❤️‍👩🏾|👩🏼‍❤️‍👩🏿|🚶🏻‍♀️‍➡️|🚶🏻‍♂️‍➡️|🚶🏼‍♀️‍➡️|🚶🏼‍♂️‍➡️|🚶🏽‍♀️‍➡️|🚶🏽‍♂️‍➡️|👩🏽‍❤️‍👩🏿|👩🏾‍❤️‍👩🏻|👩🏾‍❤️‍👩🏼|👩🏾‍❤️‍👩🏽|👩🏾‍❤️‍👩🏾|👩🏾‍❤️‍👩🏿|🧑🏼‍❤️‍🧑🏿|🧑🏼‍❤️‍🧑🏾|🧑🏼‍❤️‍🧑🏽|🧑🏼‍❤️‍🧑🏻|🧑🏻‍❤️‍🧑🏿|👩🏿‍❤️‍👨🏻|👩🏿‍❤️‍👨🏼|👩🏿‍❤️‍👨🏽|👩🏿‍❤️‍👨🏾|👩🏿‍❤️‍👨🏿|👩🏿‍❤️‍👩🏻|👩🏿‍❤️‍👩🏼|👩🏿‍❤️‍👩🏽|👩🏿‍❤️‍👩🏾|👩🏿‍❤️‍👩🏿|🧑🏻‍❤️‍🧑🏾|🧑🏻‍❤️‍🧑🏽|🧑🏻‍❤️‍🧑🏼|🧑🏾‍❤️‍🧑🏿|🧑🏾‍❤️‍🧑🏽|🧑🏾‍❤️‍🧑🏼|🧑🏾‍❤️‍🧑🏻|🧎🏿‍♂️‍➡️|🧎🏿‍♀️‍➡️|🧎🏾‍♂️‍➡️|🧎🏾‍♀️‍➡️|🧎🏽‍♂️‍➡️|🧎🏽‍♀️‍➡️|🧑🏽‍❤️‍🧑🏿|🧑🏽‍❤️‍🧑🏾|🧑🏽‍❤️‍🧑🏼|🧑🏽‍❤️‍🧑🏻|🧎🏼‍♂️‍➡️|🧎🏼‍♀️‍➡️|🧎🏻‍♂️‍➡️|🧎🏻‍♀️‍➡️|👩🏾‍❤️‍👨🏻|👩🏾‍❤️‍👨🏼|👩🏾‍❤️‍👨🏽|👩🏾‍❤️‍👨🏾|👩🏾‍❤️‍👨🏿|👩🏻‍❤️‍👩🏻|👩🏻‍❤️‍👨🏿|👩🏻‍❤️‍👨🏾|👩🏻‍❤️‍👨🏽|👩🏻‍❤️‍👨🏼|👩🏻‍❤️‍👨🏻|👨🏽‍❤️‍👨🏼|👨🏻‍❤️‍👨🏾|👨🏼‍❤️‍👨🏻|👩‍❤️‍💋‍👩|👩‍❤️‍💋‍👨|👨🏼‍❤️‍👨🏼|👨🏼‍❤️‍👨🏽|👨🏼‍❤️‍👨🏾|👨🏼‍❤️‍👨🏿|👨🏻‍❤️‍👨🏽|👨🏻‍❤️‍👨🏼|👨🏻‍❤️‍👨🏻|👨🏽‍❤️‍👨🏽|👨‍❤️‍💋‍👨|👨🏾‍❤️‍👨🏼|👨🏾‍❤️‍👨🏽|👨🏿‍❤️‍👨🏿|👨🏾‍❤️‍👨🏾|👨🏿‍❤️‍👨🏾|👨🏾‍❤️‍👨🏿|👨🏿‍❤️‍👨🏽|👨🏾‍❤️‍👨🏻|👨🏿‍❤️‍👨🏼|👨🏻‍❤️‍👨🏿|👨🏿‍❤️‍👨🏻|👨🏽‍❤️‍👨🏿|👨🏽‍❤️‍👨🏾|👨🏽‍❤️‍👨🏻|👩🏻‍❤️‍👩🏿|👩🏻‍❤️‍👩🏾|👩🏻‍❤️‍👩🏽|👩🏻‍❤️‍👩🏼|🧑🏼‍🐰‍🧑🏿|👨‍👨‍👧‍👦|🧑🏼‍🐰‍🧑🏾|🧑🏼‍🐰‍🧑🏽|🧑🏼‍🐰‍🧑🏻|🧑🏽‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏻|🧑🏼‍🫯‍🧑🏽|🧑🏼‍🫯‍🧑🏾|🧑🏾‍🤝‍🧑🏻|🧑🏾‍🤝‍🧑🏼|🧑🏾‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏾‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏿|🧑🏽‍🐰‍🧑🏻|🧑🏽‍🐰‍🧑🏼|🧑🏽‍🐰‍🧑🏾|🧑🏽‍🐰‍🧑🏿|👨‍👨‍👦‍👦|🧑🏽‍🫯‍🧑🏻|👨‍👩‍👦‍👦|👨‍👩‍👧‍👦|👨‍👩‍👧‍👧|🧑🏻‍🤝‍🧑🏿|🧑🏻‍🤝‍🧑🏾|🧑🏻‍🤝‍🧑🏽|🧑🏻‍🤝‍🧑🏼|🧑🏻‍🤝‍🧑🏻|👨🏻‍🐰‍👨🏼|👨🏻‍🐰‍👨🏽|👨🏻‍🐰‍👨🏾|👨🏻‍🐰‍👨🏿|👨🏻‍🤝‍👨🏼|👨🏻‍🤝‍👨🏽|👨🏻‍🤝‍👨🏾|🧑‍🧑‍🧒‍🧒|👩🏿‍🫯‍👩🏾|👩🏿‍🫯‍👩🏽|🧑🏽‍🤝‍🧑🏾|🧑🏽‍🤝‍🧑🏽|🧑🏽‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏻|🧑🏻‍🫯‍🧑🏿|🧑🏻‍🫯‍🧑🏾|🧑🏻‍🫯‍🧑🏽|🧑🏻‍🫯‍🧑🏼|👨‍👨‍👧‍👧|🧑🏻‍🐰‍🧑🏿|🧑🏻‍🐰‍🧑🏾|🧑🏻‍🐰‍🧑🏽|🧑🏼‍🤝‍🧑🏿|🧑🏼‍🤝‍🧑🏾|🧑🏼‍🤝‍🧑🏽|🧑🏼‍🤝‍🧑🏼|🧑🏼‍🤝‍🧑🏻|🧑🏻‍🐰‍🧑🏼|🧑🏽‍🦼‍➡️|🧑🏽‍🦯‍➡️|🧑🏼‍🦽‍➡️|🧑🏼‍🦼‍➡️|🧑🏼‍🦯‍➡️|🧑🏻‍🦽‍➡️|🧑🏻‍🦼‍➡️|🧑🏻‍🦯‍➡️|👩🏿‍🦽‍➡️|👩🏿‍🦼‍➡️|👩🏿‍🦯‍➡️|👩🏾‍🦽‍➡️|👩🏾‍🦼‍➡️|👩🏾‍🦯‍➡️|👩🏽‍🦽‍➡️|👩🏽‍🦼‍➡️|👩🏽‍🦯‍➡️|👩🏼‍🦽‍➡️|🧑🏿‍🫯‍🧑🏾|🧑🏿‍🫯‍🧑🏽|🧑🏿‍🫯‍🧑🏼|🧑🏿‍🫯‍🧑🏻|🧑🏿‍🐰‍🧑🏾|🧑🏿‍🐰‍🧑🏽|🧑🏿‍🐰‍🧑🏼|🧑🏿‍🐰‍🧑🏻|🧑🏾‍🫯‍🧑🏿|🏃‍♂️‍➡️|🏃‍♀️‍➡️|🧑🏿‍🦽‍➡️|🧑🏿‍🦼‍➡️|🧑🏿‍🦯‍➡️|🧑🏾‍🦽‍➡️|🧑🏾‍🦼‍➡️|🧑🏾‍🦯‍➡️|🧑🏽‍🦽‍➡️|👩🏼‍🦼‍➡️|👨🏻‍🦼‍➡️|🚶‍♂️‍➡️|👨🏻‍🦯‍➡️|🧑🏾‍🫯‍🧑🏽|🧑🏾‍🫯‍🧑🏼|🧑🏾‍🫯‍🧑🏻|🧑🏿‍🤝‍🧑🏿|🧑🏾‍🐰‍🧑🏿|🧑🏿‍🤝‍🧑🏾|🧑🏾‍🐰‍🧑🏽|🧑🏿‍🤝‍🧑🏽|🧑🏾‍🐰‍🧑🏼|🧑🏿‍🤝‍🧑🏼|🧑🏾‍🐰‍🧑🏻|🧑🏿‍🤝‍🧑🏻|🧑🏽‍🫯‍🧑🏿|🧑🏽‍🫯‍🧑🏾|🧑🏽‍🫯‍🧑🏼|👩🏼‍🦯‍➡️|👩🏻‍🦽‍➡️|👩🏻‍🦼‍➡️|👩🏻‍🦯‍➡️|👨🏿‍🦽‍➡️|👨🏿‍🦼‍➡️|👨🏿‍🦯‍➡️|👨🏾‍🦽‍➡️|👨🏾‍🦼‍➡️|👨🏾‍🦯‍➡️|👨🏽‍🦽‍➡️|👨🏽‍🦼‍➡️|👨🏽‍🦯‍➡️|👨🏼‍🦽‍➡️|👨🏼‍🦼‍➡️|👨🏼‍🦯‍➡️|👨🏻‍🦽‍➡️|🚶‍♀️‍➡️|👩🏿‍🫯‍👩🏼|👨🏾‍🫯‍👨🏻|👨🏾‍🫯‍👨🏼|👨🏾‍🫯‍👨🏽|👨🏾‍🫯‍👨🏿|👨🏿‍🐰‍👨🏻|👨🏿‍🐰‍👨🏼|👨🏿‍🐰‍👨🏽|👨🏿‍🐰‍👨🏾|👨🏿‍🤝‍👨🏻|👨🏿‍🤝‍👨🏼|👨🏿‍🤝‍👨🏽|👨🏿‍🤝‍👨🏾|👨🏿‍🫯‍👨🏻|👩🏼‍🫯‍👩🏿|👩🏼‍🫯‍👩🏾|👩🏼‍🫯‍👩🏽|👩🏼‍🫯‍👩🏻|👨🏾‍🐰‍👨🏻|👩🏽‍🤝‍👩🏻|👨🏾‍🐰‍👨🏼|👩🏽‍🤝‍👨🏿|👨🏾‍🐰‍👨🏽|👩🏽‍🤝‍👨🏾|👨🏾‍🐰‍👨🏿|👩🏽‍🤝‍👨🏼|👨🏾‍🤝‍👨🏻|👩🏽‍🤝‍👨🏻|👨🏾‍🤝‍👨🏼|👩🏽‍🐰‍👩🏿|👩🏽‍🐰‍👩🏾|👩🏽‍🐰‍👩🏼|👩🏽‍🐰‍👩🏻|👨🏾‍🤝‍👨🏽|👨🏾‍🤝‍👨🏿|👩‍👩‍👧‍👧|👩🏻‍🫯‍👩🏿|👩🏻‍🫯‍👩🏾|👩🏻‍🫯‍👩🏽|👩🏻‍🫯‍👩🏼|👩🏻‍🤝‍👩🏿|👩🏻‍🤝‍👩🏾|👩🏻‍🤝‍👩🏽|👩🏻‍🤝‍👩🏼|👩🏻‍🤝‍👨🏿|👩🏻‍🤝‍👨🏾|👩🏻‍🤝‍👨🏽|👩🏻‍🤝‍👨🏼|👩🏻‍🐰‍👩🏿|👩🏻‍🐰‍👩🏾|👩🏻‍🐰‍👩🏽|👩🏻‍🐰‍👩🏼|👩🏼‍🤝‍👩🏿|👩🏼‍🤝‍👩🏾|👩🏼‍🤝‍👩🏽|👩🏼‍🤝‍👩🏻|👩🏼‍🤝‍👨🏿|👩🏼‍🤝‍👨🏾|👩🏼‍🤝‍👨🏽|👩🏼‍🤝‍👨🏻|👩🏼‍🐰‍👩🏿|👩🏼‍🐰‍👩🏾|👩🏼‍🐰‍👩🏽|👩🏼‍🐰‍👩🏻|👨🏿‍🫯‍👨🏼|👨🏿‍🫯‍👨🏽|👨🏿‍🫯‍👨🏾|👩‍👩‍👦‍👦|👨🏼‍🐰‍👨🏻|👨🏼‍🐰‍👨🏽|👨🏼‍🐰‍👨🏾|👨🏼‍🐰‍👨🏿|👨🏼‍🤝‍👨🏻|👨🏼‍🤝‍👨🏽|👨🏼‍🤝‍👨🏾|👨🏼‍🤝‍👨🏿|👨🏼‍🫯‍👨🏻|👨🏼‍🫯‍👨🏽|👩🏾‍🫯‍👩🏿|👩🏾‍🫯‍👩🏽|👩🏾‍🫯‍👩🏼|👩🏾‍🫯‍👩🏻|👩🏾‍🤝‍👩🏿|👩🏾‍🤝‍👩🏽|👩🏾‍🤝‍👩🏼|👩🏾‍🤝‍👩🏻|👩🏿‍🫯‍👩🏻|👩🏿‍🤝‍👩🏾|👩🏿‍🤝‍👩🏽|👩🏿‍🤝‍👩🏼|👩🏿‍🤝‍👩🏻|👩🏿‍🤝‍👨🏾|👩🏿‍🤝‍👨🏽|👩🏿‍🤝‍👨🏼|👩🏿‍🤝‍👨🏻|👩🏿‍🐰‍👩🏾|👩🏿‍🐰‍👩🏽|👩🏿‍🐰‍👩🏼|👩🏿‍🐰‍👩🏻|👨🏻‍🤝‍👨🏿|👨🏻‍🫯‍👨🏼|👨🏻‍🫯‍👨🏽|👨🏻‍🫯‍👨🏾|👨🏻‍🫯‍👨🏿|👩🏾‍🤝‍👨🏿|👨🏽‍🐰‍👨🏿|👨🏽‍🤝‍👨🏻|👨🏽‍🤝‍👨🏼|👨🏽‍🤝‍👨🏾|👨🏽‍🤝‍👨🏿|👨🏽‍🫯‍👨🏻|👨🏽‍🫯‍👨🏼|👨🏽‍🫯‍👨🏾|👨🏽‍🫯‍👨🏿|👩🏽‍🫯‍👩🏿|🧎‍♀️‍➡️|👩🏽‍🫯‍👩🏾|🧎‍♂️‍➡️|👩🏽‍🫯‍👩🏼|👩🏽‍🫯‍👩🏻|👩🏽‍🤝‍👩🏿|👩🏽‍🤝‍👩🏾|👩🏽‍🤝‍👩🏼|👩🏾‍🤝‍👨🏽|👩🏾‍🤝‍👨🏼|👩🏾‍🤝‍👨🏻|👩🏾‍🐰‍👩🏿|👩🏾‍🐰‍👩🏽|👩🏾‍🐰‍👩🏼|👩🏾‍🐰‍👩🏻|👨🏼‍🫯‍👨🏾|👨🏼‍🫯‍👨🏿|👨🏽‍🐰‍👨🏻|👨🏽‍🐰‍👨🏼|👨🏽‍🐰‍👨🏾|👩‍👩‍👧‍👦|👨‍🦽‍➡️|🧑‍🦯‍➡️|👨‍🦼‍➡️|🧑‍🦼‍➡️|👨‍🦯‍➡️|🧑‍🦽‍➡️|👩‍❤️‍👩|👩‍❤️‍👨|👩‍🦯‍➡️|👨‍❤️‍👨|👩‍🦼‍➡️|👩‍🦽‍➡️|🧖🏾‍♀️|🧖🏽‍♂️|🧖🏽‍♀️|🧖🏼‍♂️|🧖🏼‍♀️|🧖🏻‍♂️|🧖🏻‍♀️|👩🏾‍✈️|👩🏾‍⚖️|👩🏾‍⚕️|🧔🏿‍♂️|🧔🏿‍♀️|🧔🏾‍♂️|🚴🏻‍♀️|🧔🏾‍♀️|🧔🏽‍♂️|🧔🏽‍♀️|🧔🏼‍♂️|🧔🏼‍♀️|🧔🏻‍♂️|🧔🏻‍♀️|🧘🏻‍♂️|🧘🏻‍♀️|🧗🏿‍♂️|🧗🏿‍♀️|🧗🏾‍♂️|🧗🏾‍♀️|🧗🏽‍♂️|🧗🏽‍♀️|👩🏿‍✈️|👩🏿‍⚖️|👩🏿‍⚕️|🚣🏾‍♂️|🧗🏼‍♂️|🚣🏿‍♀️|🧗🏼‍♀️|🚣🏿‍♂️|🧗🏻‍♂️|🧗🏻‍♀️|🧖🏿‍♂️|🧖🏿‍♀️|🧖🏾‍♂️|🧎🏽‍♀️|🧎🏼‍♂️|🧎🏼‍♀️|🧎🏻‍♂️|🧎🏻‍♀️|👩🏼‍✈️|👩🏼‍⚖️|👩🏼‍⚕️|🚴🏽‍♀️|🚴🏽‍♂️|🧍🏿‍♂️|🚴🏾‍♀️|🧍🏿‍♀️|🧍🏾‍♂️|🧍🏾‍♀️|🧍🏽‍♂️|🧍🏽‍♀️|🧍🏼‍♂️|🧍🏼‍♀️|🧍🏻‍♂️|🧍🏻‍♀️|🧏🏿‍♂️|🧏🏿‍♀️|🧏🏾‍♂️|🧏🏾‍♀️|🧏🏽‍♂️|🧏🏽‍♀️|👩🏽‍✈️|👩🏽‍⚖️|👩🏽‍⚕️|🚴🏻‍♂️|🧏🏼‍♂️|🚴🏼‍♀️|🧏🏼‍♀️|🚴🏼‍♂️|🧏🏻‍♂️|🧏🏻‍♀️|🧎🏿‍♂️|🧎🏿‍♀️|🧎🏾‍♂️|🧎🏾‍♀️|🧎🏽‍♂️|🧑🏼‍⚕️|👩‍👧‍👧|👩‍👩‍👦|🧜🏻‍♀️|👩‍👩‍👧|🚣🏻‍♀️|🧛🏿‍♂️|🧛🏿‍♀️|🧛🏾‍♂️|🧛🏾‍♀️|🧛🏽‍♂️|🧛🏽‍♀️|🧛🏼‍♂️|🧛🏼‍♀️|🧛🏻‍♂️|🧛🏻‍♀️|🧚🏿‍♂️|🧚🏿‍♀️|🧑🏻‍✈️|🧑🏻‍⚖️|🧑🏻‍⚕️|🙎🏾‍♂️|🧝🏽‍♀️|🙎🏿‍♀️|🧝🏼‍♂️|🙎🏿‍♂️|🧝🏼‍♀️|🧝🏻‍♂️|🧝🏻‍♀️|🧜🏿‍♂️|🧜🏿‍♀️|🧜🏾‍♂️|🧜🏾‍♀️|🧜🏽‍♂️|🧜🏽‍♀️|🧜🏼‍♂️|🧜🏼‍♀️|🧜🏻‍♂️|👩‍👦‍👦|👩‍👧‍👦|🧑🏼‍✈️|🧑🏼‍⚖️|🧎🏿‍➡️|🧎🏾‍➡️|🧎🏽‍➡️|🧎🏼‍➡️|🧎🏻‍➡️|🚶🏿‍➡️|🚶🏾‍➡️|🚶🏽‍➡️|🚶🏼‍➡️|🚶🏻‍➡️|🧘🏿‍♂️|🚣🏽‍♀️|🧘🏿‍♀️|🚣🏽‍♂️|🧘🏾‍♂️|🚣🏾‍♀️|🧘🏾‍♀️|🧘🏽‍♂️|🧘🏽‍♀️|🧘🏼‍♂️|🧘🏼‍♀️|🚣🏻‍♂️|🧚🏾‍♂️|🚣🏼‍♀️|🧚🏾‍♀️|🚣🏼‍♂️|🧚🏽‍♂️|🧚🏽‍♀️|🧚🏼‍♂️|🧚🏼‍♀️|🧚🏻‍♂️|🧚🏻‍♀️|🧙🏿‍♂️|🧙🏿‍♀️|🧙🏾‍♂️|🧙🏾‍♀️|🧙🏽‍♂️|🧙🏽‍♀️|🧙🏼‍♂️|🧙🏼‍♀️|🧙🏻‍♂️|🧙🏻‍♀️|👨🏼‍✈️|👨🏼‍⚖️|👨🏼‍⚕️|🤷🏼‍♀️|🤷🏻‍♂️|🤷🏻‍♀️|🚶🏻‍♀️|🤵🏿‍♂️|🤵🏿‍♀️|🤵🏾‍♂️|🤵🏾‍♀️|🤵🏽‍♂️|🤵🏽‍♀️|🤵🏼‍♂️|🤵🏼‍♀️|🤵🏻‍♂️|🤵🏻‍♀️|🤦🏿‍♂️|🤦🏿‍♀️|👨🏻‍✈️|👨🏻‍⚖️|👨🏽‍✈️|👨🏽‍⚖️|👨🏽‍⚕️|🚵🏾‍♂️|🤸🏾‍♂️|🚵🏿‍♀️|🤸🏾‍♀️|🚵🏿‍♂️|🤸🏽‍♂️|🤸🏽‍♀️|🤸🏼‍♂️|🤸🏼‍♀️|🤸🏻‍♂️|🤸🏻‍♀️|🤷🏿‍♂️|🤷🏿‍♀️|🤷🏾‍♂️|🤷🏾‍♀️|🤷🏽‍♂️|🤷🏽‍♀️|🤷🏼‍♂️|🫱🏻‍🫲🏿|🏃🏿‍➡️|🏃🏾‍➡️|🏃🏽‍➡️|🏃🏼‍➡️|🏃🏻‍➡️|🫱🏼‍🫲🏻|🫱🏿‍🫲🏾|🫱🏿‍🫲🏽|🫱🏿‍🫲🏼|🫱🏿‍🫲🏻|🫱🏾‍🫲🏿|🫱🏾‍🫲🏽|🫱🏾‍🫲🏼|🫱🏾‍🫲🏻|🫱🏽‍🫲🏿|🫱🏽‍🫲🏾|🫱🏽‍🫲🏼|🫱🏽‍🫲🏻|🫱🏼‍🫲🏿|🫱🏼‍🫲🏾|👨🏻‍⚕️|🚶🏻‍♂️|🤦🏾‍♂️|🚶🏼‍♀️|🤦🏾‍♀️|🚶🏼‍♂️|🤦🏽‍♂️|🤦🏽‍♀️|🤦🏼‍♂️|🤦🏼‍♀️|🤦🏻‍♂️|🤦🏻‍♀️|🚶🏿‍♂️|🚶🏿‍♀️|🚶🏾‍♂️|🚶🏾‍♀️|🚶🏽‍♂️|🚶🏽‍♀️|🫱🏻‍🫲🏼|🫱🏻‍🫲🏽|🫱🏻‍🫲🏾|🦸🏽‍♀️|🦸🏼‍♂️|🦸🏼‍♀️|🦸🏻‍♂️|🦸🏻‍♀️|🤾🏿‍♂️|🤾🏿‍♀️|🤾🏾‍♂️|🤾🏾‍♀️|🚵🏻‍♀️|🤾🏽‍♂️|🤾🏽‍♀️|🤾🏼‍♂️|🤾🏼‍♀️|🤾🏻‍♂️|🤾🏻‍♀️|🤽🏿‍♂️|🤽🏿‍♀️|🤽🏾‍♂️|🤽🏾‍♀️|🤽🏽‍♂️|🦹🏿‍♂️|🦹🏿‍♀️|🦹🏾‍♂️|🦹🏾‍♀️|👩🏻‍✈️|👩🏻‍⚖️|👩🏻‍⚕️|🚴🏾‍♂️|🦹🏽‍♂️|🚴🏿‍♀️|🦹🏽‍♀️|🚴🏿‍♂️|🦹🏼‍♂️|🦹🏼‍♀️|🦹🏻‍♂️|🦹🏻‍♀️|🦸🏿‍♂️|🦸🏿‍♀️|🦸🏾‍♂️|🦸🏾‍♀️|🦸🏽‍♂️|👨🏾‍✈️|👨🏾‍⚖️|👨🏾‍⚕️|🚵🏽‍♀️|🧑‍🤝‍🧑|🚵🏽‍♂️|🧑‍🧑‍🧒|🚵🏾‍♀️|🤹🏿‍♂️|🧑‍🧒‍🧒|🤹🏿‍♀️|🤹🏾‍♂️|🤹🏾‍♀️|🤹🏽‍♂️|🤹🏽‍♀️|🤹🏼‍♂️|🤹🏼‍♀️|🤹🏻‍♂️|🤹🏻‍♀️|🤸🏿‍♂️|🤸🏿‍♀️|🤽🏽‍♀️|🤽🏼‍♂️|👨🏿‍✈️|👨🏿‍⚖️|👨🏿‍⚕️|🚵🏻‍♂️|🤽🏼‍♀️|🚵🏼‍♀️|🤽🏻‍♂️|🚵🏼‍♂️|🤽🏻‍♀️|🤼🏿‍♂️|🤼🏿‍♀️|🤼🏾‍♂️|🤼🏾‍♀️|🤼🏽‍♂️|🤼🏽‍♀️|🤼🏼‍♂️|🤼🏼‍♀️|🤼🏻‍♂️|🤼🏻‍♀️|👷🏽‍♀️|👷🏼‍♂️|👷🏼‍♀️|👷🏻‍♂️|👷🏻‍♀️|👳🏿‍♂️|👳🏿‍♀️|👳🏾‍♂️|👳🏾‍♀️|👳🏽‍♂️|👳🏽‍♀️|👳🏼‍♂️|👳🏼‍♀️|👳🏻‍♂️|👳🏻‍♀️|🏳️‍⚧️|👱🏿‍♂️|👱🏿‍♀️|👱🏾‍♂️|👱🏾‍♀️|👱🏽‍♂️|💂🏽‍♀️|💂🏼‍♂️|💂🏼‍♀️|💂🏻‍♂️|💂🏻‍♀️|💁🏿‍♂️|💁🏿‍♀️|💁🏾‍♂️|💁🏾‍♀️|💁🏽‍♂️|💁🏽‍♀️|💁🏼‍♂️|💁🏼‍♀️|💁🏻‍♂️|💁🏻‍♀️|👁️‍🗨️|👷🏿‍♂️|👷🏿‍♀️|👷🏾‍♂️|👷🏾‍♀️|👷🏽‍♂️|👯🏼‍♂️|👯🏼‍♀️|👯🏻‍♂️|👯🏻‍♀️|👮🏿‍♂️|👮🏿‍♀️|👮🏾‍♂️|👮🏾‍♀️|👮🏽‍♂️|👮🏽‍♀️|👮🏼‍♂️|👮🏼‍♀️|👮🏻‍♂️|👮🏻‍♀️|🏌️‍♂️|🏌️‍♀️|🏌🏿‍♂️|🏌🏿‍♀️|🏌🏾‍♂️|🏌🏾‍♀️|🏌🏽‍♂️|👱🏽‍♀️|👱🏼‍♂️|👱🏼‍♀️|👱🏻‍♂️|👱🏻‍♀️|👰🏿‍♂️|👰🏿‍♀️|👰🏾‍♂️|👰🏾‍♀️|👰🏽‍♂️|👰🏽‍♀️|👰🏼‍♂️|👰🏼‍♀️|👰🏻‍♂️|👰🏻‍♀️|👯🏿‍♂️|👯🏿‍♀️|👯🏾‍♂️|👯🏾‍♀️|👯🏽‍♂️|👯🏽‍♀️|👨‍👧‍👦|🙆🏿‍♂️|🙆🏿‍♀️|🙆🏾‍♂️|🙆🏾‍♀️|🙆🏽‍♂️|🙆🏽‍♀️|🙆🏼‍♂️|🙆🏼‍♀️|🙆🏻‍♂️|🙆🏻‍♀️|👨‍👧‍👧|👨‍👨‍👦|🙅🏿‍♂️|🙅🏿‍♀️|🙅🏾‍♂️|🙅🏾‍♀️|🙅🏽‍♂️|🙅🏽‍♀️|🙅🏼‍♂️|🙅🏼‍♀️|🙋🏿‍♂️|🙋🏿‍♀️|🙋🏾‍♂️|🙋🏾‍♀️|🙋🏽‍♂️|🙋🏽‍♀️|🙋🏼‍♂️|🙋🏼‍♀️|🙋🏻‍♂️|🙋🏻‍♀️|🙇🏿‍♂️|🙇🏿‍♀️|🙇🏾‍♂️|🙇🏾‍♀️|🙇🏽‍♂️|🙇🏽‍♀️|🙇🏼‍♂️|🙇🏼‍♀️|🙇🏻‍♂️|🙇🏻‍♀️|👨‍👦‍👦|💇🏼‍♂️|💇🏼‍♀️|💇🏻‍♂️|💇🏻‍♀️|💆🏿‍♂️|💆🏿‍♀️|💆🏾‍♂️|💆🏾‍♀️|💆🏽‍♂️|💆🏽‍♀️|💆🏼‍♂️|💆🏼‍♀️|💆🏻‍♂️|💆🏻‍♀️|👨‍👩‍👦|👨‍👩‍👧|💂🏿‍♂️|💂🏿‍♀️|💂🏾‍♂️|💂🏾‍♀️|💂🏽‍♂️|🙅🏻‍♂️|🙅🏻‍♀️|👨‍👨‍👧|🕵️‍♂️|🕵️‍♀️|🕵🏿‍♂️|🕵🏿‍♀️|🕵🏾‍♂️|🕵🏾‍♀️|🕵🏽‍♂️|🕵🏽‍♀️|🕵🏼‍♂️|🕵🏼‍♀️|🕵🏻‍♂️|🕵🏻‍♀️|💇🏿‍♂️|💇🏿‍♀️|💇🏾‍♂️|💇🏾‍♀️|💇🏽‍♂️|💇🏽‍♀️|🏌🏽‍♀️|⛹🏾‍♀️|⛹🏾‍♂️|⛹🏿‍♀️|⛹🏿‍♂️|⛹️‍♀️|⛹️‍♂️|🙍🏿‍♂️|🙍🏿‍♀️|🏃🏻‍♀️|🙍🏾‍♂️|🏃🏻‍♂️|🙍🏾‍♀️|🏃🏼‍♀️|🙍🏽‍♂️|🏃🏼‍♂️|🙍🏽‍♀️|🏃🏽‍♀️|🙍🏼‍♂️|🏃🏽‍♂️|🙍🏼‍♀️|🏃🏾‍♀️|🙍🏻‍♂️|🏃🏾‍♂️|🙍🏻‍♀️|🏃🏿‍♀️|🏃🏿‍♂️|🏄🏻‍♀️|🏄🏻‍♂️|🫱🏼‍🫲🏽|🧑🏽‍⚕️|🧑🏽‍⚖️|🧑🏽‍✈️|🧝🏽‍♂️|🧝🏾‍♀️|🧝🏾‍♂️|🧝🏿‍♀️|🧝🏿‍♂️|🙎🏾‍♀️|🙎🏽‍♂️|🙎🏽‍♀️|🧑🏾‍⚕️|🧑🏾‍⚖️|🧑🏾‍✈️|🙎🏼‍♂️|🙎🏼‍♀️|🙎🏻‍♂️|🧑🏿‍⚕️|🧑🏿‍⚖️|🧑🏿‍✈️|🙎🏻‍♀️|⛹🏻‍♀️|⛹🏻‍♂️|⛹🏼‍♀️|⛹🏼‍♂️|⛹🏽‍♀️|⛹🏽‍♂️|🏊🏻‍♀️|🏊🏻‍♂️|🏊🏼‍♀️|🏊🏼‍♂️|🏊🏽‍♀️|🏊🏽‍♂️|🏊🏾‍♀️|🏊🏾‍♂️|🏊🏿‍♀️|🏊🏿‍♂️|🏋🏻‍♀️|🏋🏻‍♂️|🏋🏼‍♀️|🏋🏼‍♂️|🏋🏽‍♀️|🏋🏽‍♂️|🏋🏾‍♀️|🏋🏾‍♂️|🏋🏿‍♀️|🏋🏿‍♂️|🏋️‍♀️|🏋️‍♂️|🏌🏻‍♀️|🏌🏻‍♂️|🏌🏼‍♀️|🏌🏼‍♂️|🏄🏿‍♀️|🏄🏾‍♂️|🏄🏾‍♀️|🏄🏽‍♂️|🏄🏽‍♀️|🏄🏿‍♂️|🏄🏼‍♂️|🏄🏼‍♀️|🤾‍♂️|👨🏽‍🦱|👨🏽‍🦲|👨🏽‍🦳|🧜‍♀️|👨🏾‍🦰|👨🏾‍🦱|👨🏾‍🦲|👨🏾‍🦳|👨🏿‍🦰|👨🏿‍🦱|🧜‍♂️|🤦‍♂️|🤷‍♀️|👩🏼‍🦲|🧑🏽‍🦱|👩🏼‍🦱|🤾‍♀️|👩🏼‍🦰|👩🏻‍🦳|👩🏻‍🦲|👩🏻‍🦱|👩🏻‍🦰|👨🏿‍🦳|🤵‍♂️|🤵‍♀️|🧑🏽‍🩰|👨🏿‍🦲|🧛‍♀️|🧛‍♂️|🧖‍♂️|🧎‍♂️|🧖‍♀️|🧑🏾‍🦰|🧑🏽‍🦳|🧑🏽‍🦲|🧝‍♂️|🧝‍♀️|🧑🏿‍🩰|🧑🏾‍🩰|🧎‍♀️|🧞‍♀️|🧞‍♂️|🧟‍♀️|🧟‍♂️|👨🏻‍🦰|👨🏻‍🦱|👨🏻‍🦲|👨🏻‍🦳|👨🏼‍🦰|👨🏼‍🦱|👨🏼‍🦲|🧏‍♀️|👨🏼‍🦳|🧑🏾‍🦳|👨🏽‍🦰|🧑🏿‍🦰|🧏‍♂️|❤️‍🩹|🤦‍♀️|🧑🏼‍🦰|🧑🏼‍🦱|🤹‍♀️|🤹‍♂️|🧑🏼‍🦲|🧍‍♀️|🧑🏿‍🦱|🧑🏿‍🦲|🧗‍♀️|🧗‍♂️|🙂‍↕️|🙂‍↔️|🏴‍☠️|🧔‍♀️|🧑🏼‍🦳|🧘‍♂️|🧘‍♀️|🧔‍♂️|🤼‍♀️|🤼‍♂️|😶‍🌫️|🧑🏽‍🦰|🐻‍❄️|🧑🏿‍🦳|⛓️‍💥|🦹‍♂️|🦹‍♀️|🧑🏾‍🦱|🧑🏾‍🦲|🤽‍♀️|🤽‍♂️|🏳️‍🌈|🤷‍♂️|🦸‍♀️|🦸‍♂️|❤️‍🔥|👩🏼‍🦳|🧚‍♂️|🧚‍♀️|👩🏽‍🦰|👩🏽‍🦱|👩🏽‍🦲|👩🏽‍🦳|👩🏾‍🦰|👩🏾‍🦱|🧑🏼‍🩰|🤸‍♀️|🤸‍♂️|🧑🏻‍🩰|👩🏾‍🦲|👩🏾‍🦳|👩🏿‍🦰|👩🏿‍🦱|🧙‍♂️|👩🏿‍🦲|👩🏿‍🦳|🧑🏻‍🦰|🧑🏻‍🦱|🧑🏻‍🦲|🧙‍♀️|🧍‍♂️|🧑🏻‍🦳|🚣‍♀️|🧑🏻‍🦽|🚣‍♂️|🧑🏻‍🦼|🧑🏻‍🦯|🧑🏻‍🚒|🧑🏻‍🚀|🧑🏻‍🔬|🧑🏻‍🔧|🧑🏻‍💼|🧑🏻‍💻|🧑🏻‍🏭|🧑🏻‍🏫|🧑🏻‍🎨|🧑🏻‍🎤|🧑🏻‍🎓|🧑🏻‍🎄|🧑🏻‍🍼|🧑🏻‍🍳|🧑🏻‍🌾|🧑‍✈️|🧑‍⚖️|🧑🏽‍🎄|🧑🏽‍🍼|🧑🏽‍🍳|🧑🏽‍🌾|🧑🏼‍🦽|🧑🏼‍🦼|🧑🏼‍🦯|🧑🏼‍🚒|🧑🏼‍🚀|🧑🏼‍🔬|🧑🏼‍🔧|🧑🏼‍💼|🧑🏼‍💻|🧑🏼‍🏭|🧑🏼‍🏫|🧑🏼‍🎨|🧑🏼‍🎤|🧑🏼‍🎓|🧑🏼‍🎄|🧑🏼‍🍼|🧑🏼‍🍳|🧑🏼‍🌾|👩🏾‍🦯|👩🏾‍🚒|👩🏾‍🚀|👩🏾‍🔬|👩🏾‍🔧|👩🏾‍💼|👩🏾‍💻|👩🏾‍🏭|👩🏾‍🏫|👩🏾‍🎨|👩🏾‍🎤|👩🏾‍🎓|👩🏾‍🍼|👩🏾‍🍳|👩🏾‍🌾|🚴‍♀️|👩🏽‍🦽|🚴‍♂️|👩🏽‍🦼|👩🏽‍🦯|👩🏽‍🚒|👩🏽‍🚀|🧑‍⚕️|🧎‍➡️|🚶‍➡️|👩🏿‍🦽|👩🏿‍🦼|👩🏿‍🦯|👩🏿‍🚒|👩🏿‍🚀|👩🏿‍🔬|👩🏿‍🔧|👩🏿‍💼|👩🏿‍💻|👩🏿‍🏭|👩🏿‍🏫|👩🏿‍🎨|👩🏿‍🎤|👩🏿‍🎓|👩🏿‍🍼|👩🏿‍🍳|👩🏿‍🌾|👩🏾‍🦽|👩🏾‍🦼|👰‍♂️|👰‍♀️|👯‍♂️|👯‍♀️|👮‍♂️|👮‍♀️|🏊‍♂️|🏊‍♀️|🏄‍♂️|🏄‍♀️|🙍‍♀️|🙍‍♂️|🏃‍♂️|🏃‍♀️|🙎‍♀️|🧑🏿‍🦽|🙎‍♂️|🧑🏿‍🦼|🧑🏿‍🦯|🧑🏿‍🚒|🧑🏿‍🚀|🧑🏿‍🔬|🙋‍♂️|🙋‍♀️|🙇‍♂️|🙇‍♀️|🙆‍♂️|🙆‍♀️|🙅‍♂️|🙅‍♀️|💇‍♂️|💇‍♀️|💆‍♂️|💆‍♀️|💂‍♂️|💂‍♀️|💁‍♂️|💁‍♀️|👷‍♂️|👷‍♀️|👳‍♂️|👳‍♀️|👱‍♂️|👱‍♀️|🧑🏾‍🏫|🧑🏾‍🎨|🧑🏾‍🎤|🧑🏾‍🎓|🧑🏾‍🎄|🧑🏾‍🍼|🧑🏾‍🍳|🧑🏾‍🌾|🧑🏽‍🦽|🧑🏽‍🦼|🧑🏽‍🦯|🧑🏽‍🚒|🧑🏽‍🚀|🧑🏽‍🔬|🧑🏽‍🔧|🧑🏽‍💼|🧑🏽‍💻|🧑🏽‍🏭|🧑🏽‍🏫|🧑🏽‍🎨|🧑🏽‍🎤|🧑🏽‍🎓|🧑🏿‍🔧|🧑🏿‍💼|🧑🏿‍💻|🧑🏿‍🏭|🧑🏿‍🏫|🧑🏿‍🎨|🧑🏿‍🎤|🧑🏿‍🎓|🧑🏿‍🎄|🧑🏿‍🍼|🧑🏿‍🍳|🧑🏿‍🌾|🧑🏾‍🦽|🧑🏾‍🦼|🧑🏾‍🦯|🧑🏾‍🚒|🧑🏾‍🚀|🧑🏾‍🔬|🧑🏾‍🔧|🧑🏾‍💼|🧑🏾‍💻|🧑🏾‍🏭|👨🏾‍🔧|👨🏾‍💼|👨🏾‍💻|👨🏾‍🏭|👨🏾‍🏫|👨🏾‍🎨|👨🏾‍🎤|👨🏾‍🎓|👨🏾‍🍼|👨🏾‍🍳|👨🏾‍🌾|👨🏽‍🦽|👨🏽‍🦼|👨🏽‍🦯|👨🏽‍🚒|👨🏽‍🚀|👨🏽‍🔬|👨🏽‍🔧|👨🏽‍💼|👨🏽‍💻|👨🏽‍🏭|👨🏽‍🏫|👨🏿‍🦼|👨🏿‍🦯|👨🏿‍🚒|👨🏿‍🚀|👨🏿‍🔬|👨🏿‍🔧|👨🏿‍💼|👨🏿‍💻|👨🏿‍🏭|👨🏿‍🏫|👨🏿‍🎨|👨🏿‍🎤|👨🏿‍🎓|👨🏿‍🍼|👨🏿‍🍳|👨🏿‍🌾|👨🏾‍🦽|👨🏾‍🦼|👨🏾‍🦯|👨🏾‍🚒|👨🏾‍🚀|👨🏾‍🔬|👨🏽‍🎨|🚶‍♀️|👨🏻‍🦽|🚶‍♂️|👨🏻‍🦼|👨🏻‍🦯|👨🏻‍🚒|👨🏻‍🚀|👨🏻‍🔬|👨🏻‍🔧|👨🏻‍💼|👨🏻‍💻|👨🏻‍🏭|👨🏻‍🏫|👨🏻‍🎨|👨🏻‍🎤|👨🏻‍🎓|👨🏻‍🍼|👨🏻‍🍳|👨🏻‍🌾|👨‍✈️|👨‍⚖️|👨‍⚕️|👨🏽‍🎤|👨🏽‍🎓|👨🏽‍🍼|👨🏽‍🍳|👨🏽‍🌾|👨🏼‍🦽|👨🏼‍🦼|👨🏼‍🦯|👨🏼‍🚒|👨🏼‍🚀|👨🏼‍🔬|👨🏼‍🔧|👨🏼‍💼|👨🏼‍💻|👨🏼‍🏭|👨🏼‍🏫|👨🏼‍🎨|👨🏼‍🎤|👨🏼‍🎓|👨🏼‍🍼|👨🏼‍🍳|👨🏼‍🌾|👩🏼‍🎨|👩🏼‍🎤|👩🏼‍🎓|👩🏼‍🍼|👩🏼‍🍳|👩🏼‍🌾|👩🏻‍🦽|👩🏻‍🦼|👩🏻‍🦯|👩🏻‍🚒|👩🏻‍🚀|👩🏻‍🔬|👩🏻‍🔧|👩🏻‍💼|👩🏻‍💻|👩🏻‍🏭|👩🏻‍🏫|👩🏻‍🎨|👩🏻‍🎤|👩🏻‍🎓|👩🏻‍🍼|👩🏻‍🍳|👩🏻‍🌾|👩🏽‍🔬|👩🏽‍🔧|👩🏽‍💼|👩🏽‍💻|👩🏽‍🏭|👩🏽‍🏫|👩🏽‍🎨|👩🏽‍🎤|👩🏽‍🎓|👩🏽‍🍼|👩🏽‍🍳|👩🏽‍🌾|👩🏼‍🦽|👩🏼‍🦼|👩🏼‍🦯|👩🏼‍🚒|👩🏼‍🚀|👩🏼‍🔬|👩🏼‍🔧|👩🏼‍💼|👩🏼‍💻|👩🏼‍🏭|👩🏼‍🏫|👨🏿‍🦽|🚵‍♀️|👩‍⚕️|👩‍⚖️|👩‍✈️|🚵‍♂️|🏃‍➡️|🐦‍🔥|🐦‍⬛|🐕‍🦺|🐈‍⬛|👨‍🚒|👨‍🦯|👨‍🦼|🍋‍🟩|🍄‍🟫|👨‍🦽|👩‍🎨|👩‍🎤|👩‍🎓|👩‍🌾|👩‍🍳|👩‍👦|👨‍👦|👨‍👧|👩‍👧|👨‍🌾|👨‍🍳|👨‍🍼|👨‍🎓|👨‍🎤|👨‍🎨|👨‍🏫|🧑‍🩰|👨‍🏭|👨‍💻|👨‍💼|👨‍🔧|😵‍💫|😮‍💨|👨‍🔬|👨‍🚀|🧑‍🦯|🧑‍🚒|🧑‍🚀|🧑‍🔬|🧑‍🔧|🧑‍💼|🧑‍💻|🧑‍🏭|🧑‍🏫|🧑‍🧒|🧑‍🎨|🧑‍🎤|🧑‍🎓|🧑‍🎄|🧑‍🍼|👩‍🦳|👩‍🦲|👩‍🦱|👩‍🦰|👩‍🦽|🧑‍🌾|👩‍🍼|👩‍🏫|👩‍🏭|👩‍💻|👩‍💼|👩‍🔧|👩‍🔬|👩‍🚀|👩‍🚒|👩‍🦯|👩‍🦼|👨‍🦰|🧑‍🦳|🧑‍🦲|🧑‍🦱|🧑‍🦰|👨‍🦱|👨‍🦲|👨‍🦳|🧑‍🦽|🧑‍🦼|🧑‍🍳)|(?:🏴󠁧󠁢󠁷󠁬󠁳󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁥󠁮󠁧󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_basic.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_basic.rb new file mode 100644 index 000000000..2f5f3ea98 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_basic.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_BASIC = /(?:(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_emoji_keycap.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_emoji_keycap.rb new file mode 100644 index 000000000..ca2277728 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_emoji_keycap.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_EMOJI_KEYCAP = /[\#\*0-9]️⃣/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_mqe.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_mqe.rb new file mode 100644 index 000000000..4c0de7a64 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_mqe.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_INCLUDE_MQE = /(?:(?:👩🏾‍❤️?‍💋‍👩🏻|👩🏾‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👨🏾|👨🏽‍❤️?‍💋‍👨🏻|👨🏽‍❤️?‍💋‍👨🏼|👨🏽‍❤️?‍💋‍👨🏽|👨🏽‍❤️?‍💋‍👨🏾|👨🏽‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👨🏽|👩🏾‍❤️?‍💋‍👨🏼|👩🏾‍❤️?‍💋‍👨🏻|👨🏾‍❤️?‍💋‍👨🏻|👨🏾‍❤️?‍💋‍👨🏼|👨🏾‍❤️?‍💋‍👨🏽|👨🏾‍❤️?‍💋‍👨🏾|👨🏾‍❤️?‍💋‍👨🏿|👩🏽‍❤️?‍💋‍👩🏿|👩🏿‍❤️?‍💋‍👩🏽|👩🏿‍❤️?‍💋‍👩🏼|👩🏿‍❤️?‍💋‍👩🏻|👩🏿‍❤️?‍💋‍👨🏿|👩🏿‍❤️?‍💋‍👨🏾|👩🏿‍❤️?‍💋‍👨🏽|👩🏿‍❤️?‍💋‍👨🏼|👩🏿‍❤️?‍💋‍👨🏻|👨🏼‍❤️?‍💋‍👨🏻|👨🏼‍❤️?‍💋‍👨🏼|👨🏼‍❤️?‍💋‍👨🏽|👨🏼‍❤️?‍💋‍👨🏾|👨🏼‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👩🏿|👩🏾‍❤️?‍💋‍👩🏾|👩🏾‍❤️?‍💋‍👩🏽|👩🏾‍❤️?‍💋‍👩🏼|👩🏼‍❤️?‍💋‍👩🏼|👩🏼‍❤️?‍💋‍👩🏻|👩🏼‍❤️?‍💋‍👨🏿|👩🏼‍❤️?‍💋‍👨🏾|👩🏼‍❤️?‍💋‍👨🏽|👩🏼‍❤️?‍💋‍👨🏼|👩🏼‍❤️?‍💋‍👨🏻|👩🏻‍❤️?‍💋‍👨🏻|👩🏻‍❤️?‍💋‍👨🏼|👩🏻‍❤️?‍💋‍👨🏽|👩🏻‍❤️?‍💋‍👨🏾|👩🏻‍❤️?‍💋‍👨🏿|👩🏻‍❤️?‍💋‍👩🏻|👩🏻‍❤️?‍💋‍👩🏼|👩🏻‍❤️?‍💋‍👩🏽|👩🏻‍❤️?‍💋‍👩🏾|👩🏻‍❤️?‍💋‍👩🏿|👩🏽‍❤️?‍💋‍👩🏾|👩🏽‍❤️?‍💋‍👩🏽|👩🏽‍❤️?‍💋‍👩🏼|👩🏽‍❤️?‍💋‍👩🏻|👩🏽‍❤️?‍💋‍👨🏿|👩🏽‍❤️?‍💋‍👨🏾|👩🏽‍❤️?‍💋‍👨🏽|👩🏽‍❤️?‍💋‍👨🏼|👩🏽‍❤️?‍💋‍👨🏻|👨🏿‍❤️?‍💋‍👨🏻|👨🏿‍❤️?‍💋‍👨🏼|👨🏿‍❤️?‍💋‍👨🏽|👨🏿‍❤️?‍💋‍👨🏾|👨🏿‍❤️?‍💋‍👨🏿|👩🏼‍❤️?‍💋‍👩🏿|👩🏼‍❤️?‍💋‍👩🏾|👨🏻‍❤️?‍💋‍👨🏼|👨🏻‍❤️?‍💋‍👨🏻|🧑🏼‍❤️?‍💋‍🧑🏻|🧑🏼‍❤️?‍💋‍🧑🏽|🧑🏼‍❤️?‍💋‍🧑🏾|🧑🏼‍❤️?‍💋‍🧑🏿|🧑🏽‍❤️?‍💋‍🧑🏻|🧑🏽‍❤️?‍💋‍🧑🏼|🧑🏽‍❤️?‍💋‍🧑🏾|🧑🏽‍❤️?‍💋‍🧑🏿|🧑🏾‍❤️?‍💋‍🧑🏻|🧑🏾‍❤️?‍💋‍🧑🏼|🧑🏾‍❤️?‍💋‍🧑🏽|🧑🏾‍❤️?‍💋‍🧑🏿|🧑🏿‍❤️?‍💋‍🧑🏾|🧑🏿‍❤️?‍💋‍🧑🏽|🧑🏿‍❤️?‍💋‍🧑🏻|🧑🏿‍❤️?‍💋‍🧑🏼|👩🏼‍❤️?‍💋‍👩🏽|👩🏿‍❤️?‍💋‍👩🏾|👩🏿‍❤️?‍💋‍👩🏿|🧑🏻‍❤️?‍💋‍🧑🏼|🧑🏻‍❤️?‍💋‍🧑🏽|🧑🏻‍❤️?‍💋‍🧑🏾|🧑🏻‍❤️?‍💋‍🧑🏿|👨🏻‍❤️?‍💋‍👨🏿|👨🏻‍❤️?‍💋‍👨🏾|👨🏻‍❤️?‍💋‍👨🏽|👩🏽‍❤️?‍👩🏻|👩🏽‍❤️?‍👨🏿|👩🏽‍❤️?‍👨🏾|👩🏽‍❤️?‍👨🏽|👩🏽‍❤️?‍👨🏼|👩🏽‍❤️?‍👨🏻|🧑🏿‍❤️?‍🧑🏾|🚶🏿‍♀️?‍➡️?|🚶🏾‍♂️?‍➡️?|🚶🏾‍♀️?‍➡️?|🏃🏿‍♂️?‍➡️?|👩🏽‍❤️?‍👩🏼|👩🏽‍❤️?‍👩🏽|👩🏽‍❤️?‍👩🏾|🚶🏿‍♂️?‍➡️?|🧑🏿‍❤️?‍🧑🏽|🧑🏿‍❤️?‍🧑🏼|🧑🏿‍❤️?‍🧑🏻|🏃🏻‍♂️?‍➡️?|🏃🏻‍♀️?‍➡️?|👩🏼‍❤️?‍👨🏻|👩🏼‍❤️?‍👨🏼|👩🏼‍❤️?‍👨🏽|🏃🏼‍♀️?‍➡️?|🏃🏼‍♂️?‍➡️?|👩🏼‍❤️?‍👨🏾|🏃🏽‍♀️?‍➡️?|🏃🏽‍♂️?‍➡️?|🏃🏾‍♀️?‍➡️?|👩🏼‍❤️?‍👨🏿|👩🏼‍❤️?‍👩🏻|👩🏼‍❤️?‍👩🏼|👩🏼‍❤️?‍👩🏽|🏃🏾‍♂️?‍➡️?|🏃🏿‍♀️?‍➡️?|👩🏼‍❤️?‍👩🏾|👩🏼‍❤️?‍👩🏿|🚶🏻‍♀️?‍➡️?|🚶🏻‍♂️?‍➡️?|🚶🏼‍♀️?‍➡️?|🚶🏼‍♂️?‍➡️?|🚶🏽‍♀️?‍➡️?|🚶🏽‍♂️?‍➡️?|👩🏽‍❤️?‍👩🏿|👩🏾‍❤️?‍👩🏻|👩🏾‍❤️?‍👩🏼|👩🏾‍❤️?‍👩🏽|👩🏾‍❤️?‍👩🏾|👩🏾‍❤️?‍👩🏿|🧑🏼‍❤️?‍🧑🏿|🧑🏼‍❤️?‍🧑🏾|🧑🏼‍❤️?‍🧑🏽|🧑🏼‍❤️?‍🧑🏻|🧑🏻‍❤️?‍🧑🏿|👩🏿‍❤️?‍👨🏻|👩🏿‍❤️?‍👨🏼|👩🏿‍❤️?‍👨🏽|👩🏿‍❤️?‍👨🏾|👩🏿‍❤️?‍👨🏿|👩🏿‍❤️?‍👩🏻|👩🏿‍❤️?‍👩🏼|👩🏿‍❤️?‍👩🏽|👩🏿‍❤️?‍👩🏾|👩🏿‍❤️?‍👩🏿|🧑🏻‍❤️?‍🧑🏾|🧑🏻‍❤️?‍🧑🏽|🧑🏻‍❤️?‍🧑🏼|🧑🏾‍❤️?‍🧑🏿|🧑🏾‍❤️?‍🧑🏽|🧑🏾‍❤️?‍🧑🏼|🧑🏾‍❤️?‍🧑🏻|🧎🏿‍♂️?‍➡️?|🧎🏿‍♀️?‍➡️?|🧎🏾‍♂️?‍➡️?|🧎🏾‍♀️?‍➡️?|🧎🏽‍♂️?‍➡️?|🧎🏽‍♀️?‍➡️?|🧑🏽‍❤️?‍🧑🏿|🧑🏽‍❤️?‍🧑🏾|🧑🏽‍❤️?‍🧑🏼|🧑🏽‍❤️?‍🧑🏻|🧎🏼‍♂️?‍➡️?|🧎🏼‍♀️?‍➡️?|🧎🏻‍♂️?‍➡️?|🧎🏻‍♀️?‍➡️?|👩🏾‍❤️?‍👨🏻|👩🏾‍❤️?‍👨🏼|👩🏾‍❤️?‍👨🏽|👩🏾‍❤️?‍👨🏾|👩🏾‍❤️?‍👨🏿|👩🏻‍❤️?‍👩🏻|👩🏻‍❤️?‍👨🏿|👩🏻‍❤️?‍👨🏾|👩🏻‍❤️?‍👨🏽|👩🏻‍❤️?‍👨🏼|👩🏻‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏾|👨🏼‍❤️?‍👨🏻|👩‍❤️?‍💋‍👩|👩‍❤️?‍💋‍👨|👨🏼‍❤️?‍👨🏼|👨🏼‍❤️?‍👨🏽|👨🏼‍❤️?‍👨🏾|👨🏼‍❤️?‍👨🏿|👨🏻‍❤️?‍👨🏽|👨🏻‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏽|👨‍❤️?‍💋‍👨|👨🏾‍❤️?‍👨🏼|👨🏾‍❤️?‍👨🏽|👨🏿‍❤️?‍👨🏿|👨🏾‍❤️?‍👨🏾|👨🏿‍❤️?‍👨🏾|👨🏾‍❤️?‍👨🏿|👨🏿‍❤️?‍👨🏽|👨🏾‍❤️?‍👨🏻|👨🏿‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏿|👨🏿‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏿|👨🏽‍❤️?‍👨🏾|👨🏽‍❤️?‍👨🏻|👩🏻‍❤️?‍👩🏿|👩🏻‍❤️?‍👩🏾|👩🏻‍❤️?‍👩🏽|👩🏻‍❤️?‍👩🏼|🧑🏼‍🐰‍🧑🏿|👨‍👨‍👧‍👦|🧑🏼‍🐰‍🧑🏾|🧑🏼‍🐰‍🧑🏽|🧑🏼‍🐰‍🧑🏻|🧑🏽‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏻|🧑🏼‍🫯‍🧑🏽|🧑🏼‍🫯‍🧑🏾|🧑🏾‍🤝‍🧑🏻|🧑🏾‍🤝‍🧑🏼|🧑🏾‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏾‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏿|🧑🏽‍🐰‍🧑🏻|🧑🏽‍🐰‍🧑🏼|🧑🏽‍🐰‍🧑🏾|🧑🏽‍🐰‍🧑🏿|👨‍👨‍👦‍👦|🧑🏽‍🫯‍🧑🏻|👨‍👩‍👦‍👦|👨‍👩‍👧‍👦|👨‍👩‍👧‍👧|🧑🏻‍🤝‍🧑🏿|🧑🏻‍🤝‍🧑🏾|🧑🏻‍🤝‍🧑🏽|🧑🏻‍🤝‍🧑🏼|🧑🏻‍🤝‍🧑🏻|👨🏻‍🐰‍👨🏼|👨🏻‍🐰‍👨🏽|👨🏻‍🐰‍👨🏾|👨🏻‍🐰‍👨🏿|👨🏻‍🤝‍👨🏼|👨🏻‍🤝‍👨🏽|👨🏻‍🤝‍👨🏾|🧑‍🧑‍🧒‍🧒|👩🏿‍🫯‍👩🏾|👩🏿‍🫯‍👩🏽|🧑🏽‍🤝‍🧑🏾|🧑🏽‍🤝‍🧑🏽|🧑🏽‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏻|🧑🏻‍🫯‍🧑🏿|🧑🏻‍🫯‍🧑🏾|🧑🏻‍🫯‍🧑🏽|🧑🏻‍🫯‍🧑🏼|👨‍👨‍👧‍👧|🧑🏻‍🐰‍🧑🏿|🧑🏻‍🐰‍🧑🏾|🧑🏻‍🐰‍🧑🏽|🧑🏼‍🤝‍🧑🏿|🧑🏼‍🤝‍🧑🏾|🧑🏼‍🤝‍🧑🏽|🧑🏼‍🤝‍🧑🏼|🧑🏼‍🤝‍🧑🏻|🧑🏻‍🐰‍🧑🏼|🧑🏽‍🦼‍➡️?|🧑🏽‍🦯‍➡️?|🧑🏼‍🦽‍➡️?|🧑🏼‍🦼‍➡️?|🧑🏼‍🦯‍➡️?|🧑🏻‍🦽‍➡️?|🧑🏻‍🦼‍➡️?|🧑🏻‍🦯‍➡️?|👩🏿‍🦽‍➡️?|👩🏿‍🦼‍➡️?|👩🏿‍🦯‍➡️?|👩🏾‍🦽‍➡️?|👩🏾‍🦼‍➡️?|👩🏾‍🦯‍➡️?|👩🏽‍🦽‍➡️?|👩🏽‍🦼‍➡️?|👩🏽‍🦯‍➡️?|👩🏼‍🦽‍➡️?|🧑🏿‍🫯‍🧑🏾|🧑🏿‍🫯‍🧑🏽|🧑🏿‍🫯‍🧑🏼|🧑🏿‍🫯‍🧑🏻|🧑🏿‍🐰‍🧑🏾|🧑🏿‍🐰‍🧑🏽|🧑🏿‍🐰‍🧑🏼|🧑🏿‍🐰‍🧑🏻|🧑🏾‍🫯‍🧑🏿|🏃‍♂️?‍➡️?|🏃‍♀️?‍➡️?|🧑🏿‍🦽‍➡️?|🧑🏿‍🦼‍➡️?|🧑🏿‍🦯‍➡️?|🧑🏾‍🦽‍➡️?|🧑🏾‍🦼‍➡️?|🧑🏾‍🦯‍➡️?|🧑🏽‍🦽‍➡️?|👩🏼‍🦼‍➡️?|👨🏻‍🦼‍➡️?|🚶‍♂️?‍➡️?|👨🏻‍🦯‍➡️?|🧑🏾‍🫯‍🧑🏽|🧑🏾‍🫯‍🧑🏼|🧑🏾‍🫯‍🧑🏻|🧑🏿‍🤝‍🧑🏿|🧑🏾‍🐰‍🧑🏿|🧑🏿‍🤝‍🧑🏾|🧑🏾‍🐰‍🧑🏽|🧑🏿‍🤝‍🧑🏽|🧑🏾‍🐰‍🧑🏼|🧑🏿‍🤝‍🧑🏼|🧑🏾‍🐰‍🧑🏻|🧑🏿‍🤝‍🧑🏻|🧑🏽‍🫯‍🧑🏿|🧑🏽‍🫯‍🧑🏾|🧑🏽‍🫯‍🧑🏼|👩🏼‍🦯‍➡️?|👩🏻‍🦽‍➡️?|👩🏻‍🦼‍➡️?|👩🏻‍🦯‍➡️?|👨🏿‍🦽‍➡️?|👨🏿‍🦼‍➡️?|👨🏿‍🦯‍➡️?|👨🏾‍🦽‍➡️?|👨🏾‍🦼‍➡️?|👨🏾‍🦯‍➡️?|👨🏽‍🦽‍➡️?|👨🏽‍🦼‍➡️?|👨🏽‍🦯‍➡️?|👨🏼‍🦽‍➡️?|👨🏼‍🦼‍➡️?|👨🏼‍🦯‍➡️?|👨🏻‍🦽‍➡️?|🚶‍♀️?‍➡️?|👩🏿‍🫯‍👩🏼|👨🏾‍🫯‍👨🏻|👨🏾‍🫯‍👨🏼|👨🏾‍🫯‍👨🏽|👨🏾‍🫯‍👨🏿|👨🏿‍🐰‍👨🏻|👨🏿‍🐰‍👨🏼|👨🏿‍🐰‍👨🏽|👨🏿‍🐰‍👨🏾|👨🏿‍🤝‍👨🏻|👨🏿‍🤝‍👨🏼|👨🏿‍🤝‍👨🏽|👨🏿‍🤝‍👨🏾|👨🏿‍🫯‍👨🏻|👩🏼‍🫯‍👩🏿|👩🏼‍🫯‍👩🏾|👩🏼‍🫯‍👩🏽|👩🏼‍🫯‍👩🏻|👨🏾‍🐰‍👨🏻|👩🏽‍🤝‍👩🏻|👨🏾‍🐰‍👨🏼|👩🏽‍🤝‍👨🏿|👨🏾‍🐰‍👨🏽|👩🏽‍🤝‍👨🏾|👨🏾‍🐰‍👨🏿|👩🏽‍🤝‍👨🏼|👨🏾‍🤝‍👨🏻|👩🏽‍🤝‍👨🏻|👨🏾‍🤝‍👨🏼|👩🏽‍🐰‍👩🏿|👩🏽‍🐰‍👩🏾|👩🏽‍🐰‍👩🏼|👩🏽‍🐰‍👩🏻|👨🏾‍🤝‍👨🏽|👨🏾‍🤝‍👨🏿|👩‍👩‍👧‍👧|👩🏻‍🫯‍👩🏿|👩🏻‍🫯‍👩🏾|👩🏻‍🫯‍👩🏽|👩🏻‍🫯‍👩🏼|👩🏻‍🤝‍👩🏿|👩🏻‍🤝‍👩🏾|👩🏻‍🤝‍👩🏽|👩🏻‍🤝‍👩🏼|👩🏻‍🤝‍👨🏿|👩🏻‍🤝‍👨🏾|👩🏻‍🤝‍👨🏽|👩🏻‍🤝‍👨🏼|👩🏻‍🐰‍👩🏿|👩🏻‍🐰‍👩🏾|👩🏻‍🐰‍👩🏽|👩🏻‍🐰‍👩🏼|👩🏼‍🤝‍👩🏿|👩🏼‍🤝‍👩🏾|👩🏼‍🤝‍👩🏽|👩🏼‍🤝‍👩🏻|👩🏼‍🤝‍👨🏿|👩🏼‍🤝‍👨🏾|👩🏼‍🤝‍👨🏽|👩🏼‍🤝‍👨🏻|👩🏼‍🐰‍👩🏿|👩🏼‍🐰‍👩🏾|👩🏼‍🐰‍👩🏽|👩🏼‍🐰‍👩🏻|👨🏿‍🫯‍👨🏼|👨🏿‍🫯‍👨🏽|👨🏿‍🫯‍👨🏾|👩‍👩‍👦‍👦|👨🏼‍🐰‍👨🏻|👨🏼‍🐰‍👨🏽|👨🏼‍🐰‍👨🏾|👨🏼‍🐰‍👨🏿|👨🏼‍🤝‍👨🏻|👨🏼‍🤝‍👨🏽|👨🏼‍🤝‍👨🏾|👨🏼‍🤝‍👨🏿|👨🏼‍🫯‍👨🏻|👨🏼‍🫯‍👨🏽|👩🏾‍🫯‍👩🏿|👩🏾‍🫯‍👩🏽|👩🏾‍🫯‍👩🏼|👩🏾‍🫯‍👩🏻|👩🏾‍🤝‍👩🏿|👩🏾‍🤝‍👩🏽|👩🏾‍🤝‍👩🏼|👩🏾‍🤝‍👩🏻|👩🏿‍🫯‍👩🏻|👩🏿‍🤝‍👩🏾|👩🏿‍🤝‍👩🏽|👩🏿‍🤝‍👩🏼|👩🏿‍🤝‍👩🏻|👩🏿‍🤝‍👨🏾|👩🏿‍🤝‍👨🏽|👩🏿‍🤝‍👨🏼|👩🏿‍🤝‍👨🏻|👩🏿‍🐰‍👩🏾|👩🏿‍🐰‍👩🏽|👩🏿‍🐰‍👩🏼|👩🏿‍🐰‍👩🏻|👨🏻‍🤝‍👨🏿|👨🏻‍🫯‍👨🏼|👨🏻‍🫯‍👨🏽|👨🏻‍🫯‍👨🏾|👨🏻‍🫯‍👨🏿|👩🏾‍🤝‍👨🏿|👨🏽‍🐰‍👨🏿|👨🏽‍🤝‍👨🏻|👨🏽‍🤝‍👨🏼|👨🏽‍🤝‍👨🏾|👨🏽‍🤝‍👨🏿|👨🏽‍🫯‍👨🏻|👨🏽‍🫯‍👨🏼|👨🏽‍🫯‍👨🏾|👨🏽‍🫯‍👨🏿|👩🏽‍🫯‍👩🏿|🧎‍♀️?‍➡️?|👩🏽‍🫯‍👩🏾|🧎‍♂️?‍➡️?|👩🏽‍🫯‍👩🏼|👩🏽‍🫯‍👩🏻|👩🏽‍🤝‍👩🏿|👩🏽‍🤝‍👩🏾|👩🏽‍🤝‍👩🏼|👩🏾‍🤝‍👨🏽|👩🏾‍🤝‍👨🏼|👩🏾‍🤝‍👨🏻|👩🏾‍🐰‍👩🏿|👩🏾‍🐰‍👩🏽|👩🏾‍🐰‍👩🏼|👩🏾‍🐰‍👩🏻|👨🏼‍🫯‍👨🏾|👨🏼‍🫯‍👨🏿|👨🏽‍🐰‍👨🏻|👨🏽‍🐰‍👨🏼|👨🏽‍🐰‍👨🏾|👩‍👩‍👧‍👦|👨‍🦽‍➡️?|🧑‍🦯‍➡️?|👨‍🦼‍➡️?|🧑‍🦼‍➡️?|👨‍🦯‍➡️?|🧑‍🦽‍➡️?|👩‍❤️?‍👩|👩‍❤️?‍👨|👩‍🦯‍➡️?|👨‍❤️?‍👨|👩‍🦼‍➡️?|👩‍🦽‍➡️?|🧖🏾‍♀️?|🧖🏽‍♂️?|🧖🏽‍♀️?|🧖🏼‍♂️?|🧖🏼‍♀️?|🧖🏻‍♂️?|🧖🏻‍♀️?|👩🏾‍✈️?|👩🏾‍⚖️?|👩🏾‍⚕️?|🧔🏿‍♂️?|🧔🏿‍♀️?|🧔🏾‍♂️?|🚴🏻‍♀️?|🧔🏾‍♀️?|🧔🏽‍♂️?|🧔🏽‍♀️?|🧔🏼‍♂️?|🧔🏼‍♀️?|🧔🏻‍♂️?|🧔🏻‍♀️?|🧘🏻‍♂️?|🧘🏻‍♀️?|🧗🏿‍♂️?|🧗🏿‍♀️?|🧗🏾‍♂️?|🧗🏾‍♀️?|🧗🏽‍♂️?|🧗🏽‍♀️?|👩🏿‍✈️?|👩🏿‍⚖️?|👩🏿‍⚕️?|🚣🏾‍♂️?|🧗🏼‍♂️?|🚣🏿‍♀️?|🧗🏼‍♀️?|🚣🏿‍♂️?|🧗🏻‍♂️?|🧗🏻‍♀️?|🧖🏿‍♂️?|🧖🏿‍♀️?|🧖🏾‍♂️?|🧎🏽‍♀️?|🧎🏼‍♂️?|🧎🏼‍♀️?|🧎🏻‍♂️?|🧎🏻‍♀️?|👩🏼‍✈️?|👩🏼‍⚖️?|👩🏼‍⚕️?|🚴🏽‍♀️?|🚴🏽‍♂️?|🧍🏿‍♂️?|🚴🏾‍♀️?|🧍🏿‍♀️?|🧍🏾‍♂️?|🧍🏾‍♀️?|🧍🏽‍♂️?|🧍🏽‍♀️?|🧍🏼‍♂️?|🧍🏼‍♀️?|🧍🏻‍♂️?|🧍🏻‍♀️?|🧏🏿‍♂️?|🧏🏿‍♀️?|🧏🏾‍♂️?|🧏🏾‍♀️?|🧏🏽‍♂️?|🧏🏽‍♀️?|👩🏽‍✈️?|👩🏽‍⚖️?|👩🏽‍⚕️?|🚴🏻‍♂️?|🧏🏼‍♂️?|🚴🏼‍♀️?|🧏🏼‍♀️?|🚴🏼‍♂️?|🧏🏻‍♂️?|🧏🏻‍♀️?|🧎🏿‍♂️?|🧎🏿‍♀️?|🧎🏾‍♂️?|🧎🏾‍♀️?|🧎🏽‍♂️?|🧑🏼‍⚕️?|👩‍👧‍👧|👩‍👩‍👦|🧜🏻‍♀️?|👩‍👩‍👧|🚣🏻‍♀️?|🧛🏿‍♂️?|🧛🏿‍♀️?|🧛🏾‍♂️?|🧛🏾‍♀️?|🧛🏽‍♂️?|🧛🏽‍♀️?|🧛🏼‍♂️?|🧛🏼‍♀️?|🧛🏻‍♂️?|🧛🏻‍♀️?|🧚🏿‍♂️?|🧚🏿‍♀️?|🧑🏻‍✈️?|🧑🏻‍⚖️?|🧑🏻‍⚕️?|🙎🏾‍♂️?|🧝🏽‍♀️?|🙎🏿‍♀️?|🧝🏼‍♂️?|🙎🏿‍♂️?|🧝🏼‍♀️?|🧝🏻‍♂️?|🧝🏻‍♀️?|🧜🏿‍♂️?|🧜🏿‍♀️?|🧜🏾‍♂️?|🧜🏾‍♀️?|🧜🏽‍♂️?|🧜🏽‍♀️?|🧜🏼‍♂️?|🧜🏼‍♀️?|🧜🏻‍♂️?|👩‍👦‍👦|👩‍👧‍👦|🧑🏼‍✈️?|🧑🏼‍⚖️?|🧎🏿‍➡️?|🧎🏾‍➡️?|🧎🏽‍➡️?|🧎🏼‍➡️?|🧎🏻‍➡️?|🚶🏿‍➡️?|🚶🏾‍➡️?|🚶🏽‍➡️?|🚶🏼‍➡️?|🚶🏻‍➡️?|🧘🏿‍♂️?|🚣🏽‍♀️?|🧘🏿‍♀️?|🚣🏽‍♂️?|🧘🏾‍♂️?|🚣🏾‍♀️?|🧘🏾‍♀️?|🧘🏽‍♂️?|🧘🏽‍♀️?|🧘🏼‍♂️?|🧘🏼‍♀️?|🚣🏻‍♂️?|🧚🏾‍♂️?|🚣🏼‍♀️?|🧚🏾‍♀️?|🚣🏼‍♂️?|🧚🏽‍♂️?|🧚🏽‍♀️?|🧚🏼‍♂️?|🧚🏼‍♀️?|🧚🏻‍♂️?|🧚🏻‍♀️?|🧙🏿‍♂️?|🧙🏿‍♀️?|🧙🏾‍♂️?|🧙🏾‍♀️?|🧙🏽‍♂️?|🧙🏽‍♀️?|🧙🏼‍♂️?|🧙🏼‍♀️?|🧙🏻‍♂️?|🧙🏻‍♀️?|👨🏼‍✈️?|👨🏼‍⚖️?|👨🏼‍⚕️?|🤷🏼‍♀️?|🤷🏻‍♂️?|🤷🏻‍♀️?|🚶🏻‍♀️?|🤵🏿‍♂️?|🤵🏿‍♀️?|🤵🏾‍♂️?|🤵🏾‍♀️?|🤵🏽‍♂️?|🤵🏽‍♀️?|🤵🏼‍♂️?|🤵🏼‍♀️?|🤵🏻‍♂️?|🤵🏻‍♀️?|🤦🏿‍♂️?|🤦🏿‍♀️?|👨🏻‍✈️?|👨🏻‍⚖️?|👨🏽‍✈️?|👨🏽‍⚖️?|👨🏽‍⚕️?|🚵🏾‍♂️?|🤸🏾‍♂️?|🚵🏿‍♀️?|🤸🏾‍♀️?|🚵🏿‍♂️?|🤸🏽‍♂️?|🤸🏽‍♀️?|🤸🏼‍♂️?|🤸🏼‍♀️?|🤸🏻‍♂️?|🤸🏻‍♀️?|🤷🏿‍♂️?|🤷🏿‍♀️?|🤷🏾‍♂️?|🤷🏾‍♀️?|🤷🏽‍♂️?|🤷🏽‍♀️?|🤷🏼‍♂️?|🫱🏻‍🫲🏿|🏃🏿‍➡️?|🏃🏾‍➡️?|🏃🏽‍➡️?|🏃🏼‍➡️?|🏃🏻‍➡️?|🫱🏼‍🫲🏻|🫱🏿‍🫲🏾|🫱🏿‍🫲🏽|🫱🏿‍🫲🏼|🫱🏿‍🫲🏻|🫱🏾‍🫲🏿|🫱🏾‍🫲🏽|🫱🏾‍🫲🏼|🫱🏾‍🫲🏻|🫱🏽‍🫲🏿|🫱🏽‍🫲🏾|🫱🏽‍🫲🏼|🫱🏽‍🫲🏻|🫱🏼‍🫲🏿|🫱🏼‍🫲🏾|👨🏻‍⚕️?|🚶🏻‍♂️?|🤦🏾‍♂️?|🚶🏼‍♀️?|🤦🏾‍♀️?|🚶🏼‍♂️?|🤦🏽‍♂️?|🤦🏽‍♀️?|🤦🏼‍♂️?|🤦🏼‍♀️?|🤦🏻‍♂️?|🤦🏻‍♀️?|🚶🏿‍♂️?|🚶🏿‍♀️?|🚶🏾‍♂️?|🚶🏾‍♀️?|🚶🏽‍♂️?|🚶🏽‍♀️?|🫱🏻‍🫲🏼|🫱🏻‍🫲🏽|🫱🏻‍🫲🏾|🦸🏽‍♀️?|🦸🏼‍♂️?|🦸🏼‍♀️?|🦸🏻‍♂️?|🦸🏻‍♀️?|🤾🏿‍♂️?|🤾🏿‍♀️?|🤾🏾‍♂️?|🤾🏾‍♀️?|🚵🏻‍♀️?|🤾🏽‍♂️?|🤾🏽‍♀️?|🤾🏼‍♂️?|🤾🏼‍♀️?|🤾🏻‍♂️?|🤾🏻‍♀️?|🤽🏿‍♂️?|🤽🏿‍♀️?|🤽🏾‍♂️?|🤽🏾‍♀️?|🤽🏽‍♂️?|🦹🏿‍♂️?|🦹🏿‍♀️?|🦹🏾‍♂️?|🦹🏾‍♀️?|👩🏻‍✈️?|👩🏻‍⚖️?|👩🏻‍⚕️?|🚴🏾‍♂️?|🦹🏽‍♂️?|🚴🏿‍♀️?|🦹🏽‍♀️?|🚴🏿‍♂️?|🦹🏼‍♂️?|🦹🏼‍♀️?|🦹🏻‍♂️?|🦹🏻‍♀️?|🦸🏿‍♂️?|🦸🏿‍♀️?|🦸🏾‍♂️?|🦸🏾‍♀️?|🦸🏽‍♂️?|👨🏾‍✈️?|👨🏾‍⚖️?|👨🏾‍⚕️?|🚵🏽‍♀️?|🧑‍🤝‍🧑|🚵🏽‍♂️?|🧑‍🧑‍🧒|🚵🏾‍♀️?|🤹🏿‍♂️?|🧑‍🧒‍🧒|🤹🏿‍♀️?|🤹🏾‍♂️?|🤹🏾‍♀️?|🤹🏽‍♂️?|🤹🏽‍♀️?|🤹🏼‍♂️?|🤹🏼‍♀️?|🤹🏻‍♂️?|🤹🏻‍♀️?|🤸🏿‍♂️?|🤸🏿‍♀️?|🤽🏽‍♀️?|🤽🏼‍♂️?|👨🏿‍✈️?|👨🏿‍⚖️?|👨🏿‍⚕️?|🚵🏻‍♂️?|🤽🏼‍♀️?|🚵🏼‍♀️?|🤽🏻‍♂️?|🚵🏼‍♂️?|🤽🏻‍♀️?|🤼🏿‍♂️?|🤼🏿‍♀️?|🤼🏾‍♂️?|🤼🏾‍♀️?|🤼🏽‍♂️?|🤼🏽‍♀️?|🤼🏼‍♂️?|🤼🏼‍♀️?|🤼🏻‍♂️?|🤼🏻‍♀️?|👷🏽‍♀️?|👷🏼‍♂️?|👷🏼‍♀️?|👷🏻‍♂️?|👷🏻‍♀️?|👳🏿‍♂️?|👳🏿‍♀️?|👳🏾‍♂️?|👳🏾‍♀️?|👳🏽‍♂️?|👳🏽‍♀️?|👳🏼‍♂️?|👳🏼‍♀️?|👳🏻‍♂️?|👳🏻‍♀️?|🏳️‍⚧️?|👱🏿‍♂️?|👱🏿‍♀️?|👱🏾‍♂️?|👱🏾‍♀️?|👱🏽‍♂️?|💂🏽‍♀️?|💂🏼‍♂️?|💂🏼‍♀️?|💂🏻‍♂️?|💂🏻‍♀️?|💁🏿‍♂️?|💁🏿‍♀️?|💁🏾‍♂️?|💁🏾‍♀️?|💁🏽‍♂️?|💁🏽‍♀️?|💁🏼‍♂️?|💁🏼‍♀️?|💁🏻‍♂️?|💁🏻‍♀️?|👁️‍🗨️?|👷🏿‍♂️?|👷🏿‍♀️?|👷🏾‍♂️?|👷🏾‍♀️?|👷🏽‍♂️?|👯🏼‍♂️?|👯🏼‍♀️?|👯🏻‍♂️?|👯🏻‍♀️?|👮🏿‍♂️?|👮🏿‍♀️?|👮🏾‍♂️?|👮🏾‍♀️?|👮🏽‍♂️?|👮🏽‍♀️?|👮🏼‍♂️?|👮🏼‍♀️?|👮🏻‍♂️?|👮🏻‍♀️?|🏌️‍♂️?|🏌️‍♀️?|🏌🏿‍♂️?|🏌🏿‍♀️?|🏌🏾‍♂️?|🏌🏾‍♀️?|🏌🏽‍♂️?|👱🏽‍♀️?|👱🏼‍♂️?|👱🏼‍♀️?|👱🏻‍♂️?|👱🏻‍♀️?|👰🏿‍♂️?|👰🏿‍♀️?|👰🏾‍♂️?|👰🏾‍♀️?|👰🏽‍♂️?|👰🏽‍♀️?|👰🏼‍♂️?|👰🏼‍♀️?|👰🏻‍♂️?|👰🏻‍♀️?|👯🏿‍♂️?|👯🏿‍♀️?|👯🏾‍♂️?|👯🏾‍♀️?|👯🏽‍♂️?|👯🏽‍♀️?|👨‍👧‍👦|🙆🏿‍♂️?|🙆🏿‍♀️?|🙆🏾‍♂️?|🙆🏾‍♀️?|🙆🏽‍♂️?|🙆🏽‍♀️?|🙆🏼‍♂️?|🙆🏼‍♀️?|🙆🏻‍♂️?|🙆🏻‍♀️?|👨‍👧‍👧|👨‍👨‍👦|🙅🏿‍♂️?|🙅🏿‍♀️?|🙅🏾‍♂️?|🙅🏾‍♀️?|🙅🏽‍♂️?|🙅🏽‍♀️?|🙅🏼‍♂️?|🙅🏼‍♀️?|🙋🏿‍♂️?|🙋🏿‍♀️?|🙋🏾‍♂️?|🙋🏾‍♀️?|🙋🏽‍♂️?|🙋🏽‍♀️?|🙋🏼‍♂️?|🙋🏼‍♀️?|🙋🏻‍♂️?|🙋🏻‍♀️?|🙇🏿‍♂️?|🙇🏿‍♀️?|🙇🏾‍♂️?|🙇🏾‍♀️?|🙇🏽‍♂️?|🙇🏽‍♀️?|🙇🏼‍♂️?|🙇🏼‍♀️?|🙇🏻‍♂️?|🙇🏻‍♀️?|👨‍👦‍👦|💇🏼‍♂️?|💇🏼‍♀️?|💇🏻‍♂️?|💇🏻‍♀️?|💆🏿‍♂️?|💆🏿‍♀️?|💆🏾‍♂️?|💆🏾‍♀️?|💆🏽‍♂️?|💆🏽‍♀️?|💆🏼‍♂️?|💆🏼‍♀️?|💆🏻‍♂️?|💆🏻‍♀️?|👨‍👩‍👦|👨‍👩‍👧|💂🏿‍♂️?|💂🏿‍♀️?|💂🏾‍♂️?|💂🏾‍♀️?|💂🏽‍♂️?|🙅🏻‍♂️?|🙅🏻‍♀️?|👨‍👨‍👧|🕵️‍♂️?|🕵️‍♀️?|🕵🏿‍♂️?|🕵🏿‍♀️?|🕵🏾‍♂️?|🕵🏾‍♀️?|🕵🏽‍♂️?|🕵🏽‍♀️?|🕵🏼‍♂️?|🕵🏼‍♀️?|🕵🏻‍♂️?|🕵🏻‍♀️?|💇🏿‍♂️?|💇🏿‍♀️?|💇🏾‍♂️?|💇🏾‍♀️?|💇🏽‍♂️?|💇🏽‍♀️?|🏌🏽‍♀️?|⛹🏾‍♀️?|⛹🏾‍♂️?|⛹🏿‍♀️?|⛹🏿‍♂️?|⛹️‍♀️?|⛹️‍♂️?|🙍🏿‍♂️?|🙍🏿‍♀️?|🏃🏻‍♀️?|🙍🏾‍♂️?|🏃🏻‍♂️?|🙍🏾‍♀️?|🏃🏼‍♀️?|🙍🏽‍♂️?|🏃🏼‍♂️?|🙍🏽‍♀️?|🏃🏽‍♀️?|🙍🏼‍♂️?|🏃🏽‍♂️?|🙍🏼‍♀️?|🏃🏾‍♀️?|🙍🏻‍♂️?|🏃🏾‍♂️?|🙍🏻‍♀️?|🏃🏿‍♀️?|🏃🏿‍♂️?|🏄🏻‍♀️?|🏄🏻‍♂️?|🫱🏼‍🫲🏽|🧑🏽‍⚕️?|🧑🏽‍⚖️?|🧑🏽‍✈️?|🧝🏽‍♂️?|🧝🏾‍♀️?|🧝🏾‍♂️?|🧝🏿‍♀️?|🧝🏿‍♂️?|🙎🏾‍♀️?|🙎🏽‍♂️?|🙎🏽‍♀️?|🧑🏾‍⚕️?|🧑🏾‍⚖️?|🧑🏾‍✈️?|🙎🏼‍♂️?|🙎🏼‍♀️?|🙎🏻‍♂️?|🧑🏿‍⚕️?|🧑🏿‍⚖️?|🧑🏿‍✈️?|🙎🏻‍♀️?|⛹🏻‍♀️?|⛹🏻‍♂️?|⛹🏼‍♀️?|⛹🏼‍♂️?|⛹🏽‍♀️?|⛹🏽‍♂️?|🏊🏻‍♀️?|🏊🏻‍♂️?|🏊🏼‍♀️?|🏊🏼‍♂️?|🏊🏽‍♀️?|🏊🏽‍♂️?|🏊🏾‍♀️?|🏊🏾‍♂️?|🏊🏿‍♀️?|🏊🏿‍♂️?|🏋🏻‍♀️?|🏋🏻‍♂️?|🏋🏼‍♀️?|🏋🏼‍♂️?|🏋🏽‍♀️?|🏋🏽‍♂️?|🏋🏾‍♀️?|🏋🏾‍♂️?|🏋🏿‍♀️?|🏋🏿‍♂️?|🏋️‍♀️?|🏋️‍♂️?|🏌🏻‍♀️?|🏌🏻‍♂️?|🏌🏼‍♀️?|🏌🏼‍♂️?|🏄🏿‍♀️?|🏄🏾‍♂️?|🏄🏾‍♀️?|🏄🏽‍♂️?|🏄🏽‍♀️?|🏄🏿‍♂️?|🏄🏼‍♂️?|🏄🏼‍♀️?|🤾‍♂️?|👨🏽‍🦱|👨🏽‍🦲|👨🏽‍🦳|🧜‍♀️?|👨🏾‍🦰|👨🏾‍🦱|👨🏾‍🦲|👨🏾‍🦳|👨🏿‍🦰|👨🏿‍🦱|🧜‍♂️?|🤦‍♂️?|🤷‍♀️?|👩🏼‍🦲|🧑🏽‍🦱|👩🏼‍🦱|🤾‍♀️?|👩🏼‍🦰|👩🏻‍🦳|👩🏻‍🦲|👩🏻‍🦱|👩🏻‍🦰|👨🏿‍🦳|🤵‍♂️?|🤵‍♀️?|🧑🏽‍🩰|👨🏿‍🦲|🧛‍♀️?|🧛‍♂️?|🧖‍♂️?|🧎‍♂️?|🧖‍♀️?|🧑🏾‍🦰|🧑🏽‍🦳|🧑🏽‍🦲|🧝‍♂️?|🧝‍♀️?|🧑🏿‍🩰|🧑🏾‍🩰|🧎‍♀️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|👨🏻‍🦰|👨🏻‍🦱|👨🏻‍🦲|👨🏻‍🦳|👨🏼‍🦰|👨🏼‍🦱|👨🏼‍🦲|🧏‍♀️?|👨🏼‍🦳|🧑🏾‍🦳|👨🏽‍🦰|🧑🏿‍🦰|🧏‍♂️?|❤️‍🩹|🤦‍♀️?|🧑🏼‍🦰|🧑🏼‍🦱|🤹‍♀️?|🤹‍♂️?|🧑🏼‍🦲|🧍‍♀️?|🧑🏿‍🦱|🧑🏿‍🦲|🧗‍♀️?|🧗‍♂️?|🙂‍↕️?|🙂‍↔️?|🏴‍☠️?|🧔‍♀️?|🧑🏼‍🦳|🧘‍♂️?|🧘‍♀️?|🧔‍♂️?|🤼‍♀️?|🤼‍♂️?|😶‍🌫️?|🧑🏽‍🦰|🐻‍❄️?|🧑🏿‍🦳|⛓️‍💥|🦹‍♂️?|🦹‍♀️?|🧑🏾‍🦱|🧑🏾‍🦲|🤽‍♀️?|🤽‍♂️?|🏳️‍🌈|🤷‍♂️?|🦸‍♀️?|🦸‍♂️?|❤️‍🔥|👩🏼‍🦳|🧚‍♂️?|🧚‍♀️?|👩🏽‍🦰|👩🏽‍🦱|👩🏽‍🦲|👩🏽‍🦳|👩🏾‍🦰|👩🏾‍🦱|🧑🏼‍🩰|🤸‍♀️?|🤸‍♂️?|🧑🏻‍🩰|👩🏾‍🦲|👩🏾‍🦳|👩🏿‍🦰|👩🏿‍🦱|🧙‍♂️?|👩🏿‍🦲|👩🏿‍🦳|🧑🏻‍🦰|🧑🏻‍🦱|🧑🏻‍🦲|🧙‍♀️?|🧍‍♂️?|🧑🏻‍🦳|🚣‍♀️?|🧑🏻‍🦽|🚣‍♂️?|🧑🏻‍🦼|🧑🏻‍🦯|🧑🏻‍🚒|🧑🏻‍🚀|🧑🏻‍🔬|🧑🏻‍🔧|🧑🏻‍💼|🧑🏻‍💻|🧑🏻‍🏭|🧑🏻‍🏫|🧑🏻‍🎨|🧑🏻‍🎤|🧑🏻‍🎓|🧑🏻‍🎄|🧑🏻‍🍼|🧑🏻‍🍳|🧑🏻‍🌾|🧑‍✈️?|🧑‍⚖️?|🧑🏽‍🎄|🧑🏽‍🍼|🧑🏽‍🍳|🧑🏽‍🌾|🧑🏼‍🦽|🧑🏼‍🦼|🧑🏼‍🦯|🧑🏼‍🚒|🧑🏼‍🚀|🧑🏼‍🔬|🧑🏼‍🔧|🧑🏼‍💼|🧑🏼‍💻|🧑🏼‍🏭|🧑🏼‍🏫|🧑🏼‍🎨|🧑🏼‍🎤|🧑🏼‍🎓|🧑🏼‍🎄|🧑🏼‍🍼|🧑🏼‍🍳|🧑🏼‍🌾|👩🏾‍🦯|👩🏾‍🚒|👩🏾‍🚀|👩🏾‍🔬|👩🏾‍🔧|👩🏾‍💼|👩🏾‍💻|👩🏾‍🏭|👩🏾‍🏫|👩🏾‍🎨|👩🏾‍🎤|👩🏾‍🎓|👩🏾‍🍼|👩🏾‍🍳|👩🏾‍🌾|🚴‍♀️?|👩🏽‍🦽|🚴‍♂️?|👩🏽‍🦼|👩🏽‍🦯|👩🏽‍🚒|👩🏽‍🚀|🧑‍⚕️?|🧎‍➡️?|🚶‍➡️?|👩🏿‍🦽|👩🏿‍🦼|👩🏿‍🦯|👩🏿‍🚒|👩🏿‍🚀|👩🏿‍🔬|👩🏿‍🔧|👩🏿‍💼|👩🏿‍💻|👩🏿‍🏭|👩🏿‍🏫|👩🏿‍🎨|👩🏿‍🎤|👩🏿‍🎓|👩🏿‍🍼|👩🏿‍🍳|👩🏿‍🌾|👩🏾‍🦽|👩🏾‍🦼|👰‍♂️?|👰‍♀️?|👯‍♂️?|👯‍♀️?|👮‍♂️?|👮‍♀️?|🏊‍♂️?|🏊‍♀️?|🏄‍♂️?|🏄‍♀️?|🙍‍♀️?|🙍‍♂️?|🏃‍♂️?|🏃‍♀️?|🙎‍♀️?|🧑🏿‍🦽|🙎‍♂️?|🧑🏿‍🦼|🧑🏿‍🦯|🧑🏿‍🚒|🧑🏿‍🚀|🧑🏿‍🔬|🙋‍♂️?|🙋‍♀️?|🙇‍♂️?|🙇‍♀️?|🙆‍♂️?|🙆‍♀️?|🙅‍♂️?|🙅‍♀️?|💇‍♂️?|💇‍♀️?|💆‍♂️?|💆‍♀️?|💂‍♂️?|💂‍♀️?|💁‍♂️?|💁‍♀️?|👷‍♂️?|👷‍♀️?|👳‍♂️?|👳‍♀️?|👱‍♂️?|👱‍♀️?|🧑🏾‍🏫|🧑🏾‍🎨|🧑🏾‍🎤|🧑🏾‍🎓|🧑🏾‍🎄|🧑🏾‍🍼|🧑🏾‍🍳|🧑🏾‍🌾|🧑🏽‍🦽|🧑🏽‍🦼|🧑🏽‍🦯|🧑🏽‍🚒|🧑🏽‍🚀|🧑🏽‍🔬|🧑🏽‍🔧|🧑🏽‍💼|🧑🏽‍💻|🧑🏽‍🏭|🧑🏽‍🏫|🧑🏽‍🎨|🧑🏽‍🎤|🧑🏽‍🎓|🧑🏿‍🔧|🧑🏿‍💼|🧑🏿‍💻|🧑🏿‍🏭|🧑🏿‍🏫|🧑🏿‍🎨|🧑🏿‍🎤|🧑🏿‍🎓|🧑🏿‍🎄|🧑🏿‍🍼|🧑🏿‍🍳|🧑🏿‍🌾|🧑🏾‍🦽|🧑🏾‍🦼|🧑🏾‍🦯|🧑🏾‍🚒|🧑🏾‍🚀|🧑🏾‍🔬|🧑🏾‍🔧|🧑🏾‍💼|🧑🏾‍💻|🧑🏾‍🏭|👨🏾‍🔧|👨🏾‍💼|👨🏾‍💻|👨🏾‍🏭|👨🏾‍🏫|👨🏾‍🎨|👨🏾‍🎤|👨🏾‍🎓|👨🏾‍🍼|👨🏾‍🍳|👨🏾‍🌾|👨🏽‍🦽|👨🏽‍🦼|👨🏽‍🦯|👨🏽‍🚒|👨🏽‍🚀|👨🏽‍🔬|👨🏽‍🔧|👨🏽‍💼|👨🏽‍💻|👨🏽‍🏭|👨🏽‍🏫|👨🏿‍🦼|👨🏿‍🦯|👨🏿‍🚒|👨🏿‍🚀|👨🏿‍🔬|👨🏿‍🔧|👨🏿‍💼|👨🏿‍💻|👨🏿‍🏭|👨🏿‍🏫|👨🏿‍🎨|👨🏿‍🎤|👨🏿‍🎓|👨🏿‍🍼|👨🏿‍🍳|👨🏿‍🌾|👨🏾‍🦽|👨🏾‍🦼|👨🏾‍🦯|👨🏾‍🚒|👨🏾‍🚀|👨🏾‍🔬|👨🏽‍🎨|🚶‍♀️?|👨🏻‍🦽|🚶‍♂️?|👨🏻‍🦼|👨🏻‍🦯|👨🏻‍🚒|👨🏻‍🚀|👨🏻‍🔬|👨🏻‍🔧|👨🏻‍💼|👨🏻‍💻|👨🏻‍🏭|👨🏻‍🏫|👨🏻‍🎨|👨🏻‍🎤|👨🏻‍🎓|👨🏻‍🍼|👨🏻‍🍳|👨🏻‍🌾|👨‍✈️?|👨‍⚖️?|👨‍⚕️?|👨🏽‍🎤|👨🏽‍🎓|👨🏽‍🍼|👨🏽‍🍳|👨🏽‍🌾|👨🏼‍🦽|👨🏼‍🦼|👨🏼‍🦯|👨🏼‍🚒|👨🏼‍🚀|👨🏼‍🔬|👨🏼‍🔧|👨🏼‍💼|👨🏼‍💻|👨🏼‍🏭|👨🏼‍🏫|👨🏼‍🎨|👨🏼‍🎤|👨🏼‍🎓|👨🏼‍🍼|👨🏼‍🍳|👨🏼‍🌾|👩🏼‍🎨|👩🏼‍🎤|👩🏼‍🎓|👩🏼‍🍼|👩🏼‍🍳|👩🏼‍🌾|👩🏻‍🦽|👩🏻‍🦼|👩🏻‍🦯|👩🏻‍🚒|👩🏻‍🚀|👩🏻‍🔬|👩🏻‍🔧|👩🏻‍💼|👩🏻‍💻|👩🏻‍🏭|👩🏻‍🏫|👩🏻‍🎨|👩🏻‍🎤|👩🏻‍🎓|👩🏻‍🍼|👩🏻‍🍳|👩🏻‍🌾|👩🏽‍🔬|👩🏽‍🔧|👩🏽‍💼|👩🏽‍💻|👩🏽‍🏭|👩🏽‍🏫|👩🏽‍🎨|👩🏽‍🎤|👩🏽‍🎓|👩🏽‍🍼|👩🏽‍🍳|👩🏽‍🌾|👩🏼‍🦽|👩🏼‍🦼|👩🏼‍🦯|👩🏼‍🚒|👩🏼‍🚀|👩🏼‍🔬|👩🏼‍🔧|👩🏼‍💼|👩🏼‍💻|👩🏼‍🏭|👩🏼‍🏫|👨🏿‍🦽|🚵‍♀️?|👩‍⚕️?|👩‍⚖️?|👩‍✈️?|🚵‍♂️?|🏃‍➡️?|🐦‍🔥|🐦‍⬛|🐕‍🦺|🐈‍⬛|👨‍🚒|👨‍🦯|👨‍🦼|🍋‍🟩|🍄‍🟫|👨‍🦽|👩‍🎨|👩‍🎤|👩‍🎓|👩‍🌾|👩‍🍳|👩‍👦|👨‍👦|👨‍👧|👩‍👧|👨‍🌾|👨‍🍳|👨‍🍼|👨‍🎓|👨‍🎤|👨‍🎨|👨‍🏫|🧑‍🩰|👨‍🏭|👨‍💻|👨‍💼|👨‍🔧|😵‍💫|😮‍💨|👨‍🔬|👨‍🚀|🧑‍🦯|🧑‍🚒|🧑‍🚀|🧑‍🔬|🧑‍🔧|🧑‍💼|🧑‍💻|🧑‍🏭|🧑‍🏫|🧑‍🧒|🧑‍🎨|🧑‍🎤|🧑‍🎓|🧑‍🎄|🧑‍🍼|👩‍🦳|👩‍🦲|👩‍🦱|👩‍🦰|👩‍🦽|🧑‍🌾|👩‍🍼|👩‍🏫|👩‍🏭|👩‍💻|👩‍💼|👩‍🔧|👩‍🔬|👩‍🚀|👩‍🚒|👩‍🦯|👩‍🦼|👨‍🦰|🧑‍🦳|🧑‍🦲|🧑‍🦱|🧑‍🦰|👨‍🦱|👨‍🦲|👨‍🦳|🧑‍🦽|🧑‍🦼|🧑‍🍳)|(?:🏴󠁧󠁢󠁷󠁬󠁳󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁥󠁮󠁧󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_mqe_uqe.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_mqe_uqe.rb new file mode 100644 index 000000000..361ef7d28 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_mqe_uqe.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_INCLUDE_MQE_UQE = /(?:(?:👩🏾‍❤️?‍💋‍👩🏻|👩🏾‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👨🏾|👨🏽‍❤️?‍💋‍👨🏻|👨🏽‍❤️?‍💋‍👨🏼|👨🏽‍❤️?‍💋‍👨🏽|👨🏽‍❤️?‍💋‍👨🏾|👨🏽‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👨🏽|👩🏾‍❤️?‍💋‍👨🏼|👩🏾‍❤️?‍💋‍👨🏻|👨🏾‍❤️?‍💋‍👨🏻|👨🏾‍❤️?‍💋‍👨🏼|👨🏾‍❤️?‍💋‍👨🏽|👨🏾‍❤️?‍💋‍👨🏾|👨🏾‍❤️?‍💋‍👨🏿|👩🏽‍❤️?‍💋‍👩🏿|👩🏿‍❤️?‍💋‍👩🏽|👩🏿‍❤️?‍💋‍👩🏼|👩🏿‍❤️?‍💋‍👩🏻|👩🏿‍❤️?‍💋‍👨🏿|👩🏿‍❤️?‍💋‍👨🏾|👩🏿‍❤️?‍💋‍👨🏽|👩🏿‍❤️?‍💋‍👨🏼|👩🏿‍❤️?‍💋‍👨🏻|👨🏼‍❤️?‍💋‍👨🏻|👨🏼‍❤️?‍💋‍👨🏼|👨🏼‍❤️?‍💋‍👨🏽|👨🏼‍❤️?‍💋‍👨🏾|👨🏼‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👩🏿|👩🏾‍❤️?‍💋‍👩🏾|👩🏾‍❤️?‍💋‍👩🏽|👩🏾‍❤️?‍💋‍👩🏼|👩🏼‍❤️?‍💋‍👩🏼|👩🏼‍❤️?‍💋‍👩🏻|👩🏼‍❤️?‍💋‍👨🏿|👩🏼‍❤️?‍💋‍👨🏾|👩🏼‍❤️?‍💋‍👨🏽|👩🏼‍❤️?‍💋‍👨🏼|👩🏼‍❤️?‍💋‍👨🏻|👩🏻‍❤️?‍💋‍👨🏻|👩🏻‍❤️?‍💋‍👨🏼|👩🏻‍❤️?‍💋‍👨🏽|👩🏻‍❤️?‍💋‍👨🏾|👩🏻‍❤️?‍💋‍👨🏿|👩🏻‍❤️?‍💋‍👩🏻|👩🏻‍❤️?‍💋‍👩🏼|👩🏻‍❤️?‍💋‍👩🏽|👩🏻‍❤️?‍💋‍👩🏾|👩🏻‍❤️?‍💋‍👩🏿|👩🏽‍❤️?‍💋‍👩🏾|👩🏽‍❤️?‍💋‍👩🏽|👩🏽‍❤️?‍💋‍👩🏼|👩🏽‍❤️?‍💋‍👩🏻|👩🏽‍❤️?‍💋‍👨🏿|👩🏽‍❤️?‍💋‍👨🏾|👩🏽‍❤️?‍💋‍👨🏽|👩🏽‍❤️?‍💋‍👨🏼|👩🏽‍❤️?‍💋‍👨🏻|👨🏿‍❤️?‍💋‍👨🏻|👨🏿‍❤️?‍💋‍👨🏼|👨🏿‍❤️?‍💋‍👨🏽|👨🏿‍❤️?‍💋‍👨🏾|👨🏿‍❤️?‍💋‍👨🏿|👩🏼‍❤️?‍💋‍👩🏿|👩🏼‍❤️?‍💋‍👩🏾|👨🏻‍❤️?‍💋‍👨🏼|👨🏻‍❤️?‍💋‍👨🏻|🧑🏼‍❤️?‍💋‍🧑🏻|🧑🏼‍❤️?‍💋‍🧑🏽|🧑🏼‍❤️?‍💋‍🧑🏾|🧑🏼‍❤️?‍💋‍🧑🏿|🧑🏽‍❤️?‍💋‍🧑🏻|🧑🏽‍❤️?‍💋‍🧑🏼|🧑🏽‍❤️?‍💋‍🧑🏾|🧑🏽‍❤️?‍💋‍🧑🏿|🧑🏾‍❤️?‍💋‍🧑🏻|🧑🏾‍❤️?‍💋‍🧑🏼|🧑🏾‍❤️?‍💋‍🧑🏽|🧑🏾‍❤️?‍💋‍🧑🏿|🧑🏿‍❤️?‍💋‍🧑🏾|🧑🏿‍❤️?‍💋‍🧑🏽|🧑🏿‍❤️?‍💋‍🧑🏻|🧑🏿‍❤️?‍💋‍🧑🏼|👩🏼‍❤️?‍💋‍👩🏽|👩🏿‍❤️?‍💋‍👩🏾|👩🏿‍❤️?‍💋‍👩🏿|🧑🏻‍❤️?‍💋‍🧑🏼|🧑🏻‍❤️?‍💋‍🧑🏽|🧑🏻‍❤️?‍💋‍🧑🏾|🧑🏻‍❤️?‍💋‍🧑🏿|👨🏻‍❤️?‍💋‍👨🏿|👨🏻‍❤️?‍💋‍👨🏾|👨🏻‍❤️?‍💋‍👨🏽|👩🏽‍❤️?‍👩🏻|👩🏽‍❤️?‍👨🏿|👩🏽‍❤️?‍👨🏾|👩🏽‍❤️?‍👨🏽|👩🏽‍❤️?‍👨🏼|👩🏽‍❤️?‍👨🏻|🧑🏿‍❤️?‍🧑🏾|🚶🏿‍♀️?‍➡️?|🚶🏾‍♂️?‍➡️?|🚶🏾‍♀️?‍➡️?|🏃🏿‍♂️?‍➡️?|👩🏽‍❤️?‍👩🏼|👩🏽‍❤️?‍👩🏽|👩🏽‍❤️?‍👩🏾|🚶🏿‍♂️?‍➡️?|🧑🏿‍❤️?‍🧑🏽|🧑🏿‍❤️?‍🧑🏼|🧑🏿‍❤️?‍🧑🏻|🏃🏻‍♂️?‍➡️?|🏃🏻‍♀️?‍➡️?|👩🏼‍❤️?‍👨🏻|👩🏼‍❤️?‍👨🏼|👩🏼‍❤️?‍👨🏽|🏃🏼‍♀️?‍➡️?|🏃🏼‍♂️?‍➡️?|👩🏼‍❤️?‍👨🏾|🏃🏽‍♀️?‍➡️?|🏃🏽‍♂️?‍➡️?|🏃🏾‍♀️?‍➡️?|👩🏼‍❤️?‍👨🏿|👩🏼‍❤️?‍👩🏻|👩🏼‍❤️?‍👩🏼|👩🏼‍❤️?‍👩🏽|🏃🏾‍♂️?‍➡️?|🏃🏿‍♀️?‍➡️?|👩🏼‍❤️?‍👩🏾|👩🏼‍❤️?‍👩🏿|🚶🏻‍♀️?‍➡️?|🚶🏻‍♂️?‍➡️?|🚶🏼‍♀️?‍➡️?|🚶🏼‍♂️?‍➡️?|🚶🏽‍♀️?‍➡️?|🚶🏽‍♂️?‍➡️?|👩🏽‍❤️?‍👩🏿|👩🏾‍❤️?‍👩🏻|👩🏾‍❤️?‍👩🏼|👩🏾‍❤️?‍👩🏽|👩🏾‍❤️?‍👩🏾|👩🏾‍❤️?‍👩🏿|🧑🏼‍❤️?‍🧑🏿|🧑🏼‍❤️?‍🧑🏾|🧑🏼‍❤️?‍🧑🏽|🧑🏼‍❤️?‍🧑🏻|🧑🏻‍❤️?‍🧑🏿|👩🏿‍❤️?‍👨🏻|👩🏿‍❤️?‍👨🏼|👩🏿‍❤️?‍👨🏽|👩🏿‍❤️?‍👨🏾|👩🏿‍❤️?‍👨🏿|👩🏿‍❤️?‍👩🏻|👩🏿‍❤️?‍👩🏼|👩🏿‍❤️?‍👩🏽|👩🏿‍❤️?‍👩🏾|👩🏿‍❤️?‍👩🏿|🧑🏻‍❤️?‍🧑🏾|🧑🏻‍❤️?‍🧑🏽|🧑🏻‍❤️?‍🧑🏼|🧑🏾‍❤️?‍🧑🏿|🧑🏾‍❤️?‍🧑🏽|🧑🏾‍❤️?‍🧑🏼|🧑🏾‍❤️?‍🧑🏻|🧎🏿‍♂️?‍➡️?|🧎🏿‍♀️?‍➡️?|🧎🏾‍♂️?‍➡️?|🧎🏾‍♀️?‍➡️?|🧎🏽‍♂️?‍➡️?|🧎🏽‍♀️?‍➡️?|🧑🏽‍❤️?‍🧑🏿|🧑🏽‍❤️?‍🧑🏾|🧑🏽‍❤️?‍🧑🏼|🧑🏽‍❤️?‍🧑🏻|🧎🏼‍♂️?‍➡️?|🧎🏼‍♀️?‍➡️?|🧎🏻‍♂️?‍➡️?|🧎🏻‍♀️?‍➡️?|👩🏾‍❤️?‍👨🏻|👩🏾‍❤️?‍👨🏼|👩🏾‍❤️?‍👨🏽|👩🏾‍❤️?‍👨🏾|👩🏾‍❤️?‍👨🏿|👩🏻‍❤️?‍👩🏻|👩🏻‍❤️?‍👨🏿|👩🏻‍❤️?‍👨🏾|👩🏻‍❤️?‍👨🏽|👩🏻‍❤️?‍👨🏼|👩🏻‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏾|👨🏼‍❤️?‍👨🏻|👩‍❤️?‍💋‍👩|👩‍❤️?‍💋‍👨|👨🏼‍❤️?‍👨🏼|👨🏼‍❤️?‍👨🏽|👨🏼‍❤️?‍👨🏾|👨🏼‍❤️?‍👨🏿|👨🏻‍❤️?‍👨🏽|👨🏻‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏽|👨‍❤️?‍💋‍👨|👨🏾‍❤️?‍👨🏼|👨🏾‍❤️?‍👨🏽|👨🏿‍❤️?‍👨🏿|👨🏾‍❤️?‍👨🏾|👨🏿‍❤️?‍👨🏾|👨🏾‍❤️?‍👨🏿|👨🏿‍❤️?‍👨🏽|👨🏾‍❤️?‍👨🏻|👨🏿‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏿|👨🏿‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏿|👨🏽‍❤️?‍👨🏾|👨🏽‍❤️?‍👨🏻|👩🏻‍❤️?‍👩🏿|👩🏻‍❤️?‍👩🏾|👩🏻‍❤️?‍👩🏽|👩🏻‍❤️?‍👩🏼|🧑🏼‍🐰‍🧑🏿|👨‍👨‍👧‍👦|🧑🏼‍🐰‍🧑🏾|🧑🏼‍🐰‍🧑🏽|🧑🏼‍🐰‍🧑🏻|🧑🏽‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏻|🧑🏼‍🫯‍🧑🏽|🧑🏼‍🫯‍🧑🏾|🧑🏾‍🤝‍🧑🏻|🧑🏾‍🤝‍🧑🏼|🧑🏾‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏾‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏿|🧑🏽‍🐰‍🧑🏻|🧑🏽‍🐰‍🧑🏼|🧑🏽‍🐰‍🧑🏾|🧑🏽‍🐰‍🧑🏿|👨‍👨‍👦‍👦|🧑🏽‍🫯‍🧑🏻|👨‍👩‍👦‍👦|👨‍👩‍👧‍👦|👨‍👩‍👧‍👧|🧑🏻‍🤝‍🧑🏿|🧑🏻‍🤝‍🧑🏾|🧑🏻‍🤝‍🧑🏽|🧑🏻‍🤝‍🧑🏼|🧑🏻‍🤝‍🧑🏻|👨🏻‍🐰‍👨🏼|👨🏻‍🐰‍👨🏽|👨🏻‍🐰‍👨🏾|👨🏻‍🐰‍👨🏿|👨🏻‍🤝‍👨🏼|👨🏻‍🤝‍👨🏽|👨🏻‍🤝‍👨🏾|🧑‍🧑‍🧒‍🧒|👩🏿‍🫯‍👩🏾|👩🏿‍🫯‍👩🏽|🧑🏽‍🤝‍🧑🏾|🧑🏽‍🤝‍🧑🏽|🧑🏽‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏻|🧑🏻‍🫯‍🧑🏿|🧑🏻‍🫯‍🧑🏾|🧑🏻‍🫯‍🧑🏽|🧑🏻‍🫯‍🧑🏼|👨‍👨‍👧‍👧|🧑🏻‍🐰‍🧑🏿|🧑🏻‍🐰‍🧑🏾|🧑🏻‍🐰‍🧑🏽|🧑🏼‍🤝‍🧑🏿|🧑🏼‍🤝‍🧑🏾|🧑🏼‍🤝‍🧑🏽|🧑🏼‍🤝‍🧑🏼|🧑🏼‍🤝‍🧑🏻|🧑🏻‍🐰‍🧑🏼|🧑🏽‍🦼‍➡️?|🧑🏽‍🦯‍➡️?|🧑🏼‍🦽‍➡️?|🧑🏼‍🦼‍➡️?|🧑🏼‍🦯‍➡️?|🧑🏻‍🦽‍➡️?|🧑🏻‍🦼‍➡️?|🧑🏻‍🦯‍➡️?|👩🏿‍🦽‍➡️?|👩🏿‍🦼‍➡️?|👩🏿‍🦯‍➡️?|👩🏾‍🦽‍➡️?|👩🏾‍🦼‍➡️?|👩🏾‍🦯‍➡️?|👩🏽‍🦽‍➡️?|👩🏽‍🦼‍➡️?|👩🏽‍🦯‍➡️?|👩🏼‍🦽‍➡️?|🧑🏿‍🫯‍🧑🏾|🧑🏿‍🫯‍🧑🏽|🧑🏿‍🫯‍🧑🏼|🧑🏿‍🫯‍🧑🏻|🧑🏿‍🐰‍🧑🏾|🧑🏿‍🐰‍🧑🏽|🧑🏿‍🐰‍🧑🏼|🧑🏿‍🐰‍🧑🏻|🧑🏾‍🫯‍🧑🏿|🏃‍♂️?‍➡️?|🏃‍♀️?‍➡️?|🧑🏿‍🦽‍➡️?|🧑🏿‍🦼‍➡️?|🧑🏿‍🦯‍➡️?|🧑🏾‍🦽‍➡️?|🧑🏾‍🦼‍➡️?|🧑🏾‍🦯‍➡️?|🧑🏽‍🦽‍➡️?|👩🏼‍🦼‍➡️?|👨🏻‍🦼‍➡️?|🚶‍♂️?‍➡️?|👨🏻‍🦯‍➡️?|🧑🏾‍🫯‍🧑🏽|🧑🏾‍🫯‍🧑🏼|🧑🏾‍🫯‍🧑🏻|🧑🏿‍🤝‍🧑🏿|🧑🏾‍🐰‍🧑🏿|🧑🏿‍🤝‍🧑🏾|🧑🏾‍🐰‍🧑🏽|🧑🏿‍🤝‍🧑🏽|🧑🏾‍🐰‍🧑🏼|🧑🏿‍🤝‍🧑🏼|🧑🏾‍🐰‍🧑🏻|🧑🏿‍🤝‍🧑🏻|🧑🏽‍🫯‍🧑🏿|🧑🏽‍🫯‍🧑🏾|🧑🏽‍🫯‍🧑🏼|👩🏼‍🦯‍➡️?|👩🏻‍🦽‍➡️?|👩🏻‍🦼‍➡️?|👩🏻‍🦯‍➡️?|👨🏿‍🦽‍➡️?|👨🏿‍🦼‍➡️?|👨🏿‍🦯‍➡️?|👨🏾‍🦽‍➡️?|👨🏾‍🦼‍➡️?|👨🏾‍🦯‍➡️?|👨🏽‍🦽‍➡️?|👨🏽‍🦼‍➡️?|👨🏽‍🦯‍➡️?|👨🏼‍🦽‍➡️?|👨🏼‍🦼‍➡️?|👨🏼‍🦯‍➡️?|👨🏻‍🦽‍➡️?|🚶‍♀️?‍➡️?|👩🏿‍🫯‍👩🏼|👨🏾‍🫯‍👨🏻|👨🏾‍🫯‍👨🏼|👨🏾‍🫯‍👨🏽|👨🏾‍🫯‍👨🏿|👨🏿‍🐰‍👨🏻|👨🏿‍🐰‍👨🏼|👨🏿‍🐰‍👨🏽|👨🏿‍🐰‍👨🏾|👨🏿‍🤝‍👨🏻|👨🏿‍🤝‍👨🏼|👨🏿‍🤝‍👨🏽|👨🏿‍🤝‍👨🏾|👨🏿‍🫯‍👨🏻|👩🏼‍🫯‍👩🏿|👩🏼‍🫯‍👩🏾|👩🏼‍🫯‍👩🏽|👩🏼‍🫯‍👩🏻|👨🏾‍🐰‍👨🏻|👩🏽‍🤝‍👩🏻|👨🏾‍🐰‍👨🏼|👩🏽‍🤝‍👨🏿|👨🏾‍🐰‍👨🏽|👩🏽‍🤝‍👨🏾|👨🏾‍🐰‍👨🏿|👩🏽‍🤝‍👨🏼|👨🏾‍🤝‍👨🏻|👩🏽‍🤝‍👨🏻|👨🏾‍🤝‍👨🏼|👩🏽‍🐰‍👩🏿|👩🏽‍🐰‍👩🏾|👩🏽‍🐰‍👩🏼|👩🏽‍🐰‍👩🏻|👨🏾‍🤝‍👨🏽|👨🏾‍🤝‍👨🏿|👩‍👩‍👧‍👧|👩🏻‍🫯‍👩🏿|👩🏻‍🫯‍👩🏾|👩🏻‍🫯‍👩🏽|👩🏻‍🫯‍👩🏼|👩🏻‍🤝‍👩🏿|👩🏻‍🤝‍👩🏾|👩🏻‍🤝‍👩🏽|👩🏻‍🤝‍👩🏼|👩🏻‍🤝‍👨🏿|👩🏻‍🤝‍👨🏾|👩🏻‍🤝‍👨🏽|👩🏻‍🤝‍👨🏼|👩🏻‍🐰‍👩🏿|👩🏻‍🐰‍👩🏾|👩🏻‍🐰‍👩🏽|👩🏻‍🐰‍👩🏼|👩🏼‍🤝‍👩🏿|👩🏼‍🤝‍👩🏾|👩🏼‍🤝‍👩🏽|👩🏼‍🤝‍👩🏻|👩🏼‍🤝‍👨🏿|👩🏼‍🤝‍👨🏾|👩🏼‍🤝‍👨🏽|👩🏼‍🤝‍👨🏻|👩🏼‍🐰‍👩🏿|👩🏼‍🐰‍👩🏾|👩🏼‍🐰‍👩🏽|👩🏼‍🐰‍👩🏻|👨🏿‍🫯‍👨🏼|👨🏿‍🫯‍👨🏽|👨🏿‍🫯‍👨🏾|👩‍👩‍👦‍👦|👨🏼‍🐰‍👨🏻|👨🏼‍🐰‍👨🏽|👨🏼‍🐰‍👨🏾|👨🏼‍🐰‍👨🏿|👨🏼‍🤝‍👨🏻|👨🏼‍🤝‍👨🏽|👨🏼‍🤝‍👨🏾|👨🏼‍🤝‍👨🏿|👨🏼‍🫯‍👨🏻|👨🏼‍🫯‍👨🏽|👩🏾‍🫯‍👩🏿|👩🏾‍🫯‍👩🏽|👩🏾‍🫯‍👩🏼|👩🏾‍🫯‍👩🏻|👩🏾‍🤝‍👩🏿|👩🏾‍🤝‍👩🏽|👩🏾‍🤝‍👩🏼|👩🏾‍🤝‍👩🏻|👩🏿‍🫯‍👩🏻|👩🏿‍🤝‍👩🏾|👩🏿‍🤝‍👩🏽|👩🏿‍🤝‍👩🏼|👩🏿‍🤝‍👩🏻|👩🏿‍🤝‍👨🏾|👩🏿‍🤝‍👨🏽|👩🏿‍🤝‍👨🏼|👩🏿‍🤝‍👨🏻|👩🏿‍🐰‍👩🏾|👩🏿‍🐰‍👩🏽|👩🏿‍🐰‍👩🏼|👩🏿‍🐰‍👩🏻|👨🏻‍🤝‍👨🏿|👨🏻‍🫯‍👨🏼|👨🏻‍🫯‍👨🏽|👨🏻‍🫯‍👨🏾|👨🏻‍🫯‍👨🏿|👩🏾‍🤝‍👨🏿|👨🏽‍🐰‍👨🏿|👨🏽‍🤝‍👨🏻|👨🏽‍🤝‍👨🏼|👨🏽‍🤝‍👨🏾|👨🏽‍🤝‍👨🏿|👨🏽‍🫯‍👨🏻|👨🏽‍🫯‍👨🏼|👨🏽‍🫯‍👨🏾|👨🏽‍🫯‍👨🏿|👩🏽‍🫯‍👩🏿|🧎‍♀️?‍➡️?|👩🏽‍🫯‍👩🏾|🧎‍♂️?‍➡️?|👩🏽‍🫯‍👩🏼|👩🏽‍🫯‍👩🏻|👩🏽‍🤝‍👩🏿|👩🏽‍🤝‍👩🏾|👩🏽‍🤝‍👩🏼|👩🏾‍🤝‍👨🏽|👩🏾‍🤝‍👨🏼|👩🏾‍🤝‍👨🏻|👩🏾‍🐰‍👩🏿|👩🏾‍🐰‍👩🏽|👩🏾‍🐰‍👩🏼|👩🏾‍🐰‍👩🏻|👨🏼‍🫯‍👨🏾|👨🏼‍🫯‍👨🏿|👨🏽‍🐰‍👨🏻|👨🏽‍🐰‍👨🏼|👨🏽‍🐰‍👨🏾|👩‍👩‍👧‍👦|👨‍🦽‍➡️?|🧑‍🦯‍➡️?|👨‍🦼‍➡️?|🧑‍🦼‍➡️?|👨‍🦯‍➡️?|🧑‍🦽‍➡️?|👩‍❤️?‍👩|👩‍❤️?‍👨|👩‍🦯‍➡️?|👨‍❤️?‍👨|👩‍🦼‍➡️?|👩‍🦽‍➡️?|🧖🏾‍♀️?|🧖🏽‍♂️?|🧖🏽‍♀️?|🧖🏼‍♂️?|🧖🏼‍♀️?|🧖🏻‍♂️?|🧖🏻‍♀️?|👩🏾‍✈️?|👩🏾‍⚖️?|👩🏾‍⚕️?|🧔🏿‍♂️?|🧔🏿‍♀️?|🧔🏾‍♂️?|🚴🏻‍♀️?|🧔🏾‍♀️?|🧔🏽‍♂️?|🧔🏽‍♀️?|🧔🏼‍♂️?|🧔🏼‍♀️?|🧔🏻‍♂️?|🧔🏻‍♀️?|🧘🏻‍♂️?|🧘🏻‍♀️?|🧗🏿‍♂️?|🧗🏿‍♀️?|🧗🏾‍♂️?|🧗🏾‍♀️?|🧗🏽‍♂️?|🧗🏽‍♀️?|👩🏿‍✈️?|👩🏿‍⚖️?|👩🏿‍⚕️?|🚣🏾‍♂️?|🧗🏼‍♂️?|🚣🏿‍♀️?|🧗🏼‍♀️?|🚣🏿‍♂️?|🧗🏻‍♂️?|🧗🏻‍♀️?|🧖🏿‍♂️?|🧖🏿‍♀️?|🧖🏾‍♂️?|🧎🏽‍♀️?|🧎🏼‍♂️?|🧎🏼‍♀️?|🧎🏻‍♂️?|🧎🏻‍♀️?|👩🏼‍✈️?|👩🏼‍⚖️?|👩🏼‍⚕️?|🚴🏽‍♀️?|🚴🏽‍♂️?|🧍🏿‍♂️?|🚴🏾‍♀️?|🧍🏿‍♀️?|🧍🏾‍♂️?|🧍🏾‍♀️?|🧍🏽‍♂️?|🧍🏽‍♀️?|🧍🏼‍♂️?|🧍🏼‍♀️?|🧍🏻‍♂️?|🧍🏻‍♀️?|🧏🏿‍♂️?|🧏🏿‍♀️?|🧏🏾‍♂️?|🧏🏾‍♀️?|🧏🏽‍♂️?|🧏🏽‍♀️?|👩🏽‍✈️?|👩🏽‍⚖️?|👩🏽‍⚕️?|🚴🏻‍♂️?|🧏🏼‍♂️?|🚴🏼‍♀️?|🧏🏼‍♀️?|🚴🏼‍♂️?|🧏🏻‍♂️?|🧏🏻‍♀️?|🧎🏿‍♂️?|🧎🏿‍♀️?|🧎🏾‍♂️?|🧎🏾‍♀️?|🧎🏽‍♂️?|🧑🏼‍⚕️?|👩‍👧‍👧|👩‍👩‍👦|🧜🏻‍♀️?|👩‍👩‍👧|🚣🏻‍♀️?|🧛🏿‍♂️?|🧛🏿‍♀️?|🧛🏾‍♂️?|🧛🏾‍♀️?|🧛🏽‍♂️?|🧛🏽‍♀️?|🧛🏼‍♂️?|🧛🏼‍♀️?|🧛🏻‍♂️?|🧛🏻‍♀️?|🧚🏿‍♂️?|🧚🏿‍♀️?|🧑🏻‍✈️?|🧑🏻‍⚖️?|🧑🏻‍⚕️?|🙎🏾‍♂️?|🧝🏽‍♀️?|🙎🏿‍♀️?|🧝🏼‍♂️?|🙎🏿‍♂️?|🧝🏼‍♀️?|🧝🏻‍♂️?|🧝🏻‍♀️?|🧜🏿‍♂️?|🧜🏿‍♀️?|🧜🏾‍♂️?|🧜🏾‍♀️?|🧜🏽‍♂️?|🧜🏽‍♀️?|🧜🏼‍♂️?|🧜🏼‍♀️?|🧜🏻‍♂️?|👩‍👦‍👦|👩‍👧‍👦|🧑🏼‍✈️?|🧑🏼‍⚖️?|🧎🏿‍➡️?|🧎🏾‍➡️?|🧎🏽‍➡️?|🧎🏼‍➡️?|🧎🏻‍➡️?|🚶🏿‍➡️?|🚶🏾‍➡️?|🚶🏽‍➡️?|🚶🏼‍➡️?|🚶🏻‍➡️?|🧘🏿‍♂️?|🚣🏽‍♀️?|🧘🏿‍♀️?|🚣🏽‍♂️?|🧘🏾‍♂️?|🚣🏾‍♀️?|🧘🏾‍♀️?|🧘🏽‍♂️?|🧘🏽‍♀️?|🧘🏼‍♂️?|🧘🏼‍♀️?|🚣🏻‍♂️?|🧚🏾‍♂️?|🚣🏼‍♀️?|🧚🏾‍♀️?|🚣🏼‍♂️?|🧚🏽‍♂️?|🧚🏽‍♀️?|🧚🏼‍♂️?|🧚🏼‍♀️?|🧚🏻‍♂️?|🧚🏻‍♀️?|🧙🏿‍♂️?|🧙🏿‍♀️?|🧙🏾‍♂️?|🧙🏾‍♀️?|🧙🏽‍♂️?|🧙🏽‍♀️?|🧙🏼‍♂️?|🧙🏼‍♀️?|🧙🏻‍♂️?|🧙🏻‍♀️?|👨🏼‍✈️?|👨🏼‍⚖️?|👨🏼‍⚕️?|🤷🏼‍♀️?|🤷🏻‍♂️?|🤷🏻‍♀️?|🚶🏻‍♀️?|🤵🏿‍♂️?|🤵🏿‍♀️?|🤵🏾‍♂️?|🤵🏾‍♀️?|🤵🏽‍♂️?|🤵🏽‍♀️?|🤵🏼‍♂️?|🤵🏼‍♀️?|🤵🏻‍♂️?|🤵🏻‍♀️?|🤦🏿‍♂️?|🤦🏿‍♀️?|👨🏻‍✈️?|👨🏻‍⚖️?|👨🏽‍✈️?|👨🏽‍⚖️?|👨🏽‍⚕️?|🚵🏾‍♂️?|🤸🏾‍♂️?|🚵🏿‍♀️?|🤸🏾‍♀️?|🚵🏿‍♂️?|🤸🏽‍♂️?|🤸🏽‍♀️?|🤸🏼‍♂️?|🤸🏼‍♀️?|🤸🏻‍♂️?|🤸🏻‍♀️?|🤷🏿‍♂️?|🤷🏿‍♀️?|🤷🏾‍♂️?|🤷🏾‍♀️?|🤷🏽‍♂️?|🤷🏽‍♀️?|🤷🏼‍♂️?|🫱🏻‍🫲🏿|🏃🏿‍➡️?|🏃🏾‍➡️?|🏃🏽‍➡️?|🏃🏼‍➡️?|🏃🏻‍➡️?|🫱🏼‍🫲🏻|🫱🏿‍🫲🏾|🫱🏿‍🫲🏽|🫱🏿‍🫲🏼|🫱🏿‍🫲🏻|🫱🏾‍🫲🏿|🫱🏾‍🫲🏽|🫱🏾‍🫲🏼|🫱🏾‍🫲🏻|🫱🏽‍🫲🏿|🫱🏽‍🫲🏾|🫱🏽‍🫲🏼|🫱🏽‍🫲🏻|🫱🏼‍🫲🏿|🫱🏼‍🫲🏾|👨🏻‍⚕️?|🚶🏻‍♂️?|🤦🏾‍♂️?|🚶🏼‍♀️?|🤦🏾‍♀️?|🚶🏼‍♂️?|🤦🏽‍♂️?|🤦🏽‍♀️?|🤦🏼‍♂️?|🤦🏼‍♀️?|🤦🏻‍♂️?|🤦🏻‍♀️?|🚶🏿‍♂️?|🚶🏿‍♀️?|🚶🏾‍♂️?|🚶🏾‍♀️?|🚶🏽‍♂️?|🚶🏽‍♀️?|🫱🏻‍🫲🏼|🫱🏻‍🫲🏽|🫱🏻‍🫲🏾|🦸🏽‍♀️?|🦸🏼‍♂️?|🦸🏼‍♀️?|🦸🏻‍♂️?|🦸🏻‍♀️?|🤾🏿‍♂️?|🤾🏿‍♀️?|🤾🏾‍♂️?|🤾🏾‍♀️?|🚵🏻‍♀️?|🤾🏽‍♂️?|🤾🏽‍♀️?|🤾🏼‍♂️?|🤾🏼‍♀️?|🤾🏻‍♂️?|🤾🏻‍♀️?|🤽🏿‍♂️?|🤽🏿‍♀️?|🤽🏾‍♂️?|🤽🏾‍♀️?|🤽🏽‍♂️?|🦹🏿‍♂️?|🦹🏿‍♀️?|🦹🏾‍♂️?|🦹🏾‍♀️?|👩🏻‍✈️?|👩🏻‍⚖️?|👩🏻‍⚕️?|🚴🏾‍♂️?|🦹🏽‍♂️?|🚴🏿‍♀️?|🦹🏽‍♀️?|🚴🏿‍♂️?|🦹🏼‍♂️?|🦹🏼‍♀️?|🦹🏻‍♂️?|🦹🏻‍♀️?|🦸🏿‍♂️?|🦸🏿‍♀️?|🦸🏾‍♂️?|🦸🏾‍♀️?|🦸🏽‍♂️?|👨🏾‍✈️?|👨🏾‍⚖️?|👨🏾‍⚕️?|🚵🏽‍♀️?|🧑‍🤝‍🧑|🚵🏽‍♂️?|🧑‍🧑‍🧒|🚵🏾‍♀️?|🤹🏿‍♂️?|🧑‍🧒‍🧒|🤹🏿‍♀️?|🤹🏾‍♂️?|🤹🏾‍♀️?|🤹🏽‍♂️?|🤹🏽‍♀️?|🤹🏼‍♂️?|🤹🏼‍♀️?|🤹🏻‍♂️?|🤹🏻‍♀️?|🤸🏿‍♂️?|🤸🏿‍♀️?|🤽🏽‍♀️?|🤽🏼‍♂️?|👨🏿‍✈️?|👨🏿‍⚖️?|👨🏿‍⚕️?|🚵🏻‍♂️?|🤽🏼‍♀️?|🚵🏼‍♀️?|🤽🏻‍♂️?|🚵🏼‍♂️?|🤽🏻‍♀️?|🤼🏿‍♂️?|🤼🏿‍♀️?|🤼🏾‍♂️?|🤼🏾‍♀️?|🤼🏽‍♂️?|🤼🏽‍♀️?|🤼🏼‍♂️?|🤼🏼‍♀️?|🤼🏻‍♂️?|🤼🏻‍♀️?|👷🏽‍♀️?|👷🏼‍♂️?|👷🏼‍♀️?|👷🏻‍♂️?|👷🏻‍♀️?|👳🏿‍♂️?|👳🏿‍♀️?|👳🏾‍♂️?|👳🏾‍♀️?|👳🏽‍♂️?|👳🏽‍♀️?|👳🏼‍♂️?|👳🏼‍♀️?|👳🏻‍♂️?|👳🏻‍♀️?|🏳️?‍⚧️?|👱🏿‍♂️?|👱🏿‍♀️?|👱🏾‍♂️?|👱🏾‍♀️?|👱🏽‍♂️?|💂🏽‍♀️?|💂🏼‍♂️?|💂🏼‍♀️?|💂🏻‍♂️?|💂🏻‍♀️?|💁🏿‍♂️?|💁🏿‍♀️?|💁🏾‍♂️?|💁🏾‍♀️?|💁🏽‍♂️?|💁🏽‍♀️?|💁🏼‍♂️?|💁🏼‍♀️?|💁🏻‍♂️?|💁🏻‍♀️?|👁️?‍🗨️?|👷🏿‍♂️?|👷🏿‍♀️?|👷🏾‍♂️?|👷🏾‍♀️?|👷🏽‍♂️?|👯🏼‍♂️?|👯🏼‍♀️?|👯🏻‍♂️?|👯🏻‍♀️?|👮🏿‍♂️?|👮🏿‍♀️?|👮🏾‍♂️?|👮🏾‍♀️?|👮🏽‍♂️?|👮🏽‍♀️?|👮🏼‍♂️?|👮🏼‍♀️?|👮🏻‍♂️?|👮🏻‍♀️?|🏌️?‍♂️?|🏌️?‍♀️?|🏌🏿‍♂️?|🏌🏿‍♀️?|🏌🏾‍♂️?|🏌🏾‍♀️?|🏌🏽‍♂️?|👱🏽‍♀️?|👱🏼‍♂️?|👱🏼‍♀️?|👱🏻‍♂️?|👱🏻‍♀️?|👰🏿‍♂️?|👰🏿‍♀️?|👰🏾‍♂️?|👰🏾‍♀️?|👰🏽‍♂️?|👰🏽‍♀️?|👰🏼‍♂️?|👰🏼‍♀️?|👰🏻‍♂️?|👰🏻‍♀️?|👯🏿‍♂️?|👯🏿‍♀️?|👯🏾‍♂️?|👯🏾‍♀️?|👯🏽‍♂️?|👯🏽‍♀️?|👨‍👧‍👦|🙆🏿‍♂️?|🙆🏿‍♀️?|🙆🏾‍♂️?|🙆🏾‍♀️?|🙆🏽‍♂️?|🙆🏽‍♀️?|🙆🏼‍♂️?|🙆🏼‍♀️?|🙆🏻‍♂️?|🙆🏻‍♀️?|👨‍👧‍👧|👨‍👨‍👦|🙅🏿‍♂️?|🙅🏿‍♀️?|🙅🏾‍♂️?|🙅🏾‍♀️?|🙅🏽‍♂️?|🙅🏽‍♀️?|🙅🏼‍♂️?|🙅🏼‍♀️?|🙋🏿‍♂️?|🙋🏿‍♀️?|🙋🏾‍♂️?|🙋🏾‍♀️?|🙋🏽‍♂️?|🙋🏽‍♀️?|🙋🏼‍♂️?|🙋🏼‍♀️?|🙋🏻‍♂️?|🙋🏻‍♀️?|🙇🏿‍♂️?|🙇🏿‍♀️?|🙇🏾‍♂️?|🙇🏾‍♀️?|🙇🏽‍♂️?|🙇🏽‍♀️?|🙇🏼‍♂️?|🙇🏼‍♀️?|🙇🏻‍♂️?|🙇🏻‍♀️?|👨‍👦‍👦|💇🏼‍♂️?|💇🏼‍♀️?|💇🏻‍♂️?|💇🏻‍♀️?|💆🏿‍♂️?|💆🏿‍♀️?|💆🏾‍♂️?|💆🏾‍♀️?|💆🏽‍♂️?|💆🏽‍♀️?|💆🏼‍♂️?|💆🏼‍♀️?|💆🏻‍♂️?|💆🏻‍♀️?|👨‍👩‍👦|👨‍👩‍👧|💂🏿‍♂️?|💂🏿‍♀️?|💂🏾‍♂️?|💂🏾‍♀️?|💂🏽‍♂️?|🙅🏻‍♂️?|🙅🏻‍♀️?|👨‍👨‍👧|🕵️?‍♂️?|🕵️?‍♀️?|🕵🏿‍♂️?|🕵🏿‍♀️?|🕵🏾‍♂️?|🕵🏾‍♀️?|🕵🏽‍♂️?|🕵🏽‍♀️?|🕵🏼‍♂️?|🕵🏼‍♀️?|🕵🏻‍♂️?|🕵🏻‍♀️?|💇🏿‍♂️?|💇🏿‍♀️?|💇🏾‍♂️?|💇🏾‍♀️?|💇🏽‍♂️?|💇🏽‍♀️?|🏌🏽‍♀️?|⛹🏾‍♀️?|⛹🏾‍♂️?|⛹🏿‍♀️?|⛹🏿‍♂️?|⛹️?‍♀️?|⛹️?‍♂️?|🙍🏿‍♂️?|🙍🏿‍♀️?|🏃🏻‍♀️?|🙍🏾‍♂️?|🏃🏻‍♂️?|🙍🏾‍♀️?|🏃🏼‍♀️?|🙍🏽‍♂️?|🏃🏼‍♂️?|🙍🏽‍♀️?|🏃🏽‍♀️?|🙍🏼‍♂️?|🏃🏽‍♂️?|🙍🏼‍♀️?|🏃🏾‍♀️?|🙍🏻‍♂️?|🏃🏾‍♂️?|🙍🏻‍♀️?|🏃🏿‍♀️?|🏃🏿‍♂️?|🏄🏻‍♀️?|🏄🏻‍♂️?|🫱🏼‍🫲🏽|🧑🏽‍⚕️?|🧑🏽‍⚖️?|🧑🏽‍✈️?|🧝🏽‍♂️?|🧝🏾‍♀️?|🧝🏾‍♂️?|🧝🏿‍♀️?|🧝🏿‍♂️?|🙎🏾‍♀️?|🙎🏽‍♂️?|🙎🏽‍♀️?|🧑🏾‍⚕️?|🧑🏾‍⚖️?|🧑🏾‍✈️?|🙎🏼‍♂️?|🙎🏼‍♀️?|🙎🏻‍♂️?|🧑🏿‍⚕️?|🧑🏿‍⚖️?|🧑🏿‍✈️?|🙎🏻‍♀️?|⛹🏻‍♀️?|⛹🏻‍♂️?|⛹🏼‍♀️?|⛹🏼‍♂️?|⛹🏽‍♀️?|⛹🏽‍♂️?|🏊🏻‍♀️?|🏊🏻‍♂️?|🏊🏼‍♀️?|🏊🏼‍♂️?|🏊🏽‍♀️?|🏊🏽‍♂️?|🏊🏾‍♀️?|🏊🏾‍♂️?|🏊🏿‍♀️?|🏊🏿‍♂️?|🏋🏻‍♀️?|🏋🏻‍♂️?|🏋🏼‍♀️?|🏋🏼‍♂️?|🏋🏽‍♀️?|🏋🏽‍♂️?|🏋🏾‍♀️?|🏋🏾‍♂️?|🏋🏿‍♀️?|🏋🏿‍♂️?|🏋️?‍♀️?|🏋️?‍♂️?|🏌🏻‍♀️?|🏌🏻‍♂️?|🏌🏼‍♀️?|🏌🏼‍♂️?|🏄🏿‍♀️?|🏄🏾‍♂️?|🏄🏾‍♀️?|🏄🏽‍♂️?|🏄🏽‍♀️?|🏄🏿‍♂️?|🏄🏼‍♂️?|🏄🏼‍♀️?|🤾‍♂️?|👨🏽‍🦱|👨🏽‍🦲|👨🏽‍🦳|🧜‍♀️?|👨🏾‍🦰|👨🏾‍🦱|👨🏾‍🦲|👨🏾‍🦳|👨🏿‍🦰|👨🏿‍🦱|🧜‍♂️?|🤦‍♂️?|🤷‍♀️?|👩🏼‍🦲|🧑🏽‍🦱|👩🏼‍🦱|🤾‍♀️?|👩🏼‍🦰|👩🏻‍🦳|👩🏻‍🦲|👩🏻‍🦱|👩🏻‍🦰|👨🏿‍🦳|🤵‍♂️?|🤵‍♀️?|🧑🏽‍🩰|👨🏿‍🦲|🧛‍♀️?|🧛‍♂️?|🧖‍♂️?|🧎‍♂️?|🧖‍♀️?|🧑🏾‍🦰|🧑🏽‍🦳|🧑🏽‍🦲|🧝‍♂️?|🧝‍♀️?|🧑🏿‍🩰|🧑🏾‍🩰|🧎‍♀️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|👨🏻‍🦰|👨🏻‍🦱|👨🏻‍🦲|👨🏻‍🦳|👨🏼‍🦰|👨🏼‍🦱|👨🏼‍🦲|🧏‍♀️?|👨🏼‍🦳|🧑🏾‍🦳|👨🏽‍🦰|🧑🏿‍🦰|🧏‍♂️?|❤️?‍🩹|🤦‍♀️?|🧑🏼‍🦰|🧑🏼‍🦱|🤹‍♀️?|🤹‍♂️?|🧑🏼‍🦲|🧍‍♀️?|🧑🏿‍🦱|🧑🏿‍🦲|🧗‍♀️?|🧗‍♂️?|🙂‍↕️?|🙂‍↔️?|🏴‍☠️?|🧔‍♀️?|🧑🏼‍🦳|🧘‍♂️?|🧘‍♀️?|🧔‍♂️?|🤼‍♀️?|🤼‍♂️?|😶‍🌫️?|🧑🏽‍🦰|🐻‍❄️?|🧑🏿‍🦳|⛓️?‍💥|🦹‍♂️?|🦹‍♀️?|🧑🏾‍🦱|🧑🏾‍🦲|🤽‍♀️?|🤽‍♂️?|🏳️?‍🌈|🤷‍♂️?|🦸‍♀️?|🦸‍♂️?|❤️?‍🔥|👩🏼‍🦳|🧚‍♂️?|🧚‍♀️?|👩🏽‍🦰|👩🏽‍🦱|👩🏽‍🦲|👩🏽‍🦳|👩🏾‍🦰|👩🏾‍🦱|🧑🏼‍🩰|🤸‍♀️?|🤸‍♂️?|🧑🏻‍🩰|👩🏾‍🦲|👩🏾‍🦳|👩🏿‍🦰|👩🏿‍🦱|🧙‍♂️?|👩🏿‍🦲|👩🏿‍🦳|🧑🏻‍🦰|🧑🏻‍🦱|🧑🏻‍🦲|🧙‍♀️?|🧍‍♂️?|🧑🏻‍🦳|🚣‍♀️?|🧑🏻‍🦽|🚣‍♂️?|🧑🏻‍🦼|🧑🏻‍🦯|🧑🏻‍🚒|🧑🏻‍🚀|🧑🏻‍🔬|🧑🏻‍🔧|🧑🏻‍💼|🧑🏻‍💻|🧑🏻‍🏭|🧑🏻‍🏫|🧑🏻‍🎨|🧑🏻‍🎤|🧑🏻‍🎓|🧑🏻‍🎄|🧑🏻‍🍼|🧑🏻‍🍳|🧑🏻‍🌾|🧑‍✈️?|🧑‍⚖️?|🧑🏽‍🎄|🧑🏽‍🍼|🧑🏽‍🍳|🧑🏽‍🌾|🧑🏼‍🦽|🧑🏼‍🦼|🧑🏼‍🦯|🧑🏼‍🚒|🧑🏼‍🚀|🧑🏼‍🔬|🧑🏼‍🔧|🧑🏼‍💼|🧑🏼‍💻|🧑🏼‍🏭|🧑🏼‍🏫|🧑🏼‍🎨|🧑🏼‍🎤|🧑🏼‍🎓|🧑🏼‍🎄|🧑🏼‍🍼|🧑🏼‍🍳|🧑🏼‍🌾|👩🏾‍🦯|👩🏾‍🚒|👩🏾‍🚀|👩🏾‍🔬|👩🏾‍🔧|👩🏾‍💼|👩🏾‍💻|👩🏾‍🏭|👩🏾‍🏫|👩🏾‍🎨|👩🏾‍🎤|👩🏾‍🎓|👩🏾‍🍼|👩🏾‍🍳|👩🏾‍🌾|🚴‍♀️?|👩🏽‍🦽|🚴‍♂️?|👩🏽‍🦼|👩🏽‍🦯|👩🏽‍🚒|👩🏽‍🚀|🧑‍⚕️?|🧎‍➡️?|🚶‍➡️?|👩🏿‍🦽|👩🏿‍🦼|👩🏿‍🦯|👩🏿‍🚒|👩🏿‍🚀|👩🏿‍🔬|👩🏿‍🔧|👩🏿‍💼|👩🏿‍💻|👩🏿‍🏭|👩🏿‍🏫|👩🏿‍🎨|👩🏿‍🎤|👩🏿‍🎓|👩🏿‍🍼|👩🏿‍🍳|👩🏿‍🌾|👩🏾‍🦽|👩🏾‍🦼|👰‍♂️?|👰‍♀️?|👯‍♂️?|👯‍♀️?|👮‍♂️?|👮‍♀️?|🏊‍♂️?|🏊‍♀️?|🏄‍♂️?|🏄‍♀️?|🙍‍♀️?|🙍‍♂️?|🏃‍♂️?|🏃‍♀️?|🙎‍♀️?|🧑🏿‍🦽|🙎‍♂️?|🧑🏿‍🦼|🧑🏿‍🦯|🧑🏿‍🚒|🧑🏿‍🚀|🧑🏿‍🔬|🙋‍♂️?|🙋‍♀️?|🙇‍♂️?|🙇‍♀️?|🙆‍♂️?|🙆‍♀️?|🙅‍♂️?|🙅‍♀️?|💇‍♂️?|💇‍♀️?|💆‍♂️?|💆‍♀️?|💂‍♂️?|💂‍♀️?|💁‍♂️?|💁‍♀️?|👷‍♂️?|👷‍♀️?|👳‍♂️?|👳‍♀️?|👱‍♂️?|👱‍♀️?|🧑🏾‍🏫|🧑🏾‍🎨|🧑🏾‍🎤|🧑🏾‍🎓|🧑🏾‍🎄|🧑🏾‍🍼|🧑🏾‍🍳|🧑🏾‍🌾|🧑🏽‍🦽|🧑🏽‍🦼|🧑🏽‍🦯|🧑🏽‍🚒|🧑🏽‍🚀|🧑🏽‍🔬|🧑🏽‍🔧|🧑🏽‍💼|🧑🏽‍💻|🧑🏽‍🏭|🧑🏽‍🏫|🧑🏽‍🎨|🧑🏽‍🎤|🧑🏽‍🎓|🧑🏿‍🔧|🧑🏿‍💼|🧑🏿‍💻|🧑🏿‍🏭|🧑🏿‍🏫|🧑🏿‍🎨|🧑🏿‍🎤|🧑🏿‍🎓|🧑🏿‍🎄|🧑🏿‍🍼|🧑🏿‍🍳|🧑🏿‍🌾|🧑🏾‍🦽|🧑🏾‍🦼|🧑🏾‍🦯|🧑🏾‍🚒|🧑🏾‍🚀|🧑🏾‍🔬|🧑🏾‍🔧|🧑🏾‍💼|🧑🏾‍💻|🧑🏾‍🏭|👨🏾‍🔧|👨🏾‍💼|👨🏾‍💻|👨🏾‍🏭|👨🏾‍🏫|👨🏾‍🎨|👨🏾‍🎤|👨🏾‍🎓|👨🏾‍🍼|👨🏾‍🍳|👨🏾‍🌾|👨🏽‍🦽|👨🏽‍🦼|👨🏽‍🦯|👨🏽‍🚒|👨🏽‍🚀|👨🏽‍🔬|👨🏽‍🔧|👨🏽‍💼|👨🏽‍💻|👨🏽‍🏭|👨🏽‍🏫|👨🏿‍🦼|👨🏿‍🦯|👨🏿‍🚒|👨🏿‍🚀|👨🏿‍🔬|👨🏿‍🔧|👨🏿‍💼|👨🏿‍💻|👨🏿‍🏭|👨🏿‍🏫|👨🏿‍🎨|👨🏿‍🎤|👨🏿‍🎓|👨🏿‍🍼|👨🏿‍🍳|👨🏿‍🌾|👨🏾‍🦽|👨🏾‍🦼|👨🏾‍🦯|👨🏾‍🚒|👨🏾‍🚀|👨🏾‍🔬|👨🏽‍🎨|🚶‍♀️?|👨🏻‍🦽|🚶‍♂️?|👨🏻‍🦼|👨🏻‍🦯|👨🏻‍🚒|👨🏻‍🚀|👨🏻‍🔬|👨🏻‍🔧|👨🏻‍💼|👨🏻‍💻|👨🏻‍🏭|👨🏻‍🏫|👨🏻‍🎨|👨🏻‍🎤|👨🏻‍🎓|👨🏻‍🍼|👨🏻‍🍳|👨🏻‍🌾|👨‍✈️?|👨‍⚖️?|👨‍⚕️?|👨🏽‍🎤|👨🏽‍🎓|👨🏽‍🍼|👨🏽‍🍳|👨🏽‍🌾|👨🏼‍🦽|👨🏼‍🦼|👨🏼‍🦯|👨🏼‍🚒|👨🏼‍🚀|👨🏼‍🔬|👨🏼‍🔧|👨🏼‍💼|👨🏼‍💻|👨🏼‍🏭|👨🏼‍🏫|👨🏼‍🎨|👨🏼‍🎤|👨🏼‍🎓|👨🏼‍🍼|👨🏼‍🍳|👨🏼‍🌾|👩🏼‍🎨|👩🏼‍🎤|👩🏼‍🎓|👩🏼‍🍼|👩🏼‍🍳|👩🏼‍🌾|👩🏻‍🦽|👩🏻‍🦼|👩🏻‍🦯|👩🏻‍🚒|👩🏻‍🚀|👩🏻‍🔬|👩🏻‍🔧|👩🏻‍💼|👩🏻‍💻|👩🏻‍🏭|👩🏻‍🏫|👩🏻‍🎨|👩🏻‍🎤|👩🏻‍🎓|👩🏻‍🍼|👩🏻‍🍳|👩🏻‍🌾|👩🏽‍🔬|👩🏽‍🔧|👩🏽‍💼|👩🏽‍💻|👩🏽‍🏭|👩🏽‍🏫|👩🏽‍🎨|👩🏽‍🎤|👩🏽‍🎓|👩🏽‍🍼|👩🏽‍🍳|👩🏽‍🌾|👩🏼‍🦽|👩🏼‍🦼|👩🏼‍🦯|👩🏼‍🚒|👩🏼‍🚀|👩🏼‍🔬|👩🏼‍🔧|👩🏼‍💼|👩🏼‍💻|👩🏼‍🏭|👩🏼‍🏫|👨🏿‍🦽|🚵‍♀️?|👩‍⚕️?|👩‍⚖️?|👩‍✈️?|🚵‍♂️?|🏃‍➡️?|🐦‍🔥|🐦‍⬛|🐕‍🦺|🐈‍⬛|👨‍🚒|👨‍🦯|👨‍🦼|🍋‍🟩|🍄‍🟫|👨‍🦽|👩‍🎨|👩‍🎤|👩‍🎓|👩‍🌾|👩‍🍳|👩‍👦|👨‍👦|👨‍👧|👩‍👧|👨‍🌾|👨‍🍳|👨‍🍼|👨‍🎓|👨‍🎤|👨‍🎨|👨‍🏫|🧑‍🩰|👨‍🏭|👨‍💻|👨‍💼|👨‍🔧|😵‍💫|😮‍💨|👨‍🔬|👨‍🚀|🧑‍🦯|🧑‍🚒|🧑‍🚀|🧑‍🔬|🧑‍🔧|🧑‍💼|🧑‍💻|🧑‍🏭|🧑‍🏫|🧑‍🧒|🧑‍🎨|🧑‍🎤|🧑‍🎓|🧑‍🎄|🧑‍🍼|👩‍🦳|👩‍🦲|👩‍🦱|👩‍🦰|👩‍🦽|🧑‍🌾|👩‍🍼|👩‍🏫|👩‍🏭|👩‍💻|👩‍💼|👩‍🔧|👩‍🔬|👩‍🚀|👩‍🚒|👩‍🦯|👩‍🦼|👨‍🦰|🧑‍🦳|🧑‍🦲|🧑‍🦱|🧑‍🦰|👨‍🦱|👨‍🦲|👨‍🦳|🧑‍🦽|🧑‍🦼|🧑‍🍳)|(?:(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳](?!(?:[🏻-🏿]|️))︎?|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]︎)|[\#\*0-9]⃣)|(?:🏴󠁧󠁢󠁷󠁬󠁳󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁥󠁮󠁧󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_text.rb new file mode 100644 index 000000000..69f79e216 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_include_text.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_INCLUDE_TEXT = /(?:(?:👩🏾‍❤️‍💋‍👩🏻|👩🏾‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👨🏾|👨🏽‍❤️‍💋‍👨🏻|👨🏽‍❤️‍💋‍👨🏼|👨🏽‍❤️‍💋‍👨🏽|👨🏽‍❤️‍💋‍👨🏾|👨🏽‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👨🏽|👩🏾‍❤️‍💋‍👨🏼|👩🏾‍❤️‍💋‍👨🏻|👨🏾‍❤️‍💋‍👨🏻|👨🏾‍❤️‍💋‍👨🏼|👨🏾‍❤️‍💋‍👨🏽|👨🏾‍❤️‍💋‍👨🏾|👨🏾‍❤️‍💋‍👨🏿|👩🏽‍❤️‍💋‍👩🏿|👩🏿‍❤️‍💋‍👩🏽|👩🏿‍❤️‍💋‍👩🏼|👩🏿‍❤️‍💋‍👩🏻|👩🏿‍❤️‍💋‍👨🏿|👩🏿‍❤️‍💋‍👨🏾|👩🏿‍❤️‍💋‍👨🏽|👩🏿‍❤️‍💋‍👨🏼|👩🏿‍❤️‍💋‍👨🏻|👨🏼‍❤️‍💋‍👨🏻|👨🏼‍❤️‍💋‍👨🏼|👨🏼‍❤️‍💋‍👨🏽|👨🏼‍❤️‍💋‍👨🏾|👨🏼‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👩🏿|👩🏾‍❤️‍💋‍👩🏾|👩🏾‍❤️‍💋‍👩🏽|👩🏾‍❤️‍💋‍👩🏼|👩🏼‍❤️‍💋‍👩🏼|👩🏼‍❤️‍💋‍👩🏻|👩🏼‍❤️‍💋‍👨🏿|👩🏼‍❤️‍💋‍👨🏾|👩🏼‍❤️‍💋‍👨🏽|👩🏼‍❤️‍💋‍👨🏼|👩🏼‍❤️‍💋‍👨🏻|👩🏻‍❤️‍💋‍👨🏻|👩🏻‍❤️‍💋‍👨🏼|👩🏻‍❤️‍💋‍👨🏽|👩🏻‍❤️‍💋‍👨🏾|👩🏻‍❤️‍💋‍👨🏿|👩🏻‍❤️‍💋‍👩🏻|👩🏻‍❤️‍💋‍👩🏼|👩🏻‍❤️‍💋‍👩🏽|👩🏻‍❤️‍💋‍👩🏾|👩🏻‍❤️‍💋‍👩🏿|👩🏽‍❤️‍💋‍👩🏾|👩🏽‍❤️‍💋‍👩🏽|👩🏽‍❤️‍💋‍👩🏼|👩🏽‍❤️‍💋‍👩🏻|👩🏽‍❤️‍💋‍👨🏿|👩🏽‍❤️‍💋‍👨🏾|👩🏽‍❤️‍💋‍👨🏽|👩🏽‍❤️‍💋‍👨🏼|👩🏽‍❤️‍💋‍👨🏻|👨🏿‍❤️‍💋‍👨🏻|👨🏿‍❤️‍💋‍👨🏼|👨🏿‍❤️‍💋‍👨🏽|👨🏿‍❤️‍💋‍👨🏾|👨🏿‍❤️‍💋‍👨🏿|👩🏼‍❤️‍💋‍👩🏿|👩🏼‍❤️‍💋‍👩🏾|👨🏻‍❤️‍💋‍👨🏼|👨🏻‍❤️‍💋‍👨🏻|🧑🏼‍❤️‍💋‍🧑🏻|🧑🏼‍❤️‍💋‍🧑🏽|🧑🏼‍❤️‍💋‍🧑🏾|🧑🏼‍❤️‍💋‍🧑🏿|🧑🏽‍❤️‍💋‍🧑🏻|🧑🏽‍❤️‍💋‍🧑🏼|🧑🏽‍❤️‍💋‍🧑🏾|🧑🏽‍❤️‍💋‍🧑🏿|🧑🏾‍❤️‍💋‍🧑🏻|🧑🏾‍❤️‍💋‍🧑🏼|🧑🏾‍❤️‍💋‍🧑🏽|🧑🏾‍❤️‍💋‍🧑🏿|🧑🏿‍❤️‍💋‍🧑🏾|🧑🏿‍❤️‍💋‍🧑🏽|🧑🏿‍❤️‍💋‍🧑🏻|🧑🏿‍❤️‍💋‍🧑🏼|👩🏼‍❤️‍💋‍👩🏽|👩🏿‍❤️‍💋‍👩🏾|👩🏿‍❤️‍💋‍👩🏿|🧑🏻‍❤️‍💋‍🧑🏼|🧑🏻‍❤️‍💋‍🧑🏽|🧑🏻‍❤️‍💋‍🧑🏾|🧑🏻‍❤️‍💋‍🧑🏿|👨🏻‍❤️‍💋‍👨🏿|👨🏻‍❤️‍💋‍👨🏾|👨🏻‍❤️‍💋‍👨🏽|👩🏽‍❤️‍👩🏻|👩🏽‍❤️‍👨🏿|👩🏽‍❤️‍👨🏾|👩🏽‍❤️‍👨🏽|👩🏽‍❤️‍👨🏼|👩🏽‍❤️‍👨🏻|🧑🏿‍❤️‍🧑🏾|🚶🏿‍♀️‍➡️|🚶🏾‍♂️‍➡️|🚶🏾‍♀️‍➡️|🏃🏿‍♂️‍➡️|👩🏽‍❤️‍👩🏼|👩🏽‍❤️‍👩🏽|👩🏽‍❤️‍👩🏾|🚶🏿‍♂️‍➡️|🧑🏿‍❤️‍🧑🏽|🧑🏿‍❤️‍🧑🏼|🧑🏿‍❤️‍🧑🏻|🏃🏻‍♂️‍➡️|🏃🏻‍♀️‍➡️|👩🏼‍❤️‍👨🏻|👩🏼‍❤️‍👨🏼|👩🏼‍❤️‍👨🏽|🏃🏼‍♀️‍➡️|🏃🏼‍♂️‍➡️|👩🏼‍❤️‍👨🏾|🏃🏽‍♀️‍➡️|🏃🏽‍♂️‍➡️|🏃🏾‍♀️‍➡️|👩🏼‍❤️‍👨🏿|👩🏼‍❤️‍👩🏻|👩🏼‍❤️‍👩🏼|👩🏼‍❤️‍👩🏽|🏃🏾‍♂️‍➡️|🏃🏿‍♀️‍➡️|👩🏼‍❤️‍👩🏾|👩🏼‍❤️‍👩🏿|🚶🏻‍♀️‍➡️|🚶🏻‍♂️‍➡️|🚶🏼‍♀️‍➡️|🚶🏼‍♂️‍➡️|🚶🏽‍♀️‍➡️|🚶🏽‍♂️‍➡️|👩🏽‍❤️‍👩🏿|👩🏾‍❤️‍👩🏻|👩🏾‍❤️‍👩🏼|👩🏾‍❤️‍👩🏽|👩🏾‍❤️‍👩🏾|👩🏾‍❤️‍👩🏿|🧑🏼‍❤️‍🧑🏿|🧑🏼‍❤️‍🧑🏾|🧑🏼‍❤️‍🧑🏽|🧑🏼‍❤️‍🧑🏻|🧑🏻‍❤️‍🧑🏿|👩🏿‍❤️‍👨🏻|👩🏿‍❤️‍👨🏼|👩🏿‍❤️‍👨🏽|👩🏿‍❤️‍👨🏾|👩🏿‍❤️‍👨🏿|👩🏿‍❤️‍👩🏻|👩🏿‍❤️‍👩🏼|👩🏿‍❤️‍👩🏽|👩🏿‍❤️‍👩🏾|👩🏿‍❤️‍👩🏿|🧑🏻‍❤️‍🧑🏾|🧑🏻‍❤️‍🧑🏽|🧑🏻‍❤️‍🧑🏼|🧑🏾‍❤️‍🧑🏿|🧑🏾‍❤️‍🧑🏽|🧑🏾‍❤️‍🧑🏼|🧑🏾‍❤️‍🧑🏻|🧎🏿‍♂️‍➡️|🧎🏿‍♀️‍➡️|🧎🏾‍♂️‍➡️|🧎🏾‍♀️‍➡️|🧎🏽‍♂️‍➡️|🧎🏽‍♀️‍➡️|🧑🏽‍❤️‍🧑🏿|🧑🏽‍❤️‍🧑🏾|🧑🏽‍❤️‍🧑🏼|🧑🏽‍❤️‍🧑🏻|🧎🏼‍♂️‍➡️|🧎🏼‍♀️‍➡️|🧎🏻‍♂️‍➡️|🧎🏻‍♀️‍➡️|👩🏾‍❤️‍👨🏻|👩🏾‍❤️‍👨🏼|👩🏾‍❤️‍👨🏽|👩🏾‍❤️‍👨🏾|👩🏾‍❤️‍👨🏿|👩🏻‍❤️‍👩🏻|👩🏻‍❤️‍👨🏿|👩🏻‍❤️‍👨🏾|👩🏻‍❤️‍👨🏽|👩🏻‍❤️‍👨🏼|👩🏻‍❤️‍👨🏻|👨🏽‍❤️‍👨🏼|👨🏻‍❤️‍👨🏾|👨🏼‍❤️‍👨🏻|👩‍❤️‍💋‍👩|👩‍❤️‍💋‍👨|👨🏼‍❤️‍👨🏼|👨🏼‍❤️‍👨🏽|👨🏼‍❤️‍👨🏾|👨🏼‍❤️‍👨🏿|👨🏻‍❤️‍👨🏽|👨🏻‍❤️‍👨🏼|👨🏻‍❤️‍👨🏻|👨🏽‍❤️‍👨🏽|👨‍❤️‍💋‍👨|👨🏾‍❤️‍👨🏼|👨🏾‍❤️‍👨🏽|👨🏿‍❤️‍👨🏿|👨🏾‍❤️‍👨🏾|👨🏿‍❤️‍👨🏾|👨🏾‍❤️‍👨🏿|👨🏿‍❤️‍👨🏽|👨🏾‍❤️‍👨🏻|👨🏿‍❤️‍👨🏼|👨🏻‍❤️‍👨🏿|👨🏿‍❤️‍👨🏻|👨🏽‍❤️‍👨🏿|👨🏽‍❤️‍👨🏾|👨🏽‍❤️‍👨🏻|👩🏻‍❤️‍👩🏿|👩🏻‍❤️‍👩🏾|👩🏻‍❤️‍👩🏽|👩🏻‍❤️‍👩🏼|🧑🏼‍🐰‍🧑🏿|👨‍👨‍👧‍👦|🧑🏼‍🐰‍🧑🏾|🧑🏼‍🐰‍🧑🏽|🧑🏼‍🐰‍🧑🏻|🧑🏽‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏻|🧑🏼‍🫯‍🧑🏽|🧑🏼‍🫯‍🧑🏾|🧑🏾‍🤝‍🧑🏻|🧑🏾‍🤝‍🧑🏼|🧑🏾‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏾‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏿|🧑🏽‍🐰‍🧑🏻|🧑🏽‍🐰‍🧑🏼|🧑🏽‍🐰‍🧑🏾|🧑🏽‍🐰‍🧑🏿|👨‍👨‍👦‍👦|🧑🏽‍🫯‍🧑🏻|👨‍👩‍👦‍👦|👨‍👩‍👧‍👦|👨‍👩‍👧‍👧|🧑🏻‍🤝‍🧑🏿|🧑🏻‍🤝‍🧑🏾|🧑🏻‍🤝‍🧑🏽|🧑🏻‍🤝‍🧑🏼|🧑🏻‍🤝‍🧑🏻|👨🏻‍🐰‍👨🏼|👨🏻‍🐰‍👨🏽|👨🏻‍🐰‍👨🏾|👨🏻‍🐰‍👨🏿|👨🏻‍🤝‍👨🏼|👨🏻‍🤝‍👨🏽|👨🏻‍🤝‍👨🏾|🧑‍🧑‍🧒‍🧒|👩🏿‍🫯‍👩🏾|👩🏿‍🫯‍👩🏽|🧑🏽‍🤝‍🧑🏾|🧑🏽‍🤝‍🧑🏽|🧑🏽‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏻|🧑🏻‍🫯‍🧑🏿|🧑🏻‍🫯‍🧑🏾|🧑🏻‍🫯‍🧑🏽|🧑🏻‍🫯‍🧑🏼|👨‍👨‍👧‍👧|🧑🏻‍🐰‍🧑🏿|🧑🏻‍🐰‍🧑🏾|🧑🏻‍🐰‍🧑🏽|🧑🏼‍🤝‍🧑🏿|🧑🏼‍🤝‍🧑🏾|🧑🏼‍🤝‍🧑🏽|🧑🏼‍🤝‍🧑🏼|🧑🏼‍🤝‍🧑🏻|🧑🏻‍🐰‍🧑🏼|🧑🏽‍🦼‍➡️|🧑🏽‍🦯‍➡️|🧑🏼‍🦽‍➡️|🧑🏼‍🦼‍➡️|🧑🏼‍🦯‍➡️|🧑🏻‍🦽‍➡️|🧑🏻‍🦼‍➡️|🧑🏻‍🦯‍➡️|👩🏿‍🦽‍➡️|👩🏿‍🦼‍➡️|👩🏿‍🦯‍➡️|👩🏾‍🦽‍➡️|👩🏾‍🦼‍➡️|👩🏾‍🦯‍➡️|👩🏽‍🦽‍➡️|👩🏽‍🦼‍➡️|👩🏽‍🦯‍➡️|👩🏼‍🦽‍➡️|🧑🏿‍🫯‍🧑🏾|🧑🏿‍🫯‍🧑🏽|🧑🏿‍🫯‍🧑🏼|🧑🏿‍🫯‍🧑🏻|🧑🏿‍🐰‍🧑🏾|🧑🏿‍🐰‍🧑🏽|🧑🏿‍🐰‍🧑🏼|🧑🏿‍🐰‍🧑🏻|🧑🏾‍🫯‍🧑🏿|🏃‍♂️‍➡️|🏃‍♀️‍➡️|🧑🏿‍🦽‍➡️|🧑🏿‍🦼‍➡️|🧑🏿‍🦯‍➡️|🧑🏾‍🦽‍➡️|🧑🏾‍🦼‍➡️|🧑🏾‍🦯‍➡️|🧑🏽‍🦽‍➡️|👩🏼‍🦼‍➡️|👨🏻‍🦼‍➡️|🚶‍♂️‍➡️|👨🏻‍🦯‍➡️|🧑🏾‍🫯‍🧑🏽|🧑🏾‍🫯‍🧑🏼|🧑🏾‍🫯‍🧑🏻|🧑🏿‍🤝‍🧑🏿|🧑🏾‍🐰‍🧑🏿|🧑🏿‍🤝‍🧑🏾|🧑🏾‍🐰‍🧑🏽|🧑🏿‍🤝‍🧑🏽|🧑🏾‍🐰‍🧑🏼|🧑🏿‍🤝‍🧑🏼|🧑🏾‍🐰‍🧑🏻|🧑🏿‍🤝‍🧑🏻|🧑🏽‍🫯‍🧑🏿|🧑🏽‍🫯‍🧑🏾|🧑🏽‍🫯‍🧑🏼|👩🏼‍🦯‍➡️|👩🏻‍🦽‍➡️|👩🏻‍🦼‍➡️|👩🏻‍🦯‍➡️|👨🏿‍🦽‍➡️|👨🏿‍🦼‍➡️|👨🏿‍🦯‍➡️|👨🏾‍🦽‍➡️|👨🏾‍🦼‍➡️|👨🏾‍🦯‍➡️|👨🏽‍🦽‍➡️|👨🏽‍🦼‍➡️|👨🏽‍🦯‍➡️|👨🏼‍🦽‍➡️|👨🏼‍🦼‍➡️|👨🏼‍🦯‍➡️|👨🏻‍🦽‍➡️|🚶‍♀️‍➡️|👩🏿‍🫯‍👩🏼|👨🏾‍🫯‍👨🏻|👨🏾‍🫯‍👨🏼|👨🏾‍🫯‍👨🏽|👨🏾‍🫯‍👨🏿|👨🏿‍🐰‍👨🏻|👨🏿‍🐰‍👨🏼|👨🏿‍🐰‍👨🏽|👨🏿‍🐰‍👨🏾|👨🏿‍🤝‍👨🏻|👨🏿‍🤝‍👨🏼|👨🏿‍🤝‍👨🏽|👨🏿‍🤝‍👨🏾|👨🏿‍🫯‍👨🏻|👩🏼‍🫯‍👩🏿|👩🏼‍🫯‍👩🏾|👩🏼‍🫯‍👩🏽|👩🏼‍🫯‍👩🏻|👨🏾‍🐰‍👨🏻|👩🏽‍🤝‍👩🏻|👨🏾‍🐰‍👨🏼|👩🏽‍🤝‍👨🏿|👨🏾‍🐰‍👨🏽|👩🏽‍🤝‍👨🏾|👨🏾‍🐰‍👨🏿|👩🏽‍🤝‍👨🏼|👨🏾‍🤝‍👨🏻|👩🏽‍🤝‍👨🏻|👨🏾‍🤝‍👨🏼|👩🏽‍🐰‍👩🏿|👩🏽‍🐰‍👩🏾|👩🏽‍🐰‍👩🏼|👩🏽‍🐰‍👩🏻|👨🏾‍🤝‍👨🏽|👨🏾‍🤝‍👨🏿|👩‍👩‍👧‍👧|👩🏻‍🫯‍👩🏿|👩🏻‍🫯‍👩🏾|👩🏻‍🫯‍👩🏽|👩🏻‍🫯‍👩🏼|👩🏻‍🤝‍👩🏿|👩🏻‍🤝‍👩🏾|👩🏻‍🤝‍👩🏽|👩🏻‍🤝‍👩🏼|👩🏻‍🤝‍👨🏿|👩🏻‍🤝‍👨🏾|👩🏻‍🤝‍👨🏽|👩🏻‍🤝‍👨🏼|👩🏻‍🐰‍👩🏿|👩🏻‍🐰‍👩🏾|👩🏻‍🐰‍👩🏽|👩🏻‍🐰‍👩🏼|👩🏼‍🤝‍👩🏿|👩🏼‍🤝‍👩🏾|👩🏼‍🤝‍👩🏽|👩🏼‍🤝‍👩🏻|👩🏼‍🤝‍👨🏿|👩🏼‍🤝‍👨🏾|👩🏼‍🤝‍👨🏽|👩🏼‍🤝‍👨🏻|👩🏼‍🐰‍👩🏿|👩🏼‍🐰‍👩🏾|👩🏼‍🐰‍👩🏽|👩🏼‍🐰‍👩🏻|👨🏿‍🫯‍👨🏼|👨🏿‍🫯‍👨🏽|👨🏿‍🫯‍👨🏾|👩‍👩‍👦‍👦|👨🏼‍🐰‍👨🏻|👨🏼‍🐰‍👨🏽|👨🏼‍🐰‍👨🏾|👨🏼‍🐰‍👨🏿|👨🏼‍🤝‍👨🏻|👨🏼‍🤝‍👨🏽|👨🏼‍🤝‍👨🏾|👨🏼‍🤝‍👨🏿|👨🏼‍🫯‍👨🏻|👨🏼‍🫯‍👨🏽|👩🏾‍🫯‍👩🏿|👩🏾‍🫯‍👩🏽|👩🏾‍🫯‍👩🏼|👩🏾‍🫯‍👩🏻|👩🏾‍🤝‍👩🏿|👩🏾‍🤝‍👩🏽|👩🏾‍🤝‍👩🏼|👩🏾‍🤝‍👩🏻|👩🏿‍🫯‍👩🏻|👩🏿‍🤝‍👩🏾|👩🏿‍🤝‍👩🏽|👩🏿‍🤝‍👩🏼|👩🏿‍🤝‍👩🏻|👩🏿‍🤝‍👨🏾|👩🏿‍🤝‍👨🏽|👩🏿‍🤝‍👨🏼|👩🏿‍🤝‍👨🏻|👩🏿‍🐰‍👩🏾|👩🏿‍🐰‍👩🏽|👩🏿‍🐰‍👩🏼|👩🏿‍🐰‍👩🏻|👨🏻‍🤝‍👨🏿|👨🏻‍🫯‍👨🏼|👨🏻‍🫯‍👨🏽|👨🏻‍🫯‍👨🏾|👨🏻‍🫯‍👨🏿|👩🏾‍🤝‍👨🏿|👨🏽‍🐰‍👨🏿|👨🏽‍🤝‍👨🏻|👨🏽‍🤝‍👨🏼|👨🏽‍🤝‍👨🏾|👨🏽‍🤝‍👨🏿|👨🏽‍🫯‍👨🏻|👨🏽‍🫯‍👨🏼|👨🏽‍🫯‍👨🏾|👨🏽‍🫯‍👨🏿|👩🏽‍🫯‍👩🏿|🧎‍♀️‍➡️|👩🏽‍🫯‍👩🏾|🧎‍♂️‍➡️|👩🏽‍🫯‍👩🏼|👩🏽‍🫯‍👩🏻|👩🏽‍🤝‍👩🏿|👩🏽‍🤝‍👩🏾|👩🏽‍🤝‍👩🏼|👩🏾‍🤝‍👨🏽|👩🏾‍🤝‍👨🏼|👩🏾‍🤝‍👨🏻|👩🏾‍🐰‍👩🏿|👩🏾‍🐰‍👩🏽|👩🏾‍🐰‍👩🏼|👩🏾‍🐰‍👩🏻|👨🏼‍🫯‍👨🏾|👨🏼‍🫯‍👨🏿|👨🏽‍🐰‍👨🏻|👨🏽‍🐰‍👨🏼|👨🏽‍🐰‍👨🏾|👩‍👩‍👧‍👦|👨‍🦽‍➡️|🧑‍🦯‍➡️|👨‍🦼‍➡️|🧑‍🦼‍➡️|👨‍🦯‍➡️|🧑‍🦽‍➡️|👩‍❤️‍👩|👩‍❤️‍👨|👩‍🦯‍➡️|👨‍❤️‍👨|👩‍🦼‍➡️|👩‍🦽‍➡️|🧖🏾‍♀️|🧖🏽‍♂️|🧖🏽‍♀️|🧖🏼‍♂️|🧖🏼‍♀️|🧖🏻‍♂️|🧖🏻‍♀️|👩🏾‍✈️|👩🏾‍⚖️|👩🏾‍⚕️|🧔🏿‍♂️|🧔🏿‍♀️|🧔🏾‍♂️|🚴🏻‍♀️|🧔🏾‍♀️|🧔🏽‍♂️|🧔🏽‍♀️|🧔🏼‍♂️|🧔🏼‍♀️|🧔🏻‍♂️|🧔🏻‍♀️|🧘🏻‍♂️|🧘🏻‍♀️|🧗🏿‍♂️|🧗🏿‍♀️|🧗🏾‍♂️|🧗🏾‍♀️|🧗🏽‍♂️|🧗🏽‍♀️|👩🏿‍✈️|👩🏿‍⚖️|👩🏿‍⚕️|🚣🏾‍♂️|🧗🏼‍♂️|🚣🏿‍♀️|🧗🏼‍♀️|🚣🏿‍♂️|🧗🏻‍♂️|🧗🏻‍♀️|🧖🏿‍♂️|🧖🏿‍♀️|🧖🏾‍♂️|🧎🏽‍♀️|🧎🏼‍♂️|🧎🏼‍♀️|🧎🏻‍♂️|🧎🏻‍♀️|👩🏼‍✈️|👩🏼‍⚖️|👩🏼‍⚕️|🚴🏽‍♀️|🚴🏽‍♂️|🧍🏿‍♂️|🚴🏾‍♀️|🧍🏿‍♀️|🧍🏾‍♂️|🧍🏾‍♀️|🧍🏽‍♂️|🧍🏽‍♀️|🧍🏼‍♂️|🧍🏼‍♀️|🧍🏻‍♂️|🧍🏻‍♀️|🧏🏿‍♂️|🧏🏿‍♀️|🧏🏾‍♂️|🧏🏾‍♀️|🧏🏽‍♂️|🧏🏽‍♀️|👩🏽‍✈️|👩🏽‍⚖️|👩🏽‍⚕️|🚴🏻‍♂️|🧏🏼‍♂️|🚴🏼‍♀️|🧏🏼‍♀️|🚴🏼‍♂️|🧏🏻‍♂️|🧏🏻‍♀️|🧎🏿‍♂️|🧎🏿‍♀️|🧎🏾‍♂️|🧎🏾‍♀️|🧎🏽‍♂️|🧑🏼‍⚕️|👩‍👧‍👧|👩‍👩‍👦|🧜🏻‍♀️|👩‍👩‍👧|🚣🏻‍♀️|🧛🏿‍♂️|🧛🏿‍♀️|🧛🏾‍♂️|🧛🏾‍♀️|🧛🏽‍♂️|🧛🏽‍♀️|🧛🏼‍♂️|🧛🏼‍♀️|🧛🏻‍♂️|🧛🏻‍♀️|🧚🏿‍♂️|🧚🏿‍♀️|🧑🏻‍✈️|🧑🏻‍⚖️|🧑🏻‍⚕️|🙎🏾‍♂️|🧝🏽‍♀️|🙎🏿‍♀️|🧝🏼‍♂️|🙎🏿‍♂️|🧝🏼‍♀️|🧝🏻‍♂️|🧝🏻‍♀️|🧜🏿‍♂️|🧜🏿‍♀️|🧜🏾‍♂️|🧜🏾‍♀️|🧜🏽‍♂️|🧜🏽‍♀️|🧜🏼‍♂️|🧜🏼‍♀️|🧜🏻‍♂️|👩‍👦‍👦|👩‍👧‍👦|🧑🏼‍✈️|🧑🏼‍⚖️|🧎🏿‍➡️|🧎🏾‍➡️|🧎🏽‍➡️|🧎🏼‍➡️|🧎🏻‍➡️|🚶🏿‍➡️|🚶🏾‍➡️|🚶🏽‍➡️|🚶🏼‍➡️|🚶🏻‍➡️|🧘🏿‍♂️|🚣🏽‍♀️|🧘🏿‍♀️|🚣🏽‍♂️|🧘🏾‍♂️|🚣🏾‍♀️|🧘🏾‍♀️|🧘🏽‍♂️|🧘🏽‍♀️|🧘🏼‍♂️|🧘🏼‍♀️|🚣🏻‍♂️|🧚🏾‍♂️|🚣🏼‍♀️|🧚🏾‍♀️|🚣🏼‍♂️|🧚🏽‍♂️|🧚🏽‍♀️|🧚🏼‍♂️|🧚🏼‍♀️|🧚🏻‍♂️|🧚🏻‍♀️|🧙🏿‍♂️|🧙🏿‍♀️|🧙🏾‍♂️|🧙🏾‍♀️|🧙🏽‍♂️|🧙🏽‍♀️|🧙🏼‍♂️|🧙🏼‍♀️|🧙🏻‍♂️|🧙🏻‍♀️|👨🏼‍✈️|👨🏼‍⚖️|👨🏼‍⚕️|🤷🏼‍♀️|🤷🏻‍♂️|🤷🏻‍♀️|🚶🏻‍♀️|🤵🏿‍♂️|🤵🏿‍♀️|🤵🏾‍♂️|🤵🏾‍♀️|🤵🏽‍♂️|🤵🏽‍♀️|🤵🏼‍♂️|🤵🏼‍♀️|🤵🏻‍♂️|🤵🏻‍♀️|🤦🏿‍♂️|🤦🏿‍♀️|👨🏻‍✈️|👨🏻‍⚖️|👨🏽‍✈️|👨🏽‍⚖️|👨🏽‍⚕️|🚵🏾‍♂️|🤸🏾‍♂️|🚵🏿‍♀️|🤸🏾‍♀️|🚵🏿‍♂️|🤸🏽‍♂️|🤸🏽‍♀️|🤸🏼‍♂️|🤸🏼‍♀️|🤸🏻‍♂️|🤸🏻‍♀️|🤷🏿‍♂️|🤷🏿‍♀️|🤷🏾‍♂️|🤷🏾‍♀️|🤷🏽‍♂️|🤷🏽‍♀️|🤷🏼‍♂️|🫱🏻‍🫲🏿|🏃🏿‍➡️|🏃🏾‍➡️|🏃🏽‍➡️|🏃🏼‍➡️|🏃🏻‍➡️|🫱🏼‍🫲🏻|🫱🏿‍🫲🏾|🫱🏿‍🫲🏽|🫱🏿‍🫲🏼|🫱🏿‍🫲🏻|🫱🏾‍🫲🏿|🫱🏾‍🫲🏽|🫱🏾‍🫲🏼|🫱🏾‍🫲🏻|🫱🏽‍🫲🏿|🫱🏽‍🫲🏾|🫱🏽‍🫲🏼|🫱🏽‍🫲🏻|🫱🏼‍🫲🏿|🫱🏼‍🫲🏾|👨🏻‍⚕️|🚶🏻‍♂️|🤦🏾‍♂️|🚶🏼‍♀️|🤦🏾‍♀️|🚶🏼‍♂️|🤦🏽‍♂️|🤦🏽‍♀️|🤦🏼‍♂️|🤦🏼‍♀️|🤦🏻‍♂️|🤦🏻‍♀️|🚶🏿‍♂️|🚶🏿‍♀️|🚶🏾‍♂️|🚶🏾‍♀️|🚶🏽‍♂️|🚶🏽‍♀️|🫱🏻‍🫲🏼|🫱🏻‍🫲🏽|🫱🏻‍🫲🏾|🦸🏽‍♀️|🦸🏼‍♂️|🦸🏼‍♀️|🦸🏻‍♂️|🦸🏻‍♀️|🤾🏿‍♂️|🤾🏿‍♀️|🤾🏾‍♂️|🤾🏾‍♀️|🚵🏻‍♀️|🤾🏽‍♂️|🤾🏽‍♀️|🤾🏼‍♂️|🤾🏼‍♀️|🤾🏻‍♂️|🤾🏻‍♀️|🤽🏿‍♂️|🤽🏿‍♀️|🤽🏾‍♂️|🤽🏾‍♀️|🤽🏽‍♂️|🦹🏿‍♂️|🦹🏿‍♀️|🦹🏾‍♂️|🦹🏾‍♀️|👩🏻‍✈️|👩🏻‍⚖️|👩🏻‍⚕️|🚴🏾‍♂️|🦹🏽‍♂️|🚴🏿‍♀️|🦹🏽‍♀️|🚴🏿‍♂️|🦹🏼‍♂️|🦹🏼‍♀️|🦹🏻‍♂️|🦹🏻‍♀️|🦸🏿‍♂️|🦸🏿‍♀️|🦸🏾‍♂️|🦸🏾‍♀️|🦸🏽‍♂️|👨🏾‍✈️|👨🏾‍⚖️|👨🏾‍⚕️|🚵🏽‍♀️|🧑‍🤝‍🧑|🚵🏽‍♂️|🧑‍🧑‍🧒|🚵🏾‍♀️|🤹🏿‍♂️|🧑‍🧒‍🧒|🤹🏿‍♀️|🤹🏾‍♂️|🤹🏾‍♀️|🤹🏽‍♂️|🤹🏽‍♀️|🤹🏼‍♂️|🤹🏼‍♀️|🤹🏻‍♂️|🤹🏻‍♀️|🤸🏿‍♂️|🤸🏿‍♀️|🤽🏽‍♀️|🤽🏼‍♂️|👨🏿‍✈️|👨🏿‍⚖️|👨🏿‍⚕️|🚵🏻‍♂️|🤽🏼‍♀️|🚵🏼‍♀️|🤽🏻‍♂️|🚵🏼‍♂️|🤽🏻‍♀️|🤼🏿‍♂️|🤼🏿‍♀️|🤼🏾‍♂️|🤼🏾‍♀️|🤼🏽‍♂️|🤼🏽‍♀️|🤼🏼‍♂️|🤼🏼‍♀️|🤼🏻‍♂️|🤼🏻‍♀️|👷🏽‍♀️|👷🏼‍♂️|👷🏼‍♀️|👷🏻‍♂️|👷🏻‍♀️|👳🏿‍♂️|👳🏿‍♀️|👳🏾‍♂️|👳🏾‍♀️|👳🏽‍♂️|👳🏽‍♀️|👳🏼‍♂️|👳🏼‍♀️|👳🏻‍♂️|👳🏻‍♀️|🏳️‍⚧️|👱🏿‍♂️|👱🏿‍♀️|👱🏾‍♂️|👱🏾‍♀️|👱🏽‍♂️|💂🏽‍♀️|💂🏼‍♂️|💂🏼‍♀️|💂🏻‍♂️|💂🏻‍♀️|💁🏿‍♂️|💁🏿‍♀️|💁🏾‍♂️|💁🏾‍♀️|💁🏽‍♂️|💁🏽‍♀️|💁🏼‍♂️|💁🏼‍♀️|💁🏻‍♂️|💁🏻‍♀️|👁️‍🗨️|👷🏿‍♂️|👷🏿‍♀️|👷🏾‍♂️|👷🏾‍♀️|👷🏽‍♂️|👯🏼‍♂️|👯🏼‍♀️|👯🏻‍♂️|👯🏻‍♀️|👮🏿‍♂️|👮🏿‍♀️|👮🏾‍♂️|👮🏾‍♀️|👮🏽‍♂️|👮🏽‍♀️|👮🏼‍♂️|👮🏼‍♀️|👮🏻‍♂️|👮🏻‍♀️|🏌️‍♂️|🏌️‍♀️|🏌🏿‍♂️|🏌🏿‍♀️|🏌🏾‍♂️|🏌🏾‍♀️|🏌🏽‍♂️|👱🏽‍♀️|👱🏼‍♂️|👱🏼‍♀️|👱🏻‍♂️|👱🏻‍♀️|👰🏿‍♂️|👰🏿‍♀️|👰🏾‍♂️|👰🏾‍♀️|👰🏽‍♂️|👰🏽‍♀️|👰🏼‍♂️|👰🏼‍♀️|👰🏻‍♂️|👰🏻‍♀️|👯🏿‍♂️|👯🏿‍♀️|👯🏾‍♂️|👯🏾‍♀️|👯🏽‍♂️|👯🏽‍♀️|👨‍👧‍👦|🙆🏿‍♂️|🙆🏿‍♀️|🙆🏾‍♂️|🙆🏾‍♀️|🙆🏽‍♂️|🙆🏽‍♀️|🙆🏼‍♂️|🙆🏼‍♀️|🙆🏻‍♂️|🙆🏻‍♀️|👨‍👧‍👧|👨‍👨‍👦|🙅🏿‍♂️|🙅🏿‍♀️|🙅🏾‍♂️|🙅🏾‍♀️|🙅🏽‍♂️|🙅🏽‍♀️|🙅🏼‍♂️|🙅🏼‍♀️|🙋🏿‍♂️|🙋🏿‍♀️|🙋🏾‍♂️|🙋🏾‍♀️|🙋🏽‍♂️|🙋🏽‍♀️|🙋🏼‍♂️|🙋🏼‍♀️|🙋🏻‍♂️|🙋🏻‍♀️|🙇🏿‍♂️|🙇🏿‍♀️|🙇🏾‍♂️|🙇🏾‍♀️|🙇🏽‍♂️|🙇🏽‍♀️|🙇🏼‍♂️|🙇🏼‍♀️|🙇🏻‍♂️|🙇🏻‍♀️|👨‍👦‍👦|💇🏼‍♂️|💇🏼‍♀️|💇🏻‍♂️|💇🏻‍♀️|💆🏿‍♂️|💆🏿‍♀️|💆🏾‍♂️|💆🏾‍♀️|💆🏽‍♂️|💆🏽‍♀️|💆🏼‍♂️|💆🏼‍♀️|💆🏻‍♂️|💆🏻‍♀️|👨‍👩‍👦|👨‍👩‍👧|💂🏿‍♂️|💂🏿‍♀️|💂🏾‍♂️|💂🏾‍♀️|💂🏽‍♂️|🙅🏻‍♂️|🙅🏻‍♀️|👨‍👨‍👧|🕵️‍♂️|🕵️‍♀️|🕵🏿‍♂️|🕵🏿‍♀️|🕵🏾‍♂️|🕵🏾‍♀️|🕵🏽‍♂️|🕵🏽‍♀️|🕵🏼‍♂️|🕵🏼‍♀️|🕵🏻‍♂️|🕵🏻‍♀️|💇🏿‍♂️|💇🏿‍♀️|💇🏾‍♂️|💇🏾‍♀️|💇🏽‍♂️|💇🏽‍♀️|🏌🏽‍♀️|⛹🏾‍♀️|⛹🏾‍♂️|⛹🏿‍♀️|⛹🏿‍♂️|⛹️‍♀️|⛹️‍♂️|🙍🏿‍♂️|🙍🏿‍♀️|🏃🏻‍♀️|🙍🏾‍♂️|🏃🏻‍♂️|🙍🏾‍♀️|🏃🏼‍♀️|🙍🏽‍♂️|🏃🏼‍♂️|🙍🏽‍♀️|🏃🏽‍♀️|🙍🏼‍♂️|🏃🏽‍♂️|🙍🏼‍♀️|🏃🏾‍♀️|🙍🏻‍♂️|🏃🏾‍♂️|🙍🏻‍♀️|🏃🏿‍♀️|🏃🏿‍♂️|🏄🏻‍♀️|🏄🏻‍♂️|🫱🏼‍🫲🏽|🧑🏽‍⚕️|🧑🏽‍⚖️|🧑🏽‍✈️|🧝🏽‍♂️|🧝🏾‍♀️|🧝🏾‍♂️|🧝🏿‍♀️|🧝🏿‍♂️|🙎🏾‍♀️|🙎🏽‍♂️|🙎🏽‍♀️|🧑🏾‍⚕️|🧑🏾‍⚖️|🧑🏾‍✈️|🙎🏼‍♂️|🙎🏼‍♀️|🙎🏻‍♂️|🧑🏿‍⚕️|🧑🏿‍⚖️|🧑🏿‍✈️|🙎🏻‍♀️|⛹🏻‍♀️|⛹🏻‍♂️|⛹🏼‍♀️|⛹🏼‍♂️|⛹🏽‍♀️|⛹🏽‍♂️|🏊🏻‍♀️|🏊🏻‍♂️|🏊🏼‍♀️|🏊🏼‍♂️|🏊🏽‍♀️|🏊🏽‍♂️|🏊🏾‍♀️|🏊🏾‍♂️|🏊🏿‍♀️|🏊🏿‍♂️|🏋🏻‍♀️|🏋🏻‍♂️|🏋🏼‍♀️|🏋🏼‍♂️|🏋🏽‍♀️|🏋🏽‍♂️|🏋🏾‍♀️|🏋🏾‍♂️|🏋🏿‍♀️|🏋🏿‍♂️|🏋️‍♀️|🏋️‍♂️|🏌🏻‍♀️|🏌🏻‍♂️|🏌🏼‍♀️|🏌🏼‍♂️|🏄🏿‍♀️|🏄🏾‍♂️|🏄🏾‍♀️|🏄🏽‍♂️|🏄🏽‍♀️|🏄🏿‍♂️|🏄🏼‍♂️|🏄🏼‍♀️|🤾‍♂️|👨🏽‍🦱|👨🏽‍🦲|👨🏽‍🦳|🧜‍♀️|👨🏾‍🦰|👨🏾‍🦱|👨🏾‍🦲|👨🏾‍🦳|👨🏿‍🦰|👨🏿‍🦱|🧜‍♂️|🤦‍♂️|🤷‍♀️|👩🏼‍🦲|🧑🏽‍🦱|👩🏼‍🦱|🤾‍♀️|👩🏼‍🦰|👩🏻‍🦳|👩🏻‍🦲|👩🏻‍🦱|👩🏻‍🦰|👨🏿‍🦳|🤵‍♂️|🤵‍♀️|🧑🏽‍🩰|👨🏿‍🦲|🧛‍♀️|🧛‍♂️|🧖‍♂️|🧎‍♂️|🧖‍♀️|🧑🏾‍🦰|🧑🏽‍🦳|🧑🏽‍🦲|🧝‍♂️|🧝‍♀️|🧑🏿‍🩰|🧑🏾‍🩰|🧎‍♀️|🧞‍♀️|🧞‍♂️|🧟‍♀️|🧟‍♂️|👨🏻‍🦰|👨🏻‍🦱|👨🏻‍🦲|👨🏻‍🦳|👨🏼‍🦰|👨🏼‍🦱|👨🏼‍🦲|🧏‍♀️|👨🏼‍🦳|🧑🏾‍🦳|👨🏽‍🦰|🧑🏿‍🦰|🧏‍♂️|❤️‍🩹|🤦‍♀️|🧑🏼‍🦰|🧑🏼‍🦱|🤹‍♀️|🤹‍♂️|🧑🏼‍🦲|🧍‍♀️|🧑🏿‍🦱|🧑🏿‍🦲|🧗‍♀️|🧗‍♂️|🙂‍↕️|🙂‍↔️|🏴‍☠️|🧔‍♀️|🧑🏼‍🦳|🧘‍♂️|🧘‍♀️|🧔‍♂️|🤼‍♀️|🤼‍♂️|😶‍🌫️|🧑🏽‍🦰|🐻‍❄️|🧑🏿‍🦳|⛓️‍💥|🦹‍♂️|🦹‍♀️|🧑🏾‍🦱|🧑🏾‍🦲|🤽‍♀️|🤽‍♂️|🏳️‍🌈|🤷‍♂️|🦸‍♀️|🦸‍♂️|❤️‍🔥|👩🏼‍🦳|🧚‍♂️|🧚‍♀️|👩🏽‍🦰|👩🏽‍🦱|👩🏽‍🦲|👩🏽‍🦳|👩🏾‍🦰|👩🏾‍🦱|🧑🏼‍🩰|🤸‍♀️|🤸‍♂️|🧑🏻‍🩰|👩🏾‍🦲|👩🏾‍🦳|👩🏿‍🦰|👩🏿‍🦱|🧙‍♂️|👩🏿‍🦲|👩🏿‍🦳|🧑🏻‍🦰|🧑🏻‍🦱|🧑🏻‍🦲|🧙‍♀️|🧍‍♂️|🧑🏻‍🦳|🚣‍♀️|🧑🏻‍🦽|🚣‍♂️|🧑🏻‍🦼|🧑🏻‍🦯|🧑🏻‍🚒|🧑🏻‍🚀|🧑🏻‍🔬|🧑🏻‍🔧|🧑🏻‍💼|🧑🏻‍💻|🧑🏻‍🏭|🧑🏻‍🏫|🧑🏻‍🎨|🧑🏻‍🎤|🧑🏻‍🎓|🧑🏻‍🎄|🧑🏻‍🍼|🧑🏻‍🍳|🧑🏻‍🌾|🧑‍✈️|🧑‍⚖️|🧑🏽‍🎄|🧑🏽‍🍼|🧑🏽‍🍳|🧑🏽‍🌾|🧑🏼‍🦽|🧑🏼‍🦼|🧑🏼‍🦯|🧑🏼‍🚒|🧑🏼‍🚀|🧑🏼‍🔬|🧑🏼‍🔧|🧑🏼‍💼|🧑🏼‍💻|🧑🏼‍🏭|🧑🏼‍🏫|🧑🏼‍🎨|🧑🏼‍🎤|🧑🏼‍🎓|🧑🏼‍🎄|🧑🏼‍🍼|🧑🏼‍🍳|🧑🏼‍🌾|👩🏾‍🦯|👩🏾‍🚒|👩🏾‍🚀|👩🏾‍🔬|👩🏾‍🔧|👩🏾‍💼|👩🏾‍💻|👩🏾‍🏭|👩🏾‍🏫|👩🏾‍🎨|👩🏾‍🎤|👩🏾‍🎓|👩🏾‍🍼|👩🏾‍🍳|👩🏾‍🌾|🚴‍♀️|👩🏽‍🦽|🚴‍♂️|👩🏽‍🦼|👩🏽‍🦯|👩🏽‍🚒|👩🏽‍🚀|🧑‍⚕️|🧎‍➡️|🚶‍➡️|👩🏿‍🦽|👩🏿‍🦼|👩🏿‍🦯|👩🏿‍🚒|👩🏿‍🚀|👩🏿‍🔬|👩🏿‍🔧|👩🏿‍💼|👩🏿‍💻|👩🏿‍🏭|👩🏿‍🏫|👩🏿‍🎨|👩🏿‍🎤|👩🏿‍🎓|👩🏿‍🍼|👩🏿‍🍳|👩🏿‍🌾|👩🏾‍🦽|👩🏾‍🦼|👰‍♂️|👰‍♀️|👯‍♂️|👯‍♀️|👮‍♂️|👮‍♀️|🏊‍♂️|🏊‍♀️|🏄‍♂️|🏄‍♀️|🙍‍♀️|🙍‍♂️|🏃‍♂️|🏃‍♀️|🙎‍♀️|🧑🏿‍🦽|🙎‍♂️|🧑🏿‍🦼|🧑🏿‍🦯|🧑🏿‍🚒|🧑🏿‍🚀|🧑🏿‍🔬|🙋‍♂️|🙋‍♀️|🙇‍♂️|🙇‍♀️|🙆‍♂️|🙆‍♀️|🙅‍♂️|🙅‍♀️|💇‍♂️|💇‍♀️|💆‍♂️|💆‍♀️|💂‍♂️|💂‍♀️|💁‍♂️|💁‍♀️|👷‍♂️|👷‍♀️|👳‍♂️|👳‍♀️|👱‍♂️|👱‍♀️|🧑🏾‍🏫|🧑🏾‍🎨|🧑🏾‍🎤|🧑🏾‍🎓|🧑🏾‍🎄|🧑🏾‍🍼|🧑🏾‍🍳|🧑🏾‍🌾|🧑🏽‍🦽|🧑🏽‍🦼|🧑🏽‍🦯|🧑🏽‍🚒|🧑🏽‍🚀|🧑🏽‍🔬|🧑🏽‍🔧|🧑🏽‍💼|🧑🏽‍💻|🧑🏽‍🏭|🧑🏽‍🏫|🧑🏽‍🎨|🧑🏽‍🎤|🧑🏽‍🎓|🧑🏿‍🔧|🧑🏿‍💼|🧑🏿‍💻|🧑🏿‍🏭|🧑🏿‍🏫|🧑🏿‍🎨|🧑🏿‍🎤|🧑🏿‍🎓|🧑🏿‍🎄|🧑🏿‍🍼|🧑🏿‍🍳|🧑🏿‍🌾|🧑🏾‍🦽|🧑🏾‍🦼|🧑🏾‍🦯|🧑🏾‍🚒|🧑🏾‍🚀|🧑🏾‍🔬|🧑🏾‍🔧|🧑🏾‍💼|🧑🏾‍💻|🧑🏾‍🏭|👨🏾‍🔧|👨🏾‍💼|👨🏾‍💻|👨🏾‍🏭|👨🏾‍🏫|👨🏾‍🎨|👨🏾‍🎤|👨🏾‍🎓|👨🏾‍🍼|👨🏾‍🍳|👨🏾‍🌾|👨🏽‍🦽|👨🏽‍🦼|👨🏽‍🦯|👨🏽‍🚒|👨🏽‍🚀|👨🏽‍🔬|👨🏽‍🔧|👨🏽‍💼|👨🏽‍💻|👨🏽‍🏭|👨🏽‍🏫|👨🏿‍🦼|👨🏿‍🦯|👨🏿‍🚒|👨🏿‍🚀|👨🏿‍🔬|👨🏿‍🔧|👨🏿‍💼|👨🏿‍💻|👨🏿‍🏭|👨🏿‍🏫|👨🏿‍🎨|👨🏿‍🎤|👨🏿‍🎓|👨🏿‍🍼|👨🏿‍🍳|👨🏿‍🌾|👨🏾‍🦽|👨🏾‍🦼|👨🏾‍🦯|👨🏾‍🚒|👨🏾‍🚀|👨🏾‍🔬|👨🏽‍🎨|🚶‍♀️|👨🏻‍🦽|🚶‍♂️|👨🏻‍🦼|👨🏻‍🦯|👨🏻‍🚒|👨🏻‍🚀|👨🏻‍🔬|👨🏻‍🔧|👨🏻‍💼|👨🏻‍💻|👨🏻‍🏭|👨🏻‍🏫|👨🏻‍🎨|👨🏻‍🎤|👨🏻‍🎓|👨🏻‍🍼|👨🏻‍🍳|👨🏻‍🌾|👨‍✈️|👨‍⚖️|👨‍⚕️|👨🏽‍🎤|👨🏽‍🎓|👨🏽‍🍼|👨🏽‍🍳|👨🏽‍🌾|👨🏼‍🦽|👨🏼‍🦼|👨🏼‍🦯|👨🏼‍🚒|👨🏼‍🚀|👨🏼‍🔬|👨🏼‍🔧|👨🏼‍💼|👨🏼‍💻|👨🏼‍🏭|👨🏼‍🏫|👨🏼‍🎨|👨🏼‍🎤|👨🏼‍🎓|👨🏼‍🍼|👨🏼‍🍳|👨🏼‍🌾|👩🏼‍🎨|👩🏼‍🎤|👩🏼‍🎓|👩🏼‍🍼|👩🏼‍🍳|👩🏼‍🌾|👩🏻‍🦽|👩🏻‍🦼|👩🏻‍🦯|👩🏻‍🚒|👩🏻‍🚀|👩🏻‍🔬|👩🏻‍🔧|👩🏻‍💼|👩🏻‍💻|👩🏻‍🏭|👩🏻‍🏫|👩🏻‍🎨|👩🏻‍🎤|👩🏻‍🎓|👩🏻‍🍼|👩🏻‍🍳|👩🏻‍🌾|👩🏽‍🔬|👩🏽‍🔧|👩🏽‍💼|👩🏽‍💻|👩🏽‍🏭|👩🏽‍🏫|👩🏽‍🎨|👩🏽‍🎤|👩🏽‍🎓|👩🏽‍🍼|👩🏽‍🍳|👩🏽‍🌾|👩🏼‍🦽|👩🏼‍🦼|👩🏼‍🦯|👩🏼‍🚒|👩🏼‍🚀|👩🏼‍🔬|👩🏼‍🔧|👩🏼‍💼|👩🏼‍💻|👩🏼‍🏭|👩🏼‍🏫|👨🏿‍🦽|🚵‍♀️|👩‍⚕️|👩‍⚖️|👩‍✈️|🚵‍♂️|🏃‍➡️|🐦‍🔥|🐦‍⬛|🐕‍🦺|🐈‍⬛|👨‍🚒|👨‍🦯|👨‍🦼|🍋‍🟩|🍄‍🟫|👨‍🦽|👩‍🎨|👩‍🎤|👩‍🎓|👩‍🌾|👩‍🍳|👩‍👦|👨‍👦|👨‍👧|👩‍👧|👨‍🌾|👨‍🍳|👨‍🍼|👨‍🎓|👨‍🎤|👨‍🎨|👨‍🏫|🧑‍🩰|👨‍🏭|👨‍💻|👨‍💼|👨‍🔧|😵‍💫|😮‍💨|👨‍🔬|👨‍🚀|🧑‍🦯|🧑‍🚒|🧑‍🚀|🧑‍🔬|🧑‍🔧|🧑‍💼|🧑‍💻|🧑‍🏭|🧑‍🏫|🧑‍🧒|🧑‍🎨|🧑‍🎤|🧑‍🎓|🧑‍🎄|🧑‍🍼|👩‍🦳|👩‍🦲|👩‍🦱|👩‍🦰|👩‍🦽|🧑‍🌾|👩‍🍼|👩‍🏫|👩‍🏭|👩‍💻|👩‍💼|👩‍🔧|👩‍🔬|👩‍🚀|👩‍🚒|👩‍🦯|👩‍🦼|👨‍🦰|🧑‍🦳|🧑‍🦲|🧑‍🦱|🧑‍🦰|👨‍🦱|👨‍🦲|👨‍🦳|🧑‍🦽|🧑‍🦼|🧑‍🍳)|(?:🏴󠁧󠁢󠁷󠁬󠁳󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁥󠁮󠁧󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?))|[🏻-🏿🦰-🦳]|(?:(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳](?!(?:[🏻-🏿]|️))︎?|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]︎)|[\#\*0-9]⃣))/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_picto.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_picto.rb new file mode 100644 index 000000000..3ab10a73d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_picto.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PICTO = /[©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🀬-🀯🂔-🂟🂯🂰🃀🃏🃐🃶-🃿🅰🅱🅾🅿🆎🆑-🆚🆮-🇥🈁-🈏🈚🈯🈲-🈺🈼-🈿🉉-🉟🉦-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-🏺🐀-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛥🛩🛫-🛰🛳-🛿🟚-🟿🠌-🠏🡈-🡏🡚-🡟🢈-🢏🢮🢯🢼-🢿🣂-🣏🣙-🣿🤌-🤺🤼-🥅🥇-🧿🩘-🩟🩮-🫿🰀-🿽]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_picto_no_emoji.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_picto_no_emoji.rb new file mode 100644 index 000000000..da87dc060 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_picto_no_emoji.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PICTO_NO_EMOJI = /[🀬-🀯🂔-🂟🂯🂰🃀🃐🃶-🃿🆮-🇥🈃-🈏🈼-🈿🉉-🉏🉒-🉟🉦-🋿🛙-🛛🛭-🛯🛽-🛿🟚-🟟🟬-🟯🟱-🟿🠌-🠏🡈-🡏🡚-🡟🢈-🢏🢮🢯🢼-🢿🣂-🣏🣙-🣿🩘-🩟🩮🩯🩽-🩿🪋-🪍🫇🫉-🫌🫝🫞🫫-🫮🫹-🫿🰀-🿽]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_possible.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_possible.rb new file mode 100644 index 000000000..1ee614bcc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_possible.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_POSSIBLE = /(?:\p{RI}{2}|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?:[🏻-🏿]|️⃣?|[󠀠-󠁾]+󠁿)?)(?:‍(?:\p{RI}{2}|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?:[🏻-🏿]|️⃣?|[󠀠-󠁾]+󠁿)?))*/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_component.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_component.rb new file mode 100644 index 000000000..cc9687776 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_component.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_COMPONENT = /[\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_emoji.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_emoji.rb new file mode 100644 index 000000000..c8af84190 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_emoji.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_EMOJI = /[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_modifier.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_modifier.rb new file mode 100644 index 000000000..358f7ae57 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_modifier.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_MODIFIER = /[🏻-🏿]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_modifier_base.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_modifier_base.rb new file mode 100644 index 000000000..c6c8f5b0f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_modifier_base.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_MODIFIER_BASE = /[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_presentation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_presentation.rb new file mode 100644 index 000000000..3875890d7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_prop_presentation.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_PRESENTATION = /[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_text.rb new file mode 100644 index 000000000..f47c7edc4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_text.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_TEXT = /(?:(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳](?!(?:[🏻-🏿]|️))︎?|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]︎)|[\#\*0-9]⃣)/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_text_presentation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_text_presentation.rb new file mode 100644 index 000000000..94255392f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_text_presentation.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_TEXT_PRESENTATION = /[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_valid.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_valid.rb new file mode 100644 index 000000000..6d5963292 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_valid.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_VALID = /(?:(?:(?:(?:[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸])‍)+(?:[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]))|(?:🏴(?:󠁬󠁶󠀰󠀴[󠀸-󠀹]|󠁬󠁶󠀰󠀴[󠀳-󠀶]|󠁬󠁶󠀰󠀳[󠀴-󠀹]|󠁬󠁶󠀰󠀳[󠀰-󠀲]|󠁬󠁶󠀰󠀲[󠀷-󠀹]|󠁬󠁶󠀰󠀲[󠀳-󠀵]|󠁬󠁶󠀰󠀲[󠀰-󠀱]|󠁬󠁶󠀰󠀱[󠀷-󠀹]|󠁬󠁶󠀰󠀱[󠀲-󠀴]|󠁣󠁺󠀵󠀲[󠀱-󠀵]|󠁬󠁶󠀰󠀰[󠀸-󠀹]|󠁬󠁶󠀰󠀰[󠀳-󠀶]|󠁭󠁮󠀰󠀴[󠀶-󠀷]|󠁧󠁢󠁥󠁮[󠁦-󠁧]|󠁣󠁺󠀵󠀳[󠀱-󠀴]|󠁣󠁺󠀶󠀳[󠀱-󠀵]|󠁰󠁥󠁬󠁡[󠁬-󠁭]|󠁣󠁺󠀶󠀴[󠀱-󠀷]|󠁰󠁨󠁰󠁡[󠁭-󠁮]|󠁣󠁺󠀷󠀱[󠀱-󠀵]|󠁦󠁲󠀹󠀷[󠀱-󠀴]|󠁭󠁡󠁢󠁥[󠁲-󠁳]|󠁣󠁺󠀱󠀲[󠀰-󠀲]|󠁣󠁺󠀶󠀱[󠀱-󠀵]|󠁣󠁺󠀶󠀲[󠀱-󠀷]|󠁣󠁺󠀳󠀲[󠀱-󠀷]|󠁥󠁥󠀷󠀹[󠀲-󠀳]|󠁣󠁺󠀴󠀱[󠀱-󠀳]|󠁧󠁢󠁨󠁡[󠁬-󠁭]|󠁣󠁺󠀴󠀲[󠀱-󠀷]|󠁬󠁶󠀱󠀰[󠀷-󠀹]|󠁬󠁶󠀱󠀰[󠀳-󠀵]|󠁬󠁶󠀰󠀹[󠀵-󠀶]|󠁬󠁶󠀰󠀹[󠀲-󠀳]|󠁬󠁶󠀰󠀸[󠀱-󠀶]|󠁬󠁶󠀰󠀷[󠀸-󠀹]|󠁬󠁶󠀰󠀷[󠀴-󠀶]|󠁬󠁶󠀰󠀷[󠀰-󠀲]|󠁣󠁺󠀵󠀱[󠀱-󠀴]|󠁬󠁶󠀰󠀶[󠀳-󠀶]|󠁬󠁶󠀰󠀶[󠀰-󠀱]|󠁵󠁧󠀱󠀱[󠀰-󠀹]|󠁵󠁧󠀱󠀲[󠀰-󠀶]|󠁵󠁧󠀲󠀰[󠀱-󠀹]|󠁵󠁧󠀲󠀱[󠀰-󠀹]|󠁧󠁢󠁳󠁴[󠁳-󠁴]|󠁵󠁧󠀲󠀲[󠀰-󠀹]|󠁧󠁢󠁳󠁴[󠁧-󠁨]|󠁵󠁧󠀲󠀳[󠀰-󠀷]|󠁵󠁧󠀳󠀰[󠀱-󠀹]|󠁵󠁧󠀳󠀱[󠀰-󠀹]|󠁵󠁧󠀳󠀲[󠀰-󠀹]|󠁵󠁧󠀳󠀳[󠀰-󠀷]|󠁵󠁧󠀴󠀰[󠀱-󠀹]|󠁵󠁧󠀴󠀱[󠀰-󠀹]|󠁵󠁧󠀴󠀲[󠀰-󠀹]|󠁵󠁧󠀴󠀳[󠀰-󠀵]|󠁧󠁢󠁳󠁯[󠁬-󠁭]|󠁰󠁳󠁪󠁥[󠁭-󠁮]|󠁧󠁢󠁢󠁤[󠁦-󠁧]|󠁧󠁢󠁳󠁬[󠁦-󠁧]|󠁧󠁢󠁢󠁲[󠁣-󠁤]|󠁡󠁺󠁳󠁡[󠁫-󠁬]|󠁭󠁮󠀰󠀶[󠀳-󠀵]|󠁬󠁶󠀱󠀱[󠀱-󠀳]|󠁬󠁶󠀱󠀰[󠀱-󠀲]|󠁣󠁺󠀷󠀲[󠀱-󠀴]|󠁧󠁢󠁤󠁮[󠁣-󠁤]|󠁣󠁺󠀸󠀰[󠀱-󠀶]|󠁬󠁶󠀰󠀸[󠀷-󠀹]|󠁮󠁬󠁢󠁱[󠀱-󠀳]|󠁥󠁥󠀴󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀶[󠀷-󠀸]|󠁬󠁶󠀰󠀵[󠀸-󠀹]|󠁩󠁳󠁳󠁫[󠁦-󠁧]|󠁥󠁥󠀴󠀳[󠀰-󠀲]|󠁥󠁥󠀱󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀱[󠀵-󠀶]|󠁰󠁷󠀲󠀲[󠀶-󠀸]|󠁥󠁥󠀲󠀸[󠀳-󠀴]|󠁧󠁢󠁡󠁢[󠁣-󠁥]|󠁵󠁧󠀱󠀰[󠀱-󠀹]|󠁭󠁫󠀶󠀰[󠀱-󠀹]|󠁭󠁫󠀷󠀰[󠀱-󠀶]|󠁭󠁫󠀸󠀰[󠀱-󠀹]|󠁭󠁫󠀸󠀱[󠀰-󠀷]|󠁭󠁡󠁫󠁨[󠁮-󠁯]|󠁳󠁩󠀲󠀱[󠀰-󠀳]|󠁳󠁩󠀲󠀰[󠀰-󠀹]|󠁳󠁩󠀱󠀹[󠀰-󠀹]|󠁳󠁩󠀱󠀸[󠀰-󠀹]|󠁳󠁩󠀱󠀷[󠀰-󠀹]|󠁳󠁩󠀱󠀶[󠀰-󠀹]|󠁳󠁩󠀱󠀵[󠀰-󠀹]|󠁢󠁦󠁫󠁯[󠁳-󠁴]|󠁳󠁩󠀱󠀴[󠀶-󠀹]|󠁳󠁩󠀱󠀴[󠀰-󠀴]|󠁭󠁡󠁧󠁵[󠁥-󠁦]|󠁭󠁨󠁡󠁬[󠁫-󠁬]|󠁡󠁦󠁢󠁡[󠁬-󠁭]|󠁡󠁺󠁺󠁡[󠁱-󠁲]|󠁢󠁦󠁢󠁡[󠁬-󠁮]|󠁭󠁫󠀱󠀰[󠀱-󠀹]|󠁭󠁫󠀲󠀰[󠀱-󠀹]|󠁭󠁡󠁳󠁩[󠁫-󠁬]|󠁭󠁫󠀲󠀱[󠀰-󠀱]|󠁭󠁫󠀳󠀰[󠀳-󠀴]|󠁭󠁫󠀳󠀰[󠀷-󠀸]|󠁭󠁫󠀳󠀱[󠀰-󠀳]|󠁣󠁺󠀲󠀰[󠀱-󠀹]|󠁣󠁺󠀲󠀰[󠁡-󠁣]|󠁭󠁫󠀴󠀰[󠀱-󠀹]|󠁣󠁺󠀳󠀱[󠀱-󠀷]|󠁭󠁫󠀵󠀰[󠀱-󠀹]|󠁳󠁩󠀱󠀳[󠀰-󠀹]|󠁳󠁩󠀰󠀸[󠀰-󠀹]|󠁳󠁩󠀰󠀹[󠀰-󠀹]|󠁳󠁩󠀱󠀰[󠀰-󠀹]|󠁳󠁩󠀰󠀱[󠀰-󠀹]|󠁳󠁩󠀰󠀷[󠀰-󠀹]|󠁳󠁩󠀰󠀲[󠀰-󠀹]|󠁰󠁧󠁭󠁰[󠁬-󠁭]|󠁳󠁩󠀱󠀱[󠀰-󠀹]|󠁳󠁩󠀱󠀲[󠀰-󠀹]|󠁳󠁩󠀰󠀳[󠀰-󠀹]|󠁳󠁩󠀰󠀶[󠀰-󠀹]|󠁰󠁨󠁣󠁡[󠁳-󠁴]|󠁳󠁩󠀰󠀴[󠀰-󠀹]|󠁣󠁺󠀱󠀰[󠁡-󠁦]|󠁰󠁨󠁣󠁡[󠁭-󠁮]|󠁣󠁺󠀱󠀰[󠀱-󠀹]|󠁰󠁨󠁢󠁵[󠁫-󠁬]|󠁳󠁩󠀰󠀵[󠀰-󠀹]|󠁣󠁺󠀱󠀱[󠀰-󠀹]|󠁡󠁯󠁣󠁮[󠁮-󠁯]|󠁳󠁩󠀰󠀰[󠀱-󠀹]|󠁣󠁶󠁳[󠁬-󠁭]|󠁬󠁩󠀱[󠀰-󠀱]|󠁢󠁦󠀰[󠀱-󠀹]|󠁺󠁷󠁭[󠁶-󠁷]|󠁢󠁲󠁡[󠁬-󠁭]|󠁬󠁫󠀱[󠀱-󠀳]|󠁬󠁫󠀲[󠀱-󠀳]|󠁢󠁦󠀱[󠀰-󠀳]|󠁬󠁫󠀳[󠀱-󠀳]|󠁬󠁫󠀴[󠀱-󠀵]|󠁢󠁲󠁭[󠁳-󠁴]|󠁫󠁨󠀱[󠀰-󠀹]|󠁫󠁲󠀳[󠀰-󠀱]|󠁺󠁭󠀰[󠀱-󠀹]|󠁵󠁳󠁭[󠁤-󠁥]|󠁵󠁳󠁭[󠁮-󠁯]|󠁵󠁳󠁭[󠁳-󠁴]|󠁵󠁳󠁮[󠁣-󠁥]|󠁬󠁫󠀹[󠀱-󠀲]|󠁬󠁫󠀸[󠀱-󠀲]|󠁬󠁫󠀷[󠀱-󠀲]|󠁵󠁳󠁳[󠁣-󠁤]|󠁪󠁰󠀰[󠀱-󠀹]|󠁡󠁬󠁫[󠁡-󠁣]|󠁪󠁰󠀱[󠀰-󠀹]|󠁪󠁰󠀲[󠀰-󠀹]|󠁢󠁲󠁲[󠁲-󠁳]|󠁢󠁲󠁲[󠁮-󠁯]|󠁬󠁫󠀶[󠀱-󠀲]|󠁬󠁫󠀵[󠀱-󠀳]|󠁢󠁲󠁰[󠁡-󠁢]|󠁪󠁰󠀳[󠀰-󠀹]|󠁪󠁰󠀴[󠀰-󠀷]|󠁫󠁥󠀰[󠀱-󠀹]|󠁫󠁥󠀱[󠀰-󠀹]|󠁫󠁥󠀲[󠀰-󠀹]|󠁫󠁥󠀳[󠀰-󠀹]|󠁫󠁥󠀴[󠀰-󠀷]|󠁫󠁲󠀴[󠀱-󠀹]|󠁮󠁧󠁫[󠁤-󠁥]|󠁲󠁳󠀰[󠀰-󠀹]|󠁶󠁮󠀴[󠀳-󠀷]|󠁲󠁵󠁫[󠁫-󠁬]|󠁶󠁮󠀵[󠀰-󠀹]|󠁶󠁮󠀶[󠀶-󠀹]|󠁶󠁮󠀷[󠀰-󠀳]|󠁬󠁡󠁢[󠁫-󠁬]|󠁲󠁵󠁫[󠁢-󠁣]|󠁫󠁺󠀶[󠀱-󠀳]|󠁢󠁩󠁢[󠁬-󠁭]|󠁢󠁧󠀱[󠀰-󠀹]|󠁢󠁧󠀲[󠀰-󠀸]|󠁢󠁨󠀱[󠀳-󠀵]|󠁫󠁲󠀲[󠀶-󠀹]|󠁫󠁰󠀱[󠀳-󠀵]|󠁣󠁵󠀰[󠀳-󠀹]|󠁫󠁮󠀰[󠀱-󠀹]|󠁫󠁮󠀱[󠀰-󠀳]|󠁲󠁳󠀱[󠀰-󠀹]|󠁲󠁳󠀲[󠀰-󠀹]|󠁫󠁰󠀰[󠀱-󠀹]|󠁬󠁩󠀰[󠀱-󠀹]|󠁵󠁹󠁲[󠁮-󠁯]|󠁬󠁣󠀱[󠀰-󠀲]|󠁬󠁣󠀰[󠀵-󠀸]|󠁬󠁣󠀰[󠀱-󠀳]|󠁬󠁢󠁢[󠁨-󠁩]|󠁭󠁹󠀰[󠀱-󠀹]|󠁭󠁹󠀱[󠀰-󠀶]|󠁢󠁪󠁡[󠁫-󠁬]|󠁶󠁣󠀰[󠀱-󠀶]|󠁫󠁺󠀱[󠀰-󠀱]|󠁮󠁧󠁫[󠁮-󠁯]|󠁶󠁮󠀰[󠀱-󠀷]|󠁶󠁮󠀱[󠀳-󠀴]|󠁶󠁮󠀲[󠀰-󠀹]|󠁫󠁨󠀲[󠀰-󠀵]|󠁣󠁵󠀱[󠀰-󠀶]|󠁶󠁮󠀳[󠀰-󠀷]|󠁮󠁡󠁯[󠁳-󠁴]|󠁢󠁧󠀰[󠀱-󠀹]|󠁶󠁮󠀴[󠀰-󠀱]|󠁴󠁨󠀲[󠀰-󠀷]|󠁴󠁨󠀳[󠀰-󠀹]|󠁴󠁨󠀴[󠀰-󠀹]|󠁴󠁨󠀵[󠀰-󠀸]|󠁴󠁨󠀶[󠀰-󠀷]|󠁴󠁨󠀷[󠀰-󠀷]|󠁴󠁨󠀸[󠀰-󠀶]|󠁴󠁨󠀹[󠀰-󠀶]|󠁣󠁤󠁨[󠁫-󠁬]|󠁣󠁡󠁮[󠁳-󠁵]|󠁳󠁧󠀰[󠀱-󠀵]|󠁴󠁮󠀱[󠀱-󠀴]|󠁴󠁮󠀲[󠀱-󠀳]|󠁴󠁮󠀳[󠀱-󠀴]|󠁴󠁮󠀴[󠀱-󠀳]|󠁴󠁮󠀵[󠀱-󠀳]|󠁴󠁮󠀷[󠀱-󠀳]|󠁴󠁮󠀸[󠀱-󠀳]|󠁴󠁯󠀰[󠀱-󠀵]|󠁴󠁲󠀰[󠀱-󠀹]|󠁴󠁲󠀱[󠀰-󠀹]|󠁴󠁲󠀲[󠀰-󠀹]|󠁴󠁲󠀳[󠀰-󠀹]|󠁴󠁲󠀴[󠀰-󠀹]|󠁴󠁲󠀵[󠀰-󠀹]|󠁴󠁲󠀶[󠀰-󠀹]|󠁴󠁲󠀷[󠀰-󠀹]|󠁴󠁲󠀸[󠀰-󠀱]|󠁭󠁡󠀱[󠀰-󠀲]|󠁭󠁥󠀲[󠀰-󠀵]|󠁭󠁥󠀱[󠀰-󠀹]|󠁭󠁥󠀰[󠀱-󠀹]|󠁥󠁳󠁭[󠁣-󠁤]|󠁭󠁤󠁳[󠁮-󠁯]|󠁥󠁳󠁴[󠁥-󠁦]|󠁭󠁤󠁣[󠁲-󠁵]|󠁭󠁤󠁣[󠁬-󠁭]|󠁭󠁤󠁢[󠁲-󠁳]|󠁭󠁣󠁳[󠁯-󠁰]|󠁥󠁴󠁳[󠁮-󠁯]|󠁦󠁩󠀰[󠀲-󠀹]|󠁦󠁩󠀱[󠀰-󠀹]|󠁦󠁪󠀰[󠀱-󠀹]|󠁦󠁪󠀱[󠀰-󠀴]|󠁳󠁴󠀰[󠀱-󠀶]|󠁣󠁨󠁺[󠁧-󠁨]|󠁣󠁨󠁳[󠁧-󠁨]|󠁳󠁹󠁨[󠁬-󠁭]|󠁳󠁮󠁫[󠁤-󠁥]|󠁣󠁮󠁨[󠁡-󠁢]|󠁣󠁧󠀱[󠀱-󠀶]|󠁣󠁮󠁨[󠁫-󠁬]|󠁳󠁭󠀰[󠀱-󠀹]|󠁭󠁭󠀰[󠀱-󠀷]|󠁭󠁭󠀱[󠀱-󠀸]|󠁣󠁮󠁳[󠁣-󠁤]|󠁣󠁤󠁭[󠁮-󠁯]|󠁴󠁨󠀱[󠀰-󠀹]|󠁭󠁴󠀵[󠀰-󠀹]|󠁭󠁴󠀶[󠀰-󠀸]|󠁥󠁳󠁣[󠁲-󠁵]|󠁳󠁢󠁭[󠁫-󠁬]|󠁥󠁳󠁣[󠁬-󠁯]|󠁥󠁳󠁣[󠁡-󠁣]|󠁥󠁳󠁡[󠁲-󠁳]|󠁭󠁶󠀰[󠀰-󠀵]|󠁭󠁶󠀰[󠀷-󠀸]|󠁭󠁶󠀱[󠀲-󠀴]|󠁳󠁡󠀱[󠀰-󠀲]|󠁢󠁷󠁳[󠁯-󠁰]|󠁳󠁡󠀰[󠀱-󠀹]|󠁲󠁷󠀰[󠀱-󠀵]|󠁭󠁶󠀲[󠀳-󠀹]|󠁭󠁷󠁫[󠁲-󠁳]|󠁭󠁷󠁭[󠁧-󠁨]|󠁢󠁴󠀴[󠀱-󠀵]|󠁢󠁴󠀳[󠀱-󠀴]|󠁢󠁴󠀲[󠀱-󠀴]|󠁢󠁴󠀱[󠀱-󠀵]|󠁵󠁳󠁡[󠁫-󠁬]|󠁬󠁴󠀵[󠀰-󠀹]|󠁬󠁴󠀴[󠀰-󠀹]|󠁬󠁴󠀳[󠀰-󠀹]|󠁢󠁳󠁮[󠁯-󠁰]|󠁬󠁴󠀲[󠀰-󠀹]|󠁬󠁴󠀱[󠀰-󠀹]|󠁬󠁴󠀰[󠀱-󠀹]|󠁭󠁡󠀰[󠀱-󠀹]|󠁦󠁲󠀰[󠀱-󠀹]|󠁦󠁲󠀱[󠀰-󠀹]|󠁦󠁲󠀲[󠀱-󠀹]|󠁦󠁲󠀲[󠁡-󠁢]|󠁦󠁲󠀳[󠀰-󠀹]|󠁦󠁲󠀴[󠀰-󠀹]|󠁦󠁲󠀵[󠀰-󠀹]|󠁦󠁲󠀶[󠀰-󠀹]|󠁬󠁹󠁭[󠁩-󠁪]|󠁳󠁥󠁡[󠁢-󠁣]|󠁦󠁲󠀷[󠀰-󠀴]|󠁦󠁲󠀷[󠀶-󠀹]|󠁦󠁲󠀸[󠀰-󠀹]|󠁦󠁲󠀹[󠀰-󠀵]|󠁭󠁲󠀰[󠀱-󠀹]|󠁭󠁲󠀱[󠀰-󠀵]|󠁭󠁴󠀰[󠀱-󠀹]|󠁭󠁴󠀱[󠀰-󠀹]|󠁭󠁴󠀲[󠀰-󠀹]|󠁭󠁴󠀳[󠀰-󠀹]|󠁭󠁴󠀴[󠀰-󠀹]|󠁳󠁣󠀲[󠀰-󠀷]|󠁳󠁣󠀱[󠀰-󠀹]|󠁴󠁺󠀰[󠀱-󠀹]|󠁴󠁺󠀱[󠀰-󠀹]|󠁴󠁺󠀲[󠀰-󠀹]|󠁴󠁺󠀳[󠀰-󠀱]|󠁳󠁣󠀰[󠀱-󠀹]|󠁲󠁯󠁴[󠁬-󠁭]|󠁩󠁲󠀱[󠀰-󠀹]|󠁩󠁴󠁭[󠁳-󠁴]|󠁩󠁤󠁳[󠁬-󠁮]|󠁩󠁴󠁭[󠁮-󠁯]|󠁩󠁴󠁡[󠁰-󠁲]|󠁩󠁲󠀰[󠀰-󠀹]|󠁮󠁲󠀱[󠀰-󠀴]|󠁮󠁲󠀰[󠀱-󠀹]|󠁩󠁴󠁭[󠁢-󠁣]|󠁩󠁤󠁳[󠁲-󠁵]|󠁮󠁰󠁰[󠀱-󠀷]|󠁩󠁥󠁣[󠁮-󠁯]|󠁤󠁭󠀱[󠀰-󠀱]|󠁩󠁴󠁬[󠁴-󠁵]|󠁰󠁹󠀱[󠀰-󠀶]|󠁤󠁯󠀰[󠀱-󠀹]|󠁧󠁮󠁫[󠁮-󠁯]|󠁧󠁮󠁫[󠁤-󠁥]|󠁤󠁺󠀱[󠀰-󠀹]|󠁤󠁺󠀲[󠀰-󠀹]|󠁰󠁬󠁳[󠁫-󠁬]|󠁩󠁤󠁰[󠁡-󠁢]|󠁩󠁤󠁰[󠁤-󠁥]|󠁩󠁴󠁰[󠁴-󠁶]|󠁩󠁤󠁰[󠁳-󠁴]|󠁧󠁮󠁭[󠁬-󠁭]|󠁭󠁫󠀶[󠀰-󠀹]|󠁮󠁩󠁭[󠁳-󠁴]|󠁭󠁫󠀷[󠀰-󠀹]|󠁭󠁫󠀸[󠀰-󠀵]|󠁤󠁺󠀳[󠀰-󠀹]|󠁩󠁴󠁰[󠁮-󠁯]|󠁩󠁤󠁳[󠁡-󠁢]|󠁩󠁴󠁰[󠁣-󠁥]|󠁩󠁲󠀲[󠀰-󠀹]|󠁧󠁮󠁭[󠁣-󠁤]|󠁥󠁣󠁳[󠁤-󠁥]|󠁩󠁴󠁢[󠁲-󠁴]|󠁩󠁮󠁴[󠁲-󠁳]|󠁮󠁯󠀲[󠀱-󠀲]|󠁰󠁨󠀴[󠀰-󠀱]|󠁰󠁨󠀱[󠀰-󠀵]|󠁰󠁨󠀰[󠀵-󠀹]|󠁡󠁧󠀰[󠀳-󠀸]|󠁩󠁴󠁣[󠁲-󠁴]|󠁩󠁴󠁣[󠁮-󠁯]|󠁡󠁧󠀱[󠀰-󠀱]|󠁰󠁴󠀱[󠀰-󠀸]|󠁩󠁴󠁣[󠁡-󠁢]|󠁰󠁴󠀰[󠀱-󠀹]|󠁡󠁬󠀰[󠀱-󠀹]|󠁡󠁬󠀱[󠀰-󠀲]|󠁰󠁨󠀰[󠀰-󠀳]|󠁮󠁯󠀱[󠀶-󠀷]|󠁧󠁮󠁫[󠁡-󠁢]|󠁩󠁥󠁭[󠁮-󠁯]|󠁧󠁮󠁢[󠁥-󠁦]|󠁤󠁯󠀱[󠀰-󠀹]|󠁩󠁲󠀳[󠀱-󠀲]|󠁩󠁥󠁷[󠁷-󠁸]|󠁤󠁯󠀲[󠀰-󠀹]|󠁩󠁮󠁡[󠁲-󠁳]|󠁩󠁮󠁣[󠁧-󠁨]|󠁤󠁯󠀳[󠀰-󠀹]|󠁤󠁺󠀴[󠀰-󠀹]|󠁧󠁥󠁳[󠁪-󠁫]|󠁧󠁤󠀰[󠀱-󠀶]|󠁤󠁺󠀵[󠀰-󠀸]|󠁮󠁯󠀰[󠀱-󠀲]|󠁮󠁯󠀰[󠀴-󠀹]|󠁩󠁴󠁢[󠁮-󠁯]|󠁤󠁯󠀴[󠀰-󠀲]|󠁩󠁱󠁢[󠁡-󠁢]|󠁨󠁴󠁮[󠁤-󠁥]|󠁧󠁲󠀷[󠀱-󠀳]|󠁨󠁲󠀲[󠀰-󠀱]|󠁨󠁲󠀱[󠀰-󠀹]|󠁨󠁲󠀰[󠀱-󠀹]|󠁨󠁴󠁳[󠁤-󠁥]|󠁢󠁡󠀰[󠀱-󠀹]|󠁨󠁮󠁣[󠁬-󠁭]|󠁨󠁵󠁳[󠁮-󠁯]|󠁧󠁲󠀶[󠀱-󠀴]|󠁪󠁭󠀱[󠀰-󠀴]|󠁣󠁩󠀰[󠀱-󠀹]|󠁨󠁵󠁳[󠁳-󠁴]|󠁧󠁷󠁢[󠁬-󠁭]|󠁧󠁴󠀲[󠀰-󠀲]|󠁣󠁩󠀱[󠀰-󠀹]|󠁣󠁮󠀱[󠀱-󠀵]|󠁣󠁮󠀲[󠀱-󠀳]|󠁭󠁫󠀲[󠀰-󠀹]|󠁢󠁤󠀶[󠀰-󠀴]|󠁢󠁤󠀵[󠀰-󠀹]|󠁢󠁤󠀴[󠀰-󠀹]|󠁢󠁤󠀳[󠀰-󠀹]|󠁢󠁤󠀲[󠀰-󠀹]|󠁢󠁤󠀱[󠀰-󠀹]|󠁢󠁤󠀰[󠀱-󠀹]|󠁢󠁢󠀱[󠀰-󠀱]|󠁡󠁬󠁰[󠁱-󠁲]|󠁢󠁢󠀰[󠀱-󠀹]|󠁤󠁫󠀸[󠀱-󠀵]|󠁩󠁴󠀷[󠀷-󠀸]|󠁧󠁲󠀹[󠀱-󠀴]|󠁤󠁪󠁡[󠁲-󠁳]|󠁡󠁤󠀰[󠀲-󠀸]|󠁣󠁹󠀰[󠀱-󠀶]|󠁧󠁲󠀸[󠀱-󠀵]|󠁤󠁪󠁤[󠁩-󠁪]|󠁭󠁡󠀱[󠀳-󠀶]|󠁩󠁴󠁶[󠁡-󠁣]|󠁩󠁤󠁫[󠁲-󠁵]|󠁭󠁫󠀳[󠀰-󠀹]|󠁧󠁲󠀴[󠀱-󠀴]|󠁭󠁫󠀴[󠀰-󠀹]|󠁧󠁲󠀳[󠀱-󠀴]|󠁧󠁲󠀲[󠀱-󠀴]|󠁩󠁤󠁮[󠁴-󠁵]|󠁩󠁴󠁴[󠁲-󠁳]|󠁩󠁴󠁴[󠁮-󠁰]|󠁧󠁲󠀱[󠀱-󠀷]|󠁩󠁴󠁳[󠁵-󠁶]|󠁩󠁴󠁳[󠁲-󠁳]|󠁩󠁴󠁳[󠁯-󠁰]|󠁧󠁲󠀰[󠀳-󠀷]|󠁭󠁫󠀰[󠀱-󠀹]|󠁤󠁺󠀰[󠀱-󠀹]|󠁣󠁮󠀳[󠀱-󠀷]|󠁣󠁮󠀴[󠀱-󠀶]|󠁣󠁮󠀵[󠀰-󠀴]|󠁧󠁴󠀱[󠀰-󠀹]|󠁭󠁫󠀵[󠀰-󠀹]|󠁤󠁭󠀰[󠀲-󠀹]|󠁣󠁮󠀶[󠀱-󠀵]|󠁭󠁫󠀱[󠀰-󠀹]|󠁧󠁴󠀰[󠀱-󠀹]|󠁪󠁭󠀰[󠀱-󠀹]|󠁧󠁲󠀵[󠀱-󠀹]|󠁣󠁮󠀹[󠀱-󠀲]|󠁩󠁤󠁢[󠁡-󠁢]|󠁲󠁯󠁣[󠁳-󠁴]|󠁩󠁤󠁪[󠁡-󠁢]|󠁩󠁤󠁫[󠁡-󠁢]|󠁩󠁴󠁲[󠁭-󠁯]|󠁴󠁭[󠁡-󠁢]|󠁳󠁥[󠁷-󠁺]|󠁡󠁲[󠁪-󠁮]|󠁡󠁲[󠁰-󠁺]|󠁡󠁴[󠀱-󠀹]|󠁬󠁳[󠁡-󠁨]|󠁬󠁳[󠁪-󠁫]|󠁶󠁥[󠁲-󠁺]|󠁰󠁹[󠀲-󠀹]|󠁣󠁲[󠁧-󠁨]|󠁦󠁲[󠁨-󠁬]|󠁦󠁲[󠁤-󠁧]|󠁭󠁺[󠁰-󠁱]|󠁦󠁲[󠁡-󠁢]|󠁭󠁺[󠁳-󠁴]|󠁴󠁭[󠁬-󠁭]|󠁳󠁥[󠁳-󠁵]|󠁳󠁥[󠁣-󠁩]|󠁮󠁥[󠀱-󠀸]|󠁩󠁳[󠀱-󠀸]|󠁧󠁡[󠀱-󠀹]|󠁳󠁥[󠁭-󠁯]|󠁧󠁲[󠁡-󠁭]|󠁫󠁨[󠀳-󠀹]|󠁫󠁧[󠁮-󠁯]|󠁭󠁧[󠁴-󠁵]|󠁫󠁧[󠁢-󠁣]|󠁮󠁰[󠀱-󠀵]|󠁥󠁣[󠁷-󠁺]|󠁥󠁣[󠁴-󠁵]|󠁥󠁣[󠁲-󠁳]|󠁥󠁣[󠁬-󠁰]|󠁡󠁲[󠁡-󠁨]|󠁥󠁣[󠁡-󠁩]|󠁭󠁬[󠀲-󠀹]|󠁦󠁲[󠁵-󠁶]|󠁢󠁯[󠁳-󠁴]|󠁢󠁯[󠁮-󠁰]|󠁢󠁯[󠁢-󠁣]|󠁦󠁲[󠁳-󠁴]|󠁧󠁭[󠁬-󠁮]|󠁦󠁲[󠁱-󠁲]|󠁰󠁡[󠀲-󠀹]|󠁣󠁧[󠀷-󠀹]|󠁭󠁺[󠁡-󠁢]|󠁦󠁲[󠁯-󠁰]|󠁶󠁥[󠁡-󠁰]|󠁢󠁤[󠁡-󠁨]|󠁰󠁥󠁴󠁡󠁣|󠁰󠁥󠁴󠁵󠁭|󠁰󠁥󠁵󠁣󠁡|󠁰󠁧󠁣󠁰󠁫|󠁰󠁧󠁣󠁰󠁭|󠁰󠁥󠁳󠁡󠁭|󠁰󠁥󠁰󠁵󠁮|󠁰󠁥󠁰󠁩󠁵|󠁰󠁥󠁰󠁡󠁳|󠁰󠁥󠁭󠁯󠁱|󠁰󠁥󠁭󠁤󠁤|󠁰󠁥󠁬󠁯󠁲|󠁰󠁥󠁬󠁭󠁡|󠁰󠁥󠁬󠁩󠁭|󠁰󠁥󠁪󠁵󠁮|󠁰󠁥󠁩󠁣󠁡|󠁰󠁥󠁨󠁵󠁶|󠁰󠁥󠁨󠁵󠁣|󠁭󠁮󠀰󠀴󠀹|󠁰󠁥󠁣󠁵󠁳|󠁰󠁥󠁣󠁡󠁬|󠁭󠁮󠀰󠀳󠀷|󠁭󠁮󠀰󠀳󠀵|󠁰󠁨󠁡󠁬󠁢|󠁭󠁬󠁢󠁫󠁯|󠁭󠁫󠀴󠀱󠀰|󠁭󠁫󠀳󠀰󠀱|󠁭󠁨󠁷󠁴󠁪|󠁭󠁨󠁷󠁴󠁨|󠁭󠁨󠁵󠁴󠁩|󠁭󠁨󠁵󠁪󠁡|󠁭󠁨󠁲󠁯󠁮|󠁭󠁨󠁮󠁭󠁵|󠁭󠁨󠁮󠁭󠁫|󠁭󠁨󠁭󠁩󠁬|󠁭󠁨󠁭󠁥󠁪|󠁭󠁨󠁭󠁡󠁬|󠁭󠁨󠁭󠁡󠁪|󠁭󠁨󠁬󠁩󠁫|󠁭󠁨󠁬󠁩󠁢|󠁭󠁨󠁬󠁡󠁥|󠁭󠁨󠁫󠁷󠁡|󠁭󠁨󠁫󠁩󠁬|󠁭󠁨󠁪󠁡󠁬|󠁭󠁨󠁪󠁡󠁢|󠁭󠁨󠁥󠁮󠁩|󠁰󠁧󠁥󠁢󠁲|󠁰󠁧󠁥󠁨󠁧|󠁰󠁧󠁥󠁰󠁷|󠁰󠁧󠁥󠁳󠁷|󠁰󠁧󠁧󠁰󠁫|󠁰󠁧󠁨󠁬󠁡|󠁰󠁧󠁪󠁷󠁫|󠁭󠁮󠀰󠀴󠀳|󠁭󠁮󠀰󠀴󠀱|󠁰󠁧󠁭󠁢󠁡|󠁰󠁧󠁭󠁲󠁬|󠁰󠁧󠁮󠁣󠁤|󠁰󠁧󠁮󠁩󠁫|󠁰󠁧󠁮󠁰󠁰|󠁰󠁧󠁮󠁳󠁢|󠁰󠁧󠁳󠁡󠁮|󠁰󠁧󠁳󠁨󠁭|󠁰󠁧󠁷󠁢󠁫|󠁰󠁧󠁷󠁨󠁭|󠁰󠁧󠁷󠁰󠁤|󠁰󠁨󠁡󠁢󠁲|󠁰󠁨󠁡󠁧󠁮|󠁰󠁨󠁡󠁧󠁳|󠁭󠁮󠀰󠀳󠀹|󠁰󠁨󠁡󠁫󠁬|󠁭󠁸󠁴󠁡󠁢|󠁭󠁸󠁴󠁡󠁭|󠁭󠁸󠁴󠁬󠁡|󠁭󠁸󠁶󠁥󠁲|󠁭󠁸󠁹󠁵󠁣|󠁭󠁸󠁺󠁡󠁣|󠁥󠁧󠁡󠁳󠁴|󠁥󠁧󠁡󠁳󠁮|󠁭󠁺󠁭󠁰󠁭|󠁥󠁥󠀴󠀴󠀶|󠁥󠁥󠀴󠀷󠀸|󠁥󠁧󠁡󠁬󠁸|󠁥󠁥󠀹󠀲󠀸|󠁥󠁥󠀹󠀱󠀹|󠁥󠁥󠀹󠀱󠀷|󠁥󠁥󠀹󠀰󠀷|󠁥󠁥󠀴󠀸󠀰|󠁥󠁥󠀹󠀰󠀳|󠁭󠁸󠁯󠁡󠁸|󠁥󠁥󠀲󠀷󠀲|󠁥󠁥󠀲󠀹󠀱|󠁭󠁸󠁰󠁵󠁥|󠁥󠁥󠀲󠀹󠀳|󠁭󠁸󠁱󠁵󠁥|󠁥󠁥󠀲󠀹󠀶|󠁭󠁸󠁲󠁯󠁯|󠁥󠁥󠀳󠀰󠀳|󠁭󠁸󠁳󠁩󠁮|󠁥󠁥󠀳󠀰󠀵|󠁥󠁥󠀳󠀱󠀷|󠁭󠁸󠁳󠁬󠁰|󠁥󠁥󠀳󠀲󠀱|󠁥󠁥󠀳󠀳󠀸|󠁥󠁥󠀳󠀵󠀳|󠁥󠁥󠀴󠀲󠀴|󠁭󠁸󠁳󠁯󠁮|󠁥󠁥󠀴󠀸󠀶|󠁥󠁥󠀷󠀳󠀲|󠁥󠁥󠀷󠀲󠀶|󠁥󠁥󠀷󠀱󠀹|󠁥󠁥󠀷󠀱󠀴|󠁥󠁥󠀷󠀱󠀲|󠁥󠁥󠀷󠀰󠀸|󠁥󠁥󠀵󠀸󠀶|󠁥󠁥󠀶󠀱󠀵|󠁥󠁥󠀶󠀱󠀸|󠁥󠁥󠀶󠀹󠀸|󠁥󠁥󠀶󠀸󠀹|󠁥󠁥󠀶󠀶󠀸|󠁥󠁥󠀶󠀶󠀳|󠁥󠁥󠀶󠀶󠀱|󠁥󠁥󠀶󠀲󠀲|󠁥󠁥󠀶󠀲󠀴|󠁥󠁥󠀶󠀳󠀸|󠁥󠁥󠀶󠀵󠀱|󠁥󠁥󠀵󠀰󠀳|󠁥󠁥󠀹󠀰󠀱|󠁥󠁥󠀸󠀹󠀹|󠁥󠁥󠀸󠀹󠀷|󠁥󠁥󠀸󠀹󠀰|󠁥󠁥󠀵󠀱󠀱|󠁥󠁥󠀸󠀵󠀵|󠁥󠁥󠀵󠀱󠀴|󠁥󠁥󠀸󠀳󠀴|󠁥󠁥󠀸󠀲󠀴|󠁥󠁥󠀵󠀲󠀸|󠁥󠁥󠀸󠀰󠀹|󠁥󠁥󠀸󠀰󠀳|󠁥󠁥󠀷󠀹󠀶|󠁥󠁥󠀵󠀵󠀷|󠁥󠁥󠀷󠀸󠀴|󠁥󠁥󠀷󠀳󠀵|󠁥󠁥󠀵󠀶󠀷|󠁥󠁥󠀶󠀵󠀳|󠁥󠁥󠀱󠀸󠀴|󠁥󠁥󠀱󠀹󠀱|󠁮󠁺󠁷󠁴󠁣|󠁮󠁺󠁷󠁫󠁯|󠁮󠁺󠁷󠁧󠁮|󠁭󠁶󠁭󠁬󠁥|󠁥󠁧󠁷󠁡󠁤|󠁥󠁧󠁳󠁵󠁺|󠁥󠁧󠁳󠁩󠁮|󠁮󠁺󠁴󠁫󠁩|󠁥󠁧󠁳󠁨󠁲|󠁮󠁺󠁴󠁡󠁳|󠁥󠁧󠁳󠁨󠁧|󠁮󠁺󠁳󠁴󠁬|󠁮󠁺󠁯󠁴󠁡|󠁮󠁺󠁮󠁴󠁬|󠁮󠁺󠁮󠁳󠁮|󠁮󠁺󠁭󠁷󠁴|󠁭󠁮󠀰󠀵󠀱|󠁰󠁥󠁣󠁡󠁪|󠁰󠁥󠁡󠁹󠁡|󠁰󠁥󠁡󠁲󠁥|󠁰󠁥󠁡󠁰󠁵|󠁭󠁮󠀰󠀵󠀳|󠁭󠁮󠀰󠀵󠀵|󠁭󠁮󠀰󠀵󠀷|󠁭󠁮󠀰󠀵󠀹|󠁭󠁮󠀰󠀶󠀱|󠁰󠁥󠁡󠁮󠁣|󠁭󠁮󠀰󠀶󠀷|󠁭󠁮󠀰󠀶󠀹|󠁭󠁮󠀰󠀷󠀱|󠁰󠁥󠁡󠁭󠁡|󠁭󠁮󠀰󠀷󠀳|󠁥󠁥󠀱󠀳󠀰|󠁥󠁥󠀱󠀷󠀱|󠁮󠁺󠁭󠁢󠁨|󠁭󠁸󠁣󠁨󠁰|󠁭󠁸󠁣󠁭󠁸|󠁭󠁸󠁣󠁯󠁡|󠁭󠁸󠁣󠁯󠁬|󠁭󠁸󠁤󠁵󠁲|󠁭󠁸󠁧󠁲󠁯|󠁭󠁸󠁧󠁵󠁡|󠁥󠁥󠀲󠀱󠀴|󠁭󠁸󠁨󠁩󠁤|󠁥󠁥󠀲󠀴󠀵|󠁭󠁸󠁪󠁡󠁬|󠁭󠁸󠁭󠁥󠁸|󠁭󠁸󠁭󠁩󠁣|󠁭󠁸󠁭󠁯󠁲|󠁭󠁸󠁮󠁡󠁹|󠁥󠁥󠀲󠀴󠀷|󠁥󠁥󠀲󠀵󠀱|󠁭󠁸󠁮󠁬󠁥|󠁮󠁺󠁨󠁫󠁢|󠁮󠁺󠁧󠁩󠁳|󠁮󠁺󠁣󠁩󠁴|󠁥󠁧󠁰󠁴󠁳|󠁥󠁧󠁭󠁮󠁦|󠁥󠁧󠁫󠁦󠁳|󠁥󠁧󠁦󠁹󠁭|󠁥󠁧󠁢󠁮󠁳|󠁭󠁸󠁡󠁧󠁵|󠁮󠁺󠁣󠁡󠁮|󠁭󠁸󠁢󠁣󠁮|󠁮󠁺󠁢󠁯󠁰|󠁮󠁺󠁡󠁵󠁫|󠁥󠁥󠀱󠀹󠀸|󠁥󠁥󠀲󠀰󠀵|󠁭󠁸󠁢󠁣󠁳|󠁭󠁸󠁣󠁡󠁭|󠁭󠁸󠁣󠁨󠁨|󠁧󠁢󠁲󠁤󠁢|󠁧󠁢󠁲󠁣󠁴|󠁧󠁢󠁲󠁣󠁨|󠁧󠁢󠁲󠁣󠁣|󠁧󠁢󠁰󠁴󠁥|󠁧󠁢󠁰󠁯󠁷|󠁧󠁢󠁰󠁯󠁲|󠁧󠁢󠁰󠁬󠁹|󠁧󠁢󠁰󠁫󠁮|󠁧󠁢󠁰󠁥󠁭|󠁧󠁢󠁯󠁸󠁦|󠁧󠁢󠁯󠁲󠁫|󠁧󠁢󠁯󠁬󠁤|󠁧󠁢󠁮󠁹󠁫|󠁧󠁢󠁮󠁷󠁰|󠁧󠁢󠁮󠁷󠁭|󠁧󠁢󠁮󠁴󠁹|󠁧󠁢󠁮󠁴󠁴|󠁧󠁢󠁮󠁴󠁬|󠁧󠁢󠁮󠁳󠁭|󠁧󠁢󠁮󠁮󠁨|󠁧󠁢󠁮󠁭󠁤|󠁧󠁢󠁮󠁬󠁮|󠁧󠁢󠁮󠁬󠁫|󠁧󠁢󠁳󠁷󠁡|󠁧󠁢󠁳󠁴󠁹|󠁧󠁢󠁳󠁴󠁮|󠁧󠁢󠁳󠁴󠁥|󠁧󠁢󠁳󠁲󠁹|󠁧󠁢󠁳󠁯󠁳|󠁧󠁢󠁳󠁮󠁤|󠁧󠁢󠁳󠁬󠁫|󠁧󠁢󠁳󠁫󠁰|󠁧󠁢󠁳󠁨󠁲|󠁧󠁢󠁳󠁨󠁮|󠁧󠁢󠁳󠁨󠁦|󠁧󠁢󠁳󠁧󠁣|󠁧󠁢󠁳󠁦󠁴|󠁧󠁢󠁳󠁦󠁫|󠁧󠁢󠁳󠁣󠁴|󠁧󠁢󠁳󠁣󠁢|󠁧󠁢󠁳󠁡󠁹|󠁧󠁢󠁳󠁡󠁷|󠁧󠁢󠁲󠁵󠁴|󠁧󠁢󠁲󠁯󠁴|󠁧󠁢󠁲󠁩󠁣|󠁧󠁢󠁲󠁦󠁷|󠁧󠁢󠁲󠁤󠁧|󠁧󠁢󠁬󠁤󠁳|󠁧󠁢󠁬󠁣󠁥|󠁧󠁢󠁬󠁢󠁨|󠁧󠁢󠁬󠁢󠁣|󠁧󠁢󠁬󠁡󠁮|󠁧󠁢󠁫󠁷󠁬|󠁧󠁢󠁫󠁴󠁴|󠁧󠁢󠁫󠁩󠁲|󠁧󠁢󠁫󠁨󠁬|󠁧󠁢󠁫󠁥󠁮|󠁧󠁢󠁫󠁥󠁣|󠁧󠁢󠁩󠁶󠁣|󠁧󠁢󠁩󠁳󠁬|󠁧󠁢󠁩󠁯󠁷|󠁧󠁢󠁩󠁯󠁳|󠁧󠁢󠁨󠁲󠁹|󠁧󠁢󠁨󠁲󠁷|󠁧󠁢󠁨󠁲󠁴|󠁧󠁢󠁨󠁰󠁬|󠁧󠁢󠁨󠁮󠁳|󠁧󠁢󠁨󠁭󠁦|󠁧󠁢󠁨󠁬󠁤|󠁧󠁢󠁨󠁩󠁬|󠁧󠁢󠁨󠁥󠁦|󠁧󠁢󠁮󠁩󠁲|󠁧󠁢󠁮󠁧󠁭|󠁧󠁢󠁮󠁦󠁫|󠁧󠁢󠁮󠁥󠁴|󠁧󠁢󠁮󠁥󠁬|󠁧󠁢󠁮󠁢󠁬|󠁧󠁢󠁮󠁡󠁹|󠁧󠁢󠁭󠁵󠁬|󠁧󠁢󠁭󠁴󠁹|󠁧󠁢󠁭󠁲󠁹|󠁧󠁢󠁭󠁲󠁴|󠁧󠁢󠁭󠁯󠁮|󠁧󠁢󠁭󠁬󠁮|󠁧󠁢󠁭󠁩󠁫|󠁧󠁢󠁭󠁥󠁡|󠁧󠁢󠁭󠁤󠁷|󠁧󠁢󠁭󠁤󠁢|󠁧󠁢󠁭󠁡󠁮|󠁧󠁢󠁬󠁵󠁴|󠁧󠁢󠁬󠁮󠁤|󠁧󠁢󠁬󠁩󠁶|󠁧󠁢󠁬󠁩󠁮|󠁧󠁢󠁬󠁥󠁷|󠁧󠁢󠁴󠁷󠁨|󠁩󠁳󠁡󠁫󠁮|󠁩󠁳󠁡󠁫󠁵|󠁩󠁳󠁡󠁲󠁮|󠁩󠁳󠁡󠁳󠁡|󠁩󠁳󠁢󠁬󠁡|󠁩󠁳󠁢󠁯󠁧|󠁩󠁳󠁢󠁯󠁬|󠁩󠁳󠁤󠁡󠁢|󠁩󠁳󠁤󠁡󠁶|󠁩󠁳󠁥󠁯󠁭|󠁩󠁳󠁥󠁹󠁦|󠁩󠁳󠁦󠁪󠁤|󠁩󠁳󠁦󠁪󠁬|󠁩󠁳󠁦󠁬󠁡|󠁩󠁳󠁦󠁬󠁲|󠁩󠁳󠁧󠁡󠁲|󠁩󠁳󠁧󠁯󠁧|󠁩󠁳󠁧󠁲󠁮|󠁩󠁳󠁧󠁲󠁵|󠁩󠁳󠁧󠁲󠁹|󠁩󠁳󠁨󠁡󠁦|󠁩󠁳󠁨󠁲󠁧|󠁩󠁳󠁨󠁲󠁵|󠁧󠁢󠁺󠁥󠁴|󠁧󠁢󠁹󠁯󠁲|󠁧󠁢󠁷󠁳󠁸|󠁧󠁢󠁷󠁳󠁭|󠁧󠁢󠁷󠁲󠁸|󠁧󠁢󠁷󠁲󠁴|󠁧󠁢󠁷󠁲󠁬|󠁧󠁢󠁷󠁯󠁲|󠁧󠁢󠁷󠁯󠁫|󠁧󠁢󠁷󠁮󠁭|󠁧󠁢󠁷󠁮󠁨|󠁧󠁢󠁷󠁮󠁤|󠁧󠁢󠁷󠁬󠁶|󠁧󠁢󠁷󠁬󠁳|󠁧󠁢󠁷󠁬󠁮|󠁧󠁢󠁷󠁬󠁬|󠁧󠁢󠁷󠁫󠁦|󠁧󠁢󠁷󠁩󠁬|󠁧󠁢󠁷󠁧󠁮|󠁧󠁢󠁷󠁦󠁴|󠁧󠁢󠁷󠁤󠁵|󠁧󠁢󠁷󠁢󠁫|󠁧󠁢󠁷󠁡󠁲|󠁧󠁢󠁶󠁧󠁬|󠁩󠁳󠁳󠁫󠁯|󠁩󠁳󠁳󠁫󠁲|󠁩󠁳󠁳󠁮󠁦|󠁩󠁳󠁳󠁯󠁧|󠁩󠁳󠁳󠁯󠁬|󠁩󠁳󠁳󠁳󠁳|󠁩󠁳󠁳󠁴󠁲|󠁩󠁳󠁳󠁴󠁹|󠁩󠁳󠁳󠁶󠁧|󠁩󠁳󠁴󠁡󠁬|󠁩󠁳󠁴󠁨󠁧|󠁩󠁳󠁴󠁪󠁯|󠁩󠁳󠁶󠁥󠁭|󠁩󠁳󠁶󠁥󠁲|󠁩󠁳󠁶󠁯󠁰|󠁧󠁢󠁴󠁲󠁦|󠁧󠁢󠁴󠁯󠁦|󠁧󠁢󠁴󠁯󠁢|󠁧󠁢󠁴󠁨󠁲|󠁧󠁢󠁴󠁦󠁷|󠁧󠁢󠁴󠁡󠁭|󠁧󠁢󠁳󠁷󠁫|󠁧󠁢󠁳󠁷󠁤|󠁧󠁢󠁬󠁥󠁣|󠁩󠁳󠁨󠁵󠁧|󠁩󠁳󠁨󠁵󠁶|󠁩󠁳󠁨󠁶󠁡|󠁩󠁳󠁨󠁶󠁥|󠁩󠁳󠁩󠁳󠁡|󠁩󠁳󠁫󠁡󠁬|󠁩󠁳󠁫󠁪󠁯|󠁩󠁳󠁫󠁯󠁰|󠁩󠁳󠁬󠁡󠁮|󠁩󠁳󠁭󠁯󠁳|󠁩󠁳󠁭󠁵󠁬|󠁩󠁳󠁭󠁹󠁲|󠁩󠁳󠁮󠁯󠁲|󠁩󠁳󠁲󠁧󠁥|󠁩󠁳󠁲󠁧󠁹|󠁩󠁳󠁲󠁨󠁨|󠁩󠁳󠁲󠁫󠁮|󠁩󠁳󠁲󠁫󠁶|󠁩󠁳󠁳󠁢󠁴|󠁩󠁳󠁳󠁤󠁮|󠁩󠁳󠁳󠁤󠁶|󠁩󠁳󠁳󠁥󠁬|󠁩󠁳󠁳󠁦󠁡|󠁭󠁡󠁡󠁳󠁺|󠁭󠁡󠁡󠁺󠁩|󠁭󠁡󠁢󠁥󠁭|󠁭󠁡󠁢󠁯󠁤|󠁭󠁡󠁢󠁯󠁭|󠁭󠁡󠁢󠁲󠁲|󠁭󠁡󠁣󠁡󠁳|󠁭󠁡󠁣󠁨󠁥|󠁭󠁡󠁣󠁨󠁩|󠁭󠁡󠁣󠁨󠁴|󠁭󠁡󠁤󠁲󠁩|󠁭󠁡󠁥󠁲󠁲|󠁭󠁡󠁥󠁳󠁩|󠁭󠁡󠁥󠁳󠁭|󠁭󠁡󠁦󠁡󠁨|󠁭󠁡󠁦󠁥󠁳|󠁭󠁡󠁦󠁩󠁧|󠁭󠁡󠁦󠁱󠁨|󠁭󠁡󠁨󠁡󠁪|󠁭󠁡󠁨󠁡󠁯|󠁭󠁡󠁨󠁯󠁣|󠁭󠁡󠁩󠁦󠁲|󠁭󠁡󠁩󠁮󠁥|󠁭󠁡󠁪󠁤󠁩|󠁬󠁶󠀰󠀷󠀳|󠁬󠁶󠀰󠀷󠀷|󠁬󠁶󠀰󠀸󠀰|󠁬󠁶󠀰󠀹󠀱|󠁬󠁶󠀰󠀹󠀴|󠁬󠁶󠀰󠀹󠀷|󠁬󠁶󠀰󠀹󠀹|󠁬󠁶󠀱󠀰󠀶|󠁬󠁶󠁤󠁧󠁶|󠁬󠁶󠁪󠁥󠁬|󠁬󠁶󠁪󠁵󠁲|󠁬󠁶󠁬󠁰󠁸|󠁬󠁶󠁲󠁥󠁺|󠁬󠁶󠁲󠁩󠁸|󠁬󠁶󠁶󠁥󠁮|󠁦󠁲󠁡󠁲󠁡|󠁦󠁲󠀹󠀷󠀶|󠁦󠁲󠀷󠀵󠁣|󠁦󠁲󠀶󠁡󠁥|󠁦󠁲󠀶󠀹󠁭|󠁦󠁲󠀲󠀰󠁲|󠁦󠁭󠁹󠁡󠁰|󠁭󠁡󠁡󠁧󠁤|󠁭󠁡󠁡󠁯󠁵|󠁭󠁡󠁳󠁥󠁴|󠁭󠁡󠁳󠁩󠁢|󠁭󠁡󠁳󠁩󠁦|󠁭󠁡󠁳󠁫󠁨|󠁭󠁡󠁴󠁡󠁦|󠁭󠁡󠁴󠁡󠁩|󠁭󠁡󠁴󠁡󠁯|󠁭󠁡󠁴󠁡󠁲|󠁭󠁡󠁴󠁡󠁴|󠁭󠁡󠁴󠁡󠁺|󠁭󠁡󠁴󠁥󠁴|󠁭󠁡󠁴󠁩󠁮|󠁭󠁡󠁴󠁩󠁺|󠁭󠁡󠁴󠁮󠁧|󠁭󠁡󠁴󠁮󠁴|󠁭󠁡󠁹󠁵󠁳|󠁭󠁡󠁺󠁡󠁧|󠁦󠁭󠁴󠁲󠁫|󠁦󠁭󠁰󠁮󠁩|󠁦󠁭󠁫󠁳󠁡|󠁭󠁨󠁡󠁲󠁮|󠁭󠁨󠁡󠁵󠁲|󠁭󠁨󠁥󠁢󠁯|󠁥󠁥󠀲󠀵󠀵|󠁭󠁡󠁪󠁲󠁡|󠁭󠁡󠁫󠁥󠁮|󠁭󠁡󠁫󠁥󠁳|󠁭󠁡󠁫󠁨󠁥|󠁭󠁡󠁬󠁡󠁡|󠁭󠁡󠁬󠁡󠁲|󠁭󠁡󠁭󠁡󠁲|󠁭󠁡󠁭󠁤󠁦|󠁭󠁡󠁭󠁥󠁤|󠁭󠁡󠁭󠁥󠁫|󠁭󠁡󠁭󠁩󠁤|󠁭󠁡󠁭󠁯󠁨|󠁭󠁡󠁭󠁯󠁵|󠁭󠁡󠁮󠁡󠁤|󠁭󠁡󠁮󠁯󠁵|󠁭󠁡󠁯󠁵󠁡|󠁭󠁡󠁯󠁵󠁤|󠁭󠁡󠁯󠁵󠁪|󠁭󠁡󠁯󠁵󠁺|󠁭󠁡󠁲󠁡󠁢|󠁭󠁡󠁲󠁥󠁨|󠁭󠁡󠁳󠁡󠁦|󠁭󠁡󠁳󠁡󠁬|󠁧󠁢󠁤󠁲󠁳|󠁧󠁢󠁤󠁯󠁲|󠁧󠁢󠁤󠁧󠁹|󠁧󠁢󠁤󠁥󠁶|󠁧󠁢󠁤󠁥󠁲|󠁧󠁢󠁤󠁥󠁮|󠁧󠁢󠁤󠁢󠁹|󠁧󠁢󠁤󠁡󠁬|󠁧󠁢󠁣󠁷󠁹|󠁧󠁢󠁣󠁲󠁹|󠁧󠁢󠁣󠁲󠁦|󠁧󠁢󠁣󠁯󠁶|󠁧󠁢󠁣󠁯󠁮|󠁧󠁢󠁣󠁭󠁮|󠁧󠁢󠁣󠁭󠁤|󠁧󠁢󠁣󠁭󠁡|󠁧󠁢󠁣󠁬󠁫|󠁧󠁢󠁣󠁬󠁤|󠁧󠁢󠁣󠁨󠁷|󠁧󠁢󠁣󠁨󠁥|󠁧󠁢󠁣󠁧󠁮|󠁧󠁢󠁣󠁣󠁧|󠁧󠁢󠁣󠁢󠁦|󠁧󠁢󠁣󠁡󠁹|󠁩󠁳󠁳󠁨󠁦|󠁧󠁢󠁨󠁣󠁫|󠁧󠁢󠁨󠁡󠁶|󠁧󠁢󠁧󠁷󠁮|󠁧󠁢󠁧󠁲󠁥|󠁧󠁢󠁧󠁬󠁳|󠁧󠁢󠁧󠁬󠁧|󠁧󠁢󠁧󠁡󠁴|󠁧󠁢󠁦󠁭󠁯|󠁧󠁢󠁦󠁬󠁮|󠁧󠁢󠁦󠁩󠁦|󠁧󠁢󠁦󠁡󠁬|󠁧󠁢󠁥󠁳󠁸|󠁧󠁢󠁥󠁳󠁳|󠁧󠁢󠁥󠁲󠁹|󠁧󠁢󠁥󠁲󠁷|󠁧󠁢󠁥󠁬󠁳|󠁧󠁢󠁥󠁬󠁮|󠁧󠁢󠁥󠁤󠁵|󠁧󠁢󠁥󠁤󠁨|󠁧󠁢󠁥󠁡󠁹|󠁧󠁢󠁥󠁡󠁬|󠁧󠁢󠁤󠁵󠁲|󠁧󠁢󠁤󠁵󠁤|󠁦󠁲󠁰󠁤󠁬|󠁦󠁲󠁰󠁡󠁣|󠁦󠁲󠁯󠁣󠁣|󠁦󠁲󠁮󠁯󠁲|󠁦󠁲󠁮󠁡󠁱|󠁦󠁲󠁩󠁤󠁦|󠁦󠁲󠁨󠁤󠁦|󠁦󠁲󠁧󠁥󠁳|󠁦󠁲󠁣󠁶󠁬|󠁦󠁲󠁢󠁲󠁥|󠁦󠁲󠁢󠁦󠁣|󠁬󠁶󠀰󠀰󠀲|󠁬󠁶󠀰󠀰󠀷|󠁬󠁶󠀰󠀱󠀱|󠁬󠁶󠀰󠀲󠀲|󠁬󠁶󠀰󠀲󠀶|󠁬󠁶󠀰󠀳󠀳|󠁬󠁶󠀰󠀴󠀷|󠁬󠁶󠀰󠀵󠀰|󠁬󠁶󠀰󠀵󠀲|󠁬󠁶󠀰󠀵󠀴|󠁬󠁶󠀰󠀵󠀶|󠁬󠁶󠀰󠀶󠀲|󠁭󠁡󠁳󠁥󠁦|󠁧󠁢󠁣󠁡󠁭|󠁧󠁢󠁢󠁵󠁲|󠁧󠁢󠁢󠁳󠁴|󠁧󠁢󠁢󠁲󠁹|󠁧󠁢󠁢󠁰󠁬|󠁧󠁢󠁢󠁯󠁬|󠁧󠁢󠁢󠁮󠁳|󠁧󠁢󠁢󠁮󠁨|󠁧󠁢󠁢󠁮󠁥|󠁧󠁢󠁢󠁫󠁭|󠁧󠁢󠁢󠁩󠁲|󠁧󠁢󠁢󠁧󠁷|󠁧󠁢󠁢󠁧󠁥|󠁧󠁢󠁢󠁦󠁳|󠁧󠁢󠁢󠁥󠁸|󠁧󠁢󠁢󠁥󠁮|󠁧󠁢󠁢󠁣󠁰|󠁧󠁢󠁢󠁢󠁤|󠁧󠁢󠁢󠁡󠁳|󠁧󠁢󠁡󠁮󠁳|󠁧󠁢󠁡󠁮󠁮|󠁧󠁢󠁡󠁮󠁤|󠁧󠁢󠁡󠁧󠁹|󠁢󠁥󠁷󠁨󠁴|󠁢󠁥󠁷󠁢󠁲|󠁢󠁥󠁷󠁡󠁬|󠁢󠁥󠁶󠁷󠁶|󠁢󠁥󠁶󠁯󠁶|󠁢󠁥󠁶󠁬󠁩|󠁢󠁥󠁶󠁬󠁧|󠁢󠁥󠁶󠁢󠁲|󠁢󠁥󠁶󠁡󠁮|󠁢󠁥󠁢󠁲󠁵|󠁢󠁡󠁳󠁲󠁰|󠁢󠁡󠁢󠁲󠁣|󠁢󠁡󠁢󠁩󠁨|󠁡󠁺󠁺󠁡󠁮|󠁡󠁺󠁹󠁥󠁶|󠁡󠁺󠁹󠁡󠁲|󠁡󠁺󠁸󠁶󠁤|󠁡󠁺󠁸󠁩󠁺|󠁡󠁺󠁸󠁣󠁩|󠁡󠁺󠁸󠁡󠁣|󠁢󠁦󠁫󠁯󠁷|󠁢󠁦󠁫󠁯󠁰|󠁢󠁦󠁫󠁭󠁰|󠁢󠁦󠁫󠁭󠁤|󠁺󠁡󠁫󠁺󠁮|󠁢󠁦󠁫󠁥󠁮|󠁢󠁦󠁫󠁡󠁤|󠁢󠁦󠁩󠁯󠁢|󠁢󠁦󠁨󠁯󠁵|󠁢󠁦󠁧󠁯󠁵|󠁢󠁦󠁧󠁮󠁡|󠁢󠁦󠁧󠁡󠁮|󠁢󠁦󠁣󠁯󠁭|󠁢󠁦󠁢󠁬󠁫|󠁢󠁦󠁢󠁬󠁧|󠁢󠁦󠁢󠁧󠁲|󠁢󠁦󠁢󠁡󠁺|󠁢󠁥󠁷󠁮󠁡|󠁢󠁥󠁷󠁬󠁸|󠁢󠁥󠁷󠁬󠁧|󠁡󠁺󠁱󠁡󠁢|󠁡󠁺󠁯󠁲󠁤|󠁡󠁺󠁯󠁧󠁵|󠁡󠁺󠁮󠁥󠁦|󠁦󠁲󠁣󠁯󠁲|󠁡󠁺󠁭󠁡󠁳|󠁦󠁲󠁧󠁵󠁡|󠁦󠁲󠁬󠁲󠁥|󠁡󠁺󠁬󠁥󠁲|󠁦󠁲󠁭󠁡󠁹|󠁡󠁺󠁬󠁡󠁮|󠁡󠁺󠁬󠁡󠁣|󠁡󠁺󠁫󠁵󠁲|󠁡󠁺󠁫󠁡󠁮|󠁡󠁺󠁫󠁡󠁬|󠁡󠁺󠁩󠁳󠁭|󠁡󠁺󠁩󠁭󠁩|󠁡󠁺󠁨󠁡󠁣|󠁡󠁺󠁧󠁹󠁧|󠁧󠁢󠁡󠁮󠁴|󠁡󠁺󠁵󠁣󠁡|󠁡󠁺󠁴󠁯󠁶|󠁡󠁺󠁴󠁡󠁲|󠁡󠁺󠁳󠁵󠁳|󠁡󠁺󠁳󠁭󠁸|󠁡󠁺󠁳󠁭󠁩|󠁡󠁺󠁳󠁫󠁲|󠁡󠁺󠁳󠁩󠁹|󠁡󠁺󠁳󠁢󠁮|󠁡󠁺󠁳󠁡󠁴|󠁡󠁺󠁳󠁡󠁲|󠁡󠁺󠁳󠁡󠁨|󠁡󠁺󠁳󠁡󠁤|󠁡󠁺󠁳󠁡󠁢|󠁡󠁺󠁱󠁵󠁳|󠁡󠁺󠁱󠁯󠁢|󠁡󠁺󠁱󠁢󠁩|󠁡󠁺󠁱󠁢󠁡|󠁡󠁺󠁱󠁡󠁺|󠁴󠁶󠁮󠁫󠁬|󠁴󠁶󠁮󠁭󠁡|󠁴󠁶󠁮󠁭󠁧|󠁴󠁶󠁮󠁵󠁩|󠁴󠁶󠁶󠁡󠁩|󠁴󠁷󠁣󠁨󠁡|󠁴󠁷󠁣󠁹󠁩|󠁴󠁷󠁣󠁹󠁱|󠁴󠁷󠁨󠁳󠁱|󠁴󠁷󠁨󠁳󠁺|󠁴󠁷󠁨󠁵󠁡|󠁴󠁷󠁩󠁬󠁡|󠁴󠁷󠁫󠁥󠁥|󠁴󠁷󠁫󠁨󠁨|󠁴󠁷󠁫󠁩󠁮|󠁴󠁷󠁬󠁩󠁥|󠁴󠁷󠁭󠁩󠁡|󠁴󠁷󠁮󠁡󠁮|󠁴󠁷󠁮󠁷󠁴|󠁴󠁷󠁰󠁥󠁮|󠁣󠁧󠁢󠁺󠁶|󠁣󠁦󠁢󠁧󠁦|󠁴󠁴󠁡󠁲󠁩|󠁴󠁴󠁣󠁨󠁡|󠁴󠁴󠁣󠁴󠁴|󠁴󠁴󠁤󠁭󠁮|󠁴󠁴󠁭󠁲󠁣|󠁴󠁴󠁰󠁥󠁤|󠁴󠁴󠁰󠁯󠁳|󠁴󠁴󠁰󠁲󠁴|󠁴󠁴󠁰󠁴󠁦|󠁴󠁴󠁳󠁦󠁯|󠁴󠁴󠁳󠁧󠁥|󠁴󠁴󠁳󠁩󠁰|󠁴󠁴󠁳󠁪󠁬|󠁴󠁴󠁴󠁯󠁢|󠁴󠁴󠁴󠁵󠁰|󠁴󠁶󠁦󠁵󠁮|󠁴󠁶󠁮󠁩󠁴|󠁴󠁶󠁮󠁫󠁦|󠁢󠁦󠁴󠁵󠁩|󠁢󠁦󠁴󠁡󠁰|󠁢󠁦󠁳󠁯󠁲|󠁢󠁦󠁳󠁯󠁭|󠁢󠁦󠁳󠁮󠁧|󠁢󠁦󠁳󠁭󠁴|󠁢󠁦󠁳󠁩󠁳|󠁢󠁦󠁳󠁥󠁮|󠁢󠁦󠁰󠁯󠁮|󠁢󠁦󠁰󠁡󠁳|󠁢󠁦󠁯󠁵󠁤|󠁢󠁦󠁯󠁵󠁢|󠁢󠁦󠁮󠁯󠁵|󠁢󠁦󠁮󠁡󠁹|󠁢󠁦󠁮󠁡󠁯|󠁢󠁦󠁮󠁡󠁭|󠁢󠁦󠁭󠁯󠁵|󠁢󠁦󠁬󠁯󠁲|󠁢󠁦󠁬󠁥󠁲|󠁡󠁺󠁱󠁡󠁸|󠁴󠁷󠁰󠁩󠁦|󠁴󠁷󠁴󠁡󠁯|󠁴󠁷󠁴󠁮󠁮|󠁴󠁷󠁴󠁰󠁥|󠁴󠁷󠁴󠁴󠁴|󠁴󠁷󠁴󠁸󠁧|󠁴󠁷󠁹󠁵󠁮|󠁢󠁺󠁴󠁯󠁬|󠁢󠁺󠁣󠁺󠁬|󠁶󠁵󠁭󠁡󠁰|󠁶󠁵󠁰󠁡󠁭|󠁶󠁵󠁳󠁡󠁭|󠁶󠁵󠁳󠁥󠁥|󠁶󠁵󠁴󠁡󠁥|󠁶󠁵󠁴󠁯󠁢|󠁢󠁦󠁺󠁯󠁵|󠁢󠁦󠁺󠁯󠁮|󠁢󠁦󠁺󠁩󠁲|󠁢󠁦󠁹󠁡󠁴|󠁢󠁦󠁹󠁡󠁧|󠁬󠁶󠀰󠀵󠀷|󠁬󠁶󠀰󠀶󠀹|󠁬󠁶󠀰󠀹󠀰|󠁬󠁶󠀰󠀹󠀸|󠁬󠁶󠀱󠀰󠀰|󠁬󠁶󠀱󠀱󠀰|󠁬󠁶󠁪󠁫󠁢|󠁬󠁶󠁶󠁭󠁲|󠁭󠁡󠁭󠁭󠁤|󠁭󠁡󠁭󠁭󠁮|󠁭󠁡󠁳󠁹󠁢|󠁭󠁲󠁮󠁫󠁣|󠁡󠁯󠁨󠁵󠁡|󠁡󠁯󠁣󠁵󠁳|󠁡󠁯󠁣󠁣󠁵|󠁡󠁯󠁣󠁡󠁢|󠁡󠁯󠁢󠁩󠁥|󠁡󠁯󠁢󠁧󠁵|󠁡󠁯󠁢󠁧󠁯|󠁭󠁸󠁤󠁩󠁦|󠁫󠁺󠁫󠁵󠁳|󠁫󠁺󠁫󠁺󠁹|󠁫󠁺󠁭󠁡󠁮|󠁫󠁺󠁰󠁡󠁶|󠁫󠁺󠁳󠁥󠁶|󠁫󠁺󠁳󠁨󠁹|󠁫󠁺󠁶󠁯󠁳|󠁫󠁺󠁹󠁵󠁺|󠁫󠁺󠁺󠁡󠁰|󠁫󠁺󠁺󠁨󠁡|󠁡󠁯󠁬󠁵󠁡|󠁡󠁯󠁬󠁳󠁵|󠁡󠁯󠁬󠁮󠁯|󠁡󠁯󠁨󠁵󠁩|󠁬󠁶󠀰󠀰󠀱|󠁬󠁶󠀰󠀱󠀰|󠁬󠁶󠀰󠀴󠀰|󠁬󠁶󠀰󠀵󠀱|󠁬󠁶󠀰󠀵󠀳|󠁬󠁶󠀰󠀵󠀵|󠁡󠁦󠁫󠁡󠁮|󠁡󠁦󠁫󠁡󠁢|󠁡󠁦󠁪󠁯󠁷|󠁡󠁦󠁨󠁥󠁲|󠁡󠁦󠁨󠁥󠁬|󠁡󠁦󠁧󠁨󠁯|󠁡󠁦󠁧󠁨󠁡|󠁡󠁦󠁦󠁹󠁢|󠁡󠁦󠁦󠁲󠁡|󠁡󠁦󠁤󠁡󠁹|󠁡󠁦󠁢󠁧󠁬|󠁡󠁦󠁢󠁤󠁳|󠁡󠁦󠁢󠁤󠁧|󠁴󠁴󠁥󠁴󠁯|󠁴󠁴󠁲󠁣󠁭|󠁴󠁴󠁷󠁴󠁯|󠁴󠁷󠁫󠁨󠁱|󠁴󠁷󠁴󠁮󠁱|󠁴󠁷󠁴󠁰󠁱|󠁴󠁷󠁴󠁸󠁱|󠁡󠁦󠁺󠁡󠁢|󠁡󠁦󠁷󠁡󠁲|󠁡󠁦󠁵󠁲󠁵|󠁡󠁦󠁴󠁡󠁫|󠁡󠁦󠁳󠁡󠁲|󠁡󠁦󠁳󠁡󠁭|󠁡󠁦󠁰󠁫󠁡|󠁡󠁦󠁰󠁩󠁡|󠁡󠁦󠁰󠁡󠁲|󠁡󠁦󠁰󠁡󠁮|󠁡󠁦󠁮󠁵󠁲|󠁡󠁦󠁮󠁩󠁭|󠁡󠁦󠁮󠁡󠁮|󠁡󠁦󠁬󠁯󠁧|󠁡󠁦󠁬󠁡󠁧|󠁡󠁦󠁫󠁮󠁲|󠁰󠁨󠁭󠁡󠁧|󠁡󠁦󠁫󠁨󠁯|󠁡󠁦󠁫󠁤󠁺|󠁧󠁢󠁭󠁦󠁴|󠁧󠁢󠁭󠁹󠁬|󠁧󠁢󠁮󠁤󠁮|󠁧󠁢󠁮󠁴󠁡|󠁧󠁢󠁮󠁴󠁨|󠁧󠁢󠁮󠁹󠁭|󠁧󠁢󠁯󠁭󠁨|󠁧󠁢󠁰󠁯󠁬|󠁧󠁢󠁳󠁴󠁢|󠁧󠁢󠁵󠁫󠁭|󠁡󠁺󠁧󠁯󠁹|󠁡󠁺󠁧󠁯󠁲|󠁡󠁺󠁧󠁡󠁤|󠁡󠁺󠁦󠁵󠁺|󠁡󠁺󠁤󠁡󠁳|󠁡󠁺󠁣󠁵󠁬|󠁡󠁺󠁣󠁡󠁬|󠁡󠁺󠁣󠁡󠁢|󠁡󠁺󠁢󠁩󠁬|󠁡󠁺󠁢󠁥󠁹|󠁧󠁢󠁡󠁲󠁤|󠁧󠁢󠁡󠁲󠁭|󠁧󠁢󠁢󠁬󠁡|󠁧󠁢󠁢󠁬󠁹|󠁧󠁢󠁢󠁭󠁨|󠁧󠁢󠁢󠁮󠁢|󠁧󠁢󠁣󠁧󠁶|󠁧󠁢󠁣󠁫󠁦|󠁧󠁢󠁣󠁫󠁴|󠁧󠁢󠁣󠁬󠁲|󠁧󠁢󠁣󠁳󠁲|󠁧󠁢󠁤󠁧󠁮|󠁧󠁢󠁤󠁯󠁷|󠁧󠁢󠁤󠁲󠁹|󠁧󠁢󠁥󠁡󠁷|󠁧󠁢󠁦󠁥󠁲|󠁧󠁢󠁧󠁢󠁮|󠁧󠁢󠁬󠁭󠁶|󠁧󠁢󠁬󠁲󠁮|󠁧󠁢󠁬󠁳󠁢|󠁩󠁳󠁨󠁥󠁬|󠁩󠁳󠁨󠁵󠁴|󠁩󠁳󠁳󠁢󠁨|󠁩󠁳󠁳󠁥󠁹|󠁩󠁳󠁳󠁫󠁵|󠁩󠁳󠁳󠁳󠁦|󠁡󠁯󠁺󠁡󠁩|󠁡󠁯󠁵󠁩󠁧|󠁡󠁯󠁮󠁡󠁭|󠁡󠁯󠁭󠁯󠁸|󠁡󠁯󠁭󠁡󠁬|󠁫󠁺󠁡󠁫󠁭|󠁫󠁺󠁡󠁫󠁴|󠁫󠁺󠁡󠁬󠁡|󠁫󠁺󠁡󠁬󠁭|󠁫󠁺󠁡󠁳󠁴|󠁫󠁺󠁡󠁴󠁹|󠁫󠁺󠁢󠁡󠁹|󠁫󠁺󠁫󠁡󠁲|󠁡󠁦󠁫󠁡󠁰|󠁡󠁺󠁢󠁡󠁲|󠁡󠁺󠁢󠁡󠁬|󠁡󠁺󠁢󠁡󠁢|󠁡󠁺󠁡󠁳󠁴|󠁡󠁺󠁡󠁧󠁵|󠁡󠁺󠁡󠁧󠁳|󠁡󠁺󠁡󠁧󠁭|󠁡󠁺󠁡󠁧󠁣|󠁡󠁺󠁡󠁧󠁡|󠁡󠁺󠁡󠁢󠁳|󠁡󠁵󠁶󠁩󠁣|󠁡󠁵󠁴󠁡󠁳|󠁡󠁵󠁱󠁬󠁤|󠁡󠁵󠁮󠁳󠁷|󠁡󠁵󠁡󠁣󠁴|󠁩󠁳󠁡󠁫󠁨|󠁩󠁳󠁢󠁦󠁪|󠁩󠁳󠁢󠁬󠁯|󠁩󠁳󠁤󠁪󠁵|󠁩󠁳󠁦󠁬󠁤|󠁰󠁳󠁮󠁧󠁺|󠁰󠁳󠁮󠁢󠁳|󠁰󠁳󠁫󠁹󠁳|󠁰󠁳󠁪󠁲󠁨|󠁰󠁳󠁨󠁢󠁮|󠁰󠁳󠁧󠁺󠁡|󠁰󠁳󠁤󠁥󠁢|󠁰󠁳󠁢󠁴󠁨|󠁰󠁨󠁺󠁳󠁩|󠁰󠁨󠁺󠁭󠁢|󠁰󠁨󠁺󠁡󠁳|󠁰󠁨󠁺󠁡󠁮|󠁣󠁯󠁭󠁡󠁧|󠁣󠁯󠁬󠁡󠁧|󠁰󠁨󠁷󠁳󠁡|󠁣󠁯󠁨󠁵󠁩|󠁣󠁯󠁧󠁵󠁶|󠁣󠁯󠁧󠁵󠁡|󠁰󠁨󠁴󠁡󠁷|󠁰󠁷󠀳󠀷󠀰|󠁰󠁷󠀳󠀵󠀰|󠁰󠁷󠀲󠀲󠀴|󠁰󠁷󠀲󠀲󠀲|󠁰󠁷󠀲󠀱󠀸|󠁰󠁷󠀲󠀱󠀴|󠁰󠁷󠀲󠀱󠀲|󠁰󠁷󠀱󠀵󠀰|󠁰󠁷󠀱󠀰󠀰|󠁰󠁷󠀰󠀵󠀰|󠁰󠁷󠀰󠀱󠀰|󠁰󠁷󠀰󠀰󠀴|󠁰󠁷󠀰󠀰󠀲|󠁰󠁳󠁴󠁫󠁭|󠁰󠁳󠁴󠁢󠁳|󠁰󠁳󠁳󠁬󠁴|󠁰󠁳󠁲󠁦󠁨|󠁰󠁳󠁲󠁢󠁨|󠁰󠁳󠁱󠁱󠁡|󠁰󠁨󠁳󠁬󠁵|󠁰󠁨󠁳󠁬󠁥|󠁰󠁨󠁳󠁩󠁧|󠁰󠁨󠁳󠁣󠁯|󠁰󠁨󠁳󠁡󠁲|󠁰󠁨󠁲󠁯󠁭|󠁰󠁨󠁲󠁩󠁺|󠁰󠁨󠁱󠁵󠁩|󠁰󠁨󠁱󠁵󠁥|󠁰󠁨󠁰󠁬󠁷|󠁰󠁨󠁮󠁵󠁶|󠁰󠁨󠁮󠁵󠁥|󠁰󠁨󠁮󠁳󠁡|󠁰󠁨󠁮󠁥󠁲|󠁰󠁨󠁮󠁥󠁣|󠁰󠁨󠁮󠁣󠁯|󠁰󠁨󠁭󠁳󠁲|󠁰󠁨󠁭󠁳󠁣|󠁰󠁨󠁭󠁯󠁵|󠁣󠁯󠁣󠁵󠁮|󠁣󠁯󠁣󠁯󠁲|󠁣󠁯󠁣󠁨󠁯|󠁣󠁯󠁣󠁥󠁳|󠁣󠁯󠁣󠁡󠁵|󠁰󠁨󠁴󠁡󠁲|󠁣󠁯󠁣󠁡󠁳|󠁣󠁯󠁣󠁡󠁱|󠁣󠁯󠁣󠁡󠁬|󠁣󠁯󠁢󠁯󠁹|󠁣󠁯󠁢󠁯󠁬|󠁣󠁯󠁡󠁴󠁬|󠁣󠁯󠁡󠁲󠁡|󠁣󠁯󠁡󠁮󠁴|󠁣󠁯󠁡󠁭󠁡|󠁰󠁨󠁳󠁵󠁲|󠁰󠁨󠁳󠁵󠁮|󠁰󠁨󠁳󠁵󠁫|󠁰󠁨󠁳󠁯󠁲|󠁲󠁵󠁰󠁲󠁩|󠁲󠁵󠁰󠁳󠁫|󠁲󠁵󠁲󠁯󠁳|󠁲󠁵󠁲󠁹󠁡|󠁣󠁯󠁴󠁯󠁬|󠁲󠁵󠁳󠁡󠁫|󠁲󠁵󠁳󠁡󠁭|󠁲󠁵󠁳󠁡󠁲|󠁣󠁯󠁳󠁵󠁣|󠁲󠁵󠁳󠁭󠁯|󠁲󠁵󠁳󠁰󠁥|󠁲󠁵󠁳󠁴󠁡|󠁲󠁵󠁳󠁶󠁥|󠁣󠁯󠁳󠁡󠁰|󠁲󠁵󠁴󠁡󠁭|󠁲󠁵󠁴󠁯󠁭|󠁣󠁯󠁶󠁩󠁤|󠁲󠁵󠁴󠁵󠁬|󠁲󠁵󠁫󠁯󠁳|󠁲󠁵󠁬󠁥󠁮|󠁲󠁵󠁬󠁩󠁰|󠁲󠁵󠁭󠁡󠁧|󠁲󠁵󠁫󠁹󠁡|󠁣󠁯󠁶󠁡󠁵|󠁣󠁯󠁶󠁡󠁣|󠁲󠁵󠁭󠁯󠁳|󠁲󠁵󠁭󠁯󠁷|󠁲󠁵󠁫󠁲󠁳|󠁲󠁵󠁭󠁵󠁲|󠁲󠁵󠁮󠁥󠁮|󠁲󠁵󠁮󠁧󠁲|󠁲󠁵󠁮󠁩󠁺|󠁲󠁵󠁮󠁶󠁳|󠁲󠁵󠁯󠁭󠁳|󠁲󠁵󠁯󠁲󠁥|󠁲󠁵󠁯󠁲󠁬|󠁲󠁵󠁰󠁥󠁲|󠁲󠁵󠁰󠁮󠁺|󠁲󠁵󠁹󠁡󠁲|󠁲󠁵󠁩󠁶󠁡|󠁲󠁵󠁩󠁲󠁫|󠁲󠁵󠁹󠁥󠁶|󠁲󠁵󠁺󠁡󠁢|󠁣󠁯󠁱󠁵󠁩|󠁣󠁯󠁰󠁵󠁴|󠁣󠁯󠁮󠁳󠁡|󠁲󠁵󠁣󠁨󠁵|󠁲󠁵󠁣󠁨󠁥|󠁲󠁵󠁢󠁲󠁹|󠁣󠁯󠁮󠁡󠁲|󠁲󠁵󠁢󠁥󠁬|󠁣󠁯󠁭󠁥󠁴|󠁲󠁵󠁡󠁳󠁴|󠁲󠁵󠁡󠁲󠁫|󠁲󠁵󠁡󠁭󠁵|󠁲󠁵󠁡󠁬󠁴|󠁰󠁹󠁡󠁳󠁵|󠁲󠁵󠁫󠁬󠁵|󠁲󠁵󠁴󠁶󠁥|󠁲󠁵󠁫󠁩󠁲|󠁲󠁵󠁫󠁨󠁭|󠁲󠁵󠁫󠁨󠁡|󠁲󠁵󠁫󠁧󠁮|󠁣󠁯󠁳󠁡󠁮|󠁲󠁵󠁫󠁧󠁤|󠁲󠁵󠁫󠁥󠁭|󠁲󠁵󠁫󠁤󠁡|󠁲󠁵󠁴󠁹󠁵|󠁲󠁵󠁫󠁡󠁭|󠁣󠁯󠁲󠁩󠁳|󠁲󠁵󠁵󠁬󠁹|󠁲󠁵󠁶󠁧󠁧|󠁲󠁵󠁶󠁬󠁡|󠁲󠁵󠁶󠁬󠁧|󠁲󠁵󠁶󠁯󠁲|󠁰󠁨󠁤󠁡󠁳|󠁰󠁨󠁬󠁡󠁧|󠁰󠁨󠁤󠁡󠁯|󠁰󠁨󠁣󠁯󠁭|󠁰󠁨󠁣󠁥󠁢|󠁰󠁨󠁣󠁡󠁶|󠁰󠁨󠁤󠁡󠁶|󠁰󠁨󠁫󠁡󠁬|󠁰󠁨󠁣󠁡󠁰|󠁰󠁨󠁩󠁳󠁡|󠁰󠁨󠁣󠁡󠁧|󠁰󠁨󠁢󠁴󠁮|󠁰󠁨󠁤󠁩󠁮|󠁰󠁨󠁩󠁬󠁳|󠁧󠁢󠁡󠁧󠁢|󠁰󠁨󠁤󠁶󠁯|󠁰󠁨󠁥󠁡󠁳|󠁰󠁨󠁡󠁮󠁴|󠁰󠁨󠁧󠁵󠁩|󠁰󠁨󠁡󠁰󠁡|󠁰󠁨󠁡󠁵󠁲|󠁰󠁨󠁢󠁡󠁮|󠁰󠁨󠁢󠁡󠁳|󠁰󠁨󠁢󠁥󠁮|󠁰󠁨󠁢󠁴󠁧|󠁰󠁨󠁢󠁩󠁬|󠁰󠁨󠁩󠁬󠁮|󠁰󠁨󠁩󠁬󠁩|󠁰󠁨󠁩󠁦󠁵|󠁲󠁵󠁹󠁡󠁮|󠁰󠁨󠁭󠁧󠁳|󠁰󠁨󠁭󠁧󠁮|󠁰󠁨󠁭󠁤󠁲|󠁰󠁨󠁭󠁤󠁣|󠁰󠁨󠁭󠁡󠁳|󠁰󠁨󠁭󠁡󠁤|󠁰󠁨󠁬󠁵󠁮|󠁰󠁨󠁬󠁥󠁹|󠁰󠁨󠁬󠁡󠁳|󠁰󠁨󠁬󠁡󠁮|󠁰󠁨󠁢󠁯󠁨|󠁥󠁥󠀷󠀹|󠁥󠁥󠀷󠀱|󠁣󠁶󠁰󠁡|󠁣󠁶󠁰󠁮|󠁣󠁶󠁰󠁲|󠁣󠁶󠁲󠁢|󠁡󠁺󠁮󠁡|󠁣󠁶󠁲󠁧|󠁣󠁵󠀰󠀱|󠁧󠁮󠁹󠁯|󠁥󠁥󠀶󠀸|󠁣󠁶󠁲󠁳|󠁣󠁶󠁳󠁤|󠁣󠁶󠁳󠁦|󠁣󠁶󠁳󠁯|󠁣󠁲󠁳󠁪|󠁡󠁺󠁮󠁶|󠁡󠁺󠁮󠁸|󠁧󠁮󠁮󠁺|󠁣󠁶󠁭󠁯|󠁣󠁶󠁭󠁡|󠁡󠁺󠁬󠁡|󠁥󠁥󠀸󠀱|󠁣󠁵󠀹󠀹|󠁥󠁥󠀸󠀴|󠁣󠁶󠁢󠁲|󠁧󠁮󠁰󠁩|󠁥󠁥󠀸󠀷|󠁡󠁺󠁭󠁩|󠁣󠁶󠁣󠁲|󠁣󠁶󠁣󠁦|󠁧󠁮󠁳󠁩|󠁧󠁮󠁴󠁥|󠁣󠁶󠁣󠁡|󠁣󠁶󠁢󠁶|󠁧󠁮󠁴󠁯|󠁥󠁥󠀷󠀴|󠁧󠁱󠁡󠁮|󠁧󠁹󠁵󠁴|󠁨󠁮󠁡󠁴|󠁨󠁮󠁣󠁨|󠁡󠁥󠁳󠁨|󠁨󠁮󠁣󠁰|󠁨󠁮󠁣󠁲|󠁨󠁮󠁥󠁰|󠁨󠁮󠁦󠁭|󠁨󠁮󠁧󠁤|󠁨󠁮󠁩󠁢|󠁨󠁮󠁩󠁮|󠁥󠁧󠁢󠁡|󠁨󠁮󠁬󠁥|󠁨󠁮󠁬󠁰|󠁨󠁮󠁯󠁣|󠁨󠁮󠁯󠁬|󠁨󠁮󠁳󠁢|󠁨󠁮󠁶󠁡|󠁨󠁮󠁹󠁯|󠁡󠁥󠁲󠁫|󠁡󠁥󠁦󠁵|󠁡󠁥󠁤󠁵|󠁡󠁥󠁡󠁺|󠁡󠁥󠁡󠁪|󠁨󠁴󠁡󠁲|󠁨󠁴󠁣󠁥|󠁧󠁱󠁢󠁮|󠁧󠁱󠁢󠁳|󠁧󠁱󠁣󠁳|󠁧󠁱󠁤󠁪|󠁧󠁱󠁫󠁮|󠁧󠁱󠁬󠁩|󠁧󠁱󠁷󠁮|󠁧󠁲󠀶󠀹|󠁧󠁷󠁢󠁡|󠁧󠁷󠁢󠁳|󠁡󠁺󠁳󠁡|󠁧󠁷󠁣󠁡|󠁡󠁥󠁵󠁱|󠁧󠁷󠁧󠁡|󠁧󠁷󠁯󠁩|󠁧󠁷󠁱󠁵|󠁧󠁷󠁴󠁯|󠁧󠁹󠁢󠁡|󠁧󠁹󠁣󠁵|󠁧󠁹󠁤󠁥|󠁧󠁹󠁥󠁢|󠁧󠁹󠁥󠁳|󠁧󠁹󠁭󠁡|󠁧󠁹󠁰󠁭|󠁧󠁹󠁰󠁴|󠁧󠁨󠁣󠁰|󠁧󠁨󠁥󠁰|󠁧󠁨󠁮󠁥|󠁧󠁨󠁮󠁰|󠁧󠁨󠁯󠁴|󠁧󠁨󠁳󠁶|󠁧󠁨󠁴󠁶|󠁧󠁨󠁵󠁥|󠁧󠁨󠁵󠁷|󠁧󠁨󠁷󠁮|󠁧󠁨󠁷󠁰|󠁤󠁪󠁴󠁡|󠁤󠁪󠁯󠁢|󠁤󠁥󠁴󠁨|󠁤󠁥󠁳󠁴|󠁤󠁥󠁳󠁮|󠁤󠁥󠁳󠁬|󠁤󠁥󠁳󠁨|󠁤󠁥󠁲󠁰|󠁤󠁥󠁮󠁷|󠁤󠁥󠁮󠁩|󠁤󠁥󠁭󠁶|󠁤󠁥󠁨󠁨|󠁤󠁥󠁨󠁥|󠁧󠁬󠁡󠁶|󠁧󠁬󠁫󠁵|󠁧󠁬󠁱󠁥|󠁡󠁭󠁳󠁨|󠁡󠁭󠁳󠁵|󠁡󠁭󠁴󠁶|󠁡󠁭󠁶󠁤|󠁡󠁭󠁬󠁯|󠁡󠁭󠁫󠁴|󠁡󠁭󠁧󠁲|󠁡󠁭󠁥󠁲|󠁡󠁭󠁡󠁶|󠁡󠁭󠁡󠁲|󠁡󠁭󠁡󠁧|󠁧󠁤󠀱󠀰|󠁧󠁥󠁡󠁢|󠁧󠁥󠁡󠁪|󠁧󠁥󠁧󠁵|󠁧󠁥󠁩󠁭|󠁧󠁥󠁫󠁡|󠁧󠁥󠁫󠁫|󠁧󠁥󠁭󠁭|󠁧󠁥󠁲󠁬|󠁧󠁥󠁳󠁺|󠁧󠁥󠁴󠁢|󠁧󠁨󠁡󠁡|󠁧󠁨󠁡󠁦|󠁧󠁨󠁡󠁨|󠁧󠁨󠁢󠁥|󠁧󠁨󠁢󠁯|󠁤󠁥󠁢󠁢|󠁣󠁺󠀸󠀰|󠁥󠁥󠀴󠀵|󠁣󠁺󠀷󠀲|󠁣󠁺󠀷󠀱|󠁣󠁺󠀶󠀴|󠁣󠁺󠀶󠀳|󠁥󠁥󠀵󠀰|󠁣󠁺󠀵󠀳|󠁡󠁺󠁧󠁡|󠁣󠁺󠀵󠀲|󠁣󠁺󠀵󠀱|󠁥󠁥󠀵󠀲|󠁣󠁺󠀴󠀲|󠁣󠁺󠀴󠀱|󠁥󠁥󠀵󠀶|󠁣󠁺󠀳󠀲|󠁣󠁺󠀳󠀱|󠁥󠁥󠀶󠀰|󠁣󠁺󠀲󠀰|󠁣󠁺󠀱󠀰|󠁣󠁶󠁴󠁳|󠁣󠁶󠁴󠁡|󠁣󠁶󠁳󠁶|󠁥󠁥󠀶󠀴|󠁣󠁶󠁳󠁳|󠁧󠁹󠁵󠁤|󠁧󠁬󠁱󠁴|󠁧󠁬󠁳󠁭|󠁧󠁮󠁢󠁫|󠁧󠁮󠁣󠁯|󠁧󠁮󠁤󠁢|󠁧󠁮󠁤󠁩|󠁧󠁮󠁤󠁬|󠁧󠁮󠁤󠁵|󠁤󠁥󠁨󠁢|󠁤󠁥󠁢󠁹|󠁧󠁮󠁦󠁡|󠁧󠁮󠁦󠁯|󠁧󠁮󠁦󠁲|󠁧󠁮󠁧󠁡|󠁧󠁮󠁧󠁵|󠁡󠁵󠁮󠁴|󠁡󠁵󠁳󠁡|󠁧󠁮󠁫󠁳|󠁡󠁵󠁷󠁡|󠁧󠁮󠁬󠁡|󠁧󠁮󠁬󠁥|󠁧󠁮󠁬󠁯|󠁥󠁥󠀳󠀷|󠁥󠁥󠀳󠀹|󠁤󠁥󠁢󠁷|󠁤󠁥󠁢󠁥|󠁡󠁺󠁢󠁡|󠁣󠁨󠁢󠁥|󠁣󠁨󠁡󠁲|󠁣󠁨󠁡󠁩|󠁣󠁨󠁡󠁧|󠁣󠁮󠁧󠁤|󠁣󠁦󠁶󠁫|󠁣󠁦󠁵󠁫|󠁣󠁦󠁳󠁥|󠁣󠁦󠁯󠁰|󠁣󠁦󠁮󠁭|󠁣󠁦󠁭󠁰|󠁣󠁦󠁭󠁢|󠁣󠁦󠁬󠁢|󠁣󠁦󠁫󠁧|󠁣󠁦󠁫󠁢|󠁣󠁦󠁨󠁳|󠁣󠁦󠁨󠁭|󠁣󠁦󠁨󠁫|󠁣󠁦󠁢󠁫|󠁣󠁮󠁧󠁳|󠁣󠁩󠁢󠁳|󠁣󠁩󠁡󠁢|󠁣󠁨󠁶󠁳|󠁣󠁨󠁶󠁤|󠁣󠁨󠁵󠁲|󠁣󠁨󠁴󠁩|󠁣󠁨󠁴󠁧|󠁣󠁨󠁳󠁺|󠁣󠁨󠁳󠁯|󠁣󠁨󠁯󠁷|󠁣󠁨󠁮󠁷|󠁣󠁨󠁮󠁥|󠁣󠁨󠁬󠁵|󠁣󠁨󠁪󠁵|󠁣󠁨󠁧󠁲|󠁣󠁨󠁧󠁬|󠁣󠁨󠁧󠁥|󠁣󠁨󠁦󠁲|󠁣󠁨󠁢󠁳|󠁣󠁨󠁢󠁬|󠁣󠁤󠁨󠁵|󠁣󠁤󠁥󠁱|󠁣󠁤󠁢󠁵|󠁣󠁤󠁢󠁣|󠁣󠁡󠁹󠁴|󠁣󠁡󠁳󠁫|󠁣󠁡󠁱󠁣|󠁣󠁡󠁰󠁥|󠁣󠁡󠁯󠁮|󠁣󠁡󠁮󠁬|󠁣󠁡󠁮󠁢|󠁣󠁡󠁭󠁢|󠁣󠁡󠁢󠁣|󠁣󠁡󠁡󠁢|󠁣󠁮󠁧󠁸|󠁣󠁮󠁧󠁺|󠁣󠁮󠁨󠁥|󠁣󠁮󠁨󠁩|󠁣󠁮󠁨󠁮|󠁣󠁮󠁪󠁬|󠁣󠁦󠁢󠁢|󠁣󠁦󠁡󠁣|󠁣󠁤󠁴󠁵|󠁣󠁤󠁴󠁯|󠁣󠁤󠁴󠁡|󠁣󠁤󠁳󠁵|󠁣󠁤󠁳󠁫|󠁣󠁤󠁳󠁡|󠁣󠁤󠁮󠁵|󠁣󠁤󠁮󠁫|󠁣󠁤󠁭󠁡|󠁣󠁤󠁬󠁵|󠁣󠁤󠁬󠁯|󠁣󠁤󠁫󠁳|󠁣󠁤󠁫󠁮|󠁣󠁤󠁫󠁬|󠁣󠁤󠁫󠁧|󠁣󠁤󠁫󠁥|󠁣󠁤󠁫󠁣|󠁣󠁤󠁩󠁴|󠁣󠁬󠁭󠁬|󠁣󠁬󠁭󠁡|󠁣󠁬󠁬󠁲|󠁣󠁬󠁬󠁬|󠁣󠁬󠁬󠁩|󠁣󠁬󠁣󠁯|󠁣󠁬󠁢󠁩|󠁣󠁬󠁡󠁴|󠁣󠁬󠁡󠁲|󠁥󠁳󠁨󠁵|󠁥󠁳󠁩󠁢|󠁥󠁳󠁬󠁥|󠁥󠁳󠁬󠁯|󠁣󠁬󠁡󠁰|󠁣󠁬󠁡󠁮|󠁣󠁬󠁡󠁩|󠁥󠁳󠁬󠁵|󠁥󠁳󠁭󠁡|󠁣󠁩󠁺󠁺|󠁥󠁳󠁭󠁬|󠁣󠁮󠁦󠁪|󠁣󠁮󠁣󠁱|󠁣󠁮󠁢󠁪|󠁣󠁮󠁡󠁨|󠁣󠁭󠁳󠁷|󠁣󠁭󠁳󠁵|󠁣󠁭󠁯󠁵|󠁥󠁳󠁧󠁲|󠁣󠁭󠁮󠁷|󠁣󠁭󠁮󠁯|󠁣󠁭󠁬󠁴|󠁣󠁭󠁥󠁳|󠁣󠁭󠁥󠁮|󠁣󠁭󠁣󠁥|󠁣󠁭󠁡󠁤|󠁣󠁬󠁶󠁳|󠁣󠁬󠁴󠁡|󠁣󠁬󠁲󠁭|󠁥󠁳󠁧󠁵|󠁣󠁬󠁮󠁢|󠁣󠁩󠁶󠁢|󠁣󠁩󠁳󠁶|󠁥󠁴󠁡󠁡|󠁣󠁩󠁳󠁭|󠁥󠁴󠁡󠁦|󠁥󠁴󠁡󠁭|󠁥󠁴󠁢󠁥|󠁥󠁴󠁤󠁤|󠁥󠁴󠁧󠁡|󠁣󠁩󠁭󠁧|󠁥󠁴󠁨󠁡|󠁥󠁴󠁯󠁲|󠁥󠁴󠁳󠁩|󠁣󠁩󠁬󠁧|󠁥󠁴󠁳󠁷|󠁥󠁴󠁴󠁩|󠁣󠁩󠁬󠁣|󠁣󠁩󠁧󠁤|󠁣󠁩󠁤󠁮|󠁣󠁩󠁣󠁭|󠁥󠁳󠁭󠁵|󠁣󠁩󠁹󠁭|󠁥󠁳󠁮󠁡|󠁥󠁳󠁮󠁣|󠁥󠁳󠁯󠁲|󠁥󠁳󠁰󠁭|󠁥󠁳󠁰󠁯|󠁥󠁳󠁰󠁶|󠁥󠁳󠁲󠁩|󠁥󠁳󠁳󠁡|󠁥󠁳󠁳󠁥|󠁥󠁳󠁳󠁧|󠁥󠁳󠁳󠁯|󠁥󠁳󠁳󠁳|󠁣󠁩󠁷󠁲|󠁥󠁳󠁴󠁯|󠁥󠁳󠁶󠁡|󠁥󠁳󠁶󠁣|󠁥󠁳󠁶󠁩|󠁢󠁮󠁴󠁵|󠁢󠁮󠁴󠁥|󠁢󠁮󠁢󠁭|󠁢󠁮󠁢󠁥|󠁢󠁪󠁺󠁯|󠁢󠁪󠁰󠁬|󠁢󠁪󠁯󠁵|󠁢󠁪󠁭󠁯|󠁢󠁪󠁬󠁩|󠁢󠁪󠁫󠁯|󠁢󠁪󠁤󠁯|󠁢󠁪󠁣󠁯|󠁢󠁪󠁢󠁯|󠁢󠁪󠁡󠁱|󠁢󠁩󠁲󠁹|󠁢󠁩󠁲󠁴|󠁢󠁩󠁲󠁭|󠁢󠁩󠁮󠁧|󠁢󠁩󠁭󠁹|󠁢󠁩󠁭󠁷|󠁢󠁲󠁴󠁯|󠁢󠁲󠁳󠁰|󠁢󠁲󠁳󠁥|󠁢󠁲󠁳󠁣|󠁢󠁲󠁲󠁪|󠁢󠁲󠁰󠁲|󠁢󠁲󠁰󠁩|󠁢󠁲󠁰󠁥|󠁢󠁲󠁭󠁧|󠁢󠁲󠁭󠁡|󠁢󠁲󠁧󠁯|󠁢󠁲󠁥󠁳|󠁢󠁲󠁤󠁦|󠁢󠁲󠁣󠁥|󠁢󠁲󠁢󠁡|󠁢󠁲󠁡󠁰|󠁢󠁲󠁡󠁣|󠁢󠁱󠁳󠁥|󠁢󠁱󠁳󠁡|󠁢󠁱󠁢󠁯|󠁥󠁲󠁧󠁢|󠁥󠁲󠁤󠁵|󠁥󠁲󠁤󠁫|󠁥󠁲󠁡󠁮|󠁥󠁧󠁭󠁴|󠁥󠁧󠁭󠁮|󠁥󠁧󠁬󠁸|󠁥󠁧󠁫󠁮|󠁥󠁧󠁫󠁢|󠁥󠁧󠁪󠁳|󠁥󠁧󠁩󠁳|󠁥󠁧󠁧󠁺|󠁥󠁧󠁧󠁨|󠁥󠁧󠁤󠁴|󠁥󠁧󠁤󠁫|󠁥󠁧󠁢󠁨|󠁡󠁺󠁹󠁥|󠁡󠁺󠁸󠁡|󠁡󠁺󠁳󠁲|󠁡󠁺󠁳󠁭|󠁢󠁩󠁭󠁵|󠁢󠁩󠁭󠁡|󠁢󠁩󠁫󠁹|󠁢󠁩󠁫󠁲|󠁢󠁩󠁫󠁩|󠁢󠁩󠁧󠁩|󠁥󠁳󠁢󠁵|󠁥󠁳󠁢󠁩|󠁥󠁳󠁢󠁡|󠁥󠁳󠁡󠁶|󠁢󠁩󠁣󠁩|󠁢󠁩󠁣󠁡|󠁢󠁩󠁢󠁲|󠁢󠁩󠁢󠁢|󠁢󠁨󠀱󠀷|󠁥󠁳󠁡󠁮|󠁥󠁳󠁡󠁬|󠁥󠁳󠁡󠁢|󠁥󠁲󠁳󠁫|󠁥󠁲󠁭󠁡|󠁣󠁯󠁤󠁣|󠁥󠁳󠁥󠁸|󠁢󠁺󠁳󠁣|󠁢󠁺󠁯󠁷|󠁥󠁳󠁣󠁥|󠁢󠁺󠁣󠁹|󠁢󠁺󠁢󠁺|󠁢󠁹󠁶󠁩|󠁢󠁹󠁭󠁩|󠁢󠁹󠁭󠁡|󠁢󠁹󠁨󠁲|󠁢󠁹󠁨󠁯|󠁢󠁹󠁨󠁭|󠁢󠁹󠁢󠁲|󠁢󠁷󠁳󠁴|󠁢󠁷󠁳󠁥|󠁢󠁷󠁮󠁷|󠁢󠁷󠁮󠁥|󠁢󠁷󠁬󠁯|󠁢󠁷󠁫󠁷|󠁥󠁳󠁺󠁡|󠁣󠁮󠁪󠁳|󠁣󠁮󠁪󠁸|󠁣󠁮󠁬󠁮|󠁥󠁳󠁧󠁩|󠁥󠁳󠁧󠁣|󠁣󠁮󠁭󠁯|󠁣󠁮󠁮󠁭|󠁣󠁮󠁮󠁸|󠁣󠁮󠁱󠁨|󠁣󠁮󠁳󠁨|󠁣󠁮󠁳󠁮|󠁣󠁮󠁳󠁸|󠁣󠁮󠁴󠁪|󠁣󠁮󠁴󠁷|󠁣󠁮󠁸󠁪|󠁣󠁮󠁸󠁺|󠁣󠁮󠁹󠁮|󠁣󠁮󠁺󠁪|󠁥󠁳󠁧󠁡|󠁢󠁳󠁭󠁩|󠁢󠁳󠁭󠁧|󠁢󠁳󠁭󠁣|󠁢󠁳󠁬󠁩|󠁢󠁳󠁩󠁮|󠁢󠁳󠁨󠁴|󠁢󠁳󠁨󠁩|󠁢󠁳󠁧󠁣|󠁢󠁳󠁦󠁰|󠁢󠁳󠁥󠁸|󠁢󠁳󠁥󠁧|󠁢󠁳󠁣󠁳|󠁢󠁳󠁣󠁯|󠁢󠁳󠁣󠁫|󠁢󠁳󠁣󠁩|󠁢󠁳󠁣󠁥|󠁢󠁳󠁢󠁹|󠁢󠁳󠁢󠁰|󠁢󠁳󠁢󠁩|󠁢󠁳󠁡󠁫|󠁢󠁷󠁫󠁬|󠁢󠁷󠁫󠁧|󠁢󠁷󠁪󠁷|󠁢󠁷󠁧󠁨|󠁢󠁷󠁧󠁡|󠁢󠁷󠁦󠁲|󠁢󠁷󠁣󠁨|󠁢󠁷󠁣󠁥|󠁢󠁴󠁴󠁹|󠁢󠁴󠁧󠁡|󠁢󠁳󠁷󠁧|󠁢󠁳󠁳󠁷|󠁢󠁳󠁳󠁳|󠁢󠁳󠁳󠁯|󠁢󠁳󠁳󠁥|󠁢󠁳󠁳󠁡|󠁢󠁳󠁲󠁩|󠁢󠁳󠁲󠁣|󠁢󠁳󠁮󠁳|󠁳󠁺󠁳󠁨|󠁳󠁺󠁭󠁡|󠁳󠁺󠁬󠁵|󠁳󠁺󠁨󠁨|󠁳󠁹󠁴󠁡|󠁳󠁹󠁳󠁵|󠁳󠁹󠁲󠁤|󠁳󠁹󠁲󠁡|󠁳󠁹󠁱󠁵|󠁳󠁹󠁬󠁡|󠁳󠁹󠁩󠁤|󠁳󠁹󠁨󠁩|󠁳󠁹󠁨󠁡|󠁳󠁹󠁤󠁹|󠁳󠁹󠁤󠁲|󠁳󠁹󠁤󠁩|󠁳󠁶󠁵󠁳|󠁳󠁶󠁵󠁮|󠁳󠁶󠁳󠁶|󠁴󠁤󠁳󠁡|󠁴󠁤󠁯󠁤|󠁴󠁤󠁮󠁤|󠁴󠁤󠁭󠁯|󠁴󠁤󠁭󠁥|󠁴󠁤󠁭󠁣|󠁴󠁤󠁭󠁡|󠁴󠁤󠁬󠁲|󠁴󠁤󠁬󠁯|󠁴󠁤󠁬󠁣|󠁴󠁤󠁫󠁡|󠁴󠁤󠁨󠁬|󠁴󠁤󠁧󠁲|󠁴󠁤󠁥󠁯|󠁴󠁤󠁥󠁥|󠁴󠁤󠁣󠁢|󠁴󠁤󠁢󠁯|󠁴󠁤󠁢󠁧|󠁳󠁳󠁥󠁣|󠁳󠁳󠁢󠁷|󠁳󠁳󠁢󠁮|󠁳󠁲󠁷󠁡|󠁳󠁲󠁳󠁩|󠁳󠁲󠁳󠁡|󠁳󠁲󠁰󠁲|󠁳󠁲󠁰󠁭|󠁳󠁲󠁮󠁩|󠁳󠁲󠁭󠁡|󠁳󠁲󠁣󠁲|󠁳󠁲󠁣󠁭|󠁳󠁲󠁢󠁲|󠁳󠁯󠁷󠁯|󠁳󠁯󠁴󠁯|󠁳󠁯󠁳󠁯|󠁳󠁯󠁳󠁨|󠁳󠁯󠁳󠁤|󠁳󠁯󠁳󠁡|󠁴󠁤󠁢󠁡|󠁳󠁶󠁳󠁳|󠁳󠁶󠁳󠁯|󠁳󠁶󠁳󠁭|󠁳󠁶󠁳󠁡|󠁳󠁶󠁰󠁡|󠁳󠁶󠁭󠁯|󠁳󠁶󠁬󠁩|󠁳󠁶󠁣󠁵|󠁳󠁶󠁣󠁨|󠁳󠁶󠁣󠁡|󠁳󠁶󠁡󠁨|󠁳󠁳󠁷󠁲|󠁳󠁳󠁵󠁹|󠁳󠁳󠁮󠁵|󠁳󠁳󠁬󠁫|󠁳󠁳󠁪󠁧|󠁳󠁳󠁥󠁷|󠁵󠁭󠀸󠀱|󠁵󠁭󠀷󠀹|󠁵󠁭󠀷󠀶|󠁵󠁭󠀷󠀱|󠁵󠁭󠀶󠀷|󠁵󠁡󠀷󠀷|󠁵󠁡󠀷󠀴|󠁵󠁡󠀷󠀱|󠁵󠁡󠀶󠀸|󠁵󠁡󠀶󠀵|󠁵󠁡󠀶󠀳|󠁵󠁡󠀶󠀱|󠁵󠁡󠀵󠀹|󠁵󠁡󠀵󠀶|󠁵󠁡󠀵󠀳|󠁵󠁡󠀵󠀱|󠁵󠁡󠀴󠀸|󠁵󠁡󠀴󠀶|󠁵󠁡󠀴󠀳|󠁵󠁳󠁫󠁳|󠁵󠁳󠁩󠁮|󠁵󠁳󠁩󠁬|󠁵󠁳󠁩󠁤|󠁵󠁳󠁩󠁡|󠁵󠁳󠁨󠁩|󠁵󠁳󠁧󠁡|󠁵󠁳󠁦󠁬|󠁵󠁳󠁤󠁥|󠁵󠁳󠁤󠁣|󠁵󠁳󠁣󠁴|󠁵󠁳󠁣󠁯|󠁵󠁳󠁣󠁡|󠁵󠁳󠁡󠁺|󠁵󠁳󠁡󠁲|󠁵󠁭󠀹󠀵|󠁵󠁭󠀸󠀹|󠁵󠁭󠀸󠀶|󠁴󠁬󠁬󠁩|󠁴󠁬󠁬󠁡|󠁴󠁬󠁥󠁲|󠁴󠁬󠁤󠁩|󠁴󠁬󠁣󠁯|󠁴󠁬󠁢󠁯|󠁴󠁬󠁢󠁡|󠁴󠁬󠁡󠁮|󠁴󠁬󠁡󠁬|󠁴󠁪󠁳󠁵|󠁴󠁪󠁲󠁡|󠁴󠁪󠁫󠁴|󠁴󠁪󠁧󠁢|󠁴󠁪󠁤󠁵|󠁴󠁤󠁷󠁦|󠁴󠁤󠁴󠁩|󠁴󠁤󠁴󠁡|󠁴󠁤󠁳󠁩|󠁳󠁳󠁥󠁥|󠁵󠁭󠀸󠀴|󠁵󠁡󠀴󠀰|󠁵󠁡󠀳󠀵|󠁵󠁡󠀳󠀲|󠁵󠁡󠀳󠀰|󠁵󠁡󠀲󠀶|󠁵󠁡󠀲󠀳|󠁵󠁡󠀲󠀱|󠁵󠁡󠀱󠀸|󠁵󠁡󠀱󠀴|󠁵󠁡󠀱󠀲|󠁵󠁡󠀰󠀹|󠁵󠁡󠀰󠀷|󠁵󠁡󠀰󠀵|󠁴󠁮󠀶󠀱|󠁴󠁬󠁶󠁩|󠁴󠁬󠁯󠁥|󠁴󠁬󠁭󠁴|󠁲󠁯󠁮󠁴|󠁲󠁯󠁭󠁳|󠁲󠁯󠁭󠁭|󠁲󠁯󠁭󠁨|󠁲󠁯󠁩󠁳|󠁲󠁯󠁩󠁬|󠁲󠁯󠁩󠁦|󠁲󠁯󠁨󠁲|󠁲󠁯󠁨󠁤|󠁲󠁯󠁧󠁲|󠁲󠁯󠁧󠁬|󠁲󠁯󠁧󠁪|󠁲󠁯󠁤󠁪|󠁲󠁯󠁤󠁢|󠁲󠁯󠁣󠁶|󠁲󠁯󠁣󠁬|󠁲󠁯󠁣󠁪|󠁲󠁯󠁢󠁺|󠁲󠁯󠁢󠁶|󠁲󠁵󠁤󠁡|󠁲󠁵󠁣󠁵|󠁲󠁵󠁣󠁥|󠁲󠁵󠁢󠁵|󠁲󠁵󠁢󠁡|󠁲󠁵󠁡󠁬|󠁲󠁵󠁡󠁤|󠁲󠁳󠁶󠁯|󠁲󠁳󠁫󠁭|󠁲󠁯󠁶󠁳|󠁲󠁯󠁶󠁮|󠁲󠁯󠁶󠁬|󠁲󠁯󠁴󠁲|󠁲󠁯󠁳󠁶|󠁲󠁯󠁳󠁭|󠁲󠁯󠁳󠁪|󠁲󠁯󠁳󠁢|󠁲󠁯󠁰󠁨|󠁰󠁴󠀲󠀰|󠁰󠁬󠀳󠀲|󠁰󠁬󠀳󠀰|󠁰󠁬󠀲󠀸|󠁰󠁬󠀲󠀶|󠁰󠁬󠀲󠀴|󠁰󠁬󠀲󠀲|󠁰󠁬󠀲󠀰|󠁰󠁬󠀱󠀸|󠁰󠁬󠀱󠀶|󠁰󠁬󠀱󠀴|󠁰󠁬󠀱󠀲|󠁰󠁬󠀱󠀰|󠁰󠁬󠀰󠀸|󠁰󠁬󠀰󠀶|󠁰󠁬󠀰󠀴|󠁰󠁬󠀰󠀲|󠁰󠁫󠁳󠁤|󠁰󠁫󠁰󠁢|󠁲󠁯󠁯󠁴|󠁲󠁯󠁢󠁴|󠁲󠁯󠁢󠁲|󠁲󠁯󠁢󠁮|󠁲󠁯󠁢󠁨|󠁲󠁯󠁢󠁣|󠁲󠁯󠁡󠁲|󠁲󠁯󠁡󠁧|󠁲󠁯󠁡󠁢|󠁱󠁡󠁺󠁡|󠁱󠁡󠁷󠁡|󠁱󠁡󠁵󠁳|󠁱󠁡󠁳󠁨|󠁱󠁡󠁲󠁡|󠁱󠁡󠁭󠁳|󠁱󠁡󠁫󠁨|󠁱󠁡󠁤󠁡|󠁰󠁹󠀱󠀹|󠁳󠁮󠁬󠁧|󠁳󠁮󠁫󠁬|󠁳󠁮󠁫󠁡|󠁳󠁮󠁦󠁫|󠁳󠁮󠁤󠁫|󠁳󠁮󠁤󠁢|󠁳󠁬󠁮󠁷|󠁳󠁫󠁺󠁩|󠁳󠁫󠁴󠁣|󠁳󠁫󠁴󠁡|󠁳󠁫󠁰󠁶|󠁳󠁫󠁮󠁩|󠁳󠁫󠁫󠁩|󠁳󠁫󠁢󠁬|󠁳󠁫󠁢󠁣|󠁳󠁨󠁨󠁬|󠁳󠁨󠁡󠁣|󠁳󠁥󠁢󠁤|󠁳󠁤󠁳󠁩|󠁴󠁬󠁭󠁦|󠁳󠁯󠁮󠁵|󠁳󠁯󠁭󠁵|󠁳󠁯󠁪󠁨|󠁳󠁯󠁪󠁤|󠁳󠁯󠁨󠁩|󠁳󠁯󠁧󠁥|󠁳󠁯󠁧󠁡|󠁳󠁯󠁢󠁹|󠁳󠁯󠁢󠁲|󠁳󠁯󠁢󠁮|󠁳󠁯󠁢󠁫|󠁳󠁯󠁡󠁷|󠁳󠁮󠁺󠁧|󠁳󠁮󠁴󠁨|󠁳󠁮󠁴󠁣|󠁳󠁮󠁳󠁬|󠁳󠁮󠁳󠁥|󠁳󠁢󠁴󠁥|󠁳󠁢󠁲󠁢|󠁳󠁢󠁩󠁳|󠁳󠁢󠁧󠁵|󠁳󠁢󠁣󠁴|󠁳󠁢󠁣󠁨|󠁳󠁢󠁣󠁥|󠁳󠁡󠀱󠀴|󠁲󠁵󠁵󠁤|󠁲󠁵󠁴󠁹|󠁲󠁵󠁴󠁡|󠁲󠁵󠁳󠁥|󠁲󠁵󠁳󠁡|󠁲󠁵󠁭󠁯|󠁲󠁵󠁭󠁥|󠁲󠁵󠁫󠁲|󠁲󠁵󠁫󠁯|󠁲󠁵󠁩󠁮|󠁰󠁴󠀳󠀰|󠁳󠁮󠁭󠁴|󠁳󠁤󠁲󠁳|󠁳󠁤󠁮󠁷|󠁳󠁤󠁮󠁲|󠁳󠁤󠁮󠁯|󠁳󠁤󠁮󠁢|󠁳󠁤󠁫󠁳|󠁳󠁤󠁫󠁮|󠁳󠁤󠁫󠁨|󠁳󠁤󠁫󠁡|󠁳󠁤󠁧󠁺|󠁳󠁤󠁧󠁫|󠁳󠁤󠁧󠁤|󠁳󠁤󠁤󠁷|󠁳󠁤󠁤󠁳|󠁳󠁤󠁤󠁮|󠁳󠁤󠁤󠁥|󠁳󠁤󠁤󠁣|󠁧󠁴󠁣󠁭|󠁧󠁴󠁢󠁶|󠁧󠁴󠁡󠁶|󠁧󠁲󠁡󠀱|󠁧󠁲󠀰󠀱|󠁧󠁬󠁱󠁡|󠁧󠁨󠁢󠁡|󠁦󠁲󠁹󠁴|󠁦󠁲󠁷󠁦|󠁦󠁲󠁴󠁦|󠁦󠁲󠁲󠁥|󠁦󠁲󠁰󠁭|󠁦󠁲󠁰󠁦|󠁦󠁲󠁮󠁣|󠁦󠁲󠁭󠁱|󠁦󠁲󠁭󠁦|󠁦󠁲󠁧󠁰|󠁦󠁲󠁧󠁦|󠁦󠁲󠁣󠁰|󠁧󠁴󠁺󠁡|󠁧󠁴󠁴󠁯|󠁧󠁴󠁳󠁵|󠁧󠁴󠁳󠁲|󠁧󠁴󠁳󠁯|󠁧󠁴󠁳󠁭|󠁧󠁴󠁳󠁡|󠁧󠁴󠁲󠁥|󠁧󠁴󠁱󠁺|󠁧󠁴󠁱󠁣|󠁧󠁴󠁰󠁲|󠁧󠁴󠁰󠁥|󠁧󠁴󠁪󠁵|󠁧󠁴󠁪󠁡|󠁧󠁴󠁩󠁺|󠁧󠁴󠁨󠁵|󠁧󠁴󠁧󠁵|󠁧󠁴󠁥󠁳|󠁣󠁺󠁰󠁲|󠁣󠁺󠁰󠁬|󠁣󠁺󠁰󠁡|󠁣󠁺󠁯󠁬|󠁣󠁺󠁭󠁯|󠁣󠁺󠁬󠁩|󠁣󠁺󠁫󠁲|󠁣󠁺󠁫󠁡|󠁣󠁺󠁪󠁭|󠁣󠁺󠁪󠁣|󠁣󠁮󠀷󠀱|󠁣󠁤󠁯󠁲|󠁣󠁤󠁫󠁷|󠁣󠁤󠁫󠁡|󠁣󠁤󠁢󠁮|󠁢󠁨󠀱󠀶|󠁢󠁡󠀱󠀰|󠁡󠁬󠁶󠁬|󠁡󠁬󠁴󠁲|󠁧󠁴󠁣󠁱|󠁦󠁲󠁢󠁬|󠁦󠁲󠀷󠀵|󠁦󠁩󠀰󠀱|󠁥󠁥󠀸󠀶|󠁥󠁥󠀸󠀲|󠁥󠁥󠀷󠀸|󠁥󠁥󠀷󠀰|󠁥󠁥󠀶󠀷|󠁥󠁥󠀶󠀵|󠁥󠁥󠀵󠀹|󠁥󠁥󠀵󠀷|󠁥󠁥󠀵󠀱|󠁥󠁥󠀴󠀹|󠁥󠁥󠀴󠀴|󠁣󠁺󠁺󠁬|󠁣󠁺󠁶󠁹|󠁣󠁺󠁵󠁳|󠁰󠁬󠁬󠁤|󠁰󠁬󠁬󠁢|󠁰󠁬󠁫󠁰|󠁰󠁬󠁤󠁳|󠁰󠁫󠁴󠁡|󠁯󠁭󠁳󠁨|󠁯󠁭󠁢󠁡|󠁮󠁰󠁳󠁥|󠁮󠁰󠁳󠁡|󠁮󠁰󠁲󠁡|󠁮󠁰󠁮󠁡|󠁮󠁰󠁭󠁥|󠁮󠁰󠁭󠁡|󠁮󠁰󠁬󠁵|󠁮󠁰󠁫󠁯|󠁮󠁰󠁫󠁡|󠁮󠁰󠁪󠁡|󠁮󠁰󠁧󠁡|󠁮󠁰󠁤󠁨|󠁺󠁡󠁮󠁬|󠁺󠁡󠁧󠁴|󠁵󠁳󠁶󠁩|󠁵󠁳󠁵󠁭|󠁵󠁳󠁰󠁲|󠁵󠁳󠁭󠁰|󠁵󠁳󠁧󠁵|󠁵󠁳󠁡󠁳|󠁳󠁨󠁴󠁡|󠁰󠁬󠁺󠁰|󠁰󠁬󠁷󠁰|󠁰󠁬󠁷󠁮|󠁰󠁬󠁰󠁭|󠁰󠁬󠁰󠁫|󠁰󠁬󠁰󠁤|󠁰󠁬󠁯󠁰|󠁰󠁬󠁭󠁺|󠁰󠁬󠁭󠁡|󠁭󠁵󠁶󠁰|󠁭󠁵󠁱󠁢|󠁭󠁵󠁰󠁵|󠁭󠁵󠁣󠁵|󠁭󠁵󠁢󠁲|󠁬󠁡󠁸󠁮|󠁩󠁴󠁶󠁳|󠁩󠁴󠁳󠁤|󠁩󠁴󠁯󠁴|󠁩󠁴󠁯󠁧|󠁩󠁴󠁣󠁩|󠁩󠁴󠁡󠁯|󠁩󠁮󠁵󠁴|󠁩󠁮󠁴󠁧|󠁩󠁮󠁯󠁲|󠁩󠁮󠁤󠁮|󠁩󠁮󠁤󠁤|󠁩󠁮󠁣󠁴|󠁣󠁺󠁳󠁴|󠁰󠁬󠁬󠁵|󠁮󠁰󠁢󠁨|󠁮󠁰󠁢󠁡|󠁮󠁯󠀲󠀳|󠁮󠁯󠀲󠀰|󠁮󠁯󠀱󠀹|󠁮󠁯󠀱󠀴|󠁮󠁯󠀱󠀲|󠁮󠁯󠀱󠀰|󠁮󠁬󠁳󠁸|󠁮󠁬󠁣󠁷|󠁮󠁬󠁡󠁷|󠁭󠁶󠁵󠁳|󠁭󠁶󠁵󠁮|󠁭󠁶󠁳󠁵|󠁭󠁶󠁳󠁣|󠁭󠁶󠁮󠁯|󠁭󠁶󠁮󠁣|󠁶󠁮󠀰󠀹|󠁵󠁺󠁸󠁯|󠁵󠁺󠁴󠁯|󠁵󠁺󠁴󠁫|󠁵󠁺󠁳󠁵|󠁵󠁺󠁳󠁩|󠁵󠁺󠁳󠁡|󠁵󠁺󠁱󠁲|󠁵󠁺󠁱󠁡|󠁵󠁺󠁮󠁷|󠁵󠁺󠁮󠁧|󠁵󠁺󠁪󠁩|󠁵󠁺󠁦󠁡|󠁵󠁺󠁢󠁵|󠁵󠁺󠁡󠁮|󠁵󠁹󠁴󠁴|󠁵󠁹󠁴󠁡|󠁵󠁹󠁳󠁯|󠁵󠁹󠁳󠁪|󠁷󠁳󠁧󠁩|󠁷󠁳󠁧󠁥|󠁷󠁳󠁦󠁡|󠁷󠁳󠁡󠁴|󠁷󠁳󠁡󠁬|󠁷󠁳󠁡󠁡|󠁷󠁦󠁵󠁶|󠁷󠁦󠁳󠁧|󠁷󠁦󠁡󠁬|󠁶󠁮󠁳󠁧|󠁶󠁮󠁨󠁰|󠁶󠁮󠁨󠁮|󠁶󠁮󠁤󠁮|󠁶󠁮󠁣󠁴|󠁶󠁮󠀶󠀳|󠁶󠁮󠀶󠀱|󠁶󠁮󠀴󠀹|󠁶󠁮󠀳󠀹|󠁵󠁳󠁶󠁡|󠁵󠁳󠁵󠁴|󠁵󠁳󠁴󠁸|󠁵󠁳󠁴󠁮|󠁵󠁳󠁲󠁩|󠁵󠁳󠁰󠁡|󠁵󠁳󠁯󠁲|󠁵󠁳󠁯󠁫|󠁵󠁳󠁯󠁨|󠁵󠁳󠁮󠁹|󠁵󠁳󠁮󠁶|󠁵󠁳󠁮󠁭|󠁵󠁳󠁮󠁪|󠁵󠁳󠁮󠁨|󠁵󠁳󠁭󠁩|󠁵󠁳󠁭󠁡|󠁵󠁳󠁬󠁡|󠁵󠁳󠁫󠁹|󠁳󠁢󠁷󠁥|󠁶󠁮󠀱󠀸|󠁵󠁹󠁳󠁡|󠁵󠁹󠁲󠁶|󠁵󠁹󠁰󠁡|󠁵󠁹󠁭󠁯|󠁵󠁹󠁭󠁡|󠁵󠁹󠁬󠁡|󠁵󠁹󠁦󠁳|󠁵󠁹󠁦󠁤|󠁵󠁹󠁤󠁵|󠁵󠁹󠁣󠁯|󠁵󠁹󠁣󠁬|󠁵󠁹󠁣󠁡|󠁵󠁹󠁡󠁲|󠁵󠁳󠁷󠁹|󠁵󠁳󠁷󠁶|󠁵󠁳󠁷󠁩|󠁵󠁳󠁷󠁡|󠁡󠁬󠁧󠁲|󠁡󠁬󠁧󠁪|󠁡󠁬󠁦󠁲|󠁡󠁬󠁥󠁲|󠁡󠁬󠁥󠁬|󠁡󠁬󠁤󠁶|󠁡󠁬󠁤󠁲|󠁡󠁬󠁤󠁬|󠁡󠁬󠁤󠁩|󠁡󠁬󠁢󠁵|󠁡󠁬󠁢󠁲|󠁺󠁷󠁭󠁳|󠁺󠁷󠁭󠁮|󠁺󠁷󠁭󠁩|󠁺󠁷󠁭󠁥|󠁺󠁷󠁭󠁣|󠁺󠁷󠁭󠁡|󠁺󠁷󠁨󠁡|󠁺󠁷󠁢󠁵|󠁭󠁶󠁣󠁥|󠁡󠁬󠁴󠁰|󠁡󠁬󠁴󠁥|󠁡󠁬󠁳󠁲|󠁡󠁬󠁳󠁫|󠁡󠁬󠁳󠁨|󠁡󠁬󠁰󠁵|󠁡󠁬󠁰󠁧|󠁡󠁬󠁭󠁴|󠁡󠁬󠁭󠁲|󠁡󠁬󠁭󠁭|󠁡󠁬󠁭󠁫|󠁡󠁬󠁬󠁵|󠁡󠁬󠁬󠁥|󠁡󠁬󠁬󠁢|󠁡󠁬󠁫󠁵|󠁡󠁬󠁫󠁲|󠁡󠁬󠁫󠁯|󠁹󠁥󠁭󠁡|󠁹󠁥󠁬󠁡|󠁹󠁥󠁪󠁡|󠁹󠁥󠁩󠁢|󠁹󠁥󠁨󠁵|󠁹󠁥󠁨󠁪|󠁹󠁥󠁨󠁤|󠁹󠁥󠁤󠁨|󠁹󠁥󠁤󠁡|󠁹󠁥󠁢󠁡|󠁹󠁥󠁡󠁭|󠁹󠁥󠁡󠁤|󠁹󠁥󠁡󠁢|󠁷󠁳󠁶󠁳|󠁷󠁳󠁶󠁦|󠁷󠁳󠁴󠁵|󠁷󠁳󠁳󠁡|󠁷󠁳󠁰󠁡|󠁵󠁳󠁶󠁴|󠁡󠁬󠁨󠁡|󠁺󠁭󠀱󠀰|󠁺󠁡󠁷󠁣|󠁺󠁡󠁮󠁷|󠁺󠁡󠁮󠁣|󠁺󠁡󠁭󠁰|󠁺󠁡󠁬󠁰|󠁺󠁡󠁧󠁰|󠁺󠁡󠁦󠁳|󠁺󠁡󠁥󠁣|󠁹󠁥󠁴󠁡|󠁹󠁥󠁳󠁵|󠁹󠁥󠁳󠁮|󠁹󠁥󠁳󠁨|󠁹󠁥󠁳󠁤|󠁹󠁥󠁳󠁡|󠁹󠁥󠁲󠁡|󠁹󠁥󠁭󠁷|󠁹󠁥󠁭󠁲|󠁩󠁴󠁲󠁩|󠁩󠁴󠁲󠁧|󠁩󠁴󠁲󠁥|󠁩󠁴󠁲󠁣|󠁩󠁴󠁲󠁡|󠁩󠁴󠁰󠁺|󠁩󠁴󠁰󠁲|󠁩󠁴󠁰󠁩|󠁩󠁴󠁰󠁧|󠁩󠁴󠁰󠁡|󠁩󠁴󠁯󠁲|󠁩󠁴󠁮󠁵|󠁩󠁴󠁮󠁯|󠁩󠁴󠁮󠁡|󠁩󠁴󠁭󠁩|󠁩󠁴󠁭󠁥|󠁩󠁴󠁬󠁯|󠁩󠁴󠁬󠁩|󠁪󠁯󠁩󠁲|󠁪󠁯󠁢󠁡|󠁪󠁯󠁡󠁺|󠁪󠁯󠁡󠁴|󠁪󠁯󠁡󠁱|󠁪󠁯󠁡󠁭|󠁪󠁯󠁡󠁪|󠁩󠁴󠁶󠁶|󠁩󠁴󠁶󠁴|󠁩󠁴󠁶󠁲|󠁩󠁴󠁶󠁩|󠁩󠁴󠁶󠁥|󠁩󠁴󠁵󠁤|󠁩󠁴󠁴󠁶|󠁩󠁴󠁴󠁥|󠁩󠁴󠁴󠁡|󠁩󠁴󠁳󠁩|󠁩󠁴󠁳󠁡|󠁩󠁴󠁣󠁥|󠁩󠁴󠁢󠁺|󠁩󠁴󠁢󠁬|󠁩󠁴󠁢󠁩|󠁩󠁴󠁢󠁧|󠁩󠁴󠁢󠁡|󠁩󠁴󠁡󠁶|󠁩󠁴󠁡󠁴|󠁩󠁴󠁡󠁮|󠁩󠁴󠁡󠁬|󠁩󠁴󠁡󠁧|󠁩󠁴󠀸󠀸|󠁩󠁴󠀸󠀲|󠁩󠁴󠀷󠀵|󠁩󠁴󠀷󠀲|󠁩󠁴󠀶󠀷|󠁩󠁴󠀶󠀵|󠁩󠁴󠀶󠀲|󠁩󠁴󠁬󠁥|󠁩󠁴󠁬󠁣|󠁩󠁴󠁫󠁲|󠁩󠁴󠁩󠁳|󠁩󠁴󠁩󠁭|󠁩󠁴󠁧󠁲|󠁩󠁴󠁧󠁯|󠁩󠁴󠁧󠁥|󠁩󠁴󠁦󠁲|󠁩󠁴󠁦󠁭|󠁩󠁴󠁦󠁩|󠁩󠁴󠁦󠁧|󠁩󠁴󠁦󠁥|󠁩󠁴󠁦󠁣|󠁩󠁴󠁥󠁮|󠁩󠁴󠁣󠁺|󠁩󠁴󠁣󠁬|󠁬󠁢󠁪󠁬|󠁬󠁢󠁪󠁡|󠁬󠁢󠁢󠁡|󠁬󠁢󠁡󠁳|󠁬󠁢󠁡󠁫|󠁬󠁡󠁸󠁳|󠁬󠁡󠁸󠁩|󠁬󠁡󠁸󠁥|󠁬󠁡󠁸󠁡|󠁬󠁡󠁶󠁴|󠁬󠁡󠁶󠁩|󠁬󠁡󠁳󠁶|󠁬󠁡󠁳󠁬|󠁬󠁡󠁰󠁨|󠁬󠁡󠁯󠁵|󠁬󠁡󠁬󠁰|󠁬󠁡󠁬󠁭|󠁬󠁡󠁫󠁨|󠁬󠁴󠁡󠁬|󠁬󠁴󠀶󠀰|󠁬󠁲󠁳󠁩|󠁬󠁲󠁲󠁩|󠁬󠁲󠁲󠁧|󠁬󠁲󠁮󠁩|󠁬󠁲󠁭󠁹|󠁬󠁲󠁭󠁯|󠁬󠁲󠁭󠁧|󠁬󠁲󠁬󠁯|󠁬󠁲󠁧󠁰|󠁬󠁲󠁧󠁫|󠁬󠁲󠁧󠁧|󠁬󠁲󠁧󠁢|󠁬󠁲󠁣󠁭|󠁬󠁲󠁢󠁭|󠁬󠁲󠁢󠁧|󠁬󠁢󠁮󠁡|󠁫󠁷󠁭󠁵|󠁫󠁷󠁫󠁵|󠁫󠁷󠁪󠁡|󠁫󠁷󠁨󠁡|󠁫󠁷󠁦󠁡|󠁫󠁷󠁡󠁨|󠁫󠁲󠀵󠀰|󠁫󠁲󠀱󠀱|󠁫󠁰󠀱󠀰|󠁫󠁮󠀱󠀵|󠁫󠁧󠁧󠁯|󠁫󠁧󠁧󠁢|󠁪󠁯󠁭󠁮|󠁪󠁯󠁭󠁤|󠁪󠁯󠁭󠁡|󠁪󠁯󠁫󠁡|󠁪󠁯󠁪󠁡|󠁩󠁴󠁣󠁨|󠁬󠁡󠁨󠁯|󠁬󠁡󠁣󠁨|󠁬󠁡󠁡󠁴|󠁫󠁺󠀷󠀹|󠁫󠁺󠀷󠀵|󠁫󠁺󠀷󠀱|󠁫󠁺󠀵󠀹|󠁫󠁺󠀵󠀵|󠁫󠁺󠀴󠀷|󠁫󠁺󠀴󠀳|󠁫󠁺󠀳󠀹|󠁫󠁺󠀳󠀵|󠁫󠁺󠀳󠀳|󠁫󠁺󠀳󠀱|󠁫󠁺󠀲󠀷|󠁫󠁺󠀲󠀳|󠁫󠁺󠀱󠀹|󠁩󠁤󠁬󠁡|󠁩󠁤󠁫󠁩|󠁩󠁤󠁪󠁷|󠁩󠁤󠁪󠁴|󠁩󠁤󠁪󠁫|󠁩󠁤󠁪󠁩|󠁩󠁤󠁧󠁯|󠁩󠁤󠁢󠁴|󠁩󠁤󠁢󠁥|󠁩󠁤󠁡󠁣|󠁨󠁵󠁺󠁥|󠁨󠁵󠁺󠁡|󠁨󠁵󠁶󠁭|󠁨󠁵󠁶󠁥|󠁨󠁵󠁶󠁡|󠁨󠁵󠁴󠁯|󠁨󠁵󠁴󠁢|󠁨󠁵󠁳󠁺|󠁩󠁥󠁬󠁭|󠁩󠁥󠁬󠁫|󠁩󠁥󠁬󠁨|󠁩󠁥󠁬󠁤|󠁩󠁥󠁫󠁹|󠁩󠁥󠁫󠁫|󠁩󠁥󠁫󠁥|󠁩󠁥󠁤󠁬|󠁩󠁥󠁣󠁷|󠁩󠁥󠁣󠁥|󠁩󠁤󠁹󠁯|󠁩󠁤󠁳󠁧|󠁩󠁤󠁲󠁩|󠁩󠁤󠁰󠁰|󠁩󠁤󠁮󠁢|󠁩󠁤󠁭󠁵|󠁩󠁤󠁭󠁬|󠁩󠁤󠁭󠁡|󠁨󠁵󠁧󠁳|󠁨󠁵󠁦󠁥|󠁨󠁵󠁥󠁲|󠁨󠁵󠁥󠁧|󠁨󠁵󠁤󠁵|󠁨󠁵󠁤󠁥|󠁨󠁵󠁣󠁳|󠁨󠁵󠁢󠁺|󠁨󠁵󠁢󠁵|󠁨󠁵󠁢󠁫|󠁨󠁵󠁢󠁥|󠁨󠁵󠁢󠁣|󠁨󠁵󠁢󠁡|󠁨󠁴󠁯󠁵|󠁨󠁴󠁮󠁯|󠁨󠁴󠁮󠁩|󠁨󠁴󠁧󠁡|󠁢󠁳󠁮󠁥|󠁨󠁵󠁳󠁫|󠁨󠁵󠁳󠁨|󠁨󠁵󠁳󠁦|󠁨󠁵󠁳󠁤|󠁨󠁵󠁰󠁳|󠁨󠁵󠁰󠁥|󠁨󠁵󠁮󠁹|󠁨󠁵󠁮󠁯|󠁨󠁵󠁮󠁫|󠁨󠁵󠁭󠁩|󠁨󠁵󠁫󠁶|󠁨󠁵󠁫󠁭|󠁨󠁵󠁫󠁥|󠁨󠁵󠁪󠁮|󠁨󠁵󠁨󠁶|󠁨󠁵󠁨󠁥|󠁨󠁵󠁨󠁢|󠁩󠁱󠁮󠁡|󠁩󠁱󠁭󠁵|󠁩󠁱󠁭󠁡|󠁩󠁱󠁫󠁲|󠁩󠁱󠁫󠁩|󠁩󠁱󠁫󠁡|󠁩󠁱󠁤󠁱|󠁩󠁱󠁤󠁩|󠁩󠁱󠁤󠁡|󠁩󠁱󠁢󠁧|󠁩󠁱󠁡󠁲|󠁩󠁱󠁡󠁮|󠁩󠁮󠁷󠁢|󠁩󠁮󠁵󠁰|󠁩󠁮󠁵󠁫|󠁩󠁮󠁴󠁮|󠁩󠁮󠁳󠁫|󠁩󠁮󠁲󠁪|󠁫󠁺󠀱󠀵|󠁩󠁴󠀵󠀷|󠁩󠁴󠀵󠀵|󠁩󠁴󠀵󠀲|󠁩󠁴󠀴󠀵|󠁩󠁴󠀴󠀲|󠁩󠁴󠀳󠀶|󠁩󠁴󠀳󠀴|󠁩󠁴󠀳󠀲|󠁩󠁴󠀲󠀵|󠁩󠁴󠀲󠀳|󠁩󠁴󠀲󠀱|󠁩󠁲󠀳󠀰|󠁩󠁱󠁷󠁡|󠁩󠁱󠁳󠁵|󠁩󠁱󠁳󠁤|󠁩󠁱󠁱󠁡|󠁩󠁱󠁮󠁩|󠁩󠁮󠁧󠁡|󠁩󠁮󠁤󠁬|󠁩󠁮󠁤󠁨|󠁩󠁮󠁢󠁲|󠁩󠁮󠁡󠁰|󠁩󠁮󠁡󠁮|󠁩󠁬󠁴󠁡|󠁩󠁬󠁪󠁭|󠁩󠁬󠁨󠁡|󠁩󠁥󠁷󠁨|󠁩󠁥󠁷󠁤|󠁩󠁥󠁴󠁡|󠁩󠁥󠁳󠁯|󠁩󠁥󠁲󠁮|󠁩󠁥󠁯󠁹|󠁩󠁥󠁭󠁨|󠁩󠁥󠁬󠁳|󠁨󠁵󠁧󠁹|󠁩󠁮󠁰󠁹|󠁩󠁮󠁰󠁢|󠁩󠁮󠁯󠁤|󠁩󠁮󠁮󠁬|󠁩󠁮󠁭󠁺|󠁩󠁮󠁭󠁰|󠁩󠁮󠁭󠁮|󠁩󠁮󠁭󠁬|󠁩󠁮󠁭󠁨|󠁩󠁮󠁬󠁤|󠁩󠁮󠁬󠁡|󠁩󠁮󠁫󠁬|󠁩󠁮󠁫󠁡|󠁩󠁮󠁪󠁫|󠁩󠁮󠁪󠁨|󠁩󠁮󠁨󠁲|󠁩󠁮󠁨󠁰|󠁩󠁮󠁧󠁪|󠁮󠁧󠁡󠁫|󠁮󠁧󠁡󠁤|󠁮󠁧󠁡󠁢|󠁮󠁡󠁯󠁷|󠁮󠁡󠁯󠁮|󠁮󠁡󠁯󠁨|󠁮󠁡󠁯󠁤|󠁮󠁡󠁫󠁷|󠁮󠁡󠁫󠁵|󠁮󠁡󠁫󠁨|󠁮󠁡󠁫󠁥|󠁮󠁡󠁫󠁡|󠁮󠁡󠁨󠁡|󠁮󠁡󠁥󠁲|󠁮󠁡󠁣󠁡|󠁭󠁷󠁺󠁯|󠁭󠁷󠁴󠁨|󠁭󠁷󠁳󠁡|󠁮󠁧󠁬󠁡|󠁮󠁧󠁫󠁷|󠁮󠁧󠁫󠁴|󠁮󠁧󠁪󠁩|󠁮󠁧󠁩󠁭|󠁮󠁧󠁧󠁯|󠁮󠁧󠁦󠁣|󠁮󠁧󠁥󠁮|󠁮󠁧󠁥󠁫|󠁮󠁧󠁥󠁤|󠁮󠁧󠁥󠁢|󠁮󠁧󠁤󠁥|󠁮󠁧󠁣󠁲|󠁮󠁧󠁢󠁹|󠁮󠁧󠁢󠁯|󠁮󠁧󠁢󠁥|󠁮󠁧󠁢󠁡|󠁮󠁧󠁡󠁮|󠁭󠁷󠁣󠁫|󠁭󠁷󠁢󠁬|󠁭󠁷󠁢󠁡|󠁭󠁶󠀲󠀰|󠁭󠁶󠀱󠀷|󠁭󠁵󠁳󠁡|󠁭󠁵󠁲󠁲|󠁭󠁵󠁲󠁯|󠁭󠁵󠁰󠁷|󠁭󠁵󠁰󠁬|󠁭󠁵󠁰󠁡|󠁭󠁵󠁭󠁯|󠁭󠁵󠁧󠁰|󠁭󠁵󠁦󠁬|󠁭󠁵󠁣󠁣|󠁭󠁵󠁢󠁬|󠁭󠁵󠁡󠁧|󠁭󠁬󠀱󠀰|󠁭󠁷󠁲󠁵|󠁭󠁷󠁰󠁨|󠁭󠁷󠁮󠁵|󠁭󠁷󠁮󠁳|󠁭󠁷󠁮󠁫|󠁭󠁷󠁮󠁩|󠁭󠁷󠁮󠁥|󠁭󠁷󠁮󠁢|󠁭󠁷󠁭󠁺|󠁭󠁷󠁭󠁷|󠁭󠁷󠁭󠁵|󠁭󠁷󠁭󠁣|󠁭󠁷󠁬󠁫|󠁭󠁷󠁬󠁩|󠁭󠁷󠁤󠁯|󠁭󠁷󠁤󠁥|󠁭󠁷󠁣󠁴|󠁯󠁭󠁢󠁵|󠁯󠁭󠁢󠁳|󠁯󠁭󠁢󠁪|󠁮󠁯󠀵󠀴|󠁮󠁯󠀵󠀰|󠁮󠁯󠀴󠀶|󠁮󠁯󠀴󠀲|󠁮󠁯󠀳󠀸|󠁮󠁯󠀳󠀴|󠁮󠁯󠀳󠀰|󠁮󠁯󠀱󠀸|󠁮󠁯󠀱󠀵|󠁮󠁯󠀱󠀱|󠁮󠁯󠀰󠀳|󠁮󠁬󠁺󠁨|󠁮󠁬󠁺󠁥|󠁮󠁬󠁵󠁴|󠁮󠁬󠁯󠁶|󠁰󠁫󠁫󠁰|󠁰󠁫󠁪󠁫|󠁰󠁫󠁩󠁳|󠁰󠁫󠁧󠁢|󠁰󠁫󠁢󠁡|󠁰󠁡󠁮󠁴|󠁰󠁡󠁮󠁢|󠁰󠁡󠁫󠁹|󠁰󠁡󠁥󠁭|󠁰󠁡󠀱󠀰|󠁯󠁭󠁺󠁵|󠁯󠁭󠁺󠁡|󠁯󠁭󠁷󠁵|󠁯󠁭󠁳󠁳|󠁯󠁭󠁳󠁪|󠁯󠁭󠁭󠁵|󠁯󠁭󠁭󠁡|󠁯󠁭󠁤󠁡|󠁮󠁩󠁣󠁩|󠁮󠁩󠁣󠁡|󠁮󠁩󠁢󠁯|󠁮󠁩󠁡󠁳|󠁮󠁩󠁡󠁮|󠁮󠁧󠁺󠁡|󠁮󠁧󠁹󠁯|󠁮󠁧󠁴󠁡|󠁮󠁧󠁳󠁯|󠁮󠁧󠁲󠁩|󠁮󠁧󠁰󠁬|󠁮󠁧󠁯󠁹|󠁮󠁧󠁯󠁳|󠁮󠁧󠁯󠁮|󠁮󠁧󠁯󠁧|󠁮󠁧󠁮󠁩|󠁮󠁧󠁮󠁡|󠁭󠁷󠁣󠁲|󠁮󠁬󠁮󠁨|󠁮󠁬󠁮󠁢|󠁮󠁬󠁬󠁩|󠁮󠁬󠁧󠁲|󠁮󠁬󠁧󠁥|󠁮󠁬󠁦󠁲|󠁮󠁬󠁦󠁬|󠁮󠁬󠁤󠁲|󠁮󠁩󠁳󠁪|󠁮󠁩󠁲󠁩|󠁮󠁩󠁮󠁳|󠁮󠁩󠁭󠁮|󠁮󠁩󠁭󠁤|󠁮󠁩󠁬󠁥|󠁮󠁩󠁪󠁩|󠁮󠁩󠁧󠁲|󠁮󠁩󠁥󠁳|󠁮󠁩󠁣󠁯|󠁬󠁹󠁫󠁦|󠁬󠁹󠁭󠁢|󠁬󠁹󠁭󠁱|󠁬󠁹󠁮󠁬|󠁬󠁹󠁮󠁱|󠁬󠁹󠁳󠁢|󠁬󠁹󠁳󠁲|󠁬󠁹󠁴󠁢|󠁬󠁹󠁷󠁡|󠁬󠁹󠁷󠁤|󠁬󠁹󠁷󠁳|󠁬󠁹󠁺󠁡|󠁭󠁣󠁣󠁬|󠁭󠁣󠁣󠁯|󠁭󠁣󠁦󠁯|󠁭󠁣󠁧󠁡|󠁭󠁣󠁪󠁥|󠁭󠁣󠁬󠁡|󠁭󠁣󠁭󠁡|󠁭󠁣󠁭󠁣|󠁭󠁣󠁭󠁧|󠁭󠁣󠁭󠁯|󠁭󠁣󠁭󠁵|󠁭󠁣󠁰󠁨|󠁭󠁣󠁳󠁤|󠁭󠁣󠁳󠁲|󠁭󠁣󠁶󠁲|󠁭󠁤󠁡󠁮|󠁭󠁤󠁢󠁡|󠁬󠁴󠁫󠁬|󠁬󠁴󠁫󠁵|󠁬󠁴󠁭󠁲|󠁬󠁴󠁰󠁮|󠁬󠁴󠁳󠁡|󠁬󠁴󠁴󠁡|󠁬󠁴󠁴󠁥|󠁬󠁴󠁵󠁴|󠁬󠁴󠁶󠁬|󠁬󠁵󠁣󠁡|󠁬󠁵󠁣󠁬|󠁬󠁵󠁤󠁩|󠁬󠁵󠁥󠁣|󠁬󠁵󠁥󠁳|󠁬󠁵󠁧󠁲|󠁬󠁵󠁬󠁵|󠁬󠁵󠁭󠁥|󠁬󠁵󠁲󠁤|󠁬󠁵󠁲󠁭|󠁬󠁵󠁶󠁤|󠁬󠁵󠁷󠁩|󠁬󠁹󠁢󠁡|󠁬󠁹󠁢󠁵|󠁬󠁹󠁤󠁲|󠁬󠁹󠁧󠁴|󠁬󠁹󠁪󠁡|󠁬󠁹󠁪󠁧|󠁬󠁹󠁪󠁩|󠁬󠁹󠁪󠁵|󠁭󠁤󠁢󠁤|󠁭󠁤󠁨󠁩|󠁭󠁤󠁯󠁣|󠁭󠁤󠁧󠁬|󠁭󠁤󠁧󠁡|󠁭󠁤󠁵󠁮|󠁭󠁤󠁯󠁲|󠁭󠁤󠁲󠁥|󠁭󠁤󠁴󠁥|󠁭󠁤󠁦󠁬|󠁭󠁤󠁲󠁩|󠁭󠁤󠁤󠁵|󠁭󠁤󠁳󠁤|󠁭󠁤󠁳󠁩|󠁭󠁤󠁳󠁴|󠁭󠁤󠁳󠁶|󠁭󠁤󠁥󠁤|󠁭󠁤󠁴󠁡|󠁭󠁤󠁣󠁡|󠁭󠁤󠁤󠁯|󠁭󠁤󠁩󠁡|󠁭󠁤󠁤󠁲|󠁭󠁤󠁬󠁥|󠁭󠁤󠁦󠁡|󠁭󠁤󠁮󠁩|󠁧󠁱󠁩|󠁴󠁧󠁫|󠁧󠁷󠁮|󠁧󠁷󠁬|󠁬󠁵󠁤|󠁥󠁳󠁡|󠁬󠁵󠁧|󠁬󠁵󠁬|󠁴󠁧󠁭|󠁭󠁷󠁣|󠁳󠁴󠁰|󠁥󠁳󠁯|󠁴󠁧󠁰|󠁥󠁳󠁰|󠁥󠁳󠁳|󠁴󠁧󠁳|󠁴󠁨󠁳|󠁳󠁬󠁷|󠁧󠁱󠁣|󠁵󠁧󠁷|󠁵󠁧󠁮|󠁵󠁧󠁥|󠁵󠁧󠁣|󠁭󠁧󠁡|󠁭󠁧󠁤|󠁰󠁡󠀱|󠁥󠁳󠁬|󠁥󠁳󠁣|󠁳󠁴󠁳|󠁥󠁳󠁪|󠁭󠁧󠁦|󠁭󠁧󠁭|󠁥󠁳󠁨|󠁭󠁨󠁬|󠁭󠁮󠀱|󠁭󠁨󠁴|󠁭󠁬󠀱|󠁲󠁯󠁢|󠁧󠁷󠁳|󠁴󠁭󠁤|󠁬󠁫󠀱|󠁬󠁫󠀲|󠁬󠁫󠀳|󠁬󠁫󠀴|󠁬󠁫󠀵|󠁬󠁫󠀶|󠁮󠁺󠁮|󠁮󠁺󠁳|󠁬󠁫󠀷|󠁬󠁫󠀸|󠁬󠁫󠀹|󠁴󠁭󠁳|󠁰󠁹󠀱|󠁥󠁳󠁭|󠁫󠁭󠁭|󠁥󠁧󠁣|󠁫󠁮󠁫|󠁢󠁯󠁨|󠁦󠁲󠁣|󠁢󠁯󠁬|󠁫󠁮󠁮|󠁣󠁲󠁡|󠁦󠁲󠁭|󠁣󠁲󠁣|󠁩󠁬󠁺|󠁦󠁲󠁮|󠁩󠁬󠁭|󠁣󠁲󠁬|󠁣󠁲󠁰|󠁩󠁬󠁤|󠁳󠁥󠁫|󠁭󠁺󠁮|󠁭󠁺󠁬|󠁣󠁧󠀵|󠁣󠁧󠀲|󠁭󠁺󠁩|󠁭󠁺󠁧|󠁥󠁳󠁺|󠁫󠁧󠁪|󠁫󠁧󠁴|󠁫󠁧󠁹|󠁫󠁨󠀱|󠁫󠁨󠀲|󠁫󠁩󠁧|󠁫󠁩󠁬|󠁫󠁩󠁰|󠁫󠁭󠁡|󠁫󠁭󠁧|󠁩󠁥󠁬|󠁥󠁳󠁴|󠁧󠁮󠁫|󠁩󠁥󠁧|󠁩󠁥󠁤|󠁭󠁷󠁮|󠁧󠁮󠁬|󠁳󠁬󠁥|󠁩󠁥󠁣|󠁳󠁬󠁮|󠁩󠁳󠀰|󠁧󠁮󠁭|󠁣󠁶󠁳|󠁧󠁮󠁮|󠁳󠁬󠁳|󠁴󠁧󠁣|󠁥󠁳󠁢|󠁭󠁷󠁳|󠁩󠁥󠁵|󠁥󠁳󠁶|󠁧󠁭󠁢|󠁧󠁭󠁵|󠁧󠁭󠁷|󠁧󠁮󠁢|󠁣󠁶󠁢|󠁦󠁪󠁣|󠁧󠁮󠁣|󠁩󠁥󠁭|󠁧󠁮󠁤|󠁦󠁪󠁥|󠁦󠁪󠁮|󠁦󠁪󠁲|󠁦󠁪󠁷|󠁧󠁮󠁦)󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_valid_include_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_valid_include_text.rb new file mode 100644 index 000000000..1301ae952 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_valid_include_text.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_VALID_INCLUDE_TEXT = /(?:(?:(?:(?:[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸])‍)+(?:[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]))|(?:🏴(?:󠁬󠁶󠀰󠀴[󠀸-󠀹]|󠁬󠁶󠀰󠀴[󠀳-󠀶]|󠁬󠁶󠀰󠀳[󠀴-󠀹]|󠁬󠁶󠀰󠀳[󠀰-󠀲]|󠁬󠁶󠀰󠀲[󠀷-󠀹]|󠁬󠁶󠀰󠀲[󠀳-󠀵]|󠁬󠁶󠀰󠀲[󠀰-󠀱]|󠁬󠁶󠀰󠀱[󠀷-󠀹]|󠁬󠁶󠀰󠀱[󠀲-󠀴]|󠁣󠁺󠀵󠀲[󠀱-󠀵]|󠁬󠁶󠀰󠀰[󠀸-󠀹]|󠁬󠁶󠀰󠀰[󠀳-󠀶]|󠁭󠁮󠀰󠀴[󠀶-󠀷]|󠁧󠁢󠁥󠁮[󠁦-󠁧]|󠁣󠁺󠀵󠀳[󠀱-󠀴]|󠁣󠁺󠀶󠀳[󠀱-󠀵]|󠁰󠁥󠁬󠁡[󠁬-󠁭]|󠁣󠁺󠀶󠀴[󠀱-󠀷]|󠁰󠁨󠁰󠁡[󠁭-󠁮]|󠁣󠁺󠀷󠀱[󠀱-󠀵]|󠁦󠁲󠀹󠀷[󠀱-󠀴]|󠁭󠁡󠁢󠁥[󠁲-󠁳]|󠁣󠁺󠀱󠀲[󠀰-󠀲]|󠁣󠁺󠀶󠀱[󠀱-󠀵]|󠁣󠁺󠀶󠀲[󠀱-󠀷]|󠁣󠁺󠀳󠀲[󠀱-󠀷]|󠁥󠁥󠀷󠀹[󠀲-󠀳]|󠁣󠁺󠀴󠀱[󠀱-󠀳]|󠁧󠁢󠁨󠁡[󠁬-󠁭]|󠁣󠁺󠀴󠀲[󠀱-󠀷]|󠁬󠁶󠀱󠀰[󠀷-󠀹]|󠁬󠁶󠀱󠀰[󠀳-󠀵]|󠁬󠁶󠀰󠀹[󠀵-󠀶]|󠁬󠁶󠀰󠀹[󠀲-󠀳]|󠁬󠁶󠀰󠀸[󠀱-󠀶]|󠁬󠁶󠀰󠀷[󠀸-󠀹]|󠁬󠁶󠀰󠀷[󠀴-󠀶]|󠁬󠁶󠀰󠀷[󠀰-󠀲]|󠁣󠁺󠀵󠀱[󠀱-󠀴]|󠁬󠁶󠀰󠀶[󠀳-󠀶]|󠁬󠁶󠀰󠀶[󠀰-󠀱]|󠁵󠁧󠀱󠀱[󠀰-󠀹]|󠁵󠁧󠀱󠀲[󠀰-󠀶]|󠁵󠁧󠀲󠀰[󠀱-󠀹]|󠁵󠁧󠀲󠀱[󠀰-󠀹]|󠁧󠁢󠁳󠁴[󠁳-󠁴]|󠁵󠁧󠀲󠀲[󠀰-󠀹]|󠁧󠁢󠁳󠁴[󠁧-󠁨]|󠁵󠁧󠀲󠀳[󠀰-󠀷]|󠁵󠁧󠀳󠀰[󠀱-󠀹]|󠁵󠁧󠀳󠀱[󠀰-󠀹]|󠁵󠁧󠀳󠀲[󠀰-󠀹]|󠁵󠁧󠀳󠀳[󠀰-󠀷]|󠁵󠁧󠀴󠀰[󠀱-󠀹]|󠁵󠁧󠀴󠀱[󠀰-󠀹]|󠁵󠁧󠀴󠀲[󠀰-󠀹]|󠁵󠁧󠀴󠀳[󠀰-󠀵]|󠁧󠁢󠁳󠁯[󠁬-󠁭]|󠁰󠁳󠁪󠁥[󠁭-󠁮]|󠁧󠁢󠁢󠁤[󠁦-󠁧]|󠁧󠁢󠁳󠁬[󠁦-󠁧]|󠁧󠁢󠁢󠁲[󠁣-󠁤]|󠁡󠁺󠁳󠁡[󠁫-󠁬]|󠁭󠁮󠀰󠀶[󠀳-󠀵]|󠁬󠁶󠀱󠀱[󠀱-󠀳]|󠁬󠁶󠀱󠀰[󠀱-󠀲]|󠁣󠁺󠀷󠀲[󠀱-󠀴]|󠁧󠁢󠁤󠁮[󠁣-󠁤]|󠁣󠁺󠀸󠀰[󠀱-󠀶]|󠁬󠁶󠀰󠀸[󠀷-󠀹]|󠁮󠁬󠁢󠁱[󠀱-󠀳]|󠁥󠁥󠀴󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀶[󠀷-󠀸]|󠁬󠁶󠀰󠀵[󠀸-󠀹]|󠁩󠁳󠁳󠁫[󠁦-󠁧]|󠁥󠁥󠀴󠀳[󠀰-󠀲]|󠁥󠁥󠀱󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀱[󠀵-󠀶]|󠁰󠁷󠀲󠀲[󠀶-󠀸]|󠁥󠁥󠀲󠀸[󠀳-󠀴]|󠁧󠁢󠁡󠁢[󠁣-󠁥]|󠁵󠁧󠀱󠀰[󠀱-󠀹]|󠁭󠁫󠀶󠀰[󠀱-󠀹]|󠁭󠁫󠀷󠀰[󠀱-󠀶]|󠁭󠁫󠀸󠀰[󠀱-󠀹]|󠁭󠁫󠀸󠀱[󠀰-󠀷]|󠁭󠁡󠁫󠁨[󠁮-󠁯]|󠁳󠁩󠀲󠀱[󠀰-󠀳]|󠁳󠁩󠀲󠀰[󠀰-󠀹]|󠁳󠁩󠀱󠀹[󠀰-󠀹]|󠁳󠁩󠀱󠀸[󠀰-󠀹]|󠁳󠁩󠀱󠀷[󠀰-󠀹]|󠁳󠁩󠀱󠀶[󠀰-󠀹]|󠁳󠁩󠀱󠀵[󠀰-󠀹]|󠁢󠁦󠁫󠁯[󠁳-󠁴]|󠁳󠁩󠀱󠀴[󠀶-󠀹]|󠁳󠁩󠀱󠀴[󠀰-󠀴]|󠁭󠁡󠁧󠁵[󠁥-󠁦]|󠁭󠁨󠁡󠁬[󠁫-󠁬]|󠁡󠁦󠁢󠁡[󠁬-󠁭]|󠁡󠁺󠁺󠁡[󠁱-󠁲]|󠁢󠁦󠁢󠁡[󠁬-󠁮]|󠁭󠁫󠀱󠀰[󠀱-󠀹]|󠁭󠁫󠀲󠀰[󠀱-󠀹]|󠁭󠁡󠁳󠁩[󠁫-󠁬]|󠁭󠁫󠀲󠀱[󠀰-󠀱]|󠁭󠁫󠀳󠀰[󠀳-󠀴]|󠁭󠁫󠀳󠀰[󠀷-󠀸]|󠁭󠁫󠀳󠀱[󠀰-󠀳]|󠁣󠁺󠀲󠀰[󠀱-󠀹]|󠁣󠁺󠀲󠀰[󠁡-󠁣]|󠁭󠁫󠀴󠀰[󠀱-󠀹]|󠁣󠁺󠀳󠀱[󠀱-󠀷]|󠁭󠁫󠀵󠀰[󠀱-󠀹]|󠁳󠁩󠀱󠀳[󠀰-󠀹]|󠁳󠁩󠀰󠀸[󠀰-󠀹]|󠁳󠁩󠀰󠀹[󠀰-󠀹]|󠁳󠁩󠀱󠀰[󠀰-󠀹]|󠁳󠁩󠀰󠀱[󠀰-󠀹]|󠁳󠁩󠀰󠀷[󠀰-󠀹]|󠁳󠁩󠀰󠀲[󠀰-󠀹]|󠁰󠁧󠁭󠁰[󠁬-󠁭]|󠁳󠁩󠀱󠀱[󠀰-󠀹]|󠁳󠁩󠀱󠀲[󠀰-󠀹]|󠁳󠁩󠀰󠀳[󠀰-󠀹]|󠁳󠁩󠀰󠀶[󠀰-󠀹]|󠁰󠁨󠁣󠁡[󠁳-󠁴]|󠁳󠁩󠀰󠀴[󠀰-󠀹]|󠁣󠁺󠀱󠀰[󠁡-󠁦]|󠁰󠁨󠁣󠁡[󠁭-󠁮]|󠁣󠁺󠀱󠀰[󠀱-󠀹]|󠁰󠁨󠁢󠁵[󠁫-󠁬]|󠁳󠁩󠀰󠀵[󠀰-󠀹]|󠁣󠁺󠀱󠀱[󠀰-󠀹]|󠁡󠁯󠁣󠁮[󠁮-󠁯]|󠁳󠁩󠀰󠀰[󠀱-󠀹]|󠁣󠁶󠁳[󠁬-󠁭]|󠁬󠁩󠀱[󠀰-󠀱]|󠁢󠁦󠀰[󠀱-󠀹]|󠁺󠁷󠁭[󠁶-󠁷]|󠁢󠁲󠁡[󠁬-󠁭]|󠁬󠁫󠀱[󠀱-󠀳]|󠁬󠁫󠀲[󠀱-󠀳]|󠁢󠁦󠀱[󠀰-󠀳]|󠁬󠁫󠀳[󠀱-󠀳]|󠁬󠁫󠀴[󠀱-󠀵]|󠁢󠁲󠁭[󠁳-󠁴]|󠁫󠁨󠀱[󠀰-󠀹]|󠁫󠁲󠀳[󠀰-󠀱]|󠁺󠁭󠀰[󠀱-󠀹]|󠁵󠁳󠁭[󠁤-󠁥]|󠁵󠁳󠁭[󠁮-󠁯]|󠁵󠁳󠁭[󠁳-󠁴]|󠁵󠁳󠁮[󠁣-󠁥]|󠁬󠁫󠀹[󠀱-󠀲]|󠁬󠁫󠀸[󠀱-󠀲]|󠁬󠁫󠀷[󠀱-󠀲]|󠁵󠁳󠁳[󠁣-󠁤]|󠁪󠁰󠀰[󠀱-󠀹]|󠁡󠁬󠁫[󠁡-󠁣]|󠁪󠁰󠀱[󠀰-󠀹]|󠁪󠁰󠀲[󠀰-󠀹]|󠁢󠁲󠁲[󠁲-󠁳]|󠁢󠁲󠁲[󠁮-󠁯]|󠁬󠁫󠀶[󠀱-󠀲]|󠁬󠁫󠀵[󠀱-󠀳]|󠁢󠁲󠁰[󠁡-󠁢]|󠁪󠁰󠀳[󠀰-󠀹]|󠁪󠁰󠀴[󠀰-󠀷]|󠁫󠁥󠀰[󠀱-󠀹]|󠁫󠁥󠀱[󠀰-󠀹]|󠁫󠁥󠀲[󠀰-󠀹]|󠁫󠁥󠀳[󠀰-󠀹]|󠁫󠁥󠀴[󠀰-󠀷]|󠁫󠁲󠀴[󠀱-󠀹]|󠁮󠁧󠁫[󠁤-󠁥]|󠁲󠁳󠀰[󠀰-󠀹]|󠁶󠁮󠀴[󠀳-󠀷]|󠁲󠁵󠁫[󠁫-󠁬]|󠁶󠁮󠀵[󠀰-󠀹]|󠁶󠁮󠀶[󠀶-󠀹]|󠁶󠁮󠀷[󠀰-󠀳]|󠁬󠁡󠁢[󠁫-󠁬]|󠁲󠁵󠁫[󠁢-󠁣]|󠁫󠁺󠀶[󠀱-󠀳]|󠁢󠁩󠁢[󠁬-󠁭]|󠁢󠁧󠀱[󠀰-󠀹]|󠁢󠁧󠀲[󠀰-󠀸]|󠁢󠁨󠀱[󠀳-󠀵]|󠁫󠁲󠀲[󠀶-󠀹]|󠁫󠁰󠀱[󠀳-󠀵]|󠁣󠁵󠀰[󠀳-󠀹]|󠁫󠁮󠀰[󠀱-󠀹]|󠁫󠁮󠀱[󠀰-󠀳]|󠁲󠁳󠀱[󠀰-󠀹]|󠁲󠁳󠀲[󠀰-󠀹]|󠁫󠁰󠀰[󠀱-󠀹]|󠁬󠁩󠀰[󠀱-󠀹]|󠁵󠁹󠁲[󠁮-󠁯]|󠁬󠁣󠀱[󠀰-󠀲]|󠁬󠁣󠀰[󠀵-󠀸]|󠁬󠁣󠀰[󠀱-󠀳]|󠁬󠁢󠁢[󠁨-󠁩]|󠁭󠁹󠀰[󠀱-󠀹]|󠁭󠁹󠀱[󠀰-󠀶]|󠁢󠁪󠁡[󠁫-󠁬]|󠁶󠁣󠀰[󠀱-󠀶]|󠁫󠁺󠀱[󠀰-󠀱]|󠁮󠁧󠁫[󠁮-󠁯]|󠁶󠁮󠀰[󠀱-󠀷]|󠁶󠁮󠀱[󠀳-󠀴]|󠁶󠁮󠀲[󠀰-󠀹]|󠁫󠁨󠀲[󠀰-󠀵]|󠁣󠁵󠀱[󠀰-󠀶]|󠁶󠁮󠀳[󠀰-󠀷]|󠁮󠁡󠁯[󠁳-󠁴]|󠁢󠁧󠀰[󠀱-󠀹]|󠁶󠁮󠀴[󠀰-󠀱]|󠁴󠁨󠀲[󠀰-󠀷]|󠁴󠁨󠀳[󠀰-󠀹]|󠁴󠁨󠀴[󠀰-󠀹]|󠁴󠁨󠀵[󠀰-󠀸]|󠁴󠁨󠀶[󠀰-󠀷]|󠁴󠁨󠀷[󠀰-󠀷]|󠁴󠁨󠀸[󠀰-󠀶]|󠁴󠁨󠀹[󠀰-󠀶]|󠁣󠁤󠁨[󠁫-󠁬]|󠁣󠁡󠁮[󠁳-󠁵]|󠁳󠁧󠀰[󠀱-󠀵]|󠁴󠁮󠀱[󠀱-󠀴]|󠁴󠁮󠀲[󠀱-󠀳]|󠁴󠁮󠀳[󠀱-󠀴]|󠁴󠁮󠀴[󠀱-󠀳]|󠁴󠁮󠀵[󠀱-󠀳]|󠁴󠁮󠀷[󠀱-󠀳]|󠁴󠁮󠀸[󠀱-󠀳]|󠁴󠁯󠀰[󠀱-󠀵]|󠁴󠁲󠀰[󠀱-󠀹]|󠁴󠁲󠀱[󠀰-󠀹]|󠁴󠁲󠀲[󠀰-󠀹]|󠁴󠁲󠀳[󠀰-󠀹]|󠁴󠁲󠀴[󠀰-󠀹]|󠁴󠁲󠀵[󠀰-󠀹]|󠁴󠁲󠀶[󠀰-󠀹]|󠁴󠁲󠀷[󠀰-󠀹]|󠁴󠁲󠀸[󠀰-󠀱]|󠁭󠁡󠀱[󠀰-󠀲]|󠁭󠁥󠀲[󠀰-󠀵]|󠁭󠁥󠀱[󠀰-󠀹]|󠁭󠁥󠀰[󠀱-󠀹]|󠁥󠁳󠁭[󠁣-󠁤]|󠁭󠁤󠁳[󠁮-󠁯]|󠁥󠁳󠁴[󠁥-󠁦]|󠁭󠁤󠁣[󠁲-󠁵]|󠁭󠁤󠁣[󠁬-󠁭]|󠁭󠁤󠁢[󠁲-󠁳]|󠁭󠁣󠁳[󠁯-󠁰]|󠁥󠁴󠁳[󠁮-󠁯]|󠁦󠁩󠀰[󠀲-󠀹]|󠁦󠁩󠀱[󠀰-󠀹]|󠁦󠁪󠀰[󠀱-󠀹]|󠁦󠁪󠀱[󠀰-󠀴]|󠁳󠁴󠀰[󠀱-󠀶]|󠁣󠁨󠁺[󠁧-󠁨]|󠁣󠁨󠁳[󠁧-󠁨]|󠁳󠁹󠁨[󠁬-󠁭]|󠁳󠁮󠁫[󠁤-󠁥]|󠁣󠁮󠁨[󠁡-󠁢]|󠁣󠁧󠀱[󠀱-󠀶]|󠁣󠁮󠁨[󠁫-󠁬]|󠁳󠁭󠀰[󠀱-󠀹]|󠁭󠁭󠀰[󠀱-󠀷]|󠁭󠁭󠀱[󠀱-󠀸]|󠁣󠁮󠁳[󠁣-󠁤]|󠁣󠁤󠁭[󠁮-󠁯]|󠁴󠁨󠀱[󠀰-󠀹]|󠁭󠁴󠀵[󠀰-󠀹]|󠁭󠁴󠀶[󠀰-󠀸]|󠁥󠁳󠁣[󠁲-󠁵]|󠁳󠁢󠁭[󠁫-󠁬]|󠁥󠁳󠁣[󠁬-󠁯]|󠁥󠁳󠁣[󠁡-󠁣]|󠁥󠁳󠁡[󠁲-󠁳]|󠁭󠁶󠀰[󠀰-󠀵]|󠁭󠁶󠀰[󠀷-󠀸]|󠁭󠁶󠀱[󠀲-󠀴]|󠁳󠁡󠀱[󠀰-󠀲]|󠁢󠁷󠁳[󠁯-󠁰]|󠁳󠁡󠀰[󠀱-󠀹]|󠁲󠁷󠀰[󠀱-󠀵]|󠁭󠁶󠀲[󠀳-󠀹]|󠁭󠁷󠁫[󠁲-󠁳]|󠁭󠁷󠁭[󠁧-󠁨]|󠁢󠁴󠀴[󠀱-󠀵]|󠁢󠁴󠀳[󠀱-󠀴]|󠁢󠁴󠀲[󠀱-󠀴]|󠁢󠁴󠀱[󠀱-󠀵]|󠁵󠁳󠁡[󠁫-󠁬]|󠁬󠁴󠀵[󠀰-󠀹]|󠁬󠁴󠀴[󠀰-󠀹]|󠁬󠁴󠀳[󠀰-󠀹]|󠁢󠁳󠁮[󠁯-󠁰]|󠁬󠁴󠀲[󠀰-󠀹]|󠁬󠁴󠀱[󠀰-󠀹]|󠁬󠁴󠀰[󠀱-󠀹]|󠁭󠁡󠀰[󠀱-󠀹]|󠁦󠁲󠀰[󠀱-󠀹]|󠁦󠁲󠀱[󠀰-󠀹]|󠁦󠁲󠀲[󠀱-󠀹]|󠁦󠁲󠀲[󠁡-󠁢]|󠁦󠁲󠀳[󠀰-󠀹]|󠁦󠁲󠀴[󠀰-󠀹]|󠁦󠁲󠀵[󠀰-󠀹]|󠁦󠁲󠀶[󠀰-󠀹]|󠁬󠁹󠁭[󠁩-󠁪]|󠁳󠁥󠁡[󠁢-󠁣]|󠁦󠁲󠀷[󠀰-󠀴]|󠁦󠁲󠀷[󠀶-󠀹]|󠁦󠁲󠀸[󠀰-󠀹]|󠁦󠁲󠀹[󠀰-󠀵]|󠁭󠁲󠀰[󠀱-󠀹]|󠁭󠁲󠀱[󠀰-󠀵]|󠁭󠁴󠀰[󠀱-󠀹]|󠁭󠁴󠀱[󠀰-󠀹]|󠁭󠁴󠀲[󠀰-󠀹]|󠁭󠁴󠀳[󠀰-󠀹]|󠁭󠁴󠀴[󠀰-󠀹]|󠁳󠁣󠀲[󠀰-󠀷]|󠁳󠁣󠀱[󠀰-󠀹]|󠁴󠁺󠀰[󠀱-󠀹]|󠁴󠁺󠀱[󠀰-󠀹]|󠁴󠁺󠀲[󠀰-󠀹]|󠁴󠁺󠀳[󠀰-󠀱]|󠁳󠁣󠀰[󠀱-󠀹]|󠁲󠁯󠁴[󠁬-󠁭]|󠁩󠁲󠀱[󠀰-󠀹]|󠁩󠁴󠁭[󠁳-󠁴]|󠁩󠁤󠁳[󠁬-󠁮]|󠁩󠁴󠁭[󠁮-󠁯]|󠁩󠁴󠁡[󠁰-󠁲]|󠁩󠁲󠀰[󠀰-󠀹]|󠁮󠁲󠀱[󠀰-󠀴]|󠁮󠁲󠀰[󠀱-󠀹]|󠁩󠁴󠁭[󠁢-󠁣]|󠁩󠁤󠁳[󠁲-󠁵]|󠁮󠁰󠁰[󠀱-󠀷]|󠁩󠁥󠁣[󠁮-󠁯]|󠁤󠁭󠀱[󠀰-󠀱]|󠁩󠁴󠁬[󠁴-󠁵]|󠁰󠁹󠀱[󠀰-󠀶]|󠁤󠁯󠀰[󠀱-󠀹]|󠁧󠁮󠁫[󠁮-󠁯]|󠁧󠁮󠁫[󠁤-󠁥]|󠁤󠁺󠀱[󠀰-󠀹]|󠁤󠁺󠀲[󠀰-󠀹]|󠁰󠁬󠁳[󠁫-󠁬]|󠁩󠁤󠁰[󠁡-󠁢]|󠁩󠁤󠁰[󠁤-󠁥]|󠁩󠁴󠁰[󠁴-󠁶]|󠁩󠁤󠁰[󠁳-󠁴]|󠁧󠁮󠁭[󠁬-󠁭]|󠁭󠁫󠀶[󠀰-󠀹]|󠁮󠁩󠁭[󠁳-󠁴]|󠁭󠁫󠀷[󠀰-󠀹]|󠁭󠁫󠀸[󠀰-󠀵]|󠁤󠁺󠀳[󠀰-󠀹]|󠁩󠁴󠁰[󠁮-󠁯]|󠁩󠁤󠁳[󠁡-󠁢]|󠁩󠁴󠁰[󠁣-󠁥]|󠁩󠁲󠀲[󠀰-󠀹]|󠁧󠁮󠁭[󠁣-󠁤]|󠁥󠁣󠁳[󠁤-󠁥]|󠁩󠁴󠁢[󠁲-󠁴]|󠁩󠁮󠁴[󠁲-󠁳]|󠁮󠁯󠀲[󠀱-󠀲]|󠁰󠁨󠀴[󠀰-󠀱]|󠁰󠁨󠀱[󠀰-󠀵]|󠁰󠁨󠀰[󠀵-󠀹]|󠁡󠁧󠀰[󠀳-󠀸]|󠁩󠁴󠁣[󠁲-󠁴]|󠁩󠁴󠁣[󠁮-󠁯]|󠁡󠁧󠀱[󠀰-󠀱]|󠁰󠁴󠀱[󠀰-󠀸]|󠁩󠁴󠁣[󠁡-󠁢]|󠁰󠁴󠀰[󠀱-󠀹]|󠁡󠁬󠀰[󠀱-󠀹]|󠁡󠁬󠀱[󠀰-󠀲]|󠁰󠁨󠀰[󠀰-󠀳]|󠁮󠁯󠀱[󠀶-󠀷]|󠁧󠁮󠁫[󠁡-󠁢]|󠁩󠁥󠁭[󠁮-󠁯]|󠁧󠁮󠁢[󠁥-󠁦]|󠁤󠁯󠀱[󠀰-󠀹]|󠁩󠁲󠀳[󠀱-󠀲]|󠁩󠁥󠁷[󠁷-󠁸]|󠁤󠁯󠀲[󠀰-󠀹]|󠁩󠁮󠁡[󠁲-󠁳]|󠁩󠁮󠁣[󠁧-󠁨]|󠁤󠁯󠀳[󠀰-󠀹]|󠁤󠁺󠀴[󠀰-󠀹]|󠁧󠁥󠁳[󠁪-󠁫]|󠁧󠁤󠀰[󠀱-󠀶]|󠁤󠁺󠀵[󠀰-󠀸]|󠁮󠁯󠀰[󠀱-󠀲]|󠁮󠁯󠀰[󠀴-󠀹]|󠁩󠁴󠁢[󠁮-󠁯]|󠁤󠁯󠀴[󠀰-󠀲]|󠁩󠁱󠁢[󠁡-󠁢]|󠁨󠁴󠁮[󠁤-󠁥]|󠁧󠁲󠀷[󠀱-󠀳]|󠁨󠁲󠀲[󠀰-󠀱]|󠁨󠁲󠀱[󠀰-󠀹]|󠁨󠁲󠀰[󠀱-󠀹]|󠁨󠁴󠁳[󠁤-󠁥]|󠁢󠁡󠀰[󠀱-󠀹]|󠁨󠁮󠁣[󠁬-󠁭]|󠁨󠁵󠁳[󠁮-󠁯]|󠁧󠁲󠀶[󠀱-󠀴]|󠁪󠁭󠀱[󠀰-󠀴]|󠁣󠁩󠀰[󠀱-󠀹]|󠁨󠁵󠁳[󠁳-󠁴]|󠁧󠁷󠁢[󠁬-󠁭]|󠁧󠁴󠀲[󠀰-󠀲]|󠁣󠁩󠀱[󠀰-󠀹]|󠁣󠁮󠀱[󠀱-󠀵]|󠁣󠁮󠀲[󠀱-󠀳]|󠁭󠁫󠀲[󠀰-󠀹]|󠁢󠁤󠀶[󠀰-󠀴]|󠁢󠁤󠀵[󠀰-󠀹]|󠁢󠁤󠀴[󠀰-󠀹]|󠁢󠁤󠀳[󠀰-󠀹]|󠁢󠁤󠀲[󠀰-󠀹]|󠁢󠁤󠀱[󠀰-󠀹]|󠁢󠁤󠀰[󠀱-󠀹]|󠁢󠁢󠀱[󠀰-󠀱]|󠁡󠁬󠁰[󠁱-󠁲]|󠁢󠁢󠀰[󠀱-󠀹]|󠁤󠁫󠀸[󠀱-󠀵]|󠁩󠁴󠀷[󠀷-󠀸]|󠁧󠁲󠀹[󠀱-󠀴]|󠁤󠁪󠁡[󠁲-󠁳]|󠁡󠁤󠀰[󠀲-󠀸]|󠁣󠁹󠀰[󠀱-󠀶]|󠁧󠁲󠀸[󠀱-󠀵]|󠁤󠁪󠁤[󠁩-󠁪]|󠁭󠁡󠀱[󠀳-󠀶]|󠁩󠁴󠁶[󠁡-󠁣]|󠁩󠁤󠁫[󠁲-󠁵]|󠁭󠁫󠀳[󠀰-󠀹]|󠁧󠁲󠀴[󠀱-󠀴]|󠁭󠁫󠀴[󠀰-󠀹]|󠁧󠁲󠀳[󠀱-󠀴]|󠁧󠁲󠀲[󠀱-󠀴]|󠁩󠁤󠁮[󠁴-󠁵]|󠁩󠁴󠁴[󠁲-󠁳]|󠁩󠁴󠁴[󠁮-󠁰]|󠁧󠁲󠀱[󠀱-󠀷]|󠁩󠁴󠁳[󠁵-󠁶]|󠁩󠁴󠁳[󠁲-󠁳]|󠁩󠁴󠁳[󠁯-󠁰]|󠁧󠁲󠀰[󠀳-󠀷]|󠁭󠁫󠀰[󠀱-󠀹]|󠁤󠁺󠀰[󠀱-󠀹]|󠁣󠁮󠀳[󠀱-󠀷]|󠁣󠁮󠀴[󠀱-󠀶]|󠁣󠁮󠀵[󠀰-󠀴]|󠁧󠁴󠀱[󠀰-󠀹]|󠁭󠁫󠀵[󠀰-󠀹]|󠁤󠁭󠀰[󠀲-󠀹]|󠁣󠁮󠀶[󠀱-󠀵]|󠁭󠁫󠀱[󠀰-󠀹]|󠁧󠁴󠀰[󠀱-󠀹]|󠁪󠁭󠀰[󠀱-󠀹]|󠁧󠁲󠀵[󠀱-󠀹]|󠁣󠁮󠀹[󠀱-󠀲]|󠁩󠁤󠁢[󠁡-󠁢]|󠁲󠁯󠁣[󠁳-󠁴]|󠁩󠁤󠁪[󠁡-󠁢]|󠁩󠁤󠁫[󠁡-󠁢]|󠁩󠁴󠁲[󠁭-󠁯]|󠁴󠁭[󠁡-󠁢]|󠁳󠁥[󠁷-󠁺]|󠁡󠁲[󠁪-󠁮]|󠁡󠁲[󠁰-󠁺]|󠁡󠁴[󠀱-󠀹]|󠁬󠁳[󠁡-󠁨]|󠁬󠁳[󠁪-󠁫]|󠁶󠁥[󠁲-󠁺]|󠁰󠁹[󠀲-󠀹]|󠁣󠁲[󠁧-󠁨]|󠁦󠁲[󠁨-󠁬]|󠁦󠁲[󠁤-󠁧]|󠁭󠁺[󠁰-󠁱]|󠁦󠁲[󠁡-󠁢]|󠁭󠁺[󠁳-󠁴]|󠁴󠁭[󠁬-󠁭]|󠁳󠁥[󠁳-󠁵]|󠁳󠁥[󠁣-󠁩]|󠁮󠁥[󠀱-󠀸]|󠁩󠁳[󠀱-󠀸]|󠁧󠁡[󠀱-󠀹]|󠁳󠁥[󠁭-󠁯]|󠁧󠁲[󠁡-󠁭]|󠁫󠁨[󠀳-󠀹]|󠁫󠁧[󠁮-󠁯]|󠁭󠁧[󠁴-󠁵]|󠁫󠁧[󠁢-󠁣]|󠁮󠁰[󠀱-󠀵]|󠁥󠁣[󠁷-󠁺]|󠁥󠁣[󠁴-󠁵]|󠁥󠁣[󠁲-󠁳]|󠁥󠁣[󠁬-󠁰]|󠁡󠁲[󠁡-󠁨]|󠁥󠁣[󠁡-󠁩]|󠁭󠁬[󠀲-󠀹]|󠁦󠁲[󠁵-󠁶]|󠁢󠁯[󠁳-󠁴]|󠁢󠁯[󠁮-󠁰]|󠁢󠁯[󠁢-󠁣]|󠁦󠁲[󠁳-󠁴]|󠁧󠁭[󠁬-󠁮]|󠁦󠁲[󠁱-󠁲]|󠁰󠁡[󠀲-󠀹]|󠁣󠁧[󠀷-󠀹]|󠁭󠁺[󠁡-󠁢]|󠁦󠁲[󠁯-󠁰]|󠁶󠁥[󠁡-󠁰]|󠁢󠁤[󠁡-󠁨]|󠁰󠁥󠁴󠁡󠁣|󠁰󠁥󠁴󠁵󠁭|󠁰󠁥󠁵󠁣󠁡|󠁰󠁧󠁣󠁰󠁫|󠁰󠁧󠁣󠁰󠁭|󠁰󠁥󠁳󠁡󠁭|󠁰󠁥󠁰󠁵󠁮|󠁰󠁥󠁰󠁩󠁵|󠁰󠁥󠁰󠁡󠁳|󠁰󠁥󠁭󠁯󠁱|󠁰󠁥󠁭󠁤󠁤|󠁰󠁥󠁬󠁯󠁲|󠁰󠁥󠁬󠁭󠁡|󠁰󠁥󠁬󠁩󠁭|󠁰󠁥󠁪󠁵󠁮|󠁰󠁥󠁩󠁣󠁡|󠁰󠁥󠁨󠁵󠁶|󠁰󠁥󠁨󠁵󠁣|󠁭󠁮󠀰󠀴󠀹|󠁰󠁥󠁣󠁵󠁳|󠁰󠁥󠁣󠁡󠁬|󠁭󠁮󠀰󠀳󠀷|󠁭󠁮󠀰󠀳󠀵|󠁰󠁨󠁡󠁬󠁢|󠁭󠁬󠁢󠁫󠁯|󠁭󠁫󠀴󠀱󠀰|󠁭󠁫󠀳󠀰󠀱|󠁭󠁨󠁷󠁴󠁪|󠁭󠁨󠁷󠁴󠁨|󠁭󠁨󠁵󠁴󠁩|󠁭󠁨󠁵󠁪󠁡|󠁭󠁨󠁲󠁯󠁮|󠁭󠁨󠁮󠁭󠁵|󠁭󠁨󠁮󠁭󠁫|󠁭󠁨󠁭󠁩󠁬|󠁭󠁨󠁭󠁥󠁪|󠁭󠁨󠁭󠁡󠁬|󠁭󠁨󠁭󠁡󠁪|󠁭󠁨󠁬󠁩󠁫|󠁭󠁨󠁬󠁩󠁢|󠁭󠁨󠁬󠁡󠁥|󠁭󠁨󠁫󠁷󠁡|󠁭󠁨󠁫󠁩󠁬|󠁭󠁨󠁪󠁡󠁬|󠁭󠁨󠁪󠁡󠁢|󠁭󠁨󠁥󠁮󠁩|󠁰󠁧󠁥󠁢󠁲|󠁰󠁧󠁥󠁨󠁧|󠁰󠁧󠁥󠁰󠁷|󠁰󠁧󠁥󠁳󠁷|󠁰󠁧󠁧󠁰󠁫|󠁰󠁧󠁨󠁬󠁡|󠁰󠁧󠁪󠁷󠁫|󠁭󠁮󠀰󠀴󠀳|󠁭󠁮󠀰󠀴󠀱|󠁰󠁧󠁭󠁢󠁡|󠁰󠁧󠁭󠁲󠁬|󠁰󠁧󠁮󠁣󠁤|󠁰󠁧󠁮󠁩󠁫|󠁰󠁧󠁮󠁰󠁰|󠁰󠁧󠁮󠁳󠁢|󠁰󠁧󠁳󠁡󠁮|󠁰󠁧󠁳󠁨󠁭|󠁰󠁧󠁷󠁢󠁫|󠁰󠁧󠁷󠁨󠁭|󠁰󠁧󠁷󠁰󠁤|󠁰󠁨󠁡󠁢󠁲|󠁰󠁨󠁡󠁧󠁮|󠁰󠁨󠁡󠁧󠁳|󠁭󠁮󠀰󠀳󠀹|󠁰󠁨󠁡󠁫󠁬|󠁭󠁸󠁴󠁡󠁢|󠁭󠁸󠁴󠁡󠁭|󠁭󠁸󠁴󠁬󠁡|󠁭󠁸󠁶󠁥󠁲|󠁭󠁸󠁹󠁵󠁣|󠁭󠁸󠁺󠁡󠁣|󠁥󠁧󠁡󠁳󠁴|󠁥󠁧󠁡󠁳󠁮|󠁭󠁺󠁭󠁰󠁭|󠁥󠁥󠀴󠀴󠀶|󠁥󠁥󠀴󠀷󠀸|󠁥󠁧󠁡󠁬󠁸|󠁥󠁥󠀹󠀲󠀸|󠁥󠁥󠀹󠀱󠀹|󠁥󠁥󠀹󠀱󠀷|󠁥󠁥󠀹󠀰󠀷|󠁥󠁥󠀴󠀸󠀰|󠁥󠁥󠀹󠀰󠀳|󠁭󠁸󠁯󠁡󠁸|󠁥󠁥󠀲󠀷󠀲|󠁥󠁥󠀲󠀹󠀱|󠁭󠁸󠁰󠁵󠁥|󠁥󠁥󠀲󠀹󠀳|󠁭󠁸󠁱󠁵󠁥|󠁥󠁥󠀲󠀹󠀶|󠁭󠁸󠁲󠁯󠁯|󠁥󠁥󠀳󠀰󠀳|󠁭󠁸󠁳󠁩󠁮|󠁥󠁥󠀳󠀰󠀵|󠁥󠁥󠀳󠀱󠀷|󠁭󠁸󠁳󠁬󠁰|󠁥󠁥󠀳󠀲󠀱|󠁥󠁥󠀳󠀳󠀸|󠁥󠁥󠀳󠀵󠀳|󠁥󠁥󠀴󠀲󠀴|󠁭󠁸󠁳󠁯󠁮|󠁥󠁥󠀴󠀸󠀶|󠁥󠁥󠀷󠀳󠀲|󠁥󠁥󠀷󠀲󠀶|󠁥󠁥󠀷󠀱󠀹|󠁥󠁥󠀷󠀱󠀴|󠁥󠁥󠀷󠀱󠀲|󠁥󠁥󠀷󠀰󠀸|󠁥󠁥󠀵󠀸󠀶|󠁥󠁥󠀶󠀱󠀵|󠁥󠁥󠀶󠀱󠀸|󠁥󠁥󠀶󠀹󠀸|󠁥󠁥󠀶󠀸󠀹|󠁥󠁥󠀶󠀶󠀸|󠁥󠁥󠀶󠀶󠀳|󠁥󠁥󠀶󠀶󠀱|󠁥󠁥󠀶󠀲󠀲|󠁥󠁥󠀶󠀲󠀴|󠁥󠁥󠀶󠀳󠀸|󠁥󠁥󠀶󠀵󠀱|󠁥󠁥󠀵󠀰󠀳|󠁥󠁥󠀹󠀰󠀱|󠁥󠁥󠀸󠀹󠀹|󠁥󠁥󠀸󠀹󠀷|󠁥󠁥󠀸󠀹󠀰|󠁥󠁥󠀵󠀱󠀱|󠁥󠁥󠀸󠀵󠀵|󠁥󠁥󠀵󠀱󠀴|󠁥󠁥󠀸󠀳󠀴|󠁥󠁥󠀸󠀲󠀴|󠁥󠁥󠀵󠀲󠀸|󠁥󠁥󠀸󠀰󠀹|󠁥󠁥󠀸󠀰󠀳|󠁥󠁥󠀷󠀹󠀶|󠁥󠁥󠀵󠀵󠀷|󠁥󠁥󠀷󠀸󠀴|󠁥󠁥󠀷󠀳󠀵|󠁥󠁥󠀵󠀶󠀷|󠁥󠁥󠀶󠀵󠀳|󠁥󠁥󠀱󠀸󠀴|󠁥󠁥󠀱󠀹󠀱|󠁮󠁺󠁷󠁴󠁣|󠁮󠁺󠁷󠁫󠁯|󠁮󠁺󠁷󠁧󠁮|󠁭󠁶󠁭󠁬󠁥|󠁥󠁧󠁷󠁡󠁤|󠁥󠁧󠁳󠁵󠁺|󠁥󠁧󠁳󠁩󠁮|󠁮󠁺󠁴󠁫󠁩|󠁥󠁧󠁳󠁨󠁲|󠁮󠁺󠁴󠁡󠁳|󠁥󠁧󠁳󠁨󠁧|󠁮󠁺󠁳󠁴󠁬|󠁮󠁺󠁯󠁴󠁡|󠁮󠁺󠁮󠁴󠁬|󠁮󠁺󠁮󠁳󠁮|󠁮󠁺󠁭󠁷󠁴|󠁭󠁮󠀰󠀵󠀱|󠁰󠁥󠁣󠁡󠁪|󠁰󠁥󠁡󠁹󠁡|󠁰󠁥󠁡󠁲󠁥|󠁰󠁥󠁡󠁰󠁵|󠁭󠁮󠀰󠀵󠀳|󠁭󠁮󠀰󠀵󠀵|󠁭󠁮󠀰󠀵󠀷|󠁭󠁮󠀰󠀵󠀹|󠁭󠁮󠀰󠀶󠀱|󠁰󠁥󠁡󠁮󠁣|󠁭󠁮󠀰󠀶󠀷|󠁭󠁮󠀰󠀶󠀹|󠁭󠁮󠀰󠀷󠀱|󠁰󠁥󠁡󠁭󠁡|󠁭󠁮󠀰󠀷󠀳|󠁥󠁥󠀱󠀳󠀰|󠁥󠁥󠀱󠀷󠀱|󠁮󠁺󠁭󠁢󠁨|󠁭󠁸󠁣󠁨󠁰|󠁭󠁸󠁣󠁭󠁸|󠁭󠁸󠁣󠁯󠁡|󠁭󠁸󠁣󠁯󠁬|󠁭󠁸󠁤󠁵󠁲|󠁭󠁸󠁧󠁲󠁯|󠁭󠁸󠁧󠁵󠁡|󠁥󠁥󠀲󠀱󠀴|󠁭󠁸󠁨󠁩󠁤|󠁥󠁥󠀲󠀴󠀵|󠁭󠁸󠁪󠁡󠁬|󠁭󠁸󠁭󠁥󠁸|󠁭󠁸󠁭󠁩󠁣|󠁭󠁸󠁭󠁯󠁲|󠁭󠁸󠁮󠁡󠁹|󠁥󠁥󠀲󠀴󠀷|󠁥󠁥󠀲󠀵󠀱|󠁭󠁸󠁮󠁬󠁥|󠁮󠁺󠁨󠁫󠁢|󠁮󠁺󠁧󠁩󠁳|󠁮󠁺󠁣󠁩󠁴|󠁥󠁧󠁰󠁴󠁳|󠁥󠁧󠁭󠁮󠁦|󠁥󠁧󠁫󠁦󠁳|󠁥󠁧󠁦󠁹󠁭|󠁥󠁧󠁢󠁮󠁳|󠁭󠁸󠁡󠁧󠁵|󠁮󠁺󠁣󠁡󠁮|󠁭󠁸󠁢󠁣󠁮|󠁮󠁺󠁢󠁯󠁰|󠁮󠁺󠁡󠁵󠁫|󠁥󠁥󠀱󠀹󠀸|󠁥󠁥󠀲󠀰󠀵|󠁭󠁸󠁢󠁣󠁳|󠁭󠁸󠁣󠁡󠁭|󠁭󠁸󠁣󠁨󠁨|󠁧󠁢󠁲󠁤󠁢|󠁧󠁢󠁲󠁣󠁴|󠁧󠁢󠁲󠁣󠁨|󠁧󠁢󠁲󠁣󠁣|󠁧󠁢󠁰󠁴󠁥|󠁧󠁢󠁰󠁯󠁷|󠁧󠁢󠁰󠁯󠁲|󠁧󠁢󠁰󠁬󠁹|󠁧󠁢󠁰󠁫󠁮|󠁧󠁢󠁰󠁥󠁭|󠁧󠁢󠁯󠁸󠁦|󠁧󠁢󠁯󠁲󠁫|󠁧󠁢󠁯󠁬󠁤|󠁧󠁢󠁮󠁹󠁫|󠁧󠁢󠁮󠁷󠁰|󠁧󠁢󠁮󠁷󠁭|󠁧󠁢󠁮󠁴󠁹|󠁧󠁢󠁮󠁴󠁴|󠁧󠁢󠁮󠁴󠁬|󠁧󠁢󠁮󠁳󠁭|󠁧󠁢󠁮󠁮󠁨|󠁧󠁢󠁮󠁭󠁤|󠁧󠁢󠁮󠁬󠁮|󠁧󠁢󠁮󠁬󠁫|󠁧󠁢󠁳󠁷󠁡|󠁧󠁢󠁳󠁴󠁹|󠁧󠁢󠁳󠁴󠁮|󠁧󠁢󠁳󠁴󠁥|󠁧󠁢󠁳󠁲󠁹|󠁧󠁢󠁳󠁯󠁳|󠁧󠁢󠁳󠁮󠁤|󠁧󠁢󠁳󠁬󠁫|󠁧󠁢󠁳󠁫󠁰|󠁧󠁢󠁳󠁨󠁲|󠁧󠁢󠁳󠁨󠁮|󠁧󠁢󠁳󠁨󠁦|󠁧󠁢󠁳󠁧󠁣|󠁧󠁢󠁳󠁦󠁴|󠁧󠁢󠁳󠁦󠁫|󠁧󠁢󠁳󠁣󠁴|󠁧󠁢󠁳󠁣󠁢|󠁧󠁢󠁳󠁡󠁹|󠁧󠁢󠁳󠁡󠁷|󠁧󠁢󠁲󠁵󠁴|󠁧󠁢󠁲󠁯󠁴|󠁧󠁢󠁲󠁩󠁣|󠁧󠁢󠁲󠁦󠁷|󠁧󠁢󠁲󠁤󠁧|󠁧󠁢󠁬󠁤󠁳|󠁧󠁢󠁬󠁣󠁥|󠁧󠁢󠁬󠁢󠁨|󠁧󠁢󠁬󠁢󠁣|󠁧󠁢󠁬󠁡󠁮|󠁧󠁢󠁫󠁷󠁬|󠁧󠁢󠁫󠁴󠁴|󠁧󠁢󠁫󠁩󠁲|󠁧󠁢󠁫󠁨󠁬|󠁧󠁢󠁫󠁥󠁮|󠁧󠁢󠁫󠁥󠁣|󠁧󠁢󠁩󠁶󠁣|󠁧󠁢󠁩󠁳󠁬|󠁧󠁢󠁩󠁯󠁷|󠁧󠁢󠁩󠁯󠁳|󠁧󠁢󠁨󠁲󠁹|󠁧󠁢󠁨󠁲󠁷|󠁧󠁢󠁨󠁲󠁴|󠁧󠁢󠁨󠁰󠁬|󠁧󠁢󠁨󠁮󠁳|󠁧󠁢󠁨󠁭󠁦|󠁧󠁢󠁨󠁬󠁤|󠁧󠁢󠁨󠁩󠁬|󠁧󠁢󠁨󠁥󠁦|󠁧󠁢󠁮󠁩󠁲|󠁧󠁢󠁮󠁧󠁭|󠁧󠁢󠁮󠁦󠁫|󠁧󠁢󠁮󠁥󠁴|󠁧󠁢󠁮󠁥󠁬|󠁧󠁢󠁮󠁢󠁬|󠁧󠁢󠁮󠁡󠁹|󠁧󠁢󠁭󠁵󠁬|󠁧󠁢󠁭󠁴󠁹|󠁧󠁢󠁭󠁲󠁹|󠁧󠁢󠁭󠁲󠁴|󠁧󠁢󠁭󠁯󠁮|󠁧󠁢󠁭󠁬󠁮|󠁧󠁢󠁭󠁩󠁫|󠁧󠁢󠁭󠁥󠁡|󠁧󠁢󠁭󠁤󠁷|󠁧󠁢󠁭󠁤󠁢|󠁧󠁢󠁭󠁡󠁮|󠁧󠁢󠁬󠁵󠁴|󠁧󠁢󠁬󠁮󠁤|󠁧󠁢󠁬󠁩󠁶|󠁧󠁢󠁬󠁩󠁮|󠁧󠁢󠁬󠁥󠁷|󠁧󠁢󠁴󠁷󠁨|󠁩󠁳󠁡󠁫󠁮|󠁩󠁳󠁡󠁫󠁵|󠁩󠁳󠁡󠁲󠁮|󠁩󠁳󠁡󠁳󠁡|󠁩󠁳󠁢󠁬󠁡|󠁩󠁳󠁢󠁯󠁧|󠁩󠁳󠁢󠁯󠁬|󠁩󠁳󠁤󠁡󠁢|󠁩󠁳󠁤󠁡󠁶|󠁩󠁳󠁥󠁯󠁭|󠁩󠁳󠁥󠁹󠁦|󠁩󠁳󠁦󠁪󠁤|󠁩󠁳󠁦󠁪󠁬|󠁩󠁳󠁦󠁬󠁡|󠁩󠁳󠁦󠁬󠁲|󠁩󠁳󠁧󠁡󠁲|󠁩󠁳󠁧󠁯󠁧|󠁩󠁳󠁧󠁲󠁮|󠁩󠁳󠁧󠁲󠁵|󠁩󠁳󠁧󠁲󠁹|󠁩󠁳󠁨󠁡󠁦|󠁩󠁳󠁨󠁲󠁧|󠁩󠁳󠁨󠁲󠁵|󠁧󠁢󠁺󠁥󠁴|󠁧󠁢󠁹󠁯󠁲|󠁧󠁢󠁷󠁳󠁸|󠁧󠁢󠁷󠁳󠁭|󠁧󠁢󠁷󠁲󠁸|󠁧󠁢󠁷󠁲󠁴|󠁧󠁢󠁷󠁲󠁬|󠁧󠁢󠁷󠁯󠁲|󠁧󠁢󠁷󠁯󠁫|󠁧󠁢󠁷󠁮󠁭|󠁧󠁢󠁷󠁮󠁨|󠁧󠁢󠁷󠁮󠁤|󠁧󠁢󠁷󠁬󠁶|󠁧󠁢󠁷󠁬󠁳|󠁧󠁢󠁷󠁬󠁮|󠁧󠁢󠁷󠁬󠁬|󠁧󠁢󠁷󠁫󠁦|󠁧󠁢󠁷󠁩󠁬|󠁧󠁢󠁷󠁧󠁮|󠁧󠁢󠁷󠁦󠁴|󠁧󠁢󠁷󠁤󠁵|󠁧󠁢󠁷󠁢󠁫|󠁧󠁢󠁷󠁡󠁲|󠁧󠁢󠁶󠁧󠁬|󠁩󠁳󠁳󠁫󠁯|󠁩󠁳󠁳󠁫󠁲|󠁩󠁳󠁳󠁮󠁦|󠁩󠁳󠁳󠁯󠁧|󠁩󠁳󠁳󠁯󠁬|󠁩󠁳󠁳󠁳󠁳|󠁩󠁳󠁳󠁴󠁲|󠁩󠁳󠁳󠁴󠁹|󠁩󠁳󠁳󠁶󠁧|󠁩󠁳󠁴󠁡󠁬|󠁩󠁳󠁴󠁨󠁧|󠁩󠁳󠁴󠁪󠁯|󠁩󠁳󠁶󠁥󠁭|󠁩󠁳󠁶󠁥󠁲|󠁩󠁳󠁶󠁯󠁰|󠁧󠁢󠁴󠁲󠁦|󠁧󠁢󠁴󠁯󠁦|󠁧󠁢󠁴󠁯󠁢|󠁧󠁢󠁴󠁨󠁲|󠁧󠁢󠁴󠁦󠁷|󠁧󠁢󠁴󠁡󠁭|󠁧󠁢󠁳󠁷󠁫|󠁧󠁢󠁳󠁷󠁤|󠁧󠁢󠁬󠁥󠁣|󠁩󠁳󠁨󠁵󠁧|󠁩󠁳󠁨󠁵󠁶|󠁩󠁳󠁨󠁶󠁡|󠁩󠁳󠁨󠁶󠁥|󠁩󠁳󠁩󠁳󠁡|󠁩󠁳󠁫󠁡󠁬|󠁩󠁳󠁫󠁪󠁯|󠁩󠁳󠁫󠁯󠁰|󠁩󠁳󠁬󠁡󠁮|󠁩󠁳󠁭󠁯󠁳|󠁩󠁳󠁭󠁵󠁬|󠁩󠁳󠁭󠁹󠁲|󠁩󠁳󠁮󠁯󠁲|󠁩󠁳󠁲󠁧󠁥|󠁩󠁳󠁲󠁧󠁹|󠁩󠁳󠁲󠁨󠁨|󠁩󠁳󠁲󠁫󠁮|󠁩󠁳󠁲󠁫󠁶|󠁩󠁳󠁳󠁢󠁴|󠁩󠁳󠁳󠁤󠁮|󠁩󠁳󠁳󠁤󠁶|󠁩󠁳󠁳󠁥󠁬|󠁩󠁳󠁳󠁦󠁡|󠁭󠁡󠁡󠁳󠁺|󠁭󠁡󠁡󠁺󠁩|󠁭󠁡󠁢󠁥󠁭|󠁭󠁡󠁢󠁯󠁤|󠁭󠁡󠁢󠁯󠁭|󠁭󠁡󠁢󠁲󠁲|󠁭󠁡󠁣󠁡󠁳|󠁭󠁡󠁣󠁨󠁥|󠁭󠁡󠁣󠁨󠁩|󠁭󠁡󠁣󠁨󠁴|󠁭󠁡󠁤󠁲󠁩|󠁭󠁡󠁥󠁲󠁲|󠁭󠁡󠁥󠁳󠁩|󠁭󠁡󠁥󠁳󠁭|󠁭󠁡󠁦󠁡󠁨|󠁭󠁡󠁦󠁥󠁳|󠁭󠁡󠁦󠁩󠁧|󠁭󠁡󠁦󠁱󠁨|󠁭󠁡󠁨󠁡󠁪|󠁭󠁡󠁨󠁡󠁯|󠁭󠁡󠁨󠁯󠁣|󠁭󠁡󠁩󠁦󠁲|󠁭󠁡󠁩󠁮󠁥|󠁭󠁡󠁪󠁤󠁩|󠁬󠁶󠀰󠀷󠀳|󠁬󠁶󠀰󠀷󠀷|󠁬󠁶󠀰󠀸󠀰|󠁬󠁶󠀰󠀹󠀱|󠁬󠁶󠀰󠀹󠀴|󠁬󠁶󠀰󠀹󠀷|󠁬󠁶󠀰󠀹󠀹|󠁬󠁶󠀱󠀰󠀶|󠁬󠁶󠁤󠁧󠁶|󠁬󠁶󠁪󠁥󠁬|󠁬󠁶󠁪󠁵󠁲|󠁬󠁶󠁬󠁰󠁸|󠁬󠁶󠁲󠁥󠁺|󠁬󠁶󠁲󠁩󠁸|󠁬󠁶󠁶󠁥󠁮|󠁦󠁲󠁡󠁲󠁡|󠁦󠁲󠀹󠀷󠀶|󠁦󠁲󠀷󠀵󠁣|󠁦󠁲󠀶󠁡󠁥|󠁦󠁲󠀶󠀹󠁭|󠁦󠁲󠀲󠀰󠁲|󠁦󠁭󠁹󠁡󠁰|󠁭󠁡󠁡󠁧󠁤|󠁭󠁡󠁡󠁯󠁵|󠁭󠁡󠁳󠁥󠁴|󠁭󠁡󠁳󠁩󠁢|󠁭󠁡󠁳󠁩󠁦|󠁭󠁡󠁳󠁫󠁨|󠁭󠁡󠁴󠁡󠁦|󠁭󠁡󠁴󠁡󠁩|󠁭󠁡󠁴󠁡󠁯|󠁭󠁡󠁴󠁡󠁲|󠁭󠁡󠁴󠁡󠁴|󠁭󠁡󠁴󠁡󠁺|󠁭󠁡󠁴󠁥󠁴|󠁭󠁡󠁴󠁩󠁮|󠁭󠁡󠁴󠁩󠁺|󠁭󠁡󠁴󠁮󠁧|󠁭󠁡󠁴󠁮󠁴|󠁭󠁡󠁹󠁵󠁳|󠁭󠁡󠁺󠁡󠁧|󠁦󠁭󠁴󠁲󠁫|󠁦󠁭󠁰󠁮󠁩|󠁦󠁭󠁫󠁳󠁡|󠁭󠁨󠁡󠁲󠁮|󠁭󠁨󠁡󠁵󠁲|󠁭󠁨󠁥󠁢󠁯|󠁥󠁥󠀲󠀵󠀵|󠁭󠁡󠁪󠁲󠁡|󠁭󠁡󠁫󠁥󠁮|󠁭󠁡󠁫󠁥󠁳|󠁭󠁡󠁫󠁨󠁥|󠁭󠁡󠁬󠁡󠁡|󠁭󠁡󠁬󠁡󠁲|󠁭󠁡󠁭󠁡󠁲|󠁭󠁡󠁭󠁤󠁦|󠁭󠁡󠁭󠁥󠁤|󠁭󠁡󠁭󠁥󠁫|󠁭󠁡󠁭󠁩󠁤|󠁭󠁡󠁭󠁯󠁨|󠁭󠁡󠁭󠁯󠁵|󠁭󠁡󠁮󠁡󠁤|󠁭󠁡󠁮󠁯󠁵|󠁭󠁡󠁯󠁵󠁡|󠁭󠁡󠁯󠁵󠁤|󠁭󠁡󠁯󠁵󠁪|󠁭󠁡󠁯󠁵󠁺|󠁭󠁡󠁲󠁡󠁢|󠁭󠁡󠁲󠁥󠁨|󠁭󠁡󠁳󠁡󠁦|󠁭󠁡󠁳󠁡󠁬|󠁧󠁢󠁤󠁲󠁳|󠁧󠁢󠁤󠁯󠁲|󠁧󠁢󠁤󠁧󠁹|󠁧󠁢󠁤󠁥󠁶|󠁧󠁢󠁤󠁥󠁲|󠁧󠁢󠁤󠁥󠁮|󠁧󠁢󠁤󠁢󠁹|󠁧󠁢󠁤󠁡󠁬|󠁧󠁢󠁣󠁷󠁹|󠁧󠁢󠁣󠁲󠁹|󠁧󠁢󠁣󠁲󠁦|󠁧󠁢󠁣󠁯󠁶|󠁧󠁢󠁣󠁯󠁮|󠁧󠁢󠁣󠁭󠁮|󠁧󠁢󠁣󠁭󠁤|󠁧󠁢󠁣󠁭󠁡|󠁧󠁢󠁣󠁬󠁫|󠁧󠁢󠁣󠁬󠁤|󠁧󠁢󠁣󠁨󠁷|󠁧󠁢󠁣󠁨󠁥|󠁧󠁢󠁣󠁧󠁮|󠁧󠁢󠁣󠁣󠁧|󠁧󠁢󠁣󠁢󠁦|󠁧󠁢󠁣󠁡󠁹|󠁩󠁳󠁳󠁨󠁦|󠁧󠁢󠁨󠁣󠁫|󠁧󠁢󠁨󠁡󠁶|󠁧󠁢󠁧󠁷󠁮|󠁧󠁢󠁧󠁲󠁥|󠁧󠁢󠁧󠁬󠁳|󠁧󠁢󠁧󠁬󠁧|󠁧󠁢󠁧󠁡󠁴|󠁧󠁢󠁦󠁭󠁯|󠁧󠁢󠁦󠁬󠁮|󠁧󠁢󠁦󠁩󠁦|󠁧󠁢󠁦󠁡󠁬|󠁧󠁢󠁥󠁳󠁸|󠁧󠁢󠁥󠁳󠁳|󠁧󠁢󠁥󠁲󠁹|󠁧󠁢󠁥󠁲󠁷|󠁧󠁢󠁥󠁬󠁳|󠁧󠁢󠁥󠁬󠁮|󠁧󠁢󠁥󠁤󠁵|󠁧󠁢󠁥󠁤󠁨|󠁧󠁢󠁥󠁡󠁹|󠁧󠁢󠁥󠁡󠁬|󠁧󠁢󠁤󠁵󠁲|󠁧󠁢󠁤󠁵󠁤|󠁦󠁲󠁰󠁤󠁬|󠁦󠁲󠁰󠁡󠁣|󠁦󠁲󠁯󠁣󠁣|󠁦󠁲󠁮󠁯󠁲|󠁦󠁲󠁮󠁡󠁱|󠁦󠁲󠁩󠁤󠁦|󠁦󠁲󠁨󠁤󠁦|󠁦󠁲󠁧󠁥󠁳|󠁦󠁲󠁣󠁶󠁬|󠁦󠁲󠁢󠁲󠁥|󠁦󠁲󠁢󠁦󠁣|󠁬󠁶󠀰󠀰󠀲|󠁬󠁶󠀰󠀰󠀷|󠁬󠁶󠀰󠀱󠀱|󠁬󠁶󠀰󠀲󠀲|󠁬󠁶󠀰󠀲󠀶|󠁬󠁶󠀰󠀳󠀳|󠁬󠁶󠀰󠀴󠀷|󠁬󠁶󠀰󠀵󠀰|󠁬󠁶󠀰󠀵󠀲|󠁬󠁶󠀰󠀵󠀴|󠁬󠁶󠀰󠀵󠀶|󠁬󠁶󠀰󠀶󠀲|󠁭󠁡󠁳󠁥󠁦|󠁧󠁢󠁣󠁡󠁭|󠁧󠁢󠁢󠁵󠁲|󠁧󠁢󠁢󠁳󠁴|󠁧󠁢󠁢󠁲󠁹|󠁧󠁢󠁢󠁰󠁬|󠁧󠁢󠁢󠁯󠁬|󠁧󠁢󠁢󠁮󠁳|󠁧󠁢󠁢󠁮󠁨|󠁧󠁢󠁢󠁮󠁥|󠁧󠁢󠁢󠁫󠁭|󠁧󠁢󠁢󠁩󠁲|󠁧󠁢󠁢󠁧󠁷|󠁧󠁢󠁢󠁧󠁥|󠁧󠁢󠁢󠁦󠁳|󠁧󠁢󠁢󠁥󠁸|󠁧󠁢󠁢󠁥󠁮|󠁧󠁢󠁢󠁣󠁰|󠁧󠁢󠁢󠁢󠁤|󠁧󠁢󠁢󠁡󠁳|󠁧󠁢󠁡󠁮󠁳|󠁧󠁢󠁡󠁮󠁮|󠁧󠁢󠁡󠁮󠁤|󠁧󠁢󠁡󠁧󠁹|󠁢󠁥󠁷󠁨󠁴|󠁢󠁥󠁷󠁢󠁲|󠁢󠁥󠁷󠁡󠁬|󠁢󠁥󠁶󠁷󠁶|󠁢󠁥󠁶󠁯󠁶|󠁢󠁥󠁶󠁬󠁩|󠁢󠁥󠁶󠁬󠁧|󠁢󠁥󠁶󠁢󠁲|󠁢󠁥󠁶󠁡󠁮|󠁢󠁥󠁢󠁲󠁵|󠁢󠁡󠁳󠁲󠁰|󠁢󠁡󠁢󠁲󠁣|󠁢󠁡󠁢󠁩󠁨|󠁡󠁺󠁺󠁡󠁮|󠁡󠁺󠁹󠁥󠁶|󠁡󠁺󠁹󠁡󠁲|󠁡󠁺󠁸󠁶󠁤|󠁡󠁺󠁸󠁩󠁺|󠁡󠁺󠁸󠁣󠁩|󠁡󠁺󠁸󠁡󠁣|󠁢󠁦󠁫󠁯󠁷|󠁢󠁦󠁫󠁯󠁰|󠁢󠁦󠁫󠁭󠁰|󠁢󠁦󠁫󠁭󠁤|󠁺󠁡󠁫󠁺󠁮|󠁢󠁦󠁫󠁥󠁮|󠁢󠁦󠁫󠁡󠁤|󠁢󠁦󠁩󠁯󠁢|󠁢󠁦󠁨󠁯󠁵|󠁢󠁦󠁧󠁯󠁵|󠁢󠁦󠁧󠁮󠁡|󠁢󠁦󠁧󠁡󠁮|󠁢󠁦󠁣󠁯󠁭|󠁢󠁦󠁢󠁬󠁫|󠁢󠁦󠁢󠁬󠁧|󠁢󠁦󠁢󠁧󠁲|󠁢󠁦󠁢󠁡󠁺|󠁢󠁥󠁷󠁮󠁡|󠁢󠁥󠁷󠁬󠁸|󠁢󠁥󠁷󠁬󠁧|󠁡󠁺󠁱󠁡󠁢|󠁡󠁺󠁯󠁲󠁤|󠁡󠁺󠁯󠁧󠁵|󠁡󠁺󠁮󠁥󠁦|󠁦󠁲󠁣󠁯󠁲|󠁡󠁺󠁭󠁡󠁳|󠁦󠁲󠁧󠁵󠁡|󠁦󠁲󠁬󠁲󠁥|󠁡󠁺󠁬󠁥󠁲|󠁦󠁲󠁭󠁡󠁹|󠁡󠁺󠁬󠁡󠁮|󠁡󠁺󠁬󠁡󠁣|󠁡󠁺󠁫󠁵󠁲|󠁡󠁺󠁫󠁡󠁮|󠁡󠁺󠁫󠁡󠁬|󠁡󠁺󠁩󠁳󠁭|󠁡󠁺󠁩󠁭󠁩|󠁡󠁺󠁨󠁡󠁣|󠁡󠁺󠁧󠁹󠁧|󠁧󠁢󠁡󠁮󠁴|󠁡󠁺󠁵󠁣󠁡|󠁡󠁺󠁴󠁯󠁶|󠁡󠁺󠁴󠁡󠁲|󠁡󠁺󠁳󠁵󠁳|󠁡󠁺󠁳󠁭󠁸|󠁡󠁺󠁳󠁭󠁩|󠁡󠁺󠁳󠁫󠁲|󠁡󠁺󠁳󠁩󠁹|󠁡󠁺󠁳󠁢󠁮|󠁡󠁺󠁳󠁡󠁴|󠁡󠁺󠁳󠁡󠁲|󠁡󠁺󠁳󠁡󠁨|󠁡󠁺󠁳󠁡󠁤|󠁡󠁺󠁳󠁡󠁢|󠁡󠁺󠁱󠁵󠁳|󠁡󠁺󠁱󠁯󠁢|󠁡󠁺󠁱󠁢󠁩|󠁡󠁺󠁱󠁢󠁡|󠁡󠁺󠁱󠁡󠁺|󠁴󠁶󠁮󠁫󠁬|󠁴󠁶󠁮󠁭󠁡|󠁴󠁶󠁮󠁭󠁧|󠁴󠁶󠁮󠁵󠁩|󠁴󠁶󠁶󠁡󠁩|󠁴󠁷󠁣󠁨󠁡|󠁴󠁷󠁣󠁹󠁩|󠁴󠁷󠁣󠁹󠁱|󠁴󠁷󠁨󠁳󠁱|󠁴󠁷󠁨󠁳󠁺|󠁴󠁷󠁨󠁵󠁡|󠁴󠁷󠁩󠁬󠁡|󠁴󠁷󠁫󠁥󠁥|󠁴󠁷󠁫󠁨󠁨|󠁴󠁷󠁫󠁩󠁮|󠁴󠁷󠁬󠁩󠁥|󠁴󠁷󠁭󠁩󠁡|󠁴󠁷󠁮󠁡󠁮|󠁴󠁷󠁮󠁷󠁴|󠁴󠁷󠁰󠁥󠁮|󠁣󠁧󠁢󠁺󠁶|󠁣󠁦󠁢󠁧󠁦|󠁴󠁴󠁡󠁲󠁩|󠁴󠁴󠁣󠁨󠁡|󠁴󠁴󠁣󠁴󠁴|󠁴󠁴󠁤󠁭󠁮|󠁴󠁴󠁭󠁲󠁣|󠁴󠁴󠁰󠁥󠁤|󠁴󠁴󠁰󠁯󠁳|󠁴󠁴󠁰󠁲󠁴|󠁴󠁴󠁰󠁴󠁦|󠁴󠁴󠁳󠁦󠁯|󠁴󠁴󠁳󠁧󠁥|󠁴󠁴󠁳󠁩󠁰|󠁴󠁴󠁳󠁪󠁬|󠁴󠁴󠁴󠁯󠁢|󠁴󠁴󠁴󠁵󠁰|󠁴󠁶󠁦󠁵󠁮|󠁴󠁶󠁮󠁩󠁴|󠁴󠁶󠁮󠁫󠁦|󠁢󠁦󠁴󠁵󠁩|󠁢󠁦󠁴󠁡󠁰|󠁢󠁦󠁳󠁯󠁲|󠁢󠁦󠁳󠁯󠁭|󠁢󠁦󠁳󠁮󠁧|󠁢󠁦󠁳󠁭󠁴|󠁢󠁦󠁳󠁩󠁳|󠁢󠁦󠁳󠁥󠁮|󠁢󠁦󠁰󠁯󠁮|󠁢󠁦󠁰󠁡󠁳|󠁢󠁦󠁯󠁵󠁤|󠁢󠁦󠁯󠁵󠁢|󠁢󠁦󠁮󠁯󠁵|󠁢󠁦󠁮󠁡󠁹|󠁢󠁦󠁮󠁡󠁯|󠁢󠁦󠁮󠁡󠁭|󠁢󠁦󠁭󠁯󠁵|󠁢󠁦󠁬󠁯󠁲|󠁢󠁦󠁬󠁥󠁲|󠁡󠁺󠁱󠁡󠁸|󠁴󠁷󠁰󠁩󠁦|󠁴󠁷󠁴󠁡󠁯|󠁴󠁷󠁴󠁮󠁮|󠁴󠁷󠁴󠁰󠁥|󠁴󠁷󠁴󠁴󠁴|󠁴󠁷󠁴󠁸󠁧|󠁴󠁷󠁹󠁵󠁮|󠁢󠁺󠁴󠁯󠁬|󠁢󠁺󠁣󠁺󠁬|󠁶󠁵󠁭󠁡󠁰|󠁶󠁵󠁰󠁡󠁭|󠁶󠁵󠁳󠁡󠁭|󠁶󠁵󠁳󠁥󠁥|󠁶󠁵󠁴󠁡󠁥|󠁶󠁵󠁴󠁯󠁢|󠁢󠁦󠁺󠁯󠁵|󠁢󠁦󠁺󠁯󠁮|󠁢󠁦󠁺󠁩󠁲|󠁢󠁦󠁹󠁡󠁴|󠁢󠁦󠁹󠁡󠁧|󠁬󠁶󠀰󠀵󠀷|󠁬󠁶󠀰󠀶󠀹|󠁬󠁶󠀰󠀹󠀰|󠁬󠁶󠀰󠀹󠀸|󠁬󠁶󠀱󠀰󠀰|󠁬󠁶󠀱󠀱󠀰|󠁬󠁶󠁪󠁫󠁢|󠁬󠁶󠁶󠁭󠁲|󠁭󠁡󠁭󠁭󠁤|󠁭󠁡󠁭󠁭󠁮|󠁭󠁡󠁳󠁹󠁢|󠁭󠁲󠁮󠁫󠁣|󠁡󠁯󠁨󠁵󠁡|󠁡󠁯󠁣󠁵󠁳|󠁡󠁯󠁣󠁣󠁵|󠁡󠁯󠁣󠁡󠁢|󠁡󠁯󠁢󠁩󠁥|󠁡󠁯󠁢󠁧󠁵|󠁡󠁯󠁢󠁧󠁯|󠁭󠁸󠁤󠁩󠁦|󠁫󠁺󠁫󠁵󠁳|󠁫󠁺󠁫󠁺󠁹|󠁫󠁺󠁭󠁡󠁮|󠁫󠁺󠁰󠁡󠁶|󠁫󠁺󠁳󠁥󠁶|󠁫󠁺󠁳󠁨󠁹|󠁫󠁺󠁶󠁯󠁳|󠁫󠁺󠁹󠁵󠁺|󠁫󠁺󠁺󠁡󠁰|󠁫󠁺󠁺󠁨󠁡|󠁡󠁯󠁬󠁵󠁡|󠁡󠁯󠁬󠁳󠁵|󠁡󠁯󠁬󠁮󠁯|󠁡󠁯󠁨󠁵󠁩|󠁬󠁶󠀰󠀰󠀱|󠁬󠁶󠀰󠀱󠀰|󠁬󠁶󠀰󠀴󠀰|󠁬󠁶󠀰󠀵󠀱|󠁬󠁶󠀰󠀵󠀳|󠁬󠁶󠀰󠀵󠀵|󠁡󠁦󠁫󠁡󠁮|󠁡󠁦󠁫󠁡󠁢|󠁡󠁦󠁪󠁯󠁷|󠁡󠁦󠁨󠁥󠁲|󠁡󠁦󠁨󠁥󠁬|󠁡󠁦󠁧󠁨󠁯|󠁡󠁦󠁧󠁨󠁡|󠁡󠁦󠁦󠁹󠁢|󠁡󠁦󠁦󠁲󠁡|󠁡󠁦󠁤󠁡󠁹|󠁡󠁦󠁢󠁧󠁬|󠁡󠁦󠁢󠁤󠁳|󠁡󠁦󠁢󠁤󠁧|󠁴󠁴󠁥󠁴󠁯|󠁴󠁴󠁲󠁣󠁭|󠁴󠁴󠁷󠁴󠁯|󠁴󠁷󠁫󠁨󠁱|󠁴󠁷󠁴󠁮󠁱|󠁴󠁷󠁴󠁰󠁱|󠁴󠁷󠁴󠁸󠁱|󠁡󠁦󠁺󠁡󠁢|󠁡󠁦󠁷󠁡󠁲|󠁡󠁦󠁵󠁲󠁵|󠁡󠁦󠁴󠁡󠁫|󠁡󠁦󠁳󠁡󠁲|󠁡󠁦󠁳󠁡󠁭|󠁡󠁦󠁰󠁫󠁡|󠁡󠁦󠁰󠁩󠁡|󠁡󠁦󠁰󠁡󠁲|󠁡󠁦󠁰󠁡󠁮|󠁡󠁦󠁮󠁵󠁲|󠁡󠁦󠁮󠁩󠁭|󠁡󠁦󠁮󠁡󠁮|󠁡󠁦󠁬󠁯󠁧|󠁡󠁦󠁬󠁡󠁧|󠁡󠁦󠁫󠁮󠁲|󠁰󠁨󠁭󠁡󠁧|󠁡󠁦󠁫󠁨󠁯|󠁡󠁦󠁫󠁤󠁺|󠁧󠁢󠁭󠁦󠁴|󠁧󠁢󠁭󠁹󠁬|󠁧󠁢󠁮󠁤󠁮|󠁧󠁢󠁮󠁴󠁡|󠁧󠁢󠁮󠁴󠁨|󠁧󠁢󠁮󠁹󠁭|󠁧󠁢󠁯󠁭󠁨|󠁧󠁢󠁰󠁯󠁬|󠁧󠁢󠁳󠁴󠁢|󠁧󠁢󠁵󠁫󠁭|󠁡󠁺󠁧󠁯󠁹|󠁡󠁺󠁧󠁯󠁲|󠁡󠁺󠁧󠁡󠁤|󠁡󠁺󠁦󠁵󠁺|󠁡󠁺󠁤󠁡󠁳|󠁡󠁺󠁣󠁵󠁬|󠁡󠁺󠁣󠁡󠁬|󠁡󠁺󠁣󠁡󠁢|󠁡󠁺󠁢󠁩󠁬|󠁡󠁺󠁢󠁥󠁹|󠁧󠁢󠁡󠁲󠁤|󠁧󠁢󠁡󠁲󠁭|󠁧󠁢󠁢󠁬󠁡|󠁧󠁢󠁢󠁬󠁹|󠁧󠁢󠁢󠁭󠁨|󠁧󠁢󠁢󠁮󠁢|󠁧󠁢󠁣󠁧󠁶|󠁧󠁢󠁣󠁫󠁦|󠁧󠁢󠁣󠁫󠁴|󠁧󠁢󠁣󠁬󠁲|󠁧󠁢󠁣󠁳󠁲|󠁧󠁢󠁤󠁧󠁮|󠁧󠁢󠁤󠁯󠁷|󠁧󠁢󠁤󠁲󠁹|󠁧󠁢󠁥󠁡󠁷|󠁧󠁢󠁦󠁥󠁲|󠁧󠁢󠁧󠁢󠁮|󠁧󠁢󠁬󠁭󠁶|󠁧󠁢󠁬󠁲󠁮|󠁧󠁢󠁬󠁳󠁢|󠁩󠁳󠁨󠁥󠁬|󠁩󠁳󠁨󠁵󠁴|󠁩󠁳󠁳󠁢󠁨|󠁩󠁳󠁳󠁥󠁹|󠁩󠁳󠁳󠁫󠁵|󠁩󠁳󠁳󠁳󠁦|󠁡󠁯󠁺󠁡󠁩|󠁡󠁯󠁵󠁩󠁧|󠁡󠁯󠁮󠁡󠁭|󠁡󠁯󠁭󠁯󠁸|󠁡󠁯󠁭󠁡󠁬|󠁫󠁺󠁡󠁫󠁭|󠁫󠁺󠁡󠁫󠁴|󠁫󠁺󠁡󠁬󠁡|󠁫󠁺󠁡󠁬󠁭|󠁫󠁺󠁡󠁳󠁴|󠁫󠁺󠁡󠁴󠁹|󠁫󠁺󠁢󠁡󠁹|󠁫󠁺󠁫󠁡󠁲|󠁡󠁦󠁫󠁡󠁰|󠁡󠁺󠁢󠁡󠁲|󠁡󠁺󠁢󠁡󠁬|󠁡󠁺󠁢󠁡󠁢|󠁡󠁺󠁡󠁳󠁴|󠁡󠁺󠁡󠁧󠁵|󠁡󠁺󠁡󠁧󠁳|󠁡󠁺󠁡󠁧󠁭|󠁡󠁺󠁡󠁧󠁣|󠁡󠁺󠁡󠁧󠁡|󠁡󠁺󠁡󠁢󠁳|󠁡󠁵󠁶󠁩󠁣|󠁡󠁵󠁴󠁡󠁳|󠁡󠁵󠁱󠁬󠁤|󠁡󠁵󠁮󠁳󠁷|󠁡󠁵󠁡󠁣󠁴|󠁩󠁳󠁡󠁫󠁨|󠁩󠁳󠁢󠁦󠁪|󠁩󠁳󠁢󠁬󠁯|󠁩󠁳󠁤󠁪󠁵|󠁩󠁳󠁦󠁬󠁤|󠁰󠁳󠁮󠁧󠁺|󠁰󠁳󠁮󠁢󠁳|󠁰󠁳󠁫󠁹󠁳|󠁰󠁳󠁪󠁲󠁨|󠁰󠁳󠁨󠁢󠁮|󠁰󠁳󠁧󠁺󠁡|󠁰󠁳󠁤󠁥󠁢|󠁰󠁳󠁢󠁴󠁨|󠁰󠁨󠁺󠁳󠁩|󠁰󠁨󠁺󠁭󠁢|󠁰󠁨󠁺󠁡󠁳|󠁰󠁨󠁺󠁡󠁮|󠁣󠁯󠁭󠁡󠁧|󠁣󠁯󠁬󠁡󠁧|󠁰󠁨󠁷󠁳󠁡|󠁣󠁯󠁨󠁵󠁩|󠁣󠁯󠁧󠁵󠁶|󠁣󠁯󠁧󠁵󠁡|󠁰󠁨󠁴󠁡󠁷|󠁰󠁷󠀳󠀷󠀰|󠁰󠁷󠀳󠀵󠀰|󠁰󠁷󠀲󠀲󠀴|󠁰󠁷󠀲󠀲󠀲|󠁰󠁷󠀲󠀱󠀸|󠁰󠁷󠀲󠀱󠀴|󠁰󠁷󠀲󠀱󠀲|󠁰󠁷󠀱󠀵󠀰|󠁰󠁷󠀱󠀰󠀰|󠁰󠁷󠀰󠀵󠀰|󠁰󠁷󠀰󠀱󠀰|󠁰󠁷󠀰󠀰󠀴|󠁰󠁷󠀰󠀰󠀲|󠁰󠁳󠁴󠁫󠁭|󠁰󠁳󠁴󠁢󠁳|󠁰󠁳󠁳󠁬󠁴|󠁰󠁳󠁲󠁦󠁨|󠁰󠁳󠁲󠁢󠁨|󠁰󠁳󠁱󠁱󠁡|󠁰󠁨󠁳󠁬󠁵|󠁰󠁨󠁳󠁬󠁥|󠁰󠁨󠁳󠁩󠁧|󠁰󠁨󠁳󠁣󠁯|󠁰󠁨󠁳󠁡󠁲|󠁰󠁨󠁲󠁯󠁭|󠁰󠁨󠁲󠁩󠁺|󠁰󠁨󠁱󠁵󠁩|󠁰󠁨󠁱󠁵󠁥|󠁰󠁨󠁰󠁬󠁷|󠁰󠁨󠁮󠁵󠁶|󠁰󠁨󠁮󠁵󠁥|󠁰󠁨󠁮󠁳󠁡|󠁰󠁨󠁮󠁥󠁲|󠁰󠁨󠁮󠁥󠁣|󠁰󠁨󠁮󠁣󠁯|󠁰󠁨󠁭󠁳󠁲|󠁰󠁨󠁭󠁳󠁣|󠁰󠁨󠁭󠁯󠁵|󠁣󠁯󠁣󠁵󠁮|󠁣󠁯󠁣󠁯󠁲|󠁣󠁯󠁣󠁨󠁯|󠁣󠁯󠁣󠁥󠁳|󠁣󠁯󠁣󠁡󠁵|󠁰󠁨󠁴󠁡󠁲|󠁣󠁯󠁣󠁡󠁳|󠁣󠁯󠁣󠁡󠁱|󠁣󠁯󠁣󠁡󠁬|󠁣󠁯󠁢󠁯󠁹|󠁣󠁯󠁢󠁯󠁬|󠁣󠁯󠁡󠁴󠁬|󠁣󠁯󠁡󠁲󠁡|󠁣󠁯󠁡󠁮󠁴|󠁣󠁯󠁡󠁭󠁡|󠁰󠁨󠁳󠁵󠁲|󠁰󠁨󠁳󠁵󠁮|󠁰󠁨󠁳󠁵󠁫|󠁰󠁨󠁳󠁯󠁲|󠁲󠁵󠁰󠁲󠁩|󠁲󠁵󠁰󠁳󠁫|󠁲󠁵󠁲󠁯󠁳|󠁲󠁵󠁲󠁹󠁡|󠁣󠁯󠁴󠁯󠁬|󠁲󠁵󠁳󠁡󠁫|󠁲󠁵󠁳󠁡󠁭|󠁲󠁵󠁳󠁡󠁲|󠁣󠁯󠁳󠁵󠁣|󠁲󠁵󠁳󠁭󠁯|󠁲󠁵󠁳󠁰󠁥|󠁲󠁵󠁳󠁴󠁡|󠁲󠁵󠁳󠁶󠁥|󠁣󠁯󠁳󠁡󠁰|󠁲󠁵󠁴󠁡󠁭|󠁲󠁵󠁴󠁯󠁭|󠁣󠁯󠁶󠁩󠁤|󠁲󠁵󠁴󠁵󠁬|󠁲󠁵󠁫󠁯󠁳|󠁲󠁵󠁬󠁥󠁮|󠁲󠁵󠁬󠁩󠁰|󠁲󠁵󠁭󠁡󠁧|󠁲󠁵󠁫󠁹󠁡|󠁣󠁯󠁶󠁡󠁵|󠁣󠁯󠁶󠁡󠁣|󠁲󠁵󠁭󠁯󠁳|󠁲󠁵󠁭󠁯󠁷|󠁲󠁵󠁫󠁲󠁳|󠁲󠁵󠁭󠁵󠁲|󠁲󠁵󠁮󠁥󠁮|󠁲󠁵󠁮󠁧󠁲|󠁲󠁵󠁮󠁩󠁺|󠁲󠁵󠁮󠁶󠁳|󠁲󠁵󠁯󠁭󠁳|󠁲󠁵󠁯󠁲󠁥|󠁲󠁵󠁯󠁲󠁬|󠁲󠁵󠁰󠁥󠁲|󠁲󠁵󠁰󠁮󠁺|󠁲󠁵󠁹󠁡󠁲|󠁲󠁵󠁩󠁶󠁡|󠁲󠁵󠁩󠁲󠁫|󠁲󠁵󠁹󠁥󠁶|󠁲󠁵󠁺󠁡󠁢|󠁣󠁯󠁱󠁵󠁩|󠁣󠁯󠁰󠁵󠁴|󠁣󠁯󠁮󠁳󠁡|󠁲󠁵󠁣󠁨󠁵|󠁲󠁵󠁣󠁨󠁥|󠁲󠁵󠁢󠁲󠁹|󠁣󠁯󠁮󠁡󠁲|󠁲󠁵󠁢󠁥󠁬|󠁣󠁯󠁭󠁥󠁴|󠁲󠁵󠁡󠁳󠁴|󠁲󠁵󠁡󠁲󠁫|󠁲󠁵󠁡󠁭󠁵|󠁲󠁵󠁡󠁬󠁴|󠁰󠁹󠁡󠁳󠁵|󠁲󠁵󠁫󠁬󠁵|󠁲󠁵󠁴󠁶󠁥|󠁲󠁵󠁫󠁩󠁲|󠁲󠁵󠁫󠁨󠁭|󠁲󠁵󠁫󠁨󠁡|󠁲󠁵󠁫󠁧󠁮|󠁣󠁯󠁳󠁡󠁮|󠁲󠁵󠁫󠁧󠁤|󠁲󠁵󠁫󠁥󠁭|󠁲󠁵󠁫󠁤󠁡|󠁲󠁵󠁴󠁹󠁵|󠁲󠁵󠁫󠁡󠁭|󠁣󠁯󠁲󠁩󠁳|󠁲󠁵󠁵󠁬󠁹|󠁲󠁵󠁶󠁧󠁧|󠁲󠁵󠁶󠁬󠁡|󠁲󠁵󠁶󠁬󠁧|󠁲󠁵󠁶󠁯󠁲|󠁰󠁨󠁤󠁡󠁳|󠁰󠁨󠁬󠁡󠁧|󠁰󠁨󠁤󠁡󠁯|󠁰󠁨󠁣󠁯󠁭|󠁰󠁨󠁣󠁥󠁢|󠁰󠁨󠁣󠁡󠁶|󠁰󠁨󠁤󠁡󠁶|󠁰󠁨󠁫󠁡󠁬|󠁰󠁨󠁣󠁡󠁰|󠁰󠁨󠁩󠁳󠁡|󠁰󠁨󠁣󠁡󠁧|󠁰󠁨󠁢󠁴󠁮|󠁰󠁨󠁤󠁩󠁮|󠁰󠁨󠁩󠁬󠁳|󠁧󠁢󠁡󠁧󠁢|󠁰󠁨󠁤󠁶󠁯|󠁰󠁨󠁥󠁡󠁳|󠁰󠁨󠁡󠁮󠁴|󠁰󠁨󠁧󠁵󠁩|󠁰󠁨󠁡󠁰󠁡|󠁰󠁨󠁡󠁵󠁲|󠁰󠁨󠁢󠁡󠁮|󠁰󠁨󠁢󠁡󠁳|󠁰󠁨󠁢󠁥󠁮|󠁰󠁨󠁢󠁴󠁧|󠁰󠁨󠁢󠁩󠁬|󠁰󠁨󠁩󠁬󠁮|󠁰󠁨󠁩󠁬󠁩|󠁰󠁨󠁩󠁦󠁵|󠁲󠁵󠁹󠁡󠁮|󠁰󠁨󠁭󠁧󠁳|󠁰󠁨󠁭󠁧󠁮|󠁰󠁨󠁭󠁤󠁲|󠁰󠁨󠁭󠁤󠁣|󠁰󠁨󠁭󠁡󠁳|󠁰󠁨󠁭󠁡󠁤|󠁰󠁨󠁬󠁵󠁮|󠁰󠁨󠁬󠁥󠁹|󠁰󠁨󠁬󠁡󠁳|󠁰󠁨󠁬󠁡󠁮|󠁰󠁨󠁢󠁯󠁨|󠁥󠁥󠀷󠀹|󠁥󠁥󠀷󠀱|󠁣󠁶󠁰󠁡|󠁣󠁶󠁰󠁮|󠁣󠁶󠁰󠁲|󠁣󠁶󠁲󠁢|󠁡󠁺󠁮󠁡|󠁣󠁶󠁲󠁧|󠁣󠁵󠀰󠀱|󠁧󠁮󠁹󠁯|󠁥󠁥󠀶󠀸|󠁣󠁶󠁲󠁳|󠁣󠁶󠁳󠁤|󠁣󠁶󠁳󠁦|󠁣󠁶󠁳󠁯|󠁣󠁲󠁳󠁪|󠁡󠁺󠁮󠁶|󠁡󠁺󠁮󠁸|󠁧󠁮󠁮󠁺|󠁣󠁶󠁭󠁯|󠁣󠁶󠁭󠁡|󠁡󠁺󠁬󠁡|󠁥󠁥󠀸󠀱|󠁣󠁵󠀹󠀹|󠁥󠁥󠀸󠀴|󠁣󠁶󠁢󠁲|󠁧󠁮󠁰󠁩|󠁥󠁥󠀸󠀷|󠁡󠁺󠁭󠁩|󠁣󠁶󠁣󠁲|󠁣󠁶󠁣󠁦|󠁧󠁮󠁳󠁩|󠁧󠁮󠁴󠁥|󠁣󠁶󠁣󠁡|󠁣󠁶󠁢󠁶|󠁧󠁮󠁴󠁯|󠁥󠁥󠀷󠀴|󠁧󠁱󠁡󠁮|󠁧󠁹󠁵󠁴|󠁨󠁮󠁡󠁴|󠁨󠁮󠁣󠁨|󠁡󠁥󠁳󠁨|󠁨󠁮󠁣󠁰|󠁨󠁮󠁣󠁲|󠁨󠁮󠁥󠁰|󠁨󠁮󠁦󠁭|󠁨󠁮󠁧󠁤|󠁨󠁮󠁩󠁢|󠁨󠁮󠁩󠁮|󠁥󠁧󠁢󠁡|󠁨󠁮󠁬󠁥|󠁨󠁮󠁬󠁰|󠁨󠁮󠁯󠁣|󠁨󠁮󠁯󠁬|󠁨󠁮󠁳󠁢|󠁨󠁮󠁶󠁡|󠁨󠁮󠁹󠁯|󠁡󠁥󠁲󠁫|󠁡󠁥󠁦󠁵|󠁡󠁥󠁤󠁵|󠁡󠁥󠁡󠁺|󠁡󠁥󠁡󠁪|󠁨󠁴󠁡󠁲|󠁨󠁴󠁣󠁥|󠁧󠁱󠁢󠁮|󠁧󠁱󠁢󠁳|󠁧󠁱󠁣󠁳|󠁧󠁱󠁤󠁪|󠁧󠁱󠁫󠁮|󠁧󠁱󠁬󠁩|󠁧󠁱󠁷󠁮|󠁧󠁲󠀶󠀹|󠁧󠁷󠁢󠁡|󠁧󠁷󠁢󠁳|󠁡󠁺󠁳󠁡|󠁧󠁷󠁣󠁡|󠁡󠁥󠁵󠁱|󠁧󠁷󠁧󠁡|󠁧󠁷󠁯󠁩|󠁧󠁷󠁱󠁵|󠁧󠁷󠁴󠁯|󠁧󠁹󠁢󠁡|󠁧󠁹󠁣󠁵|󠁧󠁹󠁤󠁥|󠁧󠁹󠁥󠁢|󠁧󠁹󠁥󠁳|󠁧󠁹󠁭󠁡|󠁧󠁹󠁰󠁭|󠁧󠁹󠁰󠁴|󠁧󠁨󠁣󠁰|󠁧󠁨󠁥󠁰|󠁧󠁨󠁮󠁥|󠁧󠁨󠁮󠁰|󠁧󠁨󠁯󠁴|󠁧󠁨󠁳󠁶|󠁧󠁨󠁴󠁶|󠁧󠁨󠁵󠁥|󠁧󠁨󠁵󠁷|󠁧󠁨󠁷󠁮|󠁧󠁨󠁷󠁰|󠁤󠁪󠁴󠁡|󠁤󠁪󠁯󠁢|󠁤󠁥󠁴󠁨|󠁤󠁥󠁳󠁴|󠁤󠁥󠁳󠁮|󠁤󠁥󠁳󠁬|󠁤󠁥󠁳󠁨|󠁤󠁥󠁲󠁰|󠁤󠁥󠁮󠁷|󠁤󠁥󠁮󠁩|󠁤󠁥󠁭󠁶|󠁤󠁥󠁨󠁨|󠁤󠁥󠁨󠁥|󠁧󠁬󠁡󠁶|󠁧󠁬󠁫󠁵|󠁧󠁬󠁱󠁥|󠁡󠁭󠁳󠁨|󠁡󠁭󠁳󠁵|󠁡󠁭󠁴󠁶|󠁡󠁭󠁶󠁤|󠁡󠁭󠁬󠁯|󠁡󠁭󠁫󠁴|󠁡󠁭󠁧󠁲|󠁡󠁭󠁥󠁲|󠁡󠁭󠁡󠁶|󠁡󠁭󠁡󠁲|󠁡󠁭󠁡󠁧|󠁧󠁤󠀱󠀰|󠁧󠁥󠁡󠁢|󠁧󠁥󠁡󠁪|󠁧󠁥󠁧󠁵|󠁧󠁥󠁩󠁭|󠁧󠁥󠁫󠁡|󠁧󠁥󠁫󠁫|󠁧󠁥󠁭󠁭|󠁧󠁥󠁲󠁬|󠁧󠁥󠁳󠁺|󠁧󠁥󠁴󠁢|󠁧󠁨󠁡󠁡|󠁧󠁨󠁡󠁦|󠁧󠁨󠁡󠁨|󠁧󠁨󠁢󠁥|󠁧󠁨󠁢󠁯|󠁤󠁥󠁢󠁢|󠁣󠁺󠀸󠀰|󠁥󠁥󠀴󠀵|󠁣󠁺󠀷󠀲|󠁣󠁺󠀷󠀱|󠁣󠁺󠀶󠀴|󠁣󠁺󠀶󠀳|󠁥󠁥󠀵󠀰|󠁣󠁺󠀵󠀳|󠁡󠁺󠁧󠁡|󠁣󠁺󠀵󠀲|󠁣󠁺󠀵󠀱|󠁥󠁥󠀵󠀲|󠁣󠁺󠀴󠀲|󠁣󠁺󠀴󠀱|󠁥󠁥󠀵󠀶|󠁣󠁺󠀳󠀲|󠁣󠁺󠀳󠀱|󠁥󠁥󠀶󠀰|󠁣󠁺󠀲󠀰|󠁣󠁺󠀱󠀰|󠁣󠁶󠁴󠁳|󠁣󠁶󠁴󠁡|󠁣󠁶󠁳󠁶|󠁥󠁥󠀶󠀴|󠁣󠁶󠁳󠁳|󠁧󠁹󠁵󠁤|󠁧󠁬󠁱󠁴|󠁧󠁬󠁳󠁭|󠁧󠁮󠁢󠁫|󠁧󠁮󠁣󠁯|󠁧󠁮󠁤󠁢|󠁧󠁮󠁤󠁩|󠁧󠁮󠁤󠁬|󠁧󠁮󠁤󠁵|󠁤󠁥󠁨󠁢|󠁤󠁥󠁢󠁹|󠁧󠁮󠁦󠁡|󠁧󠁮󠁦󠁯|󠁧󠁮󠁦󠁲|󠁧󠁮󠁧󠁡|󠁧󠁮󠁧󠁵|󠁡󠁵󠁮󠁴|󠁡󠁵󠁳󠁡|󠁧󠁮󠁫󠁳|󠁡󠁵󠁷󠁡|󠁧󠁮󠁬󠁡|󠁧󠁮󠁬󠁥|󠁧󠁮󠁬󠁯|󠁥󠁥󠀳󠀷|󠁥󠁥󠀳󠀹|󠁤󠁥󠁢󠁷|󠁤󠁥󠁢󠁥|󠁡󠁺󠁢󠁡|󠁣󠁨󠁢󠁥|󠁣󠁨󠁡󠁲|󠁣󠁨󠁡󠁩|󠁣󠁨󠁡󠁧|󠁣󠁮󠁧󠁤|󠁣󠁦󠁶󠁫|󠁣󠁦󠁵󠁫|󠁣󠁦󠁳󠁥|󠁣󠁦󠁯󠁰|󠁣󠁦󠁮󠁭|󠁣󠁦󠁭󠁰|󠁣󠁦󠁭󠁢|󠁣󠁦󠁬󠁢|󠁣󠁦󠁫󠁧|󠁣󠁦󠁫󠁢|󠁣󠁦󠁨󠁳|󠁣󠁦󠁨󠁭|󠁣󠁦󠁨󠁫|󠁣󠁦󠁢󠁫|󠁣󠁮󠁧󠁳|󠁣󠁩󠁢󠁳|󠁣󠁩󠁡󠁢|󠁣󠁨󠁶󠁳|󠁣󠁨󠁶󠁤|󠁣󠁨󠁵󠁲|󠁣󠁨󠁴󠁩|󠁣󠁨󠁴󠁧|󠁣󠁨󠁳󠁺|󠁣󠁨󠁳󠁯|󠁣󠁨󠁯󠁷|󠁣󠁨󠁮󠁷|󠁣󠁨󠁮󠁥|󠁣󠁨󠁬󠁵|󠁣󠁨󠁪󠁵|󠁣󠁨󠁧󠁲|󠁣󠁨󠁧󠁬|󠁣󠁨󠁧󠁥|󠁣󠁨󠁦󠁲|󠁣󠁨󠁢󠁳|󠁣󠁨󠁢󠁬|󠁣󠁤󠁨󠁵|󠁣󠁤󠁥󠁱|󠁣󠁤󠁢󠁵|󠁣󠁤󠁢󠁣|󠁣󠁡󠁹󠁴|󠁣󠁡󠁳󠁫|󠁣󠁡󠁱󠁣|󠁣󠁡󠁰󠁥|󠁣󠁡󠁯󠁮|󠁣󠁡󠁮󠁬|󠁣󠁡󠁮󠁢|󠁣󠁡󠁭󠁢|󠁣󠁡󠁢󠁣|󠁣󠁡󠁡󠁢|󠁣󠁮󠁧󠁸|󠁣󠁮󠁧󠁺|󠁣󠁮󠁨󠁥|󠁣󠁮󠁨󠁩|󠁣󠁮󠁨󠁮|󠁣󠁮󠁪󠁬|󠁣󠁦󠁢󠁢|󠁣󠁦󠁡󠁣|󠁣󠁤󠁴󠁵|󠁣󠁤󠁴󠁯|󠁣󠁤󠁴󠁡|󠁣󠁤󠁳󠁵|󠁣󠁤󠁳󠁫|󠁣󠁤󠁳󠁡|󠁣󠁤󠁮󠁵|󠁣󠁤󠁮󠁫|󠁣󠁤󠁭󠁡|󠁣󠁤󠁬󠁵|󠁣󠁤󠁬󠁯|󠁣󠁤󠁫󠁳|󠁣󠁤󠁫󠁮|󠁣󠁤󠁫󠁬|󠁣󠁤󠁫󠁧|󠁣󠁤󠁫󠁥|󠁣󠁤󠁫󠁣|󠁣󠁤󠁩󠁴|󠁣󠁬󠁭󠁬|󠁣󠁬󠁭󠁡|󠁣󠁬󠁬󠁲|󠁣󠁬󠁬󠁬|󠁣󠁬󠁬󠁩|󠁣󠁬󠁣󠁯|󠁣󠁬󠁢󠁩|󠁣󠁬󠁡󠁴|󠁣󠁬󠁡󠁲|󠁥󠁳󠁨󠁵|󠁥󠁳󠁩󠁢|󠁥󠁳󠁬󠁥|󠁥󠁳󠁬󠁯|󠁣󠁬󠁡󠁰|󠁣󠁬󠁡󠁮|󠁣󠁬󠁡󠁩|󠁥󠁳󠁬󠁵|󠁥󠁳󠁭󠁡|󠁣󠁩󠁺󠁺|󠁥󠁳󠁭󠁬|󠁣󠁮󠁦󠁪|󠁣󠁮󠁣󠁱|󠁣󠁮󠁢󠁪|󠁣󠁮󠁡󠁨|󠁣󠁭󠁳󠁷|󠁣󠁭󠁳󠁵|󠁣󠁭󠁯󠁵|󠁥󠁳󠁧󠁲|󠁣󠁭󠁮󠁷|󠁣󠁭󠁮󠁯|󠁣󠁭󠁬󠁴|󠁣󠁭󠁥󠁳|󠁣󠁭󠁥󠁮|󠁣󠁭󠁣󠁥|󠁣󠁭󠁡󠁤|󠁣󠁬󠁶󠁳|󠁣󠁬󠁴󠁡|󠁣󠁬󠁲󠁭|󠁥󠁳󠁧󠁵|󠁣󠁬󠁮󠁢|󠁣󠁩󠁶󠁢|󠁣󠁩󠁳󠁶|󠁥󠁴󠁡󠁡|󠁣󠁩󠁳󠁭|󠁥󠁴󠁡󠁦|󠁥󠁴󠁡󠁭|󠁥󠁴󠁢󠁥|󠁥󠁴󠁤󠁤|󠁥󠁴󠁧󠁡|󠁣󠁩󠁭󠁧|󠁥󠁴󠁨󠁡|󠁥󠁴󠁯󠁲|󠁥󠁴󠁳󠁩|󠁣󠁩󠁬󠁧|󠁥󠁴󠁳󠁷|󠁥󠁴󠁴󠁩|󠁣󠁩󠁬󠁣|󠁣󠁩󠁧󠁤|󠁣󠁩󠁤󠁮|󠁣󠁩󠁣󠁭|󠁥󠁳󠁭󠁵|󠁣󠁩󠁹󠁭|󠁥󠁳󠁮󠁡|󠁥󠁳󠁮󠁣|󠁥󠁳󠁯󠁲|󠁥󠁳󠁰󠁭|󠁥󠁳󠁰󠁯|󠁥󠁳󠁰󠁶|󠁥󠁳󠁲󠁩|󠁥󠁳󠁳󠁡|󠁥󠁳󠁳󠁥|󠁥󠁳󠁳󠁧|󠁥󠁳󠁳󠁯|󠁥󠁳󠁳󠁳|󠁣󠁩󠁷󠁲|󠁥󠁳󠁴󠁯|󠁥󠁳󠁶󠁡|󠁥󠁳󠁶󠁣|󠁥󠁳󠁶󠁩|󠁢󠁮󠁴󠁵|󠁢󠁮󠁴󠁥|󠁢󠁮󠁢󠁭|󠁢󠁮󠁢󠁥|󠁢󠁪󠁺󠁯|󠁢󠁪󠁰󠁬|󠁢󠁪󠁯󠁵|󠁢󠁪󠁭󠁯|󠁢󠁪󠁬󠁩|󠁢󠁪󠁫󠁯|󠁢󠁪󠁤󠁯|󠁢󠁪󠁣󠁯|󠁢󠁪󠁢󠁯|󠁢󠁪󠁡󠁱|󠁢󠁩󠁲󠁹|󠁢󠁩󠁲󠁴|󠁢󠁩󠁲󠁭|󠁢󠁩󠁮󠁧|󠁢󠁩󠁭󠁹|󠁢󠁩󠁭󠁷|󠁢󠁲󠁴󠁯|󠁢󠁲󠁳󠁰|󠁢󠁲󠁳󠁥|󠁢󠁲󠁳󠁣|󠁢󠁲󠁲󠁪|󠁢󠁲󠁰󠁲|󠁢󠁲󠁰󠁩|󠁢󠁲󠁰󠁥|󠁢󠁲󠁭󠁧|󠁢󠁲󠁭󠁡|󠁢󠁲󠁧󠁯|󠁢󠁲󠁥󠁳|󠁢󠁲󠁤󠁦|󠁢󠁲󠁣󠁥|󠁢󠁲󠁢󠁡|󠁢󠁲󠁡󠁰|󠁢󠁲󠁡󠁣|󠁢󠁱󠁳󠁥|󠁢󠁱󠁳󠁡|󠁢󠁱󠁢󠁯|󠁥󠁲󠁧󠁢|󠁥󠁲󠁤󠁵|󠁥󠁲󠁤󠁫|󠁥󠁲󠁡󠁮|󠁥󠁧󠁭󠁴|󠁥󠁧󠁭󠁮|󠁥󠁧󠁬󠁸|󠁥󠁧󠁫󠁮|󠁥󠁧󠁫󠁢|󠁥󠁧󠁪󠁳|󠁥󠁧󠁩󠁳|󠁥󠁧󠁧󠁺|󠁥󠁧󠁧󠁨|󠁥󠁧󠁤󠁴|󠁥󠁧󠁤󠁫|󠁥󠁧󠁢󠁨|󠁡󠁺󠁹󠁥|󠁡󠁺󠁸󠁡|󠁡󠁺󠁳󠁲|󠁡󠁺󠁳󠁭|󠁢󠁩󠁭󠁵|󠁢󠁩󠁭󠁡|󠁢󠁩󠁫󠁹|󠁢󠁩󠁫󠁲|󠁢󠁩󠁫󠁩|󠁢󠁩󠁧󠁩|󠁥󠁳󠁢󠁵|󠁥󠁳󠁢󠁩|󠁥󠁳󠁢󠁡|󠁥󠁳󠁡󠁶|󠁢󠁩󠁣󠁩|󠁢󠁩󠁣󠁡|󠁢󠁩󠁢󠁲|󠁢󠁩󠁢󠁢|󠁢󠁨󠀱󠀷|󠁥󠁳󠁡󠁮|󠁥󠁳󠁡󠁬|󠁥󠁳󠁡󠁢|󠁥󠁲󠁳󠁫|󠁥󠁲󠁭󠁡|󠁣󠁯󠁤󠁣|󠁥󠁳󠁥󠁸|󠁢󠁺󠁳󠁣|󠁢󠁺󠁯󠁷|󠁥󠁳󠁣󠁥|󠁢󠁺󠁣󠁹|󠁢󠁺󠁢󠁺|󠁢󠁹󠁶󠁩|󠁢󠁹󠁭󠁩|󠁢󠁹󠁭󠁡|󠁢󠁹󠁨󠁲|󠁢󠁹󠁨󠁯|󠁢󠁹󠁨󠁭|󠁢󠁹󠁢󠁲|󠁢󠁷󠁳󠁴|󠁢󠁷󠁳󠁥|󠁢󠁷󠁮󠁷|󠁢󠁷󠁮󠁥|󠁢󠁷󠁬󠁯|󠁢󠁷󠁫󠁷|󠁥󠁳󠁺󠁡|󠁣󠁮󠁪󠁳|󠁣󠁮󠁪󠁸|󠁣󠁮󠁬󠁮|󠁥󠁳󠁧󠁩|󠁥󠁳󠁧󠁣|󠁣󠁮󠁭󠁯|󠁣󠁮󠁮󠁭|󠁣󠁮󠁮󠁸|󠁣󠁮󠁱󠁨|󠁣󠁮󠁳󠁨|󠁣󠁮󠁳󠁮|󠁣󠁮󠁳󠁸|󠁣󠁮󠁴󠁪|󠁣󠁮󠁴󠁷|󠁣󠁮󠁸󠁪|󠁣󠁮󠁸󠁺|󠁣󠁮󠁹󠁮|󠁣󠁮󠁺󠁪|󠁥󠁳󠁧󠁡|󠁢󠁳󠁭󠁩|󠁢󠁳󠁭󠁧|󠁢󠁳󠁭󠁣|󠁢󠁳󠁬󠁩|󠁢󠁳󠁩󠁮|󠁢󠁳󠁨󠁴|󠁢󠁳󠁨󠁩|󠁢󠁳󠁧󠁣|󠁢󠁳󠁦󠁰|󠁢󠁳󠁥󠁸|󠁢󠁳󠁥󠁧|󠁢󠁳󠁣󠁳|󠁢󠁳󠁣󠁯|󠁢󠁳󠁣󠁫|󠁢󠁳󠁣󠁩|󠁢󠁳󠁣󠁥|󠁢󠁳󠁢󠁹|󠁢󠁳󠁢󠁰|󠁢󠁳󠁢󠁩|󠁢󠁳󠁡󠁫|󠁢󠁷󠁫󠁬|󠁢󠁷󠁫󠁧|󠁢󠁷󠁪󠁷|󠁢󠁷󠁧󠁨|󠁢󠁷󠁧󠁡|󠁢󠁷󠁦󠁲|󠁢󠁷󠁣󠁨|󠁢󠁷󠁣󠁥|󠁢󠁴󠁴󠁹|󠁢󠁴󠁧󠁡|󠁢󠁳󠁷󠁧|󠁢󠁳󠁳󠁷|󠁢󠁳󠁳󠁳|󠁢󠁳󠁳󠁯|󠁢󠁳󠁳󠁥|󠁢󠁳󠁳󠁡|󠁢󠁳󠁲󠁩|󠁢󠁳󠁲󠁣|󠁢󠁳󠁮󠁳|󠁳󠁺󠁳󠁨|󠁳󠁺󠁭󠁡|󠁳󠁺󠁬󠁵|󠁳󠁺󠁨󠁨|󠁳󠁹󠁴󠁡|󠁳󠁹󠁳󠁵|󠁳󠁹󠁲󠁤|󠁳󠁹󠁲󠁡|󠁳󠁹󠁱󠁵|󠁳󠁹󠁬󠁡|󠁳󠁹󠁩󠁤|󠁳󠁹󠁨󠁩|󠁳󠁹󠁨󠁡|󠁳󠁹󠁤󠁹|󠁳󠁹󠁤󠁲|󠁳󠁹󠁤󠁩|󠁳󠁶󠁵󠁳|󠁳󠁶󠁵󠁮|󠁳󠁶󠁳󠁶|󠁴󠁤󠁳󠁡|󠁴󠁤󠁯󠁤|󠁴󠁤󠁮󠁤|󠁴󠁤󠁭󠁯|󠁴󠁤󠁭󠁥|󠁴󠁤󠁭󠁣|󠁴󠁤󠁭󠁡|󠁴󠁤󠁬󠁲|󠁴󠁤󠁬󠁯|󠁴󠁤󠁬󠁣|󠁴󠁤󠁫󠁡|󠁴󠁤󠁨󠁬|󠁴󠁤󠁧󠁲|󠁴󠁤󠁥󠁯|󠁴󠁤󠁥󠁥|󠁴󠁤󠁣󠁢|󠁴󠁤󠁢󠁯|󠁴󠁤󠁢󠁧|󠁳󠁳󠁥󠁣|󠁳󠁳󠁢󠁷|󠁳󠁳󠁢󠁮|󠁳󠁲󠁷󠁡|󠁳󠁲󠁳󠁩|󠁳󠁲󠁳󠁡|󠁳󠁲󠁰󠁲|󠁳󠁲󠁰󠁭|󠁳󠁲󠁮󠁩|󠁳󠁲󠁭󠁡|󠁳󠁲󠁣󠁲|󠁳󠁲󠁣󠁭|󠁳󠁲󠁢󠁲|󠁳󠁯󠁷󠁯|󠁳󠁯󠁴󠁯|󠁳󠁯󠁳󠁯|󠁳󠁯󠁳󠁨|󠁳󠁯󠁳󠁤|󠁳󠁯󠁳󠁡|󠁴󠁤󠁢󠁡|󠁳󠁶󠁳󠁳|󠁳󠁶󠁳󠁯|󠁳󠁶󠁳󠁭|󠁳󠁶󠁳󠁡|󠁳󠁶󠁰󠁡|󠁳󠁶󠁭󠁯|󠁳󠁶󠁬󠁩|󠁳󠁶󠁣󠁵|󠁳󠁶󠁣󠁨|󠁳󠁶󠁣󠁡|󠁳󠁶󠁡󠁨|󠁳󠁳󠁷󠁲|󠁳󠁳󠁵󠁹|󠁳󠁳󠁮󠁵|󠁳󠁳󠁬󠁫|󠁳󠁳󠁪󠁧|󠁳󠁳󠁥󠁷|󠁵󠁭󠀸󠀱|󠁵󠁭󠀷󠀹|󠁵󠁭󠀷󠀶|󠁵󠁭󠀷󠀱|󠁵󠁭󠀶󠀷|󠁵󠁡󠀷󠀷|󠁵󠁡󠀷󠀴|󠁵󠁡󠀷󠀱|󠁵󠁡󠀶󠀸|󠁵󠁡󠀶󠀵|󠁵󠁡󠀶󠀳|󠁵󠁡󠀶󠀱|󠁵󠁡󠀵󠀹|󠁵󠁡󠀵󠀶|󠁵󠁡󠀵󠀳|󠁵󠁡󠀵󠀱|󠁵󠁡󠀴󠀸|󠁵󠁡󠀴󠀶|󠁵󠁡󠀴󠀳|󠁵󠁳󠁫󠁳|󠁵󠁳󠁩󠁮|󠁵󠁳󠁩󠁬|󠁵󠁳󠁩󠁤|󠁵󠁳󠁩󠁡|󠁵󠁳󠁨󠁩|󠁵󠁳󠁧󠁡|󠁵󠁳󠁦󠁬|󠁵󠁳󠁤󠁥|󠁵󠁳󠁤󠁣|󠁵󠁳󠁣󠁴|󠁵󠁳󠁣󠁯|󠁵󠁳󠁣󠁡|󠁵󠁳󠁡󠁺|󠁵󠁳󠁡󠁲|󠁵󠁭󠀹󠀵|󠁵󠁭󠀸󠀹|󠁵󠁭󠀸󠀶|󠁴󠁬󠁬󠁩|󠁴󠁬󠁬󠁡|󠁴󠁬󠁥󠁲|󠁴󠁬󠁤󠁩|󠁴󠁬󠁣󠁯|󠁴󠁬󠁢󠁯|󠁴󠁬󠁢󠁡|󠁴󠁬󠁡󠁮|󠁴󠁬󠁡󠁬|󠁴󠁪󠁳󠁵|󠁴󠁪󠁲󠁡|󠁴󠁪󠁫󠁴|󠁴󠁪󠁧󠁢|󠁴󠁪󠁤󠁵|󠁴󠁤󠁷󠁦|󠁴󠁤󠁴󠁩|󠁴󠁤󠁴󠁡|󠁴󠁤󠁳󠁩|󠁳󠁳󠁥󠁥|󠁵󠁭󠀸󠀴|󠁵󠁡󠀴󠀰|󠁵󠁡󠀳󠀵|󠁵󠁡󠀳󠀲|󠁵󠁡󠀳󠀰|󠁵󠁡󠀲󠀶|󠁵󠁡󠀲󠀳|󠁵󠁡󠀲󠀱|󠁵󠁡󠀱󠀸|󠁵󠁡󠀱󠀴|󠁵󠁡󠀱󠀲|󠁵󠁡󠀰󠀹|󠁵󠁡󠀰󠀷|󠁵󠁡󠀰󠀵|󠁴󠁮󠀶󠀱|󠁴󠁬󠁶󠁩|󠁴󠁬󠁯󠁥|󠁴󠁬󠁭󠁴|󠁲󠁯󠁮󠁴|󠁲󠁯󠁭󠁳|󠁲󠁯󠁭󠁭|󠁲󠁯󠁭󠁨|󠁲󠁯󠁩󠁳|󠁲󠁯󠁩󠁬|󠁲󠁯󠁩󠁦|󠁲󠁯󠁨󠁲|󠁲󠁯󠁨󠁤|󠁲󠁯󠁧󠁲|󠁲󠁯󠁧󠁬|󠁲󠁯󠁧󠁪|󠁲󠁯󠁤󠁪|󠁲󠁯󠁤󠁢|󠁲󠁯󠁣󠁶|󠁲󠁯󠁣󠁬|󠁲󠁯󠁣󠁪|󠁲󠁯󠁢󠁺|󠁲󠁯󠁢󠁶|󠁲󠁵󠁤󠁡|󠁲󠁵󠁣󠁵|󠁲󠁵󠁣󠁥|󠁲󠁵󠁢󠁵|󠁲󠁵󠁢󠁡|󠁲󠁵󠁡󠁬|󠁲󠁵󠁡󠁤|󠁲󠁳󠁶󠁯|󠁲󠁳󠁫󠁭|󠁲󠁯󠁶󠁳|󠁲󠁯󠁶󠁮|󠁲󠁯󠁶󠁬|󠁲󠁯󠁴󠁲|󠁲󠁯󠁳󠁶|󠁲󠁯󠁳󠁭|󠁲󠁯󠁳󠁪|󠁲󠁯󠁳󠁢|󠁲󠁯󠁰󠁨|󠁰󠁴󠀲󠀰|󠁰󠁬󠀳󠀲|󠁰󠁬󠀳󠀰|󠁰󠁬󠀲󠀸|󠁰󠁬󠀲󠀶|󠁰󠁬󠀲󠀴|󠁰󠁬󠀲󠀲|󠁰󠁬󠀲󠀰|󠁰󠁬󠀱󠀸|󠁰󠁬󠀱󠀶|󠁰󠁬󠀱󠀴|󠁰󠁬󠀱󠀲|󠁰󠁬󠀱󠀰|󠁰󠁬󠀰󠀸|󠁰󠁬󠀰󠀶|󠁰󠁬󠀰󠀴|󠁰󠁬󠀰󠀲|󠁰󠁫󠁳󠁤|󠁰󠁫󠁰󠁢|󠁲󠁯󠁯󠁴|󠁲󠁯󠁢󠁴|󠁲󠁯󠁢󠁲|󠁲󠁯󠁢󠁮|󠁲󠁯󠁢󠁨|󠁲󠁯󠁢󠁣|󠁲󠁯󠁡󠁲|󠁲󠁯󠁡󠁧|󠁲󠁯󠁡󠁢|󠁱󠁡󠁺󠁡|󠁱󠁡󠁷󠁡|󠁱󠁡󠁵󠁳|󠁱󠁡󠁳󠁨|󠁱󠁡󠁲󠁡|󠁱󠁡󠁭󠁳|󠁱󠁡󠁫󠁨|󠁱󠁡󠁤󠁡|󠁰󠁹󠀱󠀹|󠁳󠁮󠁬󠁧|󠁳󠁮󠁫󠁬|󠁳󠁮󠁫󠁡|󠁳󠁮󠁦󠁫|󠁳󠁮󠁤󠁫|󠁳󠁮󠁤󠁢|󠁳󠁬󠁮󠁷|󠁳󠁫󠁺󠁩|󠁳󠁫󠁴󠁣|󠁳󠁫󠁴󠁡|󠁳󠁫󠁰󠁶|󠁳󠁫󠁮󠁩|󠁳󠁫󠁫󠁩|󠁳󠁫󠁢󠁬|󠁳󠁫󠁢󠁣|󠁳󠁨󠁨󠁬|󠁳󠁨󠁡󠁣|󠁳󠁥󠁢󠁤|󠁳󠁤󠁳󠁩|󠁴󠁬󠁭󠁦|󠁳󠁯󠁮󠁵|󠁳󠁯󠁭󠁵|󠁳󠁯󠁪󠁨|󠁳󠁯󠁪󠁤|󠁳󠁯󠁨󠁩|󠁳󠁯󠁧󠁥|󠁳󠁯󠁧󠁡|󠁳󠁯󠁢󠁹|󠁳󠁯󠁢󠁲|󠁳󠁯󠁢󠁮|󠁳󠁯󠁢󠁫|󠁳󠁯󠁡󠁷|󠁳󠁮󠁺󠁧|󠁳󠁮󠁴󠁨|󠁳󠁮󠁴󠁣|󠁳󠁮󠁳󠁬|󠁳󠁮󠁳󠁥|󠁳󠁢󠁴󠁥|󠁳󠁢󠁲󠁢|󠁳󠁢󠁩󠁳|󠁳󠁢󠁧󠁵|󠁳󠁢󠁣󠁴|󠁳󠁢󠁣󠁨|󠁳󠁢󠁣󠁥|󠁳󠁡󠀱󠀴|󠁲󠁵󠁵󠁤|󠁲󠁵󠁴󠁹|󠁲󠁵󠁴󠁡|󠁲󠁵󠁳󠁥|󠁲󠁵󠁳󠁡|󠁲󠁵󠁭󠁯|󠁲󠁵󠁭󠁥|󠁲󠁵󠁫󠁲|󠁲󠁵󠁫󠁯|󠁲󠁵󠁩󠁮|󠁰󠁴󠀳󠀰|󠁳󠁮󠁭󠁴|󠁳󠁤󠁲󠁳|󠁳󠁤󠁮󠁷|󠁳󠁤󠁮󠁲|󠁳󠁤󠁮󠁯|󠁳󠁤󠁮󠁢|󠁳󠁤󠁫󠁳|󠁳󠁤󠁫󠁮|󠁳󠁤󠁫󠁨|󠁳󠁤󠁫󠁡|󠁳󠁤󠁧󠁺|󠁳󠁤󠁧󠁫|󠁳󠁤󠁧󠁤|󠁳󠁤󠁤󠁷|󠁳󠁤󠁤󠁳|󠁳󠁤󠁤󠁮|󠁳󠁤󠁤󠁥|󠁳󠁤󠁤󠁣|󠁧󠁴󠁣󠁭|󠁧󠁴󠁢󠁶|󠁧󠁴󠁡󠁶|󠁧󠁲󠁡󠀱|󠁧󠁲󠀰󠀱|󠁧󠁬󠁱󠁡|󠁧󠁨󠁢󠁡|󠁦󠁲󠁹󠁴|󠁦󠁲󠁷󠁦|󠁦󠁲󠁴󠁦|󠁦󠁲󠁲󠁥|󠁦󠁲󠁰󠁭|󠁦󠁲󠁰󠁦|󠁦󠁲󠁮󠁣|󠁦󠁲󠁭󠁱|󠁦󠁲󠁭󠁦|󠁦󠁲󠁧󠁰|󠁦󠁲󠁧󠁦|󠁦󠁲󠁣󠁰|󠁧󠁴󠁺󠁡|󠁧󠁴󠁴󠁯|󠁧󠁴󠁳󠁵|󠁧󠁴󠁳󠁲|󠁧󠁴󠁳󠁯|󠁧󠁴󠁳󠁭|󠁧󠁴󠁳󠁡|󠁧󠁴󠁲󠁥|󠁧󠁴󠁱󠁺|󠁧󠁴󠁱󠁣|󠁧󠁴󠁰󠁲|󠁧󠁴󠁰󠁥|󠁧󠁴󠁪󠁵|󠁧󠁴󠁪󠁡|󠁧󠁴󠁩󠁺|󠁧󠁴󠁨󠁵|󠁧󠁴󠁧󠁵|󠁧󠁴󠁥󠁳|󠁣󠁺󠁰󠁲|󠁣󠁺󠁰󠁬|󠁣󠁺󠁰󠁡|󠁣󠁺󠁯󠁬|󠁣󠁺󠁭󠁯|󠁣󠁺󠁬󠁩|󠁣󠁺󠁫󠁲|󠁣󠁺󠁫󠁡|󠁣󠁺󠁪󠁭|󠁣󠁺󠁪󠁣|󠁣󠁮󠀷󠀱|󠁣󠁤󠁯󠁲|󠁣󠁤󠁫󠁷|󠁣󠁤󠁫󠁡|󠁣󠁤󠁢󠁮|󠁢󠁨󠀱󠀶|󠁢󠁡󠀱󠀰|󠁡󠁬󠁶󠁬|󠁡󠁬󠁴󠁲|󠁧󠁴󠁣󠁱|󠁦󠁲󠁢󠁬|󠁦󠁲󠀷󠀵|󠁦󠁩󠀰󠀱|󠁥󠁥󠀸󠀶|󠁥󠁥󠀸󠀲|󠁥󠁥󠀷󠀸|󠁥󠁥󠀷󠀰|󠁥󠁥󠀶󠀷|󠁥󠁥󠀶󠀵|󠁥󠁥󠀵󠀹|󠁥󠁥󠀵󠀷|󠁥󠁥󠀵󠀱|󠁥󠁥󠀴󠀹|󠁥󠁥󠀴󠀴|󠁣󠁺󠁺󠁬|󠁣󠁺󠁶󠁹|󠁣󠁺󠁵󠁳|󠁰󠁬󠁬󠁤|󠁰󠁬󠁬󠁢|󠁰󠁬󠁫󠁰|󠁰󠁬󠁤󠁳|󠁰󠁫󠁴󠁡|󠁯󠁭󠁳󠁨|󠁯󠁭󠁢󠁡|󠁮󠁰󠁳󠁥|󠁮󠁰󠁳󠁡|󠁮󠁰󠁲󠁡|󠁮󠁰󠁮󠁡|󠁮󠁰󠁭󠁥|󠁮󠁰󠁭󠁡|󠁮󠁰󠁬󠁵|󠁮󠁰󠁫󠁯|󠁮󠁰󠁫󠁡|󠁮󠁰󠁪󠁡|󠁮󠁰󠁧󠁡|󠁮󠁰󠁤󠁨|󠁺󠁡󠁮󠁬|󠁺󠁡󠁧󠁴|󠁵󠁳󠁶󠁩|󠁵󠁳󠁵󠁭|󠁵󠁳󠁰󠁲|󠁵󠁳󠁭󠁰|󠁵󠁳󠁧󠁵|󠁵󠁳󠁡󠁳|󠁳󠁨󠁴󠁡|󠁰󠁬󠁺󠁰|󠁰󠁬󠁷󠁰|󠁰󠁬󠁷󠁮|󠁰󠁬󠁰󠁭|󠁰󠁬󠁰󠁫|󠁰󠁬󠁰󠁤|󠁰󠁬󠁯󠁰|󠁰󠁬󠁭󠁺|󠁰󠁬󠁭󠁡|󠁭󠁵󠁶󠁰|󠁭󠁵󠁱󠁢|󠁭󠁵󠁰󠁵|󠁭󠁵󠁣󠁵|󠁭󠁵󠁢󠁲|󠁬󠁡󠁸󠁮|󠁩󠁴󠁶󠁳|󠁩󠁴󠁳󠁤|󠁩󠁴󠁯󠁴|󠁩󠁴󠁯󠁧|󠁩󠁴󠁣󠁩|󠁩󠁴󠁡󠁯|󠁩󠁮󠁵󠁴|󠁩󠁮󠁴󠁧|󠁩󠁮󠁯󠁲|󠁩󠁮󠁤󠁮|󠁩󠁮󠁤󠁤|󠁩󠁮󠁣󠁴|󠁣󠁺󠁳󠁴|󠁰󠁬󠁬󠁵|󠁮󠁰󠁢󠁨|󠁮󠁰󠁢󠁡|󠁮󠁯󠀲󠀳|󠁮󠁯󠀲󠀰|󠁮󠁯󠀱󠀹|󠁮󠁯󠀱󠀴|󠁮󠁯󠀱󠀲|󠁮󠁯󠀱󠀰|󠁮󠁬󠁳󠁸|󠁮󠁬󠁣󠁷|󠁮󠁬󠁡󠁷|󠁭󠁶󠁵󠁳|󠁭󠁶󠁵󠁮|󠁭󠁶󠁳󠁵|󠁭󠁶󠁳󠁣|󠁭󠁶󠁮󠁯|󠁭󠁶󠁮󠁣|󠁶󠁮󠀰󠀹|󠁵󠁺󠁸󠁯|󠁵󠁺󠁴󠁯|󠁵󠁺󠁴󠁫|󠁵󠁺󠁳󠁵|󠁵󠁺󠁳󠁩|󠁵󠁺󠁳󠁡|󠁵󠁺󠁱󠁲|󠁵󠁺󠁱󠁡|󠁵󠁺󠁮󠁷|󠁵󠁺󠁮󠁧|󠁵󠁺󠁪󠁩|󠁵󠁺󠁦󠁡|󠁵󠁺󠁢󠁵|󠁵󠁺󠁡󠁮|󠁵󠁹󠁴󠁴|󠁵󠁹󠁴󠁡|󠁵󠁹󠁳󠁯|󠁵󠁹󠁳󠁪|󠁷󠁳󠁧󠁩|󠁷󠁳󠁧󠁥|󠁷󠁳󠁦󠁡|󠁷󠁳󠁡󠁴|󠁷󠁳󠁡󠁬|󠁷󠁳󠁡󠁡|󠁷󠁦󠁵󠁶|󠁷󠁦󠁳󠁧|󠁷󠁦󠁡󠁬|󠁶󠁮󠁳󠁧|󠁶󠁮󠁨󠁰|󠁶󠁮󠁨󠁮|󠁶󠁮󠁤󠁮|󠁶󠁮󠁣󠁴|󠁶󠁮󠀶󠀳|󠁶󠁮󠀶󠀱|󠁶󠁮󠀴󠀹|󠁶󠁮󠀳󠀹|󠁵󠁳󠁶󠁡|󠁵󠁳󠁵󠁴|󠁵󠁳󠁴󠁸|󠁵󠁳󠁴󠁮|󠁵󠁳󠁲󠁩|󠁵󠁳󠁰󠁡|󠁵󠁳󠁯󠁲|󠁵󠁳󠁯󠁫|󠁵󠁳󠁯󠁨|󠁵󠁳󠁮󠁹|󠁵󠁳󠁮󠁶|󠁵󠁳󠁮󠁭|󠁵󠁳󠁮󠁪|󠁵󠁳󠁮󠁨|󠁵󠁳󠁭󠁩|󠁵󠁳󠁭󠁡|󠁵󠁳󠁬󠁡|󠁵󠁳󠁫󠁹|󠁳󠁢󠁷󠁥|󠁶󠁮󠀱󠀸|󠁵󠁹󠁳󠁡|󠁵󠁹󠁲󠁶|󠁵󠁹󠁰󠁡|󠁵󠁹󠁭󠁯|󠁵󠁹󠁭󠁡|󠁵󠁹󠁬󠁡|󠁵󠁹󠁦󠁳|󠁵󠁹󠁦󠁤|󠁵󠁹󠁤󠁵|󠁵󠁹󠁣󠁯|󠁵󠁹󠁣󠁬|󠁵󠁹󠁣󠁡|󠁵󠁹󠁡󠁲|󠁵󠁳󠁷󠁹|󠁵󠁳󠁷󠁶|󠁵󠁳󠁷󠁩|󠁵󠁳󠁷󠁡|󠁡󠁬󠁧󠁲|󠁡󠁬󠁧󠁪|󠁡󠁬󠁦󠁲|󠁡󠁬󠁥󠁲|󠁡󠁬󠁥󠁬|󠁡󠁬󠁤󠁶|󠁡󠁬󠁤󠁲|󠁡󠁬󠁤󠁬|󠁡󠁬󠁤󠁩|󠁡󠁬󠁢󠁵|󠁡󠁬󠁢󠁲|󠁺󠁷󠁭󠁳|󠁺󠁷󠁭󠁮|󠁺󠁷󠁭󠁩|󠁺󠁷󠁭󠁥|󠁺󠁷󠁭󠁣|󠁺󠁷󠁭󠁡|󠁺󠁷󠁨󠁡|󠁺󠁷󠁢󠁵|󠁭󠁶󠁣󠁥|󠁡󠁬󠁴󠁰|󠁡󠁬󠁴󠁥|󠁡󠁬󠁳󠁲|󠁡󠁬󠁳󠁫|󠁡󠁬󠁳󠁨|󠁡󠁬󠁰󠁵|󠁡󠁬󠁰󠁧|󠁡󠁬󠁭󠁴|󠁡󠁬󠁭󠁲|󠁡󠁬󠁭󠁭|󠁡󠁬󠁭󠁫|󠁡󠁬󠁬󠁵|󠁡󠁬󠁬󠁥|󠁡󠁬󠁬󠁢|󠁡󠁬󠁫󠁵|󠁡󠁬󠁫󠁲|󠁡󠁬󠁫󠁯|󠁹󠁥󠁭󠁡|󠁹󠁥󠁬󠁡|󠁹󠁥󠁪󠁡|󠁹󠁥󠁩󠁢|󠁹󠁥󠁨󠁵|󠁹󠁥󠁨󠁪|󠁹󠁥󠁨󠁤|󠁹󠁥󠁤󠁨|󠁹󠁥󠁤󠁡|󠁹󠁥󠁢󠁡|󠁹󠁥󠁡󠁭|󠁹󠁥󠁡󠁤|󠁹󠁥󠁡󠁢|󠁷󠁳󠁶󠁳|󠁷󠁳󠁶󠁦|󠁷󠁳󠁴󠁵|󠁷󠁳󠁳󠁡|󠁷󠁳󠁰󠁡|󠁵󠁳󠁶󠁴|󠁡󠁬󠁨󠁡|󠁺󠁭󠀱󠀰|󠁺󠁡󠁷󠁣|󠁺󠁡󠁮󠁷|󠁺󠁡󠁮󠁣|󠁺󠁡󠁭󠁰|󠁺󠁡󠁬󠁰|󠁺󠁡󠁧󠁰|󠁺󠁡󠁦󠁳|󠁺󠁡󠁥󠁣|󠁹󠁥󠁴󠁡|󠁹󠁥󠁳󠁵|󠁹󠁥󠁳󠁮|󠁹󠁥󠁳󠁨|󠁹󠁥󠁳󠁤|󠁹󠁥󠁳󠁡|󠁹󠁥󠁲󠁡|󠁹󠁥󠁭󠁷|󠁹󠁥󠁭󠁲|󠁩󠁴󠁲󠁩|󠁩󠁴󠁲󠁧|󠁩󠁴󠁲󠁥|󠁩󠁴󠁲󠁣|󠁩󠁴󠁲󠁡|󠁩󠁴󠁰󠁺|󠁩󠁴󠁰󠁲|󠁩󠁴󠁰󠁩|󠁩󠁴󠁰󠁧|󠁩󠁴󠁰󠁡|󠁩󠁴󠁯󠁲|󠁩󠁴󠁮󠁵|󠁩󠁴󠁮󠁯|󠁩󠁴󠁮󠁡|󠁩󠁴󠁭󠁩|󠁩󠁴󠁭󠁥|󠁩󠁴󠁬󠁯|󠁩󠁴󠁬󠁩|󠁪󠁯󠁩󠁲|󠁪󠁯󠁢󠁡|󠁪󠁯󠁡󠁺|󠁪󠁯󠁡󠁴|󠁪󠁯󠁡󠁱|󠁪󠁯󠁡󠁭|󠁪󠁯󠁡󠁪|󠁩󠁴󠁶󠁶|󠁩󠁴󠁶󠁴|󠁩󠁴󠁶󠁲|󠁩󠁴󠁶󠁩|󠁩󠁴󠁶󠁥|󠁩󠁴󠁵󠁤|󠁩󠁴󠁴󠁶|󠁩󠁴󠁴󠁥|󠁩󠁴󠁴󠁡|󠁩󠁴󠁳󠁩|󠁩󠁴󠁳󠁡|󠁩󠁴󠁣󠁥|󠁩󠁴󠁢󠁺|󠁩󠁴󠁢󠁬|󠁩󠁴󠁢󠁩|󠁩󠁴󠁢󠁧|󠁩󠁴󠁢󠁡|󠁩󠁴󠁡󠁶|󠁩󠁴󠁡󠁴|󠁩󠁴󠁡󠁮|󠁩󠁴󠁡󠁬|󠁩󠁴󠁡󠁧|󠁩󠁴󠀸󠀸|󠁩󠁴󠀸󠀲|󠁩󠁴󠀷󠀵|󠁩󠁴󠀷󠀲|󠁩󠁴󠀶󠀷|󠁩󠁴󠀶󠀵|󠁩󠁴󠀶󠀲|󠁩󠁴󠁬󠁥|󠁩󠁴󠁬󠁣|󠁩󠁴󠁫󠁲|󠁩󠁴󠁩󠁳|󠁩󠁴󠁩󠁭|󠁩󠁴󠁧󠁲|󠁩󠁴󠁧󠁯|󠁩󠁴󠁧󠁥|󠁩󠁴󠁦󠁲|󠁩󠁴󠁦󠁭|󠁩󠁴󠁦󠁩|󠁩󠁴󠁦󠁧|󠁩󠁴󠁦󠁥|󠁩󠁴󠁦󠁣|󠁩󠁴󠁥󠁮|󠁩󠁴󠁣󠁺|󠁩󠁴󠁣󠁬|󠁬󠁢󠁪󠁬|󠁬󠁢󠁪󠁡|󠁬󠁢󠁢󠁡|󠁬󠁢󠁡󠁳|󠁬󠁢󠁡󠁫|󠁬󠁡󠁸󠁳|󠁬󠁡󠁸󠁩|󠁬󠁡󠁸󠁥|󠁬󠁡󠁸󠁡|󠁬󠁡󠁶󠁴|󠁬󠁡󠁶󠁩|󠁬󠁡󠁳󠁶|󠁬󠁡󠁳󠁬|󠁬󠁡󠁰󠁨|󠁬󠁡󠁯󠁵|󠁬󠁡󠁬󠁰|󠁬󠁡󠁬󠁭|󠁬󠁡󠁫󠁨|󠁬󠁴󠁡󠁬|󠁬󠁴󠀶󠀰|󠁬󠁲󠁳󠁩|󠁬󠁲󠁲󠁩|󠁬󠁲󠁲󠁧|󠁬󠁲󠁮󠁩|󠁬󠁲󠁭󠁹|󠁬󠁲󠁭󠁯|󠁬󠁲󠁭󠁧|󠁬󠁲󠁬󠁯|󠁬󠁲󠁧󠁰|󠁬󠁲󠁧󠁫|󠁬󠁲󠁧󠁧|󠁬󠁲󠁧󠁢|󠁬󠁲󠁣󠁭|󠁬󠁲󠁢󠁭|󠁬󠁲󠁢󠁧|󠁬󠁢󠁮󠁡|󠁫󠁷󠁭󠁵|󠁫󠁷󠁫󠁵|󠁫󠁷󠁪󠁡|󠁫󠁷󠁨󠁡|󠁫󠁷󠁦󠁡|󠁫󠁷󠁡󠁨|󠁫󠁲󠀵󠀰|󠁫󠁲󠀱󠀱|󠁫󠁰󠀱󠀰|󠁫󠁮󠀱󠀵|󠁫󠁧󠁧󠁯|󠁫󠁧󠁧󠁢|󠁪󠁯󠁭󠁮|󠁪󠁯󠁭󠁤|󠁪󠁯󠁭󠁡|󠁪󠁯󠁫󠁡|󠁪󠁯󠁪󠁡|󠁩󠁴󠁣󠁨|󠁬󠁡󠁨󠁯|󠁬󠁡󠁣󠁨|󠁬󠁡󠁡󠁴|󠁫󠁺󠀷󠀹|󠁫󠁺󠀷󠀵|󠁫󠁺󠀷󠀱|󠁫󠁺󠀵󠀹|󠁫󠁺󠀵󠀵|󠁫󠁺󠀴󠀷|󠁫󠁺󠀴󠀳|󠁫󠁺󠀳󠀹|󠁫󠁺󠀳󠀵|󠁫󠁺󠀳󠀳|󠁫󠁺󠀳󠀱|󠁫󠁺󠀲󠀷|󠁫󠁺󠀲󠀳|󠁫󠁺󠀱󠀹|󠁩󠁤󠁬󠁡|󠁩󠁤󠁫󠁩|󠁩󠁤󠁪󠁷|󠁩󠁤󠁪󠁴|󠁩󠁤󠁪󠁫|󠁩󠁤󠁪󠁩|󠁩󠁤󠁧󠁯|󠁩󠁤󠁢󠁴|󠁩󠁤󠁢󠁥|󠁩󠁤󠁡󠁣|󠁨󠁵󠁺󠁥|󠁨󠁵󠁺󠁡|󠁨󠁵󠁶󠁭|󠁨󠁵󠁶󠁥|󠁨󠁵󠁶󠁡|󠁨󠁵󠁴󠁯|󠁨󠁵󠁴󠁢|󠁨󠁵󠁳󠁺|󠁩󠁥󠁬󠁭|󠁩󠁥󠁬󠁫|󠁩󠁥󠁬󠁨|󠁩󠁥󠁬󠁤|󠁩󠁥󠁫󠁹|󠁩󠁥󠁫󠁫|󠁩󠁥󠁫󠁥|󠁩󠁥󠁤󠁬|󠁩󠁥󠁣󠁷|󠁩󠁥󠁣󠁥|󠁩󠁤󠁹󠁯|󠁩󠁤󠁳󠁧|󠁩󠁤󠁲󠁩|󠁩󠁤󠁰󠁰|󠁩󠁤󠁮󠁢|󠁩󠁤󠁭󠁵|󠁩󠁤󠁭󠁬|󠁩󠁤󠁭󠁡|󠁨󠁵󠁧󠁳|󠁨󠁵󠁦󠁥|󠁨󠁵󠁥󠁲|󠁨󠁵󠁥󠁧|󠁨󠁵󠁤󠁵|󠁨󠁵󠁤󠁥|󠁨󠁵󠁣󠁳|󠁨󠁵󠁢󠁺|󠁨󠁵󠁢󠁵|󠁨󠁵󠁢󠁫|󠁨󠁵󠁢󠁥|󠁨󠁵󠁢󠁣|󠁨󠁵󠁢󠁡|󠁨󠁴󠁯󠁵|󠁨󠁴󠁮󠁯|󠁨󠁴󠁮󠁩|󠁨󠁴󠁧󠁡|󠁢󠁳󠁮󠁥|󠁨󠁵󠁳󠁫|󠁨󠁵󠁳󠁨|󠁨󠁵󠁳󠁦|󠁨󠁵󠁳󠁤|󠁨󠁵󠁰󠁳|󠁨󠁵󠁰󠁥|󠁨󠁵󠁮󠁹|󠁨󠁵󠁮󠁯|󠁨󠁵󠁮󠁫|󠁨󠁵󠁭󠁩|󠁨󠁵󠁫󠁶|󠁨󠁵󠁫󠁭|󠁨󠁵󠁫󠁥|󠁨󠁵󠁪󠁮|󠁨󠁵󠁨󠁶|󠁨󠁵󠁨󠁥|󠁨󠁵󠁨󠁢|󠁩󠁱󠁮󠁡|󠁩󠁱󠁭󠁵|󠁩󠁱󠁭󠁡|󠁩󠁱󠁫󠁲|󠁩󠁱󠁫󠁩|󠁩󠁱󠁫󠁡|󠁩󠁱󠁤󠁱|󠁩󠁱󠁤󠁩|󠁩󠁱󠁤󠁡|󠁩󠁱󠁢󠁧|󠁩󠁱󠁡󠁲|󠁩󠁱󠁡󠁮|󠁩󠁮󠁷󠁢|󠁩󠁮󠁵󠁰|󠁩󠁮󠁵󠁫|󠁩󠁮󠁴󠁮|󠁩󠁮󠁳󠁫|󠁩󠁮󠁲󠁪|󠁫󠁺󠀱󠀵|󠁩󠁴󠀵󠀷|󠁩󠁴󠀵󠀵|󠁩󠁴󠀵󠀲|󠁩󠁴󠀴󠀵|󠁩󠁴󠀴󠀲|󠁩󠁴󠀳󠀶|󠁩󠁴󠀳󠀴|󠁩󠁴󠀳󠀲|󠁩󠁴󠀲󠀵|󠁩󠁴󠀲󠀳|󠁩󠁴󠀲󠀱|󠁩󠁲󠀳󠀰|󠁩󠁱󠁷󠁡|󠁩󠁱󠁳󠁵|󠁩󠁱󠁳󠁤|󠁩󠁱󠁱󠁡|󠁩󠁱󠁮󠁩|󠁩󠁮󠁧󠁡|󠁩󠁮󠁤󠁬|󠁩󠁮󠁤󠁨|󠁩󠁮󠁢󠁲|󠁩󠁮󠁡󠁰|󠁩󠁮󠁡󠁮|󠁩󠁬󠁴󠁡|󠁩󠁬󠁪󠁭|󠁩󠁬󠁨󠁡|󠁩󠁥󠁷󠁨|󠁩󠁥󠁷󠁤|󠁩󠁥󠁴󠁡|󠁩󠁥󠁳󠁯|󠁩󠁥󠁲󠁮|󠁩󠁥󠁯󠁹|󠁩󠁥󠁭󠁨|󠁩󠁥󠁬󠁳|󠁨󠁵󠁧󠁹|󠁩󠁮󠁰󠁹|󠁩󠁮󠁰󠁢|󠁩󠁮󠁯󠁤|󠁩󠁮󠁮󠁬|󠁩󠁮󠁭󠁺|󠁩󠁮󠁭󠁰|󠁩󠁮󠁭󠁮|󠁩󠁮󠁭󠁬|󠁩󠁮󠁭󠁨|󠁩󠁮󠁬󠁤|󠁩󠁮󠁬󠁡|󠁩󠁮󠁫󠁬|󠁩󠁮󠁫󠁡|󠁩󠁮󠁪󠁫|󠁩󠁮󠁪󠁨|󠁩󠁮󠁨󠁲|󠁩󠁮󠁨󠁰|󠁩󠁮󠁧󠁪|󠁮󠁧󠁡󠁫|󠁮󠁧󠁡󠁤|󠁮󠁧󠁡󠁢|󠁮󠁡󠁯󠁷|󠁮󠁡󠁯󠁮|󠁮󠁡󠁯󠁨|󠁮󠁡󠁯󠁤|󠁮󠁡󠁫󠁷|󠁮󠁡󠁫󠁵|󠁮󠁡󠁫󠁨|󠁮󠁡󠁫󠁥|󠁮󠁡󠁫󠁡|󠁮󠁡󠁨󠁡|󠁮󠁡󠁥󠁲|󠁮󠁡󠁣󠁡|󠁭󠁷󠁺󠁯|󠁭󠁷󠁴󠁨|󠁭󠁷󠁳󠁡|󠁮󠁧󠁬󠁡|󠁮󠁧󠁫󠁷|󠁮󠁧󠁫󠁴|󠁮󠁧󠁪󠁩|󠁮󠁧󠁩󠁭|󠁮󠁧󠁧󠁯|󠁮󠁧󠁦󠁣|󠁮󠁧󠁥󠁮|󠁮󠁧󠁥󠁫|󠁮󠁧󠁥󠁤|󠁮󠁧󠁥󠁢|󠁮󠁧󠁤󠁥|󠁮󠁧󠁣󠁲|󠁮󠁧󠁢󠁹|󠁮󠁧󠁢󠁯|󠁮󠁧󠁢󠁥|󠁮󠁧󠁢󠁡|󠁮󠁧󠁡󠁮|󠁭󠁷󠁣󠁫|󠁭󠁷󠁢󠁬|󠁭󠁷󠁢󠁡|󠁭󠁶󠀲󠀰|󠁭󠁶󠀱󠀷|󠁭󠁵󠁳󠁡|󠁭󠁵󠁲󠁲|󠁭󠁵󠁲󠁯|󠁭󠁵󠁰󠁷|󠁭󠁵󠁰󠁬|󠁭󠁵󠁰󠁡|󠁭󠁵󠁭󠁯|󠁭󠁵󠁧󠁰|󠁭󠁵󠁦󠁬|󠁭󠁵󠁣󠁣|󠁭󠁵󠁢󠁬|󠁭󠁵󠁡󠁧|󠁭󠁬󠀱󠀰|󠁭󠁷󠁲󠁵|󠁭󠁷󠁰󠁨|󠁭󠁷󠁮󠁵|󠁭󠁷󠁮󠁳|󠁭󠁷󠁮󠁫|󠁭󠁷󠁮󠁩|󠁭󠁷󠁮󠁥|󠁭󠁷󠁮󠁢|󠁭󠁷󠁭󠁺|󠁭󠁷󠁭󠁷|󠁭󠁷󠁭󠁵|󠁭󠁷󠁭󠁣|󠁭󠁷󠁬󠁫|󠁭󠁷󠁬󠁩|󠁭󠁷󠁤󠁯|󠁭󠁷󠁤󠁥|󠁭󠁷󠁣󠁴|󠁯󠁭󠁢󠁵|󠁯󠁭󠁢󠁳|󠁯󠁭󠁢󠁪|󠁮󠁯󠀵󠀴|󠁮󠁯󠀵󠀰|󠁮󠁯󠀴󠀶|󠁮󠁯󠀴󠀲|󠁮󠁯󠀳󠀸|󠁮󠁯󠀳󠀴|󠁮󠁯󠀳󠀰|󠁮󠁯󠀱󠀸|󠁮󠁯󠀱󠀵|󠁮󠁯󠀱󠀱|󠁮󠁯󠀰󠀳|󠁮󠁬󠁺󠁨|󠁮󠁬󠁺󠁥|󠁮󠁬󠁵󠁴|󠁮󠁬󠁯󠁶|󠁰󠁫󠁫󠁰|󠁰󠁫󠁪󠁫|󠁰󠁫󠁩󠁳|󠁰󠁫󠁧󠁢|󠁰󠁫󠁢󠁡|󠁰󠁡󠁮󠁴|󠁰󠁡󠁮󠁢|󠁰󠁡󠁫󠁹|󠁰󠁡󠁥󠁭|󠁰󠁡󠀱󠀰|󠁯󠁭󠁺󠁵|󠁯󠁭󠁺󠁡|󠁯󠁭󠁷󠁵|󠁯󠁭󠁳󠁳|󠁯󠁭󠁳󠁪|󠁯󠁭󠁭󠁵|󠁯󠁭󠁭󠁡|󠁯󠁭󠁤󠁡|󠁮󠁩󠁣󠁩|󠁮󠁩󠁣󠁡|󠁮󠁩󠁢󠁯|󠁮󠁩󠁡󠁳|󠁮󠁩󠁡󠁮|󠁮󠁧󠁺󠁡|󠁮󠁧󠁹󠁯|󠁮󠁧󠁴󠁡|󠁮󠁧󠁳󠁯|󠁮󠁧󠁲󠁩|󠁮󠁧󠁰󠁬|󠁮󠁧󠁯󠁹|󠁮󠁧󠁯󠁳|󠁮󠁧󠁯󠁮|󠁮󠁧󠁯󠁧|󠁮󠁧󠁮󠁩|󠁮󠁧󠁮󠁡|󠁭󠁷󠁣󠁲|󠁮󠁬󠁮󠁨|󠁮󠁬󠁮󠁢|󠁮󠁬󠁬󠁩|󠁮󠁬󠁧󠁲|󠁮󠁬󠁧󠁥|󠁮󠁬󠁦󠁲|󠁮󠁬󠁦󠁬|󠁮󠁬󠁤󠁲|󠁮󠁩󠁳󠁪|󠁮󠁩󠁲󠁩|󠁮󠁩󠁮󠁳|󠁮󠁩󠁭󠁮|󠁮󠁩󠁭󠁤|󠁮󠁩󠁬󠁥|󠁮󠁩󠁪󠁩|󠁮󠁩󠁧󠁲|󠁮󠁩󠁥󠁳|󠁮󠁩󠁣󠁯|󠁬󠁹󠁫󠁦|󠁬󠁹󠁭󠁢|󠁬󠁹󠁭󠁱|󠁬󠁹󠁮󠁬|󠁬󠁹󠁮󠁱|󠁬󠁹󠁳󠁢|󠁬󠁹󠁳󠁲|󠁬󠁹󠁴󠁢|󠁬󠁹󠁷󠁡|󠁬󠁹󠁷󠁤|󠁬󠁹󠁷󠁳|󠁬󠁹󠁺󠁡|󠁭󠁣󠁣󠁬|󠁭󠁣󠁣󠁯|󠁭󠁣󠁦󠁯|󠁭󠁣󠁧󠁡|󠁭󠁣󠁪󠁥|󠁭󠁣󠁬󠁡|󠁭󠁣󠁭󠁡|󠁭󠁣󠁭󠁣|󠁭󠁣󠁭󠁧|󠁭󠁣󠁭󠁯|󠁭󠁣󠁭󠁵|󠁭󠁣󠁰󠁨|󠁭󠁣󠁳󠁤|󠁭󠁣󠁳󠁲|󠁭󠁣󠁶󠁲|󠁭󠁤󠁡󠁮|󠁭󠁤󠁢󠁡|󠁬󠁴󠁫󠁬|󠁬󠁴󠁫󠁵|󠁬󠁴󠁭󠁲|󠁬󠁴󠁰󠁮|󠁬󠁴󠁳󠁡|󠁬󠁴󠁴󠁡|󠁬󠁴󠁴󠁥|󠁬󠁴󠁵󠁴|󠁬󠁴󠁶󠁬|󠁬󠁵󠁣󠁡|󠁬󠁵󠁣󠁬|󠁬󠁵󠁤󠁩|󠁬󠁵󠁥󠁣|󠁬󠁵󠁥󠁳|󠁬󠁵󠁧󠁲|󠁬󠁵󠁬󠁵|󠁬󠁵󠁭󠁥|󠁬󠁵󠁲󠁤|󠁬󠁵󠁲󠁭|󠁬󠁵󠁶󠁤|󠁬󠁵󠁷󠁩|󠁬󠁹󠁢󠁡|󠁬󠁹󠁢󠁵|󠁬󠁹󠁤󠁲|󠁬󠁹󠁧󠁴|󠁬󠁹󠁪󠁡|󠁬󠁹󠁪󠁧|󠁬󠁹󠁪󠁩|󠁬󠁹󠁪󠁵|󠁭󠁤󠁢󠁤|󠁭󠁤󠁨󠁩|󠁭󠁤󠁯󠁣|󠁭󠁤󠁧󠁬|󠁭󠁤󠁧󠁡|󠁭󠁤󠁵󠁮|󠁭󠁤󠁯󠁲|󠁭󠁤󠁲󠁥|󠁭󠁤󠁴󠁥|󠁭󠁤󠁦󠁬|󠁭󠁤󠁲󠁩|󠁭󠁤󠁤󠁵|󠁭󠁤󠁳󠁤|󠁭󠁤󠁳󠁩|󠁭󠁤󠁳󠁴|󠁭󠁤󠁳󠁶|󠁭󠁤󠁥󠁤|󠁭󠁤󠁴󠁡|󠁭󠁤󠁣󠁡|󠁭󠁤󠁤󠁯|󠁭󠁤󠁩󠁡|󠁭󠁤󠁤󠁲|󠁭󠁤󠁬󠁥|󠁭󠁤󠁦󠁡|󠁭󠁤󠁮󠁩|󠁧󠁱󠁩|󠁴󠁧󠁫|󠁧󠁷󠁮|󠁧󠁷󠁬|󠁬󠁵󠁤|󠁥󠁳󠁡|󠁬󠁵󠁧|󠁬󠁵󠁬|󠁴󠁧󠁭|󠁭󠁷󠁣|󠁳󠁴󠁰|󠁥󠁳󠁯|󠁴󠁧󠁰|󠁥󠁳󠁰|󠁥󠁳󠁳|󠁴󠁧󠁳|󠁴󠁨󠁳|󠁳󠁬󠁷|󠁧󠁱󠁣|󠁵󠁧󠁷|󠁵󠁧󠁮|󠁵󠁧󠁥|󠁵󠁧󠁣|󠁭󠁧󠁡|󠁭󠁧󠁤|󠁰󠁡󠀱|󠁥󠁳󠁬|󠁥󠁳󠁣|󠁳󠁴󠁳|󠁥󠁳󠁪|󠁭󠁧󠁦|󠁭󠁧󠁭|󠁥󠁳󠁨|󠁭󠁨󠁬|󠁭󠁮󠀱|󠁭󠁨󠁴|󠁭󠁬󠀱|󠁲󠁯󠁢|󠁧󠁷󠁳|󠁴󠁭󠁤|󠁬󠁫󠀱|󠁬󠁫󠀲|󠁬󠁫󠀳|󠁬󠁫󠀴|󠁬󠁫󠀵|󠁬󠁫󠀶|󠁮󠁺󠁮|󠁮󠁺󠁳|󠁬󠁫󠀷|󠁬󠁫󠀸|󠁬󠁫󠀹|󠁴󠁭󠁳|󠁰󠁹󠀱|󠁥󠁳󠁭|󠁫󠁭󠁭|󠁥󠁧󠁣|󠁫󠁮󠁫|󠁢󠁯󠁨|󠁦󠁲󠁣|󠁢󠁯󠁬|󠁫󠁮󠁮|󠁣󠁲󠁡|󠁦󠁲󠁭|󠁣󠁲󠁣|󠁩󠁬󠁺|󠁦󠁲󠁮|󠁩󠁬󠁭|󠁣󠁲󠁬|󠁣󠁲󠁰|󠁩󠁬󠁤|󠁳󠁥󠁫|󠁭󠁺󠁮|󠁭󠁺󠁬|󠁣󠁧󠀵|󠁣󠁧󠀲|󠁭󠁺󠁩|󠁭󠁺󠁧|󠁥󠁳󠁺|󠁫󠁧󠁪|󠁫󠁧󠁴|󠁫󠁧󠁹|󠁫󠁨󠀱|󠁫󠁨󠀲|󠁫󠁩󠁧|󠁫󠁩󠁬|󠁫󠁩󠁰|󠁫󠁭󠁡|󠁫󠁭󠁧|󠁩󠁥󠁬|󠁥󠁳󠁴|󠁧󠁮󠁫|󠁩󠁥󠁧|󠁩󠁥󠁤|󠁭󠁷󠁮|󠁧󠁮󠁬|󠁳󠁬󠁥|󠁩󠁥󠁣|󠁳󠁬󠁮|󠁩󠁳󠀰|󠁧󠁮󠁭|󠁣󠁶󠁳|󠁧󠁮󠁮|󠁳󠁬󠁳|󠁴󠁧󠁣|󠁥󠁳󠁢|󠁭󠁷󠁳|󠁩󠁥󠁵|󠁥󠁳󠁶|󠁧󠁭󠁢|󠁧󠁭󠁵|󠁧󠁭󠁷|󠁧󠁮󠁢|󠁣󠁶󠁢|󠁦󠁪󠁣|󠁧󠁮󠁣|󠁩󠁥󠁭|󠁧󠁮󠁤|󠁦󠁪󠁥|󠁦󠁪󠁮|󠁦󠁪󠁲|󠁦󠁪󠁷|󠁧󠁮󠁦)󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?))|[🏻-🏿🦰-🦳]|(?:(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳](?!(?:[🏻-🏿]|️))︎?|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]︎)|[\#\*0-9]⃣))/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_well_formed.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_well_formed.rb new file mode 100644 index 000000000..13c0eff14 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_well_formed.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_WELL_FORMED = /(?:(?:(?:(?:[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸])‍)+(?:[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]))|(?:(?:(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿])[󠀰-󠀹󠁡-󠁺]{1,30}󠁿)|\p{RI}{2}|(?:[\#\*0-9]️⃣|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_well_formed_include_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_well_formed_include_text.rb new file mode 100644 index 000000000..55e2f9261 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated/regex_well_formed_include_text.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_WELL_FORMED_INCLUDE_TEXT = /(?:(?:(?:(?:[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸])‍)+(?:[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌚⌛⌨⏏⏩-⏳⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☝☠☢☣☦☪☮☯☸-☺♀♂♈-♓♟♠♣♥♦♨♻♾♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛎⛏⛑⛓⛔⛩⛪⛰-⛵⛷-⛺⛽✂✅✈-✍✏✒✔✖✝✡✨✳✴❄❇❌❎❓-❕❗❣❤➕-➗➡➰➿⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙🀄🃏🅰🅱🅾🅿🆎🆑-🆚🇦-🇿🈁🈂🈚🈯🈲-🈺🉐🉑🌀-🌡🌤-🎓🎖🎗🎙-🎛🎞-🏰🏳-🏵🏷-📽📿-🔽🕉-🕎🕐-🕧🕯🕰🕳-🕺🖇🖊-🖍🖐🖕🖖🖤🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺-🙏🚀-🛅🛋-🛒🛕-🛘🛜-🛥🛩🛫🛬🛰🛳-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]))|(?:(?:(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?)|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿])[󠀰-󠀹󠁡-󠁺]{1,30}󠁿)|\p{RI}{2}|(?:[\#\*0-9]️⃣|[☝⛹✊-✍🎅🏂-🏄🏇🏊-🏌👂👃👆-👐👦-👸👼💁-💃💅-💇💏💑💪🕴🕵🕺🖐🖕🖖🙅-🙇🙋-🙏🚣🚴-🚶🛀🛌🤌🤏🤘-🤟🤦🤰-🤹🤼-🤾🥷🦵🦶🦸🦹🦻🧍-🧏🧑-🧝🫃-🫅🫰-🫸][🏻-🏿]|(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳]️|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸](?!︎)️?))|[🏻-🏿🦰-🦳]|(?:(?![\#\*0-9‍⃣️🇦-🇿🏻-🏿🦰-🦳󠀠-󠁿])(?:[\#\*0-9©®‼⁉™ℹ↔-↙↩↪⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻◼☀-☄☎☑☘☝☠☢☣☦☪☮☯☸-☺♀♂♟♠♣♥♦♨♻♾⚒⚔-⚗⚙⚛⚜⚠⚧⚰⚱⛈⛏⛑⛓⛩⛰⛱⛴⛷-⛹✂✈✉✌✍✏✒✔✖✝✡✳✴❄❇❣❤➡⤴⤵⬅-⬇〰〽㊗㊙🅰🅱🅾🅿🈂🈷🌡🌤-🌬🌶🍽🎖🎗🎙-🎛🎞🎟🏋-🏎🏔-🏟🏳🏵🏷🐿👁📽🕉🕊🕯🕰🕳-🕹🖇🖊-🖍🖐🖥🖨🖱🖲🖼🗂-🗄🗑-🗓🗜-🗞🗡🗣🗨🗯🗳🗺🛋🛍-🛏🛠-🛥🛩🛰🛳](?!(?:[🏻-🏿]|️))︎?|[⌚⌛⏩-⏬⏰⏳◽◾☔☕♈-♓♿⚓⚡⚪⚫⚽⚾⛄⛅⛎⛔⛪⛲⛳⛵⛺⛽✅✊✋✨❌❎❓-❕❗➕-➗➰➿⬛⬜⭐⭕🀄🃏🆎🆑-🆚🇦-🇿🈁🈚🈯🈲-🈶🈸-🈺🉐🉑🌀-🌠🌭-🌵🌷-🍼🍾-🎓🎠-🏊🏏-🏓🏠-🏰🏴🏸-🐾👀👂-📼📿-🔽🕋-🕎🕐-🕧🕺🖕🖖🖤🗻-🙏🚀-🛅🛌🛐-🛒🛕-🛘🛜-🛟🛫🛬🛴-🛼🟠-🟫🟰🤌-🤺🤼-🥅🥇-🧿🩰-🩼🪀-🪊🪎-🫆🫈🫍-🫜🫟-🫪🫯-🫸]︎)|[\#\*0-9]⃣))/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex.rb new file mode 100644 index 000000000..dee79bb39 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX = /(?:(?:👩🏾‍❤️‍💋‍👩🏻|👩🏾‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👨🏾|👨🏽‍❤️‍💋‍👨🏻|👨🏽‍❤️‍💋‍👨🏼|👨🏽‍❤️‍💋‍👨🏽|👨🏽‍❤️‍💋‍👨🏾|👨🏽‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👨🏽|👩🏾‍❤️‍💋‍👨🏼|👩🏾‍❤️‍💋‍👨🏻|👨🏾‍❤️‍💋‍👨🏻|👨🏾‍❤️‍💋‍👨🏼|👨🏾‍❤️‍💋‍👨🏽|👨🏾‍❤️‍💋‍👨🏾|👨🏾‍❤️‍💋‍👨🏿|👩🏽‍❤️‍💋‍👩🏿|👩🏿‍❤️‍💋‍👩🏽|👩🏿‍❤️‍💋‍👩🏼|👩🏿‍❤️‍💋‍👩🏻|👩🏿‍❤️‍💋‍👨🏿|👩🏿‍❤️‍💋‍👨🏾|👩🏿‍❤️‍💋‍👨🏽|👩🏿‍❤️‍💋‍👨🏼|👩🏿‍❤️‍💋‍👨🏻|👨🏼‍❤️‍💋‍👨🏻|👨🏼‍❤️‍💋‍👨🏼|👨🏼‍❤️‍💋‍👨🏽|👨🏼‍❤️‍💋‍👨🏾|👨🏼‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👩🏿|👩🏾‍❤️‍💋‍👩🏾|👩🏾‍❤️‍💋‍👩🏽|👩🏾‍❤️‍💋‍👩🏼|👩🏼‍❤️‍💋‍👩🏼|👩🏼‍❤️‍💋‍👩🏻|👩🏼‍❤️‍💋‍👨🏿|👩🏼‍❤️‍💋‍👨🏾|👩🏼‍❤️‍💋‍👨🏽|👩🏼‍❤️‍💋‍👨🏼|👩🏼‍❤️‍💋‍👨🏻|👩🏻‍❤️‍💋‍👨🏻|👩🏻‍❤️‍💋‍👨🏼|👩🏻‍❤️‍💋‍👨🏽|👩🏻‍❤️‍💋‍👨🏾|👩🏻‍❤️‍💋‍👨🏿|👩🏻‍❤️‍💋‍👩🏻|👩🏻‍❤️‍💋‍👩🏼|👩🏻‍❤️‍💋‍👩🏽|👩🏻‍❤️‍💋‍👩🏾|👩🏻‍❤️‍💋‍👩🏿|👩🏽‍❤️‍💋‍👩🏾|👩🏽‍❤️‍💋‍👩🏽|👩🏽‍❤️‍💋‍👩🏼|👩🏽‍❤️‍💋‍👩🏻|👩🏽‍❤️‍💋‍👨🏿|👩🏽‍❤️‍💋‍👨🏾|👩🏽‍❤️‍💋‍👨🏽|👩🏽‍❤️‍💋‍👨🏼|👩🏽‍❤️‍💋‍👨🏻|👨🏿‍❤️‍💋‍👨🏻|👨🏿‍❤️‍💋‍👨🏼|👨🏿‍❤️‍💋‍👨🏽|👨🏿‍❤️‍💋‍👨🏾|👨🏿‍❤️‍💋‍👨🏿|👩🏼‍❤️‍💋‍👩🏿|👩🏼‍❤️‍💋‍👩🏾|👨🏻‍❤️‍💋‍👨🏼|👨🏻‍❤️‍💋‍👨🏻|🧑🏼‍❤️‍💋‍🧑🏻|🧑🏼‍❤️‍💋‍🧑🏽|🧑🏼‍❤️‍💋‍🧑🏾|🧑🏼‍❤️‍💋‍🧑🏿|🧑🏽‍❤️‍💋‍🧑🏻|🧑🏽‍❤️‍💋‍🧑🏼|🧑🏽‍❤️‍💋‍🧑🏾|🧑🏽‍❤️‍💋‍🧑🏿|🧑🏾‍❤️‍💋‍🧑🏻|🧑🏾‍❤️‍💋‍🧑🏼|🧑🏾‍❤️‍💋‍🧑🏽|🧑🏾‍❤️‍💋‍🧑🏿|🧑🏿‍❤️‍💋‍🧑🏾|🧑🏿‍❤️‍💋‍🧑🏽|🧑🏿‍❤️‍💋‍🧑🏻|🧑🏿‍❤️‍💋‍🧑🏼|👩🏼‍❤️‍💋‍👩🏽|👩🏿‍❤️‍💋‍👩🏾|👩🏿‍❤️‍💋‍👩🏿|🧑🏻‍❤️‍💋‍🧑🏼|🧑🏻‍❤️‍💋‍🧑🏽|🧑🏻‍❤️‍💋‍🧑🏾|🧑🏻‍❤️‍💋‍🧑🏿|👨🏻‍❤️‍💋‍👨🏿|👨🏻‍❤️‍💋‍👨🏾|👨🏻‍❤️‍💋‍👨🏽|👩🏽‍❤️‍👩🏻|👩🏽‍❤️‍👨🏿|👩🏽‍❤️‍👨🏾|👩🏽‍❤️‍👨🏽|👩🏽‍❤️‍👨🏼|👩🏽‍❤️‍👨🏻|🧑🏿‍❤️‍🧑🏾|🚶🏿‍♀️‍➡️|🚶🏾‍♂️‍➡️|🚶🏾‍♀️‍➡️|🏃🏿‍♂️‍➡️|👩🏽‍❤️‍👩🏼|👩🏽‍❤️‍👩🏽|👩🏽‍❤️‍👩🏾|🚶🏿‍♂️‍➡️|🧑🏿‍❤️‍🧑🏽|🧑🏿‍❤️‍🧑🏼|🧑🏿‍❤️‍🧑🏻|🏃🏻‍♂️‍➡️|🏃🏻‍♀️‍➡️|👩🏼‍❤️‍👨🏻|👩🏼‍❤️‍👨🏼|👩🏼‍❤️‍👨🏽|🏃🏼‍♀️‍➡️|🏃🏼‍♂️‍➡️|👩🏼‍❤️‍👨🏾|🏃🏽‍♀️‍➡️|🏃🏽‍♂️‍➡️|🏃🏾‍♀️‍➡️|👩🏼‍❤️‍👨🏿|👩🏼‍❤️‍👩🏻|👩🏼‍❤️‍👩🏼|👩🏼‍❤️‍👩🏽|🏃🏾‍♂️‍➡️|🏃🏿‍♀️‍➡️|👩🏼‍❤️‍👩🏾|👩🏼‍❤️‍👩🏿|🚶🏻‍♀️‍➡️|🚶🏻‍♂️‍➡️|🚶🏼‍♀️‍➡️|🚶🏼‍♂️‍➡️|🚶🏽‍♀️‍➡️|🚶🏽‍♂️‍➡️|👩🏽‍❤️‍👩🏿|👩🏾‍❤️‍👩🏻|👩🏾‍❤️‍👩🏼|👩🏾‍❤️‍👩🏽|👩🏾‍❤️‍👩🏾|👩🏾‍❤️‍👩🏿|🧑🏼‍❤️‍🧑🏿|🧑🏼‍❤️‍🧑🏾|🧑🏼‍❤️‍🧑🏽|🧑🏼‍❤️‍🧑🏻|🧑🏻‍❤️‍🧑🏿|👩🏿‍❤️‍👨🏻|👩🏿‍❤️‍👨🏼|👩🏿‍❤️‍👨🏽|👩🏿‍❤️‍👨🏾|👩🏿‍❤️‍👨🏿|👩🏿‍❤️‍👩🏻|👩🏿‍❤️‍👩🏼|👩🏿‍❤️‍👩🏽|👩🏿‍❤️‍👩🏾|👩🏿‍❤️‍👩🏿|🧑🏻‍❤️‍🧑🏾|🧑🏻‍❤️‍🧑🏽|🧑🏻‍❤️‍🧑🏼|🧑🏾‍❤️‍🧑🏿|🧑🏾‍❤️‍🧑🏽|🧑🏾‍❤️‍🧑🏼|🧑🏾‍❤️‍🧑🏻|🧎🏿‍♂️‍➡️|🧎🏿‍♀️‍➡️|🧎🏾‍♂️‍➡️|🧎🏾‍♀️‍➡️|🧎🏽‍♂️‍➡️|🧎🏽‍♀️‍➡️|🧑🏽‍❤️‍🧑🏿|🧑🏽‍❤️‍🧑🏾|🧑🏽‍❤️‍🧑🏼|🧑🏽‍❤️‍🧑🏻|🧎🏼‍♂️‍➡️|🧎🏼‍♀️‍➡️|🧎🏻‍♂️‍➡️|🧎🏻‍♀️‍➡️|👩🏾‍❤️‍👨🏻|👩🏾‍❤️‍👨🏼|👩🏾‍❤️‍👨🏽|👩🏾‍❤️‍👨🏾|👩🏾‍❤️‍👨🏿|👩🏻‍❤️‍👩🏻|👩🏻‍❤️‍👨🏿|👩🏻‍❤️‍👨🏾|👩🏻‍❤️‍👨🏽|👩🏻‍❤️‍👨🏼|👩🏻‍❤️‍👨🏻|👨🏽‍❤️‍👨🏼|👨🏻‍❤️‍👨🏾|👨🏼‍❤️‍👨🏻|👩‍❤️‍💋‍👩|👩‍❤️‍💋‍👨|👨🏼‍❤️‍👨🏼|👨🏼‍❤️‍👨🏽|👨🏼‍❤️‍👨🏾|👨🏼‍❤️‍👨🏿|👨🏻‍❤️‍👨🏽|👨🏻‍❤️‍👨🏼|👨🏻‍❤️‍👨🏻|👨🏽‍❤️‍👨🏽|👨‍❤️‍💋‍👨|👨🏾‍❤️‍👨🏼|👨🏾‍❤️‍👨🏽|👨🏿‍❤️‍👨🏿|👨🏾‍❤️‍👨🏾|👨🏿‍❤️‍👨🏾|👨🏾‍❤️‍👨🏿|👨🏿‍❤️‍👨🏽|👨🏾‍❤️‍👨🏻|👨🏿‍❤️‍👨🏼|👨🏻‍❤️‍👨🏿|👨🏿‍❤️‍👨🏻|👨🏽‍❤️‍👨🏿|👨🏽‍❤️‍👨🏾|👨🏽‍❤️‍👨🏻|👩🏻‍❤️‍👩🏿|👩🏻‍❤️‍👩🏾|👩🏻‍❤️‍👩🏽|👩🏻‍❤️‍👩🏼|🧑🏼‍🐰‍🧑🏿|👨‍👨‍👧‍👦|🧑🏼‍🐰‍🧑🏾|🧑🏼‍🐰‍🧑🏽|🧑🏼‍🐰‍🧑🏻|🧑🏽‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏻|🧑🏼‍🫯‍🧑🏽|🧑🏼‍🫯‍🧑🏾|🧑🏾‍🤝‍🧑🏻|🧑🏾‍🤝‍🧑🏼|🧑🏾‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏾‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏿|🧑🏽‍🐰‍🧑🏻|🧑🏽‍🐰‍🧑🏼|🧑🏽‍🐰‍🧑🏾|🧑🏽‍🐰‍🧑🏿|👨‍👨‍👦‍👦|🧑🏽‍🫯‍🧑🏻|👨‍👩‍👦‍👦|👨‍👩‍👧‍👦|👨‍👩‍👧‍👧|🧑🏻‍🤝‍🧑🏿|🧑🏻‍🤝‍🧑🏾|🧑🏻‍🤝‍🧑🏽|🧑🏻‍🤝‍🧑🏼|🧑🏻‍🤝‍🧑🏻|👨🏻‍🐰‍👨🏼|👨🏻‍🐰‍👨🏽|👨🏻‍🐰‍👨🏾|👨🏻‍🐰‍👨🏿|👨🏻‍🤝‍👨🏼|👨🏻‍🤝‍👨🏽|👨🏻‍🤝‍👨🏾|🧑‍🧑‍🧒‍🧒|👩🏿‍🫯‍👩🏾|👩🏿‍🫯‍👩🏽|🧑🏽‍🤝‍🧑🏾|🧑🏽‍🤝‍🧑🏽|🧑🏽‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏻|🧑🏻‍🫯‍🧑🏿|🧑🏻‍🫯‍🧑🏾|🧑🏻‍🫯‍🧑🏽|🧑🏻‍🫯‍🧑🏼|👨‍👨‍👧‍👧|🧑🏻‍🐰‍🧑🏿|🧑🏻‍🐰‍🧑🏾|🧑🏻‍🐰‍🧑🏽|🧑🏼‍🤝‍🧑🏿|🧑🏼‍🤝‍🧑🏾|🧑🏼‍🤝‍🧑🏽|🧑🏼‍🤝‍🧑🏼|🧑🏼‍🤝‍🧑🏻|🧑🏻‍🐰‍🧑🏼|🧑🏽‍🦼‍➡️|🧑🏽‍🦯‍➡️|🧑🏼‍🦽‍➡️|🧑🏼‍🦼‍➡️|🧑🏼‍🦯‍➡️|🧑🏻‍🦽‍➡️|🧑🏻‍🦼‍➡️|🧑🏻‍🦯‍➡️|👩🏿‍🦽‍➡️|👩🏿‍🦼‍➡️|👩🏿‍🦯‍➡️|👩🏾‍🦽‍➡️|👩🏾‍🦼‍➡️|👩🏾‍🦯‍➡️|👩🏽‍🦽‍➡️|👩🏽‍🦼‍➡️|👩🏽‍🦯‍➡️|👩🏼‍🦽‍➡️|🧑🏿‍🫯‍🧑🏾|🧑🏿‍🫯‍🧑🏽|🧑🏿‍🫯‍🧑🏼|🧑🏿‍🫯‍🧑🏻|🧑🏿‍🐰‍🧑🏾|🧑🏿‍🐰‍🧑🏽|🧑🏿‍🐰‍🧑🏼|🧑🏿‍🐰‍🧑🏻|🧑🏾‍🫯‍🧑🏿|🏃‍♂️‍➡️|🏃‍♀️‍➡️|🧑🏿‍🦽‍➡️|🧑🏿‍🦼‍➡️|🧑🏿‍🦯‍➡️|🧑🏾‍🦽‍➡️|🧑🏾‍🦼‍➡️|🧑🏾‍🦯‍➡️|🧑🏽‍🦽‍➡️|👩🏼‍🦼‍➡️|👨🏻‍🦼‍➡️|🚶‍♂️‍➡️|👨🏻‍🦯‍➡️|🧑🏾‍🫯‍🧑🏽|🧑🏾‍🫯‍🧑🏼|🧑🏾‍🫯‍🧑🏻|🧑🏿‍🤝‍🧑🏿|🧑🏾‍🐰‍🧑🏿|🧑🏿‍🤝‍🧑🏾|🧑🏾‍🐰‍🧑🏽|🧑🏿‍🤝‍🧑🏽|🧑🏾‍🐰‍🧑🏼|🧑🏿‍🤝‍🧑🏼|🧑🏾‍🐰‍🧑🏻|🧑🏿‍🤝‍🧑🏻|🧑🏽‍🫯‍🧑🏿|🧑🏽‍🫯‍🧑🏾|🧑🏽‍🫯‍🧑🏼|👩🏼‍🦯‍➡️|👩🏻‍🦽‍➡️|👩🏻‍🦼‍➡️|👩🏻‍🦯‍➡️|👨🏿‍🦽‍➡️|👨🏿‍🦼‍➡️|👨🏿‍🦯‍➡️|👨🏾‍🦽‍➡️|👨🏾‍🦼‍➡️|👨🏾‍🦯‍➡️|👨🏽‍🦽‍➡️|👨🏽‍🦼‍➡️|👨🏽‍🦯‍➡️|👨🏼‍🦽‍➡️|👨🏼‍🦼‍➡️|👨🏼‍🦯‍➡️|👨🏻‍🦽‍➡️|🚶‍♀️‍➡️|👩🏿‍🫯‍👩🏼|👨🏾‍🫯‍👨🏻|👨🏾‍🫯‍👨🏼|👨🏾‍🫯‍👨🏽|👨🏾‍🫯‍👨🏿|👨🏿‍🐰‍👨🏻|👨🏿‍🐰‍👨🏼|👨🏿‍🐰‍👨🏽|👨🏿‍🐰‍👨🏾|👨🏿‍🤝‍👨🏻|👨🏿‍🤝‍👨🏼|👨🏿‍🤝‍👨🏽|👨🏿‍🤝‍👨🏾|👨🏿‍🫯‍👨🏻|👩🏼‍🫯‍👩🏿|👩🏼‍🫯‍👩🏾|👩🏼‍🫯‍👩🏽|👩🏼‍🫯‍👩🏻|👨🏾‍🐰‍👨🏻|👩🏽‍🤝‍👩🏻|👨🏾‍🐰‍👨🏼|👩🏽‍🤝‍👨🏿|👨🏾‍🐰‍👨🏽|👩🏽‍🤝‍👨🏾|👨🏾‍🐰‍👨🏿|👩🏽‍🤝‍👨🏼|👨🏾‍🤝‍👨🏻|👩🏽‍🤝‍👨🏻|👨🏾‍🤝‍👨🏼|👩🏽‍🐰‍👩🏿|👩🏽‍🐰‍👩🏾|👩🏽‍🐰‍👩🏼|👩🏽‍🐰‍👩🏻|👨🏾‍🤝‍👨🏽|👨🏾‍🤝‍👨🏿|👩‍👩‍👧‍👧|👩🏻‍🫯‍👩🏿|👩🏻‍🫯‍👩🏾|👩🏻‍🫯‍👩🏽|👩🏻‍🫯‍👩🏼|👩🏻‍🤝‍👩🏿|👩🏻‍🤝‍👩🏾|👩🏻‍🤝‍👩🏽|👩🏻‍🤝‍👩🏼|👩🏻‍🤝‍👨🏿|👩🏻‍🤝‍👨🏾|👩🏻‍🤝‍👨🏽|👩🏻‍🤝‍👨🏼|👩🏻‍🐰‍👩🏿|👩🏻‍🐰‍👩🏾|👩🏻‍🐰‍👩🏽|👩🏻‍🐰‍👩🏼|👩🏼‍🤝‍👩🏿|👩🏼‍🤝‍👩🏾|👩🏼‍🤝‍👩🏽|👩🏼‍🤝‍👩🏻|👩🏼‍🤝‍👨🏿|👩🏼‍🤝‍👨🏾|👩🏼‍🤝‍👨🏽|👩🏼‍🤝‍👨🏻|👩🏼‍🐰‍👩🏿|👩🏼‍🐰‍👩🏾|👩🏼‍🐰‍👩🏽|👩🏼‍🐰‍👩🏻|👨🏿‍🫯‍👨🏼|👨🏿‍🫯‍👨🏽|👨🏿‍🫯‍👨🏾|👩‍👩‍👦‍👦|👨🏼‍🐰‍👨🏻|👨🏼‍🐰‍👨🏽|👨🏼‍🐰‍👨🏾|👨🏼‍🐰‍👨🏿|👨🏼‍🤝‍👨🏻|👨🏼‍🤝‍👨🏽|👨🏼‍🤝‍👨🏾|👨🏼‍🤝‍👨🏿|👨🏼‍🫯‍👨🏻|👨🏼‍🫯‍👨🏽|👩🏾‍🫯‍👩🏿|👩🏾‍🫯‍👩🏽|👩🏾‍🫯‍👩🏼|👩🏾‍🫯‍👩🏻|👩🏾‍🤝‍👩🏿|👩🏾‍🤝‍👩🏽|👩🏾‍🤝‍👩🏼|👩🏾‍🤝‍👩🏻|👩🏿‍🫯‍👩🏻|👩🏿‍🤝‍👩🏾|👩🏿‍🤝‍👩🏽|👩🏿‍🤝‍👩🏼|👩🏿‍🤝‍👩🏻|👩🏿‍🤝‍👨🏾|👩🏿‍🤝‍👨🏽|👩🏿‍🤝‍👨🏼|👩🏿‍🤝‍👨🏻|👩🏿‍🐰‍👩🏾|👩🏿‍🐰‍👩🏽|👩🏿‍🐰‍👩🏼|👩🏿‍🐰‍👩🏻|👨🏻‍🤝‍👨🏿|👨🏻‍🫯‍👨🏼|👨🏻‍🫯‍👨🏽|👨🏻‍🫯‍👨🏾|👨🏻‍🫯‍👨🏿|👩🏾‍🤝‍👨🏿|👨🏽‍🐰‍👨🏿|👨🏽‍🤝‍👨🏻|👨🏽‍🤝‍👨🏼|👨🏽‍🤝‍👨🏾|👨🏽‍🤝‍👨🏿|👨🏽‍🫯‍👨🏻|👨🏽‍🫯‍👨🏼|👨🏽‍🫯‍👨🏾|👨🏽‍🫯‍👨🏿|👩🏽‍🫯‍👩🏿|🧎‍♀️‍➡️|👩🏽‍🫯‍👩🏾|🧎‍♂️‍➡️|👩🏽‍🫯‍👩🏼|👩🏽‍🫯‍👩🏻|👩🏽‍🤝‍👩🏿|👩🏽‍🤝‍👩🏾|👩🏽‍🤝‍👩🏼|👩🏾‍🤝‍👨🏽|👩🏾‍🤝‍👨🏼|👩🏾‍🤝‍👨🏻|👩🏾‍🐰‍👩🏿|👩🏾‍🐰‍👩🏽|👩🏾‍🐰‍👩🏼|👩🏾‍🐰‍👩🏻|👨🏼‍🫯‍👨🏾|👨🏼‍🫯‍👨🏿|👨🏽‍🐰‍👨🏻|👨🏽‍🐰‍👨🏼|👨🏽‍🐰‍👨🏾|👩‍👩‍👧‍👦|👨‍🦽‍➡️|🧑‍🦯‍➡️|👨‍🦼‍➡️|🧑‍🦼‍➡️|👨‍🦯‍➡️|🧑‍🦽‍➡️|👩‍❤️‍👩|👩‍❤️‍👨|👩‍🦯‍➡️|👨‍❤️‍👨|👩‍🦼‍➡️|👩‍🦽‍➡️|🧖🏾‍♀️|🧖🏽‍♂️|🧖🏽‍♀️|🧖🏼‍♂️|🧖🏼‍♀️|🧖🏻‍♂️|🧖🏻‍♀️|👩🏾‍✈️|👩🏾‍⚖️|👩🏾‍⚕️|🧔🏿‍♂️|🧔🏿‍♀️|🧔🏾‍♂️|🚴🏻‍♀️|🧔🏾‍♀️|🧔🏽‍♂️|🧔🏽‍♀️|🧔🏼‍♂️|🧔🏼‍♀️|🧔🏻‍♂️|🧔🏻‍♀️|🧘🏻‍♂️|🧘🏻‍♀️|🧗🏿‍♂️|🧗🏿‍♀️|🧗🏾‍♂️|🧗🏾‍♀️|🧗🏽‍♂️|🧗🏽‍♀️|👩🏿‍✈️|👩🏿‍⚖️|👩🏿‍⚕️|🚣🏾‍♂️|🧗🏼‍♂️|🚣🏿‍♀️|🧗🏼‍♀️|🚣🏿‍♂️|🧗🏻‍♂️|🧗🏻‍♀️|🧖🏿‍♂️|🧖🏿‍♀️|🧖🏾‍♂️|🧎🏽‍♀️|🧎🏼‍♂️|🧎🏼‍♀️|🧎🏻‍♂️|🧎🏻‍♀️|👩🏼‍✈️|👩🏼‍⚖️|👩🏼‍⚕️|🚴🏽‍♀️|🚴🏽‍♂️|🧍🏿‍♂️|🚴🏾‍♀️|🧍🏿‍♀️|🧍🏾‍♂️|🧍🏾‍♀️|🧍🏽‍♂️|🧍🏽‍♀️|🧍🏼‍♂️|🧍🏼‍♀️|🧍🏻‍♂️|🧍🏻‍♀️|🧏🏿‍♂️|🧏🏿‍♀️|🧏🏾‍♂️|🧏🏾‍♀️|🧏🏽‍♂️|🧏🏽‍♀️|👩🏽‍✈️|👩🏽‍⚖️|👩🏽‍⚕️|🚴🏻‍♂️|🧏🏼‍♂️|🚴🏼‍♀️|🧏🏼‍♀️|🚴🏼‍♂️|🧏🏻‍♂️|🧏🏻‍♀️|🧎🏿‍♂️|🧎🏿‍♀️|🧎🏾‍♂️|🧎🏾‍♀️|🧎🏽‍♂️|🧑🏼‍⚕️|👩‍👧‍👧|👩‍👩‍👦|🧜🏻‍♀️|👩‍👩‍👧|🚣🏻‍♀️|🧛🏿‍♂️|🧛🏿‍♀️|🧛🏾‍♂️|🧛🏾‍♀️|🧛🏽‍♂️|🧛🏽‍♀️|🧛🏼‍♂️|🧛🏼‍♀️|🧛🏻‍♂️|🧛🏻‍♀️|🧚🏿‍♂️|🧚🏿‍♀️|🧑🏻‍✈️|🧑🏻‍⚖️|🧑🏻‍⚕️|🙎🏾‍♂️|🧝🏽‍♀️|🙎🏿‍♀️|🧝🏼‍♂️|🙎🏿‍♂️|🧝🏼‍♀️|🧝🏻‍♂️|🧝🏻‍♀️|🧜🏿‍♂️|🧜🏿‍♀️|🧜🏾‍♂️|🧜🏾‍♀️|🧜🏽‍♂️|🧜🏽‍♀️|🧜🏼‍♂️|🧜🏼‍♀️|🧜🏻‍♂️|👩‍👦‍👦|👩‍👧‍👦|🧑🏼‍✈️|🧑🏼‍⚖️|🧎🏿‍➡️|🧎🏾‍➡️|🧎🏽‍➡️|🧎🏼‍➡️|🧎🏻‍➡️|🚶🏿‍➡️|🚶🏾‍➡️|🚶🏽‍➡️|🚶🏼‍➡️|🚶🏻‍➡️|🧘🏿‍♂️|🚣🏽‍♀️|🧘🏿‍♀️|🚣🏽‍♂️|🧘🏾‍♂️|🚣🏾‍♀️|🧘🏾‍♀️|🧘🏽‍♂️|🧘🏽‍♀️|🧘🏼‍♂️|🧘🏼‍♀️|🚣🏻‍♂️|🧚🏾‍♂️|🚣🏼‍♀️|🧚🏾‍♀️|🚣🏼‍♂️|🧚🏽‍♂️|🧚🏽‍♀️|🧚🏼‍♂️|🧚🏼‍♀️|🧚🏻‍♂️|🧚🏻‍♀️|🧙🏿‍♂️|🧙🏿‍♀️|🧙🏾‍♂️|🧙🏾‍♀️|🧙🏽‍♂️|🧙🏽‍♀️|🧙🏼‍♂️|🧙🏼‍♀️|🧙🏻‍♂️|🧙🏻‍♀️|👨🏼‍✈️|👨🏼‍⚖️|👨🏼‍⚕️|🤷🏼‍♀️|🤷🏻‍♂️|🤷🏻‍♀️|🚶🏻‍♀️|🤵🏿‍♂️|🤵🏿‍♀️|🤵🏾‍♂️|🤵🏾‍♀️|🤵🏽‍♂️|🤵🏽‍♀️|🤵🏼‍♂️|🤵🏼‍♀️|🤵🏻‍♂️|🤵🏻‍♀️|🤦🏿‍♂️|🤦🏿‍♀️|👨🏻‍✈️|👨🏻‍⚖️|👨🏽‍✈️|👨🏽‍⚖️|👨🏽‍⚕️|🚵🏾‍♂️|🤸🏾‍♂️|🚵🏿‍♀️|🤸🏾‍♀️|🚵🏿‍♂️|🤸🏽‍♂️|🤸🏽‍♀️|🤸🏼‍♂️|🤸🏼‍♀️|🤸🏻‍♂️|🤸🏻‍♀️|🤷🏿‍♂️|🤷🏿‍♀️|🤷🏾‍♂️|🤷🏾‍♀️|🤷🏽‍♂️|🤷🏽‍♀️|🤷🏼‍♂️|🫱🏻‍🫲🏿|🏃🏿‍➡️|🏃🏾‍➡️|🏃🏽‍➡️|🏃🏼‍➡️|🏃🏻‍➡️|🫱🏼‍🫲🏻|🫱🏿‍🫲🏾|🫱🏿‍🫲🏽|🫱🏿‍🫲🏼|🫱🏿‍🫲🏻|🫱🏾‍🫲🏿|🫱🏾‍🫲🏽|🫱🏾‍🫲🏼|🫱🏾‍🫲🏻|🫱🏽‍🫲🏿|🫱🏽‍🫲🏾|🫱🏽‍🫲🏼|🫱🏽‍🫲🏻|🫱🏼‍🫲🏿|🫱🏼‍🫲🏾|👨🏻‍⚕️|🚶🏻‍♂️|🤦🏾‍♂️|🚶🏼‍♀️|🤦🏾‍♀️|🚶🏼‍♂️|🤦🏽‍♂️|🤦🏽‍♀️|🤦🏼‍♂️|🤦🏼‍♀️|🤦🏻‍♂️|🤦🏻‍♀️|🚶🏿‍♂️|🚶🏿‍♀️|🚶🏾‍♂️|🚶🏾‍♀️|🚶🏽‍♂️|🚶🏽‍♀️|🫱🏻‍🫲🏼|🫱🏻‍🫲🏽|🫱🏻‍🫲🏾|🦸🏽‍♀️|🦸🏼‍♂️|🦸🏼‍♀️|🦸🏻‍♂️|🦸🏻‍♀️|🤾🏿‍♂️|🤾🏿‍♀️|🤾🏾‍♂️|🤾🏾‍♀️|🚵🏻‍♀️|🤾🏽‍♂️|🤾🏽‍♀️|🤾🏼‍♂️|🤾🏼‍♀️|🤾🏻‍♂️|🤾🏻‍♀️|🤽🏿‍♂️|🤽🏿‍♀️|🤽🏾‍♂️|🤽🏾‍♀️|🤽🏽‍♂️|🦹🏿‍♂️|🦹🏿‍♀️|🦹🏾‍♂️|🦹🏾‍♀️|👩🏻‍✈️|👩🏻‍⚖️|👩🏻‍⚕️|🚴🏾‍♂️|🦹🏽‍♂️|🚴🏿‍♀️|🦹🏽‍♀️|🚴🏿‍♂️|🦹🏼‍♂️|🦹🏼‍♀️|🦹🏻‍♂️|🦹🏻‍♀️|🦸🏿‍♂️|🦸🏿‍♀️|🦸🏾‍♂️|🦸🏾‍♀️|🦸🏽‍♂️|👨🏾‍✈️|👨🏾‍⚖️|👨🏾‍⚕️|🚵🏽‍♀️|🧑‍🤝‍🧑|🚵🏽‍♂️|🧑‍🧑‍🧒|🚵🏾‍♀️|🤹🏿‍♂️|🧑‍🧒‍🧒|🤹🏿‍♀️|🤹🏾‍♂️|🤹🏾‍♀️|🤹🏽‍♂️|🤹🏽‍♀️|🤹🏼‍♂️|🤹🏼‍♀️|🤹🏻‍♂️|🤹🏻‍♀️|🤸🏿‍♂️|🤸🏿‍♀️|🤽🏽‍♀️|🤽🏼‍♂️|👨🏿‍✈️|👨🏿‍⚖️|👨🏿‍⚕️|🚵🏻‍♂️|🤽🏼‍♀️|🚵🏼‍♀️|🤽🏻‍♂️|🚵🏼‍♂️|🤽🏻‍♀️|🤼🏿‍♂️|🤼🏿‍♀️|🤼🏾‍♂️|🤼🏾‍♀️|🤼🏽‍♂️|🤼🏽‍♀️|🤼🏼‍♂️|🤼🏼‍♀️|🤼🏻‍♂️|🤼🏻‍♀️|👷🏽‍♀️|👷🏼‍♂️|👷🏼‍♀️|👷🏻‍♂️|👷🏻‍♀️|👳🏿‍♂️|👳🏿‍♀️|👳🏾‍♂️|👳🏾‍♀️|👳🏽‍♂️|👳🏽‍♀️|👳🏼‍♂️|👳🏼‍♀️|👳🏻‍♂️|👳🏻‍♀️|🏳️‍⚧️|👱🏿‍♂️|👱🏿‍♀️|👱🏾‍♂️|👱🏾‍♀️|👱🏽‍♂️|💂🏽‍♀️|💂🏼‍♂️|💂🏼‍♀️|💂🏻‍♂️|💂🏻‍♀️|💁🏿‍♂️|💁🏿‍♀️|💁🏾‍♂️|💁🏾‍♀️|💁🏽‍♂️|💁🏽‍♀️|💁🏼‍♂️|💁🏼‍♀️|💁🏻‍♂️|💁🏻‍♀️|👁️‍🗨️|👷🏿‍♂️|👷🏿‍♀️|👷🏾‍♂️|👷🏾‍♀️|👷🏽‍♂️|👯🏼‍♂️|👯🏼‍♀️|👯🏻‍♂️|👯🏻‍♀️|👮🏿‍♂️|👮🏿‍♀️|👮🏾‍♂️|👮🏾‍♀️|👮🏽‍♂️|👮🏽‍♀️|👮🏼‍♂️|👮🏼‍♀️|👮🏻‍♂️|👮🏻‍♀️|🏌️‍♂️|🏌️‍♀️|🏌🏿‍♂️|🏌🏿‍♀️|🏌🏾‍♂️|🏌🏾‍♀️|🏌🏽‍♂️|👱🏽‍♀️|👱🏼‍♂️|👱🏼‍♀️|👱🏻‍♂️|👱🏻‍♀️|👰🏿‍♂️|👰🏿‍♀️|👰🏾‍♂️|👰🏾‍♀️|👰🏽‍♂️|👰🏽‍♀️|👰🏼‍♂️|👰🏼‍♀️|👰🏻‍♂️|👰🏻‍♀️|👯🏿‍♂️|👯🏿‍♀️|👯🏾‍♂️|👯🏾‍♀️|👯🏽‍♂️|👯🏽‍♀️|👨‍👧‍👦|🙆🏿‍♂️|🙆🏿‍♀️|🙆🏾‍♂️|🙆🏾‍♀️|🙆🏽‍♂️|🙆🏽‍♀️|🙆🏼‍♂️|🙆🏼‍♀️|🙆🏻‍♂️|🙆🏻‍♀️|👨‍👧‍👧|👨‍👨‍👦|🙅🏿‍♂️|🙅🏿‍♀️|🙅🏾‍♂️|🙅🏾‍♀️|🙅🏽‍♂️|🙅🏽‍♀️|🙅🏼‍♂️|🙅🏼‍♀️|🙋🏿‍♂️|🙋🏿‍♀️|🙋🏾‍♂️|🙋🏾‍♀️|🙋🏽‍♂️|🙋🏽‍♀️|🙋🏼‍♂️|🙋🏼‍♀️|🙋🏻‍♂️|🙋🏻‍♀️|🙇🏿‍♂️|🙇🏿‍♀️|🙇🏾‍♂️|🙇🏾‍♀️|🙇🏽‍♂️|🙇🏽‍♀️|🙇🏼‍♂️|🙇🏼‍♀️|🙇🏻‍♂️|🙇🏻‍♀️|👨‍👦‍👦|💇🏼‍♂️|💇🏼‍♀️|💇🏻‍♂️|💇🏻‍♀️|💆🏿‍♂️|💆🏿‍♀️|💆🏾‍♂️|💆🏾‍♀️|💆🏽‍♂️|💆🏽‍♀️|💆🏼‍♂️|💆🏼‍♀️|💆🏻‍♂️|💆🏻‍♀️|👨‍👩‍👦|👨‍👩‍👧|💂🏿‍♂️|💂🏿‍♀️|💂🏾‍♂️|💂🏾‍♀️|💂🏽‍♂️|🙅🏻‍♂️|🙅🏻‍♀️|👨‍👨‍👧|🕵️‍♂️|🕵️‍♀️|🕵🏿‍♂️|🕵🏿‍♀️|🕵🏾‍♂️|🕵🏾‍♀️|🕵🏽‍♂️|🕵🏽‍♀️|🕵🏼‍♂️|🕵🏼‍♀️|🕵🏻‍♂️|🕵🏻‍♀️|💇🏿‍♂️|💇🏿‍♀️|💇🏾‍♂️|💇🏾‍♀️|💇🏽‍♂️|💇🏽‍♀️|🏌🏽‍♀️|⛹🏾‍♀️|⛹🏾‍♂️|⛹🏿‍♀️|⛹🏿‍♂️|⛹️‍♀️|⛹️‍♂️|🙍🏿‍♂️|🙍🏿‍♀️|🏃🏻‍♀️|🙍🏾‍♂️|🏃🏻‍♂️|🙍🏾‍♀️|🏃🏼‍♀️|🙍🏽‍♂️|🏃🏼‍♂️|🙍🏽‍♀️|🏃🏽‍♀️|🙍🏼‍♂️|🏃🏽‍♂️|🙍🏼‍♀️|🏃🏾‍♀️|🙍🏻‍♂️|🏃🏾‍♂️|🙍🏻‍♀️|🏃🏿‍♀️|🏃🏿‍♂️|🏄🏻‍♀️|🏄🏻‍♂️|🫱🏼‍🫲🏽|🧑🏽‍⚕️|🧑🏽‍⚖️|🧑🏽‍✈️|🧝🏽‍♂️|🧝🏾‍♀️|🧝🏾‍♂️|🧝🏿‍♀️|🧝🏿‍♂️|🙎🏾‍♀️|🙎🏽‍♂️|🙎🏽‍♀️|🧑🏾‍⚕️|🧑🏾‍⚖️|🧑🏾‍✈️|🙎🏼‍♂️|🙎🏼‍♀️|🙎🏻‍♂️|🧑🏿‍⚕️|🧑🏿‍⚖️|🧑🏿‍✈️|🙎🏻‍♀️|⛹🏻‍♀️|⛹🏻‍♂️|⛹🏼‍♀️|⛹🏼‍♂️|⛹🏽‍♀️|⛹🏽‍♂️|🏊🏻‍♀️|🏊🏻‍♂️|🏊🏼‍♀️|🏊🏼‍♂️|🏊🏽‍♀️|🏊🏽‍♂️|🏊🏾‍♀️|🏊🏾‍♂️|🏊🏿‍♀️|🏊🏿‍♂️|🏋🏻‍♀️|🏋🏻‍♂️|🏋🏼‍♀️|🏋🏼‍♂️|🏋🏽‍♀️|🏋🏽‍♂️|🏋🏾‍♀️|🏋🏾‍♂️|🏋🏿‍♀️|🏋🏿‍♂️|🏋️‍♀️|🏋️‍♂️|🏌🏻‍♀️|🏌🏻‍♂️|🏌🏼‍♀️|🏌🏼‍♂️|🏄🏿‍♀️|🏄🏾‍♂️|🏄🏾‍♀️|🏄🏽‍♂️|🏄🏽‍♀️|🏄🏿‍♂️|🏄🏼‍♂️|🏄🏼‍♀️|🤾‍♂️|👨🏽‍🦱|👨🏽‍🦲|👨🏽‍🦳|🧜‍♀️|👨🏾‍🦰|👨🏾‍🦱|👨🏾‍🦲|👨🏾‍🦳|👨🏿‍🦰|👨🏿‍🦱|🧜‍♂️|🤦‍♂️|🤷‍♀️|👩🏼‍🦲|🧑🏽‍🦱|👩🏼‍🦱|🤾‍♀️|👩🏼‍🦰|👩🏻‍🦳|👩🏻‍🦲|👩🏻‍🦱|👩🏻‍🦰|👨🏿‍🦳|🤵‍♂️|🤵‍♀️|🧑🏽‍🩰|👨🏿‍🦲|🧛‍♀️|🧛‍♂️|🧖‍♂️|🧎‍♂️|🧖‍♀️|🧑🏾‍🦰|🧑🏽‍🦳|🧑🏽‍🦲|🧝‍♂️|🧝‍♀️|🧑🏿‍🩰|🧑🏾‍🩰|🧎‍♀️|🧞‍♀️|🧞‍♂️|🧟‍♀️|🧟‍♂️|👨🏻‍🦰|👨🏻‍🦱|👨🏻‍🦲|👨🏻‍🦳|👨🏼‍🦰|👨🏼‍🦱|👨🏼‍🦲|🧏‍♀️|👨🏼‍🦳|🧑🏾‍🦳|👨🏽‍🦰|🧑🏿‍🦰|🧏‍♂️|❤️‍🩹|🤦‍♀️|🧑🏼‍🦰|🧑🏼‍🦱|🤹‍♀️|🤹‍♂️|🧑🏼‍🦲|🧍‍♀️|🧑🏿‍🦱|🧑🏿‍🦲|🧗‍♀️|🧗‍♂️|🙂‍↕️|🙂‍↔️|🏴‍☠️|🧔‍♀️|🧑🏼‍🦳|🧘‍♂️|🧘‍♀️|🧔‍♂️|🤼‍♀️|🤼‍♂️|😶‍🌫️|🧑🏽‍🦰|🐻‍❄️|🧑🏿‍🦳|⛓️‍💥|🦹‍♂️|🦹‍♀️|🧑🏾‍🦱|🧑🏾‍🦲|🤽‍♀️|🤽‍♂️|🏳️‍🌈|🤷‍♂️|🦸‍♀️|🦸‍♂️|❤️‍🔥|👩🏼‍🦳|🧚‍♂️|🧚‍♀️|👩🏽‍🦰|👩🏽‍🦱|👩🏽‍🦲|👩🏽‍🦳|👩🏾‍🦰|👩🏾‍🦱|🧑🏼‍🩰|🤸‍♀️|🤸‍♂️|🧑🏻‍🩰|👩🏾‍🦲|👩🏾‍🦳|👩🏿‍🦰|👩🏿‍🦱|🧙‍♂️|👩🏿‍🦲|👩🏿‍🦳|🧑🏻‍🦰|🧑🏻‍🦱|🧑🏻‍🦲|🧙‍♀️|🧍‍♂️|🧑🏻‍🦳|🚣‍♀️|🧑🏻‍🦽|🚣‍♂️|🧑🏻‍🦼|🧑🏻‍🦯|🧑🏻‍🚒|🧑🏻‍🚀|🧑🏻‍🔬|🧑🏻‍🔧|🧑🏻‍💼|🧑🏻‍💻|🧑🏻‍🏭|🧑🏻‍🏫|🧑🏻‍🎨|🧑🏻‍🎤|🧑🏻‍🎓|🧑🏻‍🎄|🧑🏻‍🍼|🧑🏻‍🍳|🧑🏻‍🌾|🧑‍✈️|🧑‍⚖️|🧑🏽‍🎄|🧑🏽‍🍼|🧑🏽‍🍳|🧑🏽‍🌾|🧑🏼‍🦽|🧑🏼‍🦼|🧑🏼‍🦯|🧑🏼‍🚒|🧑🏼‍🚀|🧑🏼‍🔬|🧑🏼‍🔧|🧑🏼‍💼|🧑🏼‍💻|🧑🏼‍🏭|🧑🏼‍🏫|🧑🏼‍🎨|🧑🏼‍🎤|🧑🏼‍🎓|🧑🏼‍🎄|🧑🏼‍🍼|🧑🏼‍🍳|🧑🏼‍🌾|👩🏾‍🦯|👩🏾‍🚒|👩🏾‍🚀|👩🏾‍🔬|👩🏾‍🔧|👩🏾‍💼|👩🏾‍💻|👩🏾‍🏭|👩🏾‍🏫|👩🏾‍🎨|👩🏾‍🎤|👩🏾‍🎓|👩🏾‍🍼|👩🏾‍🍳|👩🏾‍🌾|🚴‍♀️|👩🏽‍🦽|🚴‍♂️|👩🏽‍🦼|👩🏽‍🦯|👩🏽‍🚒|👩🏽‍🚀|🧑‍⚕️|🧎‍➡️|🚶‍➡️|👩🏿‍🦽|👩🏿‍🦼|👩🏿‍🦯|👩🏿‍🚒|👩🏿‍🚀|👩🏿‍🔬|👩🏿‍🔧|👩🏿‍💼|👩🏿‍💻|👩🏿‍🏭|👩🏿‍🏫|👩🏿‍🎨|👩🏿‍🎤|👩🏿‍🎓|👩🏿‍🍼|👩🏿‍🍳|👩🏿‍🌾|👩🏾‍🦽|👩🏾‍🦼|👰‍♂️|👰‍♀️|👯‍♂️|👯‍♀️|👮‍♂️|👮‍♀️|🏊‍♂️|🏊‍♀️|🏄‍♂️|🏄‍♀️|🙍‍♀️|🙍‍♂️|🏃‍♂️|🏃‍♀️|🙎‍♀️|🧑🏿‍🦽|🙎‍♂️|🧑🏿‍🦼|🧑🏿‍🦯|🧑🏿‍🚒|🧑🏿‍🚀|🧑🏿‍🔬|🙋‍♂️|🙋‍♀️|🙇‍♂️|🙇‍♀️|🙆‍♂️|🙆‍♀️|🙅‍♂️|🙅‍♀️|💇‍♂️|💇‍♀️|💆‍♂️|💆‍♀️|💂‍♂️|💂‍♀️|💁‍♂️|💁‍♀️|👷‍♂️|👷‍♀️|👳‍♂️|👳‍♀️|👱‍♂️|👱‍♀️|🧑🏾‍🏫|🧑🏾‍🎨|🧑🏾‍🎤|🧑🏾‍🎓|🧑🏾‍🎄|🧑🏾‍🍼|🧑🏾‍🍳|🧑🏾‍🌾|🧑🏽‍🦽|🧑🏽‍🦼|🧑🏽‍🦯|🧑🏽‍🚒|🧑🏽‍🚀|🧑🏽‍🔬|🧑🏽‍🔧|🧑🏽‍💼|🧑🏽‍💻|🧑🏽‍🏭|🧑🏽‍🏫|🧑🏽‍🎨|🧑🏽‍🎤|🧑🏽‍🎓|🧑🏿‍🔧|🧑🏿‍💼|🧑🏿‍💻|🧑🏿‍🏭|🧑🏿‍🏫|🧑🏿‍🎨|🧑🏿‍🎤|🧑🏿‍🎓|🧑🏿‍🎄|🧑🏿‍🍼|🧑🏿‍🍳|🧑🏿‍🌾|🧑🏾‍🦽|🧑🏾‍🦼|🧑🏾‍🦯|🧑🏾‍🚒|🧑🏾‍🚀|🧑🏾‍🔬|🧑🏾‍🔧|🧑🏾‍💼|🧑🏾‍💻|🧑🏾‍🏭|👨🏾‍🔧|👨🏾‍💼|👨🏾‍💻|👨🏾‍🏭|👨🏾‍🏫|👨🏾‍🎨|👨🏾‍🎤|👨🏾‍🎓|👨🏾‍🍼|👨🏾‍🍳|👨🏾‍🌾|👨🏽‍🦽|👨🏽‍🦼|👨🏽‍🦯|👨🏽‍🚒|👨🏽‍🚀|👨🏽‍🔬|👨🏽‍🔧|👨🏽‍💼|👨🏽‍💻|👨🏽‍🏭|👨🏽‍🏫|👨🏿‍🦼|👨🏿‍🦯|👨🏿‍🚒|👨🏿‍🚀|👨🏿‍🔬|👨🏿‍🔧|👨🏿‍💼|👨🏿‍💻|👨🏿‍🏭|👨🏿‍🏫|👨🏿‍🎨|👨🏿‍🎤|👨🏿‍🎓|👨🏿‍🍼|👨🏿‍🍳|👨🏿‍🌾|👨🏾‍🦽|👨🏾‍🦼|👨🏾‍🦯|👨🏾‍🚒|👨🏾‍🚀|👨🏾‍🔬|👨🏽‍🎨|🚶‍♀️|👨🏻‍🦽|🚶‍♂️|👨🏻‍🦼|👨🏻‍🦯|👨🏻‍🚒|👨🏻‍🚀|👨🏻‍🔬|👨🏻‍🔧|👨🏻‍💼|👨🏻‍💻|👨🏻‍🏭|👨🏻‍🏫|👨🏻‍🎨|👨🏻‍🎤|👨🏻‍🎓|👨🏻‍🍼|👨🏻‍🍳|👨🏻‍🌾|👨‍✈️|👨‍⚖️|👨‍⚕️|👨🏽‍🎤|👨🏽‍🎓|👨🏽‍🍼|👨🏽‍🍳|👨🏽‍🌾|👨🏼‍🦽|👨🏼‍🦼|👨🏼‍🦯|👨🏼‍🚒|👨🏼‍🚀|👨🏼‍🔬|👨🏼‍🔧|👨🏼‍💼|👨🏼‍💻|👨🏼‍🏭|👨🏼‍🏫|👨🏼‍🎨|👨🏼‍🎤|👨🏼‍🎓|👨🏼‍🍼|👨🏼‍🍳|👨🏼‍🌾|👩🏼‍🎨|👩🏼‍🎤|👩🏼‍🎓|👩🏼‍🍼|👩🏼‍🍳|👩🏼‍🌾|👩🏻‍🦽|👩🏻‍🦼|👩🏻‍🦯|👩🏻‍🚒|👩🏻‍🚀|👩🏻‍🔬|👩🏻‍🔧|👩🏻‍💼|👩🏻‍💻|👩🏻‍🏭|👩🏻‍🏫|👩🏻‍🎨|👩🏻‍🎤|👩🏻‍🎓|👩🏻‍🍼|👩🏻‍🍳|👩🏻‍🌾|👩🏽‍🔬|👩🏽‍🔧|👩🏽‍💼|👩🏽‍💻|👩🏽‍🏭|👩🏽‍🏫|👩🏽‍🎨|👩🏽‍🎤|👩🏽‍🎓|👩🏽‍🍼|👩🏽‍🍳|👩🏽‍🌾|👩🏼‍🦽|👩🏼‍🦼|👩🏼‍🦯|👩🏼‍🚒|👩🏼‍🚀|👩🏼‍🔬|👩🏼‍🔧|👩🏼‍💼|👩🏼‍💻|👩🏼‍🏭|👩🏼‍🏫|👨🏿‍🦽|🚵‍♀️|👩‍⚕️|👩‍⚖️|👩‍✈️|🚵‍♂️|🏃‍➡️|🐦‍🔥|🐦‍⬛|🐕‍🦺|🐈‍⬛|👨‍🚒|👨‍🦯|👨‍🦼|🍋‍🟩|🍄‍🟫|👨‍🦽|👩‍🎨|👩‍🎤|👩‍🎓|👩‍🌾|👩‍🍳|👩‍👦|👨‍👦|👨‍👧|👩‍👧|👨‍🌾|👨‍🍳|👨‍🍼|👨‍🎓|👨‍🎤|👨‍🎨|👨‍🏫|🧑‍🩰|👨‍🏭|👨‍💻|👨‍💼|👨‍🔧|😵‍💫|😮‍💨|👨‍🔬|👨‍🚀|🧑‍🦯|🧑‍🚒|🧑‍🚀|🧑‍🔬|🧑‍🔧|🧑‍💼|🧑‍💻|🧑‍🏭|🧑‍🏫|🧑‍🧒|🧑‍🎨|🧑‍🎤|🧑‍🎓|🧑‍🎄|🧑‍🍼|👩‍🦳|👩‍🦲|👩‍🦱|👩‍🦰|👩‍🦽|🧑‍🌾|👩‍🍼|👩‍🏫|👩‍🏭|👩‍💻|👩‍💼|👩‍🔧|👩‍🔬|👩‍🚀|👩‍🚒|👩‍🦯|👩‍🦼|👨‍🦰|🧑‍🦳|🧑‍🦲|🧑‍🦱|🧑‍🦰|👨‍🦱|👨‍🦲|👨‍🦳|🧑‍🦽|🧑‍🦼|🧑‍🍳)|(?:🏴󠁧󠁢󠁷󠁬󠁳󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁥󠁮󠁧󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|\p{EBase}\p{EMod}|(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_basic.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_basic.rb new file mode 100644 index 000000000..7abb49063 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_basic.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_BASIC = /(?:(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_emoji_keycap.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_emoji_keycap.rb new file mode 100644 index 000000000..ca2277728 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_emoji_keycap.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_EMOJI_KEYCAP = /[\#\*0-9]️⃣/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_mqe.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_mqe.rb new file mode 100644 index 000000000..3d0703d6e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_mqe.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_INCLUDE_MQE = /(?:(?:👩🏾‍❤️?‍💋‍👩🏻|👩🏾‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👨🏾|👨🏽‍❤️?‍💋‍👨🏻|👨🏽‍❤️?‍💋‍👨🏼|👨🏽‍❤️?‍💋‍👨🏽|👨🏽‍❤️?‍💋‍👨🏾|👨🏽‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👨🏽|👩🏾‍❤️?‍💋‍👨🏼|👩🏾‍❤️?‍💋‍👨🏻|👨🏾‍❤️?‍💋‍👨🏻|👨🏾‍❤️?‍💋‍👨🏼|👨🏾‍❤️?‍💋‍👨🏽|👨🏾‍❤️?‍💋‍👨🏾|👨🏾‍❤️?‍💋‍👨🏿|👩🏽‍❤️?‍💋‍👩🏿|👩🏿‍❤️?‍💋‍👩🏽|👩🏿‍❤️?‍💋‍👩🏼|👩🏿‍❤️?‍💋‍👩🏻|👩🏿‍❤️?‍💋‍👨🏿|👩🏿‍❤️?‍💋‍👨🏾|👩🏿‍❤️?‍💋‍👨🏽|👩🏿‍❤️?‍💋‍👨🏼|👩🏿‍❤️?‍💋‍👨🏻|👨🏼‍❤️?‍💋‍👨🏻|👨🏼‍❤️?‍💋‍👨🏼|👨🏼‍❤️?‍💋‍👨🏽|👨🏼‍❤️?‍💋‍👨🏾|👨🏼‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👩🏿|👩🏾‍❤️?‍💋‍👩🏾|👩🏾‍❤️?‍💋‍👩🏽|👩🏾‍❤️?‍💋‍👩🏼|👩🏼‍❤️?‍💋‍👩🏼|👩🏼‍❤️?‍💋‍👩🏻|👩🏼‍❤️?‍💋‍👨🏿|👩🏼‍❤️?‍💋‍👨🏾|👩🏼‍❤️?‍💋‍👨🏽|👩🏼‍❤️?‍💋‍👨🏼|👩🏼‍❤️?‍💋‍👨🏻|👩🏻‍❤️?‍💋‍👨🏻|👩🏻‍❤️?‍💋‍👨🏼|👩🏻‍❤️?‍💋‍👨🏽|👩🏻‍❤️?‍💋‍👨🏾|👩🏻‍❤️?‍💋‍👨🏿|👩🏻‍❤️?‍💋‍👩🏻|👩🏻‍❤️?‍💋‍👩🏼|👩🏻‍❤️?‍💋‍👩🏽|👩🏻‍❤️?‍💋‍👩🏾|👩🏻‍❤️?‍💋‍👩🏿|👩🏽‍❤️?‍💋‍👩🏾|👩🏽‍❤️?‍💋‍👩🏽|👩🏽‍❤️?‍💋‍👩🏼|👩🏽‍❤️?‍💋‍👩🏻|👩🏽‍❤️?‍💋‍👨🏿|👩🏽‍❤️?‍💋‍👨🏾|👩🏽‍❤️?‍💋‍👨🏽|👩🏽‍❤️?‍💋‍👨🏼|👩🏽‍❤️?‍💋‍👨🏻|👨🏿‍❤️?‍💋‍👨🏻|👨🏿‍❤️?‍💋‍👨🏼|👨🏿‍❤️?‍💋‍👨🏽|👨🏿‍❤️?‍💋‍👨🏾|👨🏿‍❤️?‍💋‍👨🏿|👩🏼‍❤️?‍💋‍👩🏿|👩🏼‍❤️?‍💋‍👩🏾|👨🏻‍❤️?‍💋‍👨🏼|👨🏻‍❤️?‍💋‍👨🏻|🧑🏼‍❤️?‍💋‍🧑🏻|🧑🏼‍❤️?‍💋‍🧑🏽|🧑🏼‍❤️?‍💋‍🧑🏾|🧑🏼‍❤️?‍💋‍🧑🏿|🧑🏽‍❤️?‍💋‍🧑🏻|🧑🏽‍❤️?‍💋‍🧑🏼|🧑🏽‍❤️?‍💋‍🧑🏾|🧑🏽‍❤️?‍💋‍🧑🏿|🧑🏾‍❤️?‍💋‍🧑🏻|🧑🏾‍❤️?‍💋‍🧑🏼|🧑🏾‍❤️?‍💋‍🧑🏽|🧑🏾‍❤️?‍💋‍🧑🏿|🧑🏿‍❤️?‍💋‍🧑🏾|🧑🏿‍❤️?‍💋‍🧑🏽|🧑🏿‍❤️?‍💋‍🧑🏻|🧑🏿‍❤️?‍💋‍🧑🏼|👩🏼‍❤️?‍💋‍👩🏽|👩🏿‍❤️?‍💋‍👩🏾|👩🏿‍❤️?‍💋‍👩🏿|🧑🏻‍❤️?‍💋‍🧑🏼|🧑🏻‍❤️?‍💋‍🧑🏽|🧑🏻‍❤️?‍💋‍🧑🏾|🧑🏻‍❤️?‍💋‍🧑🏿|👨🏻‍❤️?‍💋‍👨🏿|👨🏻‍❤️?‍💋‍👨🏾|👨🏻‍❤️?‍💋‍👨🏽|👩🏽‍❤️?‍👩🏻|👩🏽‍❤️?‍👨🏿|👩🏽‍❤️?‍👨🏾|👩🏽‍❤️?‍👨🏽|👩🏽‍❤️?‍👨🏼|👩🏽‍❤️?‍👨🏻|🧑🏿‍❤️?‍🧑🏾|🚶🏿‍♀️?‍➡️?|🚶🏾‍♂️?‍➡️?|🚶🏾‍♀️?‍➡️?|🏃🏿‍♂️?‍➡️?|👩🏽‍❤️?‍👩🏼|👩🏽‍❤️?‍👩🏽|👩🏽‍❤️?‍👩🏾|🚶🏿‍♂️?‍➡️?|🧑🏿‍❤️?‍🧑🏽|🧑🏿‍❤️?‍🧑🏼|🧑🏿‍❤️?‍🧑🏻|🏃🏻‍♂️?‍➡️?|🏃🏻‍♀️?‍➡️?|👩🏼‍❤️?‍👨🏻|👩🏼‍❤️?‍👨🏼|👩🏼‍❤️?‍👨🏽|🏃🏼‍♀️?‍➡️?|🏃🏼‍♂️?‍➡️?|👩🏼‍❤️?‍👨🏾|🏃🏽‍♀️?‍➡️?|🏃🏽‍♂️?‍➡️?|🏃🏾‍♀️?‍➡️?|👩🏼‍❤️?‍👨🏿|👩🏼‍❤️?‍👩🏻|👩🏼‍❤️?‍👩🏼|👩🏼‍❤️?‍👩🏽|🏃🏾‍♂️?‍➡️?|🏃🏿‍♀️?‍➡️?|👩🏼‍❤️?‍👩🏾|👩🏼‍❤️?‍👩🏿|🚶🏻‍♀️?‍➡️?|🚶🏻‍♂️?‍➡️?|🚶🏼‍♀️?‍➡️?|🚶🏼‍♂️?‍➡️?|🚶🏽‍♀️?‍➡️?|🚶🏽‍♂️?‍➡️?|👩🏽‍❤️?‍👩🏿|👩🏾‍❤️?‍👩🏻|👩🏾‍❤️?‍👩🏼|👩🏾‍❤️?‍👩🏽|👩🏾‍❤️?‍👩🏾|👩🏾‍❤️?‍👩🏿|🧑🏼‍❤️?‍🧑🏿|🧑🏼‍❤️?‍🧑🏾|🧑🏼‍❤️?‍🧑🏽|🧑🏼‍❤️?‍🧑🏻|🧑🏻‍❤️?‍🧑🏿|👩🏿‍❤️?‍👨🏻|👩🏿‍❤️?‍👨🏼|👩🏿‍❤️?‍👨🏽|👩🏿‍❤️?‍👨🏾|👩🏿‍❤️?‍👨🏿|👩🏿‍❤️?‍👩🏻|👩🏿‍❤️?‍👩🏼|👩🏿‍❤️?‍👩🏽|👩🏿‍❤️?‍👩🏾|👩🏿‍❤️?‍👩🏿|🧑🏻‍❤️?‍🧑🏾|🧑🏻‍❤️?‍🧑🏽|🧑🏻‍❤️?‍🧑🏼|🧑🏾‍❤️?‍🧑🏿|🧑🏾‍❤️?‍🧑🏽|🧑🏾‍❤️?‍🧑🏼|🧑🏾‍❤️?‍🧑🏻|🧎🏿‍♂️?‍➡️?|🧎🏿‍♀️?‍➡️?|🧎🏾‍♂️?‍➡️?|🧎🏾‍♀️?‍➡️?|🧎🏽‍♂️?‍➡️?|🧎🏽‍♀️?‍➡️?|🧑🏽‍❤️?‍🧑🏿|🧑🏽‍❤️?‍🧑🏾|🧑🏽‍❤️?‍🧑🏼|🧑🏽‍❤️?‍🧑🏻|🧎🏼‍♂️?‍➡️?|🧎🏼‍♀️?‍➡️?|🧎🏻‍♂️?‍➡️?|🧎🏻‍♀️?‍➡️?|👩🏾‍❤️?‍👨🏻|👩🏾‍❤️?‍👨🏼|👩🏾‍❤️?‍👨🏽|👩🏾‍❤️?‍👨🏾|👩🏾‍❤️?‍👨🏿|👩🏻‍❤️?‍👩🏻|👩🏻‍❤️?‍👨🏿|👩🏻‍❤️?‍👨🏾|👩🏻‍❤️?‍👨🏽|👩🏻‍❤️?‍👨🏼|👩🏻‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏾|👨🏼‍❤️?‍👨🏻|👩‍❤️?‍💋‍👩|👩‍❤️?‍💋‍👨|👨🏼‍❤️?‍👨🏼|👨🏼‍❤️?‍👨🏽|👨🏼‍❤️?‍👨🏾|👨🏼‍❤️?‍👨🏿|👨🏻‍❤️?‍👨🏽|👨🏻‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏽|👨‍❤️?‍💋‍👨|👨🏾‍❤️?‍👨🏼|👨🏾‍❤️?‍👨🏽|👨🏿‍❤️?‍👨🏿|👨🏾‍❤️?‍👨🏾|👨🏿‍❤️?‍👨🏾|👨🏾‍❤️?‍👨🏿|👨🏿‍❤️?‍👨🏽|👨🏾‍❤️?‍👨🏻|👨🏿‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏿|👨🏿‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏿|👨🏽‍❤️?‍👨🏾|👨🏽‍❤️?‍👨🏻|👩🏻‍❤️?‍👩🏿|👩🏻‍❤️?‍👩🏾|👩🏻‍❤️?‍👩🏽|👩🏻‍❤️?‍👩🏼|🧑🏼‍🐰‍🧑🏿|👨‍👨‍👧‍👦|🧑🏼‍🐰‍🧑🏾|🧑🏼‍🐰‍🧑🏽|🧑🏼‍🐰‍🧑🏻|🧑🏽‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏻|🧑🏼‍🫯‍🧑🏽|🧑🏼‍🫯‍🧑🏾|🧑🏾‍🤝‍🧑🏻|🧑🏾‍🤝‍🧑🏼|🧑🏾‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏾‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏿|🧑🏽‍🐰‍🧑🏻|🧑🏽‍🐰‍🧑🏼|🧑🏽‍🐰‍🧑🏾|🧑🏽‍🐰‍🧑🏿|👨‍👨‍👦‍👦|🧑🏽‍🫯‍🧑🏻|👨‍👩‍👦‍👦|👨‍👩‍👧‍👦|👨‍👩‍👧‍👧|🧑🏻‍🤝‍🧑🏿|🧑🏻‍🤝‍🧑🏾|🧑🏻‍🤝‍🧑🏽|🧑🏻‍🤝‍🧑🏼|🧑🏻‍🤝‍🧑🏻|👨🏻‍🐰‍👨🏼|👨🏻‍🐰‍👨🏽|👨🏻‍🐰‍👨🏾|👨🏻‍🐰‍👨🏿|👨🏻‍🤝‍👨🏼|👨🏻‍🤝‍👨🏽|👨🏻‍🤝‍👨🏾|🧑‍🧑‍🧒‍🧒|👩🏿‍🫯‍👩🏾|👩🏿‍🫯‍👩🏽|🧑🏽‍🤝‍🧑🏾|🧑🏽‍🤝‍🧑🏽|🧑🏽‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏻|🧑🏻‍🫯‍🧑🏿|🧑🏻‍🫯‍🧑🏾|🧑🏻‍🫯‍🧑🏽|🧑🏻‍🫯‍🧑🏼|👨‍👨‍👧‍👧|🧑🏻‍🐰‍🧑🏿|🧑🏻‍🐰‍🧑🏾|🧑🏻‍🐰‍🧑🏽|🧑🏼‍🤝‍🧑🏿|🧑🏼‍🤝‍🧑🏾|🧑🏼‍🤝‍🧑🏽|🧑🏼‍🤝‍🧑🏼|🧑🏼‍🤝‍🧑🏻|🧑🏻‍🐰‍🧑🏼|🧑🏽‍🦼‍➡️?|🧑🏽‍🦯‍➡️?|🧑🏼‍🦽‍➡️?|🧑🏼‍🦼‍➡️?|🧑🏼‍🦯‍➡️?|🧑🏻‍🦽‍➡️?|🧑🏻‍🦼‍➡️?|🧑🏻‍🦯‍➡️?|👩🏿‍🦽‍➡️?|👩🏿‍🦼‍➡️?|👩🏿‍🦯‍➡️?|👩🏾‍🦽‍➡️?|👩🏾‍🦼‍➡️?|👩🏾‍🦯‍➡️?|👩🏽‍🦽‍➡️?|👩🏽‍🦼‍➡️?|👩🏽‍🦯‍➡️?|👩🏼‍🦽‍➡️?|🧑🏿‍🫯‍🧑🏾|🧑🏿‍🫯‍🧑🏽|🧑🏿‍🫯‍🧑🏼|🧑🏿‍🫯‍🧑🏻|🧑🏿‍🐰‍🧑🏾|🧑🏿‍🐰‍🧑🏽|🧑🏿‍🐰‍🧑🏼|🧑🏿‍🐰‍🧑🏻|🧑🏾‍🫯‍🧑🏿|🏃‍♂️?‍➡️?|🏃‍♀️?‍➡️?|🧑🏿‍🦽‍➡️?|🧑🏿‍🦼‍➡️?|🧑🏿‍🦯‍➡️?|🧑🏾‍🦽‍➡️?|🧑🏾‍🦼‍➡️?|🧑🏾‍🦯‍➡️?|🧑🏽‍🦽‍➡️?|👩🏼‍🦼‍➡️?|👨🏻‍🦼‍➡️?|🚶‍♂️?‍➡️?|👨🏻‍🦯‍➡️?|🧑🏾‍🫯‍🧑🏽|🧑🏾‍🫯‍🧑🏼|🧑🏾‍🫯‍🧑🏻|🧑🏿‍🤝‍🧑🏿|🧑🏾‍🐰‍🧑🏿|🧑🏿‍🤝‍🧑🏾|🧑🏾‍🐰‍🧑🏽|🧑🏿‍🤝‍🧑🏽|🧑🏾‍🐰‍🧑🏼|🧑🏿‍🤝‍🧑🏼|🧑🏾‍🐰‍🧑🏻|🧑🏿‍🤝‍🧑🏻|🧑🏽‍🫯‍🧑🏿|🧑🏽‍🫯‍🧑🏾|🧑🏽‍🫯‍🧑🏼|👩🏼‍🦯‍➡️?|👩🏻‍🦽‍➡️?|👩🏻‍🦼‍➡️?|👩🏻‍🦯‍➡️?|👨🏿‍🦽‍➡️?|👨🏿‍🦼‍➡️?|👨🏿‍🦯‍➡️?|👨🏾‍🦽‍➡️?|👨🏾‍🦼‍➡️?|👨🏾‍🦯‍➡️?|👨🏽‍🦽‍➡️?|👨🏽‍🦼‍➡️?|👨🏽‍🦯‍➡️?|👨🏼‍🦽‍➡️?|👨🏼‍🦼‍➡️?|👨🏼‍🦯‍➡️?|👨🏻‍🦽‍➡️?|🚶‍♀️?‍➡️?|👩🏿‍🫯‍👩🏼|👨🏾‍🫯‍👨🏻|👨🏾‍🫯‍👨🏼|👨🏾‍🫯‍👨🏽|👨🏾‍🫯‍👨🏿|👨🏿‍🐰‍👨🏻|👨🏿‍🐰‍👨🏼|👨🏿‍🐰‍👨🏽|👨🏿‍🐰‍👨🏾|👨🏿‍🤝‍👨🏻|👨🏿‍🤝‍👨🏼|👨🏿‍🤝‍👨🏽|👨🏿‍🤝‍👨🏾|👨🏿‍🫯‍👨🏻|👩🏼‍🫯‍👩🏿|👩🏼‍🫯‍👩🏾|👩🏼‍🫯‍👩🏽|👩🏼‍🫯‍👩🏻|👨🏾‍🐰‍👨🏻|👩🏽‍🤝‍👩🏻|👨🏾‍🐰‍👨🏼|👩🏽‍🤝‍👨🏿|👨🏾‍🐰‍👨🏽|👩🏽‍🤝‍👨🏾|👨🏾‍🐰‍👨🏿|👩🏽‍🤝‍👨🏼|👨🏾‍🤝‍👨🏻|👩🏽‍🤝‍👨🏻|👨🏾‍🤝‍👨🏼|👩🏽‍🐰‍👩🏿|👩🏽‍🐰‍👩🏾|👩🏽‍🐰‍👩🏼|👩🏽‍🐰‍👩🏻|👨🏾‍🤝‍👨🏽|👨🏾‍🤝‍👨🏿|👩‍👩‍👧‍👧|👩🏻‍🫯‍👩🏿|👩🏻‍🫯‍👩🏾|👩🏻‍🫯‍👩🏽|👩🏻‍🫯‍👩🏼|👩🏻‍🤝‍👩🏿|👩🏻‍🤝‍👩🏾|👩🏻‍🤝‍👩🏽|👩🏻‍🤝‍👩🏼|👩🏻‍🤝‍👨🏿|👩🏻‍🤝‍👨🏾|👩🏻‍🤝‍👨🏽|👩🏻‍🤝‍👨🏼|👩🏻‍🐰‍👩🏿|👩🏻‍🐰‍👩🏾|👩🏻‍🐰‍👩🏽|👩🏻‍🐰‍👩🏼|👩🏼‍🤝‍👩🏿|👩🏼‍🤝‍👩🏾|👩🏼‍🤝‍👩🏽|👩🏼‍🤝‍👩🏻|👩🏼‍🤝‍👨🏿|👩🏼‍🤝‍👨🏾|👩🏼‍🤝‍👨🏽|👩🏼‍🤝‍👨🏻|👩🏼‍🐰‍👩🏿|👩🏼‍🐰‍👩🏾|👩🏼‍🐰‍👩🏽|👩🏼‍🐰‍👩🏻|👨🏿‍🫯‍👨🏼|👨🏿‍🫯‍👨🏽|👨🏿‍🫯‍👨🏾|👩‍👩‍👦‍👦|👨🏼‍🐰‍👨🏻|👨🏼‍🐰‍👨🏽|👨🏼‍🐰‍👨🏾|👨🏼‍🐰‍👨🏿|👨🏼‍🤝‍👨🏻|👨🏼‍🤝‍👨🏽|👨🏼‍🤝‍👨🏾|👨🏼‍🤝‍👨🏿|👨🏼‍🫯‍👨🏻|👨🏼‍🫯‍👨🏽|👩🏾‍🫯‍👩🏿|👩🏾‍🫯‍👩🏽|👩🏾‍🫯‍👩🏼|👩🏾‍🫯‍👩🏻|👩🏾‍🤝‍👩🏿|👩🏾‍🤝‍👩🏽|👩🏾‍🤝‍👩🏼|👩🏾‍🤝‍👩🏻|👩🏿‍🫯‍👩🏻|👩🏿‍🤝‍👩🏾|👩🏿‍🤝‍👩🏽|👩🏿‍🤝‍👩🏼|👩🏿‍🤝‍👩🏻|👩🏿‍🤝‍👨🏾|👩🏿‍🤝‍👨🏽|👩🏿‍🤝‍👨🏼|👩🏿‍🤝‍👨🏻|👩🏿‍🐰‍👩🏾|👩🏿‍🐰‍👩🏽|👩🏿‍🐰‍👩🏼|👩🏿‍🐰‍👩🏻|👨🏻‍🤝‍👨🏿|👨🏻‍🫯‍👨🏼|👨🏻‍🫯‍👨🏽|👨🏻‍🫯‍👨🏾|👨🏻‍🫯‍👨🏿|👩🏾‍🤝‍👨🏿|👨🏽‍🐰‍👨🏿|👨🏽‍🤝‍👨🏻|👨🏽‍🤝‍👨🏼|👨🏽‍🤝‍👨🏾|👨🏽‍🤝‍👨🏿|👨🏽‍🫯‍👨🏻|👨🏽‍🫯‍👨🏼|👨🏽‍🫯‍👨🏾|👨🏽‍🫯‍👨🏿|👩🏽‍🫯‍👩🏿|🧎‍♀️?‍➡️?|👩🏽‍🫯‍👩🏾|🧎‍♂️?‍➡️?|👩🏽‍🫯‍👩🏼|👩🏽‍🫯‍👩🏻|👩🏽‍🤝‍👩🏿|👩🏽‍🤝‍👩🏾|👩🏽‍🤝‍👩🏼|👩🏾‍🤝‍👨🏽|👩🏾‍🤝‍👨🏼|👩🏾‍🤝‍👨🏻|👩🏾‍🐰‍👩🏿|👩🏾‍🐰‍👩🏽|👩🏾‍🐰‍👩🏼|👩🏾‍🐰‍👩🏻|👨🏼‍🫯‍👨🏾|👨🏼‍🫯‍👨🏿|👨🏽‍🐰‍👨🏻|👨🏽‍🐰‍👨🏼|👨🏽‍🐰‍👨🏾|👩‍👩‍👧‍👦|👨‍🦽‍➡️?|🧑‍🦯‍➡️?|👨‍🦼‍➡️?|🧑‍🦼‍➡️?|👨‍🦯‍➡️?|🧑‍🦽‍➡️?|👩‍❤️?‍👩|👩‍❤️?‍👨|👩‍🦯‍➡️?|👨‍❤️?‍👨|👩‍🦼‍➡️?|👩‍🦽‍➡️?|🧖🏾‍♀️?|🧖🏽‍♂️?|🧖🏽‍♀️?|🧖🏼‍♂️?|🧖🏼‍♀️?|🧖🏻‍♂️?|🧖🏻‍♀️?|👩🏾‍✈️?|👩🏾‍⚖️?|👩🏾‍⚕️?|🧔🏿‍♂️?|🧔🏿‍♀️?|🧔🏾‍♂️?|🚴🏻‍♀️?|🧔🏾‍♀️?|🧔🏽‍♂️?|🧔🏽‍♀️?|🧔🏼‍♂️?|🧔🏼‍♀️?|🧔🏻‍♂️?|🧔🏻‍♀️?|🧘🏻‍♂️?|🧘🏻‍♀️?|🧗🏿‍♂️?|🧗🏿‍♀️?|🧗🏾‍♂️?|🧗🏾‍♀️?|🧗🏽‍♂️?|🧗🏽‍♀️?|👩🏿‍✈️?|👩🏿‍⚖️?|👩🏿‍⚕️?|🚣🏾‍♂️?|🧗🏼‍♂️?|🚣🏿‍♀️?|🧗🏼‍♀️?|🚣🏿‍♂️?|🧗🏻‍♂️?|🧗🏻‍♀️?|🧖🏿‍♂️?|🧖🏿‍♀️?|🧖🏾‍♂️?|🧎🏽‍♀️?|🧎🏼‍♂️?|🧎🏼‍♀️?|🧎🏻‍♂️?|🧎🏻‍♀️?|👩🏼‍✈️?|👩🏼‍⚖️?|👩🏼‍⚕️?|🚴🏽‍♀️?|🚴🏽‍♂️?|🧍🏿‍♂️?|🚴🏾‍♀️?|🧍🏿‍♀️?|🧍🏾‍♂️?|🧍🏾‍♀️?|🧍🏽‍♂️?|🧍🏽‍♀️?|🧍🏼‍♂️?|🧍🏼‍♀️?|🧍🏻‍♂️?|🧍🏻‍♀️?|🧏🏿‍♂️?|🧏🏿‍♀️?|🧏🏾‍♂️?|🧏🏾‍♀️?|🧏🏽‍♂️?|🧏🏽‍♀️?|👩🏽‍✈️?|👩🏽‍⚖️?|👩🏽‍⚕️?|🚴🏻‍♂️?|🧏🏼‍♂️?|🚴🏼‍♀️?|🧏🏼‍♀️?|🚴🏼‍♂️?|🧏🏻‍♂️?|🧏🏻‍♀️?|🧎🏿‍♂️?|🧎🏿‍♀️?|🧎🏾‍♂️?|🧎🏾‍♀️?|🧎🏽‍♂️?|🧑🏼‍⚕️?|👩‍👧‍👧|👩‍👩‍👦|🧜🏻‍♀️?|👩‍👩‍👧|🚣🏻‍♀️?|🧛🏿‍♂️?|🧛🏿‍♀️?|🧛🏾‍♂️?|🧛🏾‍♀️?|🧛🏽‍♂️?|🧛🏽‍♀️?|🧛🏼‍♂️?|🧛🏼‍♀️?|🧛🏻‍♂️?|🧛🏻‍♀️?|🧚🏿‍♂️?|🧚🏿‍♀️?|🧑🏻‍✈️?|🧑🏻‍⚖️?|🧑🏻‍⚕️?|🙎🏾‍♂️?|🧝🏽‍♀️?|🙎🏿‍♀️?|🧝🏼‍♂️?|🙎🏿‍♂️?|🧝🏼‍♀️?|🧝🏻‍♂️?|🧝🏻‍♀️?|🧜🏿‍♂️?|🧜🏿‍♀️?|🧜🏾‍♂️?|🧜🏾‍♀️?|🧜🏽‍♂️?|🧜🏽‍♀️?|🧜🏼‍♂️?|🧜🏼‍♀️?|🧜🏻‍♂️?|👩‍👦‍👦|👩‍👧‍👦|🧑🏼‍✈️?|🧑🏼‍⚖️?|🧎🏿‍➡️?|🧎🏾‍➡️?|🧎🏽‍➡️?|🧎🏼‍➡️?|🧎🏻‍➡️?|🚶🏿‍➡️?|🚶🏾‍➡️?|🚶🏽‍➡️?|🚶🏼‍➡️?|🚶🏻‍➡️?|🧘🏿‍♂️?|🚣🏽‍♀️?|🧘🏿‍♀️?|🚣🏽‍♂️?|🧘🏾‍♂️?|🚣🏾‍♀️?|🧘🏾‍♀️?|🧘🏽‍♂️?|🧘🏽‍♀️?|🧘🏼‍♂️?|🧘🏼‍♀️?|🚣🏻‍♂️?|🧚🏾‍♂️?|🚣🏼‍♀️?|🧚🏾‍♀️?|🚣🏼‍♂️?|🧚🏽‍♂️?|🧚🏽‍♀️?|🧚🏼‍♂️?|🧚🏼‍♀️?|🧚🏻‍♂️?|🧚🏻‍♀️?|🧙🏿‍♂️?|🧙🏿‍♀️?|🧙🏾‍♂️?|🧙🏾‍♀️?|🧙🏽‍♂️?|🧙🏽‍♀️?|🧙🏼‍♂️?|🧙🏼‍♀️?|🧙🏻‍♂️?|🧙🏻‍♀️?|👨🏼‍✈️?|👨🏼‍⚖️?|👨🏼‍⚕️?|🤷🏼‍♀️?|🤷🏻‍♂️?|🤷🏻‍♀️?|🚶🏻‍♀️?|🤵🏿‍♂️?|🤵🏿‍♀️?|🤵🏾‍♂️?|🤵🏾‍♀️?|🤵🏽‍♂️?|🤵🏽‍♀️?|🤵🏼‍♂️?|🤵🏼‍♀️?|🤵🏻‍♂️?|🤵🏻‍♀️?|🤦🏿‍♂️?|🤦🏿‍♀️?|👨🏻‍✈️?|👨🏻‍⚖️?|👨🏽‍✈️?|👨🏽‍⚖️?|👨🏽‍⚕️?|🚵🏾‍♂️?|🤸🏾‍♂️?|🚵🏿‍♀️?|🤸🏾‍♀️?|🚵🏿‍♂️?|🤸🏽‍♂️?|🤸🏽‍♀️?|🤸🏼‍♂️?|🤸🏼‍♀️?|🤸🏻‍♂️?|🤸🏻‍♀️?|🤷🏿‍♂️?|🤷🏿‍♀️?|🤷🏾‍♂️?|🤷🏾‍♀️?|🤷🏽‍♂️?|🤷🏽‍♀️?|🤷🏼‍♂️?|🫱🏻‍🫲🏿|🏃🏿‍➡️?|🏃🏾‍➡️?|🏃🏽‍➡️?|🏃🏼‍➡️?|🏃🏻‍➡️?|🫱🏼‍🫲🏻|🫱🏿‍🫲🏾|🫱🏿‍🫲🏽|🫱🏿‍🫲🏼|🫱🏿‍🫲🏻|🫱🏾‍🫲🏿|🫱🏾‍🫲🏽|🫱🏾‍🫲🏼|🫱🏾‍🫲🏻|🫱🏽‍🫲🏿|🫱🏽‍🫲🏾|🫱🏽‍🫲🏼|🫱🏽‍🫲🏻|🫱🏼‍🫲🏿|🫱🏼‍🫲🏾|👨🏻‍⚕️?|🚶🏻‍♂️?|🤦🏾‍♂️?|🚶🏼‍♀️?|🤦🏾‍♀️?|🚶🏼‍♂️?|🤦🏽‍♂️?|🤦🏽‍♀️?|🤦🏼‍♂️?|🤦🏼‍♀️?|🤦🏻‍♂️?|🤦🏻‍♀️?|🚶🏿‍♂️?|🚶🏿‍♀️?|🚶🏾‍♂️?|🚶🏾‍♀️?|🚶🏽‍♂️?|🚶🏽‍♀️?|🫱🏻‍🫲🏼|🫱🏻‍🫲🏽|🫱🏻‍🫲🏾|🦸🏽‍♀️?|🦸🏼‍♂️?|🦸🏼‍♀️?|🦸🏻‍♂️?|🦸🏻‍♀️?|🤾🏿‍♂️?|🤾🏿‍♀️?|🤾🏾‍♂️?|🤾🏾‍♀️?|🚵🏻‍♀️?|🤾🏽‍♂️?|🤾🏽‍♀️?|🤾🏼‍♂️?|🤾🏼‍♀️?|🤾🏻‍♂️?|🤾🏻‍♀️?|🤽🏿‍♂️?|🤽🏿‍♀️?|🤽🏾‍♂️?|🤽🏾‍♀️?|🤽🏽‍♂️?|🦹🏿‍♂️?|🦹🏿‍♀️?|🦹🏾‍♂️?|🦹🏾‍♀️?|👩🏻‍✈️?|👩🏻‍⚖️?|👩🏻‍⚕️?|🚴🏾‍♂️?|🦹🏽‍♂️?|🚴🏿‍♀️?|🦹🏽‍♀️?|🚴🏿‍♂️?|🦹🏼‍♂️?|🦹🏼‍♀️?|🦹🏻‍♂️?|🦹🏻‍♀️?|🦸🏿‍♂️?|🦸🏿‍♀️?|🦸🏾‍♂️?|🦸🏾‍♀️?|🦸🏽‍♂️?|👨🏾‍✈️?|👨🏾‍⚖️?|👨🏾‍⚕️?|🚵🏽‍♀️?|🧑‍🤝‍🧑|🚵🏽‍♂️?|🧑‍🧑‍🧒|🚵🏾‍♀️?|🤹🏿‍♂️?|🧑‍🧒‍🧒|🤹🏿‍♀️?|🤹🏾‍♂️?|🤹🏾‍♀️?|🤹🏽‍♂️?|🤹🏽‍♀️?|🤹🏼‍♂️?|🤹🏼‍♀️?|🤹🏻‍♂️?|🤹🏻‍♀️?|🤸🏿‍♂️?|🤸🏿‍♀️?|🤽🏽‍♀️?|🤽🏼‍♂️?|👨🏿‍✈️?|👨🏿‍⚖️?|👨🏿‍⚕️?|🚵🏻‍♂️?|🤽🏼‍♀️?|🚵🏼‍♀️?|🤽🏻‍♂️?|🚵🏼‍♂️?|🤽🏻‍♀️?|🤼🏿‍♂️?|🤼🏿‍♀️?|🤼🏾‍♂️?|🤼🏾‍♀️?|🤼🏽‍♂️?|🤼🏽‍♀️?|🤼🏼‍♂️?|🤼🏼‍♀️?|🤼🏻‍♂️?|🤼🏻‍♀️?|👷🏽‍♀️?|👷🏼‍♂️?|👷🏼‍♀️?|👷🏻‍♂️?|👷🏻‍♀️?|👳🏿‍♂️?|👳🏿‍♀️?|👳🏾‍♂️?|👳🏾‍♀️?|👳🏽‍♂️?|👳🏽‍♀️?|👳🏼‍♂️?|👳🏼‍♀️?|👳🏻‍♂️?|👳🏻‍♀️?|🏳️‍⚧️?|👱🏿‍♂️?|👱🏿‍♀️?|👱🏾‍♂️?|👱🏾‍♀️?|👱🏽‍♂️?|💂🏽‍♀️?|💂🏼‍♂️?|💂🏼‍♀️?|💂🏻‍♂️?|💂🏻‍♀️?|💁🏿‍♂️?|💁🏿‍♀️?|💁🏾‍♂️?|💁🏾‍♀️?|💁🏽‍♂️?|💁🏽‍♀️?|💁🏼‍♂️?|💁🏼‍♀️?|💁🏻‍♂️?|💁🏻‍♀️?|👁️‍🗨️?|👷🏿‍♂️?|👷🏿‍♀️?|👷🏾‍♂️?|👷🏾‍♀️?|👷🏽‍♂️?|👯🏼‍♂️?|👯🏼‍♀️?|👯🏻‍♂️?|👯🏻‍♀️?|👮🏿‍♂️?|👮🏿‍♀️?|👮🏾‍♂️?|👮🏾‍♀️?|👮🏽‍♂️?|👮🏽‍♀️?|👮🏼‍♂️?|👮🏼‍♀️?|👮🏻‍♂️?|👮🏻‍♀️?|🏌️‍♂️?|🏌️‍♀️?|🏌🏿‍♂️?|🏌🏿‍♀️?|🏌🏾‍♂️?|🏌🏾‍♀️?|🏌🏽‍♂️?|👱🏽‍♀️?|👱🏼‍♂️?|👱🏼‍♀️?|👱🏻‍♂️?|👱🏻‍♀️?|👰🏿‍♂️?|👰🏿‍♀️?|👰🏾‍♂️?|👰🏾‍♀️?|👰🏽‍♂️?|👰🏽‍♀️?|👰🏼‍♂️?|👰🏼‍♀️?|👰🏻‍♂️?|👰🏻‍♀️?|👯🏿‍♂️?|👯🏿‍♀️?|👯🏾‍♂️?|👯🏾‍♀️?|👯🏽‍♂️?|👯🏽‍♀️?|👨‍👧‍👦|🙆🏿‍♂️?|🙆🏿‍♀️?|🙆🏾‍♂️?|🙆🏾‍♀️?|🙆🏽‍♂️?|🙆🏽‍♀️?|🙆🏼‍♂️?|🙆🏼‍♀️?|🙆🏻‍♂️?|🙆🏻‍♀️?|👨‍👧‍👧|👨‍👨‍👦|🙅🏿‍♂️?|🙅🏿‍♀️?|🙅🏾‍♂️?|🙅🏾‍♀️?|🙅🏽‍♂️?|🙅🏽‍♀️?|🙅🏼‍♂️?|🙅🏼‍♀️?|🙋🏿‍♂️?|🙋🏿‍♀️?|🙋🏾‍♂️?|🙋🏾‍♀️?|🙋🏽‍♂️?|🙋🏽‍♀️?|🙋🏼‍♂️?|🙋🏼‍♀️?|🙋🏻‍♂️?|🙋🏻‍♀️?|🙇🏿‍♂️?|🙇🏿‍♀️?|🙇🏾‍♂️?|🙇🏾‍♀️?|🙇🏽‍♂️?|🙇🏽‍♀️?|🙇🏼‍♂️?|🙇🏼‍♀️?|🙇🏻‍♂️?|🙇🏻‍♀️?|👨‍👦‍👦|💇🏼‍♂️?|💇🏼‍♀️?|💇🏻‍♂️?|💇🏻‍♀️?|💆🏿‍♂️?|💆🏿‍♀️?|💆🏾‍♂️?|💆🏾‍♀️?|💆🏽‍♂️?|💆🏽‍♀️?|💆🏼‍♂️?|💆🏼‍♀️?|💆🏻‍♂️?|💆🏻‍♀️?|👨‍👩‍👦|👨‍👩‍👧|💂🏿‍♂️?|💂🏿‍♀️?|💂🏾‍♂️?|💂🏾‍♀️?|💂🏽‍♂️?|🙅🏻‍♂️?|🙅🏻‍♀️?|👨‍👨‍👧|🕵️‍♂️?|🕵️‍♀️?|🕵🏿‍♂️?|🕵🏿‍♀️?|🕵🏾‍♂️?|🕵🏾‍♀️?|🕵🏽‍♂️?|🕵🏽‍♀️?|🕵🏼‍♂️?|🕵🏼‍♀️?|🕵🏻‍♂️?|🕵🏻‍♀️?|💇🏿‍♂️?|💇🏿‍♀️?|💇🏾‍♂️?|💇🏾‍♀️?|💇🏽‍♂️?|💇🏽‍♀️?|🏌🏽‍♀️?|⛹🏾‍♀️?|⛹🏾‍♂️?|⛹🏿‍♀️?|⛹🏿‍♂️?|⛹️‍♀️?|⛹️‍♂️?|🙍🏿‍♂️?|🙍🏿‍♀️?|🏃🏻‍♀️?|🙍🏾‍♂️?|🏃🏻‍♂️?|🙍🏾‍♀️?|🏃🏼‍♀️?|🙍🏽‍♂️?|🏃🏼‍♂️?|🙍🏽‍♀️?|🏃🏽‍♀️?|🙍🏼‍♂️?|🏃🏽‍♂️?|🙍🏼‍♀️?|🏃🏾‍♀️?|🙍🏻‍♂️?|🏃🏾‍♂️?|🙍🏻‍♀️?|🏃🏿‍♀️?|🏃🏿‍♂️?|🏄🏻‍♀️?|🏄🏻‍♂️?|🫱🏼‍🫲🏽|🧑🏽‍⚕️?|🧑🏽‍⚖️?|🧑🏽‍✈️?|🧝🏽‍♂️?|🧝🏾‍♀️?|🧝🏾‍♂️?|🧝🏿‍♀️?|🧝🏿‍♂️?|🙎🏾‍♀️?|🙎🏽‍♂️?|🙎🏽‍♀️?|🧑🏾‍⚕️?|🧑🏾‍⚖️?|🧑🏾‍✈️?|🙎🏼‍♂️?|🙎🏼‍♀️?|🙎🏻‍♂️?|🧑🏿‍⚕️?|🧑🏿‍⚖️?|🧑🏿‍✈️?|🙎🏻‍♀️?|⛹🏻‍♀️?|⛹🏻‍♂️?|⛹🏼‍♀️?|⛹🏼‍♂️?|⛹🏽‍♀️?|⛹🏽‍♂️?|🏊🏻‍♀️?|🏊🏻‍♂️?|🏊🏼‍♀️?|🏊🏼‍♂️?|🏊🏽‍♀️?|🏊🏽‍♂️?|🏊🏾‍♀️?|🏊🏾‍♂️?|🏊🏿‍♀️?|🏊🏿‍♂️?|🏋🏻‍♀️?|🏋🏻‍♂️?|🏋🏼‍♀️?|🏋🏼‍♂️?|🏋🏽‍♀️?|🏋🏽‍♂️?|🏋🏾‍♀️?|🏋🏾‍♂️?|🏋🏿‍♀️?|🏋🏿‍♂️?|🏋️‍♀️?|🏋️‍♂️?|🏌🏻‍♀️?|🏌🏻‍♂️?|🏌🏼‍♀️?|🏌🏼‍♂️?|🏄🏿‍♀️?|🏄🏾‍♂️?|🏄🏾‍♀️?|🏄🏽‍♂️?|🏄🏽‍♀️?|🏄🏿‍♂️?|🏄🏼‍♂️?|🏄🏼‍♀️?|🤾‍♂️?|👨🏽‍🦱|👨🏽‍🦲|👨🏽‍🦳|🧜‍♀️?|👨🏾‍🦰|👨🏾‍🦱|👨🏾‍🦲|👨🏾‍🦳|👨🏿‍🦰|👨🏿‍🦱|🧜‍♂️?|🤦‍♂️?|🤷‍♀️?|👩🏼‍🦲|🧑🏽‍🦱|👩🏼‍🦱|🤾‍♀️?|👩🏼‍🦰|👩🏻‍🦳|👩🏻‍🦲|👩🏻‍🦱|👩🏻‍🦰|👨🏿‍🦳|🤵‍♂️?|🤵‍♀️?|🧑🏽‍🩰|👨🏿‍🦲|🧛‍♀️?|🧛‍♂️?|🧖‍♂️?|🧎‍♂️?|🧖‍♀️?|🧑🏾‍🦰|🧑🏽‍🦳|🧑🏽‍🦲|🧝‍♂️?|🧝‍♀️?|🧑🏿‍🩰|🧑🏾‍🩰|🧎‍♀️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|👨🏻‍🦰|👨🏻‍🦱|👨🏻‍🦲|👨🏻‍🦳|👨🏼‍🦰|👨🏼‍🦱|👨🏼‍🦲|🧏‍♀️?|👨🏼‍🦳|🧑🏾‍🦳|👨🏽‍🦰|🧑🏿‍🦰|🧏‍♂️?|❤️‍🩹|🤦‍♀️?|🧑🏼‍🦰|🧑🏼‍🦱|🤹‍♀️?|🤹‍♂️?|🧑🏼‍🦲|🧍‍♀️?|🧑🏿‍🦱|🧑🏿‍🦲|🧗‍♀️?|🧗‍♂️?|🙂‍↕️?|🙂‍↔️?|🏴‍☠️?|🧔‍♀️?|🧑🏼‍🦳|🧘‍♂️?|🧘‍♀️?|🧔‍♂️?|🤼‍♀️?|🤼‍♂️?|😶‍🌫️?|🧑🏽‍🦰|🐻‍❄️?|🧑🏿‍🦳|⛓️‍💥|🦹‍♂️?|🦹‍♀️?|🧑🏾‍🦱|🧑🏾‍🦲|🤽‍♀️?|🤽‍♂️?|🏳️‍🌈|🤷‍♂️?|🦸‍♀️?|🦸‍♂️?|❤️‍🔥|👩🏼‍🦳|🧚‍♂️?|🧚‍♀️?|👩🏽‍🦰|👩🏽‍🦱|👩🏽‍🦲|👩🏽‍🦳|👩🏾‍🦰|👩🏾‍🦱|🧑🏼‍🩰|🤸‍♀️?|🤸‍♂️?|🧑🏻‍🩰|👩🏾‍🦲|👩🏾‍🦳|👩🏿‍🦰|👩🏿‍🦱|🧙‍♂️?|👩🏿‍🦲|👩🏿‍🦳|🧑🏻‍🦰|🧑🏻‍🦱|🧑🏻‍🦲|🧙‍♀️?|🧍‍♂️?|🧑🏻‍🦳|🚣‍♀️?|🧑🏻‍🦽|🚣‍♂️?|🧑🏻‍🦼|🧑🏻‍🦯|🧑🏻‍🚒|🧑🏻‍🚀|🧑🏻‍🔬|🧑🏻‍🔧|🧑🏻‍💼|🧑🏻‍💻|🧑🏻‍🏭|🧑🏻‍🏫|🧑🏻‍🎨|🧑🏻‍🎤|🧑🏻‍🎓|🧑🏻‍🎄|🧑🏻‍🍼|🧑🏻‍🍳|🧑🏻‍🌾|🧑‍✈️?|🧑‍⚖️?|🧑🏽‍🎄|🧑🏽‍🍼|🧑🏽‍🍳|🧑🏽‍🌾|🧑🏼‍🦽|🧑🏼‍🦼|🧑🏼‍🦯|🧑🏼‍🚒|🧑🏼‍🚀|🧑🏼‍🔬|🧑🏼‍🔧|🧑🏼‍💼|🧑🏼‍💻|🧑🏼‍🏭|🧑🏼‍🏫|🧑🏼‍🎨|🧑🏼‍🎤|🧑🏼‍🎓|🧑🏼‍🎄|🧑🏼‍🍼|🧑🏼‍🍳|🧑🏼‍🌾|👩🏾‍🦯|👩🏾‍🚒|👩🏾‍🚀|👩🏾‍🔬|👩🏾‍🔧|👩🏾‍💼|👩🏾‍💻|👩🏾‍🏭|👩🏾‍🏫|👩🏾‍🎨|👩🏾‍🎤|👩🏾‍🎓|👩🏾‍🍼|👩🏾‍🍳|👩🏾‍🌾|🚴‍♀️?|👩🏽‍🦽|🚴‍♂️?|👩🏽‍🦼|👩🏽‍🦯|👩🏽‍🚒|👩🏽‍🚀|🧑‍⚕️?|🧎‍➡️?|🚶‍➡️?|👩🏿‍🦽|👩🏿‍🦼|👩🏿‍🦯|👩🏿‍🚒|👩🏿‍🚀|👩🏿‍🔬|👩🏿‍🔧|👩🏿‍💼|👩🏿‍💻|👩🏿‍🏭|👩🏿‍🏫|👩🏿‍🎨|👩🏿‍🎤|👩🏿‍🎓|👩🏿‍🍼|👩🏿‍🍳|👩🏿‍🌾|👩🏾‍🦽|👩🏾‍🦼|👰‍♂️?|👰‍♀️?|👯‍♂️?|👯‍♀️?|👮‍♂️?|👮‍♀️?|🏊‍♂️?|🏊‍♀️?|🏄‍♂️?|🏄‍♀️?|🙍‍♀️?|🙍‍♂️?|🏃‍♂️?|🏃‍♀️?|🙎‍♀️?|🧑🏿‍🦽|🙎‍♂️?|🧑🏿‍🦼|🧑🏿‍🦯|🧑🏿‍🚒|🧑🏿‍🚀|🧑🏿‍🔬|🙋‍♂️?|🙋‍♀️?|🙇‍♂️?|🙇‍♀️?|🙆‍♂️?|🙆‍♀️?|🙅‍♂️?|🙅‍♀️?|💇‍♂️?|💇‍♀️?|💆‍♂️?|💆‍♀️?|💂‍♂️?|💂‍♀️?|💁‍♂️?|💁‍♀️?|👷‍♂️?|👷‍♀️?|👳‍♂️?|👳‍♀️?|👱‍♂️?|👱‍♀️?|🧑🏾‍🏫|🧑🏾‍🎨|🧑🏾‍🎤|🧑🏾‍🎓|🧑🏾‍🎄|🧑🏾‍🍼|🧑🏾‍🍳|🧑🏾‍🌾|🧑🏽‍🦽|🧑🏽‍🦼|🧑🏽‍🦯|🧑🏽‍🚒|🧑🏽‍🚀|🧑🏽‍🔬|🧑🏽‍🔧|🧑🏽‍💼|🧑🏽‍💻|🧑🏽‍🏭|🧑🏽‍🏫|🧑🏽‍🎨|🧑🏽‍🎤|🧑🏽‍🎓|🧑🏿‍🔧|🧑🏿‍💼|🧑🏿‍💻|🧑🏿‍🏭|🧑🏿‍🏫|🧑🏿‍🎨|🧑🏿‍🎤|🧑🏿‍🎓|🧑🏿‍🎄|🧑🏿‍🍼|🧑🏿‍🍳|🧑🏿‍🌾|🧑🏾‍🦽|🧑🏾‍🦼|🧑🏾‍🦯|🧑🏾‍🚒|🧑🏾‍🚀|🧑🏾‍🔬|🧑🏾‍🔧|🧑🏾‍💼|🧑🏾‍💻|🧑🏾‍🏭|👨🏾‍🔧|👨🏾‍💼|👨🏾‍💻|👨🏾‍🏭|👨🏾‍🏫|👨🏾‍🎨|👨🏾‍🎤|👨🏾‍🎓|👨🏾‍🍼|👨🏾‍🍳|👨🏾‍🌾|👨🏽‍🦽|👨🏽‍🦼|👨🏽‍🦯|👨🏽‍🚒|👨🏽‍🚀|👨🏽‍🔬|👨🏽‍🔧|👨🏽‍💼|👨🏽‍💻|👨🏽‍🏭|👨🏽‍🏫|👨🏿‍🦼|👨🏿‍🦯|👨🏿‍🚒|👨🏿‍🚀|👨🏿‍🔬|👨🏿‍🔧|👨🏿‍💼|👨🏿‍💻|👨🏿‍🏭|👨🏿‍🏫|👨🏿‍🎨|👨🏿‍🎤|👨🏿‍🎓|👨🏿‍🍼|👨🏿‍🍳|👨🏿‍🌾|👨🏾‍🦽|👨🏾‍🦼|👨🏾‍🦯|👨🏾‍🚒|👨🏾‍🚀|👨🏾‍🔬|👨🏽‍🎨|🚶‍♀️?|👨🏻‍🦽|🚶‍♂️?|👨🏻‍🦼|👨🏻‍🦯|👨🏻‍🚒|👨🏻‍🚀|👨🏻‍🔬|👨🏻‍🔧|👨🏻‍💼|👨🏻‍💻|👨🏻‍🏭|👨🏻‍🏫|👨🏻‍🎨|👨🏻‍🎤|👨🏻‍🎓|👨🏻‍🍼|👨🏻‍🍳|👨🏻‍🌾|👨‍✈️?|👨‍⚖️?|👨‍⚕️?|👨🏽‍🎤|👨🏽‍🎓|👨🏽‍🍼|👨🏽‍🍳|👨🏽‍🌾|👨🏼‍🦽|👨🏼‍🦼|👨🏼‍🦯|👨🏼‍🚒|👨🏼‍🚀|👨🏼‍🔬|👨🏼‍🔧|👨🏼‍💼|👨🏼‍💻|👨🏼‍🏭|👨🏼‍🏫|👨🏼‍🎨|👨🏼‍🎤|👨🏼‍🎓|👨🏼‍🍼|👨🏼‍🍳|👨🏼‍🌾|👩🏼‍🎨|👩🏼‍🎤|👩🏼‍🎓|👩🏼‍🍼|👩🏼‍🍳|👩🏼‍🌾|👩🏻‍🦽|👩🏻‍🦼|👩🏻‍🦯|👩🏻‍🚒|👩🏻‍🚀|👩🏻‍🔬|👩🏻‍🔧|👩🏻‍💼|👩🏻‍💻|👩🏻‍🏭|👩🏻‍🏫|👩🏻‍🎨|👩🏻‍🎤|👩🏻‍🎓|👩🏻‍🍼|👩🏻‍🍳|👩🏻‍🌾|👩🏽‍🔬|👩🏽‍🔧|👩🏽‍💼|👩🏽‍💻|👩🏽‍🏭|👩🏽‍🏫|👩🏽‍🎨|👩🏽‍🎤|👩🏽‍🎓|👩🏽‍🍼|👩🏽‍🍳|👩🏽‍🌾|👩🏼‍🦽|👩🏼‍🦼|👩🏼‍🦯|👩🏼‍🚒|👩🏼‍🚀|👩🏼‍🔬|👩🏼‍🔧|👩🏼‍💼|👩🏼‍💻|👩🏼‍🏭|👩🏼‍🏫|👨🏿‍🦽|🚵‍♀️?|👩‍⚕️?|👩‍⚖️?|👩‍✈️?|🚵‍♂️?|🏃‍➡️?|🐦‍🔥|🐦‍⬛|🐕‍🦺|🐈‍⬛|👨‍🚒|👨‍🦯|👨‍🦼|🍋‍🟩|🍄‍🟫|👨‍🦽|👩‍🎨|👩‍🎤|👩‍🎓|👩‍🌾|👩‍🍳|👩‍👦|👨‍👦|👨‍👧|👩‍👧|👨‍🌾|👨‍🍳|👨‍🍼|👨‍🎓|👨‍🎤|👨‍🎨|👨‍🏫|🧑‍🩰|👨‍🏭|👨‍💻|👨‍💼|👨‍🔧|😵‍💫|😮‍💨|👨‍🔬|👨‍🚀|🧑‍🦯|🧑‍🚒|🧑‍🚀|🧑‍🔬|🧑‍🔧|🧑‍💼|🧑‍💻|🧑‍🏭|🧑‍🏫|🧑‍🧒|🧑‍🎨|🧑‍🎤|🧑‍🎓|🧑‍🎄|🧑‍🍼|👩‍🦳|👩‍🦲|👩‍🦱|👩‍🦰|👩‍🦽|🧑‍🌾|👩‍🍼|👩‍🏫|👩‍🏭|👩‍💻|👩‍💼|👩‍🔧|👩‍🔬|👩‍🚀|👩‍🚒|👩‍🦯|👩‍🦼|👨‍🦰|🧑‍🦳|🧑‍🦲|🧑‍🦱|🧑‍🦰|👨‍🦱|👨‍🦲|👨‍🦳|🧑‍🦽|🧑‍🦼|🧑‍🍳)|(?:🏴󠁧󠁢󠁷󠁬󠁳󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁥󠁮󠁧󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|\p{EBase}\p{EMod}|(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_mqe_uqe.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_mqe_uqe.rb new file mode 100644 index 000000000..3ea789123 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_mqe_uqe.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_INCLUDE_MQE_UQE = /(?:(?:👩🏾‍❤️?‍💋‍👩🏻|👩🏾‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👨🏾|👨🏽‍❤️?‍💋‍👨🏻|👨🏽‍❤️?‍💋‍👨🏼|👨🏽‍❤️?‍💋‍👨🏽|👨🏽‍❤️?‍💋‍👨🏾|👨🏽‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👨🏽|👩🏾‍❤️?‍💋‍👨🏼|👩🏾‍❤️?‍💋‍👨🏻|👨🏾‍❤️?‍💋‍👨🏻|👨🏾‍❤️?‍💋‍👨🏼|👨🏾‍❤️?‍💋‍👨🏽|👨🏾‍❤️?‍💋‍👨🏾|👨🏾‍❤️?‍💋‍👨🏿|👩🏽‍❤️?‍💋‍👩🏿|👩🏿‍❤️?‍💋‍👩🏽|👩🏿‍❤️?‍💋‍👩🏼|👩🏿‍❤️?‍💋‍👩🏻|👩🏿‍❤️?‍💋‍👨🏿|👩🏿‍❤️?‍💋‍👨🏾|👩🏿‍❤️?‍💋‍👨🏽|👩🏿‍❤️?‍💋‍👨🏼|👩🏿‍❤️?‍💋‍👨🏻|👨🏼‍❤️?‍💋‍👨🏻|👨🏼‍❤️?‍💋‍👨🏼|👨🏼‍❤️?‍💋‍👨🏽|👨🏼‍❤️?‍💋‍👨🏾|👨🏼‍❤️?‍💋‍👨🏿|👩🏾‍❤️?‍💋‍👩🏿|👩🏾‍❤️?‍💋‍👩🏾|👩🏾‍❤️?‍💋‍👩🏽|👩🏾‍❤️?‍💋‍👩🏼|👩🏼‍❤️?‍💋‍👩🏼|👩🏼‍❤️?‍💋‍👩🏻|👩🏼‍❤️?‍💋‍👨🏿|👩🏼‍❤️?‍💋‍👨🏾|👩🏼‍❤️?‍💋‍👨🏽|👩🏼‍❤️?‍💋‍👨🏼|👩🏼‍❤️?‍💋‍👨🏻|👩🏻‍❤️?‍💋‍👨🏻|👩🏻‍❤️?‍💋‍👨🏼|👩🏻‍❤️?‍💋‍👨🏽|👩🏻‍❤️?‍💋‍👨🏾|👩🏻‍❤️?‍💋‍👨🏿|👩🏻‍❤️?‍💋‍👩🏻|👩🏻‍❤️?‍💋‍👩🏼|👩🏻‍❤️?‍💋‍👩🏽|👩🏻‍❤️?‍💋‍👩🏾|👩🏻‍❤️?‍💋‍👩🏿|👩🏽‍❤️?‍💋‍👩🏾|👩🏽‍❤️?‍💋‍👩🏽|👩🏽‍❤️?‍💋‍👩🏼|👩🏽‍❤️?‍💋‍👩🏻|👩🏽‍❤️?‍💋‍👨🏿|👩🏽‍❤️?‍💋‍👨🏾|👩🏽‍❤️?‍💋‍👨🏽|👩🏽‍❤️?‍💋‍👨🏼|👩🏽‍❤️?‍💋‍👨🏻|👨🏿‍❤️?‍💋‍👨🏻|👨🏿‍❤️?‍💋‍👨🏼|👨🏿‍❤️?‍💋‍👨🏽|👨🏿‍❤️?‍💋‍👨🏾|👨🏿‍❤️?‍💋‍👨🏿|👩🏼‍❤️?‍💋‍👩🏿|👩🏼‍❤️?‍💋‍👩🏾|👨🏻‍❤️?‍💋‍👨🏼|👨🏻‍❤️?‍💋‍👨🏻|🧑🏼‍❤️?‍💋‍🧑🏻|🧑🏼‍❤️?‍💋‍🧑🏽|🧑🏼‍❤️?‍💋‍🧑🏾|🧑🏼‍❤️?‍💋‍🧑🏿|🧑🏽‍❤️?‍💋‍🧑🏻|🧑🏽‍❤️?‍💋‍🧑🏼|🧑🏽‍❤️?‍💋‍🧑🏾|🧑🏽‍❤️?‍💋‍🧑🏿|🧑🏾‍❤️?‍💋‍🧑🏻|🧑🏾‍❤️?‍💋‍🧑🏼|🧑🏾‍❤️?‍💋‍🧑🏽|🧑🏾‍❤️?‍💋‍🧑🏿|🧑🏿‍❤️?‍💋‍🧑🏾|🧑🏿‍❤️?‍💋‍🧑🏽|🧑🏿‍❤️?‍💋‍🧑🏻|🧑🏿‍❤️?‍💋‍🧑🏼|👩🏼‍❤️?‍💋‍👩🏽|👩🏿‍❤️?‍💋‍👩🏾|👩🏿‍❤️?‍💋‍👩🏿|🧑🏻‍❤️?‍💋‍🧑🏼|🧑🏻‍❤️?‍💋‍🧑🏽|🧑🏻‍❤️?‍💋‍🧑🏾|🧑🏻‍❤️?‍💋‍🧑🏿|👨🏻‍❤️?‍💋‍👨🏿|👨🏻‍❤️?‍💋‍👨🏾|👨🏻‍❤️?‍💋‍👨🏽|👩🏽‍❤️?‍👩🏻|👩🏽‍❤️?‍👨🏿|👩🏽‍❤️?‍👨🏾|👩🏽‍❤️?‍👨🏽|👩🏽‍❤️?‍👨🏼|👩🏽‍❤️?‍👨🏻|🧑🏿‍❤️?‍🧑🏾|🚶🏿‍♀️?‍➡️?|🚶🏾‍♂️?‍➡️?|🚶🏾‍♀️?‍➡️?|🏃🏿‍♂️?‍➡️?|👩🏽‍❤️?‍👩🏼|👩🏽‍❤️?‍👩🏽|👩🏽‍❤️?‍👩🏾|🚶🏿‍♂️?‍➡️?|🧑🏿‍❤️?‍🧑🏽|🧑🏿‍❤️?‍🧑🏼|🧑🏿‍❤️?‍🧑🏻|🏃🏻‍♂️?‍➡️?|🏃🏻‍♀️?‍➡️?|👩🏼‍❤️?‍👨🏻|👩🏼‍❤️?‍👨🏼|👩🏼‍❤️?‍👨🏽|🏃🏼‍♀️?‍➡️?|🏃🏼‍♂️?‍➡️?|👩🏼‍❤️?‍👨🏾|🏃🏽‍♀️?‍➡️?|🏃🏽‍♂️?‍➡️?|🏃🏾‍♀️?‍➡️?|👩🏼‍❤️?‍👨🏿|👩🏼‍❤️?‍👩🏻|👩🏼‍❤️?‍👩🏼|👩🏼‍❤️?‍👩🏽|🏃🏾‍♂️?‍➡️?|🏃🏿‍♀️?‍➡️?|👩🏼‍❤️?‍👩🏾|👩🏼‍❤️?‍👩🏿|🚶🏻‍♀️?‍➡️?|🚶🏻‍♂️?‍➡️?|🚶🏼‍♀️?‍➡️?|🚶🏼‍♂️?‍➡️?|🚶🏽‍♀️?‍➡️?|🚶🏽‍♂️?‍➡️?|👩🏽‍❤️?‍👩🏿|👩🏾‍❤️?‍👩🏻|👩🏾‍❤️?‍👩🏼|👩🏾‍❤️?‍👩🏽|👩🏾‍❤️?‍👩🏾|👩🏾‍❤️?‍👩🏿|🧑🏼‍❤️?‍🧑🏿|🧑🏼‍❤️?‍🧑🏾|🧑🏼‍❤️?‍🧑🏽|🧑🏼‍❤️?‍🧑🏻|🧑🏻‍❤️?‍🧑🏿|👩🏿‍❤️?‍👨🏻|👩🏿‍❤️?‍👨🏼|👩🏿‍❤️?‍👨🏽|👩🏿‍❤️?‍👨🏾|👩🏿‍❤️?‍👨🏿|👩🏿‍❤️?‍👩🏻|👩🏿‍❤️?‍👩🏼|👩🏿‍❤️?‍👩🏽|👩🏿‍❤️?‍👩🏾|👩🏿‍❤️?‍👩🏿|🧑🏻‍❤️?‍🧑🏾|🧑🏻‍❤️?‍🧑🏽|🧑🏻‍❤️?‍🧑🏼|🧑🏾‍❤️?‍🧑🏿|🧑🏾‍❤️?‍🧑🏽|🧑🏾‍❤️?‍🧑🏼|🧑🏾‍❤️?‍🧑🏻|🧎🏿‍♂️?‍➡️?|🧎🏿‍♀️?‍➡️?|🧎🏾‍♂️?‍➡️?|🧎🏾‍♀️?‍➡️?|🧎🏽‍♂️?‍➡️?|🧎🏽‍♀️?‍➡️?|🧑🏽‍❤️?‍🧑🏿|🧑🏽‍❤️?‍🧑🏾|🧑🏽‍❤️?‍🧑🏼|🧑🏽‍❤️?‍🧑🏻|🧎🏼‍♂️?‍➡️?|🧎🏼‍♀️?‍➡️?|🧎🏻‍♂️?‍➡️?|🧎🏻‍♀️?‍➡️?|👩🏾‍❤️?‍👨🏻|👩🏾‍❤️?‍👨🏼|👩🏾‍❤️?‍👨🏽|👩🏾‍❤️?‍👨🏾|👩🏾‍❤️?‍👨🏿|👩🏻‍❤️?‍👩🏻|👩🏻‍❤️?‍👨🏿|👩🏻‍❤️?‍👨🏾|👩🏻‍❤️?‍👨🏽|👩🏻‍❤️?‍👨🏼|👩🏻‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏾|👨🏼‍❤️?‍👨🏻|👩‍❤️?‍💋‍👩|👩‍❤️?‍💋‍👨|👨🏼‍❤️?‍👨🏼|👨🏼‍❤️?‍👨🏽|👨🏼‍❤️?‍👨🏾|👨🏼‍❤️?‍👨🏿|👨🏻‍❤️?‍👨🏽|👨🏻‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏽|👨‍❤️?‍💋‍👨|👨🏾‍❤️?‍👨🏼|👨🏾‍❤️?‍👨🏽|👨🏿‍❤️?‍👨🏿|👨🏾‍❤️?‍👨🏾|👨🏿‍❤️?‍👨🏾|👨🏾‍❤️?‍👨🏿|👨🏿‍❤️?‍👨🏽|👨🏾‍❤️?‍👨🏻|👨🏿‍❤️?‍👨🏼|👨🏻‍❤️?‍👨🏿|👨🏿‍❤️?‍👨🏻|👨🏽‍❤️?‍👨🏿|👨🏽‍❤️?‍👨🏾|👨🏽‍❤️?‍👨🏻|👩🏻‍❤️?‍👩🏿|👩🏻‍❤️?‍👩🏾|👩🏻‍❤️?‍👩🏽|👩🏻‍❤️?‍👩🏼|🧑🏼‍🐰‍🧑🏿|👨‍👨‍👧‍👦|🧑🏼‍🐰‍🧑🏾|🧑🏼‍🐰‍🧑🏽|🧑🏼‍🐰‍🧑🏻|🧑🏽‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏻|🧑🏼‍🫯‍🧑🏽|🧑🏼‍🫯‍🧑🏾|🧑🏾‍🤝‍🧑🏻|🧑🏾‍🤝‍🧑🏼|🧑🏾‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏾‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏿|🧑🏽‍🐰‍🧑🏻|🧑🏽‍🐰‍🧑🏼|🧑🏽‍🐰‍🧑🏾|🧑🏽‍🐰‍🧑🏿|👨‍👨‍👦‍👦|🧑🏽‍🫯‍🧑🏻|👨‍👩‍👦‍👦|👨‍👩‍👧‍👦|👨‍👩‍👧‍👧|🧑🏻‍🤝‍🧑🏿|🧑🏻‍🤝‍🧑🏾|🧑🏻‍🤝‍🧑🏽|🧑🏻‍🤝‍🧑🏼|🧑🏻‍🤝‍🧑🏻|👨🏻‍🐰‍👨🏼|👨🏻‍🐰‍👨🏽|👨🏻‍🐰‍👨🏾|👨🏻‍🐰‍👨🏿|👨🏻‍🤝‍👨🏼|👨🏻‍🤝‍👨🏽|👨🏻‍🤝‍👨🏾|🧑‍🧑‍🧒‍🧒|👩🏿‍🫯‍👩🏾|👩🏿‍🫯‍👩🏽|🧑🏽‍🤝‍🧑🏾|🧑🏽‍🤝‍🧑🏽|🧑🏽‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏻|🧑🏻‍🫯‍🧑🏿|🧑🏻‍🫯‍🧑🏾|🧑🏻‍🫯‍🧑🏽|🧑🏻‍🫯‍🧑🏼|👨‍👨‍👧‍👧|🧑🏻‍🐰‍🧑🏿|🧑🏻‍🐰‍🧑🏾|🧑🏻‍🐰‍🧑🏽|🧑🏼‍🤝‍🧑🏿|🧑🏼‍🤝‍🧑🏾|🧑🏼‍🤝‍🧑🏽|🧑🏼‍🤝‍🧑🏼|🧑🏼‍🤝‍🧑🏻|🧑🏻‍🐰‍🧑🏼|🧑🏽‍🦼‍➡️?|🧑🏽‍🦯‍➡️?|🧑🏼‍🦽‍➡️?|🧑🏼‍🦼‍➡️?|🧑🏼‍🦯‍➡️?|🧑🏻‍🦽‍➡️?|🧑🏻‍🦼‍➡️?|🧑🏻‍🦯‍➡️?|👩🏿‍🦽‍➡️?|👩🏿‍🦼‍➡️?|👩🏿‍🦯‍➡️?|👩🏾‍🦽‍➡️?|👩🏾‍🦼‍➡️?|👩🏾‍🦯‍➡️?|👩🏽‍🦽‍➡️?|👩🏽‍🦼‍➡️?|👩🏽‍🦯‍➡️?|👩🏼‍🦽‍➡️?|🧑🏿‍🫯‍🧑🏾|🧑🏿‍🫯‍🧑🏽|🧑🏿‍🫯‍🧑🏼|🧑🏿‍🫯‍🧑🏻|🧑🏿‍🐰‍🧑🏾|🧑🏿‍🐰‍🧑🏽|🧑🏿‍🐰‍🧑🏼|🧑🏿‍🐰‍🧑🏻|🧑🏾‍🫯‍🧑🏿|🏃‍♂️?‍➡️?|🏃‍♀️?‍➡️?|🧑🏿‍🦽‍➡️?|🧑🏿‍🦼‍➡️?|🧑🏿‍🦯‍➡️?|🧑🏾‍🦽‍➡️?|🧑🏾‍🦼‍➡️?|🧑🏾‍🦯‍➡️?|🧑🏽‍🦽‍➡️?|👩🏼‍🦼‍➡️?|👨🏻‍🦼‍➡️?|🚶‍♂️?‍➡️?|👨🏻‍🦯‍➡️?|🧑🏾‍🫯‍🧑🏽|🧑🏾‍🫯‍🧑🏼|🧑🏾‍🫯‍🧑🏻|🧑🏿‍🤝‍🧑🏿|🧑🏾‍🐰‍🧑🏿|🧑🏿‍🤝‍🧑🏾|🧑🏾‍🐰‍🧑🏽|🧑🏿‍🤝‍🧑🏽|🧑🏾‍🐰‍🧑🏼|🧑🏿‍🤝‍🧑🏼|🧑🏾‍🐰‍🧑🏻|🧑🏿‍🤝‍🧑🏻|🧑🏽‍🫯‍🧑🏿|🧑🏽‍🫯‍🧑🏾|🧑🏽‍🫯‍🧑🏼|👩🏼‍🦯‍➡️?|👩🏻‍🦽‍➡️?|👩🏻‍🦼‍➡️?|👩🏻‍🦯‍➡️?|👨🏿‍🦽‍➡️?|👨🏿‍🦼‍➡️?|👨🏿‍🦯‍➡️?|👨🏾‍🦽‍➡️?|👨🏾‍🦼‍➡️?|👨🏾‍🦯‍➡️?|👨🏽‍🦽‍➡️?|👨🏽‍🦼‍➡️?|👨🏽‍🦯‍➡️?|👨🏼‍🦽‍➡️?|👨🏼‍🦼‍➡️?|👨🏼‍🦯‍➡️?|👨🏻‍🦽‍➡️?|🚶‍♀️?‍➡️?|👩🏿‍🫯‍👩🏼|👨🏾‍🫯‍👨🏻|👨🏾‍🫯‍👨🏼|👨🏾‍🫯‍👨🏽|👨🏾‍🫯‍👨🏿|👨🏿‍🐰‍👨🏻|👨🏿‍🐰‍👨🏼|👨🏿‍🐰‍👨🏽|👨🏿‍🐰‍👨🏾|👨🏿‍🤝‍👨🏻|👨🏿‍🤝‍👨🏼|👨🏿‍🤝‍👨🏽|👨🏿‍🤝‍👨🏾|👨🏿‍🫯‍👨🏻|👩🏼‍🫯‍👩🏿|👩🏼‍🫯‍👩🏾|👩🏼‍🫯‍👩🏽|👩🏼‍🫯‍👩🏻|👨🏾‍🐰‍👨🏻|👩🏽‍🤝‍👩🏻|👨🏾‍🐰‍👨🏼|👩🏽‍🤝‍👨🏿|👨🏾‍🐰‍👨🏽|👩🏽‍🤝‍👨🏾|👨🏾‍🐰‍👨🏿|👩🏽‍🤝‍👨🏼|👨🏾‍🤝‍👨🏻|👩🏽‍🤝‍👨🏻|👨🏾‍🤝‍👨🏼|👩🏽‍🐰‍👩🏿|👩🏽‍🐰‍👩🏾|👩🏽‍🐰‍👩🏼|👩🏽‍🐰‍👩🏻|👨🏾‍🤝‍👨🏽|👨🏾‍🤝‍👨🏿|👩‍👩‍👧‍👧|👩🏻‍🫯‍👩🏿|👩🏻‍🫯‍👩🏾|👩🏻‍🫯‍👩🏽|👩🏻‍🫯‍👩🏼|👩🏻‍🤝‍👩🏿|👩🏻‍🤝‍👩🏾|👩🏻‍🤝‍👩🏽|👩🏻‍🤝‍👩🏼|👩🏻‍🤝‍👨🏿|👩🏻‍🤝‍👨🏾|👩🏻‍🤝‍👨🏽|👩🏻‍🤝‍👨🏼|👩🏻‍🐰‍👩🏿|👩🏻‍🐰‍👩🏾|👩🏻‍🐰‍👩🏽|👩🏻‍🐰‍👩🏼|👩🏼‍🤝‍👩🏿|👩🏼‍🤝‍👩🏾|👩🏼‍🤝‍👩🏽|👩🏼‍🤝‍👩🏻|👩🏼‍🤝‍👨🏿|👩🏼‍🤝‍👨🏾|👩🏼‍🤝‍👨🏽|👩🏼‍🤝‍👨🏻|👩🏼‍🐰‍👩🏿|👩🏼‍🐰‍👩🏾|👩🏼‍🐰‍👩🏽|👩🏼‍🐰‍👩🏻|👨🏿‍🫯‍👨🏼|👨🏿‍🫯‍👨🏽|👨🏿‍🫯‍👨🏾|👩‍👩‍👦‍👦|👨🏼‍🐰‍👨🏻|👨🏼‍🐰‍👨🏽|👨🏼‍🐰‍👨🏾|👨🏼‍🐰‍👨🏿|👨🏼‍🤝‍👨🏻|👨🏼‍🤝‍👨🏽|👨🏼‍🤝‍👨🏾|👨🏼‍🤝‍👨🏿|👨🏼‍🫯‍👨🏻|👨🏼‍🫯‍👨🏽|👩🏾‍🫯‍👩🏿|👩🏾‍🫯‍👩🏽|👩🏾‍🫯‍👩🏼|👩🏾‍🫯‍👩🏻|👩🏾‍🤝‍👩🏿|👩🏾‍🤝‍👩🏽|👩🏾‍🤝‍👩🏼|👩🏾‍🤝‍👩🏻|👩🏿‍🫯‍👩🏻|👩🏿‍🤝‍👩🏾|👩🏿‍🤝‍👩🏽|👩🏿‍🤝‍👩🏼|👩🏿‍🤝‍👩🏻|👩🏿‍🤝‍👨🏾|👩🏿‍🤝‍👨🏽|👩🏿‍🤝‍👨🏼|👩🏿‍🤝‍👨🏻|👩🏿‍🐰‍👩🏾|👩🏿‍🐰‍👩🏽|👩🏿‍🐰‍👩🏼|👩🏿‍🐰‍👩🏻|👨🏻‍🤝‍👨🏿|👨🏻‍🫯‍👨🏼|👨🏻‍🫯‍👨🏽|👨🏻‍🫯‍👨🏾|👨🏻‍🫯‍👨🏿|👩🏾‍🤝‍👨🏿|👨🏽‍🐰‍👨🏿|👨🏽‍🤝‍👨🏻|👨🏽‍🤝‍👨🏼|👨🏽‍🤝‍👨🏾|👨🏽‍🤝‍👨🏿|👨🏽‍🫯‍👨🏻|👨🏽‍🫯‍👨🏼|👨🏽‍🫯‍👨🏾|👨🏽‍🫯‍👨🏿|👩🏽‍🫯‍👩🏿|🧎‍♀️?‍➡️?|👩🏽‍🫯‍👩🏾|🧎‍♂️?‍➡️?|👩🏽‍🫯‍👩🏼|👩🏽‍🫯‍👩🏻|👩🏽‍🤝‍👩🏿|👩🏽‍🤝‍👩🏾|👩🏽‍🤝‍👩🏼|👩🏾‍🤝‍👨🏽|👩🏾‍🤝‍👨🏼|👩🏾‍🤝‍👨🏻|👩🏾‍🐰‍👩🏿|👩🏾‍🐰‍👩🏽|👩🏾‍🐰‍👩🏼|👩🏾‍🐰‍👩🏻|👨🏼‍🫯‍👨🏾|👨🏼‍🫯‍👨🏿|👨🏽‍🐰‍👨🏻|👨🏽‍🐰‍👨🏼|👨🏽‍🐰‍👨🏾|👩‍👩‍👧‍👦|👨‍🦽‍➡️?|🧑‍🦯‍➡️?|👨‍🦼‍➡️?|🧑‍🦼‍➡️?|👨‍🦯‍➡️?|🧑‍🦽‍➡️?|👩‍❤️?‍👩|👩‍❤️?‍👨|👩‍🦯‍➡️?|👨‍❤️?‍👨|👩‍🦼‍➡️?|👩‍🦽‍➡️?|🧖🏾‍♀️?|🧖🏽‍♂️?|🧖🏽‍♀️?|🧖🏼‍♂️?|🧖🏼‍♀️?|🧖🏻‍♂️?|🧖🏻‍♀️?|👩🏾‍✈️?|👩🏾‍⚖️?|👩🏾‍⚕️?|🧔🏿‍♂️?|🧔🏿‍♀️?|🧔🏾‍♂️?|🚴🏻‍♀️?|🧔🏾‍♀️?|🧔🏽‍♂️?|🧔🏽‍♀️?|🧔🏼‍♂️?|🧔🏼‍♀️?|🧔🏻‍♂️?|🧔🏻‍♀️?|🧘🏻‍♂️?|🧘🏻‍♀️?|🧗🏿‍♂️?|🧗🏿‍♀️?|🧗🏾‍♂️?|🧗🏾‍♀️?|🧗🏽‍♂️?|🧗🏽‍♀️?|👩🏿‍✈️?|👩🏿‍⚖️?|👩🏿‍⚕️?|🚣🏾‍♂️?|🧗🏼‍♂️?|🚣🏿‍♀️?|🧗🏼‍♀️?|🚣🏿‍♂️?|🧗🏻‍♂️?|🧗🏻‍♀️?|🧖🏿‍♂️?|🧖🏿‍♀️?|🧖🏾‍♂️?|🧎🏽‍♀️?|🧎🏼‍♂️?|🧎🏼‍♀️?|🧎🏻‍♂️?|🧎🏻‍♀️?|👩🏼‍✈️?|👩🏼‍⚖️?|👩🏼‍⚕️?|🚴🏽‍♀️?|🚴🏽‍♂️?|🧍🏿‍♂️?|🚴🏾‍♀️?|🧍🏿‍♀️?|🧍🏾‍♂️?|🧍🏾‍♀️?|🧍🏽‍♂️?|🧍🏽‍♀️?|🧍🏼‍♂️?|🧍🏼‍♀️?|🧍🏻‍♂️?|🧍🏻‍♀️?|🧏🏿‍♂️?|🧏🏿‍♀️?|🧏🏾‍♂️?|🧏🏾‍♀️?|🧏🏽‍♂️?|🧏🏽‍♀️?|👩🏽‍✈️?|👩🏽‍⚖️?|👩🏽‍⚕️?|🚴🏻‍♂️?|🧏🏼‍♂️?|🚴🏼‍♀️?|🧏🏼‍♀️?|🚴🏼‍♂️?|🧏🏻‍♂️?|🧏🏻‍♀️?|🧎🏿‍♂️?|🧎🏿‍♀️?|🧎🏾‍♂️?|🧎🏾‍♀️?|🧎🏽‍♂️?|🧑🏼‍⚕️?|👩‍👧‍👧|👩‍👩‍👦|🧜🏻‍♀️?|👩‍👩‍👧|🚣🏻‍♀️?|🧛🏿‍♂️?|🧛🏿‍♀️?|🧛🏾‍♂️?|🧛🏾‍♀️?|🧛🏽‍♂️?|🧛🏽‍♀️?|🧛🏼‍♂️?|🧛🏼‍♀️?|🧛🏻‍♂️?|🧛🏻‍♀️?|🧚🏿‍♂️?|🧚🏿‍♀️?|🧑🏻‍✈️?|🧑🏻‍⚖️?|🧑🏻‍⚕️?|🙎🏾‍♂️?|🧝🏽‍♀️?|🙎🏿‍♀️?|🧝🏼‍♂️?|🙎🏿‍♂️?|🧝🏼‍♀️?|🧝🏻‍♂️?|🧝🏻‍♀️?|🧜🏿‍♂️?|🧜🏿‍♀️?|🧜🏾‍♂️?|🧜🏾‍♀️?|🧜🏽‍♂️?|🧜🏽‍♀️?|🧜🏼‍♂️?|🧜🏼‍♀️?|🧜🏻‍♂️?|👩‍👦‍👦|👩‍👧‍👦|🧑🏼‍✈️?|🧑🏼‍⚖️?|🧎🏿‍➡️?|🧎🏾‍➡️?|🧎🏽‍➡️?|🧎🏼‍➡️?|🧎🏻‍➡️?|🚶🏿‍➡️?|🚶🏾‍➡️?|🚶🏽‍➡️?|🚶🏼‍➡️?|🚶🏻‍➡️?|🧘🏿‍♂️?|🚣🏽‍♀️?|🧘🏿‍♀️?|🚣🏽‍♂️?|🧘🏾‍♂️?|🚣🏾‍♀️?|🧘🏾‍♀️?|🧘🏽‍♂️?|🧘🏽‍♀️?|🧘🏼‍♂️?|🧘🏼‍♀️?|🚣🏻‍♂️?|🧚🏾‍♂️?|🚣🏼‍♀️?|🧚🏾‍♀️?|🚣🏼‍♂️?|🧚🏽‍♂️?|🧚🏽‍♀️?|🧚🏼‍♂️?|🧚🏼‍♀️?|🧚🏻‍♂️?|🧚🏻‍♀️?|🧙🏿‍♂️?|🧙🏿‍♀️?|🧙🏾‍♂️?|🧙🏾‍♀️?|🧙🏽‍♂️?|🧙🏽‍♀️?|🧙🏼‍♂️?|🧙🏼‍♀️?|🧙🏻‍♂️?|🧙🏻‍♀️?|👨🏼‍✈️?|👨🏼‍⚖️?|👨🏼‍⚕️?|🤷🏼‍♀️?|🤷🏻‍♂️?|🤷🏻‍♀️?|🚶🏻‍♀️?|🤵🏿‍♂️?|🤵🏿‍♀️?|🤵🏾‍♂️?|🤵🏾‍♀️?|🤵🏽‍♂️?|🤵🏽‍♀️?|🤵🏼‍♂️?|🤵🏼‍♀️?|🤵🏻‍♂️?|🤵🏻‍♀️?|🤦🏿‍♂️?|🤦🏿‍♀️?|👨🏻‍✈️?|👨🏻‍⚖️?|👨🏽‍✈️?|👨🏽‍⚖️?|👨🏽‍⚕️?|🚵🏾‍♂️?|🤸🏾‍♂️?|🚵🏿‍♀️?|🤸🏾‍♀️?|🚵🏿‍♂️?|🤸🏽‍♂️?|🤸🏽‍♀️?|🤸🏼‍♂️?|🤸🏼‍♀️?|🤸🏻‍♂️?|🤸🏻‍♀️?|🤷🏿‍♂️?|🤷🏿‍♀️?|🤷🏾‍♂️?|🤷🏾‍♀️?|🤷🏽‍♂️?|🤷🏽‍♀️?|🤷🏼‍♂️?|🫱🏻‍🫲🏿|🏃🏿‍➡️?|🏃🏾‍➡️?|🏃🏽‍➡️?|🏃🏼‍➡️?|🏃🏻‍➡️?|🫱🏼‍🫲🏻|🫱🏿‍🫲🏾|🫱🏿‍🫲🏽|🫱🏿‍🫲🏼|🫱🏿‍🫲🏻|🫱🏾‍🫲🏿|🫱🏾‍🫲🏽|🫱🏾‍🫲🏼|🫱🏾‍🫲🏻|🫱🏽‍🫲🏿|🫱🏽‍🫲🏾|🫱🏽‍🫲🏼|🫱🏽‍🫲🏻|🫱🏼‍🫲🏿|🫱🏼‍🫲🏾|👨🏻‍⚕️?|🚶🏻‍♂️?|🤦🏾‍♂️?|🚶🏼‍♀️?|🤦🏾‍♀️?|🚶🏼‍♂️?|🤦🏽‍♂️?|🤦🏽‍♀️?|🤦🏼‍♂️?|🤦🏼‍♀️?|🤦🏻‍♂️?|🤦🏻‍♀️?|🚶🏿‍♂️?|🚶🏿‍♀️?|🚶🏾‍♂️?|🚶🏾‍♀️?|🚶🏽‍♂️?|🚶🏽‍♀️?|🫱🏻‍🫲🏼|🫱🏻‍🫲🏽|🫱🏻‍🫲🏾|🦸🏽‍♀️?|🦸🏼‍♂️?|🦸🏼‍♀️?|🦸🏻‍♂️?|🦸🏻‍♀️?|🤾🏿‍♂️?|🤾🏿‍♀️?|🤾🏾‍♂️?|🤾🏾‍♀️?|🚵🏻‍♀️?|🤾🏽‍♂️?|🤾🏽‍♀️?|🤾🏼‍♂️?|🤾🏼‍♀️?|🤾🏻‍♂️?|🤾🏻‍♀️?|🤽🏿‍♂️?|🤽🏿‍♀️?|🤽🏾‍♂️?|🤽🏾‍♀️?|🤽🏽‍♂️?|🦹🏿‍♂️?|🦹🏿‍♀️?|🦹🏾‍♂️?|🦹🏾‍♀️?|👩🏻‍✈️?|👩🏻‍⚖️?|👩🏻‍⚕️?|🚴🏾‍♂️?|🦹🏽‍♂️?|🚴🏿‍♀️?|🦹🏽‍♀️?|🚴🏿‍♂️?|🦹🏼‍♂️?|🦹🏼‍♀️?|🦹🏻‍♂️?|🦹🏻‍♀️?|🦸🏿‍♂️?|🦸🏿‍♀️?|🦸🏾‍♂️?|🦸🏾‍♀️?|🦸🏽‍♂️?|👨🏾‍✈️?|👨🏾‍⚖️?|👨🏾‍⚕️?|🚵🏽‍♀️?|🧑‍🤝‍🧑|🚵🏽‍♂️?|🧑‍🧑‍🧒|🚵🏾‍♀️?|🤹🏿‍♂️?|🧑‍🧒‍🧒|🤹🏿‍♀️?|🤹🏾‍♂️?|🤹🏾‍♀️?|🤹🏽‍♂️?|🤹🏽‍♀️?|🤹🏼‍♂️?|🤹🏼‍♀️?|🤹🏻‍♂️?|🤹🏻‍♀️?|🤸🏿‍♂️?|🤸🏿‍♀️?|🤽🏽‍♀️?|🤽🏼‍♂️?|👨🏿‍✈️?|👨🏿‍⚖️?|👨🏿‍⚕️?|🚵🏻‍♂️?|🤽🏼‍♀️?|🚵🏼‍♀️?|🤽🏻‍♂️?|🚵🏼‍♂️?|🤽🏻‍♀️?|🤼🏿‍♂️?|🤼🏿‍♀️?|🤼🏾‍♂️?|🤼🏾‍♀️?|🤼🏽‍♂️?|🤼🏽‍♀️?|🤼🏼‍♂️?|🤼🏼‍♀️?|🤼🏻‍♂️?|🤼🏻‍♀️?|👷🏽‍♀️?|👷🏼‍♂️?|👷🏼‍♀️?|👷🏻‍♂️?|👷🏻‍♀️?|👳🏿‍♂️?|👳🏿‍♀️?|👳🏾‍♂️?|👳🏾‍♀️?|👳🏽‍♂️?|👳🏽‍♀️?|👳🏼‍♂️?|👳🏼‍♀️?|👳🏻‍♂️?|👳🏻‍♀️?|🏳️?‍⚧️?|👱🏿‍♂️?|👱🏿‍♀️?|👱🏾‍♂️?|👱🏾‍♀️?|👱🏽‍♂️?|💂🏽‍♀️?|💂🏼‍♂️?|💂🏼‍♀️?|💂🏻‍♂️?|💂🏻‍♀️?|💁🏿‍♂️?|💁🏿‍♀️?|💁🏾‍♂️?|💁🏾‍♀️?|💁🏽‍♂️?|💁🏽‍♀️?|💁🏼‍♂️?|💁🏼‍♀️?|💁🏻‍♂️?|💁🏻‍♀️?|👁️?‍🗨️?|👷🏿‍♂️?|👷🏿‍♀️?|👷🏾‍♂️?|👷🏾‍♀️?|👷🏽‍♂️?|👯🏼‍♂️?|👯🏼‍♀️?|👯🏻‍♂️?|👯🏻‍♀️?|👮🏿‍♂️?|👮🏿‍♀️?|👮🏾‍♂️?|👮🏾‍♀️?|👮🏽‍♂️?|👮🏽‍♀️?|👮🏼‍♂️?|👮🏼‍♀️?|👮🏻‍♂️?|👮🏻‍♀️?|🏌️?‍♂️?|🏌️?‍♀️?|🏌🏿‍♂️?|🏌🏿‍♀️?|🏌🏾‍♂️?|🏌🏾‍♀️?|🏌🏽‍♂️?|👱🏽‍♀️?|👱🏼‍♂️?|👱🏼‍♀️?|👱🏻‍♂️?|👱🏻‍♀️?|👰🏿‍♂️?|👰🏿‍♀️?|👰🏾‍♂️?|👰🏾‍♀️?|👰🏽‍♂️?|👰🏽‍♀️?|👰🏼‍♂️?|👰🏼‍♀️?|👰🏻‍♂️?|👰🏻‍♀️?|👯🏿‍♂️?|👯🏿‍♀️?|👯🏾‍♂️?|👯🏾‍♀️?|👯🏽‍♂️?|👯🏽‍♀️?|👨‍👧‍👦|🙆🏿‍♂️?|🙆🏿‍♀️?|🙆🏾‍♂️?|🙆🏾‍♀️?|🙆🏽‍♂️?|🙆🏽‍♀️?|🙆🏼‍♂️?|🙆🏼‍♀️?|🙆🏻‍♂️?|🙆🏻‍♀️?|👨‍👧‍👧|👨‍👨‍👦|🙅🏿‍♂️?|🙅🏿‍♀️?|🙅🏾‍♂️?|🙅🏾‍♀️?|🙅🏽‍♂️?|🙅🏽‍♀️?|🙅🏼‍♂️?|🙅🏼‍♀️?|🙋🏿‍♂️?|🙋🏿‍♀️?|🙋🏾‍♂️?|🙋🏾‍♀️?|🙋🏽‍♂️?|🙋🏽‍♀️?|🙋🏼‍♂️?|🙋🏼‍♀️?|🙋🏻‍♂️?|🙋🏻‍♀️?|🙇🏿‍♂️?|🙇🏿‍♀️?|🙇🏾‍♂️?|🙇🏾‍♀️?|🙇🏽‍♂️?|🙇🏽‍♀️?|🙇🏼‍♂️?|🙇🏼‍♀️?|🙇🏻‍♂️?|🙇🏻‍♀️?|👨‍👦‍👦|💇🏼‍♂️?|💇🏼‍♀️?|💇🏻‍♂️?|💇🏻‍♀️?|💆🏿‍♂️?|💆🏿‍♀️?|💆🏾‍♂️?|💆🏾‍♀️?|💆🏽‍♂️?|💆🏽‍♀️?|💆🏼‍♂️?|💆🏼‍♀️?|💆🏻‍♂️?|💆🏻‍♀️?|👨‍👩‍👦|👨‍👩‍👧|💂🏿‍♂️?|💂🏿‍♀️?|💂🏾‍♂️?|💂🏾‍♀️?|💂🏽‍♂️?|🙅🏻‍♂️?|🙅🏻‍♀️?|👨‍👨‍👧|🕵️?‍♂️?|🕵️?‍♀️?|🕵🏿‍♂️?|🕵🏿‍♀️?|🕵🏾‍♂️?|🕵🏾‍♀️?|🕵🏽‍♂️?|🕵🏽‍♀️?|🕵🏼‍♂️?|🕵🏼‍♀️?|🕵🏻‍♂️?|🕵🏻‍♀️?|💇🏿‍♂️?|💇🏿‍♀️?|💇🏾‍♂️?|💇🏾‍♀️?|💇🏽‍♂️?|💇🏽‍♀️?|🏌🏽‍♀️?|⛹🏾‍♀️?|⛹🏾‍♂️?|⛹🏿‍♀️?|⛹🏿‍♂️?|⛹️?‍♀️?|⛹️?‍♂️?|🙍🏿‍♂️?|🙍🏿‍♀️?|🏃🏻‍♀️?|🙍🏾‍♂️?|🏃🏻‍♂️?|🙍🏾‍♀️?|🏃🏼‍♀️?|🙍🏽‍♂️?|🏃🏼‍♂️?|🙍🏽‍♀️?|🏃🏽‍♀️?|🙍🏼‍♂️?|🏃🏽‍♂️?|🙍🏼‍♀️?|🏃🏾‍♀️?|🙍🏻‍♂️?|🏃🏾‍♂️?|🙍🏻‍♀️?|🏃🏿‍♀️?|🏃🏿‍♂️?|🏄🏻‍♀️?|🏄🏻‍♂️?|🫱🏼‍🫲🏽|🧑🏽‍⚕️?|🧑🏽‍⚖️?|🧑🏽‍✈️?|🧝🏽‍♂️?|🧝🏾‍♀️?|🧝🏾‍♂️?|🧝🏿‍♀️?|🧝🏿‍♂️?|🙎🏾‍♀️?|🙎🏽‍♂️?|🙎🏽‍♀️?|🧑🏾‍⚕️?|🧑🏾‍⚖️?|🧑🏾‍✈️?|🙎🏼‍♂️?|🙎🏼‍♀️?|🙎🏻‍♂️?|🧑🏿‍⚕️?|🧑🏿‍⚖️?|🧑🏿‍✈️?|🙎🏻‍♀️?|⛹🏻‍♀️?|⛹🏻‍♂️?|⛹🏼‍♀️?|⛹🏼‍♂️?|⛹🏽‍♀️?|⛹🏽‍♂️?|🏊🏻‍♀️?|🏊🏻‍♂️?|🏊🏼‍♀️?|🏊🏼‍♂️?|🏊🏽‍♀️?|🏊🏽‍♂️?|🏊🏾‍♀️?|🏊🏾‍♂️?|🏊🏿‍♀️?|🏊🏿‍♂️?|🏋🏻‍♀️?|🏋🏻‍♂️?|🏋🏼‍♀️?|🏋🏼‍♂️?|🏋🏽‍♀️?|🏋🏽‍♂️?|🏋🏾‍♀️?|🏋🏾‍♂️?|🏋🏿‍♀️?|🏋🏿‍♂️?|🏋️?‍♀️?|🏋️?‍♂️?|🏌🏻‍♀️?|🏌🏻‍♂️?|🏌🏼‍♀️?|🏌🏼‍♂️?|🏄🏿‍♀️?|🏄🏾‍♂️?|🏄🏾‍♀️?|🏄🏽‍♂️?|🏄🏽‍♀️?|🏄🏿‍♂️?|🏄🏼‍♂️?|🏄🏼‍♀️?|🤾‍♂️?|👨🏽‍🦱|👨🏽‍🦲|👨🏽‍🦳|🧜‍♀️?|👨🏾‍🦰|👨🏾‍🦱|👨🏾‍🦲|👨🏾‍🦳|👨🏿‍🦰|👨🏿‍🦱|🧜‍♂️?|🤦‍♂️?|🤷‍♀️?|👩🏼‍🦲|🧑🏽‍🦱|👩🏼‍🦱|🤾‍♀️?|👩🏼‍🦰|👩🏻‍🦳|👩🏻‍🦲|👩🏻‍🦱|👩🏻‍🦰|👨🏿‍🦳|🤵‍♂️?|🤵‍♀️?|🧑🏽‍🩰|👨🏿‍🦲|🧛‍♀️?|🧛‍♂️?|🧖‍♂️?|🧎‍♂️?|🧖‍♀️?|🧑🏾‍🦰|🧑🏽‍🦳|🧑🏽‍🦲|🧝‍♂️?|🧝‍♀️?|🧑🏿‍🩰|🧑🏾‍🩰|🧎‍♀️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|👨🏻‍🦰|👨🏻‍🦱|👨🏻‍🦲|👨🏻‍🦳|👨🏼‍🦰|👨🏼‍🦱|👨🏼‍🦲|🧏‍♀️?|👨🏼‍🦳|🧑🏾‍🦳|👨🏽‍🦰|🧑🏿‍🦰|🧏‍♂️?|❤️?‍🩹|🤦‍♀️?|🧑🏼‍🦰|🧑🏼‍🦱|🤹‍♀️?|🤹‍♂️?|🧑🏼‍🦲|🧍‍♀️?|🧑🏿‍🦱|🧑🏿‍🦲|🧗‍♀️?|🧗‍♂️?|🙂‍↕️?|🙂‍↔️?|🏴‍☠️?|🧔‍♀️?|🧑🏼‍🦳|🧘‍♂️?|🧘‍♀️?|🧔‍♂️?|🤼‍♀️?|🤼‍♂️?|😶‍🌫️?|🧑🏽‍🦰|🐻‍❄️?|🧑🏿‍🦳|⛓️?‍💥|🦹‍♂️?|🦹‍♀️?|🧑🏾‍🦱|🧑🏾‍🦲|🤽‍♀️?|🤽‍♂️?|🏳️?‍🌈|🤷‍♂️?|🦸‍♀️?|🦸‍♂️?|❤️?‍🔥|👩🏼‍🦳|🧚‍♂️?|🧚‍♀️?|👩🏽‍🦰|👩🏽‍🦱|👩🏽‍🦲|👩🏽‍🦳|👩🏾‍🦰|👩🏾‍🦱|🧑🏼‍🩰|🤸‍♀️?|🤸‍♂️?|🧑🏻‍🩰|👩🏾‍🦲|👩🏾‍🦳|👩🏿‍🦰|👩🏿‍🦱|🧙‍♂️?|👩🏿‍🦲|👩🏿‍🦳|🧑🏻‍🦰|🧑🏻‍🦱|🧑🏻‍🦲|🧙‍♀️?|🧍‍♂️?|🧑🏻‍🦳|🚣‍♀️?|🧑🏻‍🦽|🚣‍♂️?|🧑🏻‍🦼|🧑🏻‍🦯|🧑🏻‍🚒|🧑🏻‍🚀|🧑🏻‍🔬|🧑🏻‍🔧|🧑🏻‍💼|🧑🏻‍💻|🧑🏻‍🏭|🧑🏻‍🏫|🧑🏻‍🎨|🧑🏻‍🎤|🧑🏻‍🎓|🧑🏻‍🎄|🧑🏻‍🍼|🧑🏻‍🍳|🧑🏻‍🌾|🧑‍✈️?|🧑‍⚖️?|🧑🏽‍🎄|🧑🏽‍🍼|🧑🏽‍🍳|🧑🏽‍🌾|🧑🏼‍🦽|🧑🏼‍🦼|🧑🏼‍🦯|🧑🏼‍🚒|🧑🏼‍🚀|🧑🏼‍🔬|🧑🏼‍🔧|🧑🏼‍💼|🧑🏼‍💻|🧑🏼‍🏭|🧑🏼‍🏫|🧑🏼‍🎨|🧑🏼‍🎤|🧑🏼‍🎓|🧑🏼‍🎄|🧑🏼‍🍼|🧑🏼‍🍳|🧑🏼‍🌾|👩🏾‍🦯|👩🏾‍🚒|👩🏾‍🚀|👩🏾‍🔬|👩🏾‍🔧|👩🏾‍💼|👩🏾‍💻|👩🏾‍🏭|👩🏾‍🏫|👩🏾‍🎨|👩🏾‍🎤|👩🏾‍🎓|👩🏾‍🍼|👩🏾‍🍳|👩🏾‍🌾|🚴‍♀️?|👩🏽‍🦽|🚴‍♂️?|👩🏽‍🦼|👩🏽‍🦯|👩🏽‍🚒|👩🏽‍🚀|🧑‍⚕️?|🧎‍➡️?|🚶‍➡️?|👩🏿‍🦽|👩🏿‍🦼|👩🏿‍🦯|👩🏿‍🚒|👩🏿‍🚀|👩🏿‍🔬|👩🏿‍🔧|👩🏿‍💼|👩🏿‍💻|👩🏿‍🏭|👩🏿‍🏫|👩🏿‍🎨|👩🏿‍🎤|👩🏿‍🎓|👩🏿‍🍼|👩🏿‍🍳|👩🏿‍🌾|👩🏾‍🦽|👩🏾‍🦼|👰‍♂️?|👰‍♀️?|👯‍♂️?|👯‍♀️?|👮‍♂️?|👮‍♀️?|🏊‍♂️?|🏊‍♀️?|🏄‍♂️?|🏄‍♀️?|🙍‍♀️?|🙍‍♂️?|🏃‍♂️?|🏃‍♀️?|🙎‍♀️?|🧑🏿‍🦽|🙎‍♂️?|🧑🏿‍🦼|🧑🏿‍🦯|🧑🏿‍🚒|🧑🏿‍🚀|🧑🏿‍🔬|🙋‍♂️?|🙋‍♀️?|🙇‍♂️?|🙇‍♀️?|🙆‍♂️?|🙆‍♀️?|🙅‍♂️?|🙅‍♀️?|💇‍♂️?|💇‍♀️?|💆‍♂️?|💆‍♀️?|💂‍♂️?|💂‍♀️?|💁‍♂️?|💁‍♀️?|👷‍♂️?|👷‍♀️?|👳‍♂️?|👳‍♀️?|👱‍♂️?|👱‍♀️?|🧑🏾‍🏫|🧑🏾‍🎨|🧑🏾‍🎤|🧑🏾‍🎓|🧑🏾‍🎄|🧑🏾‍🍼|🧑🏾‍🍳|🧑🏾‍🌾|🧑🏽‍🦽|🧑🏽‍🦼|🧑🏽‍🦯|🧑🏽‍🚒|🧑🏽‍🚀|🧑🏽‍🔬|🧑🏽‍🔧|🧑🏽‍💼|🧑🏽‍💻|🧑🏽‍🏭|🧑🏽‍🏫|🧑🏽‍🎨|🧑🏽‍🎤|🧑🏽‍🎓|🧑🏿‍🔧|🧑🏿‍💼|🧑🏿‍💻|🧑🏿‍🏭|🧑🏿‍🏫|🧑🏿‍🎨|🧑🏿‍🎤|🧑🏿‍🎓|🧑🏿‍🎄|🧑🏿‍🍼|🧑🏿‍🍳|🧑🏿‍🌾|🧑🏾‍🦽|🧑🏾‍🦼|🧑🏾‍🦯|🧑🏾‍🚒|🧑🏾‍🚀|🧑🏾‍🔬|🧑🏾‍🔧|🧑🏾‍💼|🧑🏾‍💻|🧑🏾‍🏭|👨🏾‍🔧|👨🏾‍💼|👨🏾‍💻|👨🏾‍🏭|👨🏾‍🏫|👨🏾‍🎨|👨🏾‍🎤|👨🏾‍🎓|👨🏾‍🍼|👨🏾‍🍳|👨🏾‍🌾|👨🏽‍🦽|👨🏽‍🦼|👨🏽‍🦯|👨🏽‍🚒|👨🏽‍🚀|👨🏽‍🔬|👨🏽‍🔧|👨🏽‍💼|👨🏽‍💻|👨🏽‍🏭|👨🏽‍🏫|👨🏿‍🦼|👨🏿‍🦯|👨🏿‍🚒|👨🏿‍🚀|👨🏿‍🔬|👨🏿‍🔧|👨🏿‍💼|👨🏿‍💻|👨🏿‍🏭|👨🏿‍🏫|👨🏿‍🎨|👨🏿‍🎤|👨🏿‍🎓|👨🏿‍🍼|👨🏿‍🍳|👨🏿‍🌾|👨🏾‍🦽|👨🏾‍🦼|👨🏾‍🦯|👨🏾‍🚒|👨🏾‍🚀|👨🏾‍🔬|👨🏽‍🎨|🚶‍♀️?|👨🏻‍🦽|🚶‍♂️?|👨🏻‍🦼|👨🏻‍🦯|👨🏻‍🚒|👨🏻‍🚀|👨🏻‍🔬|👨🏻‍🔧|👨🏻‍💼|👨🏻‍💻|👨🏻‍🏭|👨🏻‍🏫|👨🏻‍🎨|👨🏻‍🎤|👨🏻‍🎓|👨🏻‍🍼|👨🏻‍🍳|👨🏻‍🌾|👨‍✈️?|👨‍⚖️?|👨‍⚕️?|👨🏽‍🎤|👨🏽‍🎓|👨🏽‍🍼|👨🏽‍🍳|👨🏽‍🌾|👨🏼‍🦽|👨🏼‍🦼|👨🏼‍🦯|👨🏼‍🚒|👨🏼‍🚀|👨🏼‍🔬|👨🏼‍🔧|👨🏼‍💼|👨🏼‍💻|👨🏼‍🏭|👨🏼‍🏫|👨🏼‍🎨|👨🏼‍🎤|👨🏼‍🎓|👨🏼‍🍼|👨🏼‍🍳|👨🏼‍🌾|👩🏼‍🎨|👩🏼‍🎤|👩🏼‍🎓|👩🏼‍🍼|👩🏼‍🍳|👩🏼‍🌾|👩🏻‍🦽|👩🏻‍🦼|👩🏻‍🦯|👩🏻‍🚒|👩🏻‍🚀|👩🏻‍🔬|👩🏻‍🔧|👩🏻‍💼|👩🏻‍💻|👩🏻‍🏭|👩🏻‍🏫|👩🏻‍🎨|👩🏻‍🎤|👩🏻‍🎓|👩🏻‍🍼|👩🏻‍🍳|👩🏻‍🌾|👩🏽‍🔬|👩🏽‍🔧|👩🏽‍💼|👩🏽‍💻|👩🏽‍🏭|👩🏽‍🏫|👩🏽‍🎨|👩🏽‍🎤|👩🏽‍🎓|👩🏽‍🍼|👩🏽‍🍳|👩🏽‍🌾|👩🏼‍🦽|👩🏼‍🦼|👩🏼‍🦯|👩🏼‍🚒|👩🏼‍🚀|👩🏼‍🔬|👩🏼‍🔧|👩🏼‍💼|👩🏼‍💻|👩🏼‍🏭|👩🏼‍🏫|👨🏿‍🦽|🚵‍♀️?|👩‍⚕️?|👩‍⚖️?|👩‍✈️?|🚵‍♂️?|🏃‍➡️?|🐦‍🔥|🐦‍⬛|🐕‍🦺|🐈‍⬛|👨‍🚒|👨‍🦯|👨‍🦼|🍋‍🟩|🍄‍🟫|👨‍🦽|👩‍🎨|👩‍🎤|👩‍🎓|👩‍🌾|👩‍🍳|👩‍👦|👨‍👦|👨‍👧|👩‍👧|👨‍🌾|👨‍🍳|👨‍🍼|👨‍🎓|👨‍🎤|👨‍🎨|👨‍🏫|🧑‍🩰|👨‍🏭|👨‍💻|👨‍💼|👨‍🔧|😵‍💫|😮‍💨|👨‍🔬|👨‍🚀|🧑‍🦯|🧑‍🚒|🧑‍🚀|🧑‍🔬|🧑‍🔧|🧑‍💼|🧑‍💻|🧑‍🏭|🧑‍🏫|🧑‍🧒|🧑‍🎨|🧑‍🎤|🧑‍🎓|🧑‍🎄|🧑‍🍼|👩‍🦳|👩‍🦲|👩‍🦱|👩‍🦰|👩‍🦽|🧑‍🌾|👩‍🍼|👩‍🏫|👩‍🏭|👩‍💻|👩‍💼|👩‍🔧|👩‍🔬|👩‍🚀|👩‍🚒|👩‍🦯|👩‍🦼|👨‍🦰|🧑‍🦳|🧑‍🦲|🧑‍🦱|🧑‍🦰|👨‍🦱|👨‍🦲|👨‍🦳|🧑‍🦽|🧑‍🦼|🧑‍🍳)|(?:(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}](?!(?:\p{EMod}|️))︎?|\p{EPres}︎)|[\#\*0-9]⃣)|(?:🏴󠁧󠁢󠁷󠁬󠁳󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁥󠁮󠁧󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|\p{EBase}\p{EMod}|(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_text.rb new file mode 100644 index 000000000..b7c4b05d2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_include_text.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_INCLUDE_TEXT = /(?:(?:👩🏾‍❤️‍💋‍👩🏻|👩🏾‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👨🏾|👨🏽‍❤️‍💋‍👨🏻|👨🏽‍❤️‍💋‍👨🏼|👨🏽‍❤️‍💋‍👨🏽|👨🏽‍❤️‍💋‍👨🏾|👨🏽‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👨🏽|👩🏾‍❤️‍💋‍👨🏼|👩🏾‍❤️‍💋‍👨🏻|👨🏾‍❤️‍💋‍👨🏻|👨🏾‍❤️‍💋‍👨🏼|👨🏾‍❤️‍💋‍👨🏽|👨🏾‍❤️‍💋‍👨🏾|👨🏾‍❤️‍💋‍👨🏿|👩🏽‍❤️‍💋‍👩🏿|👩🏿‍❤️‍💋‍👩🏽|👩🏿‍❤️‍💋‍👩🏼|👩🏿‍❤️‍💋‍👩🏻|👩🏿‍❤️‍💋‍👨🏿|👩🏿‍❤️‍💋‍👨🏾|👩🏿‍❤️‍💋‍👨🏽|👩🏿‍❤️‍💋‍👨🏼|👩🏿‍❤️‍💋‍👨🏻|👨🏼‍❤️‍💋‍👨🏻|👨🏼‍❤️‍💋‍👨🏼|👨🏼‍❤️‍💋‍👨🏽|👨🏼‍❤️‍💋‍👨🏾|👨🏼‍❤️‍💋‍👨🏿|👩🏾‍❤️‍💋‍👩🏿|👩🏾‍❤️‍💋‍👩🏾|👩🏾‍❤️‍💋‍👩🏽|👩🏾‍❤️‍💋‍👩🏼|👩🏼‍❤️‍💋‍👩🏼|👩🏼‍❤️‍💋‍👩🏻|👩🏼‍❤️‍💋‍👨🏿|👩🏼‍❤️‍💋‍👨🏾|👩🏼‍❤️‍💋‍👨🏽|👩🏼‍❤️‍💋‍👨🏼|👩🏼‍❤️‍💋‍👨🏻|👩🏻‍❤️‍💋‍👨🏻|👩🏻‍❤️‍💋‍👨🏼|👩🏻‍❤️‍💋‍👨🏽|👩🏻‍❤️‍💋‍👨🏾|👩🏻‍❤️‍💋‍👨🏿|👩🏻‍❤️‍💋‍👩🏻|👩🏻‍❤️‍💋‍👩🏼|👩🏻‍❤️‍💋‍👩🏽|👩🏻‍❤️‍💋‍👩🏾|👩🏻‍❤️‍💋‍👩🏿|👩🏽‍❤️‍💋‍👩🏾|👩🏽‍❤️‍💋‍👩🏽|👩🏽‍❤️‍💋‍👩🏼|👩🏽‍❤️‍💋‍👩🏻|👩🏽‍❤️‍💋‍👨🏿|👩🏽‍❤️‍💋‍👨🏾|👩🏽‍❤️‍💋‍👨🏽|👩🏽‍❤️‍💋‍👨🏼|👩🏽‍❤️‍💋‍👨🏻|👨🏿‍❤️‍💋‍👨🏻|👨🏿‍❤️‍💋‍👨🏼|👨🏿‍❤️‍💋‍👨🏽|👨🏿‍❤️‍💋‍👨🏾|👨🏿‍❤️‍💋‍👨🏿|👩🏼‍❤️‍💋‍👩🏿|👩🏼‍❤️‍💋‍👩🏾|👨🏻‍❤️‍💋‍👨🏼|👨🏻‍❤️‍💋‍👨🏻|🧑🏼‍❤️‍💋‍🧑🏻|🧑🏼‍❤️‍💋‍🧑🏽|🧑🏼‍❤️‍💋‍🧑🏾|🧑🏼‍❤️‍💋‍🧑🏿|🧑🏽‍❤️‍💋‍🧑🏻|🧑🏽‍❤️‍💋‍🧑🏼|🧑🏽‍❤️‍💋‍🧑🏾|🧑🏽‍❤️‍💋‍🧑🏿|🧑🏾‍❤️‍💋‍🧑🏻|🧑🏾‍❤️‍💋‍🧑🏼|🧑🏾‍❤️‍💋‍🧑🏽|🧑🏾‍❤️‍💋‍🧑🏿|🧑🏿‍❤️‍💋‍🧑🏾|🧑🏿‍❤️‍💋‍🧑🏽|🧑🏿‍❤️‍💋‍🧑🏻|🧑🏿‍❤️‍💋‍🧑🏼|👩🏼‍❤️‍💋‍👩🏽|👩🏿‍❤️‍💋‍👩🏾|👩🏿‍❤️‍💋‍👩🏿|🧑🏻‍❤️‍💋‍🧑🏼|🧑🏻‍❤️‍💋‍🧑🏽|🧑🏻‍❤️‍💋‍🧑🏾|🧑🏻‍❤️‍💋‍🧑🏿|👨🏻‍❤️‍💋‍👨🏿|👨🏻‍❤️‍💋‍👨🏾|👨🏻‍❤️‍💋‍👨🏽|👩🏽‍❤️‍👩🏻|👩🏽‍❤️‍👨🏿|👩🏽‍❤️‍👨🏾|👩🏽‍❤️‍👨🏽|👩🏽‍❤️‍👨🏼|👩🏽‍❤️‍👨🏻|🧑🏿‍❤️‍🧑🏾|🚶🏿‍♀️‍➡️|🚶🏾‍♂️‍➡️|🚶🏾‍♀️‍➡️|🏃🏿‍♂️‍➡️|👩🏽‍❤️‍👩🏼|👩🏽‍❤️‍👩🏽|👩🏽‍❤️‍👩🏾|🚶🏿‍♂️‍➡️|🧑🏿‍❤️‍🧑🏽|🧑🏿‍❤️‍🧑🏼|🧑🏿‍❤️‍🧑🏻|🏃🏻‍♂️‍➡️|🏃🏻‍♀️‍➡️|👩🏼‍❤️‍👨🏻|👩🏼‍❤️‍👨🏼|👩🏼‍❤️‍👨🏽|🏃🏼‍♀️‍➡️|🏃🏼‍♂️‍➡️|👩🏼‍❤️‍👨🏾|🏃🏽‍♀️‍➡️|🏃🏽‍♂️‍➡️|🏃🏾‍♀️‍➡️|👩🏼‍❤️‍👨🏿|👩🏼‍❤️‍👩🏻|👩🏼‍❤️‍👩🏼|👩🏼‍❤️‍👩🏽|🏃🏾‍♂️‍➡️|🏃🏿‍♀️‍➡️|👩🏼‍❤️‍👩🏾|👩🏼‍❤️‍👩🏿|🚶🏻‍♀️‍➡️|🚶🏻‍♂️‍➡️|🚶🏼‍♀️‍➡️|🚶🏼‍♂️‍➡️|🚶🏽‍♀️‍➡️|🚶🏽‍♂️‍➡️|👩🏽‍❤️‍👩🏿|👩🏾‍❤️‍👩🏻|👩🏾‍❤️‍👩🏼|👩🏾‍❤️‍👩🏽|👩🏾‍❤️‍👩🏾|👩🏾‍❤️‍👩🏿|🧑🏼‍❤️‍🧑🏿|🧑🏼‍❤️‍🧑🏾|🧑🏼‍❤️‍🧑🏽|🧑🏼‍❤️‍🧑🏻|🧑🏻‍❤️‍🧑🏿|👩🏿‍❤️‍👨🏻|👩🏿‍❤️‍👨🏼|👩🏿‍❤️‍👨🏽|👩🏿‍❤️‍👨🏾|👩🏿‍❤️‍👨🏿|👩🏿‍❤️‍👩🏻|👩🏿‍❤️‍👩🏼|👩🏿‍❤️‍👩🏽|👩🏿‍❤️‍👩🏾|👩🏿‍❤️‍👩🏿|🧑🏻‍❤️‍🧑🏾|🧑🏻‍❤️‍🧑🏽|🧑🏻‍❤️‍🧑🏼|🧑🏾‍❤️‍🧑🏿|🧑🏾‍❤️‍🧑🏽|🧑🏾‍❤️‍🧑🏼|🧑🏾‍❤️‍🧑🏻|🧎🏿‍♂️‍➡️|🧎🏿‍♀️‍➡️|🧎🏾‍♂️‍➡️|🧎🏾‍♀️‍➡️|🧎🏽‍♂️‍➡️|🧎🏽‍♀️‍➡️|🧑🏽‍❤️‍🧑🏿|🧑🏽‍❤️‍🧑🏾|🧑🏽‍❤️‍🧑🏼|🧑🏽‍❤️‍🧑🏻|🧎🏼‍♂️‍➡️|🧎🏼‍♀️‍➡️|🧎🏻‍♂️‍➡️|🧎🏻‍♀️‍➡️|👩🏾‍❤️‍👨🏻|👩🏾‍❤️‍👨🏼|👩🏾‍❤️‍👨🏽|👩🏾‍❤️‍👨🏾|👩🏾‍❤️‍👨🏿|👩🏻‍❤️‍👩🏻|👩🏻‍❤️‍👨🏿|👩🏻‍❤️‍👨🏾|👩🏻‍❤️‍👨🏽|👩🏻‍❤️‍👨🏼|👩🏻‍❤️‍👨🏻|👨🏽‍❤️‍👨🏼|👨🏻‍❤️‍👨🏾|👨🏼‍❤️‍👨🏻|👩‍❤️‍💋‍👩|👩‍❤️‍💋‍👨|👨🏼‍❤️‍👨🏼|👨🏼‍❤️‍👨🏽|👨🏼‍❤️‍👨🏾|👨🏼‍❤️‍👨🏿|👨🏻‍❤️‍👨🏽|👨🏻‍❤️‍👨🏼|👨🏻‍❤️‍👨🏻|👨🏽‍❤️‍👨🏽|👨‍❤️‍💋‍👨|👨🏾‍❤️‍👨🏼|👨🏾‍❤️‍👨🏽|👨🏿‍❤️‍👨🏿|👨🏾‍❤️‍👨🏾|👨🏿‍❤️‍👨🏾|👨🏾‍❤️‍👨🏿|👨🏿‍❤️‍👨🏽|👨🏾‍❤️‍👨🏻|👨🏿‍❤️‍👨🏼|👨🏻‍❤️‍👨🏿|👨🏿‍❤️‍👨🏻|👨🏽‍❤️‍👨🏿|👨🏽‍❤️‍👨🏾|👨🏽‍❤️‍👨🏻|👩🏻‍❤️‍👩🏿|👩🏻‍❤️‍👩🏾|👩🏻‍❤️‍👩🏽|👩🏻‍❤️‍👩🏼|🧑🏼‍🐰‍🧑🏿|👨‍👨‍👧‍👦|🧑🏼‍🐰‍🧑🏾|🧑🏼‍🐰‍🧑🏽|🧑🏼‍🐰‍🧑🏻|🧑🏽‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏻|🧑🏼‍🫯‍🧑🏽|🧑🏼‍🫯‍🧑🏾|🧑🏾‍🤝‍🧑🏻|🧑🏾‍🤝‍🧑🏼|🧑🏾‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏾‍🤝‍🧑🏿|🧑🏼‍🫯‍🧑🏿|🧑🏽‍🐰‍🧑🏻|🧑🏽‍🐰‍🧑🏼|🧑🏽‍🐰‍🧑🏾|🧑🏽‍🐰‍🧑🏿|👨‍👨‍👦‍👦|🧑🏽‍🫯‍🧑🏻|👨‍👩‍👦‍👦|👨‍👩‍👧‍👦|👨‍👩‍👧‍👧|🧑🏻‍🤝‍🧑🏿|🧑🏻‍🤝‍🧑🏾|🧑🏻‍🤝‍🧑🏽|🧑🏻‍🤝‍🧑🏼|🧑🏻‍🤝‍🧑🏻|👨🏻‍🐰‍👨🏼|👨🏻‍🐰‍👨🏽|👨🏻‍🐰‍👨🏾|👨🏻‍🐰‍👨🏿|👨🏻‍🤝‍👨🏼|👨🏻‍🤝‍👨🏽|👨🏻‍🤝‍👨🏾|🧑‍🧑‍🧒‍🧒|👩🏿‍🫯‍👩🏾|👩🏿‍🫯‍👩🏽|🧑🏽‍🤝‍🧑🏾|🧑🏽‍🤝‍🧑🏽|🧑🏽‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏻|🧑🏻‍🫯‍🧑🏿|🧑🏻‍🫯‍🧑🏾|🧑🏻‍🫯‍🧑🏽|🧑🏻‍🫯‍🧑🏼|👨‍👨‍👧‍👧|🧑🏻‍🐰‍🧑🏿|🧑🏻‍🐰‍🧑🏾|🧑🏻‍🐰‍🧑🏽|🧑🏼‍🤝‍🧑🏿|🧑🏼‍🤝‍🧑🏾|🧑🏼‍🤝‍🧑🏽|🧑🏼‍🤝‍🧑🏼|🧑🏼‍🤝‍🧑🏻|🧑🏻‍🐰‍🧑🏼|🧑🏽‍🦼‍➡️|🧑🏽‍🦯‍➡️|🧑🏼‍🦽‍➡️|🧑🏼‍🦼‍➡️|🧑🏼‍🦯‍➡️|🧑🏻‍🦽‍➡️|🧑🏻‍🦼‍➡️|🧑🏻‍🦯‍➡️|👩🏿‍🦽‍➡️|👩🏿‍🦼‍➡️|👩🏿‍🦯‍➡️|👩🏾‍🦽‍➡️|👩🏾‍🦼‍➡️|👩🏾‍🦯‍➡️|👩🏽‍🦽‍➡️|👩🏽‍🦼‍➡️|👩🏽‍🦯‍➡️|👩🏼‍🦽‍➡️|🧑🏿‍🫯‍🧑🏾|🧑🏿‍🫯‍🧑🏽|🧑🏿‍🫯‍🧑🏼|🧑🏿‍🫯‍🧑🏻|🧑🏿‍🐰‍🧑🏾|🧑🏿‍🐰‍🧑🏽|🧑🏿‍🐰‍🧑🏼|🧑🏿‍🐰‍🧑🏻|🧑🏾‍🫯‍🧑🏿|🏃‍♂️‍➡️|🏃‍♀️‍➡️|🧑🏿‍🦽‍➡️|🧑🏿‍🦼‍➡️|🧑🏿‍🦯‍➡️|🧑🏾‍🦽‍➡️|🧑🏾‍🦼‍➡️|🧑🏾‍🦯‍➡️|🧑🏽‍🦽‍➡️|👩🏼‍🦼‍➡️|👨🏻‍🦼‍➡️|🚶‍♂️‍➡️|👨🏻‍🦯‍➡️|🧑🏾‍🫯‍🧑🏽|🧑🏾‍🫯‍🧑🏼|🧑🏾‍🫯‍🧑🏻|🧑🏿‍🤝‍🧑🏿|🧑🏾‍🐰‍🧑🏿|🧑🏿‍🤝‍🧑🏾|🧑🏾‍🐰‍🧑🏽|🧑🏿‍🤝‍🧑🏽|🧑🏾‍🐰‍🧑🏼|🧑🏿‍🤝‍🧑🏼|🧑🏾‍🐰‍🧑🏻|🧑🏿‍🤝‍🧑🏻|🧑🏽‍🫯‍🧑🏿|🧑🏽‍🫯‍🧑🏾|🧑🏽‍🫯‍🧑🏼|👩🏼‍🦯‍➡️|👩🏻‍🦽‍➡️|👩🏻‍🦼‍➡️|👩🏻‍🦯‍➡️|👨🏿‍🦽‍➡️|👨🏿‍🦼‍➡️|👨🏿‍🦯‍➡️|👨🏾‍🦽‍➡️|👨🏾‍🦼‍➡️|👨🏾‍🦯‍➡️|👨🏽‍🦽‍➡️|👨🏽‍🦼‍➡️|👨🏽‍🦯‍➡️|👨🏼‍🦽‍➡️|👨🏼‍🦼‍➡️|👨🏼‍🦯‍➡️|👨🏻‍🦽‍➡️|🚶‍♀️‍➡️|👩🏿‍🫯‍👩🏼|👨🏾‍🫯‍👨🏻|👨🏾‍🫯‍👨🏼|👨🏾‍🫯‍👨🏽|👨🏾‍🫯‍👨🏿|👨🏿‍🐰‍👨🏻|👨🏿‍🐰‍👨🏼|👨🏿‍🐰‍👨🏽|👨🏿‍🐰‍👨🏾|👨🏿‍🤝‍👨🏻|👨🏿‍🤝‍👨🏼|👨🏿‍🤝‍👨🏽|👨🏿‍🤝‍👨🏾|👨🏿‍🫯‍👨🏻|👩🏼‍🫯‍👩🏿|👩🏼‍🫯‍👩🏾|👩🏼‍🫯‍👩🏽|👩🏼‍🫯‍👩🏻|👨🏾‍🐰‍👨🏻|👩🏽‍🤝‍👩🏻|👨🏾‍🐰‍👨🏼|👩🏽‍🤝‍👨🏿|👨🏾‍🐰‍👨🏽|👩🏽‍🤝‍👨🏾|👨🏾‍🐰‍👨🏿|👩🏽‍🤝‍👨🏼|👨🏾‍🤝‍👨🏻|👩🏽‍🤝‍👨🏻|👨🏾‍🤝‍👨🏼|👩🏽‍🐰‍👩🏿|👩🏽‍🐰‍👩🏾|👩🏽‍🐰‍👩🏼|👩🏽‍🐰‍👩🏻|👨🏾‍🤝‍👨🏽|👨🏾‍🤝‍👨🏿|👩‍👩‍👧‍👧|👩🏻‍🫯‍👩🏿|👩🏻‍🫯‍👩🏾|👩🏻‍🫯‍👩🏽|👩🏻‍🫯‍👩🏼|👩🏻‍🤝‍👩🏿|👩🏻‍🤝‍👩🏾|👩🏻‍🤝‍👩🏽|👩🏻‍🤝‍👩🏼|👩🏻‍🤝‍👨🏿|👩🏻‍🤝‍👨🏾|👩🏻‍🤝‍👨🏽|👩🏻‍🤝‍👨🏼|👩🏻‍🐰‍👩🏿|👩🏻‍🐰‍👩🏾|👩🏻‍🐰‍👩🏽|👩🏻‍🐰‍👩🏼|👩🏼‍🤝‍👩🏿|👩🏼‍🤝‍👩🏾|👩🏼‍🤝‍👩🏽|👩🏼‍🤝‍👩🏻|👩🏼‍🤝‍👨🏿|👩🏼‍🤝‍👨🏾|👩🏼‍🤝‍👨🏽|👩🏼‍🤝‍👨🏻|👩🏼‍🐰‍👩🏿|👩🏼‍🐰‍👩🏾|👩🏼‍🐰‍👩🏽|👩🏼‍🐰‍👩🏻|👨🏿‍🫯‍👨🏼|👨🏿‍🫯‍👨🏽|👨🏿‍🫯‍👨🏾|👩‍👩‍👦‍👦|👨🏼‍🐰‍👨🏻|👨🏼‍🐰‍👨🏽|👨🏼‍🐰‍👨🏾|👨🏼‍🐰‍👨🏿|👨🏼‍🤝‍👨🏻|👨🏼‍🤝‍👨🏽|👨🏼‍🤝‍👨🏾|👨🏼‍🤝‍👨🏿|👨🏼‍🫯‍👨🏻|👨🏼‍🫯‍👨🏽|👩🏾‍🫯‍👩🏿|👩🏾‍🫯‍👩🏽|👩🏾‍🫯‍👩🏼|👩🏾‍🫯‍👩🏻|👩🏾‍🤝‍👩🏿|👩🏾‍🤝‍👩🏽|👩🏾‍🤝‍👩🏼|👩🏾‍🤝‍👩🏻|👩🏿‍🫯‍👩🏻|👩🏿‍🤝‍👩🏾|👩🏿‍🤝‍👩🏽|👩🏿‍🤝‍👩🏼|👩🏿‍🤝‍👩🏻|👩🏿‍🤝‍👨🏾|👩🏿‍🤝‍👨🏽|👩🏿‍🤝‍👨🏼|👩🏿‍🤝‍👨🏻|👩🏿‍🐰‍👩🏾|👩🏿‍🐰‍👩🏽|👩🏿‍🐰‍👩🏼|👩🏿‍🐰‍👩🏻|👨🏻‍🤝‍👨🏿|👨🏻‍🫯‍👨🏼|👨🏻‍🫯‍👨🏽|👨🏻‍🫯‍👨🏾|👨🏻‍🫯‍👨🏿|👩🏾‍🤝‍👨🏿|👨🏽‍🐰‍👨🏿|👨🏽‍🤝‍👨🏻|👨🏽‍🤝‍👨🏼|👨🏽‍🤝‍👨🏾|👨🏽‍🤝‍👨🏿|👨🏽‍🫯‍👨🏻|👨🏽‍🫯‍👨🏼|👨🏽‍🫯‍👨🏾|👨🏽‍🫯‍👨🏿|👩🏽‍🫯‍👩🏿|🧎‍♀️‍➡️|👩🏽‍🫯‍👩🏾|🧎‍♂️‍➡️|👩🏽‍🫯‍👩🏼|👩🏽‍🫯‍👩🏻|👩🏽‍🤝‍👩🏿|👩🏽‍🤝‍👩🏾|👩🏽‍🤝‍👩🏼|👩🏾‍🤝‍👨🏽|👩🏾‍🤝‍👨🏼|👩🏾‍🤝‍👨🏻|👩🏾‍🐰‍👩🏿|👩🏾‍🐰‍👩🏽|👩🏾‍🐰‍👩🏼|👩🏾‍🐰‍👩🏻|👨🏼‍🫯‍👨🏾|👨🏼‍🫯‍👨🏿|👨🏽‍🐰‍👨🏻|👨🏽‍🐰‍👨🏼|👨🏽‍🐰‍👨🏾|👩‍👩‍👧‍👦|👨‍🦽‍➡️|🧑‍🦯‍➡️|👨‍🦼‍➡️|🧑‍🦼‍➡️|👨‍🦯‍➡️|🧑‍🦽‍➡️|👩‍❤️‍👩|👩‍❤️‍👨|👩‍🦯‍➡️|👨‍❤️‍👨|👩‍🦼‍➡️|👩‍🦽‍➡️|🧖🏾‍♀️|🧖🏽‍♂️|🧖🏽‍♀️|🧖🏼‍♂️|🧖🏼‍♀️|🧖🏻‍♂️|🧖🏻‍♀️|👩🏾‍✈️|👩🏾‍⚖️|👩🏾‍⚕️|🧔🏿‍♂️|🧔🏿‍♀️|🧔🏾‍♂️|🚴🏻‍♀️|🧔🏾‍♀️|🧔🏽‍♂️|🧔🏽‍♀️|🧔🏼‍♂️|🧔🏼‍♀️|🧔🏻‍♂️|🧔🏻‍♀️|🧘🏻‍♂️|🧘🏻‍♀️|🧗🏿‍♂️|🧗🏿‍♀️|🧗🏾‍♂️|🧗🏾‍♀️|🧗🏽‍♂️|🧗🏽‍♀️|👩🏿‍✈️|👩🏿‍⚖️|👩🏿‍⚕️|🚣🏾‍♂️|🧗🏼‍♂️|🚣🏿‍♀️|🧗🏼‍♀️|🚣🏿‍♂️|🧗🏻‍♂️|🧗🏻‍♀️|🧖🏿‍♂️|🧖🏿‍♀️|🧖🏾‍♂️|🧎🏽‍♀️|🧎🏼‍♂️|🧎🏼‍♀️|🧎🏻‍♂️|🧎🏻‍♀️|👩🏼‍✈️|👩🏼‍⚖️|👩🏼‍⚕️|🚴🏽‍♀️|🚴🏽‍♂️|🧍🏿‍♂️|🚴🏾‍♀️|🧍🏿‍♀️|🧍🏾‍♂️|🧍🏾‍♀️|🧍🏽‍♂️|🧍🏽‍♀️|🧍🏼‍♂️|🧍🏼‍♀️|🧍🏻‍♂️|🧍🏻‍♀️|🧏🏿‍♂️|🧏🏿‍♀️|🧏🏾‍♂️|🧏🏾‍♀️|🧏🏽‍♂️|🧏🏽‍♀️|👩🏽‍✈️|👩🏽‍⚖️|👩🏽‍⚕️|🚴🏻‍♂️|🧏🏼‍♂️|🚴🏼‍♀️|🧏🏼‍♀️|🚴🏼‍♂️|🧏🏻‍♂️|🧏🏻‍♀️|🧎🏿‍♂️|🧎🏿‍♀️|🧎🏾‍♂️|🧎🏾‍♀️|🧎🏽‍♂️|🧑🏼‍⚕️|👩‍👧‍👧|👩‍👩‍👦|🧜🏻‍♀️|👩‍👩‍👧|🚣🏻‍♀️|🧛🏿‍♂️|🧛🏿‍♀️|🧛🏾‍♂️|🧛🏾‍♀️|🧛🏽‍♂️|🧛🏽‍♀️|🧛🏼‍♂️|🧛🏼‍♀️|🧛🏻‍♂️|🧛🏻‍♀️|🧚🏿‍♂️|🧚🏿‍♀️|🧑🏻‍✈️|🧑🏻‍⚖️|🧑🏻‍⚕️|🙎🏾‍♂️|🧝🏽‍♀️|🙎🏿‍♀️|🧝🏼‍♂️|🙎🏿‍♂️|🧝🏼‍♀️|🧝🏻‍♂️|🧝🏻‍♀️|🧜🏿‍♂️|🧜🏿‍♀️|🧜🏾‍♂️|🧜🏾‍♀️|🧜🏽‍♂️|🧜🏽‍♀️|🧜🏼‍♂️|🧜🏼‍♀️|🧜🏻‍♂️|👩‍👦‍👦|👩‍👧‍👦|🧑🏼‍✈️|🧑🏼‍⚖️|🧎🏿‍➡️|🧎🏾‍➡️|🧎🏽‍➡️|🧎🏼‍➡️|🧎🏻‍➡️|🚶🏿‍➡️|🚶🏾‍➡️|🚶🏽‍➡️|🚶🏼‍➡️|🚶🏻‍➡️|🧘🏿‍♂️|🚣🏽‍♀️|🧘🏿‍♀️|🚣🏽‍♂️|🧘🏾‍♂️|🚣🏾‍♀️|🧘🏾‍♀️|🧘🏽‍♂️|🧘🏽‍♀️|🧘🏼‍♂️|🧘🏼‍♀️|🚣🏻‍♂️|🧚🏾‍♂️|🚣🏼‍♀️|🧚🏾‍♀️|🚣🏼‍♂️|🧚🏽‍♂️|🧚🏽‍♀️|🧚🏼‍♂️|🧚🏼‍♀️|🧚🏻‍♂️|🧚🏻‍♀️|🧙🏿‍♂️|🧙🏿‍♀️|🧙🏾‍♂️|🧙🏾‍♀️|🧙🏽‍♂️|🧙🏽‍♀️|🧙🏼‍♂️|🧙🏼‍♀️|🧙🏻‍♂️|🧙🏻‍♀️|👨🏼‍✈️|👨🏼‍⚖️|👨🏼‍⚕️|🤷🏼‍♀️|🤷🏻‍♂️|🤷🏻‍♀️|🚶🏻‍♀️|🤵🏿‍♂️|🤵🏿‍♀️|🤵🏾‍♂️|🤵🏾‍♀️|🤵🏽‍♂️|🤵🏽‍♀️|🤵🏼‍♂️|🤵🏼‍♀️|🤵🏻‍♂️|🤵🏻‍♀️|🤦🏿‍♂️|🤦🏿‍♀️|👨🏻‍✈️|👨🏻‍⚖️|👨🏽‍✈️|👨🏽‍⚖️|👨🏽‍⚕️|🚵🏾‍♂️|🤸🏾‍♂️|🚵🏿‍♀️|🤸🏾‍♀️|🚵🏿‍♂️|🤸🏽‍♂️|🤸🏽‍♀️|🤸🏼‍♂️|🤸🏼‍♀️|🤸🏻‍♂️|🤸🏻‍♀️|🤷🏿‍♂️|🤷🏿‍♀️|🤷🏾‍♂️|🤷🏾‍♀️|🤷🏽‍♂️|🤷🏽‍♀️|🤷🏼‍♂️|🫱🏻‍🫲🏿|🏃🏿‍➡️|🏃🏾‍➡️|🏃🏽‍➡️|🏃🏼‍➡️|🏃🏻‍➡️|🫱🏼‍🫲🏻|🫱🏿‍🫲🏾|🫱🏿‍🫲🏽|🫱🏿‍🫲🏼|🫱🏿‍🫲🏻|🫱🏾‍🫲🏿|🫱🏾‍🫲🏽|🫱🏾‍🫲🏼|🫱🏾‍🫲🏻|🫱🏽‍🫲🏿|🫱🏽‍🫲🏾|🫱🏽‍🫲🏼|🫱🏽‍🫲🏻|🫱🏼‍🫲🏿|🫱🏼‍🫲🏾|👨🏻‍⚕️|🚶🏻‍♂️|🤦🏾‍♂️|🚶🏼‍♀️|🤦🏾‍♀️|🚶🏼‍♂️|🤦🏽‍♂️|🤦🏽‍♀️|🤦🏼‍♂️|🤦🏼‍♀️|🤦🏻‍♂️|🤦🏻‍♀️|🚶🏿‍♂️|🚶🏿‍♀️|🚶🏾‍♂️|🚶🏾‍♀️|🚶🏽‍♂️|🚶🏽‍♀️|🫱🏻‍🫲🏼|🫱🏻‍🫲🏽|🫱🏻‍🫲🏾|🦸🏽‍♀️|🦸🏼‍♂️|🦸🏼‍♀️|🦸🏻‍♂️|🦸🏻‍♀️|🤾🏿‍♂️|🤾🏿‍♀️|🤾🏾‍♂️|🤾🏾‍♀️|🚵🏻‍♀️|🤾🏽‍♂️|🤾🏽‍♀️|🤾🏼‍♂️|🤾🏼‍♀️|🤾🏻‍♂️|🤾🏻‍♀️|🤽🏿‍♂️|🤽🏿‍♀️|🤽🏾‍♂️|🤽🏾‍♀️|🤽🏽‍♂️|🦹🏿‍♂️|🦹🏿‍♀️|🦹🏾‍♂️|🦹🏾‍♀️|👩🏻‍✈️|👩🏻‍⚖️|👩🏻‍⚕️|🚴🏾‍♂️|🦹🏽‍♂️|🚴🏿‍♀️|🦹🏽‍♀️|🚴🏿‍♂️|🦹🏼‍♂️|🦹🏼‍♀️|🦹🏻‍♂️|🦹🏻‍♀️|🦸🏿‍♂️|🦸🏿‍♀️|🦸🏾‍♂️|🦸🏾‍♀️|🦸🏽‍♂️|👨🏾‍✈️|👨🏾‍⚖️|👨🏾‍⚕️|🚵🏽‍♀️|🧑‍🤝‍🧑|🚵🏽‍♂️|🧑‍🧑‍🧒|🚵🏾‍♀️|🤹🏿‍♂️|🧑‍🧒‍🧒|🤹🏿‍♀️|🤹🏾‍♂️|🤹🏾‍♀️|🤹🏽‍♂️|🤹🏽‍♀️|🤹🏼‍♂️|🤹🏼‍♀️|🤹🏻‍♂️|🤹🏻‍♀️|🤸🏿‍♂️|🤸🏿‍♀️|🤽🏽‍♀️|🤽🏼‍♂️|👨🏿‍✈️|👨🏿‍⚖️|👨🏿‍⚕️|🚵🏻‍♂️|🤽🏼‍♀️|🚵🏼‍♀️|🤽🏻‍♂️|🚵🏼‍♂️|🤽🏻‍♀️|🤼🏿‍♂️|🤼🏿‍♀️|🤼🏾‍♂️|🤼🏾‍♀️|🤼🏽‍♂️|🤼🏽‍♀️|🤼🏼‍♂️|🤼🏼‍♀️|🤼🏻‍♂️|🤼🏻‍♀️|👷🏽‍♀️|👷🏼‍♂️|👷🏼‍♀️|👷🏻‍♂️|👷🏻‍♀️|👳🏿‍♂️|👳🏿‍♀️|👳🏾‍♂️|👳🏾‍♀️|👳🏽‍♂️|👳🏽‍♀️|👳🏼‍♂️|👳🏼‍♀️|👳🏻‍♂️|👳🏻‍♀️|🏳️‍⚧️|👱🏿‍♂️|👱🏿‍♀️|👱🏾‍♂️|👱🏾‍♀️|👱🏽‍♂️|💂🏽‍♀️|💂🏼‍♂️|💂🏼‍♀️|💂🏻‍♂️|💂🏻‍♀️|💁🏿‍♂️|💁🏿‍♀️|💁🏾‍♂️|💁🏾‍♀️|💁🏽‍♂️|💁🏽‍♀️|💁🏼‍♂️|💁🏼‍♀️|💁🏻‍♂️|💁🏻‍♀️|👁️‍🗨️|👷🏿‍♂️|👷🏿‍♀️|👷🏾‍♂️|👷🏾‍♀️|👷🏽‍♂️|👯🏼‍♂️|👯🏼‍♀️|👯🏻‍♂️|👯🏻‍♀️|👮🏿‍♂️|👮🏿‍♀️|👮🏾‍♂️|👮🏾‍♀️|👮🏽‍♂️|👮🏽‍♀️|👮🏼‍♂️|👮🏼‍♀️|👮🏻‍♂️|👮🏻‍♀️|🏌️‍♂️|🏌️‍♀️|🏌🏿‍♂️|🏌🏿‍♀️|🏌🏾‍♂️|🏌🏾‍♀️|🏌🏽‍♂️|👱🏽‍♀️|👱🏼‍♂️|👱🏼‍♀️|👱🏻‍♂️|👱🏻‍♀️|👰🏿‍♂️|👰🏿‍♀️|👰🏾‍♂️|👰🏾‍♀️|👰🏽‍♂️|👰🏽‍♀️|👰🏼‍♂️|👰🏼‍♀️|👰🏻‍♂️|👰🏻‍♀️|👯🏿‍♂️|👯🏿‍♀️|👯🏾‍♂️|👯🏾‍♀️|👯🏽‍♂️|👯🏽‍♀️|👨‍👧‍👦|🙆🏿‍♂️|🙆🏿‍♀️|🙆🏾‍♂️|🙆🏾‍♀️|🙆🏽‍♂️|🙆🏽‍♀️|🙆🏼‍♂️|🙆🏼‍♀️|🙆🏻‍♂️|🙆🏻‍♀️|👨‍👧‍👧|👨‍👨‍👦|🙅🏿‍♂️|🙅🏿‍♀️|🙅🏾‍♂️|🙅🏾‍♀️|🙅🏽‍♂️|🙅🏽‍♀️|🙅🏼‍♂️|🙅🏼‍♀️|🙋🏿‍♂️|🙋🏿‍♀️|🙋🏾‍♂️|🙋🏾‍♀️|🙋🏽‍♂️|🙋🏽‍♀️|🙋🏼‍♂️|🙋🏼‍♀️|🙋🏻‍♂️|🙋🏻‍♀️|🙇🏿‍♂️|🙇🏿‍♀️|🙇🏾‍♂️|🙇🏾‍♀️|🙇🏽‍♂️|🙇🏽‍♀️|🙇🏼‍♂️|🙇🏼‍♀️|🙇🏻‍♂️|🙇🏻‍♀️|👨‍👦‍👦|💇🏼‍♂️|💇🏼‍♀️|💇🏻‍♂️|💇🏻‍♀️|💆🏿‍♂️|💆🏿‍♀️|💆🏾‍♂️|💆🏾‍♀️|💆🏽‍♂️|💆🏽‍♀️|💆🏼‍♂️|💆🏼‍♀️|💆🏻‍♂️|💆🏻‍♀️|👨‍👩‍👦|👨‍👩‍👧|💂🏿‍♂️|💂🏿‍♀️|💂🏾‍♂️|💂🏾‍♀️|💂🏽‍♂️|🙅🏻‍♂️|🙅🏻‍♀️|👨‍👨‍👧|🕵️‍♂️|🕵️‍♀️|🕵🏿‍♂️|🕵🏿‍♀️|🕵🏾‍♂️|🕵🏾‍♀️|🕵🏽‍♂️|🕵🏽‍♀️|🕵🏼‍♂️|🕵🏼‍♀️|🕵🏻‍♂️|🕵🏻‍♀️|💇🏿‍♂️|💇🏿‍♀️|💇🏾‍♂️|💇🏾‍♀️|💇🏽‍♂️|💇🏽‍♀️|🏌🏽‍♀️|⛹🏾‍♀️|⛹🏾‍♂️|⛹🏿‍♀️|⛹🏿‍♂️|⛹️‍♀️|⛹️‍♂️|🙍🏿‍♂️|🙍🏿‍♀️|🏃🏻‍♀️|🙍🏾‍♂️|🏃🏻‍♂️|🙍🏾‍♀️|🏃🏼‍♀️|🙍🏽‍♂️|🏃🏼‍♂️|🙍🏽‍♀️|🏃🏽‍♀️|🙍🏼‍♂️|🏃🏽‍♂️|🙍🏼‍♀️|🏃🏾‍♀️|🙍🏻‍♂️|🏃🏾‍♂️|🙍🏻‍♀️|🏃🏿‍♀️|🏃🏿‍♂️|🏄🏻‍♀️|🏄🏻‍♂️|🫱🏼‍🫲🏽|🧑🏽‍⚕️|🧑🏽‍⚖️|🧑🏽‍✈️|🧝🏽‍♂️|🧝🏾‍♀️|🧝🏾‍♂️|🧝🏿‍♀️|🧝🏿‍♂️|🙎🏾‍♀️|🙎🏽‍♂️|🙎🏽‍♀️|🧑🏾‍⚕️|🧑🏾‍⚖️|🧑🏾‍✈️|🙎🏼‍♂️|🙎🏼‍♀️|🙎🏻‍♂️|🧑🏿‍⚕️|🧑🏿‍⚖️|🧑🏿‍✈️|🙎🏻‍♀️|⛹🏻‍♀️|⛹🏻‍♂️|⛹🏼‍♀️|⛹🏼‍♂️|⛹🏽‍♀️|⛹🏽‍♂️|🏊🏻‍♀️|🏊🏻‍♂️|🏊🏼‍♀️|🏊🏼‍♂️|🏊🏽‍♀️|🏊🏽‍♂️|🏊🏾‍♀️|🏊🏾‍♂️|🏊🏿‍♀️|🏊🏿‍♂️|🏋🏻‍♀️|🏋🏻‍♂️|🏋🏼‍♀️|🏋🏼‍♂️|🏋🏽‍♀️|🏋🏽‍♂️|🏋🏾‍♀️|🏋🏾‍♂️|🏋🏿‍♀️|🏋🏿‍♂️|🏋️‍♀️|🏋️‍♂️|🏌🏻‍♀️|🏌🏻‍♂️|🏌🏼‍♀️|🏌🏼‍♂️|🏄🏿‍♀️|🏄🏾‍♂️|🏄🏾‍♀️|🏄🏽‍♂️|🏄🏽‍♀️|🏄🏿‍♂️|🏄🏼‍♂️|🏄🏼‍♀️|🤾‍♂️|👨🏽‍🦱|👨🏽‍🦲|👨🏽‍🦳|🧜‍♀️|👨🏾‍🦰|👨🏾‍🦱|👨🏾‍🦲|👨🏾‍🦳|👨🏿‍🦰|👨🏿‍🦱|🧜‍♂️|🤦‍♂️|🤷‍♀️|👩🏼‍🦲|🧑🏽‍🦱|👩🏼‍🦱|🤾‍♀️|👩🏼‍🦰|👩🏻‍🦳|👩🏻‍🦲|👩🏻‍🦱|👩🏻‍🦰|👨🏿‍🦳|🤵‍♂️|🤵‍♀️|🧑🏽‍🩰|👨🏿‍🦲|🧛‍♀️|🧛‍♂️|🧖‍♂️|🧎‍♂️|🧖‍♀️|🧑🏾‍🦰|🧑🏽‍🦳|🧑🏽‍🦲|🧝‍♂️|🧝‍♀️|🧑🏿‍🩰|🧑🏾‍🩰|🧎‍♀️|🧞‍♀️|🧞‍♂️|🧟‍♀️|🧟‍♂️|👨🏻‍🦰|👨🏻‍🦱|👨🏻‍🦲|👨🏻‍🦳|👨🏼‍🦰|👨🏼‍🦱|👨🏼‍🦲|🧏‍♀️|👨🏼‍🦳|🧑🏾‍🦳|👨🏽‍🦰|🧑🏿‍🦰|🧏‍♂️|❤️‍🩹|🤦‍♀️|🧑🏼‍🦰|🧑🏼‍🦱|🤹‍♀️|🤹‍♂️|🧑🏼‍🦲|🧍‍♀️|🧑🏿‍🦱|🧑🏿‍🦲|🧗‍♀️|🧗‍♂️|🙂‍↕️|🙂‍↔️|🏴‍☠️|🧔‍♀️|🧑🏼‍🦳|🧘‍♂️|🧘‍♀️|🧔‍♂️|🤼‍♀️|🤼‍♂️|😶‍🌫️|🧑🏽‍🦰|🐻‍❄️|🧑🏿‍🦳|⛓️‍💥|🦹‍♂️|🦹‍♀️|🧑🏾‍🦱|🧑🏾‍🦲|🤽‍♀️|🤽‍♂️|🏳️‍🌈|🤷‍♂️|🦸‍♀️|🦸‍♂️|❤️‍🔥|👩🏼‍🦳|🧚‍♂️|🧚‍♀️|👩🏽‍🦰|👩🏽‍🦱|👩🏽‍🦲|👩🏽‍🦳|👩🏾‍🦰|👩🏾‍🦱|🧑🏼‍🩰|🤸‍♀️|🤸‍♂️|🧑🏻‍🩰|👩🏾‍🦲|👩🏾‍🦳|👩🏿‍🦰|👩🏿‍🦱|🧙‍♂️|👩🏿‍🦲|👩🏿‍🦳|🧑🏻‍🦰|🧑🏻‍🦱|🧑🏻‍🦲|🧙‍♀️|🧍‍♂️|🧑🏻‍🦳|🚣‍♀️|🧑🏻‍🦽|🚣‍♂️|🧑🏻‍🦼|🧑🏻‍🦯|🧑🏻‍🚒|🧑🏻‍🚀|🧑🏻‍🔬|🧑🏻‍🔧|🧑🏻‍💼|🧑🏻‍💻|🧑🏻‍🏭|🧑🏻‍🏫|🧑🏻‍🎨|🧑🏻‍🎤|🧑🏻‍🎓|🧑🏻‍🎄|🧑🏻‍🍼|🧑🏻‍🍳|🧑🏻‍🌾|🧑‍✈️|🧑‍⚖️|🧑🏽‍🎄|🧑🏽‍🍼|🧑🏽‍🍳|🧑🏽‍🌾|🧑🏼‍🦽|🧑🏼‍🦼|🧑🏼‍🦯|🧑🏼‍🚒|🧑🏼‍🚀|🧑🏼‍🔬|🧑🏼‍🔧|🧑🏼‍💼|🧑🏼‍💻|🧑🏼‍🏭|🧑🏼‍🏫|🧑🏼‍🎨|🧑🏼‍🎤|🧑🏼‍🎓|🧑🏼‍🎄|🧑🏼‍🍼|🧑🏼‍🍳|🧑🏼‍🌾|👩🏾‍🦯|👩🏾‍🚒|👩🏾‍🚀|👩🏾‍🔬|👩🏾‍🔧|👩🏾‍💼|👩🏾‍💻|👩🏾‍🏭|👩🏾‍🏫|👩🏾‍🎨|👩🏾‍🎤|👩🏾‍🎓|👩🏾‍🍼|👩🏾‍🍳|👩🏾‍🌾|🚴‍♀️|👩🏽‍🦽|🚴‍♂️|👩🏽‍🦼|👩🏽‍🦯|👩🏽‍🚒|👩🏽‍🚀|🧑‍⚕️|🧎‍➡️|🚶‍➡️|👩🏿‍🦽|👩🏿‍🦼|👩🏿‍🦯|👩🏿‍🚒|👩🏿‍🚀|👩🏿‍🔬|👩🏿‍🔧|👩🏿‍💼|👩🏿‍💻|👩🏿‍🏭|👩🏿‍🏫|👩🏿‍🎨|👩🏿‍🎤|👩🏿‍🎓|👩🏿‍🍼|👩🏿‍🍳|👩🏿‍🌾|👩🏾‍🦽|👩🏾‍🦼|👰‍♂️|👰‍♀️|👯‍♂️|👯‍♀️|👮‍♂️|👮‍♀️|🏊‍♂️|🏊‍♀️|🏄‍♂️|🏄‍♀️|🙍‍♀️|🙍‍♂️|🏃‍♂️|🏃‍♀️|🙎‍♀️|🧑🏿‍🦽|🙎‍♂️|🧑🏿‍🦼|🧑🏿‍🦯|🧑🏿‍🚒|🧑🏿‍🚀|🧑🏿‍🔬|🙋‍♂️|🙋‍♀️|🙇‍♂️|🙇‍♀️|🙆‍♂️|🙆‍♀️|🙅‍♂️|🙅‍♀️|💇‍♂️|💇‍♀️|💆‍♂️|💆‍♀️|💂‍♂️|💂‍♀️|💁‍♂️|💁‍♀️|👷‍♂️|👷‍♀️|👳‍♂️|👳‍♀️|👱‍♂️|👱‍♀️|🧑🏾‍🏫|🧑🏾‍🎨|🧑🏾‍🎤|🧑🏾‍🎓|🧑🏾‍🎄|🧑🏾‍🍼|🧑🏾‍🍳|🧑🏾‍🌾|🧑🏽‍🦽|🧑🏽‍🦼|🧑🏽‍🦯|🧑🏽‍🚒|🧑🏽‍🚀|🧑🏽‍🔬|🧑🏽‍🔧|🧑🏽‍💼|🧑🏽‍💻|🧑🏽‍🏭|🧑🏽‍🏫|🧑🏽‍🎨|🧑🏽‍🎤|🧑🏽‍🎓|🧑🏿‍🔧|🧑🏿‍💼|🧑🏿‍💻|🧑🏿‍🏭|🧑🏿‍🏫|🧑🏿‍🎨|🧑🏿‍🎤|🧑🏿‍🎓|🧑🏿‍🎄|🧑🏿‍🍼|🧑🏿‍🍳|🧑🏿‍🌾|🧑🏾‍🦽|🧑🏾‍🦼|🧑🏾‍🦯|🧑🏾‍🚒|🧑🏾‍🚀|🧑🏾‍🔬|🧑🏾‍🔧|🧑🏾‍💼|🧑🏾‍💻|🧑🏾‍🏭|👨🏾‍🔧|👨🏾‍💼|👨🏾‍💻|👨🏾‍🏭|👨🏾‍🏫|👨🏾‍🎨|👨🏾‍🎤|👨🏾‍🎓|👨🏾‍🍼|👨🏾‍🍳|👨🏾‍🌾|👨🏽‍🦽|👨🏽‍🦼|👨🏽‍🦯|👨🏽‍🚒|👨🏽‍🚀|👨🏽‍🔬|👨🏽‍🔧|👨🏽‍💼|👨🏽‍💻|👨🏽‍🏭|👨🏽‍🏫|👨🏿‍🦼|👨🏿‍🦯|👨🏿‍🚒|👨🏿‍🚀|👨🏿‍🔬|👨🏿‍🔧|👨🏿‍💼|👨🏿‍💻|👨🏿‍🏭|👨🏿‍🏫|👨🏿‍🎨|👨🏿‍🎤|👨🏿‍🎓|👨🏿‍🍼|👨🏿‍🍳|👨🏿‍🌾|👨🏾‍🦽|👨🏾‍🦼|👨🏾‍🦯|👨🏾‍🚒|👨🏾‍🚀|👨🏾‍🔬|👨🏽‍🎨|🚶‍♀️|👨🏻‍🦽|🚶‍♂️|👨🏻‍🦼|👨🏻‍🦯|👨🏻‍🚒|👨🏻‍🚀|👨🏻‍🔬|👨🏻‍🔧|👨🏻‍💼|👨🏻‍💻|👨🏻‍🏭|👨🏻‍🏫|👨🏻‍🎨|👨🏻‍🎤|👨🏻‍🎓|👨🏻‍🍼|👨🏻‍🍳|👨🏻‍🌾|👨‍✈️|👨‍⚖️|👨‍⚕️|👨🏽‍🎤|👨🏽‍🎓|👨🏽‍🍼|👨🏽‍🍳|👨🏽‍🌾|👨🏼‍🦽|👨🏼‍🦼|👨🏼‍🦯|👨🏼‍🚒|👨🏼‍🚀|👨🏼‍🔬|👨🏼‍🔧|👨🏼‍💼|👨🏼‍💻|👨🏼‍🏭|👨🏼‍🏫|👨🏼‍🎨|👨🏼‍🎤|👨🏼‍🎓|👨🏼‍🍼|👨🏼‍🍳|👨🏼‍🌾|👩🏼‍🎨|👩🏼‍🎤|👩🏼‍🎓|👩🏼‍🍼|👩🏼‍🍳|👩🏼‍🌾|👩🏻‍🦽|👩🏻‍🦼|👩🏻‍🦯|👩🏻‍🚒|👩🏻‍🚀|👩🏻‍🔬|👩🏻‍🔧|👩🏻‍💼|👩🏻‍💻|👩🏻‍🏭|👩🏻‍🏫|👩🏻‍🎨|👩🏻‍🎤|👩🏻‍🎓|👩🏻‍🍼|👩🏻‍🍳|👩🏻‍🌾|👩🏽‍🔬|👩🏽‍🔧|👩🏽‍💼|👩🏽‍💻|👩🏽‍🏭|👩🏽‍🏫|👩🏽‍🎨|👩🏽‍🎤|👩🏽‍🎓|👩🏽‍🍼|👩🏽‍🍳|👩🏽‍🌾|👩🏼‍🦽|👩🏼‍🦼|👩🏼‍🦯|👩🏼‍🚒|👩🏼‍🚀|👩🏼‍🔬|👩🏼‍🔧|👩🏼‍💼|👩🏼‍💻|👩🏼‍🏭|👩🏼‍🏫|👨🏿‍🦽|🚵‍♀️|👩‍⚕️|👩‍⚖️|👩‍✈️|🚵‍♂️|🏃‍➡️|🐦‍🔥|🐦‍⬛|🐕‍🦺|🐈‍⬛|👨‍🚒|👨‍🦯|👨‍🦼|🍋‍🟩|🍄‍🟫|👨‍🦽|👩‍🎨|👩‍🎤|👩‍🎓|👩‍🌾|👩‍🍳|👩‍👦|👨‍👦|👨‍👧|👩‍👧|👨‍🌾|👨‍🍳|👨‍🍼|👨‍🎓|👨‍🎤|👨‍🎨|👨‍🏫|🧑‍🩰|👨‍🏭|👨‍💻|👨‍💼|👨‍🔧|😵‍💫|😮‍💨|👨‍🔬|👨‍🚀|🧑‍🦯|🧑‍🚒|🧑‍🚀|🧑‍🔬|🧑‍🔧|🧑‍💼|🧑‍💻|🧑‍🏭|🧑‍🏫|🧑‍🧒|🧑‍🎨|🧑‍🎤|🧑‍🎓|🧑‍🎄|🧑‍🍼|👩‍🦳|👩‍🦲|👩‍🦱|👩‍🦰|👩‍🦽|🧑‍🌾|👩‍🍼|👩‍🏫|👩‍🏭|👩‍💻|👩‍💼|👩‍🔧|👩‍🔬|👩‍🚀|👩‍🚒|👩‍🦯|👩‍🦼|👨‍🦰|🧑‍🦳|🧑‍🦲|🧑‍🦱|🧑‍🦰|👨‍🦱|👨‍🦲|👨‍🦳|🧑‍🦽|🧑‍🦼|🧑‍🍳)|(?:🏴󠁧󠁢󠁷󠁬󠁳󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁥󠁮󠁧󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|\p{EBase}\p{EMod}|(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?))|[🏻-🏿🦰-🦳]|(?:(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}](?!(?:\p{EMod}|️))︎?|\p{EPres}︎)|[\#\*0-9]⃣))/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_picto.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_picto.rb new file mode 100644 index 000000000..9c78fe2eb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_picto.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PICTO = /\p{ExtPict}/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_picto_no_emoji.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_picto_no_emoji.rb new file mode 100644 index 000000000..4ad2f510c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_picto_no_emoji.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PICTO_NO_EMOJI = /[\p{ExtPict}&&\P{Emoji}]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_possible.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_possible.rb new file mode 100644 index 000000000..cda9f9cd9 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_possible.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_POSSIBLE = /(?:\p{RI}{2}|\p{Emoji}(?:\p{EMod}|️⃣?|[󠀠-󠁾]+󠁿)?)(?:‍(?:\p{RI}{2}|\p{Emoji}(?:\p{EMod}|️⃣?|[󠀠-󠁾]+󠁿)?))*/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_component.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_component.rb new file mode 100644 index 000000000..b0e048f64 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_component.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_COMPONENT = /\p{EComp}/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_emoji.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_emoji.rb new file mode 100644 index 000000000..8a7c438f2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_emoji.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_EMOJI = /\p{Emoji}/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_modifier.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_modifier.rb new file mode 100644 index 000000000..8e2be150c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_modifier.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_MODIFIER = /\p{EMod}/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_modifier_base.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_modifier_base.rb new file mode 100644 index 000000000..6d9b3d2d6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_modifier_base.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_MODIFIER_BASE = /\p{EBase}/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_presentation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_presentation.rb new file mode 100644 index 000000000..b931fa8a6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_prop_presentation.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_PROP_PRESENTATION = /\p{EPres}/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_text.rb new file mode 100644 index 000000000..a70b2ff78 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_text.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_TEXT = /(?:(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}](?!(?:\p{EMod}|️))︎?|\p{EPres}︎)|[\#\*0-9]⃣)/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_text_presentation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_text_presentation.rb new file mode 100644 index 000000000..5946e1f92 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_text_presentation.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_TEXT_PRESENTATION = /[\p{Emoji}&&\P{EPres}]/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_valid.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_valid.rb new file mode 100644 index 000000000..642b8d05d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_valid.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_VALID = /(?:(?:(?:(?:\p{EBase}\p{EMod}|(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{Emoji})‍)+(?:\p{EBase}\p{EMod}|(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{Emoji}))|(?:🏴(?:󠁬󠁶󠀰󠀴[󠀸-󠀹]|󠁬󠁶󠀰󠀴[󠀳-󠀶]|󠁬󠁶󠀰󠀳[󠀴-󠀹]|󠁬󠁶󠀰󠀳[󠀰-󠀲]|󠁬󠁶󠀰󠀲[󠀷-󠀹]|󠁬󠁶󠀰󠀲[󠀳-󠀵]|󠁬󠁶󠀰󠀲[󠀰-󠀱]|󠁬󠁶󠀰󠀱[󠀷-󠀹]|󠁬󠁶󠀰󠀱[󠀲-󠀴]|󠁣󠁺󠀵󠀲[󠀱-󠀵]|󠁬󠁶󠀰󠀰[󠀸-󠀹]|󠁬󠁶󠀰󠀰[󠀳-󠀶]|󠁭󠁮󠀰󠀴[󠀶-󠀷]|󠁧󠁢󠁥󠁮[󠁦-󠁧]|󠁣󠁺󠀵󠀳[󠀱-󠀴]|󠁣󠁺󠀶󠀳[󠀱-󠀵]|󠁰󠁥󠁬󠁡[󠁬-󠁭]|󠁣󠁺󠀶󠀴[󠀱-󠀷]|󠁰󠁨󠁰󠁡[󠁭-󠁮]|󠁣󠁺󠀷󠀱[󠀱-󠀵]|󠁦󠁲󠀹󠀷[󠀱-󠀴]|󠁭󠁡󠁢󠁥[󠁲-󠁳]|󠁣󠁺󠀱󠀲[󠀰-󠀲]|󠁣󠁺󠀶󠀱[󠀱-󠀵]|󠁣󠁺󠀶󠀲[󠀱-󠀷]|󠁣󠁺󠀳󠀲[󠀱-󠀷]|󠁥󠁥󠀷󠀹[󠀲-󠀳]|󠁣󠁺󠀴󠀱[󠀱-󠀳]|󠁧󠁢󠁨󠁡[󠁬-󠁭]|󠁣󠁺󠀴󠀲[󠀱-󠀷]|󠁬󠁶󠀱󠀰[󠀷-󠀹]|󠁬󠁶󠀱󠀰[󠀳-󠀵]|󠁬󠁶󠀰󠀹[󠀵-󠀶]|󠁬󠁶󠀰󠀹[󠀲-󠀳]|󠁬󠁶󠀰󠀸[󠀱-󠀶]|󠁬󠁶󠀰󠀷[󠀸-󠀹]|󠁬󠁶󠀰󠀷[󠀴-󠀶]|󠁬󠁶󠀰󠀷[󠀰-󠀲]|󠁣󠁺󠀵󠀱[󠀱-󠀴]|󠁬󠁶󠀰󠀶[󠀳-󠀶]|󠁬󠁶󠀰󠀶[󠀰-󠀱]|󠁵󠁧󠀱󠀱[󠀰-󠀹]|󠁵󠁧󠀱󠀲[󠀰-󠀶]|󠁵󠁧󠀲󠀰[󠀱-󠀹]|󠁵󠁧󠀲󠀱[󠀰-󠀹]|󠁧󠁢󠁳󠁴[󠁳-󠁴]|󠁵󠁧󠀲󠀲[󠀰-󠀹]|󠁧󠁢󠁳󠁴[󠁧-󠁨]|󠁵󠁧󠀲󠀳[󠀰-󠀷]|󠁵󠁧󠀳󠀰[󠀱-󠀹]|󠁵󠁧󠀳󠀱[󠀰-󠀹]|󠁵󠁧󠀳󠀲[󠀰-󠀹]|󠁵󠁧󠀳󠀳[󠀰-󠀷]|󠁵󠁧󠀴󠀰[󠀱-󠀹]|󠁵󠁧󠀴󠀱[󠀰-󠀹]|󠁵󠁧󠀴󠀲[󠀰-󠀹]|󠁵󠁧󠀴󠀳[󠀰-󠀵]|󠁧󠁢󠁳󠁯[󠁬-󠁭]|󠁰󠁳󠁪󠁥[󠁭-󠁮]|󠁧󠁢󠁢󠁤[󠁦-󠁧]|󠁧󠁢󠁳󠁬[󠁦-󠁧]|󠁧󠁢󠁢󠁲[󠁣-󠁤]|󠁡󠁺󠁳󠁡[󠁫-󠁬]|󠁭󠁮󠀰󠀶[󠀳-󠀵]|󠁬󠁶󠀱󠀱[󠀱-󠀳]|󠁬󠁶󠀱󠀰[󠀱-󠀲]|󠁣󠁺󠀷󠀲[󠀱-󠀴]|󠁧󠁢󠁤󠁮[󠁣-󠁤]|󠁣󠁺󠀸󠀰[󠀱-󠀶]|󠁬󠁶󠀰󠀸[󠀷-󠀹]|󠁮󠁬󠁢󠁱[󠀱-󠀳]|󠁥󠁥󠀴󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀶[󠀷-󠀸]|󠁬󠁶󠀰󠀵[󠀸-󠀹]|󠁩󠁳󠁳󠁫[󠁦-󠁧]|󠁥󠁥󠀴󠀳[󠀰-󠀲]|󠁥󠁥󠀱󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀱[󠀵-󠀶]|󠁰󠁷󠀲󠀲[󠀶-󠀸]|󠁥󠁥󠀲󠀸[󠀳-󠀴]|󠁧󠁢󠁡󠁢[󠁣-󠁥]|󠁵󠁧󠀱󠀰[󠀱-󠀹]|󠁭󠁫󠀶󠀰[󠀱-󠀹]|󠁭󠁫󠀷󠀰[󠀱-󠀶]|󠁭󠁫󠀸󠀰[󠀱-󠀹]|󠁭󠁫󠀸󠀱[󠀰-󠀷]|󠁭󠁡󠁫󠁨[󠁮-󠁯]|󠁳󠁩󠀲󠀱[󠀰-󠀳]|󠁳󠁩󠀲󠀰[󠀰-󠀹]|󠁳󠁩󠀱󠀹[󠀰-󠀹]|󠁳󠁩󠀱󠀸[󠀰-󠀹]|󠁳󠁩󠀱󠀷[󠀰-󠀹]|󠁳󠁩󠀱󠀶[󠀰-󠀹]|󠁳󠁩󠀱󠀵[󠀰-󠀹]|󠁢󠁦󠁫󠁯[󠁳-󠁴]|󠁳󠁩󠀱󠀴[󠀶-󠀹]|󠁳󠁩󠀱󠀴[󠀰-󠀴]|󠁭󠁡󠁧󠁵[󠁥-󠁦]|󠁭󠁨󠁡󠁬[󠁫-󠁬]|󠁡󠁦󠁢󠁡[󠁬-󠁭]|󠁡󠁺󠁺󠁡[󠁱-󠁲]|󠁢󠁦󠁢󠁡[󠁬-󠁮]|󠁭󠁫󠀱󠀰[󠀱-󠀹]|󠁭󠁫󠀲󠀰[󠀱-󠀹]|󠁭󠁡󠁳󠁩[󠁫-󠁬]|󠁭󠁫󠀲󠀱[󠀰-󠀱]|󠁭󠁫󠀳󠀰[󠀳-󠀴]|󠁭󠁫󠀳󠀰[󠀷-󠀸]|󠁭󠁫󠀳󠀱[󠀰-󠀳]|󠁣󠁺󠀲󠀰[󠀱-󠀹]|󠁣󠁺󠀲󠀰[󠁡-󠁣]|󠁭󠁫󠀴󠀰[󠀱-󠀹]|󠁣󠁺󠀳󠀱[󠀱-󠀷]|󠁭󠁫󠀵󠀰[󠀱-󠀹]|󠁳󠁩󠀱󠀳[󠀰-󠀹]|󠁳󠁩󠀰󠀸[󠀰-󠀹]|󠁳󠁩󠀰󠀹[󠀰-󠀹]|󠁳󠁩󠀱󠀰[󠀰-󠀹]|󠁳󠁩󠀰󠀱[󠀰-󠀹]|󠁳󠁩󠀰󠀷[󠀰-󠀹]|󠁳󠁩󠀰󠀲[󠀰-󠀹]|󠁰󠁧󠁭󠁰[󠁬-󠁭]|󠁳󠁩󠀱󠀱[󠀰-󠀹]|󠁳󠁩󠀱󠀲[󠀰-󠀹]|󠁳󠁩󠀰󠀳[󠀰-󠀹]|󠁳󠁩󠀰󠀶[󠀰-󠀹]|󠁰󠁨󠁣󠁡[󠁳-󠁴]|󠁳󠁩󠀰󠀴[󠀰-󠀹]|󠁣󠁺󠀱󠀰[󠁡-󠁦]|󠁰󠁨󠁣󠁡[󠁭-󠁮]|󠁣󠁺󠀱󠀰[󠀱-󠀹]|󠁰󠁨󠁢󠁵[󠁫-󠁬]|󠁳󠁩󠀰󠀵[󠀰-󠀹]|󠁣󠁺󠀱󠀱[󠀰-󠀹]|󠁡󠁯󠁣󠁮[󠁮-󠁯]|󠁳󠁩󠀰󠀰[󠀱-󠀹]|󠁣󠁶󠁳[󠁬-󠁭]|󠁬󠁩󠀱[󠀰-󠀱]|󠁢󠁦󠀰[󠀱-󠀹]|󠁺󠁷󠁭[󠁶-󠁷]|󠁢󠁲󠁡[󠁬-󠁭]|󠁬󠁫󠀱[󠀱-󠀳]|󠁬󠁫󠀲[󠀱-󠀳]|󠁢󠁦󠀱[󠀰-󠀳]|󠁬󠁫󠀳[󠀱-󠀳]|󠁬󠁫󠀴[󠀱-󠀵]|󠁢󠁲󠁭[󠁳-󠁴]|󠁫󠁨󠀱[󠀰-󠀹]|󠁫󠁲󠀳[󠀰-󠀱]|󠁺󠁭󠀰[󠀱-󠀹]|󠁵󠁳󠁭[󠁤-󠁥]|󠁵󠁳󠁭[󠁮-󠁯]|󠁵󠁳󠁭[󠁳-󠁴]|󠁵󠁳󠁮[󠁣-󠁥]|󠁬󠁫󠀹[󠀱-󠀲]|󠁬󠁫󠀸[󠀱-󠀲]|󠁬󠁫󠀷[󠀱-󠀲]|󠁵󠁳󠁳[󠁣-󠁤]|󠁪󠁰󠀰[󠀱-󠀹]|󠁡󠁬󠁫[󠁡-󠁣]|󠁪󠁰󠀱[󠀰-󠀹]|󠁪󠁰󠀲[󠀰-󠀹]|󠁢󠁲󠁲[󠁲-󠁳]|󠁢󠁲󠁲[󠁮-󠁯]|󠁬󠁫󠀶[󠀱-󠀲]|󠁬󠁫󠀵[󠀱-󠀳]|󠁢󠁲󠁰[󠁡-󠁢]|󠁪󠁰󠀳[󠀰-󠀹]|󠁪󠁰󠀴[󠀰-󠀷]|󠁫󠁥󠀰[󠀱-󠀹]|󠁫󠁥󠀱[󠀰-󠀹]|󠁫󠁥󠀲[󠀰-󠀹]|󠁫󠁥󠀳[󠀰-󠀹]|󠁫󠁥󠀴[󠀰-󠀷]|󠁫󠁲󠀴[󠀱-󠀹]|󠁮󠁧󠁫[󠁤-󠁥]|󠁲󠁳󠀰[󠀰-󠀹]|󠁶󠁮󠀴[󠀳-󠀷]|󠁲󠁵󠁫[󠁫-󠁬]|󠁶󠁮󠀵[󠀰-󠀹]|󠁶󠁮󠀶[󠀶-󠀹]|󠁶󠁮󠀷[󠀰-󠀳]|󠁬󠁡󠁢[󠁫-󠁬]|󠁲󠁵󠁫[󠁢-󠁣]|󠁫󠁺󠀶[󠀱-󠀳]|󠁢󠁩󠁢[󠁬-󠁭]|󠁢󠁧󠀱[󠀰-󠀹]|󠁢󠁧󠀲[󠀰-󠀸]|󠁢󠁨󠀱[󠀳-󠀵]|󠁫󠁲󠀲[󠀶-󠀹]|󠁫󠁰󠀱[󠀳-󠀵]|󠁣󠁵󠀰[󠀳-󠀹]|󠁫󠁮󠀰[󠀱-󠀹]|󠁫󠁮󠀱[󠀰-󠀳]|󠁲󠁳󠀱[󠀰-󠀹]|󠁲󠁳󠀲[󠀰-󠀹]|󠁫󠁰󠀰[󠀱-󠀹]|󠁬󠁩󠀰[󠀱-󠀹]|󠁵󠁹󠁲[󠁮-󠁯]|󠁬󠁣󠀱[󠀰-󠀲]|󠁬󠁣󠀰[󠀵-󠀸]|󠁬󠁣󠀰[󠀱-󠀳]|󠁬󠁢󠁢[󠁨-󠁩]|󠁭󠁹󠀰[󠀱-󠀹]|󠁭󠁹󠀱[󠀰-󠀶]|󠁢󠁪󠁡[󠁫-󠁬]|󠁶󠁣󠀰[󠀱-󠀶]|󠁫󠁺󠀱[󠀰-󠀱]|󠁮󠁧󠁫[󠁮-󠁯]|󠁶󠁮󠀰[󠀱-󠀷]|󠁶󠁮󠀱[󠀳-󠀴]|󠁶󠁮󠀲[󠀰-󠀹]|󠁫󠁨󠀲[󠀰-󠀵]|󠁣󠁵󠀱[󠀰-󠀶]|󠁶󠁮󠀳[󠀰-󠀷]|󠁮󠁡󠁯[󠁳-󠁴]|󠁢󠁧󠀰[󠀱-󠀹]|󠁶󠁮󠀴[󠀰-󠀱]|󠁴󠁨󠀲[󠀰-󠀷]|󠁴󠁨󠀳[󠀰-󠀹]|󠁴󠁨󠀴[󠀰-󠀹]|󠁴󠁨󠀵[󠀰-󠀸]|󠁴󠁨󠀶[󠀰-󠀷]|󠁴󠁨󠀷[󠀰-󠀷]|󠁴󠁨󠀸[󠀰-󠀶]|󠁴󠁨󠀹[󠀰-󠀶]|󠁣󠁤󠁨[󠁫-󠁬]|󠁣󠁡󠁮[󠁳-󠁵]|󠁳󠁧󠀰[󠀱-󠀵]|󠁴󠁮󠀱[󠀱-󠀴]|󠁴󠁮󠀲[󠀱-󠀳]|󠁴󠁮󠀳[󠀱-󠀴]|󠁴󠁮󠀴[󠀱-󠀳]|󠁴󠁮󠀵[󠀱-󠀳]|󠁴󠁮󠀷[󠀱-󠀳]|󠁴󠁮󠀸[󠀱-󠀳]|󠁴󠁯󠀰[󠀱-󠀵]|󠁴󠁲󠀰[󠀱-󠀹]|󠁴󠁲󠀱[󠀰-󠀹]|󠁴󠁲󠀲[󠀰-󠀹]|󠁴󠁲󠀳[󠀰-󠀹]|󠁴󠁲󠀴[󠀰-󠀹]|󠁴󠁲󠀵[󠀰-󠀹]|󠁴󠁲󠀶[󠀰-󠀹]|󠁴󠁲󠀷[󠀰-󠀹]|󠁴󠁲󠀸[󠀰-󠀱]|󠁭󠁡󠀱[󠀰-󠀲]|󠁭󠁥󠀲[󠀰-󠀵]|󠁭󠁥󠀱[󠀰-󠀹]|󠁭󠁥󠀰[󠀱-󠀹]|󠁥󠁳󠁭[󠁣-󠁤]|󠁭󠁤󠁳[󠁮-󠁯]|󠁥󠁳󠁴[󠁥-󠁦]|󠁭󠁤󠁣[󠁲-󠁵]|󠁭󠁤󠁣[󠁬-󠁭]|󠁭󠁤󠁢[󠁲-󠁳]|󠁭󠁣󠁳[󠁯-󠁰]|󠁥󠁴󠁳[󠁮-󠁯]|󠁦󠁩󠀰[󠀲-󠀹]|󠁦󠁩󠀱[󠀰-󠀹]|󠁦󠁪󠀰[󠀱-󠀹]|󠁦󠁪󠀱[󠀰-󠀴]|󠁳󠁴󠀰[󠀱-󠀶]|󠁣󠁨󠁺[󠁧-󠁨]|󠁣󠁨󠁳[󠁧-󠁨]|󠁳󠁹󠁨[󠁬-󠁭]|󠁳󠁮󠁫[󠁤-󠁥]|󠁣󠁮󠁨[󠁡-󠁢]|󠁣󠁧󠀱[󠀱-󠀶]|󠁣󠁮󠁨[󠁫-󠁬]|󠁳󠁭󠀰[󠀱-󠀹]|󠁭󠁭󠀰[󠀱-󠀷]|󠁭󠁭󠀱[󠀱-󠀸]|󠁣󠁮󠁳[󠁣-󠁤]|󠁣󠁤󠁭[󠁮-󠁯]|󠁴󠁨󠀱[󠀰-󠀹]|󠁭󠁴󠀵[󠀰-󠀹]|󠁭󠁴󠀶[󠀰-󠀸]|󠁥󠁳󠁣[󠁲-󠁵]|󠁳󠁢󠁭[󠁫-󠁬]|󠁥󠁳󠁣[󠁬-󠁯]|󠁥󠁳󠁣[󠁡-󠁣]|󠁥󠁳󠁡[󠁲-󠁳]|󠁭󠁶󠀰[󠀰-󠀵]|󠁭󠁶󠀰[󠀷-󠀸]|󠁭󠁶󠀱[󠀲-󠀴]|󠁳󠁡󠀱[󠀰-󠀲]|󠁢󠁷󠁳[󠁯-󠁰]|󠁳󠁡󠀰[󠀱-󠀹]|󠁲󠁷󠀰[󠀱-󠀵]|󠁭󠁶󠀲[󠀳-󠀹]|󠁭󠁷󠁫[󠁲-󠁳]|󠁭󠁷󠁭[󠁧-󠁨]|󠁢󠁴󠀴[󠀱-󠀵]|󠁢󠁴󠀳[󠀱-󠀴]|󠁢󠁴󠀲[󠀱-󠀴]|󠁢󠁴󠀱[󠀱-󠀵]|󠁵󠁳󠁡[󠁫-󠁬]|󠁬󠁴󠀵[󠀰-󠀹]|󠁬󠁴󠀴[󠀰-󠀹]|󠁬󠁴󠀳[󠀰-󠀹]|󠁢󠁳󠁮[󠁯-󠁰]|󠁬󠁴󠀲[󠀰-󠀹]|󠁬󠁴󠀱[󠀰-󠀹]|󠁬󠁴󠀰[󠀱-󠀹]|󠁭󠁡󠀰[󠀱-󠀹]|󠁦󠁲󠀰[󠀱-󠀹]|󠁦󠁲󠀱[󠀰-󠀹]|󠁦󠁲󠀲[󠀱-󠀹]|󠁦󠁲󠀲[󠁡-󠁢]|󠁦󠁲󠀳[󠀰-󠀹]|󠁦󠁲󠀴[󠀰-󠀹]|󠁦󠁲󠀵[󠀰-󠀹]|󠁦󠁲󠀶[󠀰-󠀹]|󠁬󠁹󠁭[󠁩-󠁪]|󠁳󠁥󠁡[󠁢-󠁣]|󠁦󠁲󠀷[󠀰-󠀴]|󠁦󠁲󠀷[󠀶-󠀹]|󠁦󠁲󠀸[󠀰-󠀹]|󠁦󠁲󠀹[󠀰-󠀵]|󠁭󠁲󠀰[󠀱-󠀹]|󠁭󠁲󠀱[󠀰-󠀵]|󠁭󠁴󠀰[󠀱-󠀹]|󠁭󠁴󠀱[󠀰-󠀹]|󠁭󠁴󠀲[󠀰-󠀹]|󠁭󠁴󠀳[󠀰-󠀹]|󠁭󠁴󠀴[󠀰-󠀹]|󠁳󠁣󠀲[󠀰-󠀷]|󠁳󠁣󠀱[󠀰-󠀹]|󠁴󠁺󠀰[󠀱-󠀹]|󠁴󠁺󠀱[󠀰-󠀹]|󠁴󠁺󠀲[󠀰-󠀹]|󠁴󠁺󠀳[󠀰-󠀱]|󠁳󠁣󠀰[󠀱-󠀹]|󠁲󠁯󠁴[󠁬-󠁭]|󠁩󠁲󠀱[󠀰-󠀹]|󠁩󠁴󠁭[󠁳-󠁴]|󠁩󠁤󠁳[󠁬-󠁮]|󠁩󠁴󠁭[󠁮-󠁯]|󠁩󠁴󠁡[󠁰-󠁲]|󠁩󠁲󠀰[󠀰-󠀹]|󠁮󠁲󠀱[󠀰-󠀴]|󠁮󠁲󠀰[󠀱-󠀹]|󠁩󠁴󠁭[󠁢-󠁣]|󠁩󠁤󠁳[󠁲-󠁵]|󠁮󠁰󠁰[󠀱-󠀷]|󠁩󠁥󠁣[󠁮-󠁯]|󠁤󠁭󠀱[󠀰-󠀱]|󠁩󠁴󠁬[󠁴-󠁵]|󠁰󠁹󠀱[󠀰-󠀶]|󠁤󠁯󠀰[󠀱-󠀹]|󠁧󠁮󠁫[󠁮-󠁯]|󠁧󠁮󠁫[󠁤-󠁥]|󠁤󠁺󠀱[󠀰-󠀹]|󠁤󠁺󠀲[󠀰-󠀹]|󠁰󠁬󠁳[󠁫-󠁬]|󠁩󠁤󠁰[󠁡-󠁢]|󠁩󠁤󠁰[󠁤-󠁥]|󠁩󠁴󠁰[󠁴-󠁶]|󠁩󠁤󠁰[󠁳-󠁴]|󠁧󠁮󠁭[󠁬-󠁭]|󠁭󠁫󠀶[󠀰-󠀹]|󠁮󠁩󠁭[󠁳-󠁴]|󠁭󠁫󠀷[󠀰-󠀹]|󠁭󠁫󠀸[󠀰-󠀵]|󠁤󠁺󠀳[󠀰-󠀹]|󠁩󠁴󠁰[󠁮-󠁯]|󠁩󠁤󠁳[󠁡-󠁢]|󠁩󠁴󠁰[󠁣-󠁥]|󠁩󠁲󠀲[󠀰-󠀹]|󠁧󠁮󠁭[󠁣-󠁤]|󠁥󠁣󠁳[󠁤-󠁥]|󠁩󠁴󠁢[󠁲-󠁴]|󠁩󠁮󠁴[󠁲-󠁳]|󠁮󠁯󠀲[󠀱-󠀲]|󠁰󠁨󠀴[󠀰-󠀱]|󠁰󠁨󠀱[󠀰-󠀵]|󠁰󠁨󠀰[󠀵-󠀹]|󠁡󠁧󠀰[󠀳-󠀸]|󠁩󠁴󠁣[󠁲-󠁴]|󠁩󠁴󠁣[󠁮-󠁯]|󠁡󠁧󠀱[󠀰-󠀱]|󠁰󠁴󠀱[󠀰-󠀸]|󠁩󠁴󠁣[󠁡-󠁢]|󠁰󠁴󠀰[󠀱-󠀹]|󠁡󠁬󠀰[󠀱-󠀹]|󠁡󠁬󠀱[󠀰-󠀲]|󠁰󠁨󠀰[󠀰-󠀳]|󠁮󠁯󠀱[󠀶-󠀷]|󠁧󠁮󠁫[󠁡-󠁢]|󠁩󠁥󠁭[󠁮-󠁯]|󠁧󠁮󠁢[󠁥-󠁦]|󠁤󠁯󠀱[󠀰-󠀹]|󠁩󠁲󠀳[󠀱-󠀲]|󠁩󠁥󠁷[󠁷-󠁸]|󠁤󠁯󠀲[󠀰-󠀹]|󠁩󠁮󠁡[󠁲-󠁳]|󠁩󠁮󠁣[󠁧-󠁨]|󠁤󠁯󠀳[󠀰-󠀹]|󠁤󠁺󠀴[󠀰-󠀹]|󠁧󠁥󠁳[󠁪-󠁫]|󠁧󠁤󠀰[󠀱-󠀶]|󠁤󠁺󠀵[󠀰-󠀸]|󠁮󠁯󠀰[󠀱-󠀲]|󠁮󠁯󠀰[󠀴-󠀹]|󠁩󠁴󠁢[󠁮-󠁯]|󠁤󠁯󠀴[󠀰-󠀲]|󠁩󠁱󠁢[󠁡-󠁢]|󠁨󠁴󠁮[󠁤-󠁥]|󠁧󠁲󠀷[󠀱-󠀳]|󠁨󠁲󠀲[󠀰-󠀱]|󠁨󠁲󠀱[󠀰-󠀹]|󠁨󠁲󠀰[󠀱-󠀹]|󠁨󠁴󠁳[󠁤-󠁥]|󠁢󠁡󠀰[󠀱-󠀹]|󠁨󠁮󠁣[󠁬-󠁭]|󠁨󠁵󠁳[󠁮-󠁯]|󠁧󠁲󠀶[󠀱-󠀴]|󠁪󠁭󠀱[󠀰-󠀴]|󠁣󠁩󠀰[󠀱-󠀹]|󠁨󠁵󠁳[󠁳-󠁴]|󠁧󠁷󠁢[󠁬-󠁭]|󠁧󠁴󠀲[󠀰-󠀲]|󠁣󠁩󠀱[󠀰-󠀹]|󠁣󠁮󠀱[󠀱-󠀵]|󠁣󠁮󠀲[󠀱-󠀳]|󠁭󠁫󠀲[󠀰-󠀹]|󠁢󠁤󠀶[󠀰-󠀴]|󠁢󠁤󠀵[󠀰-󠀹]|󠁢󠁤󠀴[󠀰-󠀹]|󠁢󠁤󠀳[󠀰-󠀹]|󠁢󠁤󠀲[󠀰-󠀹]|󠁢󠁤󠀱[󠀰-󠀹]|󠁢󠁤󠀰[󠀱-󠀹]|󠁢󠁢󠀱[󠀰-󠀱]|󠁡󠁬󠁰[󠁱-󠁲]|󠁢󠁢󠀰[󠀱-󠀹]|󠁤󠁫󠀸[󠀱-󠀵]|󠁩󠁴󠀷[󠀷-󠀸]|󠁧󠁲󠀹[󠀱-󠀴]|󠁤󠁪󠁡[󠁲-󠁳]|󠁡󠁤󠀰[󠀲-󠀸]|󠁣󠁹󠀰[󠀱-󠀶]|󠁧󠁲󠀸[󠀱-󠀵]|󠁤󠁪󠁤[󠁩-󠁪]|󠁭󠁡󠀱[󠀳-󠀶]|󠁩󠁴󠁶[󠁡-󠁣]|󠁩󠁤󠁫[󠁲-󠁵]|󠁭󠁫󠀳[󠀰-󠀹]|󠁧󠁲󠀴[󠀱-󠀴]|󠁭󠁫󠀴[󠀰-󠀹]|󠁧󠁲󠀳[󠀱-󠀴]|󠁧󠁲󠀲[󠀱-󠀴]|󠁩󠁤󠁮[󠁴-󠁵]|󠁩󠁴󠁴[󠁲-󠁳]|󠁩󠁴󠁴[󠁮-󠁰]|󠁧󠁲󠀱[󠀱-󠀷]|󠁩󠁴󠁳[󠁵-󠁶]|󠁩󠁴󠁳[󠁲-󠁳]|󠁩󠁴󠁳[󠁯-󠁰]|󠁧󠁲󠀰[󠀳-󠀷]|󠁭󠁫󠀰[󠀱-󠀹]|󠁤󠁺󠀰[󠀱-󠀹]|󠁣󠁮󠀳[󠀱-󠀷]|󠁣󠁮󠀴[󠀱-󠀶]|󠁣󠁮󠀵[󠀰-󠀴]|󠁧󠁴󠀱[󠀰-󠀹]|󠁭󠁫󠀵[󠀰-󠀹]|󠁤󠁭󠀰[󠀲-󠀹]|󠁣󠁮󠀶[󠀱-󠀵]|󠁭󠁫󠀱[󠀰-󠀹]|󠁧󠁴󠀰[󠀱-󠀹]|󠁪󠁭󠀰[󠀱-󠀹]|󠁧󠁲󠀵[󠀱-󠀹]|󠁣󠁮󠀹[󠀱-󠀲]|󠁩󠁤󠁢[󠁡-󠁢]|󠁲󠁯󠁣[󠁳-󠁴]|󠁩󠁤󠁪[󠁡-󠁢]|󠁩󠁤󠁫[󠁡-󠁢]|󠁩󠁴󠁲[󠁭-󠁯]|󠁴󠁭[󠁡-󠁢]|󠁳󠁥[󠁷-󠁺]|󠁡󠁲[󠁪-󠁮]|󠁡󠁲[󠁰-󠁺]|󠁡󠁴[󠀱-󠀹]|󠁬󠁳[󠁡-󠁨]|󠁬󠁳[󠁪-󠁫]|󠁶󠁥[󠁲-󠁺]|󠁰󠁹[󠀲-󠀹]|󠁣󠁲[󠁧-󠁨]|󠁦󠁲[󠁨-󠁬]|󠁦󠁲[󠁤-󠁧]|󠁭󠁺[󠁰-󠁱]|󠁦󠁲[󠁡-󠁢]|󠁭󠁺[󠁳-󠁴]|󠁴󠁭[󠁬-󠁭]|󠁳󠁥[󠁳-󠁵]|󠁳󠁥[󠁣-󠁩]|󠁮󠁥[󠀱-󠀸]|󠁩󠁳[󠀱-󠀸]|󠁧󠁡[󠀱-󠀹]|󠁳󠁥[󠁭-󠁯]|󠁧󠁲[󠁡-󠁭]|󠁫󠁨[󠀳-󠀹]|󠁫󠁧[󠁮-󠁯]|󠁭󠁧[󠁴-󠁵]|󠁫󠁧[󠁢-󠁣]|󠁮󠁰[󠀱-󠀵]|󠁥󠁣[󠁷-󠁺]|󠁥󠁣[󠁴-󠁵]|󠁥󠁣[󠁲-󠁳]|󠁥󠁣[󠁬-󠁰]|󠁡󠁲[󠁡-󠁨]|󠁥󠁣[󠁡-󠁩]|󠁭󠁬[󠀲-󠀹]|󠁦󠁲[󠁵-󠁶]|󠁢󠁯[󠁳-󠁴]|󠁢󠁯[󠁮-󠁰]|󠁢󠁯[󠁢-󠁣]|󠁦󠁲[󠁳-󠁴]|󠁧󠁭[󠁬-󠁮]|󠁦󠁲[󠁱-󠁲]|󠁰󠁡[󠀲-󠀹]|󠁣󠁧[󠀷-󠀹]|󠁭󠁺[󠁡-󠁢]|󠁦󠁲[󠁯-󠁰]|󠁶󠁥[󠁡-󠁰]|󠁢󠁤[󠁡-󠁨]|󠁰󠁥󠁴󠁡󠁣|󠁰󠁥󠁴󠁵󠁭|󠁰󠁥󠁵󠁣󠁡|󠁰󠁧󠁣󠁰󠁫|󠁰󠁧󠁣󠁰󠁭|󠁰󠁥󠁳󠁡󠁭|󠁰󠁥󠁰󠁵󠁮|󠁰󠁥󠁰󠁩󠁵|󠁰󠁥󠁰󠁡󠁳|󠁰󠁥󠁭󠁯󠁱|󠁰󠁥󠁭󠁤󠁤|󠁰󠁥󠁬󠁯󠁲|󠁰󠁥󠁬󠁭󠁡|󠁰󠁥󠁬󠁩󠁭|󠁰󠁥󠁪󠁵󠁮|󠁰󠁥󠁩󠁣󠁡|󠁰󠁥󠁨󠁵󠁶|󠁰󠁥󠁨󠁵󠁣|󠁭󠁮󠀰󠀴󠀹|󠁰󠁥󠁣󠁵󠁳|󠁰󠁥󠁣󠁡󠁬|󠁭󠁮󠀰󠀳󠀷|󠁭󠁮󠀰󠀳󠀵|󠁰󠁨󠁡󠁬󠁢|󠁭󠁬󠁢󠁫󠁯|󠁭󠁫󠀴󠀱󠀰|󠁭󠁫󠀳󠀰󠀱|󠁭󠁨󠁷󠁴󠁪|󠁭󠁨󠁷󠁴󠁨|󠁭󠁨󠁵󠁴󠁩|󠁭󠁨󠁵󠁪󠁡|󠁭󠁨󠁲󠁯󠁮|󠁭󠁨󠁮󠁭󠁵|󠁭󠁨󠁮󠁭󠁫|󠁭󠁨󠁭󠁩󠁬|󠁭󠁨󠁭󠁥󠁪|󠁭󠁨󠁭󠁡󠁬|󠁭󠁨󠁭󠁡󠁪|󠁭󠁨󠁬󠁩󠁫|󠁭󠁨󠁬󠁩󠁢|󠁭󠁨󠁬󠁡󠁥|󠁭󠁨󠁫󠁷󠁡|󠁭󠁨󠁫󠁩󠁬|󠁭󠁨󠁪󠁡󠁬|󠁭󠁨󠁪󠁡󠁢|󠁭󠁨󠁥󠁮󠁩|󠁰󠁧󠁥󠁢󠁲|󠁰󠁧󠁥󠁨󠁧|󠁰󠁧󠁥󠁰󠁷|󠁰󠁧󠁥󠁳󠁷|󠁰󠁧󠁧󠁰󠁫|󠁰󠁧󠁨󠁬󠁡|󠁰󠁧󠁪󠁷󠁫|󠁭󠁮󠀰󠀴󠀳|󠁭󠁮󠀰󠀴󠀱|󠁰󠁧󠁭󠁢󠁡|󠁰󠁧󠁭󠁲󠁬|󠁰󠁧󠁮󠁣󠁤|󠁰󠁧󠁮󠁩󠁫|󠁰󠁧󠁮󠁰󠁰|󠁰󠁧󠁮󠁳󠁢|󠁰󠁧󠁳󠁡󠁮|󠁰󠁧󠁳󠁨󠁭|󠁰󠁧󠁷󠁢󠁫|󠁰󠁧󠁷󠁨󠁭|󠁰󠁧󠁷󠁰󠁤|󠁰󠁨󠁡󠁢󠁲|󠁰󠁨󠁡󠁧󠁮|󠁰󠁨󠁡󠁧󠁳|󠁭󠁮󠀰󠀳󠀹|󠁰󠁨󠁡󠁫󠁬|󠁭󠁸󠁴󠁡󠁢|󠁭󠁸󠁴󠁡󠁭|󠁭󠁸󠁴󠁬󠁡|󠁭󠁸󠁶󠁥󠁲|󠁭󠁸󠁹󠁵󠁣|󠁭󠁸󠁺󠁡󠁣|󠁥󠁧󠁡󠁳󠁴|󠁥󠁧󠁡󠁳󠁮|󠁭󠁺󠁭󠁰󠁭|󠁥󠁥󠀴󠀴󠀶|󠁥󠁥󠀴󠀷󠀸|󠁥󠁧󠁡󠁬󠁸|󠁥󠁥󠀹󠀲󠀸|󠁥󠁥󠀹󠀱󠀹|󠁥󠁥󠀹󠀱󠀷|󠁥󠁥󠀹󠀰󠀷|󠁥󠁥󠀴󠀸󠀰|󠁥󠁥󠀹󠀰󠀳|󠁭󠁸󠁯󠁡󠁸|󠁥󠁥󠀲󠀷󠀲|󠁥󠁥󠀲󠀹󠀱|󠁭󠁸󠁰󠁵󠁥|󠁥󠁥󠀲󠀹󠀳|󠁭󠁸󠁱󠁵󠁥|󠁥󠁥󠀲󠀹󠀶|󠁭󠁸󠁲󠁯󠁯|󠁥󠁥󠀳󠀰󠀳|󠁭󠁸󠁳󠁩󠁮|󠁥󠁥󠀳󠀰󠀵|󠁥󠁥󠀳󠀱󠀷|󠁭󠁸󠁳󠁬󠁰|󠁥󠁥󠀳󠀲󠀱|󠁥󠁥󠀳󠀳󠀸|󠁥󠁥󠀳󠀵󠀳|󠁥󠁥󠀴󠀲󠀴|󠁭󠁸󠁳󠁯󠁮|󠁥󠁥󠀴󠀸󠀶|󠁥󠁥󠀷󠀳󠀲|󠁥󠁥󠀷󠀲󠀶|󠁥󠁥󠀷󠀱󠀹|󠁥󠁥󠀷󠀱󠀴|󠁥󠁥󠀷󠀱󠀲|󠁥󠁥󠀷󠀰󠀸|󠁥󠁥󠀵󠀸󠀶|󠁥󠁥󠀶󠀱󠀵|󠁥󠁥󠀶󠀱󠀸|󠁥󠁥󠀶󠀹󠀸|󠁥󠁥󠀶󠀸󠀹|󠁥󠁥󠀶󠀶󠀸|󠁥󠁥󠀶󠀶󠀳|󠁥󠁥󠀶󠀶󠀱|󠁥󠁥󠀶󠀲󠀲|󠁥󠁥󠀶󠀲󠀴|󠁥󠁥󠀶󠀳󠀸|󠁥󠁥󠀶󠀵󠀱|󠁥󠁥󠀵󠀰󠀳|󠁥󠁥󠀹󠀰󠀱|󠁥󠁥󠀸󠀹󠀹|󠁥󠁥󠀸󠀹󠀷|󠁥󠁥󠀸󠀹󠀰|󠁥󠁥󠀵󠀱󠀱|󠁥󠁥󠀸󠀵󠀵|󠁥󠁥󠀵󠀱󠀴|󠁥󠁥󠀸󠀳󠀴|󠁥󠁥󠀸󠀲󠀴|󠁥󠁥󠀵󠀲󠀸|󠁥󠁥󠀸󠀰󠀹|󠁥󠁥󠀸󠀰󠀳|󠁥󠁥󠀷󠀹󠀶|󠁥󠁥󠀵󠀵󠀷|󠁥󠁥󠀷󠀸󠀴|󠁥󠁥󠀷󠀳󠀵|󠁥󠁥󠀵󠀶󠀷|󠁥󠁥󠀶󠀵󠀳|󠁥󠁥󠀱󠀸󠀴|󠁥󠁥󠀱󠀹󠀱|󠁮󠁺󠁷󠁴󠁣|󠁮󠁺󠁷󠁫󠁯|󠁮󠁺󠁷󠁧󠁮|󠁭󠁶󠁭󠁬󠁥|󠁥󠁧󠁷󠁡󠁤|󠁥󠁧󠁳󠁵󠁺|󠁥󠁧󠁳󠁩󠁮|󠁮󠁺󠁴󠁫󠁩|󠁥󠁧󠁳󠁨󠁲|󠁮󠁺󠁴󠁡󠁳|󠁥󠁧󠁳󠁨󠁧|󠁮󠁺󠁳󠁴󠁬|󠁮󠁺󠁯󠁴󠁡|󠁮󠁺󠁮󠁴󠁬|󠁮󠁺󠁮󠁳󠁮|󠁮󠁺󠁭󠁷󠁴|󠁭󠁮󠀰󠀵󠀱|󠁰󠁥󠁣󠁡󠁪|󠁰󠁥󠁡󠁹󠁡|󠁰󠁥󠁡󠁲󠁥|󠁰󠁥󠁡󠁰󠁵|󠁭󠁮󠀰󠀵󠀳|󠁭󠁮󠀰󠀵󠀵|󠁭󠁮󠀰󠀵󠀷|󠁭󠁮󠀰󠀵󠀹|󠁭󠁮󠀰󠀶󠀱|󠁰󠁥󠁡󠁮󠁣|󠁭󠁮󠀰󠀶󠀷|󠁭󠁮󠀰󠀶󠀹|󠁭󠁮󠀰󠀷󠀱|󠁰󠁥󠁡󠁭󠁡|󠁭󠁮󠀰󠀷󠀳|󠁥󠁥󠀱󠀳󠀰|󠁥󠁥󠀱󠀷󠀱|󠁮󠁺󠁭󠁢󠁨|󠁭󠁸󠁣󠁨󠁰|󠁭󠁸󠁣󠁭󠁸|󠁭󠁸󠁣󠁯󠁡|󠁭󠁸󠁣󠁯󠁬|󠁭󠁸󠁤󠁵󠁲|󠁭󠁸󠁧󠁲󠁯|󠁭󠁸󠁧󠁵󠁡|󠁥󠁥󠀲󠀱󠀴|󠁭󠁸󠁨󠁩󠁤|󠁥󠁥󠀲󠀴󠀵|󠁭󠁸󠁪󠁡󠁬|󠁭󠁸󠁭󠁥󠁸|󠁭󠁸󠁭󠁩󠁣|󠁭󠁸󠁭󠁯󠁲|󠁭󠁸󠁮󠁡󠁹|󠁥󠁥󠀲󠀴󠀷|󠁥󠁥󠀲󠀵󠀱|󠁭󠁸󠁮󠁬󠁥|󠁮󠁺󠁨󠁫󠁢|󠁮󠁺󠁧󠁩󠁳|󠁮󠁺󠁣󠁩󠁴|󠁥󠁧󠁰󠁴󠁳|󠁥󠁧󠁭󠁮󠁦|󠁥󠁧󠁫󠁦󠁳|󠁥󠁧󠁦󠁹󠁭|󠁥󠁧󠁢󠁮󠁳|󠁭󠁸󠁡󠁧󠁵|󠁮󠁺󠁣󠁡󠁮|󠁭󠁸󠁢󠁣󠁮|󠁮󠁺󠁢󠁯󠁰|󠁮󠁺󠁡󠁵󠁫|󠁥󠁥󠀱󠀹󠀸|󠁥󠁥󠀲󠀰󠀵|󠁭󠁸󠁢󠁣󠁳|󠁭󠁸󠁣󠁡󠁭|󠁭󠁸󠁣󠁨󠁨|󠁧󠁢󠁲󠁤󠁢|󠁧󠁢󠁲󠁣󠁴|󠁧󠁢󠁲󠁣󠁨|󠁧󠁢󠁲󠁣󠁣|󠁧󠁢󠁰󠁴󠁥|󠁧󠁢󠁰󠁯󠁷|󠁧󠁢󠁰󠁯󠁲|󠁧󠁢󠁰󠁬󠁹|󠁧󠁢󠁰󠁫󠁮|󠁧󠁢󠁰󠁥󠁭|󠁧󠁢󠁯󠁸󠁦|󠁧󠁢󠁯󠁲󠁫|󠁧󠁢󠁯󠁬󠁤|󠁧󠁢󠁮󠁹󠁫|󠁧󠁢󠁮󠁷󠁰|󠁧󠁢󠁮󠁷󠁭|󠁧󠁢󠁮󠁴󠁹|󠁧󠁢󠁮󠁴󠁴|󠁧󠁢󠁮󠁴󠁬|󠁧󠁢󠁮󠁳󠁭|󠁧󠁢󠁮󠁮󠁨|󠁧󠁢󠁮󠁭󠁤|󠁧󠁢󠁮󠁬󠁮|󠁧󠁢󠁮󠁬󠁫|󠁧󠁢󠁳󠁷󠁡|󠁧󠁢󠁳󠁴󠁹|󠁧󠁢󠁳󠁴󠁮|󠁧󠁢󠁳󠁴󠁥|󠁧󠁢󠁳󠁲󠁹|󠁧󠁢󠁳󠁯󠁳|󠁧󠁢󠁳󠁮󠁤|󠁧󠁢󠁳󠁬󠁫|󠁧󠁢󠁳󠁫󠁰|󠁧󠁢󠁳󠁨󠁲|󠁧󠁢󠁳󠁨󠁮|󠁧󠁢󠁳󠁨󠁦|󠁧󠁢󠁳󠁧󠁣|󠁧󠁢󠁳󠁦󠁴|󠁧󠁢󠁳󠁦󠁫|󠁧󠁢󠁳󠁣󠁴|󠁧󠁢󠁳󠁣󠁢|󠁧󠁢󠁳󠁡󠁹|󠁧󠁢󠁳󠁡󠁷|󠁧󠁢󠁲󠁵󠁴|󠁧󠁢󠁲󠁯󠁴|󠁧󠁢󠁲󠁩󠁣|󠁧󠁢󠁲󠁦󠁷|󠁧󠁢󠁲󠁤󠁧|󠁧󠁢󠁬󠁤󠁳|󠁧󠁢󠁬󠁣󠁥|󠁧󠁢󠁬󠁢󠁨|󠁧󠁢󠁬󠁢󠁣|󠁧󠁢󠁬󠁡󠁮|󠁧󠁢󠁫󠁷󠁬|󠁧󠁢󠁫󠁴󠁴|󠁧󠁢󠁫󠁩󠁲|󠁧󠁢󠁫󠁨󠁬|󠁧󠁢󠁫󠁥󠁮|󠁧󠁢󠁫󠁥󠁣|󠁧󠁢󠁩󠁶󠁣|󠁧󠁢󠁩󠁳󠁬|󠁧󠁢󠁩󠁯󠁷|󠁧󠁢󠁩󠁯󠁳|󠁧󠁢󠁨󠁲󠁹|󠁧󠁢󠁨󠁲󠁷|󠁧󠁢󠁨󠁲󠁴|󠁧󠁢󠁨󠁰󠁬|󠁧󠁢󠁨󠁮󠁳|󠁧󠁢󠁨󠁭󠁦|󠁧󠁢󠁨󠁬󠁤|󠁧󠁢󠁨󠁩󠁬|󠁧󠁢󠁨󠁥󠁦|󠁧󠁢󠁮󠁩󠁲|󠁧󠁢󠁮󠁧󠁭|󠁧󠁢󠁮󠁦󠁫|󠁧󠁢󠁮󠁥󠁴|󠁧󠁢󠁮󠁥󠁬|󠁧󠁢󠁮󠁢󠁬|󠁧󠁢󠁮󠁡󠁹|󠁧󠁢󠁭󠁵󠁬|󠁧󠁢󠁭󠁴󠁹|󠁧󠁢󠁭󠁲󠁹|󠁧󠁢󠁭󠁲󠁴|󠁧󠁢󠁭󠁯󠁮|󠁧󠁢󠁭󠁬󠁮|󠁧󠁢󠁭󠁩󠁫|󠁧󠁢󠁭󠁥󠁡|󠁧󠁢󠁭󠁤󠁷|󠁧󠁢󠁭󠁤󠁢|󠁧󠁢󠁭󠁡󠁮|󠁧󠁢󠁬󠁵󠁴|󠁧󠁢󠁬󠁮󠁤|󠁧󠁢󠁬󠁩󠁶|󠁧󠁢󠁬󠁩󠁮|󠁧󠁢󠁬󠁥󠁷|󠁧󠁢󠁴󠁷󠁨|󠁩󠁳󠁡󠁫󠁮|󠁩󠁳󠁡󠁫󠁵|󠁩󠁳󠁡󠁲󠁮|󠁩󠁳󠁡󠁳󠁡|󠁩󠁳󠁢󠁬󠁡|󠁩󠁳󠁢󠁯󠁧|󠁩󠁳󠁢󠁯󠁬|󠁩󠁳󠁤󠁡󠁢|󠁩󠁳󠁤󠁡󠁶|󠁩󠁳󠁥󠁯󠁭|󠁩󠁳󠁥󠁹󠁦|󠁩󠁳󠁦󠁪󠁤|󠁩󠁳󠁦󠁪󠁬|󠁩󠁳󠁦󠁬󠁡|󠁩󠁳󠁦󠁬󠁲|󠁩󠁳󠁧󠁡󠁲|󠁩󠁳󠁧󠁯󠁧|󠁩󠁳󠁧󠁲󠁮|󠁩󠁳󠁧󠁲󠁵|󠁩󠁳󠁧󠁲󠁹|󠁩󠁳󠁨󠁡󠁦|󠁩󠁳󠁨󠁲󠁧|󠁩󠁳󠁨󠁲󠁵|󠁧󠁢󠁺󠁥󠁴|󠁧󠁢󠁹󠁯󠁲|󠁧󠁢󠁷󠁳󠁸|󠁧󠁢󠁷󠁳󠁭|󠁧󠁢󠁷󠁲󠁸|󠁧󠁢󠁷󠁲󠁴|󠁧󠁢󠁷󠁲󠁬|󠁧󠁢󠁷󠁯󠁲|󠁧󠁢󠁷󠁯󠁫|󠁧󠁢󠁷󠁮󠁭|󠁧󠁢󠁷󠁮󠁨|󠁧󠁢󠁷󠁮󠁤|󠁧󠁢󠁷󠁬󠁶|󠁧󠁢󠁷󠁬󠁳|󠁧󠁢󠁷󠁬󠁮|󠁧󠁢󠁷󠁬󠁬|󠁧󠁢󠁷󠁫󠁦|󠁧󠁢󠁷󠁩󠁬|󠁧󠁢󠁷󠁧󠁮|󠁧󠁢󠁷󠁦󠁴|󠁧󠁢󠁷󠁤󠁵|󠁧󠁢󠁷󠁢󠁫|󠁧󠁢󠁷󠁡󠁲|󠁧󠁢󠁶󠁧󠁬|󠁩󠁳󠁳󠁫󠁯|󠁩󠁳󠁳󠁫󠁲|󠁩󠁳󠁳󠁮󠁦|󠁩󠁳󠁳󠁯󠁧|󠁩󠁳󠁳󠁯󠁬|󠁩󠁳󠁳󠁳󠁳|󠁩󠁳󠁳󠁴󠁲|󠁩󠁳󠁳󠁴󠁹|󠁩󠁳󠁳󠁶󠁧|󠁩󠁳󠁴󠁡󠁬|󠁩󠁳󠁴󠁨󠁧|󠁩󠁳󠁴󠁪󠁯|󠁩󠁳󠁶󠁥󠁭|󠁩󠁳󠁶󠁥󠁲|󠁩󠁳󠁶󠁯󠁰|󠁧󠁢󠁴󠁲󠁦|󠁧󠁢󠁴󠁯󠁦|󠁧󠁢󠁴󠁯󠁢|󠁧󠁢󠁴󠁨󠁲|󠁧󠁢󠁴󠁦󠁷|󠁧󠁢󠁴󠁡󠁭|󠁧󠁢󠁳󠁷󠁫|󠁧󠁢󠁳󠁷󠁤|󠁧󠁢󠁬󠁥󠁣|󠁩󠁳󠁨󠁵󠁧|󠁩󠁳󠁨󠁵󠁶|󠁩󠁳󠁨󠁶󠁡|󠁩󠁳󠁨󠁶󠁥|󠁩󠁳󠁩󠁳󠁡|󠁩󠁳󠁫󠁡󠁬|󠁩󠁳󠁫󠁪󠁯|󠁩󠁳󠁫󠁯󠁰|󠁩󠁳󠁬󠁡󠁮|󠁩󠁳󠁭󠁯󠁳|󠁩󠁳󠁭󠁵󠁬|󠁩󠁳󠁭󠁹󠁲|󠁩󠁳󠁮󠁯󠁲|󠁩󠁳󠁲󠁧󠁥|󠁩󠁳󠁲󠁧󠁹|󠁩󠁳󠁲󠁨󠁨|󠁩󠁳󠁲󠁫󠁮|󠁩󠁳󠁲󠁫󠁶|󠁩󠁳󠁳󠁢󠁴|󠁩󠁳󠁳󠁤󠁮|󠁩󠁳󠁳󠁤󠁶|󠁩󠁳󠁳󠁥󠁬|󠁩󠁳󠁳󠁦󠁡|󠁭󠁡󠁡󠁳󠁺|󠁭󠁡󠁡󠁺󠁩|󠁭󠁡󠁢󠁥󠁭|󠁭󠁡󠁢󠁯󠁤|󠁭󠁡󠁢󠁯󠁭|󠁭󠁡󠁢󠁲󠁲|󠁭󠁡󠁣󠁡󠁳|󠁭󠁡󠁣󠁨󠁥|󠁭󠁡󠁣󠁨󠁩|󠁭󠁡󠁣󠁨󠁴|󠁭󠁡󠁤󠁲󠁩|󠁭󠁡󠁥󠁲󠁲|󠁭󠁡󠁥󠁳󠁩|󠁭󠁡󠁥󠁳󠁭|󠁭󠁡󠁦󠁡󠁨|󠁭󠁡󠁦󠁥󠁳|󠁭󠁡󠁦󠁩󠁧|󠁭󠁡󠁦󠁱󠁨|󠁭󠁡󠁨󠁡󠁪|󠁭󠁡󠁨󠁡󠁯|󠁭󠁡󠁨󠁯󠁣|󠁭󠁡󠁩󠁦󠁲|󠁭󠁡󠁩󠁮󠁥|󠁭󠁡󠁪󠁤󠁩|󠁬󠁶󠀰󠀷󠀳|󠁬󠁶󠀰󠀷󠀷|󠁬󠁶󠀰󠀸󠀰|󠁬󠁶󠀰󠀹󠀱|󠁬󠁶󠀰󠀹󠀴|󠁬󠁶󠀰󠀹󠀷|󠁬󠁶󠀰󠀹󠀹|󠁬󠁶󠀱󠀰󠀶|󠁬󠁶󠁤󠁧󠁶|󠁬󠁶󠁪󠁥󠁬|󠁬󠁶󠁪󠁵󠁲|󠁬󠁶󠁬󠁰󠁸|󠁬󠁶󠁲󠁥󠁺|󠁬󠁶󠁲󠁩󠁸|󠁬󠁶󠁶󠁥󠁮|󠁦󠁲󠁡󠁲󠁡|󠁦󠁲󠀹󠀷󠀶|󠁦󠁲󠀷󠀵󠁣|󠁦󠁲󠀶󠁡󠁥|󠁦󠁲󠀶󠀹󠁭|󠁦󠁲󠀲󠀰󠁲|󠁦󠁭󠁹󠁡󠁰|󠁭󠁡󠁡󠁧󠁤|󠁭󠁡󠁡󠁯󠁵|󠁭󠁡󠁳󠁥󠁴|󠁭󠁡󠁳󠁩󠁢|󠁭󠁡󠁳󠁩󠁦|󠁭󠁡󠁳󠁫󠁨|󠁭󠁡󠁴󠁡󠁦|󠁭󠁡󠁴󠁡󠁩|󠁭󠁡󠁴󠁡󠁯|󠁭󠁡󠁴󠁡󠁲|󠁭󠁡󠁴󠁡󠁴|󠁭󠁡󠁴󠁡󠁺|󠁭󠁡󠁴󠁥󠁴|󠁭󠁡󠁴󠁩󠁮|󠁭󠁡󠁴󠁩󠁺|󠁭󠁡󠁴󠁮󠁧|󠁭󠁡󠁴󠁮󠁴|󠁭󠁡󠁹󠁵󠁳|󠁭󠁡󠁺󠁡󠁧|󠁦󠁭󠁴󠁲󠁫|󠁦󠁭󠁰󠁮󠁩|󠁦󠁭󠁫󠁳󠁡|󠁭󠁨󠁡󠁲󠁮|󠁭󠁨󠁡󠁵󠁲|󠁭󠁨󠁥󠁢󠁯|󠁥󠁥󠀲󠀵󠀵|󠁭󠁡󠁪󠁲󠁡|󠁭󠁡󠁫󠁥󠁮|󠁭󠁡󠁫󠁥󠁳|󠁭󠁡󠁫󠁨󠁥|󠁭󠁡󠁬󠁡󠁡|󠁭󠁡󠁬󠁡󠁲|󠁭󠁡󠁭󠁡󠁲|󠁭󠁡󠁭󠁤󠁦|󠁭󠁡󠁭󠁥󠁤|󠁭󠁡󠁭󠁥󠁫|󠁭󠁡󠁭󠁩󠁤|󠁭󠁡󠁭󠁯󠁨|󠁭󠁡󠁭󠁯󠁵|󠁭󠁡󠁮󠁡󠁤|󠁭󠁡󠁮󠁯󠁵|󠁭󠁡󠁯󠁵󠁡|󠁭󠁡󠁯󠁵󠁤|󠁭󠁡󠁯󠁵󠁪|󠁭󠁡󠁯󠁵󠁺|󠁭󠁡󠁲󠁡󠁢|󠁭󠁡󠁲󠁥󠁨|󠁭󠁡󠁳󠁡󠁦|󠁭󠁡󠁳󠁡󠁬|󠁧󠁢󠁤󠁲󠁳|󠁧󠁢󠁤󠁯󠁲|󠁧󠁢󠁤󠁧󠁹|󠁧󠁢󠁤󠁥󠁶|󠁧󠁢󠁤󠁥󠁲|󠁧󠁢󠁤󠁥󠁮|󠁧󠁢󠁤󠁢󠁹|󠁧󠁢󠁤󠁡󠁬|󠁧󠁢󠁣󠁷󠁹|󠁧󠁢󠁣󠁲󠁹|󠁧󠁢󠁣󠁲󠁦|󠁧󠁢󠁣󠁯󠁶|󠁧󠁢󠁣󠁯󠁮|󠁧󠁢󠁣󠁭󠁮|󠁧󠁢󠁣󠁭󠁤|󠁧󠁢󠁣󠁭󠁡|󠁧󠁢󠁣󠁬󠁫|󠁧󠁢󠁣󠁬󠁤|󠁧󠁢󠁣󠁨󠁷|󠁧󠁢󠁣󠁨󠁥|󠁧󠁢󠁣󠁧󠁮|󠁧󠁢󠁣󠁣󠁧|󠁧󠁢󠁣󠁢󠁦|󠁧󠁢󠁣󠁡󠁹|󠁩󠁳󠁳󠁨󠁦|󠁧󠁢󠁨󠁣󠁫|󠁧󠁢󠁨󠁡󠁶|󠁧󠁢󠁧󠁷󠁮|󠁧󠁢󠁧󠁲󠁥|󠁧󠁢󠁧󠁬󠁳|󠁧󠁢󠁧󠁬󠁧|󠁧󠁢󠁧󠁡󠁴|󠁧󠁢󠁦󠁭󠁯|󠁧󠁢󠁦󠁬󠁮|󠁧󠁢󠁦󠁩󠁦|󠁧󠁢󠁦󠁡󠁬|󠁧󠁢󠁥󠁳󠁸|󠁧󠁢󠁥󠁳󠁳|󠁧󠁢󠁥󠁲󠁹|󠁧󠁢󠁥󠁲󠁷|󠁧󠁢󠁥󠁬󠁳|󠁧󠁢󠁥󠁬󠁮|󠁧󠁢󠁥󠁤󠁵|󠁧󠁢󠁥󠁤󠁨|󠁧󠁢󠁥󠁡󠁹|󠁧󠁢󠁥󠁡󠁬|󠁧󠁢󠁤󠁵󠁲|󠁧󠁢󠁤󠁵󠁤|󠁦󠁲󠁰󠁤󠁬|󠁦󠁲󠁰󠁡󠁣|󠁦󠁲󠁯󠁣󠁣|󠁦󠁲󠁮󠁯󠁲|󠁦󠁲󠁮󠁡󠁱|󠁦󠁲󠁩󠁤󠁦|󠁦󠁲󠁨󠁤󠁦|󠁦󠁲󠁧󠁥󠁳|󠁦󠁲󠁣󠁶󠁬|󠁦󠁲󠁢󠁲󠁥|󠁦󠁲󠁢󠁦󠁣|󠁬󠁶󠀰󠀰󠀲|󠁬󠁶󠀰󠀰󠀷|󠁬󠁶󠀰󠀱󠀱|󠁬󠁶󠀰󠀲󠀲|󠁬󠁶󠀰󠀲󠀶|󠁬󠁶󠀰󠀳󠀳|󠁬󠁶󠀰󠀴󠀷|󠁬󠁶󠀰󠀵󠀰|󠁬󠁶󠀰󠀵󠀲|󠁬󠁶󠀰󠀵󠀴|󠁬󠁶󠀰󠀵󠀶|󠁬󠁶󠀰󠀶󠀲|󠁭󠁡󠁳󠁥󠁦|󠁧󠁢󠁣󠁡󠁭|󠁧󠁢󠁢󠁵󠁲|󠁧󠁢󠁢󠁳󠁴|󠁧󠁢󠁢󠁲󠁹|󠁧󠁢󠁢󠁰󠁬|󠁧󠁢󠁢󠁯󠁬|󠁧󠁢󠁢󠁮󠁳|󠁧󠁢󠁢󠁮󠁨|󠁧󠁢󠁢󠁮󠁥|󠁧󠁢󠁢󠁫󠁭|󠁧󠁢󠁢󠁩󠁲|󠁧󠁢󠁢󠁧󠁷|󠁧󠁢󠁢󠁧󠁥|󠁧󠁢󠁢󠁦󠁳|󠁧󠁢󠁢󠁥󠁸|󠁧󠁢󠁢󠁥󠁮|󠁧󠁢󠁢󠁣󠁰|󠁧󠁢󠁢󠁢󠁤|󠁧󠁢󠁢󠁡󠁳|󠁧󠁢󠁡󠁮󠁳|󠁧󠁢󠁡󠁮󠁮|󠁧󠁢󠁡󠁮󠁤|󠁧󠁢󠁡󠁧󠁹|󠁢󠁥󠁷󠁨󠁴|󠁢󠁥󠁷󠁢󠁲|󠁢󠁥󠁷󠁡󠁬|󠁢󠁥󠁶󠁷󠁶|󠁢󠁥󠁶󠁯󠁶|󠁢󠁥󠁶󠁬󠁩|󠁢󠁥󠁶󠁬󠁧|󠁢󠁥󠁶󠁢󠁲|󠁢󠁥󠁶󠁡󠁮|󠁢󠁥󠁢󠁲󠁵|󠁢󠁡󠁳󠁲󠁰|󠁢󠁡󠁢󠁲󠁣|󠁢󠁡󠁢󠁩󠁨|󠁡󠁺󠁺󠁡󠁮|󠁡󠁺󠁹󠁥󠁶|󠁡󠁺󠁹󠁡󠁲|󠁡󠁺󠁸󠁶󠁤|󠁡󠁺󠁸󠁩󠁺|󠁡󠁺󠁸󠁣󠁩|󠁡󠁺󠁸󠁡󠁣|󠁢󠁦󠁫󠁯󠁷|󠁢󠁦󠁫󠁯󠁰|󠁢󠁦󠁫󠁭󠁰|󠁢󠁦󠁫󠁭󠁤|󠁺󠁡󠁫󠁺󠁮|󠁢󠁦󠁫󠁥󠁮|󠁢󠁦󠁫󠁡󠁤|󠁢󠁦󠁩󠁯󠁢|󠁢󠁦󠁨󠁯󠁵|󠁢󠁦󠁧󠁯󠁵|󠁢󠁦󠁧󠁮󠁡|󠁢󠁦󠁧󠁡󠁮|󠁢󠁦󠁣󠁯󠁭|󠁢󠁦󠁢󠁬󠁫|󠁢󠁦󠁢󠁬󠁧|󠁢󠁦󠁢󠁧󠁲|󠁢󠁦󠁢󠁡󠁺|󠁢󠁥󠁷󠁮󠁡|󠁢󠁥󠁷󠁬󠁸|󠁢󠁥󠁷󠁬󠁧|󠁡󠁺󠁱󠁡󠁢|󠁡󠁺󠁯󠁲󠁤|󠁡󠁺󠁯󠁧󠁵|󠁡󠁺󠁮󠁥󠁦|󠁦󠁲󠁣󠁯󠁲|󠁡󠁺󠁭󠁡󠁳|󠁦󠁲󠁧󠁵󠁡|󠁦󠁲󠁬󠁲󠁥|󠁡󠁺󠁬󠁥󠁲|󠁦󠁲󠁭󠁡󠁹|󠁡󠁺󠁬󠁡󠁮|󠁡󠁺󠁬󠁡󠁣|󠁡󠁺󠁫󠁵󠁲|󠁡󠁺󠁫󠁡󠁮|󠁡󠁺󠁫󠁡󠁬|󠁡󠁺󠁩󠁳󠁭|󠁡󠁺󠁩󠁭󠁩|󠁡󠁺󠁨󠁡󠁣|󠁡󠁺󠁧󠁹󠁧|󠁧󠁢󠁡󠁮󠁴|󠁡󠁺󠁵󠁣󠁡|󠁡󠁺󠁴󠁯󠁶|󠁡󠁺󠁴󠁡󠁲|󠁡󠁺󠁳󠁵󠁳|󠁡󠁺󠁳󠁭󠁸|󠁡󠁺󠁳󠁭󠁩|󠁡󠁺󠁳󠁫󠁲|󠁡󠁺󠁳󠁩󠁹|󠁡󠁺󠁳󠁢󠁮|󠁡󠁺󠁳󠁡󠁴|󠁡󠁺󠁳󠁡󠁲|󠁡󠁺󠁳󠁡󠁨|󠁡󠁺󠁳󠁡󠁤|󠁡󠁺󠁳󠁡󠁢|󠁡󠁺󠁱󠁵󠁳|󠁡󠁺󠁱󠁯󠁢|󠁡󠁺󠁱󠁢󠁩|󠁡󠁺󠁱󠁢󠁡|󠁡󠁺󠁱󠁡󠁺|󠁴󠁶󠁮󠁫󠁬|󠁴󠁶󠁮󠁭󠁡|󠁴󠁶󠁮󠁭󠁧|󠁴󠁶󠁮󠁵󠁩|󠁴󠁶󠁶󠁡󠁩|󠁴󠁷󠁣󠁨󠁡|󠁴󠁷󠁣󠁹󠁩|󠁴󠁷󠁣󠁹󠁱|󠁴󠁷󠁨󠁳󠁱|󠁴󠁷󠁨󠁳󠁺|󠁴󠁷󠁨󠁵󠁡|󠁴󠁷󠁩󠁬󠁡|󠁴󠁷󠁫󠁥󠁥|󠁴󠁷󠁫󠁨󠁨|󠁴󠁷󠁫󠁩󠁮|󠁴󠁷󠁬󠁩󠁥|󠁴󠁷󠁭󠁩󠁡|󠁴󠁷󠁮󠁡󠁮|󠁴󠁷󠁮󠁷󠁴|󠁴󠁷󠁰󠁥󠁮|󠁣󠁧󠁢󠁺󠁶|󠁣󠁦󠁢󠁧󠁦|󠁴󠁴󠁡󠁲󠁩|󠁴󠁴󠁣󠁨󠁡|󠁴󠁴󠁣󠁴󠁴|󠁴󠁴󠁤󠁭󠁮|󠁴󠁴󠁭󠁲󠁣|󠁴󠁴󠁰󠁥󠁤|󠁴󠁴󠁰󠁯󠁳|󠁴󠁴󠁰󠁲󠁴|󠁴󠁴󠁰󠁴󠁦|󠁴󠁴󠁳󠁦󠁯|󠁴󠁴󠁳󠁧󠁥|󠁴󠁴󠁳󠁩󠁰|󠁴󠁴󠁳󠁪󠁬|󠁴󠁴󠁴󠁯󠁢|󠁴󠁴󠁴󠁵󠁰|󠁴󠁶󠁦󠁵󠁮|󠁴󠁶󠁮󠁩󠁴|󠁴󠁶󠁮󠁫󠁦|󠁢󠁦󠁴󠁵󠁩|󠁢󠁦󠁴󠁡󠁰|󠁢󠁦󠁳󠁯󠁲|󠁢󠁦󠁳󠁯󠁭|󠁢󠁦󠁳󠁮󠁧|󠁢󠁦󠁳󠁭󠁴|󠁢󠁦󠁳󠁩󠁳|󠁢󠁦󠁳󠁥󠁮|󠁢󠁦󠁰󠁯󠁮|󠁢󠁦󠁰󠁡󠁳|󠁢󠁦󠁯󠁵󠁤|󠁢󠁦󠁯󠁵󠁢|󠁢󠁦󠁮󠁯󠁵|󠁢󠁦󠁮󠁡󠁹|󠁢󠁦󠁮󠁡󠁯|󠁢󠁦󠁮󠁡󠁭|󠁢󠁦󠁭󠁯󠁵|󠁢󠁦󠁬󠁯󠁲|󠁢󠁦󠁬󠁥󠁲|󠁡󠁺󠁱󠁡󠁸|󠁴󠁷󠁰󠁩󠁦|󠁴󠁷󠁴󠁡󠁯|󠁴󠁷󠁴󠁮󠁮|󠁴󠁷󠁴󠁰󠁥|󠁴󠁷󠁴󠁴󠁴|󠁴󠁷󠁴󠁸󠁧|󠁴󠁷󠁹󠁵󠁮|󠁢󠁺󠁴󠁯󠁬|󠁢󠁺󠁣󠁺󠁬|󠁶󠁵󠁭󠁡󠁰|󠁶󠁵󠁰󠁡󠁭|󠁶󠁵󠁳󠁡󠁭|󠁶󠁵󠁳󠁥󠁥|󠁶󠁵󠁴󠁡󠁥|󠁶󠁵󠁴󠁯󠁢|󠁢󠁦󠁺󠁯󠁵|󠁢󠁦󠁺󠁯󠁮|󠁢󠁦󠁺󠁩󠁲|󠁢󠁦󠁹󠁡󠁴|󠁢󠁦󠁹󠁡󠁧|󠁬󠁶󠀰󠀵󠀷|󠁬󠁶󠀰󠀶󠀹|󠁬󠁶󠀰󠀹󠀰|󠁬󠁶󠀰󠀹󠀸|󠁬󠁶󠀱󠀰󠀰|󠁬󠁶󠀱󠀱󠀰|󠁬󠁶󠁪󠁫󠁢|󠁬󠁶󠁶󠁭󠁲|󠁭󠁡󠁭󠁭󠁤|󠁭󠁡󠁭󠁭󠁮|󠁭󠁡󠁳󠁹󠁢|󠁭󠁲󠁮󠁫󠁣|󠁡󠁯󠁨󠁵󠁡|󠁡󠁯󠁣󠁵󠁳|󠁡󠁯󠁣󠁣󠁵|󠁡󠁯󠁣󠁡󠁢|󠁡󠁯󠁢󠁩󠁥|󠁡󠁯󠁢󠁧󠁵|󠁡󠁯󠁢󠁧󠁯|󠁭󠁸󠁤󠁩󠁦|󠁫󠁺󠁫󠁵󠁳|󠁫󠁺󠁫󠁺󠁹|󠁫󠁺󠁭󠁡󠁮|󠁫󠁺󠁰󠁡󠁶|󠁫󠁺󠁳󠁥󠁶|󠁫󠁺󠁳󠁨󠁹|󠁫󠁺󠁶󠁯󠁳|󠁫󠁺󠁹󠁵󠁺|󠁫󠁺󠁺󠁡󠁰|󠁫󠁺󠁺󠁨󠁡|󠁡󠁯󠁬󠁵󠁡|󠁡󠁯󠁬󠁳󠁵|󠁡󠁯󠁬󠁮󠁯|󠁡󠁯󠁨󠁵󠁩|󠁬󠁶󠀰󠀰󠀱|󠁬󠁶󠀰󠀱󠀰|󠁬󠁶󠀰󠀴󠀰|󠁬󠁶󠀰󠀵󠀱|󠁬󠁶󠀰󠀵󠀳|󠁬󠁶󠀰󠀵󠀵|󠁡󠁦󠁫󠁡󠁮|󠁡󠁦󠁫󠁡󠁢|󠁡󠁦󠁪󠁯󠁷|󠁡󠁦󠁨󠁥󠁲|󠁡󠁦󠁨󠁥󠁬|󠁡󠁦󠁧󠁨󠁯|󠁡󠁦󠁧󠁨󠁡|󠁡󠁦󠁦󠁹󠁢|󠁡󠁦󠁦󠁲󠁡|󠁡󠁦󠁤󠁡󠁹|󠁡󠁦󠁢󠁧󠁬|󠁡󠁦󠁢󠁤󠁳|󠁡󠁦󠁢󠁤󠁧|󠁴󠁴󠁥󠁴󠁯|󠁴󠁴󠁲󠁣󠁭|󠁴󠁴󠁷󠁴󠁯|󠁴󠁷󠁫󠁨󠁱|󠁴󠁷󠁴󠁮󠁱|󠁴󠁷󠁴󠁰󠁱|󠁴󠁷󠁴󠁸󠁱|󠁡󠁦󠁺󠁡󠁢|󠁡󠁦󠁷󠁡󠁲|󠁡󠁦󠁵󠁲󠁵|󠁡󠁦󠁴󠁡󠁫|󠁡󠁦󠁳󠁡󠁲|󠁡󠁦󠁳󠁡󠁭|󠁡󠁦󠁰󠁫󠁡|󠁡󠁦󠁰󠁩󠁡|󠁡󠁦󠁰󠁡󠁲|󠁡󠁦󠁰󠁡󠁮|󠁡󠁦󠁮󠁵󠁲|󠁡󠁦󠁮󠁩󠁭|󠁡󠁦󠁮󠁡󠁮|󠁡󠁦󠁬󠁯󠁧|󠁡󠁦󠁬󠁡󠁧|󠁡󠁦󠁫󠁮󠁲|󠁰󠁨󠁭󠁡󠁧|󠁡󠁦󠁫󠁨󠁯|󠁡󠁦󠁫󠁤󠁺|󠁧󠁢󠁭󠁦󠁴|󠁧󠁢󠁭󠁹󠁬|󠁧󠁢󠁮󠁤󠁮|󠁧󠁢󠁮󠁴󠁡|󠁧󠁢󠁮󠁴󠁨|󠁧󠁢󠁮󠁹󠁭|󠁧󠁢󠁯󠁭󠁨|󠁧󠁢󠁰󠁯󠁬|󠁧󠁢󠁳󠁴󠁢|󠁧󠁢󠁵󠁫󠁭|󠁡󠁺󠁧󠁯󠁹|󠁡󠁺󠁧󠁯󠁲|󠁡󠁺󠁧󠁡󠁤|󠁡󠁺󠁦󠁵󠁺|󠁡󠁺󠁤󠁡󠁳|󠁡󠁺󠁣󠁵󠁬|󠁡󠁺󠁣󠁡󠁬|󠁡󠁺󠁣󠁡󠁢|󠁡󠁺󠁢󠁩󠁬|󠁡󠁺󠁢󠁥󠁹|󠁧󠁢󠁡󠁲󠁤|󠁧󠁢󠁡󠁲󠁭|󠁧󠁢󠁢󠁬󠁡|󠁧󠁢󠁢󠁬󠁹|󠁧󠁢󠁢󠁭󠁨|󠁧󠁢󠁢󠁮󠁢|󠁧󠁢󠁣󠁧󠁶|󠁧󠁢󠁣󠁫󠁦|󠁧󠁢󠁣󠁫󠁴|󠁧󠁢󠁣󠁬󠁲|󠁧󠁢󠁣󠁳󠁲|󠁧󠁢󠁤󠁧󠁮|󠁧󠁢󠁤󠁯󠁷|󠁧󠁢󠁤󠁲󠁹|󠁧󠁢󠁥󠁡󠁷|󠁧󠁢󠁦󠁥󠁲|󠁧󠁢󠁧󠁢󠁮|󠁧󠁢󠁬󠁭󠁶|󠁧󠁢󠁬󠁲󠁮|󠁧󠁢󠁬󠁳󠁢|󠁩󠁳󠁨󠁥󠁬|󠁩󠁳󠁨󠁵󠁴|󠁩󠁳󠁳󠁢󠁨|󠁩󠁳󠁳󠁥󠁹|󠁩󠁳󠁳󠁫󠁵|󠁩󠁳󠁳󠁳󠁦|󠁡󠁯󠁺󠁡󠁩|󠁡󠁯󠁵󠁩󠁧|󠁡󠁯󠁮󠁡󠁭|󠁡󠁯󠁭󠁯󠁸|󠁡󠁯󠁭󠁡󠁬|󠁫󠁺󠁡󠁫󠁭|󠁫󠁺󠁡󠁫󠁴|󠁫󠁺󠁡󠁬󠁡|󠁫󠁺󠁡󠁬󠁭|󠁫󠁺󠁡󠁳󠁴|󠁫󠁺󠁡󠁴󠁹|󠁫󠁺󠁢󠁡󠁹|󠁫󠁺󠁫󠁡󠁲|󠁡󠁦󠁫󠁡󠁰|󠁡󠁺󠁢󠁡󠁲|󠁡󠁺󠁢󠁡󠁬|󠁡󠁺󠁢󠁡󠁢|󠁡󠁺󠁡󠁳󠁴|󠁡󠁺󠁡󠁧󠁵|󠁡󠁺󠁡󠁧󠁳|󠁡󠁺󠁡󠁧󠁭|󠁡󠁺󠁡󠁧󠁣|󠁡󠁺󠁡󠁧󠁡|󠁡󠁺󠁡󠁢󠁳|󠁡󠁵󠁶󠁩󠁣|󠁡󠁵󠁴󠁡󠁳|󠁡󠁵󠁱󠁬󠁤|󠁡󠁵󠁮󠁳󠁷|󠁡󠁵󠁡󠁣󠁴|󠁩󠁳󠁡󠁫󠁨|󠁩󠁳󠁢󠁦󠁪|󠁩󠁳󠁢󠁬󠁯|󠁩󠁳󠁤󠁪󠁵|󠁩󠁳󠁦󠁬󠁤|󠁰󠁳󠁮󠁧󠁺|󠁰󠁳󠁮󠁢󠁳|󠁰󠁳󠁫󠁹󠁳|󠁰󠁳󠁪󠁲󠁨|󠁰󠁳󠁨󠁢󠁮|󠁰󠁳󠁧󠁺󠁡|󠁰󠁳󠁤󠁥󠁢|󠁰󠁳󠁢󠁴󠁨|󠁰󠁨󠁺󠁳󠁩|󠁰󠁨󠁺󠁭󠁢|󠁰󠁨󠁺󠁡󠁳|󠁰󠁨󠁺󠁡󠁮|󠁣󠁯󠁭󠁡󠁧|󠁣󠁯󠁬󠁡󠁧|󠁰󠁨󠁷󠁳󠁡|󠁣󠁯󠁨󠁵󠁩|󠁣󠁯󠁧󠁵󠁶|󠁣󠁯󠁧󠁵󠁡|󠁰󠁨󠁴󠁡󠁷|󠁰󠁷󠀳󠀷󠀰|󠁰󠁷󠀳󠀵󠀰|󠁰󠁷󠀲󠀲󠀴|󠁰󠁷󠀲󠀲󠀲|󠁰󠁷󠀲󠀱󠀸|󠁰󠁷󠀲󠀱󠀴|󠁰󠁷󠀲󠀱󠀲|󠁰󠁷󠀱󠀵󠀰|󠁰󠁷󠀱󠀰󠀰|󠁰󠁷󠀰󠀵󠀰|󠁰󠁷󠀰󠀱󠀰|󠁰󠁷󠀰󠀰󠀴|󠁰󠁷󠀰󠀰󠀲|󠁰󠁳󠁴󠁫󠁭|󠁰󠁳󠁴󠁢󠁳|󠁰󠁳󠁳󠁬󠁴|󠁰󠁳󠁲󠁦󠁨|󠁰󠁳󠁲󠁢󠁨|󠁰󠁳󠁱󠁱󠁡|󠁰󠁨󠁳󠁬󠁵|󠁰󠁨󠁳󠁬󠁥|󠁰󠁨󠁳󠁩󠁧|󠁰󠁨󠁳󠁣󠁯|󠁰󠁨󠁳󠁡󠁲|󠁰󠁨󠁲󠁯󠁭|󠁰󠁨󠁲󠁩󠁺|󠁰󠁨󠁱󠁵󠁩|󠁰󠁨󠁱󠁵󠁥|󠁰󠁨󠁰󠁬󠁷|󠁰󠁨󠁮󠁵󠁶|󠁰󠁨󠁮󠁵󠁥|󠁰󠁨󠁮󠁳󠁡|󠁰󠁨󠁮󠁥󠁲|󠁰󠁨󠁮󠁥󠁣|󠁰󠁨󠁮󠁣󠁯|󠁰󠁨󠁭󠁳󠁲|󠁰󠁨󠁭󠁳󠁣|󠁰󠁨󠁭󠁯󠁵|󠁣󠁯󠁣󠁵󠁮|󠁣󠁯󠁣󠁯󠁲|󠁣󠁯󠁣󠁨󠁯|󠁣󠁯󠁣󠁥󠁳|󠁣󠁯󠁣󠁡󠁵|󠁰󠁨󠁴󠁡󠁲|󠁣󠁯󠁣󠁡󠁳|󠁣󠁯󠁣󠁡󠁱|󠁣󠁯󠁣󠁡󠁬|󠁣󠁯󠁢󠁯󠁹|󠁣󠁯󠁢󠁯󠁬|󠁣󠁯󠁡󠁴󠁬|󠁣󠁯󠁡󠁲󠁡|󠁣󠁯󠁡󠁮󠁴|󠁣󠁯󠁡󠁭󠁡|󠁰󠁨󠁳󠁵󠁲|󠁰󠁨󠁳󠁵󠁮|󠁰󠁨󠁳󠁵󠁫|󠁰󠁨󠁳󠁯󠁲|󠁲󠁵󠁰󠁲󠁩|󠁲󠁵󠁰󠁳󠁫|󠁲󠁵󠁲󠁯󠁳|󠁲󠁵󠁲󠁹󠁡|󠁣󠁯󠁴󠁯󠁬|󠁲󠁵󠁳󠁡󠁫|󠁲󠁵󠁳󠁡󠁭|󠁲󠁵󠁳󠁡󠁲|󠁣󠁯󠁳󠁵󠁣|󠁲󠁵󠁳󠁭󠁯|󠁲󠁵󠁳󠁰󠁥|󠁲󠁵󠁳󠁴󠁡|󠁲󠁵󠁳󠁶󠁥|󠁣󠁯󠁳󠁡󠁰|󠁲󠁵󠁴󠁡󠁭|󠁲󠁵󠁴󠁯󠁭|󠁣󠁯󠁶󠁩󠁤|󠁲󠁵󠁴󠁵󠁬|󠁲󠁵󠁫󠁯󠁳|󠁲󠁵󠁬󠁥󠁮|󠁲󠁵󠁬󠁩󠁰|󠁲󠁵󠁭󠁡󠁧|󠁲󠁵󠁫󠁹󠁡|󠁣󠁯󠁶󠁡󠁵|󠁣󠁯󠁶󠁡󠁣|󠁲󠁵󠁭󠁯󠁳|󠁲󠁵󠁭󠁯󠁷|󠁲󠁵󠁫󠁲󠁳|󠁲󠁵󠁭󠁵󠁲|󠁲󠁵󠁮󠁥󠁮|󠁲󠁵󠁮󠁧󠁲|󠁲󠁵󠁮󠁩󠁺|󠁲󠁵󠁮󠁶󠁳|󠁲󠁵󠁯󠁭󠁳|󠁲󠁵󠁯󠁲󠁥|󠁲󠁵󠁯󠁲󠁬|󠁲󠁵󠁰󠁥󠁲|󠁲󠁵󠁰󠁮󠁺|󠁲󠁵󠁹󠁡󠁲|󠁲󠁵󠁩󠁶󠁡|󠁲󠁵󠁩󠁲󠁫|󠁲󠁵󠁹󠁥󠁶|󠁲󠁵󠁺󠁡󠁢|󠁣󠁯󠁱󠁵󠁩|󠁣󠁯󠁰󠁵󠁴|󠁣󠁯󠁮󠁳󠁡|󠁲󠁵󠁣󠁨󠁵|󠁲󠁵󠁣󠁨󠁥|󠁲󠁵󠁢󠁲󠁹|󠁣󠁯󠁮󠁡󠁲|󠁲󠁵󠁢󠁥󠁬|󠁣󠁯󠁭󠁥󠁴|󠁲󠁵󠁡󠁳󠁴|󠁲󠁵󠁡󠁲󠁫|󠁲󠁵󠁡󠁭󠁵|󠁲󠁵󠁡󠁬󠁴|󠁰󠁹󠁡󠁳󠁵|󠁲󠁵󠁫󠁬󠁵|󠁲󠁵󠁴󠁶󠁥|󠁲󠁵󠁫󠁩󠁲|󠁲󠁵󠁫󠁨󠁭|󠁲󠁵󠁫󠁨󠁡|󠁲󠁵󠁫󠁧󠁮|󠁣󠁯󠁳󠁡󠁮|󠁲󠁵󠁫󠁧󠁤|󠁲󠁵󠁫󠁥󠁭|󠁲󠁵󠁫󠁤󠁡|󠁲󠁵󠁴󠁹󠁵|󠁲󠁵󠁫󠁡󠁭|󠁣󠁯󠁲󠁩󠁳|󠁲󠁵󠁵󠁬󠁹|󠁲󠁵󠁶󠁧󠁧|󠁲󠁵󠁶󠁬󠁡|󠁲󠁵󠁶󠁬󠁧|󠁲󠁵󠁶󠁯󠁲|󠁰󠁨󠁤󠁡󠁳|󠁰󠁨󠁬󠁡󠁧|󠁰󠁨󠁤󠁡󠁯|󠁰󠁨󠁣󠁯󠁭|󠁰󠁨󠁣󠁥󠁢|󠁰󠁨󠁣󠁡󠁶|󠁰󠁨󠁤󠁡󠁶|󠁰󠁨󠁫󠁡󠁬|󠁰󠁨󠁣󠁡󠁰|󠁰󠁨󠁩󠁳󠁡|󠁰󠁨󠁣󠁡󠁧|󠁰󠁨󠁢󠁴󠁮|󠁰󠁨󠁤󠁩󠁮|󠁰󠁨󠁩󠁬󠁳|󠁧󠁢󠁡󠁧󠁢|󠁰󠁨󠁤󠁶󠁯|󠁰󠁨󠁥󠁡󠁳|󠁰󠁨󠁡󠁮󠁴|󠁰󠁨󠁧󠁵󠁩|󠁰󠁨󠁡󠁰󠁡|󠁰󠁨󠁡󠁵󠁲|󠁰󠁨󠁢󠁡󠁮|󠁰󠁨󠁢󠁡󠁳|󠁰󠁨󠁢󠁥󠁮|󠁰󠁨󠁢󠁴󠁧|󠁰󠁨󠁢󠁩󠁬|󠁰󠁨󠁩󠁬󠁮|󠁰󠁨󠁩󠁬󠁩|󠁰󠁨󠁩󠁦󠁵|󠁲󠁵󠁹󠁡󠁮|󠁰󠁨󠁭󠁧󠁳|󠁰󠁨󠁭󠁧󠁮|󠁰󠁨󠁭󠁤󠁲|󠁰󠁨󠁭󠁤󠁣|󠁰󠁨󠁭󠁡󠁳|󠁰󠁨󠁭󠁡󠁤|󠁰󠁨󠁬󠁵󠁮|󠁰󠁨󠁬󠁥󠁹|󠁰󠁨󠁬󠁡󠁳|󠁰󠁨󠁬󠁡󠁮|󠁰󠁨󠁢󠁯󠁨|󠁥󠁥󠀷󠀹|󠁥󠁥󠀷󠀱|󠁣󠁶󠁰󠁡|󠁣󠁶󠁰󠁮|󠁣󠁶󠁰󠁲|󠁣󠁶󠁲󠁢|󠁡󠁺󠁮󠁡|󠁣󠁶󠁲󠁧|󠁣󠁵󠀰󠀱|󠁧󠁮󠁹󠁯|󠁥󠁥󠀶󠀸|󠁣󠁶󠁲󠁳|󠁣󠁶󠁳󠁤|󠁣󠁶󠁳󠁦|󠁣󠁶󠁳󠁯|󠁣󠁲󠁳󠁪|󠁡󠁺󠁮󠁶|󠁡󠁺󠁮󠁸|󠁧󠁮󠁮󠁺|󠁣󠁶󠁭󠁯|󠁣󠁶󠁭󠁡|󠁡󠁺󠁬󠁡|󠁥󠁥󠀸󠀱|󠁣󠁵󠀹󠀹|󠁥󠁥󠀸󠀴|󠁣󠁶󠁢󠁲|󠁧󠁮󠁰󠁩|󠁥󠁥󠀸󠀷|󠁡󠁺󠁭󠁩|󠁣󠁶󠁣󠁲|󠁣󠁶󠁣󠁦|󠁧󠁮󠁳󠁩|󠁧󠁮󠁴󠁥|󠁣󠁶󠁣󠁡|󠁣󠁶󠁢󠁶|󠁧󠁮󠁴󠁯|󠁥󠁥󠀷󠀴|󠁧󠁱󠁡󠁮|󠁧󠁹󠁵󠁴|󠁨󠁮󠁡󠁴|󠁨󠁮󠁣󠁨|󠁡󠁥󠁳󠁨|󠁨󠁮󠁣󠁰|󠁨󠁮󠁣󠁲|󠁨󠁮󠁥󠁰|󠁨󠁮󠁦󠁭|󠁨󠁮󠁧󠁤|󠁨󠁮󠁩󠁢|󠁨󠁮󠁩󠁮|󠁥󠁧󠁢󠁡|󠁨󠁮󠁬󠁥|󠁨󠁮󠁬󠁰|󠁨󠁮󠁯󠁣|󠁨󠁮󠁯󠁬|󠁨󠁮󠁳󠁢|󠁨󠁮󠁶󠁡|󠁨󠁮󠁹󠁯|󠁡󠁥󠁲󠁫|󠁡󠁥󠁦󠁵|󠁡󠁥󠁤󠁵|󠁡󠁥󠁡󠁺|󠁡󠁥󠁡󠁪|󠁨󠁴󠁡󠁲|󠁨󠁴󠁣󠁥|󠁧󠁱󠁢󠁮|󠁧󠁱󠁢󠁳|󠁧󠁱󠁣󠁳|󠁧󠁱󠁤󠁪|󠁧󠁱󠁫󠁮|󠁧󠁱󠁬󠁩|󠁧󠁱󠁷󠁮|󠁧󠁲󠀶󠀹|󠁧󠁷󠁢󠁡|󠁧󠁷󠁢󠁳|󠁡󠁺󠁳󠁡|󠁧󠁷󠁣󠁡|󠁡󠁥󠁵󠁱|󠁧󠁷󠁧󠁡|󠁧󠁷󠁯󠁩|󠁧󠁷󠁱󠁵|󠁧󠁷󠁴󠁯|󠁧󠁹󠁢󠁡|󠁧󠁹󠁣󠁵|󠁧󠁹󠁤󠁥|󠁧󠁹󠁥󠁢|󠁧󠁹󠁥󠁳|󠁧󠁹󠁭󠁡|󠁧󠁹󠁰󠁭|󠁧󠁹󠁰󠁴|󠁧󠁨󠁣󠁰|󠁧󠁨󠁥󠁰|󠁧󠁨󠁮󠁥|󠁧󠁨󠁮󠁰|󠁧󠁨󠁯󠁴|󠁧󠁨󠁳󠁶|󠁧󠁨󠁴󠁶|󠁧󠁨󠁵󠁥|󠁧󠁨󠁵󠁷|󠁧󠁨󠁷󠁮|󠁧󠁨󠁷󠁰|󠁤󠁪󠁴󠁡|󠁤󠁪󠁯󠁢|󠁤󠁥󠁴󠁨|󠁤󠁥󠁳󠁴|󠁤󠁥󠁳󠁮|󠁤󠁥󠁳󠁬|󠁤󠁥󠁳󠁨|󠁤󠁥󠁲󠁰|󠁤󠁥󠁮󠁷|󠁤󠁥󠁮󠁩|󠁤󠁥󠁭󠁶|󠁤󠁥󠁨󠁨|󠁤󠁥󠁨󠁥|󠁧󠁬󠁡󠁶|󠁧󠁬󠁫󠁵|󠁧󠁬󠁱󠁥|󠁡󠁭󠁳󠁨|󠁡󠁭󠁳󠁵|󠁡󠁭󠁴󠁶|󠁡󠁭󠁶󠁤|󠁡󠁭󠁬󠁯|󠁡󠁭󠁫󠁴|󠁡󠁭󠁧󠁲|󠁡󠁭󠁥󠁲|󠁡󠁭󠁡󠁶|󠁡󠁭󠁡󠁲|󠁡󠁭󠁡󠁧|󠁧󠁤󠀱󠀰|󠁧󠁥󠁡󠁢|󠁧󠁥󠁡󠁪|󠁧󠁥󠁧󠁵|󠁧󠁥󠁩󠁭|󠁧󠁥󠁫󠁡|󠁧󠁥󠁫󠁫|󠁧󠁥󠁭󠁭|󠁧󠁥󠁲󠁬|󠁧󠁥󠁳󠁺|󠁧󠁥󠁴󠁢|󠁧󠁨󠁡󠁡|󠁧󠁨󠁡󠁦|󠁧󠁨󠁡󠁨|󠁧󠁨󠁢󠁥|󠁧󠁨󠁢󠁯|󠁤󠁥󠁢󠁢|󠁣󠁺󠀸󠀰|󠁥󠁥󠀴󠀵|󠁣󠁺󠀷󠀲|󠁣󠁺󠀷󠀱|󠁣󠁺󠀶󠀴|󠁣󠁺󠀶󠀳|󠁥󠁥󠀵󠀰|󠁣󠁺󠀵󠀳|󠁡󠁺󠁧󠁡|󠁣󠁺󠀵󠀲|󠁣󠁺󠀵󠀱|󠁥󠁥󠀵󠀲|󠁣󠁺󠀴󠀲|󠁣󠁺󠀴󠀱|󠁥󠁥󠀵󠀶|󠁣󠁺󠀳󠀲|󠁣󠁺󠀳󠀱|󠁥󠁥󠀶󠀰|󠁣󠁺󠀲󠀰|󠁣󠁺󠀱󠀰|󠁣󠁶󠁴󠁳|󠁣󠁶󠁴󠁡|󠁣󠁶󠁳󠁶|󠁥󠁥󠀶󠀴|󠁣󠁶󠁳󠁳|󠁧󠁹󠁵󠁤|󠁧󠁬󠁱󠁴|󠁧󠁬󠁳󠁭|󠁧󠁮󠁢󠁫|󠁧󠁮󠁣󠁯|󠁧󠁮󠁤󠁢|󠁧󠁮󠁤󠁩|󠁧󠁮󠁤󠁬|󠁧󠁮󠁤󠁵|󠁤󠁥󠁨󠁢|󠁤󠁥󠁢󠁹|󠁧󠁮󠁦󠁡|󠁧󠁮󠁦󠁯|󠁧󠁮󠁦󠁲|󠁧󠁮󠁧󠁡|󠁧󠁮󠁧󠁵|󠁡󠁵󠁮󠁴|󠁡󠁵󠁳󠁡|󠁧󠁮󠁫󠁳|󠁡󠁵󠁷󠁡|󠁧󠁮󠁬󠁡|󠁧󠁮󠁬󠁥|󠁧󠁮󠁬󠁯|󠁥󠁥󠀳󠀷|󠁥󠁥󠀳󠀹|󠁤󠁥󠁢󠁷|󠁤󠁥󠁢󠁥|󠁡󠁺󠁢󠁡|󠁣󠁨󠁢󠁥|󠁣󠁨󠁡󠁲|󠁣󠁨󠁡󠁩|󠁣󠁨󠁡󠁧|󠁣󠁮󠁧󠁤|󠁣󠁦󠁶󠁫|󠁣󠁦󠁵󠁫|󠁣󠁦󠁳󠁥|󠁣󠁦󠁯󠁰|󠁣󠁦󠁮󠁭|󠁣󠁦󠁭󠁰|󠁣󠁦󠁭󠁢|󠁣󠁦󠁬󠁢|󠁣󠁦󠁫󠁧|󠁣󠁦󠁫󠁢|󠁣󠁦󠁨󠁳|󠁣󠁦󠁨󠁭|󠁣󠁦󠁨󠁫|󠁣󠁦󠁢󠁫|󠁣󠁮󠁧󠁳|󠁣󠁩󠁢󠁳|󠁣󠁩󠁡󠁢|󠁣󠁨󠁶󠁳|󠁣󠁨󠁶󠁤|󠁣󠁨󠁵󠁲|󠁣󠁨󠁴󠁩|󠁣󠁨󠁴󠁧|󠁣󠁨󠁳󠁺|󠁣󠁨󠁳󠁯|󠁣󠁨󠁯󠁷|󠁣󠁨󠁮󠁷|󠁣󠁨󠁮󠁥|󠁣󠁨󠁬󠁵|󠁣󠁨󠁪󠁵|󠁣󠁨󠁧󠁲|󠁣󠁨󠁧󠁬|󠁣󠁨󠁧󠁥|󠁣󠁨󠁦󠁲|󠁣󠁨󠁢󠁳|󠁣󠁨󠁢󠁬|󠁣󠁤󠁨󠁵|󠁣󠁤󠁥󠁱|󠁣󠁤󠁢󠁵|󠁣󠁤󠁢󠁣|󠁣󠁡󠁹󠁴|󠁣󠁡󠁳󠁫|󠁣󠁡󠁱󠁣|󠁣󠁡󠁰󠁥|󠁣󠁡󠁯󠁮|󠁣󠁡󠁮󠁬|󠁣󠁡󠁮󠁢|󠁣󠁡󠁭󠁢|󠁣󠁡󠁢󠁣|󠁣󠁡󠁡󠁢|󠁣󠁮󠁧󠁸|󠁣󠁮󠁧󠁺|󠁣󠁮󠁨󠁥|󠁣󠁮󠁨󠁩|󠁣󠁮󠁨󠁮|󠁣󠁮󠁪󠁬|󠁣󠁦󠁢󠁢|󠁣󠁦󠁡󠁣|󠁣󠁤󠁴󠁵|󠁣󠁤󠁴󠁯|󠁣󠁤󠁴󠁡|󠁣󠁤󠁳󠁵|󠁣󠁤󠁳󠁫|󠁣󠁤󠁳󠁡|󠁣󠁤󠁮󠁵|󠁣󠁤󠁮󠁫|󠁣󠁤󠁭󠁡|󠁣󠁤󠁬󠁵|󠁣󠁤󠁬󠁯|󠁣󠁤󠁫󠁳|󠁣󠁤󠁫󠁮|󠁣󠁤󠁫󠁬|󠁣󠁤󠁫󠁧|󠁣󠁤󠁫󠁥|󠁣󠁤󠁫󠁣|󠁣󠁤󠁩󠁴|󠁣󠁬󠁭󠁬|󠁣󠁬󠁭󠁡|󠁣󠁬󠁬󠁲|󠁣󠁬󠁬󠁬|󠁣󠁬󠁬󠁩|󠁣󠁬󠁣󠁯|󠁣󠁬󠁢󠁩|󠁣󠁬󠁡󠁴|󠁣󠁬󠁡󠁲|󠁥󠁳󠁨󠁵|󠁥󠁳󠁩󠁢|󠁥󠁳󠁬󠁥|󠁥󠁳󠁬󠁯|󠁣󠁬󠁡󠁰|󠁣󠁬󠁡󠁮|󠁣󠁬󠁡󠁩|󠁥󠁳󠁬󠁵|󠁥󠁳󠁭󠁡|󠁣󠁩󠁺󠁺|󠁥󠁳󠁭󠁬|󠁣󠁮󠁦󠁪|󠁣󠁮󠁣󠁱|󠁣󠁮󠁢󠁪|󠁣󠁮󠁡󠁨|󠁣󠁭󠁳󠁷|󠁣󠁭󠁳󠁵|󠁣󠁭󠁯󠁵|󠁥󠁳󠁧󠁲|󠁣󠁭󠁮󠁷|󠁣󠁭󠁮󠁯|󠁣󠁭󠁬󠁴|󠁣󠁭󠁥󠁳|󠁣󠁭󠁥󠁮|󠁣󠁭󠁣󠁥|󠁣󠁭󠁡󠁤|󠁣󠁬󠁶󠁳|󠁣󠁬󠁴󠁡|󠁣󠁬󠁲󠁭|󠁥󠁳󠁧󠁵|󠁣󠁬󠁮󠁢|󠁣󠁩󠁶󠁢|󠁣󠁩󠁳󠁶|󠁥󠁴󠁡󠁡|󠁣󠁩󠁳󠁭|󠁥󠁴󠁡󠁦|󠁥󠁴󠁡󠁭|󠁥󠁴󠁢󠁥|󠁥󠁴󠁤󠁤|󠁥󠁴󠁧󠁡|󠁣󠁩󠁭󠁧|󠁥󠁴󠁨󠁡|󠁥󠁴󠁯󠁲|󠁥󠁴󠁳󠁩|󠁣󠁩󠁬󠁧|󠁥󠁴󠁳󠁷|󠁥󠁴󠁴󠁩|󠁣󠁩󠁬󠁣|󠁣󠁩󠁧󠁤|󠁣󠁩󠁤󠁮|󠁣󠁩󠁣󠁭|󠁥󠁳󠁭󠁵|󠁣󠁩󠁹󠁭|󠁥󠁳󠁮󠁡|󠁥󠁳󠁮󠁣|󠁥󠁳󠁯󠁲|󠁥󠁳󠁰󠁭|󠁥󠁳󠁰󠁯|󠁥󠁳󠁰󠁶|󠁥󠁳󠁲󠁩|󠁥󠁳󠁳󠁡|󠁥󠁳󠁳󠁥|󠁥󠁳󠁳󠁧|󠁥󠁳󠁳󠁯|󠁥󠁳󠁳󠁳|󠁣󠁩󠁷󠁲|󠁥󠁳󠁴󠁯|󠁥󠁳󠁶󠁡|󠁥󠁳󠁶󠁣|󠁥󠁳󠁶󠁩|󠁢󠁮󠁴󠁵|󠁢󠁮󠁴󠁥|󠁢󠁮󠁢󠁭|󠁢󠁮󠁢󠁥|󠁢󠁪󠁺󠁯|󠁢󠁪󠁰󠁬|󠁢󠁪󠁯󠁵|󠁢󠁪󠁭󠁯|󠁢󠁪󠁬󠁩|󠁢󠁪󠁫󠁯|󠁢󠁪󠁤󠁯|󠁢󠁪󠁣󠁯|󠁢󠁪󠁢󠁯|󠁢󠁪󠁡󠁱|󠁢󠁩󠁲󠁹|󠁢󠁩󠁲󠁴|󠁢󠁩󠁲󠁭|󠁢󠁩󠁮󠁧|󠁢󠁩󠁭󠁹|󠁢󠁩󠁭󠁷|󠁢󠁲󠁴󠁯|󠁢󠁲󠁳󠁰|󠁢󠁲󠁳󠁥|󠁢󠁲󠁳󠁣|󠁢󠁲󠁲󠁪|󠁢󠁲󠁰󠁲|󠁢󠁲󠁰󠁩|󠁢󠁲󠁰󠁥|󠁢󠁲󠁭󠁧|󠁢󠁲󠁭󠁡|󠁢󠁲󠁧󠁯|󠁢󠁲󠁥󠁳|󠁢󠁲󠁤󠁦|󠁢󠁲󠁣󠁥|󠁢󠁲󠁢󠁡|󠁢󠁲󠁡󠁰|󠁢󠁲󠁡󠁣|󠁢󠁱󠁳󠁥|󠁢󠁱󠁳󠁡|󠁢󠁱󠁢󠁯|󠁥󠁲󠁧󠁢|󠁥󠁲󠁤󠁵|󠁥󠁲󠁤󠁫|󠁥󠁲󠁡󠁮|󠁥󠁧󠁭󠁴|󠁥󠁧󠁭󠁮|󠁥󠁧󠁬󠁸|󠁥󠁧󠁫󠁮|󠁥󠁧󠁫󠁢|󠁥󠁧󠁪󠁳|󠁥󠁧󠁩󠁳|󠁥󠁧󠁧󠁺|󠁥󠁧󠁧󠁨|󠁥󠁧󠁤󠁴|󠁥󠁧󠁤󠁫|󠁥󠁧󠁢󠁨|󠁡󠁺󠁹󠁥|󠁡󠁺󠁸󠁡|󠁡󠁺󠁳󠁲|󠁡󠁺󠁳󠁭|󠁢󠁩󠁭󠁵|󠁢󠁩󠁭󠁡|󠁢󠁩󠁫󠁹|󠁢󠁩󠁫󠁲|󠁢󠁩󠁫󠁩|󠁢󠁩󠁧󠁩|󠁥󠁳󠁢󠁵|󠁥󠁳󠁢󠁩|󠁥󠁳󠁢󠁡|󠁥󠁳󠁡󠁶|󠁢󠁩󠁣󠁩|󠁢󠁩󠁣󠁡|󠁢󠁩󠁢󠁲|󠁢󠁩󠁢󠁢|󠁢󠁨󠀱󠀷|󠁥󠁳󠁡󠁮|󠁥󠁳󠁡󠁬|󠁥󠁳󠁡󠁢|󠁥󠁲󠁳󠁫|󠁥󠁲󠁭󠁡|󠁣󠁯󠁤󠁣|󠁥󠁳󠁥󠁸|󠁢󠁺󠁳󠁣|󠁢󠁺󠁯󠁷|󠁥󠁳󠁣󠁥|󠁢󠁺󠁣󠁹|󠁢󠁺󠁢󠁺|󠁢󠁹󠁶󠁩|󠁢󠁹󠁭󠁩|󠁢󠁹󠁭󠁡|󠁢󠁹󠁨󠁲|󠁢󠁹󠁨󠁯|󠁢󠁹󠁨󠁭|󠁢󠁹󠁢󠁲|󠁢󠁷󠁳󠁴|󠁢󠁷󠁳󠁥|󠁢󠁷󠁮󠁷|󠁢󠁷󠁮󠁥|󠁢󠁷󠁬󠁯|󠁢󠁷󠁫󠁷|󠁥󠁳󠁺󠁡|󠁣󠁮󠁪󠁳|󠁣󠁮󠁪󠁸|󠁣󠁮󠁬󠁮|󠁥󠁳󠁧󠁩|󠁥󠁳󠁧󠁣|󠁣󠁮󠁭󠁯|󠁣󠁮󠁮󠁭|󠁣󠁮󠁮󠁸|󠁣󠁮󠁱󠁨|󠁣󠁮󠁳󠁨|󠁣󠁮󠁳󠁮|󠁣󠁮󠁳󠁸|󠁣󠁮󠁴󠁪|󠁣󠁮󠁴󠁷|󠁣󠁮󠁸󠁪|󠁣󠁮󠁸󠁺|󠁣󠁮󠁹󠁮|󠁣󠁮󠁺󠁪|󠁥󠁳󠁧󠁡|󠁢󠁳󠁭󠁩|󠁢󠁳󠁭󠁧|󠁢󠁳󠁭󠁣|󠁢󠁳󠁬󠁩|󠁢󠁳󠁩󠁮|󠁢󠁳󠁨󠁴|󠁢󠁳󠁨󠁩|󠁢󠁳󠁧󠁣|󠁢󠁳󠁦󠁰|󠁢󠁳󠁥󠁸|󠁢󠁳󠁥󠁧|󠁢󠁳󠁣󠁳|󠁢󠁳󠁣󠁯|󠁢󠁳󠁣󠁫|󠁢󠁳󠁣󠁩|󠁢󠁳󠁣󠁥|󠁢󠁳󠁢󠁹|󠁢󠁳󠁢󠁰|󠁢󠁳󠁢󠁩|󠁢󠁳󠁡󠁫|󠁢󠁷󠁫󠁬|󠁢󠁷󠁫󠁧|󠁢󠁷󠁪󠁷|󠁢󠁷󠁧󠁨|󠁢󠁷󠁧󠁡|󠁢󠁷󠁦󠁲|󠁢󠁷󠁣󠁨|󠁢󠁷󠁣󠁥|󠁢󠁴󠁴󠁹|󠁢󠁴󠁧󠁡|󠁢󠁳󠁷󠁧|󠁢󠁳󠁳󠁷|󠁢󠁳󠁳󠁳|󠁢󠁳󠁳󠁯|󠁢󠁳󠁳󠁥|󠁢󠁳󠁳󠁡|󠁢󠁳󠁲󠁩|󠁢󠁳󠁲󠁣|󠁢󠁳󠁮󠁳|󠁳󠁺󠁳󠁨|󠁳󠁺󠁭󠁡|󠁳󠁺󠁬󠁵|󠁳󠁺󠁨󠁨|󠁳󠁹󠁴󠁡|󠁳󠁹󠁳󠁵|󠁳󠁹󠁲󠁤|󠁳󠁹󠁲󠁡|󠁳󠁹󠁱󠁵|󠁳󠁹󠁬󠁡|󠁳󠁹󠁩󠁤|󠁳󠁹󠁨󠁩|󠁳󠁹󠁨󠁡|󠁳󠁹󠁤󠁹|󠁳󠁹󠁤󠁲|󠁳󠁹󠁤󠁩|󠁳󠁶󠁵󠁳|󠁳󠁶󠁵󠁮|󠁳󠁶󠁳󠁶|󠁴󠁤󠁳󠁡|󠁴󠁤󠁯󠁤|󠁴󠁤󠁮󠁤|󠁴󠁤󠁭󠁯|󠁴󠁤󠁭󠁥|󠁴󠁤󠁭󠁣|󠁴󠁤󠁭󠁡|󠁴󠁤󠁬󠁲|󠁴󠁤󠁬󠁯|󠁴󠁤󠁬󠁣|󠁴󠁤󠁫󠁡|󠁴󠁤󠁨󠁬|󠁴󠁤󠁧󠁲|󠁴󠁤󠁥󠁯|󠁴󠁤󠁥󠁥|󠁴󠁤󠁣󠁢|󠁴󠁤󠁢󠁯|󠁴󠁤󠁢󠁧|󠁳󠁳󠁥󠁣|󠁳󠁳󠁢󠁷|󠁳󠁳󠁢󠁮|󠁳󠁲󠁷󠁡|󠁳󠁲󠁳󠁩|󠁳󠁲󠁳󠁡|󠁳󠁲󠁰󠁲|󠁳󠁲󠁰󠁭|󠁳󠁲󠁮󠁩|󠁳󠁲󠁭󠁡|󠁳󠁲󠁣󠁲|󠁳󠁲󠁣󠁭|󠁳󠁲󠁢󠁲|󠁳󠁯󠁷󠁯|󠁳󠁯󠁴󠁯|󠁳󠁯󠁳󠁯|󠁳󠁯󠁳󠁨|󠁳󠁯󠁳󠁤|󠁳󠁯󠁳󠁡|󠁴󠁤󠁢󠁡|󠁳󠁶󠁳󠁳|󠁳󠁶󠁳󠁯|󠁳󠁶󠁳󠁭|󠁳󠁶󠁳󠁡|󠁳󠁶󠁰󠁡|󠁳󠁶󠁭󠁯|󠁳󠁶󠁬󠁩|󠁳󠁶󠁣󠁵|󠁳󠁶󠁣󠁨|󠁳󠁶󠁣󠁡|󠁳󠁶󠁡󠁨|󠁳󠁳󠁷󠁲|󠁳󠁳󠁵󠁹|󠁳󠁳󠁮󠁵|󠁳󠁳󠁬󠁫|󠁳󠁳󠁪󠁧|󠁳󠁳󠁥󠁷|󠁵󠁭󠀸󠀱|󠁵󠁭󠀷󠀹|󠁵󠁭󠀷󠀶|󠁵󠁭󠀷󠀱|󠁵󠁭󠀶󠀷|󠁵󠁡󠀷󠀷|󠁵󠁡󠀷󠀴|󠁵󠁡󠀷󠀱|󠁵󠁡󠀶󠀸|󠁵󠁡󠀶󠀵|󠁵󠁡󠀶󠀳|󠁵󠁡󠀶󠀱|󠁵󠁡󠀵󠀹|󠁵󠁡󠀵󠀶|󠁵󠁡󠀵󠀳|󠁵󠁡󠀵󠀱|󠁵󠁡󠀴󠀸|󠁵󠁡󠀴󠀶|󠁵󠁡󠀴󠀳|󠁵󠁳󠁫󠁳|󠁵󠁳󠁩󠁮|󠁵󠁳󠁩󠁬|󠁵󠁳󠁩󠁤|󠁵󠁳󠁩󠁡|󠁵󠁳󠁨󠁩|󠁵󠁳󠁧󠁡|󠁵󠁳󠁦󠁬|󠁵󠁳󠁤󠁥|󠁵󠁳󠁤󠁣|󠁵󠁳󠁣󠁴|󠁵󠁳󠁣󠁯|󠁵󠁳󠁣󠁡|󠁵󠁳󠁡󠁺|󠁵󠁳󠁡󠁲|󠁵󠁭󠀹󠀵|󠁵󠁭󠀸󠀹|󠁵󠁭󠀸󠀶|󠁴󠁬󠁬󠁩|󠁴󠁬󠁬󠁡|󠁴󠁬󠁥󠁲|󠁴󠁬󠁤󠁩|󠁴󠁬󠁣󠁯|󠁴󠁬󠁢󠁯|󠁴󠁬󠁢󠁡|󠁴󠁬󠁡󠁮|󠁴󠁬󠁡󠁬|󠁴󠁪󠁳󠁵|󠁴󠁪󠁲󠁡|󠁴󠁪󠁫󠁴|󠁴󠁪󠁧󠁢|󠁴󠁪󠁤󠁵|󠁴󠁤󠁷󠁦|󠁴󠁤󠁴󠁩|󠁴󠁤󠁴󠁡|󠁴󠁤󠁳󠁩|󠁳󠁳󠁥󠁥|󠁵󠁭󠀸󠀴|󠁵󠁡󠀴󠀰|󠁵󠁡󠀳󠀵|󠁵󠁡󠀳󠀲|󠁵󠁡󠀳󠀰|󠁵󠁡󠀲󠀶|󠁵󠁡󠀲󠀳|󠁵󠁡󠀲󠀱|󠁵󠁡󠀱󠀸|󠁵󠁡󠀱󠀴|󠁵󠁡󠀱󠀲|󠁵󠁡󠀰󠀹|󠁵󠁡󠀰󠀷|󠁵󠁡󠀰󠀵|󠁴󠁮󠀶󠀱|󠁴󠁬󠁶󠁩|󠁴󠁬󠁯󠁥|󠁴󠁬󠁭󠁴|󠁲󠁯󠁮󠁴|󠁲󠁯󠁭󠁳|󠁲󠁯󠁭󠁭|󠁲󠁯󠁭󠁨|󠁲󠁯󠁩󠁳|󠁲󠁯󠁩󠁬|󠁲󠁯󠁩󠁦|󠁲󠁯󠁨󠁲|󠁲󠁯󠁨󠁤|󠁲󠁯󠁧󠁲|󠁲󠁯󠁧󠁬|󠁲󠁯󠁧󠁪|󠁲󠁯󠁤󠁪|󠁲󠁯󠁤󠁢|󠁲󠁯󠁣󠁶|󠁲󠁯󠁣󠁬|󠁲󠁯󠁣󠁪|󠁲󠁯󠁢󠁺|󠁲󠁯󠁢󠁶|󠁲󠁵󠁤󠁡|󠁲󠁵󠁣󠁵|󠁲󠁵󠁣󠁥|󠁲󠁵󠁢󠁵|󠁲󠁵󠁢󠁡|󠁲󠁵󠁡󠁬|󠁲󠁵󠁡󠁤|󠁲󠁳󠁶󠁯|󠁲󠁳󠁫󠁭|󠁲󠁯󠁶󠁳|󠁲󠁯󠁶󠁮|󠁲󠁯󠁶󠁬|󠁲󠁯󠁴󠁲|󠁲󠁯󠁳󠁶|󠁲󠁯󠁳󠁭|󠁲󠁯󠁳󠁪|󠁲󠁯󠁳󠁢|󠁲󠁯󠁰󠁨|󠁰󠁴󠀲󠀰|󠁰󠁬󠀳󠀲|󠁰󠁬󠀳󠀰|󠁰󠁬󠀲󠀸|󠁰󠁬󠀲󠀶|󠁰󠁬󠀲󠀴|󠁰󠁬󠀲󠀲|󠁰󠁬󠀲󠀰|󠁰󠁬󠀱󠀸|󠁰󠁬󠀱󠀶|󠁰󠁬󠀱󠀴|󠁰󠁬󠀱󠀲|󠁰󠁬󠀱󠀰|󠁰󠁬󠀰󠀸|󠁰󠁬󠀰󠀶|󠁰󠁬󠀰󠀴|󠁰󠁬󠀰󠀲|󠁰󠁫󠁳󠁤|󠁰󠁫󠁰󠁢|󠁲󠁯󠁯󠁴|󠁲󠁯󠁢󠁴|󠁲󠁯󠁢󠁲|󠁲󠁯󠁢󠁮|󠁲󠁯󠁢󠁨|󠁲󠁯󠁢󠁣|󠁲󠁯󠁡󠁲|󠁲󠁯󠁡󠁧|󠁲󠁯󠁡󠁢|󠁱󠁡󠁺󠁡|󠁱󠁡󠁷󠁡|󠁱󠁡󠁵󠁳|󠁱󠁡󠁳󠁨|󠁱󠁡󠁲󠁡|󠁱󠁡󠁭󠁳|󠁱󠁡󠁫󠁨|󠁱󠁡󠁤󠁡|󠁰󠁹󠀱󠀹|󠁳󠁮󠁬󠁧|󠁳󠁮󠁫󠁬|󠁳󠁮󠁫󠁡|󠁳󠁮󠁦󠁫|󠁳󠁮󠁤󠁫|󠁳󠁮󠁤󠁢|󠁳󠁬󠁮󠁷|󠁳󠁫󠁺󠁩|󠁳󠁫󠁴󠁣|󠁳󠁫󠁴󠁡|󠁳󠁫󠁰󠁶|󠁳󠁫󠁮󠁩|󠁳󠁫󠁫󠁩|󠁳󠁫󠁢󠁬|󠁳󠁫󠁢󠁣|󠁳󠁨󠁨󠁬|󠁳󠁨󠁡󠁣|󠁳󠁥󠁢󠁤|󠁳󠁤󠁳󠁩|󠁴󠁬󠁭󠁦|󠁳󠁯󠁮󠁵|󠁳󠁯󠁭󠁵|󠁳󠁯󠁪󠁨|󠁳󠁯󠁪󠁤|󠁳󠁯󠁨󠁩|󠁳󠁯󠁧󠁥|󠁳󠁯󠁧󠁡|󠁳󠁯󠁢󠁹|󠁳󠁯󠁢󠁲|󠁳󠁯󠁢󠁮|󠁳󠁯󠁢󠁫|󠁳󠁯󠁡󠁷|󠁳󠁮󠁺󠁧|󠁳󠁮󠁴󠁨|󠁳󠁮󠁴󠁣|󠁳󠁮󠁳󠁬|󠁳󠁮󠁳󠁥|󠁳󠁢󠁴󠁥|󠁳󠁢󠁲󠁢|󠁳󠁢󠁩󠁳|󠁳󠁢󠁧󠁵|󠁳󠁢󠁣󠁴|󠁳󠁢󠁣󠁨|󠁳󠁢󠁣󠁥|󠁳󠁡󠀱󠀴|󠁲󠁵󠁵󠁤|󠁲󠁵󠁴󠁹|󠁲󠁵󠁴󠁡|󠁲󠁵󠁳󠁥|󠁲󠁵󠁳󠁡|󠁲󠁵󠁭󠁯|󠁲󠁵󠁭󠁥|󠁲󠁵󠁫󠁲|󠁲󠁵󠁫󠁯|󠁲󠁵󠁩󠁮|󠁰󠁴󠀳󠀰|󠁳󠁮󠁭󠁴|󠁳󠁤󠁲󠁳|󠁳󠁤󠁮󠁷|󠁳󠁤󠁮󠁲|󠁳󠁤󠁮󠁯|󠁳󠁤󠁮󠁢|󠁳󠁤󠁫󠁳|󠁳󠁤󠁫󠁮|󠁳󠁤󠁫󠁨|󠁳󠁤󠁫󠁡|󠁳󠁤󠁧󠁺|󠁳󠁤󠁧󠁫|󠁳󠁤󠁧󠁤|󠁳󠁤󠁤󠁷|󠁳󠁤󠁤󠁳|󠁳󠁤󠁤󠁮|󠁳󠁤󠁤󠁥|󠁳󠁤󠁤󠁣|󠁧󠁴󠁣󠁭|󠁧󠁴󠁢󠁶|󠁧󠁴󠁡󠁶|󠁧󠁲󠁡󠀱|󠁧󠁲󠀰󠀱|󠁧󠁬󠁱󠁡|󠁧󠁨󠁢󠁡|󠁦󠁲󠁹󠁴|󠁦󠁲󠁷󠁦|󠁦󠁲󠁴󠁦|󠁦󠁲󠁲󠁥|󠁦󠁲󠁰󠁭|󠁦󠁲󠁰󠁦|󠁦󠁲󠁮󠁣|󠁦󠁲󠁭󠁱|󠁦󠁲󠁭󠁦|󠁦󠁲󠁧󠁰|󠁦󠁲󠁧󠁦|󠁦󠁲󠁣󠁰|󠁧󠁴󠁺󠁡|󠁧󠁴󠁴󠁯|󠁧󠁴󠁳󠁵|󠁧󠁴󠁳󠁲|󠁧󠁴󠁳󠁯|󠁧󠁴󠁳󠁭|󠁧󠁴󠁳󠁡|󠁧󠁴󠁲󠁥|󠁧󠁴󠁱󠁺|󠁧󠁴󠁱󠁣|󠁧󠁴󠁰󠁲|󠁧󠁴󠁰󠁥|󠁧󠁴󠁪󠁵|󠁧󠁴󠁪󠁡|󠁧󠁴󠁩󠁺|󠁧󠁴󠁨󠁵|󠁧󠁴󠁧󠁵|󠁧󠁴󠁥󠁳|󠁣󠁺󠁰󠁲|󠁣󠁺󠁰󠁬|󠁣󠁺󠁰󠁡|󠁣󠁺󠁯󠁬|󠁣󠁺󠁭󠁯|󠁣󠁺󠁬󠁩|󠁣󠁺󠁫󠁲|󠁣󠁺󠁫󠁡|󠁣󠁺󠁪󠁭|󠁣󠁺󠁪󠁣|󠁣󠁮󠀷󠀱|󠁣󠁤󠁯󠁲|󠁣󠁤󠁫󠁷|󠁣󠁤󠁫󠁡|󠁣󠁤󠁢󠁮|󠁢󠁨󠀱󠀶|󠁢󠁡󠀱󠀰|󠁡󠁬󠁶󠁬|󠁡󠁬󠁴󠁲|󠁧󠁴󠁣󠁱|󠁦󠁲󠁢󠁬|󠁦󠁲󠀷󠀵|󠁦󠁩󠀰󠀱|󠁥󠁥󠀸󠀶|󠁥󠁥󠀸󠀲|󠁥󠁥󠀷󠀸|󠁥󠁥󠀷󠀰|󠁥󠁥󠀶󠀷|󠁥󠁥󠀶󠀵|󠁥󠁥󠀵󠀹|󠁥󠁥󠀵󠀷|󠁥󠁥󠀵󠀱|󠁥󠁥󠀴󠀹|󠁥󠁥󠀴󠀴|󠁣󠁺󠁺󠁬|󠁣󠁺󠁶󠁹|󠁣󠁺󠁵󠁳|󠁰󠁬󠁬󠁤|󠁰󠁬󠁬󠁢|󠁰󠁬󠁫󠁰|󠁰󠁬󠁤󠁳|󠁰󠁫󠁴󠁡|󠁯󠁭󠁳󠁨|󠁯󠁭󠁢󠁡|󠁮󠁰󠁳󠁥|󠁮󠁰󠁳󠁡|󠁮󠁰󠁲󠁡|󠁮󠁰󠁮󠁡|󠁮󠁰󠁭󠁥|󠁮󠁰󠁭󠁡|󠁮󠁰󠁬󠁵|󠁮󠁰󠁫󠁯|󠁮󠁰󠁫󠁡|󠁮󠁰󠁪󠁡|󠁮󠁰󠁧󠁡|󠁮󠁰󠁤󠁨|󠁺󠁡󠁮󠁬|󠁺󠁡󠁧󠁴|󠁵󠁳󠁶󠁩|󠁵󠁳󠁵󠁭|󠁵󠁳󠁰󠁲|󠁵󠁳󠁭󠁰|󠁵󠁳󠁧󠁵|󠁵󠁳󠁡󠁳|󠁳󠁨󠁴󠁡|󠁰󠁬󠁺󠁰|󠁰󠁬󠁷󠁰|󠁰󠁬󠁷󠁮|󠁰󠁬󠁰󠁭|󠁰󠁬󠁰󠁫|󠁰󠁬󠁰󠁤|󠁰󠁬󠁯󠁰|󠁰󠁬󠁭󠁺|󠁰󠁬󠁭󠁡|󠁭󠁵󠁶󠁰|󠁭󠁵󠁱󠁢|󠁭󠁵󠁰󠁵|󠁭󠁵󠁣󠁵|󠁭󠁵󠁢󠁲|󠁬󠁡󠁸󠁮|󠁩󠁴󠁶󠁳|󠁩󠁴󠁳󠁤|󠁩󠁴󠁯󠁴|󠁩󠁴󠁯󠁧|󠁩󠁴󠁣󠁩|󠁩󠁴󠁡󠁯|󠁩󠁮󠁵󠁴|󠁩󠁮󠁴󠁧|󠁩󠁮󠁯󠁲|󠁩󠁮󠁤󠁮|󠁩󠁮󠁤󠁤|󠁩󠁮󠁣󠁴|󠁣󠁺󠁳󠁴|󠁰󠁬󠁬󠁵|󠁮󠁰󠁢󠁨|󠁮󠁰󠁢󠁡|󠁮󠁯󠀲󠀳|󠁮󠁯󠀲󠀰|󠁮󠁯󠀱󠀹|󠁮󠁯󠀱󠀴|󠁮󠁯󠀱󠀲|󠁮󠁯󠀱󠀰|󠁮󠁬󠁳󠁸|󠁮󠁬󠁣󠁷|󠁮󠁬󠁡󠁷|󠁭󠁶󠁵󠁳|󠁭󠁶󠁵󠁮|󠁭󠁶󠁳󠁵|󠁭󠁶󠁳󠁣|󠁭󠁶󠁮󠁯|󠁭󠁶󠁮󠁣|󠁶󠁮󠀰󠀹|󠁵󠁺󠁸󠁯|󠁵󠁺󠁴󠁯|󠁵󠁺󠁴󠁫|󠁵󠁺󠁳󠁵|󠁵󠁺󠁳󠁩|󠁵󠁺󠁳󠁡|󠁵󠁺󠁱󠁲|󠁵󠁺󠁱󠁡|󠁵󠁺󠁮󠁷|󠁵󠁺󠁮󠁧|󠁵󠁺󠁪󠁩|󠁵󠁺󠁦󠁡|󠁵󠁺󠁢󠁵|󠁵󠁺󠁡󠁮|󠁵󠁹󠁴󠁴|󠁵󠁹󠁴󠁡|󠁵󠁹󠁳󠁯|󠁵󠁹󠁳󠁪|󠁷󠁳󠁧󠁩|󠁷󠁳󠁧󠁥|󠁷󠁳󠁦󠁡|󠁷󠁳󠁡󠁴|󠁷󠁳󠁡󠁬|󠁷󠁳󠁡󠁡|󠁷󠁦󠁵󠁶|󠁷󠁦󠁳󠁧|󠁷󠁦󠁡󠁬|󠁶󠁮󠁳󠁧|󠁶󠁮󠁨󠁰|󠁶󠁮󠁨󠁮|󠁶󠁮󠁤󠁮|󠁶󠁮󠁣󠁴|󠁶󠁮󠀶󠀳|󠁶󠁮󠀶󠀱|󠁶󠁮󠀴󠀹|󠁶󠁮󠀳󠀹|󠁵󠁳󠁶󠁡|󠁵󠁳󠁵󠁴|󠁵󠁳󠁴󠁸|󠁵󠁳󠁴󠁮|󠁵󠁳󠁲󠁩|󠁵󠁳󠁰󠁡|󠁵󠁳󠁯󠁲|󠁵󠁳󠁯󠁫|󠁵󠁳󠁯󠁨|󠁵󠁳󠁮󠁹|󠁵󠁳󠁮󠁶|󠁵󠁳󠁮󠁭|󠁵󠁳󠁮󠁪|󠁵󠁳󠁮󠁨|󠁵󠁳󠁭󠁩|󠁵󠁳󠁭󠁡|󠁵󠁳󠁬󠁡|󠁵󠁳󠁫󠁹|󠁳󠁢󠁷󠁥|󠁶󠁮󠀱󠀸|󠁵󠁹󠁳󠁡|󠁵󠁹󠁲󠁶|󠁵󠁹󠁰󠁡|󠁵󠁹󠁭󠁯|󠁵󠁹󠁭󠁡|󠁵󠁹󠁬󠁡|󠁵󠁹󠁦󠁳|󠁵󠁹󠁦󠁤|󠁵󠁹󠁤󠁵|󠁵󠁹󠁣󠁯|󠁵󠁹󠁣󠁬|󠁵󠁹󠁣󠁡|󠁵󠁹󠁡󠁲|󠁵󠁳󠁷󠁹|󠁵󠁳󠁷󠁶|󠁵󠁳󠁷󠁩|󠁵󠁳󠁷󠁡|󠁡󠁬󠁧󠁲|󠁡󠁬󠁧󠁪|󠁡󠁬󠁦󠁲|󠁡󠁬󠁥󠁲|󠁡󠁬󠁥󠁬|󠁡󠁬󠁤󠁶|󠁡󠁬󠁤󠁲|󠁡󠁬󠁤󠁬|󠁡󠁬󠁤󠁩|󠁡󠁬󠁢󠁵|󠁡󠁬󠁢󠁲|󠁺󠁷󠁭󠁳|󠁺󠁷󠁭󠁮|󠁺󠁷󠁭󠁩|󠁺󠁷󠁭󠁥|󠁺󠁷󠁭󠁣|󠁺󠁷󠁭󠁡|󠁺󠁷󠁨󠁡|󠁺󠁷󠁢󠁵|󠁭󠁶󠁣󠁥|󠁡󠁬󠁴󠁰|󠁡󠁬󠁴󠁥|󠁡󠁬󠁳󠁲|󠁡󠁬󠁳󠁫|󠁡󠁬󠁳󠁨|󠁡󠁬󠁰󠁵|󠁡󠁬󠁰󠁧|󠁡󠁬󠁭󠁴|󠁡󠁬󠁭󠁲|󠁡󠁬󠁭󠁭|󠁡󠁬󠁭󠁫|󠁡󠁬󠁬󠁵|󠁡󠁬󠁬󠁥|󠁡󠁬󠁬󠁢|󠁡󠁬󠁫󠁵|󠁡󠁬󠁫󠁲|󠁡󠁬󠁫󠁯|󠁹󠁥󠁭󠁡|󠁹󠁥󠁬󠁡|󠁹󠁥󠁪󠁡|󠁹󠁥󠁩󠁢|󠁹󠁥󠁨󠁵|󠁹󠁥󠁨󠁪|󠁹󠁥󠁨󠁤|󠁹󠁥󠁤󠁨|󠁹󠁥󠁤󠁡|󠁹󠁥󠁢󠁡|󠁹󠁥󠁡󠁭|󠁹󠁥󠁡󠁤|󠁹󠁥󠁡󠁢|󠁷󠁳󠁶󠁳|󠁷󠁳󠁶󠁦|󠁷󠁳󠁴󠁵|󠁷󠁳󠁳󠁡|󠁷󠁳󠁰󠁡|󠁵󠁳󠁶󠁴|󠁡󠁬󠁨󠁡|󠁺󠁭󠀱󠀰|󠁺󠁡󠁷󠁣|󠁺󠁡󠁮󠁷|󠁺󠁡󠁮󠁣|󠁺󠁡󠁭󠁰|󠁺󠁡󠁬󠁰|󠁺󠁡󠁧󠁰|󠁺󠁡󠁦󠁳|󠁺󠁡󠁥󠁣|󠁹󠁥󠁴󠁡|󠁹󠁥󠁳󠁵|󠁹󠁥󠁳󠁮|󠁹󠁥󠁳󠁨|󠁹󠁥󠁳󠁤|󠁹󠁥󠁳󠁡|󠁹󠁥󠁲󠁡|󠁹󠁥󠁭󠁷|󠁹󠁥󠁭󠁲|󠁩󠁴󠁲󠁩|󠁩󠁴󠁲󠁧|󠁩󠁴󠁲󠁥|󠁩󠁴󠁲󠁣|󠁩󠁴󠁲󠁡|󠁩󠁴󠁰󠁺|󠁩󠁴󠁰󠁲|󠁩󠁴󠁰󠁩|󠁩󠁴󠁰󠁧|󠁩󠁴󠁰󠁡|󠁩󠁴󠁯󠁲|󠁩󠁴󠁮󠁵|󠁩󠁴󠁮󠁯|󠁩󠁴󠁮󠁡|󠁩󠁴󠁭󠁩|󠁩󠁴󠁭󠁥|󠁩󠁴󠁬󠁯|󠁩󠁴󠁬󠁩|󠁪󠁯󠁩󠁲|󠁪󠁯󠁢󠁡|󠁪󠁯󠁡󠁺|󠁪󠁯󠁡󠁴|󠁪󠁯󠁡󠁱|󠁪󠁯󠁡󠁭|󠁪󠁯󠁡󠁪|󠁩󠁴󠁶󠁶|󠁩󠁴󠁶󠁴|󠁩󠁴󠁶󠁲|󠁩󠁴󠁶󠁩|󠁩󠁴󠁶󠁥|󠁩󠁴󠁵󠁤|󠁩󠁴󠁴󠁶|󠁩󠁴󠁴󠁥|󠁩󠁴󠁴󠁡|󠁩󠁴󠁳󠁩|󠁩󠁴󠁳󠁡|󠁩󠁴󠁣󠁥|󠁩󠁴󠁢󠁺|󠁩󠁴󠁢󠁬|󠁩󠁴󠁢󠁩|󠁩󠁴󠁢󠁧|󠁩󠁴󠁢󠁡|󠁩󠁴󠁡󠁶|󠁩󠁴󠁡󠁴|󠁩󠁴󠁡󠁮|󠁩󠁴󠁡󠁬|󠁩󠁴󠁡󠁧|󠁩󠁴󠀸󠀸|󠁩󠁴󠀸󠀲|󠁩󠁴󠀷󠀵|󠁩󠁴󠀷󠀲|󠁩󠁴󠀶󠀷|󠁩󠁴󠀶󠀵|󠁩󠁴󠀶󠀲|󠁩󠁴󠁬󠁥|󠁩󠁴󠁬󠁣|󠁩󠁴󠁫󠁲|󠁩󠁴󠁩󠁳|󠁩󠁴󠁩󠁭|󠁩󠁴󠁧󠁲|󠁩󠁴󠁧󠁯|󠁩󠁴󠁧󠁥|󠁩󠁴󠁦󠁲|󠁩󠁴󠁦󠁭|󠁩󠁴󠁦󠁩|󠁩󠁴󠁦󠁧|󠁩󠁴󠁦󠁥|󠁩󠁴󠁦󠁣|󠁩󠁴󠁥󠁮|󠁩󠁴󠁣󠁺|󠁩󠁴󠁣󠁬|󠁬󠁢󠁪󠁬|󠁬󠁢󠁪󠁡|󠁬󠁢󠁢󠁡|󠁬󠁢󠁡󠁳|󠁬󠁢󠁡󠁫|󠁬󠁡󠁸󠁳|󠁬󠁡󠁸󠁩|󠁬󠁡󠁸󠁥|󠁬󠁡󠁸󠁡|󠁬󠁡󠁶󠁴|󠁬󠁡󠁶󠁩|󠁬󠁡󠁳󠁶|󠁬󠁡󠁳󠁬|󠁬󠁡󠁰󠁨|󠁬󠁡󠁯󠁵|󠁬󠁡󠁬󠁰|󠁬󠁡󠁬󠁭|󠁬󠁡󠁫󠁨|󠁬󠁴󠁡󠁬|󠁬󠁴󠀶󠀰|󠁬󠁲󠁳󠁩|󠁬󠁲󠁲󠁩|󠁬󠁲󠁲󠁧|󠁬󠁲󠁮󠁩|󠁬󠁲󠁭󠁹|󠁬󠁲󠁭󠁯|󠁬󠁲󠁭󠁧|󠁬󠁲󠁬󠁯|󠁬󠁲󠁧󠁰|󠁬󠁲󠁧󠁫|󠁬󠁲󠁧󠁧|󠁬󠁲󠁧󠁢|󠁬󠁲󠁣󠁭|󠁬󠁲󠁢󠁭|󠁬󠁲󠁢󠁧|󠁬󠁢󠁮󠁡|󠁫󠁷󠁭󠁵|󠁫󠁷󠁫󠁵|󠁫󠁷󠁪󠁡|󠁫󠁷󠁨󠁡|󠁫󠁷󠁦󠁡|󠁫󠁷󠁡󠁨|󠁫󠁲󠀵󠀰|󠁫󠁲󠀱󠀱|󠁫󠁰󠀱󠀰|󠁫󠁮󠀱󠀵|󠁫󠁧󠁧󠁯|󠁫󠁧󠁧󠁢|󠁪󠁯󠁭󠁮|󠁪󠁯󠁭󠁤|󠁪󠁯󠁭󠁡|󠁪󠁯󠁫󠁡|󠁪󠁯󠁪󠁡|󠁩󠁴󠁣󠁨|󠁬󠁡󠁨󠁯|󠁬󠁡󠁣󠁨|󠁬󠁡󠁡󠁴|󠁫󠁺󠀷󠀹|󠁫󠁺󠀷󠀵|󠁫󠁺󠀷󠀱|󠁫󠁺󠀵󠀹|󠁫󠁺󠀵󠀵|󠁫󠁺󠀴󠀷|󠁫󠁺󠀴󠀳|󠁫󠁺󠀳󠀹|󠁫󠁺󠀳󠀵|󠁫󠁺󠀳󠀳|󠁫󠁺󠀳󠀱|󠁫󠁺󠀲󠀷|󠁫󠁺󠀲󠀳|󠁫󠁺󠀱󠀹|󠁩󠁤󠁬󠁡|󠁩󠁤󠁫󠁩|󠁩󠁤󠁪󠁷|󠁩󠁤󠁪󠁴|󠁩󠁤󠁪󠁫|󠁩󠁤󠁪󠁩|󠁩󠁤󠁧󠁯|󠁩󠁤󠁢󠁴|󠁩󠁤󠁢󠁥|󠁩󠁤󠁡󠁣|󠁨󠁵󠁺󠁥|󠁨󠁵󠁺󠁡|󠁨󠁵󠁶󠁭|󠁨󠁵󠁶󠁥|󠁨󠁵󠁶󠁡|󠁨󠁵󠁴󠁯|󠁨󠁵󠁴󠁢|󠁨󠁵󠁳󠁺|󠁩󠁥󠁬󠁭|󠁩󠁥󠁬󠁫|󠁩󠁥󠁬󠁨|󠁩󠁥󠁬󠁤|󠁩󠁥󠁫󠁹|󠁩󠁥󠁫󠁫|󠁩󠁥󠁫󠁥|󠁩󠁥󠁤󠁬|󠁩󠁥󠁣󠁷|󠁩󠁥󠁣󠁥|󠁩󠁤󠁹󠁯|󠁩󠁤󠁳󠁧|󠁩󠁤󠁲󠁩|󠁩󠁤󠁰󠁰|󠁩󠁤󠁮󠁢|󠁩󠁤󠁭󠁵|󠁩󠁤󠁭󠁬|󠁩󠁤󠁭󠁡|󠁨󠁵󠁧󠁳|󠁨󠁵󠁦󠁥|󠁨󠁵󠁥󠁲|󠁨󠁵󠁥󠁧|󠁨󠁵󠁤󠁵|󠁨󠁵󠁤󠁥|󠁨󠁵󠁣󠁳|󠁨󠁵󠁢󠁺|󠁨󠁵󠁢󠁵|󠁨󠁵󠁢󠁫|󠁨󠁵󠁢󠁥|󠁨󠁵󠁢󠁣|󠁨󠁵󠁢󠁡|󠁨󠁴󠁯󠁵|󠁨󠁴󠁮󠁯|󠁨󠁴󠁮󠁩|󠁨󠁴󠁧󠁡|󠁢󠁳󠁮󠁥|󠁨󠁵󠁳󠁫|󠁨󠁵󠁳󠁨|󠁨󠁵󠁳󠁦|󠁨󠁵󠁳󠁤|󠁨󠁵󠁰󠁳|󠁨󠁵󠁰󠁥|󠁨󠁵󠁮󠁹|󠁨󠁵󠁮󠁯|󠁨󠁵󠁮󠁫|󠁨󠁵󠁭󠁩|󠁨󠁵󠁫󠁶|󠁨󠁵󠁫󠁭|󠁨󠁵󠁫󠁥|󠁨󠁵󠁪󠁮|󠁨󠁵󠁨󠁶|󠁨󠁵󠁨󠁥|󠁨󠁵󠁨󠁢|󠁩󠁱󠁮󠁡|󠁩󠁱󠁭󠁵|󠁩󠁱󠁭󠁡|󠁩󠁱󠁫󠁲|󠁩󠁱󠁫󠁩|󠁩󠁱󠁫󠁡|󠁩󠁱󠁤󠁱|󠁩󠁱󠁤󠁩|󠁩󠁱󠁤󠁡|󠁩󠁱󠁢󠁧|󠁩󠁱󠁡󠁲|󠁩󠁱󠁡󠁮|󠁩󠁮󠁷󠁢|󠁩󠁮󠁵󠁰|󠁩󠁮󠁵󠁫|󠁩󠁮󠁴󠁮|󠁩󠁮󠁳󠁫|󠁩󠁮󠁲󠁪|󠁫󠁺󠀱󠀵|󠁩󠁴󠀵󠀷|󠁩󠁴󠀵󠀵|󠁩󠁴󠀵󠀲|󠁩󠁴󠀴󠀵|󠁩󠁴󠀴󠀲|󠁩󠁴󠀳󠀶|󠁩󠁴󠀳󠀴|󠁩󠁴󠀳󠀲|󠁩󠁴󠀲󠀵|󠁩󠁴󠀲󠀳|󠁩󠁴󠀲󠀱|󠁩󠁲󠀳󠀰|󠁩󠁱󠁷󠁡|󠁩󠁱󠁳󠁵|󠁩󠁱󠁳󠁤|󠁩󠁱󠁱󠁡|󠁩󠁱󠁮󠁩|󠁩󠁮󠁧󠁡|󠁩󠁮󠁤󠁬|󠁩󠁮󠁤󠁨|󠁩󠁮󠁢󠁲|󠁩󠁮󠁡󠁰|󠁩󠁮󠁡󠁮|󠁩󠁬󠁴󠁡|󠁩󠁬󠁪󠁭|󠁩󠁬󠁨󠁡|󠁩󠁥󠁷󠁨|󠁩󠁥󠁷󠁤|󠁩󠁥󠁴󠁡|󠁩󠁥󠁳󠁯|󠁩󠁥󠁲󠁮|󠁩󠁥󠁯󠁹|󠁩󠁥󠁭󠁨|󠁩󠁥󠁬󠁳|󠁨󠁵󠁧󠁹|󠁩󠁮󠁰󠁹|󠁩󠁮󠁰󠁢|󠁩󠁮󠁯󠁤|󠁩󠁮󠁮󠁬|󠁩󠁮󠁭󠁺|󠁩󠁮󠁭󠁰|󠁩󠁮󠁭󠁮|󠁩󠁮󠁭󠁬|󠁩󠁮󠁭󠁨|󠁩󠁮󠁬󠁤|󠁩󠁮󠁬󠁡|󠁩󠁮󠁫󠁬|󠁩󠁮󠁫󠁡|󠁩󠁮󠁪󠁫|󠁩󠁮󠁪󠁨|󠁩󠁮󠁨󠁲|󠁩󠁮󠁨󠁰|󠁩󠁮󠁧󠁪|󠁮󠁧󠁡󠁫|󠁮󠁧󠁡󠁤|󠁮󠁧󠁡󠁢|󠁮󠁡󠁯󠁷|󠁮󠁡󠁯󠁮|󠁮󠁡󠁯󠁨|󠁮󠁡󠁯󠁤|󠁮󠁡󠁫󠁷|󠁮󠁡󠁫󠁵|󠁮󠁡󠁫󠁨|󠁮󠁡󠁫󠁥|󠁮󠁡󠁫󠁡|󠁮󠁡󠁨󠁡|󠁮󠁡󠁥󠁲|󠁮󠁡󠁣󠁡|󠁭󠁷󠁺󠁯|󠁭󠁷󠁴󠁨|󠁭󠁷󠁳󠁡|󠁮󠁧󠁬󠁡|󠁮󠁧󠁫󠁷|󠁮󠁧󠁫󠁴|󠁮󠁧󠁪󠁩|󠁮󠁧󠁩󠁭|󠁮󠁧󠁧󠁯|󠁮󠁧󠁦󠁣|󠁮󠁧󠁥󠁮|󠁮󠁧󠁥󠁫|󠁮󠁧󠁥󠁤|󠁮󠁧󠁥󠁢|󠁮󠁧󠁤󠁥|󠁮󠁧󠁣󠁲|󠁮󠁧󠁢󠁹|󠁮󠁧󠁢󠁯|󠁮󠁧󠁢󠁥|󠁮󠁧󠁢󠁡|󠁮󠁧󠁡󠁮|󠁭󠁷󠁣󠁫|󠁭󠁷󠁢󠁬|󠁭󠁷󠁢󠁡|󠁭󠁶󠀲󠀰|󠁭󠁶󠀱󠀷|󠁭󠁵󠁳󠁡|󠁭󠁵󠁲󠁲|󠁭󠁵󠁲󠁯|󠁭󠁵󠁰󠁷|󠁭󠁵󠁰󠁬|󠁭󠁵󠁰󠁡|󠁭󠁵󠁭󠁯|󠁭󠁵󠁧󠁰|󠁭󠁵󠁦󠁬|󠁭󠁵󠁣󠁣|󠁭󠁵󠁢󠁬|󠁭󠁵󠁡󠁧|󠁭󠁬󠀱󠀰|󠁭󠁷󠁲󠁵|󠁭󠁷󠁰󠁨|󠁭󠁷󠁮󠁵|󠁭󠁷󠁮󠁳|󠁭󠁷󠁮󠁫|󠁭󠁷󠁮󠁩|󠁭󠁷󠁮󠁥|󠁭󠁷󠁮󠁢|󠁭󠁷󠁭󠁺|󠁭󠁷󠁭󠁷|󠁭󠁷󠁭󠁵|󠁭󠁷󠁭󠁣|󠁭󠁷󠁬󠁫|󠁭󠁷󠁬󠁩|󠁭󠁷󠁤󠁯|󠁭󠁷󠁤󠁥|󠁭󠁷󠁣󠁴|󠁯󠁭󠁢󠁵|󠁯󠁭󠁢󠁳|󠁯󠁭󠁢󠁪|󠁮󠁯󠀵󠀴|󠁮󠁯󠀵󠀰|󠁮󠁯󠀴󠀶|󠁮󠁯󠀴󠀲|󠁮󠁯󠀳󠀸|󠁮󠁯󠀳󠀴|󠁮󠁯󠀳󠀰|󠁮󠁯󠀱󠀸|󠁮󠁯󠀱󠀵|󠁮󠁯󠀱󠀱|󠁮󠁯󠀰󠀳|󠁮󠁬󠁺󠁨|󠁮󠁬󠁺󠁥|󠁮󠁬󠁵󠁴|󠁮󠁬󠁯󠁶|󠁰󠁫󠁫󠁰|󠁰󠁫󠁪󠁫|󠁰󠁫󠁩󠁳|󠁰󠁫󠁧󠁢|󠁰󠁫󠁢󠁡|󠁰󠁡󠁮󠁴|󠁰󠁡󠁮󠁢|󠁰󠁡󠁫󠁹|󠁰󠁡󠁥󠁭|󠁰󠁡󠀱󠀰|󠁯󠁭󠁺󠁵|󠁯󠁭󠁺󠁡|󠁯󠁭󠁷󠁵|󠁯󠁭󠁳󠁳|󠁯󠁭󠁳󠁪|󠁯󠁭󠁭󠁵|󠁯󠁭󠁭󠁡|󠁯󠁭󠁤󠁡|󠁮󠁩󠁣󠁩|󠁮󠁩󠁣󠁡|󠁮󠁩󠁢󠁯|󠁮󠁩󠁡󠁳|󠁮󠁩󠁡󠁮|󠁮󠁧󠁺󠁡|󠁮󠁧󠁹󠁯|󠁮󠁧󠁴󠁡|󠁮󠁧󠁳󠁯|󠁮󠁧󠁲󠁩|󠁮󠁧󠁰󠁬|󠁮󠁧󠁯󠁹|󠁮󠁧󠁯󠁳|󠁮󠁧󠁯󠁮|󠁮󠁧󠁯󠁧|󠁮󠁧󠁮󠁩|󠁮󠁧󠁮󠁡|󠁭󠁷󠁣󠁲|󠁮󠁬󠁮󠁨|󠁮󠁬󠁮󠁢|󠁮󠁬󠁬󠁩|󠁮󠁬󠁧󠁲|󠁮󠁬󠁧󠁥|󠁮󠁬󠁦󠁲|󠁮󠁬󠁦󠁬|󠁮󠁬󠁤󠁲|󠁮󠁩󠁳󠁪|󠁮󠁩󠁲󠁩|󠁮󠁩󠁮󠁳|󠁮󠁩󠁭󠁮|󠁮󠁩󠁭󠁤|󠁮󠁩󠁬󠁥|󠁮󠁩󠁪󠁩|󠁮󠁩󠁧󠁲|󠁮󠁩󠁥󠁳|󠁮󠁩󠁣󠁯|󠁬󠁹󠁫󠁦|󠁬󠁹󠁭󠁢|󠁬󠁹󠁭󠁱|󠁬󠁹󠁮󠁬|󠁬󠁹󠁮󠁱|󠁬󠁹󠁳󠁢|󠁬󠁹󠁳󠁲|󠁬󠁹󠁴󠁢|󠁬󠁹󠁷󠁡|󠁬󠁹󠁷󠁤|󠁬󠁹󠁷󠁳|󠁬󠁹󠁺󠁡|󠁭󠁣󠁣󠁬|󠁭󠁣󠁣󠁯|󠁭󠁣󠁦󠁯|󠁭󠁣󠁧󠁡|󠁭󠁣󠁪󠁥|󠁭󠁣󠁬󠁡|󠁭󠁣󠁭󠁡|󠁭󠁣󠁭󠁣|󠁭󠁣󠁭󠁧|󠁭󠁣󠁭󠁯|󠁭󠁣󠁭󠁵|󠁭󠁣󠁰󠁨|󠁭󠁣󠁳󠁤|󠁭󠁣󠁳󠁲|󠁭󠁣󠁶󠁲|󠁭󠁤󠁡󠁮|󠁭󠁤󠁢󠁡|󠁬󠁴󠁫󠁬|󠁬󠁴󠁫󠁵|󠁬󠁴󠁭󠁲|󠁬󠁴󠁰󠁮|󠁬󠁴󠁳󠁡|󠁬󠁴󠁴󠁡|󠁬󠁴󠁴󠁥|󠁬󠁴󠁵󠁴|󠁬󠁴󠁶󠁬|󠁬󠁵󠁣󠁡|󠁬󠁵󠁣󠁬|󠁬󠁵󠁤󠁩|󠁬󠁵󠁥󠁣|󠁬󠁵󠁥󠁳|󠁬󠁵󠁧󠁲|󠁬󠁵󠁬󠁵|󠁬󠁵󠁭󠁥|󠁬󠁵󠁲󠁤|󠁬󠁵󠁲󠁭|󠁬󠁵󠁶󠁤|󠁬󠁵󠁷󠁩|󠁬󠁹󠁢󠁡|󠁬󠁹󠁢󠁵|󠁬󠁹󠁤󠁲|󠁬󠁹󠁧󠁴|󠁬󠁹󠁪󠁡|󠁬󠁹󠁪󠁧|󠁬󠁹󠁪󠁩|󠁬󠁹󠁪󠁵|󠁭󠁤󠁢󠁤|󠁭󠁤󠁨󠁩|󠁭󠁤󠁯󠁣|󠁭󠁤󠁧󠁬|󠁭󠁤󠁧󠁡|󠁭󠁤󠁵󠁮|󠁭󠁤󠁯󠁲|󠁭󠁤󠁲󠁥|󠁭󠁤󠁴󠁥|󠁭󠁤󠁦󠁬|󠁭󠁤󠁲󠁩|󠁭󠁤󠁤󠁵|󠁭󠁤󠁳󠁤|󠁭󠁤󠁳󠁩|󠁭󠁤󠁳󠁴|󠁭󠁤󠁳󠁶|󠁭󠁤󠁥󠁤|󠁭󠁤󠁴󠁡|󠁭󠁤󠁣󠁡|󠁭󠁤󠁤󠁯|󠁭󠁤󠁩󠁡|󠁭󠁤󠁤󠁲|󠁭󠁤󠁬󠁥|󠁭󠁤󠁦󠁡|󠁭󠁤󠁮󠁩|󠁧󠁱󠁩|󠁴󠁧󠁫|󠁧󠁷󠁮|󠁧󠁷󠁬|󠁬󠁵󠁤|󠁥󠁳󠁡|󠁬󠁵󠁧|󠁬󠁵󠁬|󠁴󠁧󠁭|󠁭󠁷󠁣|󠁳󠁴󠁰|󠁥󠁳󠁯|󠁴󠁧󠁰|󠁥󠁳󠁰|󠁥󠁳󠁳|󠁴󠁧󠁳|󠁴󠁨󠁳|󠁳󠁬󠁷|󠁧󠁱󠁣|󠁵󠁧󠁷|󠁵󠁧󠁮|󠁵󠁧󠁥|󠁵󠁧󠁣|󠁭󠁧󠁡|󠁭󠁧󠁤|󠁰󠁡󠀱|󠁥󠁳󠁬|󠁥󠁳󠁣|󠁳󠁴󠁳|󠁥󠁳󠁪|󠁭󠁧󠁦|󠁭󠁧󠁭|󠁥󠁳󠁨|󠁭󠁨󠁬|󠁭󠁮󠀱|󠁭󠁨󠁴|󠁭󠁬󠀱|󠁲󠁯󠁢|󠁧󠁷󠁳|󠁴󠁭󠁤|󠁬󠁫󠀱|󠁬󠁫󠀲|󠁬󠁫󠀳|󠁬󠁫󠀴|󠁬󠁫󠀵|󠁬󠁫󠀶|󠁮󠁺󠁮|󠁮󠁺󠁳|󠁬󠁫󠀷|󠁬󠁫󠀸|󠁬󠁫󠀹|󠁴󠁭󠁳|󠁰󠁹󠀱|󠁥󠁳󠁭|󠁫󠁭󠁭|󠁥󠁧󠁣|󠁫󠁮󠁫|󠁢󠁯󠁨|󠁦󠁲󠁣|󠁢󠁯󠁬|󠁫󠁮󠁮|󠁣󠁲󠁡|󠁦󠁲󠁭|󠁣󠁲󠁣|󠁩󠁬󠁺|󠁦󠁲󠁮|󠁩󠁬󠁭|󠁣󠁲󠁬|󠁣󠁲󠁰|󠁩󠁬󠁤|󠁳󠁥󠁫|󠁭󠁺󠁮|󠁭󠁺󠁬|󠁣󠁧󠀵|󠁣󠁧󠀲|󠁭󠁺󠁩|󠁭󠁺󠁧|󠁥󠁳󠁺|󠁫󠁧󠁪|󠁫󠁧󠁴|󠁫󠁧󠁹|󠁫󠁨󠀱|󠁫󠁨󠀲|󠁫󠁩󠁧|󠁫󠁩󠁬|󠁫󠁩󠁰|󠁫󠁭󠁡|󠁫󠁭󠁧|󠁩󠁥󠁬|󠁥󠁳󠁴|󠁧󠁮󠁫|󠁩󠁥󠁧|󠁩󠁥󠁤|󠁭󠁷󠁮|󠁧󠁮󠁬|󠁳󠁬󠁥|󠁩󠁥󠁣|󠁳󠁬󠁮|󠁩󠁳󠀰|󠁧󠁮󠁭|󠁣󠁶󠁳|󠁧󠁮󠁮|󠁳󠁬󠁳|󠁴󠁧󠁣|󠁥󠁳󠁢|󠁭󠁷󠁳|󠁩󠁥󠁵|󠁥󠁳󠁶|󠁧󠁭󠁢|󠁧󠁭󠁵|󠁧󠁭󠁷|󠁧󠁮󠁢|󠁣󠁶󠁢|󠁦󠁪󠁣|󠁧󠁮󠁣|󠁩󠁥󠁭|󠁧󠁮󠁤|󠁦󠁪󠁥|󠁦󠁪󠁮|󠁦󠁪󠁲|󠁦󠁪󠁷|󠁧󠁮󠁦)󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|\p{EBase}\p{EMod}|(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_valid_include_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_valid_include_text.rb new file mode 100644 index 000000000..da5fc2163 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_valid_include_text.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_VALID_INCLUDE_TEXT = /(?:(?:(?:(?:\p{EBase}\p{EMod}|(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{Emoji})‍)+(?:\p{EBase}\p{EMod}|(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{Emoji}))|(?:🏴(?:󠁬󠁶󠀰󠀴[󠀸-󠀹]|󠁬󠁶󠀰󠀴[󠀳-󠀶]|󠁬󠁶󠀰󠀳[󠀴-󠀹]|󠁬󠁶󠀰󠀳[󠀰-󠀲]|󠁬󠁶󠀰󠀲[󠀷-󠀹]|󠁬󠁶󠀰󠀲[󠀳-󠀵]|󠁬󠁶󠀰󠀲[󠀰-󠀱]|󠁬󠁶󠀰󠀱[󠀷-󠀹]|󠁬󠁶󠀰󠀱[󠀲-󠀴]|󠁣󠁺󠀵󠀲[󠀱-󠀵]|󠁬󠁶󠀰󠀰[󠀸-󠀹]|󠁬󠁶󠀰󠀰[󠀳-󠀶]|󠁭󠁮󠀰󠀴[󠀶-󠀷]|󠁧󠁢󠁥󠁮[󠁦-󠁧]|󠁣󠁺󠀵󠀳[󠀱-󠀴]|󠁣󠁺󠀶󠀳[󠀱-󠀵]|󠁰󠁥󠁬󠁡[󠁬-󠁭]|󠁣󠁺󠀶󠀴[󠀱-󠀷]|󠁰󠁨󠁰󠁡[󠁭-󠁮]|󠁣󠁺󠀷󠀱[󠀱-󠀵]|󠁦󠁲󠀹󠀷[󠀱-󠀴]|󠁭󠁡󠁢󠁥[󠁲-󠁳]|󠁣󠁺󠀱󠀲[󠀰-󠀲]|󠁣󠁺󠀶󠀱[󠀱-󠀵]|󠁣󠁺󠀶󠀲[󠀱-󠀷]|󠁣󠁺󠀳󠀲[󠀱-󠀷]|󠁥󠁥󠀷󠀹[󠀲-󠀳]|󠁣󠁺󠀴󠀱[󠀱-󠀳]|󠁧󠁢󠁨󠁡[󠁬-󠁭]|󠁣󠁺󠀴󠀲[󠀱-󠀷]|󠁬󠁶󠀱󠀰[󠀷-󠀹]|󠁬󠁶󠀱󠀰[󠀳-󠀵]|󠁬󠁶󠀰󠀹[󠀵-󠀶]|󠁬󠁶󠀰󠀹[󠀲-󠀳]|󠁬󠁶󠀰󠀸[󠀱-󠀶]|󠁬󠁶󠀰󠀷[󠀸-󠀹]|󠁬󠁶󠀰󠀷[󠀴-󠀶]|󠁬󠁶󠀰󠀷[󠀰-󠀲]|󠁣󠁺󠀵󠀱[󠀱-󠀴]|󠁬󠁶󠀰󠀶[󠀳-󠀶]|󠁬󠁶󠀰󠀶[󠀰-󠀱]|󠁵󠁧󠀱󠀱[󠀰-󠀹]|󠁵󠁧󠀱󠀲[󠀰-󠀶]|󠁵󠁧󠀲󠀰[󠀱-󠀹]|󠁵󠁧󠀲󠀱[󠀰-󠀹]|󠁧󠁢󠁳󠁴[󠁳-󠁴]|󠁵󠁧󠀲󠀲[󠀰-󠀹]|󠁧󠁢󠁳󠁴[󠁧-󠁨]|󠁵󠁧󠀲󠀳[󠀰-󠀷]|󠁵󠁧󠀳󠀰[󠀱-󠀹]|󠁵󠁧󠀳󠀱[󠀰-󠀹]|󠁵󠁧󠀳󠀲[󠀰-󠀹]|󠁵󠁧󠀳󠀳[󠀰-󠀷]|󠁵󠁧󠀴󠀰[󠀱-󠀹]|󠁵󠁧󠀴󠀱[󠀰-󠀹]|󠁵󠁧󠀴󠀲[󠀰-󠀹]|󠁵󠁧󠀴󠀳[󠀰-󠀵]|󠁧󠁢󠁳󠁯[󠁬-󠁭]|󠁰󠁳󠁪󠁥[󠁭-󠁮]|󠁧󠁢󠁢󠁤[󠁦-󠁧]|󠁧󠁢󠁳󠁬[󠁦-󠁧]|󠁧󠁢󠁢󠁲[󠁣-󠁤]|󠁡󠁺󠁳󠁡[󠁫-󠁬]|󠁭󠁮󠀰󠀶[󠀳-󠀵]|󠁬󠁶󠀱󠀱[󠀱-󠀳]|󠁬󠁶󠀱󠀰[󠀱-󠀲]|󠁣󠁺󠀷󠀲[󠀱-󠀴]|󠁧󠁢󠁤󠁮[󠁣-󠁤]|󠁣󠁺󠀸󠀰[󠀱-󠀶]|󠁬󠁶󠀰󠀸[󠀷-󠀹]|󠁮󠁬󠁢󠁱[󠀱-󠀳]|󠁥󠁥󠀴󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀶[󠀷-󠀸]|󠁬󠁶󠀰󠀵[󠀸-󠀹]|󠁩󠁳󠁳󠁫[󠁦-󠁧]|󠁥󠁥󠀴󠀳[󠀰-󠀲]|󠁥󠁥󠀱󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀴[󠀱-󠀲]|󠁬󠁶󠀰󠀱[󠀵-󠀶]|󠁰󠁷󠀲󠀲[󠀶-󠀸]|󠁥󠁥󠀲󠀸[󠀳-󠀴]|󠁧󠁢󠁡󠁢[󠁣-󠁥]|󠁵󠁧󠀱󠀰[󠀱-󠀹]|󠁭󠁫󠀶󠀰[󠀱-󠀹]|󠁭󠁫󠀷󠀰[󠀱-󠀶]|󠁭󠁫󠀸󠀰[󠀱-󠀹]|󠁭󠁫󠀸󠀱[󠀰-󠀷]|󠁭󠁡󠁫󠁨[󠁮-󠁯]|󠁳󠁩󠀲󠀱[󠀰-󠀳]|󠁳󠁩󠀲󠀰[󠀰-󠀹]|󠁳󠁩󠀱󠀹[󠀰-󠀹]|󠁳󠁩󠀱󠀸[󠀰-󠀹]|󠁳󠁩󠀱󠀷[󠀰-󠀹]|󠁳󠁩󠀱󠀶[󠀰-󠀹]|󠁳󠁩󠀱󠀵[󠀰-󠀹]|󠁢󠁦󠁫󠁯[󠁳-󠁴]|󠁳󠁩󠀱󠀴[󠀶-󠀹]|󠁳󠁩󠀱󠀴[󠀰-󠀴]|󠁭󠁡󠁧󠁵[󠁥-󠁦]|󠁭󠁨󠁡󠁬[󠁫-󠁬]|󠁡󠁦󠁢󠁡[󠁬-󠁭]|󠁡󠁺󠁺󠁡[󠁱-󠁲]|󠁢󠁦󠁢󠁡[󠁬-󠁮]|󠁭󠁫󠀱󠀰[󠀱-󠀹]|󠁭󠁫󠀲󠀰[󠀱-󠀹]|󠁭󠁡󠁳󠁩[󠁫-󠁬]|󠁭󠁫󠀲󠀱[󠀰-󠀱]|󠁭󠁫󠀳󠀰[󠀳-󠀴]|󠁭󠁫󠀳󠀰[󠀷-󠀸]|󠁭󠁫󠀳󠀱[󠀰-󠀳]|󠁣󠁺󠀲󠀰[󠀱-󠀹]|󠁣󠁺󠀲󠀰[󠁡-󠁣]|󠁭󠁫󠀴󠀰[󠀱-󠀹]|󠁣󠁺󠀳󠀱[󠀱-󠀷]|󠁭󠁫󠀵󠀰[󠀱-󠀹]|󠁳󠁩󠀱󠀳[󠀰-󠀹]|󠁳󠁩󠀰󠀸[󠀰-󠀹]|󠁳󠁩󠀰󠀹[󠀰-󠀹]|󠁳󠁩󠀱󠀰[󠀰-󠀹]|󠁳󠁩󠀰󠀱[󠀰-󠀹]|󠁳󠁩󠀰󠀷[󠀰-󠀹]|󠁳󠁩󠀰󠀲[󠀰-󠀹]|󠁰󠁧󠁭󠁰[󠁬-󠁭]|󠁳󠁩󠀱󠀱[󠀰-󠀹]|󠁳󠁩󠀱󠀲[󠀰-󠀹]|󠁳󠁩󠀰󠀳[󠀰-󠀹]|󠁳󠁩󠀰󠀶[󠀰-󠀹]|󠁰󠁨󠁣󠁡[󠁳-󠁴]|󠁳󠁩󠀰󠀴[󠀰-󠀹]|󠁣󠁺󠀱󠀰[󠁡-󠁦]|󠁰󠁨󠁣󠁡[󠁭-󠁮]|󠁣󠁺󠀱󠀰[󠀱-󠀹]|󠁰󠁨󠁢󠁵[󠁫-󠁬]|󠁳󠁩󠀰󠀵[󠀰-󠀹]|󠁣󠁺󠀱󠀱[󠀰-󠀹]|󠁡󠁯󠁣󠁮[󠁮-󠁯]|󠁳󠁩󠀰󠀰[󠀱-󠀹]|󠁣󠁶󠁳[󠁬-󠁭]|󠁬󠁩󠀱[󠀰-󠀱]|󠁢󠁦󠀰[󠀱-󠀹]|󠁺󠁷󠁭[󠁶-󠁷]|󠁢󠁲󠁡[󠁬-󠁭]|󠁬󠁫󠀱[󠀱-󠀳]|󠁬󠁫󠀲[󠀱-󠀳]|󠁢󠁦󠀱[󠀰-󠀳]|󠁬󠁫󠀳[󠀱-󠀳]|󠁬󠁫󠀴[󠀱-󠀵]|󠁢󠁲󠁭[󠁳-󠁴]|󠁫󠁨󠀱[󠀰-󠀹]|󠁫󠁲󠀳[󠀰-󠀱]|󠁺󠁭󠀰[󠀱-󠀹]|󠁵󠁳󠁭[󠁤-󠁥]|󠁵󠁳󠁭[󠁮-󠁯]|󠁵󠁳󠁭[󠁳-󠁴]|󠁵󠁳󠁮[󠁣-󠁥]|󠁬󠁫󠀹[󠀱-󠀲]|󠁬󠁫󠀸[󠀱-󠀲]|󠁬󠁫󠀷[󠀱-󠀲]|󠁵󠁳󠁳[󠁣-󠁤]|󠁪󠁰󠀰[󠀱-󠀹]|󠁡󠁬󠁫[󠁡-󠁣]|󠁪󠁰󠀱[󠀰-󠀹]|󠁪󠁰󠀲[󠀰-󠀹]|󠁢󠁲󠁲[󠁲-󠁳]|󠁢󠁲󠁲[󠁮-󠁯]|󠁬󠁫󠀶[󠀱-󠀲]|󠁬󠁫󠀵[󠀱-󠀳]|󠁢󠁲󠁰[󠁡-󠁢]|󠁪󠁰󠀳[󠀰-󠀹]|󠁪󠁰󠀴[󠀰-󠀷]|󠁫󠁥󠀰[󠀱-󠀹]|󠁫󠁥󠀱[󠀰-󠀹]|󠁫󠁥󠀲[󠀰-󠀹]|󠁫󠁥󠀳[󠀰-󠀹]|󠁫󠁥󠀴[󠀰-󠀷]|󠁫󠁲󠀴[󠀱-󠀹]|󠁮󠁧󠁫[󠁤-󠁥]|󠁲󠁳󠀰[󠀰-󠀹]|󠁶󠁮󠀴[󠀳-󠀷]|󠁲󠁵󠁫[󠁫-󠁬]|󠁶󠁮󠀵[󠀰-󠀹]|󠁶󠁮󠀶[󠀶-󠀹]|󠁶󠁮󠀷[󠀰-󠀳]|󠁬󠁡󠁢[󠁫-󠁬]|󠁲󠁵󠁫[󠁢-󠁣]|󠁫󠁺󠀶[󠀱-󠀳]|󠁢󠁩󠁢[󠁬-󠁭]|󠁢󠁧󠀱[󠀰-󠀹]|󠁢󠁧󠀲[󠀰-󠀸]|󠁢󠁨󠀱[󠀳-󠀵]|󠁫󠁲󠀲[󠀶-󠀹]|󠁫󠁰󠀱[󠀳-󠀵]|󠁣󠁵󠀰[󠀳-󠀹]|󠁫󠁮󠀰[󠀱-󠀹]|󠁫󠁮󠀱[󠀰-󠀳]|󠁲󠁳󠀱[󠀰-󠀹]|󠁲󠁳󠀲[󠀰-󠀹]|󠁫󠁰󠀰[󠀱-󠀹]|󠁬󠁩󠀰[󠀱-󠀹]|󠁵󠁹󠁲[󠁮-󠁯]|󠁬󠁣󠀱[󠀰-󠀲]|󠁬󠁣󠀰[󠀵-󠀸]|󠁬󠁣󠀰[󠀱-󠀳]|󠁬󠁢󠁢[󠁨-󠁩]|󠁭󠁹󠀰[󠀱-󠀹]|󠁭󠁹󠀱[󠀰-󠀶]|󠁢󠁪󠁡[󠁫-󠁬]|󠁶󠁣󠀰[󠀱-󠀶]|󠁫󠁺󠀱[󠀰-󠀱]|󠁮󠁧󠁫[󠁮-󠁯]|󠁶󠁮󠀰[󠀱-󠀷]|󠁶󠁮󠀱[󠀳-󠀴]|󠁶󠁮󠀲[󠀰-󠀹]|󠁫󠁨󠀲[󠀰-󠀵]|󠁣󠁵󠀱[󠀰-󠀶]|󠁶󠁮󠀳[󠀰-󠀷]|󠁮󠁡󠁯[󠁳-󠁴]|󠁢󠁧󠀰[󠀱-󠀹]|󠁶󠁮󠀴[󠀰-󠀱]|󠁴󠁨󠀲[󠀰-󠀷]|󠁴󠁨󠀳[󠀰-󠀹]|󠁴󠁨󠀴[󠀰-󠀹]|󠁴󠁨󠀵[󠀰-󠀸]|󠁴󠁨󠀶[󠀰-󠀷]|󠁴󠁨󠀷[󠀰-󠀷]|󠁴󠁨󠀸[󠀰-󠀶]|󠁴󠁨󠀹[󠀰-󠀶]|󠁣󠁤󠁨[󠁫-󠁬]|󠁣󠁡󠁮[󠁳-󠁵]|󠁳󠁧󠀰[󠀱-󠀵]|󠁴󠁮󠀱[󠀱-󠀴]|󠁴󠁮󠀲[󠀱-󠀳]|󠁴󠁮󠀳[󠀱-󠀴]|󠁴󠁮󠀴[󠀱-󠀳]|󠁴󠁮󠀵[󠀱-󠀳]|󠁴󠁮󠀷[󠀱-󠀳]|󠁴󠁮󠀸[󠀱-󠀳]|󠁴󠁯󠀰[󠀱-󠀵]|󠁴󠁲󠀰[󠀱-󠀹]|󠁴󠁲󠀱[󠀰-󠀹]|󠁴󠁲󠀲[󠀰-󠀹]|󠁴󠁲󠀳[󠀰-󠀹]|󠁴󠁲󠀴[󠀰-󠀹]|󠁴󠁲󠀵[󠀰-󠀹]|󠁴󠁲󠀶[󠀰-󠀹]|󠁴󠁲󠀷[󠀰-󠀹]|󠁴󠁲󠀸[󠀰-󠀱]|󠁭󠁡󠀱[󠀰-󠀲]|󠁭󠁥󠀲[󠀰-󠀵]|󠁭󠁥󠀱[󠀰-󠀹]|󠁭󠁥󠀰[󠀱-󠀹]|󠁥󠁳󠁭[󠁣-󠁤]|󠁭󠁤󠁳[󠁮-󠁯]|󠁥󠁳󠁴[󠁥-󠁦]|󠁭󠁤󠁣[󠁲-󠁵]|󠁭󠁤󠁣[󠁬-󠁭]|󠁭󠁤󠁢[󠁲-󠁳]|󠁭󠁣󠁳[󠁯-󠁰]|󠁥󠁴󠁳[󠁮-󠁯]|󠁦󠁩󠀰[󠀲-󠀹]|󠁦󠁩󠀱[󠀰-󠀹]|󠁦󠁪󠀰[󠀱-󠀹]|󠁦󠁪󠀱[󠀰-󠀴]|󠁳󠁴󠀰[󠀱-󠀶]|󠁣󠁨󠁺[󠁧-󠁨]|󠁣󠁨󠁳[󠁧-󠁨]|󠁳󠁹󠁨[󠁬-󠁭]|󠁳󠁮󠁫[󠁤-󠁥]|󠁣󠁮󠁨[󠁡-󠁢]|󠁣󠁧󠀱[󠀱-󠀶]|󠁣󠁮󠁨[󠁫-󠁬]|󠁳󠁭󠀰[󠀱-󠀹]|󠁭󠁭󠀰[󠀱-󠀷]|󠁭󠁭󠀱[󠀱-󠀸]|󠁣󠁮󠁳[󠁣-󠁤]|󠁣󠁤󠁭[󠁮-󠁯]|󠁴󠁨󠀱[󠀰-󠀹]|󠁭󠁴󠀵[󠀰-󠀹]|󠁭󠁴󠀶[󠀰-󠀸]|󠁥󠁳󠁣[󠁲-󠁵]|󠁳󠁢󠁭[󠁫-󠁬]|󠁥󠁳󠁣[󠁬-󠁯]|󠁥󠁳󠁣[󠁡-󠁣]|󠁥󠁳󠁡[󠁲-󠁳]|󠁭󠁶󠀰[󠀰-󠀵]|󠁭󠁶󠀰[󠀷-󠀸]|󠁭󠁶󠀱[󠀲-󠀴]|󠁳󠁡󠀱[󠀰-󠀲]|󠁢󠁷󠁳[󠁯-󠁰]|󠁳󠁡󠀰[󠀱-󠀹]|󠁲󠁷󠀰[󠀱-󠀵]|󠁭󠁶󠀲[󠀳-󠀹]|󠁭󠁷󠁫[󠁲-󠁳]|󠁭󠁷󠁭[󠁧-󠁨]|󠁢󠁴󠀴[󠀱-󠀵]|󠁢󠁴󠀳[󠀱-󠀴]|󠁢󠁴󠀲[󠀱-󠀴]|󠁢󠁴󠀱[󠀱-󠀵]|󠁵󠁳󠁡[󠁫-󠁬]|󠁬󠁴󠀵[󠀰-󠀹]|󠁬󠁴󠀴[󠀰-󠀹]|󠁬󠁴󠀳[󠀰-󠀹]|󠁢󠁳󠁮[󠁯-󠁰]|󠁬󠁴󠀲[󠀰-󠀹]|󠁬󠁴󠀱[󠀰-󠀹]|󠁬󠁴󠀰[󠀱-󠀹]|󠁭󠁡󠀰[󠀱-󠀹]|󠁦󠁲󠀰[󠀱-󠀹]|󠁦󠁲󠀱[󠀰-󠀹]|󠁦󠁲󠀲[󠀱-󠀹]|󠁦󠁲󠀲[󠁡-󠁢]|󠁦󠁲󠀳[󠀰-󠀹]|󠁦󠁲󠀴[󠀰-󠀹]|󠁦󠁲󠀵[󠀰-󠀹]|󠁦󠁲󠀶[󠀰-󠀹]|󠁬󠁹󠁭[󠁩-󠁪]|󠁳󠁥󠁡[󠁢-󠁣]|󠁦󠁲󠀷[󠀰-󠀴]|󠁦󠁲󠀷[󠀶-󠀹]|󠁦󠁲󠀸[󠀰-󠀹]|󠁦󠁲󠀹[󠀰-󠀵]|󠁭󠁲󠀰[󠀱-󠀹]|󠁭󠁲󠀱[󠀰-󠀵]|󠁭󠁴󠀰[󠀱-󠀹]|󠁭󠁴󠀱[󠀰-󠀹]|󠁭󠁴󠀲[󠀰-󠀹]|󠁭󠁴󠀳[󠀰-󠀹]|󠁭󠁴󠀴[󠀰-󠀹]|󠁳󠁣󠀲[󠀰-󠀷]|󠁳󠁣󠀱[󠀰-󠀹]|󠁴󠁺󠀰[󠀱-󠀹]|󠁴󠁺󠀱[󠀰-󠀹]|󠁴󠁺󠀲[󠀰-󠀹]|󠁴󠁺󠀳[󠀰-󠀱]|󠁳󠁣󠀰[󠀱-󠀹]|󠁲󠁯󠁴[󠁬-󠁭]|󠁩󠁲󠀱[󠀰-󠀹]|󠁩󠁴󠁭[󠁳-󠁴]|󠁩󠁤󠁳[󠁬-󠁮]|󠁩󠁴󠁭[󠁮-󠁯]|󠁩󠁴󠁡[󠁰-󠁲]|󠁩󠁲󠀰[󠀰-󠀹]|󠁮󠁲󠀱[󠀰-󠀴]|󠁮󠁲󠀰[󠀱-󠀹]|󠁩󠁴󠁭[󠁢-󠁣]|󠁩󠁤󠁳[󠁲-󠁵]|󠁮󠁰󠁰[󠀱-󠀷]|󠁩󠁥󠁣[󠁮-󠁯]|󠁤󠁭󠀱[󠀰-󠀱]|󠁩󠁴󠁬[󠁴-󠁵]|󠁰󠁹󠀱[󠀰-󠀶]|󠁤󠁯󠀰[󠀱-󠀹]|󠁧󠁮󠁫[󠁮-󠁯]|󠁧󠁮󠁫[󠁤-󠁥]|󠁤󠁺󠀱[󠀰-󠀹]|󠁤󠁺󠀲[󠀰-󠀹]|󠁰󠁬󠁳[󠁫-󠁬]|󠁩󠁤󠁰[󠁡-󠁢]|󠁩󠁤󠁰[󠁤-󠁥]|󠁩󠁴󠁰[󠁴-󠁶]|󠁩󠁤󠁰[󠁳-󠁴]|󠁧󠁮󠁭[󠁬-󠁭]|󠁭󠁫󠀶[󠀰-󠀹]|󠁮󠁩󠁭[󠁳-󠁴]|󠁭󠁫󠀷[󠀰-󠀹]|󠁭󠁫󠀸[󠀰-󠀵]|󠁤󠁺󠀳[󠀰-󠀹]|󠁩󠁴󠁰[󠁮-󠁯]|󠁩󠁤󠁳[󠁡-󠁢]|󠁩󠁴󠁰[󠁣-󠁥]|󠁩󠁲󠀲[󠀰-󠀹]|󠁧󠁮󠁭[󠁣-󠁤]|󠁥󠁣󠁳[󠁤-󠁥]|󠁩󠁴󠁢[󠁲-󠁴]|󠁩󠁮󠁴[󠁲-󠁳]|󠁮󠁯󠀲[󠀱-󠀲]|󠁰󠁨󠀴[󠀰-󠀱]|󠁰󠁨󠀱[󠀰-󠀵]|󠁰󠁨󠀰[󠀵-󠀹]|󠁡󠁧󠀰[󠀳-󠀸]|󠁩󠁴󠁣[󠁲-󠁴]|󠁩󠁴󠁣[󠁮-󠁯]|󠁡󠁧󠀱[󠀰-󠀱]|󠁰󠁴󠀱[󠀰-󠀸]|󠁩󠁴󠁣[󠁡-󠁢]|󠁰󠁴󠀰[󠀱-󠀹]|󠁡󠁬󠀰[󠀱-󠀹]|󠁡󠁬󠀱[󠀰-󠀲]|󠁰󠁨󠀰[󠀰-󠀳]|󠁮󠁯󠀱[󠀶-󠀷]|󠁧󠁮󠁫[󠁡-󠁢]|󠁩󠁥󠁭[󠁮-󠁯]|󠁧󠁮󠁢[󠁥-󠁦]|󠁤󠁯󠀱[󠀰-󠀹]|󠁩󠁲󠀳[󠀱-󠀲]|󠁩󠁥󠁷[󠁷-󠁸]|󠁤󠁯󠀲[󠀰-󠀹]|󠁩󠁮󠁡[󠁲-󠁳]|󠁩󠁮󠁣[󠁧-󠁨]|󠁤󠁯󠀳[󠀰-󠀹]|󠁤󠁺󠀴[󠀰-󠀹]|󠁧󠁥󠁳[󠁪-󠁫]|󠁧󠁤󠀰[󠀱-󠀶]|󠁤󠁺󠀵[󠀰-󠀸]|󠁮󠁯󠀰[󠀱-󠀲]|󠁮󠁯󠀰[󠀴-󠀹]|󠁩󠁴󠁢[󠁮-󠁯]|󠁤󠁯󠀴[󠀰-󠀲]|󠁩󠁱󠁢[󠁡-󠁢]|󠁨󠁴󠁮[󠁤-󠁥]|󠁧󠁲󠀷[󠀱-󠀳]|󠁨󠁲󠀲[󠀰-󠀱]|󠁨󠁲󠀱[󠀰-󠀹]|󠁨󠁲󠀰[󠀱-󠀹]|󠁨󠁴󠁳[󠁤-󠁥]|󠁢󠁡󠀰[󠀱-󠀹]|󠁨󠁮󠁣[󠁬-󠁭]|󠁨󠁵󠁳[󠁮-󠁯]|󠁧󠁲󠀶[󠀱-󠀴]|󠁪󠁭󠀱[󠀰-󠀴]|󠁣󠁩󠀰[󠀱-󠀹]|󠁨󠁵󠁳[󠁳-󠁴]|󠁧󠁷󠁢[󠁬-󠁭]|󠁧󠁴󠀲[󠀰-󠀲]|󠁣󠁩󠀱[󠀰-󠀹]|󠁣󠁮󠀱[󠀱-󠀵]|󠁣󠁮󠀲[󠀱-󠀳]|󠁭󠁫󠀲[󠀰-󠀹]|󠁢󠁤󠀶[󠀰-󠀴]|󠁢󠁤󠀵[󠀰-󠀹]|󠁢󠁤󠀴[󠀰-󠀹]|󠁢󠁤󠀳[󠀰-󠀹]|󠁢󠁤󠀲[󠀰-󠀹]|󠁢󠁤󠀱[󠀰-󠀹]|󠁢󠁤󠀰[󠀱-󠀹]|󠁢󠁢󠀱[󠀰-󠀱]|󠁡󠁬󠁰[󠁱-󠁲]|󠁢󠁢󠀰[󠀱-󠀹]|󠁤󠁫󠀸[󠀱-󠀵]|󠁩󠁴󠀷[󠀷-󠀸]|󠁧󠁲󠀹[󠀱-󠀴]|󠁤󠁪󠁡[󠁲-󠁳]|󠁡󠁤󠀰[󠀲-󠀸]|󠁣󠁹󠀰[󠀱-󠀶]|󠁧󠁲󠀸[󠀱-󠀵]|󠁤󠁪󠁤[󠁩-󠁪]|󠁭󠁡󠀱[󠀳-󠀶]|󠁩󠁴󠁶[󠁡-󠁣]|󠁩󠁤󠁫[󠁲-󠁵]|󠁭󠁫󠀳[󠀰-󠀹]|󠁧󠁲󠀴[󠀱-󠀴]|󠁭󠁫󠀴[󠀰-󠀹]|󠁧󠁲󠀳[󠀱-󠀴]|󠁧󠁲󠀲[󠀱-󠀴]|󠁩󠁤󠁮[󠁴-󠁵]|󠁩󠁴󠁴[󠁲-󠁳]|󠁩󠁴󠁴[󠁮-󠁰]|󠁧󠁲󠀱[󠀱-󠀷]|󠁩󠁴󠁳[󠁵-󠁶]|󠁩󠁴󠁳[󠁲-󠁳]|󠁩󠁴󠁳[󠁯-󠁰]|󠁧󠁲󠀰[󠀳-󠀷]|󠁭󠁫󠀰[󠀱-󠀹]|󠁤󠁺󠀰[󠀱-󠀹]|󠁣󠁮󠀳[󠀱-󠀷]|󠁣󠁮󠀴[󠀱-󠀶]|󠁣󠁮󠀵[󠀰-󠀴]|󠁧󠁴󠀱[󠀰-󠀹]|󠁭󠁫󠀵[󠀰-󠀹]|󠁤󠁭󠀰[󠀲-󠀹]|󠁣󠁮󠀶[󠀱-󠀵]|󠁭󠁫󠀱[󠀰-󠀹]|󠁧󠁴󠀰[󠀱-󠀹]|󠁪󠁭󠀰[󠀱-󠀹]|󠁧󠁲󠀵[󠀱-󠀹]|󠁣󠁮󠀹[󠀱-󠀲]|󠁩󠁤󠁢[󠁡-󠁢]|󠁲󠁯󠁣[󠁳-󠁴]|󠁩󠁤󠁪[󠁡-󠁢]|󠁩󠁤󠁫[󠁡-󠁢]|󠁩󠁴󠁲[󠁭-󠁯]|󠁴󠁭[󠁡-󠁢]|󠁳󠁥[󠁷-󠁺]|󠁡󠁲[󠁪-󠁮]|󠁡󠁲[󠁰-󠁺]|󠁡󠁴[󠀱-󠀹]|󠁬󠁳[󠁡-󠁨]|󠁬󠁳[󠁪-󠁫]|󠁶󠁥[󠁲-󠁺]|󠁰󠁹[󠀲-󠀹]|󠁣󠁲[󠁧-󠁨]|󠁦󠁲[󠁨-󠁬]|󠁦󠁲[󠁤-󠁧]|󠁭󠁺[󠁰-󠁱]|󠁦󠁲[󠁡-󠁢]|󠁭󠁺[󠁳-󠁴]|󠁴󠁭[󠁬-󠁭]|󠁳󠁥[󠁳-󠁵]|󠁳󠁥[󠁣-󠁩]|󠁮󠁥[󠀱-󠀸]|󠁩󠁳[󠀱-󠀸]|󠁧󠁡[󠀱-󠀹]|󠁳󠁥[󠁭-󠁯]|󠁧󠁲[󠁡-󠁭]|󠁫󠁨[󠀳-󠀹]|󠁫󠁧[󠁮-󠁯]|󠁭󠁧[󠁴-󠁵]|󠁫󠁧[󠁢-󠁣]|󠁮󠁰[󠀱-󠀵]|󠁥󠁣[󠁷-󠁺]|󠁥󠁣[󠁴-󠁵]|󠁥󠁣[󠁲-󠁳]|󠁥󠁣[󠁬-󠁰]|󠁡󠁲[󠁡-󠁨]|󠁥󠁣[󠁡-󠁩]|󠁭󠁬[󠀲-󠀹]|󠁦󠁲[󠁵-󠁶]|󠁢󠁯[󠁳-󠁴]|󠁢󠁯[󠁮-󠁰]|󠁢󠁯[󠁢-󠁣]|󠁦󠁲[󠁳-󠁴]|󠁧󠁭[󠁬-󠁮]|󠁦󠁲[󠁱-󠁲]|󠁰󠁡[󠀲-󠀹]|󠁣󠁧[󠀷-󠀹]|󠁭󠁺[󠁡-󠁢]|󠁦󠁲[󠁯-󠁰]|󠁶󠁥[󠁡-󠁰]|󠁢󠁤[󠁡-󠁨]|󠁰󠁥󠁴󠁡󠁣|󠁰󠁥󠁴󠁵󠁭|󠁰󠁥󠁵󠁣󠁡|󠁰󠁧󠁣󠁰󠁫|󠁰󠁧󠁣󠁰󠁭|󠁰󠁥󠁳󠁡󠁭|󠁰󠁥󠁰󠁵󠁮|󠁰󠁥󠁰󠁩󠁵|󠁰󠁥󠁰󠁡󠁳|󠁰󠁥󠁭󠁯󠁱|󠁰󠁥󠁭󠁤󠁤|󠁰󠁥󠁬󠁯󠁲|󠁰󠁥󠁬󠁭󠁡|󠁰󠁥󠁬󠁩󠁭|󠁰󠁥󠁪󠁵󠁮|󠁰󠁥󠁩󠁣󠁡|󠁰󠁥󠁨󠁵󠁶|󠁰󠁥󠁨󠁵󠁣|󠁭󠁮󠀰󠀴󠀹|󠁰󠁥󠁣󠁵󠁳|󠁰󠁥󠁣󠁡󠁬|󠁭󠁮󠀰󠀳󠀷|󠁭󠁮󠀰󠀳󠀵|󠁰󠁨󠁡󠁬󠁢|󠁭󠁬󠁢󠁫󠁯|󠁭󠁫󠀴󠀱󠀰|󠁭󠁫󠀳󠀰󠀱|󠁭󠁨󠁷󠁴󠁪|󠁭󠁨󠁷󠁴󠁨|󠁭󠁨󠁵󠁴󠁩|󠁭󠁨󠁵󠁪󠁡|󠁭󠁨󠁲󠁯󠁮|󠁭󠁨󠁮󠁭󠁵|󠁭󠁨󠁮󠁭󠁫|󠁭󠁨󠁭󠁩󠁬|󠁭󠁨󠁭󠁥󠁪|󠁭󠁨󠁭󠁡󠁬|󠁭󠁨󠁭󠁡󠁪|󠁭󠁨󠁬󠁩󠁫|󠁭󠁨󠁬󠁩󠁢|󠁭󠁨󠁬󠁡󠁥|󠁭󠁨󠁫󠁷󠁡|󠁭󠁨󠁫󠁩󠁬|󠁭󠁨󠁪󠁡󠁬|󠁭󠁨󠁪󠁡󠁢|󠁭󠁨󠁥󠁮󠁩|󠁰󠁧󠁥󠁢󠁲|󠁰󠁧󠁥󠁨󠁧|󠁰󠁧󠁥󠁰󠁷|󠁰󠁧󠁥󠁳󠁷|󠁰󠁧󠁧󠁰󠁫|󠁰󠁧󠁨󠁬󠁡|󠁰󠁧󠁪󠁷󠁫|󠁭󠁮󠀰󠀴󠀳|󠁭󠁮󠀰󠀴󠀱|󠁰󠁧󠁭󠁢󠁡|󠁰󠁧󠁭󠁲󠁬|󠁰󠁧󠁮󠁣󠁤|󠁰󠁧󠁮󠁩󠁫|󠁰󠁧󠁮󠁰󠁰|󠁰󠁧󠁮󠁳󠁢|󠁰󠁧󠁳󠁡󠁮|󠁰󠁧󠁳󠁨󠁭|󠁰󠁧󠁷󠁢󠁫|󠁰󠁧󠁷󠁨󠁭|󠁰󠁧󠁷󠁰󠁤|󠁰󠁨󠁡󠁢󠁲|󠁰󠁨󠁡󠁧󠁮|󠁰󠁨󠁡󠁧󠁳|󠁭󠁮󠀰󠀳󠀹|󠁰󠁨󠁡󠁫󠁬|󠁭󠁸󠁴󠁡󠁢|󠁭󠁸󠁴󠁡󠁭|󠁭󠁸󠁴󠁬󠁡|󠁭󠁸󠁶󠁥󠁲|󠁭󠁸󠁹󠁵󠁣|󠁭󠁸󠁺󠁡󠁣|󠁥󠁧󠁡󠁳󠁴|󠁥󠁧󠁡󠁳󠁮|󠁭󠁺󠁭󠁰󠁭|󠁥󠁥󠀴󠀴󠀶|󠁥󠁥󠀴󠀷󠀸|󠁥󠁧󠁡󠁬󠁸|󠁥󠁥󠀹󠀲󠀸|󠁥󠁥󠀹󠀱󠀹|󠁥󠁥󠀹󠀱󠀷|󠁥󠁥󠀹󠀰󠀷|󠁥󠁥󠀴󠀸󠀰|󠁥󠁥󠀹󠀰󠀳|󠁭󠁸󠁯󠁡󠁸|󠁥󠁥󠀲󠀷󠀲|󠁥󠁥󠀲󠀹󠀱|󠁭󠁸󠁰󠁵󠁥|󠁥󠁥󠀲󠀹󠀳|󠁭󠁸󠁱󠁵󠁥|󠁥󠁥󠀲󠀹󠀶|󠁭󠁸󠁲󠁯󠁯|󠁥󠁥󠀳󠀰󠀳|󠁭󠁸󠁳󠁩󠁮|󠁥󠁥󠀳󠀰󠀵|󠁥󠁥󠀳󠀱󠀷|󠁭󠁸󠁳󠁬󠁰|󠁥󠁥󠀳󠀲󠀱|󠁥󠁥󠀳󠀳󠀸|󠁥󠁥󠀳󠀵󠀳|󠁥󠁥󠀴󠀲󠀴|󠁭󠁸󠁳󠁯󠁮|󠁥󠁥󠀴󠀸󠀶|󠁥󠁥󠀷󠀳󠀲|󠁥󠁥󠀷󠀲󠀶|󠁥󠁥󠀷󠀱󠀹|󠁥󠁥󠀷󠀱󠀴|󠁥󠁥󠀷󠀱󠀲|󠁥󠁥󠀷󠀰󠀸|󠁥󠁥󠀵󠀸󠀶|󠁥󠁥󠀶󠀱󠀵|󠁥󠁥󠀶󠀱󠀸|󠁥󠁥󠀶󠀹󠀸|󠁥󠁥󠀶󠀸󠀹|󠁥󠁥󠀶󠀶󠀸|󠁥󠁥󠀶󠀶󠀳|󠁥󠁥󠀶󠀶󠀱|󠁥󠁥󠀶󠀲󠀲|󠁥󠁥󠀶󠀲󠀴|󠁥󠁥󠀶󠀳󠀸|󠁥󠁥󠀶󠀵󠀱|󠁥󠁥󠀵󠀰󠀳|󠁥󠁥󠀹󠀰󠀱|󠁥󠁥󠀸󠀹󠀹|󠁥󠁥󠀸󠀹󠀷|󠁥󠁥󠀸󠀹󠀰|󠁥󠁥󠀵󠀱󠀱|󠁥󠁥󠀸󠀵󠀵|󠁥󠁥󠀵󠀱󠀴|󠁥󠁥󠀸󠀳󠀴|󠁥󠁥󠀸󠀲󠀴|󠁥󠁥󠀵󠀲󠀸|󠁥󠁥󠀸󠀰󠀹|󠁥󠁥󠀸󠀰󠀳|󠁥󠁥󠀷󠀹󠀶|󠁥󠁥󠀵󠀵󠀷|󠁥󠁥󠀷󠀸󠀴|󠁥󠁥󠀷󠀳󠀵|󠁥󠁥󠀵󠀶󠀷|󠁥󠁥󠀶󠀵󠀳|󠁥󠁥󠀱󠀸󠀴|󠁥󠁥󠀱󠀹󠀱|󠁮󠁺󠁷󠁴󠁣|󠁮󠁺󠁷󠁫󠁯|󠁮󠁺󠁷󠁧󠁮|󠁭󠁶󠁭󠁬󠁥|󠁥󠁧󠁷󠁡󠁤|󠁥󠁧󠁳󠁵󠁺|󠁥󠁧󠁳󠁩󠁮|󠁮󠁺󠁴󠁫󠁩|󠁥󠁧󠁳󠁨󠁲|󠁮󠁺󠁴󠁡󠁳|󠁥󠁧󠁳󠁨󠁧|󠁮󠁺󠁳󠁴󠁬|󠁮󠁺󠁯󠁴󠁡|󠁮󠁺󠁮󠁴󠁬|󠁮󠁺󠁮󠁳󠁮|󠁮󠁺󠁭󠁷󠁴|󠁭󠁮󠀰󠀵󠀱|󠁰󠁥󠁣󠁡󠁪|󠁰󠁥󠁡󠁹󠁡|󠁰󠁥󠁡󠁲󠁥|󠁰󠁥󠁡󠁰󠁵|󠁭󠁮󠀰󠀵󠀳|󠁭󠁮󠀰󠀵󠀵|󠁭󠁮󠀰󠀵󠀷|󠁭󠁮󠀰󠀵󠀹|󠁭󠁮󠀰󠀶󠀱|󠁰󠁥󠁡󠁮󠁣|󠁭󠁮󠀰󠀶󠀷|󠁭󠁮󠀰󠀶󠀹|󠁭󠁮󠀰󠀷󠀱|󠁰󠁥󠁡󠁭󠁡|󠁭󠁮󠀰󠀷󠀳|󠁥󠁥󠀱󠀳󠀰|󠁥󠁥󠀱󠀷󠀱|󠁮󠁺󠁭󠁢󠁨|󠁭󠁸󠁣󠁨󠁰|󠁭󠁸󠁣󠁭󠁸|󠁭󠁸󠁣󠁯󠁡|󠁭󠁸󠁣󠁯󠁬|󠁭󠁸󠁤󠁵󠁲|󠁭󠁸󠁧󠁲󠁯|󠁭󠁸󠁧󠁵󠁡|󠁥󠁥󠀲󠀱󠀴|󠁭󠁸󠁨󠁩󠁤|󠁥󠁥󠀲󠀴󠀵|󠁭󠁸󠁪󠁡󠁬|󠁭󠁸󠁭󠁥󠁸|󠁭󠁸󠁭󠁩󠁣|󠁭󠁸󠁭󠁯󠁲|󠁭󠁸󠁮󠁡󠁹|󠁥󠁥󠀲󠀴󠀷|󠁥󠁥󠀲󠀵󠀱|󠁭󠁸󠁮󠁬󠁥|󠁮󠁺󠁨󠁫󠁢|󠁮󠁺󠁧󠁩󠁳|󠁮󠁺󠁣󠁩󠁴|󠁥󠁧󠁰󠁴󠁳|󠁥󠁧󠁭󠁮󠁦|󠁥󠁧󠁫󠁦󠁳|󠁥󠁧󠁦󠁹󠁭|󠁥󠁧󠁢󠁮󠁳|󠁭󠁸󠁡󠁧󠁵|󠁮󠁺󠁣󠁡󠁮|󠁭󠁸󠁢󠁣󠁮|󠁮󠁺󠁢󠁯󠁰|󠁮󠁺󠁡󠁵󠁫|󠁥󠁥󠀱󠀹󠀸|󠁥󠁥󠀲󠀰󠀵|󠁭󠁸󠁢󠁣󠁳|󠁭󠁸󠁣󠁡󠁭|󠁭󠁸󠁣󠁨󠁨|󠁧󠁢󠁲󠁤󠁢|󠁧󠁢󠁲󠁣󠁴|󠁧󠁢󠁲󠁣󠁨|󠁧󠁢󠁲󠁣󠁣|󠁧󠁢󠁰󠁴󠁥|󠁧󠁢󠁰󠁯󠁷|󠁧󠁢󠁰󠁯󠁲|󠁧󠁢󠁰󠁬󠁹|󠁧󠁢󠁰󠁫󠁮|󠁧󠁢󠁰󠁥󠁭|󠁧󠁢󠁯󠁸󠁦|󠁧󠁢󠁯󠁲󠁫|󠁧󠁢󠁯󠁬󠁤|󠁧󠁢󠁮󠁹󠁫|󠁧󠁢󠁮󠁷󠁰|󠁧󠁢󠁮󠁷󠁭|󠁧󠁢󠁮󠁴󠁹|󠁧󠁢󠁮󠁴󠁴|󠁧󠁢󠁮󠁴󠁬|󠁧󠁢󠁮󠁳󠁭|󠁧󠁢󠁮󠁮󠁨|󠁧󠁢󠁮󠁭󠁤|󠁧󠁢󠁮󠁬󠁮|󠁧󠁢󠁮󠁬󠁫|󠁧󠁢󠁳󠁷󠁡|󠁧󠁢󠁳󠁴󠁹|󠁧󠁢󠁳󠁴󠁮|󠁧󠁢󠁳󠁴󠁥|󠁧󠁢󠁳󠁲󠁹|󠁧󠁢󠁳󠁯󠁳|󠁧󠁢󠁳󠁮󠁤|󠁧󠁢󠁳󠁬󠁫|󠁧󠁢󠁳󠁫󠁰|󠁧󠁢󠁳󠁨󠁲|󠁧󠁢󠁳󠁨󠁮|󠁧󠁢󠁳󠁨󠁦|󠁧󠁢󠁳󠁧󠁣|󠁧󠁢󠁳󠁦󠁴|󠁧󠁢󠁳󠁦󠁫|󠁧󠁢󠁳󠁣󠁴|󠁧󠁢󠁳󠁣󠁢|󠁧󠁢󠁳󠁡󠁹|󠁧󠁢󠁳󠁡󠁷|󠁧󠁢󠁲󠁵󠁴|󠁧󠁢󠁲󠁯󠁴|󠁧󠁢󠁲󠁩󠁣|󠁧󠁢󠁲󠁦󠁷|󠁧󠁢󠁲󠁤󠁧|󠁧󠁢󠁬󠁤󠁳|󠁧󠁢󠁬󠁣󠁥|󠁧󠁢󠁬󠁢󠁨|󠁧󠁢󠁬󠁢󠁣|󠁧󠁢󠁬󠁡󠁮|󠁧󠁢󠁫󠁷󠁬|󠁧󠁢󠁫󠁴󠁴|󠁧󠁢󠁫󠁩󠁲|󠁧󠁢󠁫󠁨󠁬|󠁧󠁢󠁫󠁥󠁮|󠁧󠁢󠁫󠁥󠁣|󠁧󠁢󠁩󠁶󠁣|󠁧󠁢󠁩󠁳󠁬|󠁧󠁢󠁩󠁯󠁷|󠁧󠁢󠁩󠁯󠁳|󠁧󠁢󠁨󠁲󠁹|󠁧󠁢󠁨󠁲󠁷|󠁧󠁢󠁨󠁲󠁴|󠁧󠁢󠁨󠁰󠁬|󠁧󠁢󠁨󠁮󠁳|󠁧󠁢󠁨󠁭󠁦|󠁧󠁢󠁨󠁬󠁤|󠁧󠁢󠁨󠁩󠁬|󠁧󠁢󠁨󠁥󠁦|󠁧󠁢󠁮󠁩󠁲|󠁧󠁢󠁮󠁧󠁭|󠁧󠁢󠁮󠁦󠁫|󠁧󠁢󠁮󠁥󠁴|󠁧󠁢󠁮󠁥󠁬|󠁧󠁢󠁮󠁢󠁬|󠁧󠁢󠁮󠁡󠁹|󠁧󠁢󠁭󠁵󠁬|󠁧󠁢󠁭󠁴󠁹|󠁧󠁢󠁭󠁲󠁹|󠁧󠁢󠁭󠁲󠁴|󠁧󠁢󠁭󠁯󠁮|󠁧󠁢󠁭󠁬󠁮|󠁧󠁢󠁭󠁩󠁫|󠁧󠁢󠁭󠁥󠁡|󠁧󠁢󠁭󠁤󠁷|󠁧󠁢󠁭󠁤󠁢|󠁧󠁢󠁭󠁡󠁮|󠁧󠁢󠁬󠁵󠁴|󠁧󠁢󠁬󠁮󠁤|󠁧󠁢󠁬󠁩󠁶|󠁧󠁢󠁬󠁩󠁮|󠁧󠁢󠁬󠁥󠁷|󠁧󠁢󠁴󠁷󠁨|󠁩󠁳󠁡󠁫󠁮|󠁩󠁳󠁡󠁫󠁵|󠁩󠁳󠁡󠁲󠁮|󠁩󠁳󠁡󠁳󠁡|󠁩󠁳󠁢󠁬󠁡|󠁩󠁳󠁢󠁯󠁧|󠁩󠁳󠁢󠁯󠁬|󠁩󠁳󠁤󠁡󠁢|󠁩󠁳󠁤󠁡󠁶|󠁩󠁳󠁥󠁯󠁭|󠁩󠁳󠁥󠁹󠁦|󠁩󠁳󠁦󠁪󠁤|󠁩󠁳󠁦󠁪󠁬|󠁩󠁳󠁦󠁬󠁡|󠁩󠁳󠁦󠁬󠁲|󠁩󠁳󠁧󠁡󠁲|󠁩󠁳󠁧󠁯󠁧|󠁩󠁳󠁧󠁲󠁮|󠁩󠁳󠁧󠁲󠁵|󠁩󠁳󠁧󠁲󠁹|󠁩󠁳󠁨󠁡󠁦|󠁩󠁳󠁨󠁲󠁧|󠁩󠁳󠁨󠁲󠁵|󠁧󠁢󠁺󠁥󠁴|󠁧󠁢󠁹󠁯󠁲|󠁧󠁢󠁷󠁳󠁸|󠁧󠁢󠁷󠁳󠁭|󠁧󠁢󠁷󠁲󠁸|󠁧󠁢󠁷󠁲󠁴|󠁧󠁢󠁷󠁲󠁬|󠁧󠁢󠁷󠁯󠁲|󠁧󠁢󠁷󠁯󠁫|󠁧󠁢󠁷󠁮󠁭|󠁧󠁢󠁷󠁮󠁨|󠁧󠁢󠁷󠁮󠁤|󠁧󠁢󠁷󠁬󠁶|󠁧󠁢󠁷󠁬󠁳|󠁧󠁢󠁷󠁬󠁮|󠁧󠁢󠁷󠁬󠁬|󠁧󠁢󠁷󠁫󠁦|󠁧󠁢󠁷󠁩󠁬|󠁧󠁢󠁷󠁧󠁮|󠁧󠁢󠁷󠁦󠁴|󠁧󠁢󠁷󠁤󠁵|󠁧󠁢󠁷󠁢󠁫|󠁧󠁢󠁷󠁡󠁲|󠁧󠁢󠁶󠁧󠁬|󠁩󠁳󠁳󠁫󠁯|󠁩󠁳󠁳󠁫󠁲|󠁩󠁳󠁳󠁮󠁦|󠁩󠁳󠁳󠁯󠁧|󠁩󠁳󠁳󠁯󠁬|󠁩󠁳󠁳󠁳󠁳|󠁩󠁳󠁳󠁴󠁲|󠁩󠁳󠁳󠁴󠁹|󠁩󠁳󠁳󠁶󠁧|󠁩󠁳󠁴󠁡󠁬|󠁩󠁳󠁴󠁨󠁧|󠁩󠁳󠁴󠁪󠁯|󠁩󠁳󠁶󠁥󠁭|󠁩󠁳󠁶󠁥󠁲|󠁩󠁳󠁶󠁯󠁰|󠁧󠁢󠁴󠁲󠁦|󠁧󠁢󠁴󠁯󠁦|󠁧󠁢󠁴󠁯󠁢|󠁧󠁢󠁴󠁨󠁲|󠁧󠁢󠁴󠁦󠁷|󠁧󠁢󠁴󠁡󠁭|󠁧󠁢󠁳󠁷󠁫|󠁧󠁢󠁳󠁷󠁤|󠁧󠁢󠁬󠁥󠁣|󠁩󠁳󠁨󠁵󠁧|󠁩󠁳󠁨󠁵󠁶|󠁩󠁳󠁨󠁶󠁡|󠁩󠁳󠁨󠁶󠁥|󠁩󠁳󠁩󠁳󠁡|󠁩󠁳󠁫󠁡󠁬|󠁩󠁳󠁫󠁪󠁯|󠁩󠁳󠁫󠁯󠁰|󠁩󠁳󠁬󠁡󠁮|󠁩󠁳󠁭󠁯󠁳|󠁩󠁳󠁭󠁵󠁬|󠁩󠁳󠁭󠁹󠁲|󠁩󠁳󠁮󠁯󠁲|󠁩󠁳󠁲󠁧󠁥|󠁩󠁳󠁲󠁧󠁹|󠁩󠁳󠁲󠁨󠁨|󠁩󠁳󠁲󠁫󠁮|󠁩󠁳󠁲󠁫󠁶|󠁩󠁳󠁳󠁢󠁴|󠁩󠁳󠁳󠁤󠁮|󠁩󠁳󠁳󠁤󠁶|󠁩󠁳󠁳󠁥󠁬|󠁩󠁳󠁳󠁦󠁡|󠁭󠁡󠁡󠁳󠁺|󠁭󠁡󠁡󠁺󠁩|󠁭󠁡󠁢󠁥󠁭|󠁭󠁡󠁢󠁯󠁤|󠁭󠁡󠁢󠁯󠁭|󠁭󠁡󠁢󠁲󠁲|󠁭󠁡󠁣󠁡󠁳|󠁭󠁡󠁣󠁨󠁥|󠁭󠁡󠁣󠁨󠁩|󠁭󠁡󠁣󠁨󠁴|󠁭󠁡󠁤󠁲󠁩|󠁭󠁡󠁥󠁲󠁲|󠁭󠁡󠁥󠁳󠁩|󠁭󠁡󠁥󠁳󠁭|󠁭󠁡󠁦󠁡󠁨|󠁭󠁡󠁦󠁥󠁳|󠁭󠁡󠁦󠁩󠁧|󠁭󠁡󠁦󠁱󠁨|󠁭󠁡󠁨󠁡󠁪|󠁭󠁡󠁨󠁡󠁯|󠁭󠁡󠁨󠁯󠁣|󠁭󠁡󠁩󠁦󠁲|󠁭󠁡󠁩󠁮󠁥|󠁭󠁡󠁪󠁤󠁩|󠁬󠁶󠀰󠀷󠀳|󠁬󠁶󠀰󠀷󠀷|󠁬󠁶󠀰󠀸󠀰|󠁬󠁶󠀰󠀹󠀱|󠁬󠁶󠀰󠀹󠀴|󠁬󠁶󠀰󠀹󠀷|󠁬󠁶󠀰󠀹󠀹|󠁬󠁶󠀱󠀰󠀶|󠁬󠁶󠁤󠁧󠁶|󠁬󠁶󠁪󠁥󠁬|󠁬󠁶󠁪󠁵󠁲|󠁬󠁶󠁬󠁰󠁸|󠁬󠁶󠁲󠁥󠁺|󠁬󠁶󠁲󠁩󠁸|󠁬󠁶󠁶󠁥󠁮|󠁦󠁲󠁡󠁲󠁡|󠁦󠁲󠀹󠀷󠀶|󠁦󠁲󠀷󠀵󠁣|󠁦󠁲󠀶󠁡󠁥|󠁦󠁲󠀶󠀹󠁭|󠁦󠁲󠀲󠀰󠁲|󠁦󠁭󠁹󠁡󠁰|󠁭󠁡󠁡󠁧󠁤|󠁭󠁡󠁡󠁯󠁵|󠁭󠁡󠁳󠁥󠁴|󠁭󠁡󠁳󠁩󠁢|󠁭󠁡󠁳󠁩󠁦|󠁭󠁡󠁳󠁫󠁨|󠁭󠁡󠁴󠁡󠁦|󠁭󠁡󠁴󠁡󠁩|󠁭󠁡󠁴󠁡󠁯|󠁭󠁡󠁴󠁡󠁲|󠁭󠁡󠁴󠁡󠁴|󠁭󠁡󠁴󠁡󠁺|󠁭󠁡󠁴󠁥󠁴|󠁭󠁡󠁴󠁩󠁮|󠁭󠁡󠁴󠁩󠁺|󠁭󠁡󠁴󠁮󠁧|󠁭󠁡󠁴󠁮󠁴|󠁭󠁡󠁹󠁵󠁳|󠁭󠁡󠁺󠁡󠁧|󠁦󠁭󠁴󠁲󠁫|󠁦󠁭󠁰󠁮󠁩|󠁦󠁭󠁫󠁳󠁡|󠁭󠁨󠁡󠁲󠁮|󠁭󠁨󠁡󠁵󠁲|󠁭󠁨󠁥󠁢󠁯|󠁥󠁥󠀲󠀵󠀵|󠁭󠁡󠁪󠁲󠁡|󠁭󠁡󠁫󠁥󠁮|󠁭󠁡󠁫󠁥󠁳|󠁭󠁡󠁫󠁨󠁥|󠁭󠁡󠁬󠁡󠁡|󠁭󠁡󠁬󠁡󠁲|󠁭󠁡󠁭󠁡󠁲|󠁭󠁡󠁭󠁤󠁦|󠁭󠁡󠁭󠁥󠁤|󠁭󠁡󠁭󠁥󠁫|󠁭󠁡󠁭󠁩󠁤|󠁭󠁡󠁭󠁯󠁨|󠁭󠁡󠁭󠁯󠁵|󠁭󠁡󠁮󠁡󠁤|󠁭󠁡󠁮󠁯󠁵|󠁭󠁡󠁯󠁵󠁡|󠁭󠁡󠁯󠁵󠁤|󠁭󠁡󠁯󠁵󠁪|󠁭󠁡󠁯󠁵󠁺|󠁭󠁡󠁲󠁡󠁢|󠁭󠁡󠁲󠁥󠁨|󠁭󠁡󠁳󠁡󠁦|󠁭󠁡󠁳󠁡󠁬|󠁧󠁢󠁤󠁲󠁳|󠁧󠁢󠁤󠁯󠁲|󠁧󠁢󠁤󠁧󠁹|󠁧󠁢󠁤󠁥󠁶|󠁧󠁢󠁤󠁥󠁲|󠁧󠁢󠁤󠁥󠁮|󠁧󠁢󠁤󠁢󠁹|󠁧󠁢󠁤󠁡󠁬|󠁧󠁢󠁣󠁷󠁹|󠁧󠁢󠁣󠁲󠁹|󠁧󠁢󠁣󠁲󠁦|󠁧󠁢󠁣󠁯󠁶|󠁧󠁢󠁣󠁯󠁮|󠁧󠁢󠁣󠁭󠁮|󠁧󠁢󠁣󠁭󠁤|󠁧󠁢󠁣󠁭󠁡|󠁧󠁢󠁣󠁬󠁫|󠁧󠁢󠁣󠁬󠁤|󠁧󠁢󠁣󠁨󠁷|󠁧󠁢󠁣󠁨󠁥|󠁧󠁢󠁣󠁧󠁮|󠁧󠁢󠁣󠁣󠁧|󠁧󠁢󠁣󠁢󠁦|󠁧󠁢󠁣󠁡󠁹|󠁩󠁳󠁳󠁨󠁦|󠁧󠁢󠁨󠁣󠁫|󠁧󠁢󠁨󠁡󠁶|󠁧󠁢󠁧󠁷󠁮|󠁧󠁢󠁧󠁲󠁥|󠁧󠁢󠁧󠁬󠁳|󠁧󠁢󠁧󠁬󠁧|󠁧󠁢󠁧󠁡󠁴|󠁧󠁢󠁦󠁭󠁯|󠁧󠁢󠁦󠁬󠁮|󠁧󠁢󠁦󠁩󠁦|󠁧󠁢󠁦󠁡󠁬|󠁧󠁢󠁥󠁳󠁸|󠁧󠁢󠁥󠁳󠁳|󠁧󠁢󠁥󠁲󠁹|󠁧󠁢󠁥󠁲󠁷|󠁧󠁢󠁥󠁬󠁳|󠁧󠁢󠁥󠁬󠁮|󠁧󠁢󠁥󠁤󠁵|󠁧󠁢󠁥󠁤󠁨|󠁧󠁢󠁥󠁡󠁹|󠁧󠁢󠁥󠁡󠁬|󠁧󠁢󠁤󠁵󠁲|󠁧󠁢󠁤󠁵󠁤|󠁦󠁲󠁰󠁤󠁬|󠁦󠁲󠁰󠁡󠁣|󠁦󠁲󠁯󠁣󠁣|󠁦󠁲󠁮󠁯󠁲|󠁦󠁲󠁮󠁡󠁱|󠁦󠁲󠁩󠁤󠁦|󠁦󠁲󠁨󠁤󠁦|󠁦󠁲󠁧󠁥󠁳|󠁦󠁲󠁣󠁶󠁬|󠁦󠁲󠁢󠁲󠁥|󠁦󠁲󠁢󠁦󠁣|󠁬󠁶󠀰󠀰󠀲|󠁬󠁶󠀰󠀰󠀷|󠁬󠁶󠀰󠀱󠀱|󠁬󠁶󠀰󠀲󠀲|󠁬󠁶󠀰󠀲󠀶|󠁬󠁶󠀰󠀳󠀳|󠁬󠁶󠀰󠀴󠀷|󠁬󠁶󠀰󠀵󠀰|󠁬󠁶󠀰󠀵󠀲|󠁬󠁶󠀰󠀵󠀴|󠁬󠁶󠀰󠀵󠀶|󠁬󠁶󠀰󠀶󠀲|󠁭󠁡󠁳󠁥󠁦|󠁧󠁢󠁣󠁡󠁭|󠁧󠁢󠁢󠁵󠁲|󠁧󠁢󠁢󠁳󠁴|󠁧󠁢󠁢󠁲󠁹|󠁧󠁢󠁢󠁰󠁬|󠁧󠁢󠁢󠁯󠁬|󠁧󠁢󠁢󠁮󠁳|󠁧󠁢󠁢󠁮󠁨|󠁧󠁢󠁢󠁮󠁥|󠁧󠁢󠁢󠁫󠁭|󠁧󠁢󠁢󠁩󠁲|󠁧󠁢󠁢󠁧󠁷|󠁧󠁢󠁢󠁧󠁥|󠁧󠁢󠁢󠁦󠁳|󠁧󠁢󠁢󠁥󠁸|󠁧󠁢󠁢󠁥󠁮|󠁧󠁢󠁢󠁣󠁰|󠁧󠁢󠁢󠁢󠁤|󠁧󠁢󠁢󠁡󠁳|󠁧󠁢󠁡󠁮󠁳|󠁧󠁢󠁡󠁮󠁮|󠁧󠁢󠁡󠁮󠁤|󠁧󠁢󠁡󠁧󠁹|󠁢󠁥󠁷󠁨󠁴|󠁢󠁥󠁷󠁢󠁲|󠁢󠁥󠁷󠁡󠁬|󠁢󠁥󠁶󠁷󠁶|󠁢󠁥󠁶󠁯󠁶|󠁢󠁥󠁶󠁬󠁩|󠁢󠁥󠁶󠁬󠁧|󠁢󠁥󠁶󠁢󠁲|󠁢󠁥󠁶󠁡󠁮|󠁢󠁥󠁢󠁲󠁵|󠁢󠁡󠁳󠁲󠁰|󠁢󠁡󠁢󠁲󠁣|󠁢󠁡󠁢󠁩󠁨|󠁡󠁺󠁺󠁡󠁮|󠁡󠁺󠁹󠁥󠁶|󠁡󠁺󠁹󠁡󠁲|󠁡󠁺󠁸󠁶󠁤|󠁡󠁺󠁸󠁩󠁺|󠁡󠁺󠁸󠁣󠁩|󠁡󠁺󠁸󠁡󠁣|󠁢󠁦󠁫󠁯󠁷|󠁢󠁦󠁫󠁯󠁰|󠁢󠁦󠁫󠁭󠁰|󠁢󠁦󠁫󠁭󠁤|󠁺󠁡󠁫󠁺󠁮|󠁢󠁦󠁫󠁥󠁮|󠁢󠁦󠁫󠁡󠁤|󠁢󠁦󠁩󠁯󠁢|󠁢󠁦󠁨󠁯󠁵|󠁢󠁦󠁧󠁯󠁵|󠁢󠁦󠁧󠁮󠁡|󠁢󠁦󠁧󠁡󠁮|󠁢󠁦󠁣󠁯󠁭|󠁢󠁦󠁢󠁬󠁫|󠁢󠁦󠁢󠁬󠁧|󠁢󠁦󠁢󠁧󠁲|󠁢󠁦󠁢󠁡󠁺|󠁢󠁥󠁷󠁮󠁡|󠁢󠁥󠁷󠁬󠁸|󠁢󠁥󠁷󠁬󠁧|󠁡󠁺󠁱󠁡󠁢|󠁡󠁺󠁯󠁲󠁤|󠁡󠁺󠁯󠁧󠁵|󠁡󠁺󠁮󠁥󠁦|󠁦󠁲󠁣󠁯󠁲|󠁡󠁺󠁭󠁡󠁳|󠁦󠁲󠁧󠁵󠁡|󠁦󠁲󠁬󠁲󠁥|󠁡󠁺󠁬󠁥󠁲|󠁦󠁲󠁭󠁡󠁹|󠁡󠁺󠁬󠁡󠁮|󠁡󠁺󠁬󠁡󠁣|󠁡󠁺󠁫󠁵󠁲|󠁡󠁺󠁫󠁡󠁮|󠁡󠁺󠁫󠁡󠁬|󠁡󠁺󠁩󠁳󠁭|󠁡󠁺󠁩󠁭󠁩|󠁡󠁺󠁨󠁡󠁣|󠁡󠁺󠁧󠁹󠁧|󠁧󠁢󠁡󠁮󠁴|󠁡󠁺󠁵󠁣󠁡|󠁡󠁺󠁴󠁯󠁶|󠁡󠁺󠁴󠁡󠁲|󠁡󠁺󠁳󠁵󠁳|󠁡󠁺󠁳󠁭󠁸|󠁡󠁺󠁳󠁭󠁩|󠁡󠁺󠁳󠁫󠁲|󠁡󠁺󠁳󠁩󠁹|󠁡󠁺󠁳󠁢󠁮|󠁡󠁺󠁳󠁡󠁴|󠁡󠁺󠁳󠁡󠁲|󠁡󠁺󠁳󠁡󠁨|󠁡󠁺󠁳󠁡󠁤|󠁡󠁺󠁳󠁡󠁢|󠁡󠁺󠁱󠁵󠁳|󠁡󠁺󠁱󠁯󠁢|󠁡󠁺󠁱󠁢󠁩|󠁡󠁺󠁱󠁢󠁡|󠁡󠁺󠁱󠁡󠁺|󠁴󠁶󠁮󠁫󠁬|󠁴󠁶󠁮󠁭󠁡|󠁴󠁶󠁮󠁭󠁧|󠁴󠁶󠁮󠁵󠁩|󠁴󠁶󠁶󠁡󠁩|󠁴󠁷󠁣󠁨󠁡|󠁴󠁷󠁣󠁹󠁩|󠁴󠁷󠁣󠁹󠁱|󠁴󠁷󠁨󠁳󠁱|󠁴󠁷󠁨󠁳󠁺|󠁴󠁷󠁨󠁵󠁡|󠁴󠁷󠁩󠁬󠁡|󠁴󠁷󠁫󠁥󠁥|󠁴󠁷󠁫󠁨󠁨|󠁴󠁷󠁫󠁩󠁮|󠁴󠁷󠁬󠁩󠁥|󠁴󠁷󠁭󠁩󠁡|󠁴󠁷󠁮󠁡󠁮|󠁴󠁷󠁮󠁷󠁴|󠁴󠁷󠁰󠁥󠁮|󠁣󠁧󠁢󠁺󠁶|󠁣󠁦󠁢󠁧󠁦|󠁴󠁴󠁡󠁲󠁩|󠁴󠁴󠁣󠁨󠁡|󠁴󠁴󠁣󠁴󠁴|󠁴󠁴󠁤󠁭󠁮|󠁴󠁴󠁭󠁲󠁣|󠁴󠁴󠁰󠁥󠁤|󠁴󠁴󠁰󠁯󠁳|󠁴󠁴󠁰󠁲󠁴|󠁴󠁴󠁰󠁴󠁦|󠁴󠁴󠁳󠁦󠁯|󠁴󠁴󠁳󠁧󠁥|󠁴󠁴󠁳󠁩󠁰|󠁴󠁴󠁳󠁪󠁬|󠁴󠁴󠁴󠁯󠁢|󠁴󠁴󠁴󠁵󠁰|󠁴󠁶󠁦󠁵󠁮|󠁴󠁶󠁮󠁩󠁴|󠁴󠁶󠁮󠁫󠁦|󠁢󠁦󠁴󠁵󠁩|󠁢󠁦󠁴󠁡󠁰|󠁢󠁦󠁳󠁯󠁲|󠁢󠁦󠁳󠁯󠁭|󠁢󠁦󠁳󠁮󠁧|󠁢󠁦󠁳󠁭󠁴|󠁢󠁦󠁳󠁩󠁳|󠁢󠁦󠁳󠁥󠁮|󠁢󠁦󠁰󠁯󠁮|󠁢󠁦󠁰󠁡󠁳|󠁢󠁦󠁯󠁵󠁤|󠁢󠁦󠁯󠁵󠁢|󠁢󠁦󠁮󠁯󠁵|󠁢󠁦󠁮󠁡󠁹|󠁢󠁦󠁮󠁡󠁯|󠁢󠁦󠁮󠁡󠁭|󠁢󠁦󠁭󠁯󠁵|󠁢󠁦󠁬󠁯󠁲|󠁢󠁦󠁬󠁥󠁲|󠁡󠁺󠁱󠁡󠁸|󠁴󠁷󠁰󠁩󠁦|󠁴󠁷󠁴󠁡󠁯|󠁴󠁷󠁴󠁮󠁮|󠁴󠁷󠁴󠁰󠁥|󠁴󠁷󠁴󠁴󠁴|󠁴󠁷󠁴󠁸󠁧|󠁴󠁷󠁹󠁵󠁮|󠁢󠁺󠁴󠁯󠁬|󠁢󠁺󠁣󠁺󠁬|󠁶󠁵󠁭󠁡󠁰|󠁶󠁵󠁰󠁡󠁭|󠁶󠁵󠁳󠁡󠁭|󠁶󠁵󠁳󠁥󠁥|󠁶󠁵󠁴󠁡󠁥|󠁶󠁵󠁴󠁯󠁢|󠁢󠁦󠁺󠁯󠁵|󠁢󠁦󠁺󠁯󠁮|󠁢󠁦󠁺󠁩󠁲|󠁢󠁦󠁹󠁡󠁴|󠁢󠁦󠁹󠁡󠁧|󠁬󠁶󠀰󠀵󠀷|󠁬󠁶󠀰󠀶󠀹|󠁬󠁶󠀰󠀹󠀰|󠁬󠁶󠀰󠀹󠀸|󠁬󠁶󠀱󠀰󠀰|󠁬󠁶󠀱󠀱󠀰|󠁬󠁶󠁪󠁫󠁢|󠁬󠁶󠁶󠁭󠁲|󠁭󠁡󠁭󠁭󠁤|󠁭󠁡󠁭󠁭󠁮|󠁭󠁡󠁳󠁹󠁢|󠁭󠁲󠁮󠁫󠁣|󠁡󠁯󠁨󠁵󠁡|󠁡󠁯󠁣󠁵󠁳|󠁡󠁯󠁣󠁣󠁵|󠁡󠁯󠁣󠁡󠁢|󠁡󠁯󠁢󠁩󠁥|󠁡󠁯󠁢󠁧󠁵|󠁡󠁯󠁢󠁧󠁯|󠁭󠁸󠁤󠁩󠁦|󠁫󠁺󠁫󠁵󠁳|󠁫󠁺󠁫󠁺󠁹|󠁫󠁺󠁭󠁡󠁮|󠁫󠁺󠁰󠁡󠁶|󠁫󠁺󠁳󠁥󠁶|󠁫󠁺󠁳󠁨󠁹|󠁫󠁺󠁶󠁯󠁳|󠁫󠁺󠁹󠁵󠁺|󠁫󠁺󠁺󠁡󠁰|󠁫󠁺󠁺󠁨󠁡|󠁡󠁯󠁬󠁵󠁡|󠁡󠁯󠁬󠁳󠁵|󠁡󠁯󠁬󠁮󠁯|󠁡󠁯󠁨󠁵󠁩|󠁬󠁶󠀰󠀰󠀱|󠁬󠁶󠀰󠀱󠀰|󠁬󠁶󠀰󠀴󠀰|󠁬󠁶󠀰󠀵󠀱|󠁬󠁶󠀰󠀵󠀳|󠁬󠁶󠀰󠀵󠀵|󠁡󠁦󠁫󠁡󠁮|󠁡󠁦󠁫󠁡󠁢|󠁡󠁦󠁪󠁯󠁷|󠁡󠁦󠁨󠁥󠁲|󠁡󠁦󠁨󠁥󠁬|󠁡󠁦󠁧󠁨󠁯|󠁡󠁦󠁧󠁨󠁡|󠁡󠁦󠁦󠁹󠁢|󠁡󠁦󠁦󠁲󠁡|󠁡󠁦󠁤󠁡󠁹|󠁡󠁦󠁢󠁧󠁬|󠁡󠁦󠁢󠁤󠁳|󠁡󠁦󠁢󠁤󠁧|󠁴󠁴󠁥󠁴󠁯|󠁴󠁴󠁲󠁣󠁭|󠁴󠁴󠁷󠁴󠁯|󠁴󠁷󠁫󠁨󠁱|󠁴󠁷󠁴󠁮󠁱|󠁴󠁷󠁴󠁰󠁱|󠁴󠁷󠁴󠁸󠁱|󠁡󠁦󠁺󠁡󠁢|󠁡󠁦󠁷󠁡󠁲|󠁡󠁦󠁵󠁲󠁵|󠁡󠁦󠁴󠁡󠁫|󠁡󠁦󠁳󠁡󠁲|󠁡󠁦󠁳󠁡󠁭|󠁡󠁦󠁰󠁫󠁡|󠁡󠁦󠁰󠁩󠁡|󠁡󠁦󠁰󠁡󠁲|󠁡󠁦󠁰󠁡󠁮|󠁡󠁦󠁮󠁵󠁲|󠁡󠁦󠁮󠁩󠁭|󠁡󠁦󠁮󠁡󠁮|󠁡󠁦󠁬󠁯󠁧|󠁡󠁦󠁬󠁡󠁧|󠁡󠁦󠁫󠁮󠁲|󠁰󠁨󠁭󠁡󠁧|󠁡󠁦󠁫󠁨󠁯|󠁡󠁦󠁫󠁤󠁺|󠁧󠁢󠁭󠁦󠁴|󠁧󠁢󠁭󠁹󠁬|󠁧󠁢󠁮󠁤󠁮|󠁧󠁢󠁮󠁴󠁡|󠁧󠁢󠁮󠁴󠁨|󠁧󠁢󠁮󠁹󠁭|󠁧󠁢󠁯󠁭󠁨|󠁧󠁢󠁰󠁯󠁬|󠁧󠁢󠁳󠁴󠁢|󠁧󠁢󠁵󠁫󠁭|󠁡󠁺󠁧󠁯󠁹|󠁡󠁺󠁧󠁯󠁲|󠁡󠁺󠁧󠁡󠁤|󠁡󠁺󠁦󠁵󠁺|󠁡󠁺󠁤󠁡󠁳|󠁡󠁺󠁣󠁵󠁬|󠁡󠁺󠁣󠁡󠁬|󠁡󠁺󠁣󠁡󠁢|󠁡󠁺󠁢󠁩󠁬|󠁡󠁺󠁢󠁥󠁹|󠁧󠁢󠁡󠁲󠁤|󠁧󠁢󠁡󠁲󠁭|󠁧󠁢󠁢󠁬󠁡|󠁧󠁢󠁢󠁬󠁹|󠁧󠁢󠁢󠁭󠁨|󠁧󠁢󠁢󠁮󠁢|󠁧󠁢󠁣󠁧󠁶|󠁧󠁢󠁣󠁫󠁦|󠁧󠁢󠁣󠁫󠁴|󠁧󠁢󠁣󠁬󠁲|󠁧󠁢󠁣󠁳󠁲|󠁧󠁢󠁤󠁧󠁮|󠁧󠁢󠁤󠁯󠁷|󠁧󠁢󠁤󠁲󠁹|󠁧󠁢󠁥󠁡󠁷|󠁧󠁢󠁦󠁥󠁲|󠁧󠁢󠁧󠁢󠁮|󠁧󠁢󠁬󠁭󠁶|󠁧󠁢󠁬󠁲󠁮|󠁧󠁢󠁬󠁳󠁢|󠁩󠁳󠁨󠁥󠁬|󠁩󠁳󠁨󠁵󠁴|󠁩󠁳󠁳󠁢󠁨|󠁩󠁳󠁳󠁥󠁹|󠁩󠁳󠁳󠁫󠁵|󠁩󠁳󠁳󠁳󠁦|󠁡󠁯󠁺󠁡󠁩|󠁡󠁯󠁵󠁩󠁧|󠁡󠁯󠁮󠁡󠁭|󠁡󠁯󠁭󠁯󠁸|󠁡󠁯󠁭󠁡󠁬|󠁫󠁺󠁡󠁫󠁭|󠁫󠁺󠁡󠁫󠁴|󠁫󠁺󠁡󠁬󠁡|󠁫󠁺󠁡󠁬󠁭|󠁫󠁺󠁡󠁳󠁴|󠁫󠁺󠁡󠁴󠁹|󠁫󠁺󠁢󠁡󠁹|󠁫󠁺󠁫󠁡󠁲|󠁡󠁦󠁫󠁡󠁰|󠁡󠁺󠁢󠁡󠁲|󠁡󠁺󠁢󠁡󠁬|󠁡󠁺󠁢󠁡󠁢|󠁡󠁺󠁡󠁳󠁴|󠁡󠁺󠁡󠁧󠁵|󠁡󠁺󠁡󠁧󠁳|󠁡󠁺󠁡󠁧󠁭|󠁡󠁺󠁡󠁧󠁣|󠁡󠁺󠁡󠁧󠁡|󠁡󠁺󠁡󠁢󠁳|󠁡󠁵󠁶󠁩󠁣|󠁡󠁵󠁴󠁡󠁳|󠁡󠁵󠁱󠁬󠁤|󠁡󠁵󠁮󠁳󠁷|󠁡󠁵󠁡󠁣󠁴|󠁩󠁳󠁡󠁫󠁨|󠁩󠁳󠁢󠁦󠁪|󠁩󠁳󠁢󠁬󠁯|󠁩󠁳󠁤󠁪󠁵|󠁩󠁳󠁦󠁬󠁤|󠁰󠁳󠁮󠁧󠁺|󠁰󠁳󠁮󠁢󠁳|󠁰󠁳󠁫󠁹󠁳|󠁰󠁳󠁪󠁲󠁨|󠁰󠁳󠁨󠁢󠁮|󠁰󠁳󠁧󠁺󠁡|󠁰󠁳󠁤󠁥󠁢|󠁰󠁳󠁢󠁴󠁨|󠁰󠁨󠁺󠁳󠁩|󠁰󠁨󠁺󠁭󠁢|󠁰󠁨󠁺󠁡󠁳|󠁰󠁨󠁺󠁡󠁮|󠁣󠁯󠁭󠁡󠁧|󠁣󠁯󠁬󠁡󠁧|󠁰󠁨󠁷󠁳󠁡|󠁣󠁯󠁨󠁵󠁩|󠁣󠁯󠁧󠁵󠁶|󠁣󠁯󠁧󠁵󠁡|󠁰󠁨󠁴󠁡󠁷|󠁰󠁷󠀳󠀷󠀰|󠁰󠁷󠀳󠀵󠀰|󠁰󠁷󠀲󠀲󠀴|󠁰󠁷󠀲󠀲󠀲|󠁰󠁷󠀲󠀱󠀸|󠁰󠁷󠀲󠀱󠀴|󠁰󠁷󠀲󠀱󠀲|󠁰󠁷󠀱󠀵󠀰|󠁰󠁷󠀱󠀰󠀰|󠁰󠁷󠀰󠀵󠀰|󠁰󠁷󠀰󠀱󠀰|󠁰󠁷󠀰󠀰󠀴|󠁰󠁷󠀰󠀰󠀲|󠁰󠁳󠁴󠁫󠁭|󠁰󠁳󠁴󠁢󠁳|󠁰󠁳󠁳󠁬󠁴|󠁰󠁳󠁲󠁦󠁨|󠁰󠁳󠁲󠁢󠁨|󠁰󠁳󠁱󠁱󠁡|󠁰󠁨󠁳󠁬󠁵|󠁰󠁨󠁳󠁬󠁥|󠁰󠁨󠁳󠁩󠁧|󠁰󠁨󠁳󠁣󠁯|󠁰󠁨󠁳󠁡󠁲|󠁰󠁨󠁲󠁯󠁭|󠁰󠁨󠁲󠁩󠁺|󠁰󠁨󠁱󠁵󠁩|󠁰󠁨󠁱󠁵󠁥|󠁰󠁨󠁰󠁬󠁷|󠁰󠁨󠁮󠁵󠁶|󠁰󠁨󠁮󠁵󠁥|󠁰󠁨󠁮󠁳󠁡|󠁰󠁨󠁮󠁥󠁲|󠁰󠁨󠁮󠁥󠁣|󠁰󠁨󠁮󠁣󠁯|󠁰󠁨󠁭󠁳󠁲|󠁰󠁨󠁭󠁳󠁣|󠁰󠁨󠁭󠁯󠁵|󠁣󠁯󠁣󠁵󠁮|󠁣󠁯󠁣󠁯󠁲|󠁣󠁯󠁣󠁨󠁯|󠁣󠁯󠁣󠁥󠁳|󠁣󠁯󠁣󠁡󠁵|󠁰󠁨󠁴󠁡󠁲|󠁣󠁯󠁣󠁡󠁳|󠁣󠁯󠁣󠁡󠁱|󠁣󠁯󠁣󠁡󠁬|󠁣󠁯󠁢󠁯󠁹|󠁣󠁯󠁢󠁯󠁬|󠁣󠁯󠁡󠁴󠁬|󠁣󠁯󠁡󠁲󠁡|󠁣󠁯󠁡󠁮󠁴|󠁣󠁯󠁡󠁭󠁡|󠁰󠁨󠁳󠁵󠁲|󠁰󠁨󠁳󠁵󠁮|󠁰󠁨󠁳󠁵󠁫|󠁰󠁨󠁳󠁯󠁲|󠁲󠁵󠁰󠁲󠁩|󠁲󠁵󠁰󠁳󠁫|󠁲󠁵󠁲󠁯󠁳|󠁲󠁵󠁲󠁹󠁡|󠁣󠁯󠁴󠁯󠁬|󠁲󠁵󠁳󠁡󠁫|󠁲󠁵󠁳󠁡󠁭|󠁲󠁵󠁳󠁡󠁲|󠁣󠁯󠁳󠁵󠁣|󠁲󠁵󠁳󠁭󠁯|󠁲󠁵󠁳󠁰󠁥|󠁲󠁵󠁳󠁴󠁡|󠁲󠁵󠁳󠁶󠁥|󠁣󠁯󠁳󠁡󠁰|󠁲󠁵󠁴󠁡󠁭|󠁲󠁵󠁴󠁯󠁭|󠁣󠁯󠁶󠁩󠁤|󠁲󠁵󠁴󠁵󠁬|󠁲󠁵󠁫󠁯󠁳|󠁲󠁵󠁬󠁥󠁮|󠁲󠁵󠁬󠁩󠁰|󠁲󠁵󠁭󠁡󠁧|󠁲󠁵󠁫󠁹󠁡|󠁣󠁯󠁶󠁡󠁵|󠁣󠁯󠁶󠁡󠁣|󠁲󠁵󠁭󠁯󠁳|󠁲󠁵󠁭󠁯󠁷|󠁲󠁵󠁫󠁲󠁳|󠁲󠁵󠁭󠁵󠁲|󠁲󠁵󠁮󠁥󠁮|󠁲󠁵󠁮󠁧󠁲|󠁲󠁵󠁮󠁩󠁺|󠁲󠁵󠁮󠁶󠁳|󠁲󠁵󠁯󠁭󠁳|󠁲󠁵󠁯󠁲󠁥|󠁲󠁵󠁯󠁲󠁬|󠁲󠁵󠁰󠁥󠁲|󠁲󠁵󠁰󠁮󠁺|󠁲󠁵󠁹󠁡󠁲|󠁲󠁵󠁩󠁶󠁡|󠁲󠁵󠁩󠁲󠁫|󠁲󠁵󠁹󠁥󠁶|󠁲󠁵󠁺󠁡󠁢|󠁣󠁯󠁱󠁵󠁩|󠁣󠁯󠁰󠁵󠁴|󠁣󠁯󠁮󠁳󠁡|󠁲󠁵󠁣󠁨󠁵|󠁲󠁵󠁣󠁨󠁥|󠁲󠁵󠁢󠁲󠁹|󠁣󠁯󠁮󠁡󠁲|󠁲󠁵󠁢󠁥󠁬|󠁣󠁯󠁭󠁥󠁴|󠁲󠁵󠁡󠁳󠁴|󠁲󠁵󠁡󠁲󠁫|󠁲󠁵󠁡󠁭󠁵|󠁲󠁵󠁡󠁬󠁴|󠁰󠁹󠁡󠁳󠁵|󠁲󠁵󠁫󠁬󠁵|󠁲󠁵󠁴󠁶󠁥|󠁲󠁵󠁫󠁩󠁲|󠁲󠁵󠁫󠁨󠁭|󠁲󠁵󠁫󠁨󠁡|󠁲󠁵󠁫󠁧󠁮|󠁣󠁯󠁳󠁡󠁮|󠁲󠁵󠁫󠁧󠁤|󠁲󠁵󠁫󠁥󠁭|󠁲󠁵󠁫󠁤󠁡|󠁲󠁵󠁴󠁹󠁵|󠁲󠁵󠁫󠁡󠁭|󠁣󠁯󠁲󠁩󠁳|󠁲󠁵󠁵󠁬󠁹|󠁲󠁵󠁶󠁧󠁧|󠁲󠁵󠁶󠁬󠁡|󠁲󠁵󠁶󠁬󠁧|󠁲󠁵󠁶󠁯󠁲|󠁰󠁨󠁤󠁡󠁳|󠁰󠁨󠁬󠁡󠁧|󠁰󠁨󠁤󠁡󠁯|󠁰󠁨󠁣󠁯󠁭|󠁰󠁨󠁣󠁥󠁢|󠁰󠁨󠁣󠁡󠁶|󠁰󠁨󠁤󠁡󠁶|󠁰󠁨󠁫󠁡󠁬|󠁰󠁨󠁣󠁡󠁰|󠁰󠁨󠁩󠁳󠁡|󠁰󠁨󠁣󠁡󠁧|󠁰󠁨󠁢󠁴󠁮|󠁰󠁨󠁤󠁩󠁮|󠁰󠁨󠁩󠁬󠁳|󠁧󠁢󠁡󠁧󠁢|󠁰󠁨󠁤󠁶󠁯|󠁰󠁨󠁥󠁡󠁳|󠁰󠁨󠁡󠁮󠁴|󠁰󠁨󠁧󠁵󠁩|󠁰󠁨󠁡󠁰󠁡|󠁰󠁨󠁡󠁵󠁲|󠁰󠁨󠁢󠁡󠁮|󠁰󠁨󠁢󠁡󠁳|󠁰󠁨󠁢󠁥󠁮|󠁰󠁨󠁢󠁴󠁧|󠁰󠁨󠁢󠁩󠁬|󠁰󠁨󠁩󠁬󠁮|󠁰󠁨󠁩󠁬󠁩|󠁰󠁨󠁩󠁦󠁵|󠁲󠁵󠁹󠁡󠁮|󠁰󠁨󠁭󠁧󠁳|󠁰󠁨󠁭󠁧󠁮|󠁰󠁨󠁭󠁤󠁲|󠁰󠁨󠁭󠁤󠁣|󠁰󠁨󠁭󠁡󠁳|󠁰󠁨󠁭󠁡󠁤|󠁰󠁨󠁬󠁵󠁮|󠁰󠁨󠁬󠁥󠁹|󠁰󠁨󠁬󠁡󠁳|󠁰󠁨󠁬󠁡󠁮|󠁰󠁨󠁢󠁯󠁨|󠁥󠁥󠀷󠀹|󠁥󠁥󠀷󠀱|󠁣󠁶󠁰󠁡|󠁣󠁶󠁰󠁮|󠁣󠁶󠁰󠁲|󠁣󠁶󠁲󠁢|󠁡󠁺󠁮󠁡|󠁣󠁶󠁲󠁧|󠁣󠁵󠀰󠀱|󠁧󠁮󠁹󠁯|󠁥󠁥󠀶󠀸|󠁣󠁶󠁲󠁳|󠁣󠁶󠁳󠁤|󠁣󠁶󠁳󠁦|󠁣󠁶󠁳󠁯|󠁣󠁲󠁳󠁪|󠁡󠁺󠁮󠁶|󠁡󠁺󠁮󠁸|󠁧󠁮󠁮󠁺|󠁣󠁶󠁭󠁯|󠁣󠁶󠁭󠁡|󠁡󠁺󠁬󠁡|󠁥󠁥󠀸󠀱|󠁣󠁵󠀹󠀹|󠁥󠁥󠀸󠀴|󠁣󠁶󠁢󠁲|󠁧󠁮󠁰󠁩|󠁥󠁥󠀸󠀷|󠁡󠁺󠁭󠁩|󠁣󠁶󠁣󠁲|󠁣󠁶󠁣󠁦|󠁧󠁮󠁳󠁩|󠁧󠁮󠁴󠁥|󠁣󠁶󠁣󠁡|󠁣󠁶󠁢󠁶|󠁧󠁮󠁴󠁯|󠁥󠁥󠀷󠀴|󠁧󠁱󠁡󠁮|󠁧󠁹󠁵󠁴|󠁨󠁮󠁡󠁴|󠁨󠁮󠁣󠁨|󠁡󠁥󠁳󠁨|󠁨󠁮󠁣󠁰|󠁨󠁮󠁣󠁲|󠁨󠁮󠁥󠁰|󠁨󠁮󠁦󠁭|󠁨󠁮󠁧󠁤|󠁨󠁮󠁩󠁢|󠁨󠁮󠁩󠁮|󠁥󠁧󠁢󠁡|󠁨󠁮󠁬󠁥|󠁨󠁮󠁬󠁰|󠁨󠁮󠁯󠁣|󠁨󠁮󠁯󠁬|󠁨󠁮󠁳󠁢|󠁨󠁮󠁶󠁡|󠁨󠁮󠁹󠁯|󠁡󠁥󠁲󠁫|󠁡󠁥󠁦󠁵|󠁡󠁥󠁤󠁵|󠁡󠁥󠁡󠁺|󠁡󠁥󠁡󠁪|󠁨󠁴󠁡󠁲|󠁨󠁴󠁣󠁥|󠁧󠁱󠁢󠁮|󠁧󠁱󠁢󠁳|󠁧󠁱󠁣󠁳|󠁧󠁱󠁤󠁪|󠁧󠁱󠁫󠁮|󠁧󠁱󠁬󠁩|󠁧󠁱󠁷󠁮|󠁧󠁲󠀶󠀹|󠁧󠁷󠁢󠁡|󠁧󠁷󠁢󠁳|󠁡󠁺󠁳󠁡|󠁧󠁷󠁣󠁡|󠁡󠁥󠁵󠁱|󠁧󠁷󠁧󠁡|󠁧󠁷󠁯󠁩|󠁧󠁷󠁱󠁵|󠁧󠁷󠁴󠁯|󠁧󠁹󠁢󠁡|󠁧󠁹󠁣󠁵|󠁧󠁹󠁤󠁥|󠁧󠁹󠁥󠁢|󠁧󠁹󠁥󠁳|󠁧󠁹󠁭󠁡|󠁧󠁹󠁰󠁭|󠁧󠁹󠁰󠁴|󠁧󠁨󠁣󠁰|󠁧󠁨󠁥󠁰|󠁧󠁨󠁮󠁥|󠁧󠁨󠁮󠁰|󠁧󠁨󠁯󠁴|󠁧󠁨󠁳󠁶|󠁧󠁨󠁴󠁶|󠁧󠁨󠁵󠁥|󠁧󠁨󠁵󠁷|󠁧󠁨󠁷󠁮|󠁧󠁨󠁷󠁰|󠁤󠁪󠁴󠁡|󠁤󠁪󠁯󠁢|󠁤󠁥󠁴󠁨|󠁤󠁥󠁳󠁴|󠁤󠁥󠁳󠁮|󠁤󠁥󠁳󠁬|󠁤󠁥󠁳󠁨|󠁤󠁥󠁲󠁰|󠁤󠁥󠁮󠁷|󠁤󠁥󠁮󠁩|󠁤󠁥󠁭󠁶|󠁤󠁥󠁨󠁨|󠁤󠁥󠁨󠁥|󠁧󠁬󠁡󠁶|󠁧󠁬󠁫󠁵|󠁧󠁬󠁱󠁥|󠁡󠁭󠁳󠁨|󠁡󠁭󠁳󠁵|󠁡󠁭󠁴󠁶|󠁡󠁭󠁶󠁤|󠁡󠁭󠁬󠁯|󠁡󠁭󠁫󠁴|󠁡󠁭󠁧󠁲|󠁡󠁭󠁥󠁲|󠁡󠁭󠁡󠁶|󠁡󠁭󠁡󠁲|󠁡󠁭󠁡󠁧|󠁧󠁤󠀱󠀰|󠁧󠁥󠁡󠁢|󠁧󠁥󠁡󠁪|󠁧󠁥󠁧󠁵|󠁧󠁥󠁩󠁭|󠁧󠁥󠁫󠁡|󠁧󠁥󠁫󠁫|󠁧󠁥󠁭󠁭|󠁧󠁥󠁲󠁬|󠁧󠁥󠁳󠁺|󠁧󠁥󠁴󠁢|󠁧󠁨󠁡󠁡|󠁧󠁨󠁡󠁦|󠁧󠁨󠁡󠁨|󠁧󠁨󠁢󠁥|󠁧󠁨󠁢󠁯|󠁤󠁥󠁢󠁢|󠁣󠁺󠀸󠀰|󠁥󠁥󠀴󠀵|󠁣󠁺󠀷󠀲|󠁣󠁺󠀷󠀱|󠁣󠁺󠀶󠀴|󠁣󠁺󠀶󠀳|󠁥󠁥󠀵󠀰|󠁣󠁺󠀵󠀳|󠁡󠁺󠁧󠁡|󠁣󠁺󠀵󠀲|󠁣󠁺󠀵󠀱|󠁥󠁥󠀵󠀲|󠁣󠁺󠀴󠀲|󠁣󠁺󠀴󠀱|󠁥󠁥󠀵󠀶|󠁣󠁺󠀳󠀲|󠁣󠁺󠀳󠀱|󠁥󠁥󠀶󠀰|󠁣󠁺󠀲󠀰|󠁣󠁺󠀱󠀰|󠁣󠁶󠁴󠁳|󠁣󠁶󠁴󠁡|󠁣󠁶󠁳󠁶|󠁥󠁥󠀶󠀴|󠁣󠁶󠁳󠁳|󠁧󠁹󠁵󠁤|󠁧󠁬󠁱󠁴|󠁧󠁬󠁳󠁭|󠁧󠁮󠁢󠁫|󠁧󠁮󠁣󠁯|󠁧󠁮󠁤󠁢|󠁧󠁮󠁤󠁩|󠁧󠁮󠁤󠁬|󠁧󠁮󠁤󠁵|󠁤󠁥󠁨󠁢|󠁤󠁥󠁢󠁹|󠁧󠁮󠁦󠁡|󠁧󠁮󠁦󠁯|󠁧󠁮󠁦󠁲|󠁧󠁮󠁧󠁡|󠁧󠁮󠁧󠁵|󠁡󠁵󠁮󠁴|󠁡󠁵󠁳󠁡|󠁧󠁮󠁫󠁳|󠁡󠁵󠁷󠁡|󠁧󠁮󠁬󠁡|󠁧󠁮󠁬󠁥|󠁧󠁮󠁬󠁯|󠁥󠁥󠀳󠀷|󠁥󠁥󠀳󠀹|󠁤󠁥󠁢󠁷|󠁤󠁥󠁢󠁥|󠁡󠁺󠁢󠁡|󠁣󠁨󠁢󠁥|󠁣󠁨󠁡󠁲|󠁣󠁨󠁡󠁩|󠁣󠁨󠁡󠁧|󠁣󠁮󠁧󠁤|󠁣󠁦󠁶󠁫|󠁣󠁦󠁵󠁫|󠁣󠁦󠁳󠁥|󠁣󠁦󠁯󠁰|󠁣󠁦󠁮󠁭|󠁣󠁦󠁭󠁰|󠁣󠁦󠁭󠁢|󠁣󠁦󠁬󠁢|󠁣󠁦󠁫󠁧|󠁣󠁦󠁫󠁢|󠁣󠁦󠁨󠁳|󠁣󠁦󠁨󠁭|󠁣󠁦󠁨󠁫|󠁣󠁦󠁢󠁫|󠁣󠁮󠁧󠁳|󠁣󠁩󠁢󠁳|󠁣󠁩󠁡󠁢|󠁣󠁨󠁶󠁳|󠁣󠁨󠁶󠁤|󠁣󠁨󠁵󠁲|󠁣󠁨󠁴󠁩|󠁣󠁨󠁴󠁧|󠁣󠁨󠁳󠁺|󠁣󠁨󠁳󠁯|󠁣󠁨󠁯󠁷|󠁣󠁨󠁮󠁷|󠁣󠁨󠁮󠁥|󠁣󠁨󠁬󠁵|󠁣󠁨󠁪󠁵|󠁣󠁨󠁧󠁲|󠁣󠁨󠁧󠁬|󠁣󠁨󠁧󠁥|󠁣󠁨󠁦󠁲|󠁣󠁨󠁢󠁳|󠁣󠁨󠁢󠁬|󠁣󠁤󠁨󠁵|󠁣󠁤󠁥󠁱|󠁣󠁤󠁢󠁵|󠁣󠁤󠁢󠁣|󠁣󠁡󠁹󠁴|󠁣󠁡󠁳󠁫|󠁣󠁡󠁱󠁣|󠁣󠁡󠁰󠁥|󠁣󠁡󠁯󠁮|󠁣󠁡󠁮󠁬|󠁣󠁡󠁮󠁢|󠁣󠁡󠁭󠁢|󠁣󠁡󠁢󠁣|󠁣󠁡󠁡󠁢|󠁣󠁮󠁧󠁸|󠁣󠁮󠁧󠁺|󠁣󠁮󠁨󠁥|󠁣󠁮󠁨󠁩|󠁣󠁮󠁨󠁮|󠁣󠁮󠁪󠁬|󠁣󠁦󠁢󠁢|󠁣󠁦󠁡󠁣|󠁣󠁤󠁴󠁵|󠁣󠁤󠁴󠁯|󠁣󠁤󠁴󠁡|󠁣󠁤󠁳󠁵|󠁣󠁤󠁳󠁫|󠁣󠁤󠁳󠁡|󠁣󠁤󠁮󠁵|󠁣󠁤󠁮󠁫|󠁣󠁤󠁭󠁡|󠁣󠁤󠁬󠁵|󠁣󠁤󠁬󠁯|󠁣󠁤󠁫󠁳|󠁣󠁤󠁫󠁮|󠁣󠁤󠁫󠁬|󠁣󠁤󠁫󠁧|󠁣󠁤󠁫󠁥|󠁣󠁤󠁫󠁣|󠁣󠁤󠁩󠁴|󠁣󠁬󠁭󠁬|󠁣󠁬󠁭󠁡|󠁣󠁬󠁬󠁲|󠁣󠁬󠁬󠁬|󠁣󠁬󠁬󠁩|󠁣󠁬󠁣󠁯|󠁣󠁬󠁢󠁩|󠁣󠁬󠁡󠁴|󠁣󠁬󠁡󠁲|󠁥󠁳󠁨󠁵|󠁥󠁳󠁩󠁢|󠁥󠁳󠁬󠁥|󠁥󠁳󠁬󠁯|󠁣󠁬󠁡󠁰|󠁣󠁬󠁡󠁮|󠁣󠁬󠁡󠁩|󠁥󠁳󠁬󠁵|󠁥󠁳󠁭󠁡|󠁣󠁩󠁺󠁺|󠁥󠁳󠁭󠁬|󠁣󠁮󠁦󠁪|󠁣󠁮󠁣󠁱|󠁣󠁮󠁢󠁪|󠁣󠁮󠁡󠁨|󠁣󠁭󠁳󠁷|󠁣󠁭󠁳󠁵|󠁣󠁭󠁯󠁵|󠁥󠁳󠁧󠁲|󠁣󠁭󠁮󠁷|󠁣󠁭󠁮󠁯|󠁣󠁭󠁬󠁴|󠁣󠁭󠁥󠁳|󠁣󠁭󠁥󠁮|󠁣󠁭󠁣󠁥|󠁣󠁭󠁡󠁤|󠁣󠁬󠁶󠁳|󠁣󠁬󠁴󠁡|󠁣󠁬󠁲󠁭|󠁥󠁳󠁧󠁵|󠁣󠁬󠁮󠁢|󠁣󠁩󠁶󠁢|󠁣󠁩󠁳󠁶|󠁥󠁴󠁡󠁡|󠁣󠁩󠁳󠁭|󠁥󠁴󠁡󠁦|󠁥󠁴󠁡󠁭|󠁥󠁴󠁢󠁥|󠁥󠁴󠁤󠁤|󠁥󠁴󠁧󠁡|󠁣󠁩󠁭󠁧|󠁥󠁴󠁨󠁡|󠁥󠁴󠁯󠁲|󠁥󠁴󠁳󠁩|󠁣󠁩󠁬󠁧|󠁥󠁴󠁳󠁷|󠁥󠁴󠁴󠁩|󠁣󠁩󠁬󠁣|󠁣󠁩󠁧󠁤|󠁣󠁩󠁤󠁮|󠁣󠁩󠁣󠁭|󠁥󠁳󠁭󠁵|󠁣󠁩󠁹󠁭|󠁥󠁳󠁮󠁡|󠁥󠁳󠁮󠁣|󠁥󠁳󠁯󠁲|󠁥󠁳󠁰󠁭|󠁥󠁳󠁰󠁯|󠁥󠁳󠁰󠁶|󠁥󠁳󠁲󠁩|󠁥󠁳󠁳󠁡|󠁥󠁳󠁳󠁥|󠁥󠁳󠁳󠁧|󠁥󠁳󠁳󠁯|󠁥󠁳󠁳󠁳|󠁣󠁩󠁷󠁲|󠁥󠁳󠁴󠁯|󠁥󠁳󠁶󠁡|󠁥󠁳󠁶󠁣|󠁥󠁳󠁶󠁩|󠁢󠁮󠁴󠁵|󠁢󠁮󠁴󠁥|󠁢󠁮󠁢󠁭|󠁢󠁮󠁢󠁥|󠁢󠁪󠁺󠁯|󠁢󠁪󠁰󠁬|󠁢󠁪󠁯󠁵|󠁢󠁪󠁭󠁯|󠁢󠁪󠁬󠁩|󠁢󠁪󠁫󠁯|󠁢󠁪󠁤󠁯|󠁢󠁪󠁣󠁯|󠁢󠁪󠁢󠁯|󠁢󠁪󠁡󠁱|󠁢󠁩󠁲󠁹|󠁢󠁩󠁲󠁴|󠁢󠁩󠁲󠁭|󠁢󠁩󠁮󠁧|󠁢󠁩󠁭󠁹|󠁢󠁩󠁭󠁷|󠁢󠁲󠁴󠁯|󠁢󠁲󠁳󠁰|󠁢󠁲󠁳󠁥|󠁢󠁲󠁳󠁣|󠁢󠁲󠁲󠁪|󠁢󠁲󠁰󠁲|󠁢󠁲󠁰󠁩|󠁢󠁲󠁰󠁥|󠁢󠁲󠁭󠁧|󠁢󠁲󠁭󠁡|󠁢󠁲󠁧󠁯|󠁢󠁲󠁥󠁳|󠁢󠁲󠁤󠁦|󠁢󠁲󠁣󠁥|󠁢󠁲󠁢󠁡|󠁢󠁲󠁡󠁰|󠁢󠁲󠁡󠁣|󠁢󠁱󠁳󠁥|󠁢󠁱󠁳󠁡|󠁢󠁱󠁢󠁯|󠁥󠁲󠁧󠁢|󠁥󠁲󠁤󠁵|󠁥󠁲󠁤󠁫|󠁥󠁲󠁡󠁮|󠁥󠁧󠁭󠁴|󠁥󠁧󠁭󠁮|󠁥󠁧󠁬󠁸|󠁥󠁧󠁫󠁮|󠁥󠁧󠁫󠁢|󠁥󠁧󠁪󠁳|󠁥󠁧󠁩󠁳|󠁥󠁧󠁧󠁺|󠁥󠁧󠁧󠁨|󠁥󠁧󠁤󠁴|󠁥󠁧󠁤󠁫|󠁥󠁧󠁢󠁨|󠁡󠁺󠁹󠁥|󠁡󠁺󠁸󠁡|󠁡󠁺󠁳󠁲|󠁡󠁺󠁳󠁭|󠁢󠁩󠁭󠁵|󠁢󠁩󠁭󠁡|󠁢󠁩󠁫󠁹|󠁢󠁩󠁫󠁲|󠁢󠁩󠁫󠁩|󠁢󠁩󠁧󠁩|󠁥󠁳󠁢󠁵|󠁥󠁳󠁢󠁩|󠁥󠁳󠁢󠁡|󠁥󠁳󠁡󠁶|󠁢󠁩󠁣󠁩|󠁢󠁩󠁣󠁡|󠁢󠁩󠁢󠁲|󠁢󠁩󠁢󠁢|󠁢󠁨󠀱󠀷|󠁥󠁳󠁡󠁮|󠁥󠁳󠁡󠁬|󠁥󠁳󠁡󠁢|󠁥󠁲󠁳󠁫|󠁥󠁲󠁭󠁡|󠁣󠁯󠁤󠁣|󠁥󠁳󠁥󠁸|󠁢󠁺󠁳󠁣|󠁢󠁺󠁯󠁷|󠁥󠁳󠁣󠁥|󠁢󠁺󠁣󠁹|󠁢󠁺󠁢󠁺|󠁢󠁹󠁶󠁩|󠁢󠁹󠁭󠁩|󠁢󠁹󠁭󠁡|󠁢󠁹󠁨󠁲|󠁢󠁹󠁨󠁯|󠁢󠁹󠁨󠁭|󠁢󠁹󠁢󠁲|󠁢󠁷󠁳󠁴|󠁢󠁷󠁳󠁥|󠁢󠁷󠁮󠁷|󠁢󠁷󠁮󠁥|󠁢󠁷󠁬󠁯|󠁢󠁷󠁫󠁷|󠁥󠁳󠁺󠁡|󠁣󠁮󠁪󠁳|󠁣󠁮󠁪󠁸|󠁣󠁮󠁬󠁮|󠁥󠁳󠁧󠁩|󠁥󠁳󠁧󠁣|󠁣󠁮󠁭󠁯|󠁣󠁮󠁮󠁭|󠁣󠁮󠁮󠁸|󠁣󠁮󠁱󠁨|󠁣󠁮󠁳󠁨|󠁣󠁮󠁳󠁮|󠁣󠁮󠁳󠁸|󠁣󠁮󠁴󠁪|󠁣󠁮󠁴󠁷|󠁣󠁮󠁸󠁪|󠁣󠁮󠁸󠁺|󠁣󠁮󠁹󠁮|󠁣󠁮󠁺󠁪|󠁥󠁳󠁧󠁡|󠁢󠁳󠁭󠁩|󠁢󠁳󠁭󠁧|󠁢󠁳󠁭󠁣|󠁢󠁳󠁬󠁩|󠁢󠁳󠁩󠁮|󠁢󠁳󠁨󠁴|󠁢󠁳󠁨󠁩|󠁢󠁳󠁧󠁣|󠁢󠁳󠁦󠁰|󠁢󠁳󠁥󠁸|󠁢󠁳󠁥󠁧|󠁢󠁳󠁣󠁳|󠁢󠁳󠁣󠁯|󠁢󠁳󠁣󠁫|󠁢󠁳󠁣󠁩|󠁢󠁳󠁣󠁥|󠁢󠁳󠁢󠁹|󠁢󠁳󠁢󠁰|󠁢󠁳󠁢󠁩|󠁢󠁳󠁡󠁫|󠁢󠁷󠁫󠁬|󠁢󠁷󠁫󠁧|󠁢󠁷󠁪󠁷|󠁢󠁷󠁧󠁨|󠁢󠁷󠁧󠁡|󠁢󠁷󠁦󠁲|󠁢󠁷󠁣󠁨|󠁢󠁷󠁣󠁥|󠁢󠁴󠁴󠁹|󠁢󠁴󠁧󠁡|󠁢󠁳󠁷󠁧|󠁢󠁳󠁳󠁷|󠁢󠁳󠁳󠁳|󠁢󠁳󠁳󠁯|󠁢󠁳󠁳󠁥|󠁢󠁳󠁳󠁡|󠁢󠁳󠁲󠁩|󠁢󠁳󠁲󠁣|󠁢󠁳󠁮󠁳|󠁳󠁺󠁳󠁨|󠁳󠁺󠁭󠁡|󠁳󠁺󠁬󠁵|󠁳󠁺󠁨󠁨|󠁳󠁹󠁴󠁡|󠁳󠁹󠁳󠁵|󠁳󠁹󠁲󠁤|󠁳󠁹󠁲󠁡|󠁳󠁹󠁱󠁵|󠁳󠁹󠁬󠁡|󠁳󠁹󠁩󠁤|󠁳󠁹󠁨󠁩|󠁳󠁹󠁨󠁡|󠁳󠁹󠁤󠁹|󠁳󠁹󠁤󠁲|󠁳󠁹󠁤󠁩|󠁳󠁶󠁵󠁳|󠁳󠁶󠁵󠁮|󠁳󠁶󠁳󠁶|󠁴󠁤󠁳󠁡|󠁴󠁤󠁯󠁤|󠁴󠁤󠁮󠁤|󠁴󠁤󠁭󠁯|󠁴󠁤󠁭󠁥|󠁴󠁤󠁭󠁣|󠁴󠁤󠁭󠁡|󠁴󠁤󠁬󠁲|󠁴󠁤󠁬󠁯|󠁴󠁤󠁬󠁣|󠁴󠁤󠁫󠁡|󠁴󠁤󠁨󠁬|󠁴󠁤󠁧󠁲|󠁴󠁤󠁥󠁯|󠁴󠁤󠁥󠁥|󠁴󠁤󠁣󠁢|󠁴󠁤󠁢󠁯|󠁴󠁤󠁢󠁧|󠁳󠁳󠁥󠁣|󠁳󠁳󠁢󠁷|󠁳󠁳󠁢󠁮|󠁳󠁲󠁷󠁡|󠁳󠁲󠁳󠁩|󠁳󠁲󠁳󠁡|󠁳󠁲󠁰󠁲|󠁳󠁲󠁰󠁭|󠁳󠁲󠁮󠁩|󠁳󠁲󠁭󠁡|󠁳󠁲󠁣󠁲|󠁳󠁲󠁣󠁭|󠁳󠁲󠁢󠁲|󠁳󠁯󠁷󠁯|󠁳󠁯󠁴󠁯|󠁳󠁯󠁳󠁯|󠁳󠁯󠁳󠁨|󠁳󠁯󠁳󠁤|󠁳󠁯󠁳󠁡|󠁴󠁤󠁢󠁡|󠁳󠁶󠁳󠁳|󠁳󠁶󠁳󠁯|󠁳󠁶󠁳󠁭|󠁳󠁶󠁳󠁡|󠁳󠁶󠁰󠁡|󠁳󠁶󠁭󠁯|󠁳󠁶󠁬󠁩|󠁳󠁶󠁣󠁵|󠁳󠁶󠁣󠁨|󠁳󠁶󠁣󠁡|󠁳󠁶󠁡󠁨|󠁳󠁳󠁷󠁲|󠁳󠁳󠁵󠁹|󠁳󠁳󠁮󠁵|󠁳󠁳󠁬󠁫|󠁳󠁳󠁪󠁧|󠁳󠁳󠁥󠁷|󠁵󠁭󠀸󠀱|󠁵󠁭󠀷󠀹|󠁵󠁭󠀷󠀶|󠁵󠁭󠀷󠀱|󠁵󠁭󠀶󠀷|󠁵󠁡󠀷󠀷|󠁵󠁡󠀷󠀴|󠁵󠁡󠀷󠀱|󠁵󠁡󠀶󠀸|󠁵󠁡󠀶󠀵|󠁵󠁡󠀶󠀳|󠁵󠁡󠀶󠀱|󠁵󠁡󠀵󠀹|󠁵󠁡󠀵󠀶|󠁵󠁡󠀵󠀳|󠁵󠁡󠀵󠀱|󠁵󠁡󠀴󠀸|󠁵󠁡󠀴󠀶|󠁵󠁡󠀴󠀳|󠁵󠁳󠁫󠁳|󠁵󠁳󠁩󠁮|󠁵󠁳󠁩󠁬|󠁵󠁳󠁩󠁤|󠁵󠁳󠁩󠁡|󠁵󠁳󠁨󠁩|󠁵󠁳󠁧󠁡|󠁵󠁳󠁦󠁬|󠁵󠁳󠁤󠁥|󠁵󠁳󠁤󠁣|󠁵󠁳󠁣󠁴|󠁵󠁳󠁣󠁯|󠁵󠁳󠁣󠁡|󠁵󠁳󠁡󠁺|󠁵󠁳󠁡󠁲|󠁵󠁭󠀹󠀵|󠁵󠁭󠀸󠀹|󠁵󠁭󠀸󠀶|󠁴󠁬󠁬󠁩|󠁴󠁬󠁬󠁡|󠁴󠁬󠁥󠁲|󠁴󠁬󠁤󠁩|󠁴󠁬󠁣󠁯|󠁴󠁬󠁢󠁯|󠁴󠁬󠁢󠁡|󠁴󠁬󠁡󠁮|󠁴󠁬󠁡󠁬|󠁴󠁪󠁳󠁵|󠁴󠁪󠁲󠁡|󠁴󠁪󠁫󠁴|󠁴󠁪󠁧󠁢|󠁴󠁪󠁤󠁵|󠁴󠁤󠁷󠁦|󠁴󠁤󠁴󠁩|󠁴󠁤󠁴󠁡|󠁴󠁤󠁳󠁩|󠁳󠁳󠁥󠁥|󠁵󠁭󠀸󠀴|󠁵󠁡󠀴󠀰|󠁵󠁡󠀳󠀵|󠁵󠁡󠀳󠀲|󠁵󠁡󠀳󠀰|󠁵󠁡󠀲󠀶|󠁵󠁡󠀲󠀳|󠁵󠁡󠀲󠀱|󠁵󠁡󠀱󠀸|󠁵󠁡󠀱󠀴|󠁵󠁡󠀱󠀲|󠁵󠁡󠀰󠀹|󠁵󠁡󠀰󠀷|󠁵󠁡󠀰󠀵|󠁴󠁮󠀶󠀱|󠁴󠁬󠁶󠁩|󠁴󠁬󠁯󠁥|󠁴󠁬󠁭󠁴|󠁲󠁯󠁮󠁴|󠁲󠁯󠁭󠁳|󠁲󠁯󠁭󠁭|󠁲󠁯󠁭󠁨|󠁲󠁯󠁩󠁳|󠁲󠁯󠁩󠁬|󠁲󠁯󠁩󠁦|󠁲󠁯󠁨󠁲|󠁲󠁯󠁨󠁤|󠁲󠁯󠁧󠁲|󠁲󠁯󠁧󠁬|󠁲󠁯󠁧󠁪|󠁲󠁯󠁤󠁪|󠁲󠁯󠁤󠁢|󠁲󠁯󠁣󠁶|󠁲󠁯󠁣󠁬|󠁲󠁯󠁣󠁪|󠁲󠁯󠁢󠁺|󠁲󠁯󠁢󠁶|󠁲󠁵󠁤󠁡|󠁲󠁵󠁣󠁵|󠁲󠁵󠁣󠁥|󠁲󠁵󠁢󠁵|󠁲󠁵󠁢󠁡|󠁲󠁵󠁡󠁬|󠁲󠁵󠁡󠁤|󠁲󠁳󠁶󠁯|󠁲󠁳󠁫󠁭|󠁲󠁯󠁶󠁳|󠁲󠁯󠁶󠁮|󠁲󠁯󠁶󠁬|󠁲󠁯󠁴󠁲|󠁲󠁯󠁳󠁶|󠁲󠁯󠁳󠁭|󠁲󠁯󠁳󠁪|󠁲󠁯󠁳󠁢|󠁲󠁯󠁰󠁨|󠁰󠁴󠀲󠀰|󠁰󠁬󠀳󠀲|󠁰󠁬󠀳󠀰|󠁰󠁬󠀲󠀸|󠁰󠁬󠀲󠀶|󠁰󠁬󠀲󠀴|󠁰󠁬󠀲󠀲|󠁰󠁬󠀲󠀰|󠁰󠁬󠀱󠀸|󠁰󠁬󠀱󠀶|󠁰󠁬󠀱󠀴|󠁰󠁬󠀱󠀲|󠁰󠁬󠀱󠀰|󠁰󠁬󠀰󠀸|󠁰󠁬󠀰󠀶|󠁰󠁬󠀰󠀴|󠁰󠁬󠀰󠀲|󠁰󠁫󠁳󠁤|󠁰󠁫󠁰󠁢|󠁲󠁯󠁯󠁴|󠁲󠁯󠁢󠁴|󠁲󠁯󠁢󠁲|󠁲󠁯󠁢󠁮|󠁲󠁯󠁢󠁨|󠁲󠁯󠁢󠁣|󠁲󠁯󠁡󠁲|󠁲󠁯󠁡󠁧|󠁲󠁯󠁡󠁢|󠁱󠁡󠁺󠁡|󠁱󠁡󠁷󠁡|󠁱󠁡󠁵󠁳|󠁱󠁡󠁳󠁨|󠁱󠁡󠁲󠁡|󠁱󠁡󠁭󠁳|󠁱󠁡󠁫󠁨|󠁱󠁡󠁤󠁡|󠁰󠁹󠀱󠀹|󠁳󠁮󠁬󠁧|󠁳󠁮󠁫󠁬|󠁳󠁮󠁫󠁡|󠁳󠁮󠁦󠁫|󠁳󠁮󠁤󠁫|󠁳󠁮󠁤󠁢|󠁳󠁬󠁮󠁷|󠁳󠁫󠁺󠁩|󠁳󠁫󠁴󠁣|󠁳󠁫󠁴󠁡|󠁳󠁫󠁰󠁶|󠁳󠁫󠁮󠁩|󠁳󠁫󠁫󠁩|󠁳󠁫󠁢󠁬|󠁳󠁫󠁢󠁣|󠁳󠁨󠁨󠁬|󠁳󠁨󠁡󠁣|󠁳󠁥󠁢󠁤|󠁳󠁤󠁳󠁩|󠁴󠁬󠁭󠁦|󠁳󠁯󠁮󠁵|󠁳󠁯󠁭󠁵|󠁳󠁯󠁪󠁨|󠁳󠁯󠁪󠁤|󠁳󠁯󠁨󠁩|󠁳󠁯󠁧󠁥|󠁳󠁯󠁧󠁡|󠁳󠁯󠁢󠁹|󠁳󠁯󠁢󠁲|󠁳󠁯󠁢󠁮|󠁳󠁯󠁢󠁫|󠁳󠁯󠁡󠁷|󠁳󠁮󠁺󠁧|󠁳󠁮󠁴󠁨|󠁳󠁮󠁴󠁣|󠁳󠁮󠁳󠁬|󠁳󠁮󠁳󠁥|󠁳󠁢󠁴󠁥|󠁳󠁢󠁲󠁢|󠁳󠁢󠁩󠁳|󠁳󠁢󠁧󠁵|󠁳󠁢󠁣󠁴|󠁳󠁢󠁣󠁨|󠁳󠁢󠁣󠁥|󠁳󠁡󠀱󠀴|󠁲󠁵󠁵󠁤|󠁲󠁵󠁴󠁹|󠁲󠁵󠁴󠁡|󠁲󠁵󠁳󠁥|󠁲󠁵󠁳󠁡|󠁲󠁵󠁭󠁯|󠁲󠁵󠁭󠁥|󠁲󠁵󠁫󠁲|󠁲󠁵󠁫󠁯|󠁲󠁵󠁩󠁮|󠁰󠁴󠀳󠀰|󠁳󠁮󠁭󠁴|󠁳󠁤󠁲󠁳|󠁳󠁤󠁮󠁷|󠁳󠁤󠁮󠁲|󠁳󠁤󠁮󠁯|󠁳󠁤󠁮󠁢|󠁳󠁤󠁫󠁳|󠁳󠁤󠁫󠁮|󠁳󠁤󠁫󠁨|󠁳󠁤󠁫󠁡|󠁳󠁤󠁧󠁺|󠁳󠁤󠁧󠁫|󠁳󠁤󠁧󠁤|󠁳󠁤󠁤󠁷|󠁳󠁤󠁤󠁳|󠁳󠁤󠁤󠁮|󠁳󠁤󠁤󠁥|󠁳󠁤󠁤󠁣|󠁧󠁴󠁣󠁭|󠁧󠁴󠁢󠁶|󠁧󠁴󠁡󠁶|󠁧󠁲󠁡󠀱|󠁧󠁲󠀰󠀱|󠁧󠁬󠁱󠁡|󠁧󠁨󠁢󠁡|󠁦󠁲󠁹󠁴|󠁦󠁲󠁷󠁦|󠁦󠁲󠁴󠁦|󠁦󠁲󠁲󠁥|󠁦󠁲󠁰󠁭|󠁦󠁲󠁰󠁦|󠁦󠁲󠁮󠁣|󠁦󠁲󠁭󠁱|󠁦󠁲󠁭󠁦|󠁦󠁲󠁧󠁰|󠁦󠁲󠁧󠁦|󠁦󠁲󠁣󠁰|󠁧󠁴󠁺󠁡|󠁧󠁴󠁴󠁯|󠁧󠁴󠁳󠁵|󠁧󠁴󠁳󠁲|󠁧󠁴󠁳󠁯|󠁧󠁴󠁳󠁭|󠁧󠁴󠁳󠁡|󠁧󠁴󠁲󠁥|󠁧󠁴󠁱󠁺|󠁧󠁴󠁱󠁣|󠁧󠁴󠁰󠁲|󠁧󠁴󠁰󠁥|󠁧󠁴󠁪󠁵|󠁧󠁴󠁪󠁡|󠁧󠁴󠁩󠁺|󠁧󠁴󠁨󠁵|󠁧󠁴󠁧󠁵|󠁧󠁴󠁥󠁳|󠁣󠁺󠁰󠁲|󠁣󠁺󠁰󠁬|󠁣󠁺󠁰󠁡|󠁣󠁺󠁯󠁬|󠁣󠁺󠁭󠁯|󠁣󠁺󠁬󠁩|󠁣󠁺󠁫󠁲|󠁣󠁺󠁫󠁡|󠁣󠁺󠁪󠁭|󠁣󠁺󠁪󠁣|󠁣󠁮󠀷󠀱|󠁣󠁤󠁯󠁲|󠁣󠁤󠁫󠁷|󠁣󠁤󠁫󠁡|󠁣󠁤󠁢󠁮|󠁢󠁨󠀱󠀶|󠁢󠁡󠀱󠀰|󠁡󠁬󠁶󠁬|󠁡󠁬󠁴󠁲|󠁧󠁴󠁣󠁱|󠁦󠁲󠁢󠁬|󠁦󠁲󠀷󠀵|󠁦󠁩󠀰󠀱|󠁥󠁥󠀸󠀶|󠁥󠁥󠀸󠀲|󠁥󠁥󠀷󠀸|󠁥󠁥󠀷󠀰|󠁥󠁥󠀶󠀷|󠁥󠁥󠀶󠀵|󠁥󠁥󠀵󠀹|󠁥󠁥󠀵󠀷|󠁥󠁥󠀵󠀱|󠁥󠁥󠀴󠀹|󠁥󠁥󠀴󠀴|󠁣󠁺󠁺󠁬|󠁣󠁺󠁶󠁹|󠁣󠁺󠁵󠁳|󠁰󠁬󠁬󠁤|󠁰󠁬󠁬󠁢|󠁰󠁬󠁫󠁰|󠁰󠁬󠁤󠁳|󠁰󠁫󠁴󠁡|󠁯󠁭󠁳󠁨|󠁯󠁭󠁢󠁡|󠁮󠁰󠁳󠁥|󠁮󠁰󠁳󠁡|󠁮󠁰󠁲󠁡|󠁮󠁰󠁮󠁡|󠁮󠁰󠁭󠁥|󠁮󠁰󠁭󠁡|󠁮󠁰󠁬󠁵|󠁮󠁰󠁫󠁯|󠁮󠁰󠁫󠁡|󠁮󠁰󠁪󠁡|󠁮󠁰󠁧󠁡|󠁮󠁰󠁤󠁨|󠁺󠁡󠁮󠁬|󠁺󠁡󠁧󠁴|󠁵󠁳󠁶󠁩|󠁵󠁳󠁵󠁭|󠁵󠁳󠁰󠁲|󠁵󠁳󠁭󠁰|󠁵󠁳󠁧󠁵|󠁵󠁳󠁡󠁳|󠁳󠁨󠁴󠁡|󠁰󠁬󠁺󠁰|󠁰󠁬󠁷󠁰|󠁰󠁬󠁷󠁮|󠁰󠁬󠁰󠁭|󠁰󠁬󠁰󠁫|󠁰󠁬󠁰󠁤|󠁰󠁬󠁯󠁰|󠁰󠁬󠁭󠁺|󠁰󠁬󠁭󠁡|󠁭󠁵󠁶󠁰|󠁭󠁵󠁱󠁢|󠁭󠁵󠁰󠁵|󠁭󠁵󠁣󠁵|󠁭󠁵󠁢󠁲|󠁬󠁡󠁸󠁮|󠁩󠁴󠁶󠁳|󠁩󠁴󠁳󠁤|󠁩󠁴󠁯󠁴|󠁩󠁴󠁯󠁧|󠁩󠁴󠁣󠁩|󠁩󠁴󠁡󠁯|󠁩󠁮󠁵󠁴|󠁩󠁮󠁴󠁧|󠁩󠁮󠁯󠁲|󠁩󠁮󠁤󠁮|󠁩󠁮󠁤󠁤|󠁩󠁮󠁣󠁴|󠁣󠁺󠁳󠁴|󠁰󠁬󠁬󠁵|󠁮󠁰󠁢󠁨|󠁮󠁰󠁢󠁡|󠁮󠁯󠀲󠀳|󠁮󠁯󠀲󠀰|󠁮󠁯󠀱󠀹|󠁮󠁯󠀱󠀴|󠁮󠁯󠀱󠀲|󠁮󠁯󠀱󠀰|󠁮󠁬󠁳󠁸|󠁮󠁬󠁣󠁷|󠁮󠁬󠁡󠁷|󠁭󠁶󠁵󠁳|󠁭󠁶󠁵󠁮|󠁭󠁶󠁳󠁵|󠁭󠁶󠁳󠁣|󠁭󠁶󠁮󠁯|󠁭󠁶󠁮󠁣|󠁶󠁮󠀰󠀹|󠁵󠁺󠁸󠁯|󠁵󠁺󠁴󠁯|󠁵󠁺󠁴󠁫|󠁵󠁺󠁳󠁵|󠁵󠁺󠁳󠁩|󠁵󠁺󠁳󠁡|󠁵󠁺󠁱󠁲|󠁵󠁺󠁱󠁡|󠁵󠁺󠁮󠁷|󠁵󠁺󠁮󠁧|󠁵󠁺󠁪󠁩|󠁵󠁺󠁦󠁡|󠁵󠁺󠁢󠁵|󠁵󠁺󠁡󠁮|󠁵󠁹󠁴󠁴|󠁵󠁹󠁴󠁡|󠁵󠁹󠁳󠁯|󠁵󠁹󠁳󠁪|󠁷󠁳󠁧󠁩|󠁷󠁳󠁧󠁥|󠁷󠁳󠁦󠁡|󠁷󠁳󠁡󠁴|󠁷󠁳󠁡󠁬|󠁷󠁳󠁡󠁡|󠁷󠁦󠁵󠁶|󠁷󠁦󠁳󠁧|󠁷󠁦󠁡󠁬|󠁶󠁮󠁳󠁧|󠁶󠁮󠁨󠁰|󠁶󠁮󠁨󠁮|󠁶󠁮󠁤󠁮|󠁶󠁮󠁣󠁴|󠁶󠁮󠀶󠀳|󠁶󠁮󠀶󠀱|󠁶󠁮󠀴󠀹|󠁶󠁮󠀳󠀹|󠁵󠁳󠁶󠁡|󠁵󠁳󠁵󠁴|󠁵󠁳󠁴󠁸|󠁵󠁳󠁴󠁮|󠁵󠁳󠁲󠁩|󠁵󠁳󠁰󠁡|󠁵󠁳󠁯󠁲|󠁵󠁳󠁯󠁫|󠁵󠁳󠁯󠁨|󠁵󠁳󠁮󠁹|󠁵󠁳󠁮󠁶|󠁵󠁳󠁮󠁭|󠁵󠁳󠁮󠁪|󠁵󠁳󠁮󠁨|󠁵󠁳󠁭󠁩|󠁵󠁳󠁭󠁡|󠁵󠁳󠁬󠁡|󠁵󠁳󠁫󠁹|󠁳󠁢󠁷󠁥|󠁶󠁮󠀱󠀸|󠁵󠁹󠁳󠁡|󠁵󠁹󠁲󠁶|󠁵󠁹󠁰󠁡|󠁵󠁹󠁭󠁯|󠁵󠁹󠁭󠁡|󠁵󠁹󠁬󠁡|󠁵󠁹󠁦󠁳|󠁵󠁹󠁦󠁤|󠁵󠁹󠁤󠁵|󠁵󠁹󠁣󠁯|󠁵󠁹󠁣󠁬|󠁵󠁹󠁣󠁡|󠁵󠁹󠁡󠁲|󠁵󠁳󠁷󠁹|󠁵󠁳󠁷󠁶|󠁵󠁳󠁷󠁩|󠁵󠁳󠁷󠁡|󠁡󠁬󠁧󠁲|󠁡󠁬󠁧󠁪|󠁡󠁬󠁦󠁲|󠁡󠁬󠁥󠁲|󠁡󠁬󠁥󠁬|󠁡󠁬󠁤󠁶|󠁡󠁬󠁤󠁲|󠁡󠁬󠁤󠁬|󠁡󠁬󠁤󠁩|󠁡󠁬󠁢󠁵|󠁡󠁬󠁢󠁲|󠁺󠁷󠁭󠁳|󠁺󠁷󠁭󠁮|󠁺󠁷󠁭󠁩|󠁺󠁷󠁭󠁥|󠁺󠁷󠁭󠁣|󠁺󠁷󠁭󠁡|󠁺󠁷󠁨󠁡|󠁺󠁷󠁢󠁵|󠁭󠁶󠁣󠁥|󠁡󠁬󠁴󠁰|󠁡󠁬󠁴󠁥|󠁡󠁬󠁳󠁲|󠁡󠁬󠁳󠁫|󠁡󠁬󠁳󠁨|󠁡󠁬󠁰󠁵|󠁡󠁬󠁰󠁧|󠁡󠁬󠁭󠁴|󠁡󠁬󠁭󠁲|󠁡󠁬󠁭󠁭|󠁡󠁬󠁭󠁫|󠁡󠁬󠁬󠁵|󠁡󠁬󠁬󠁥|󠁡󠁬󠁬󠁢|󠁡󠁬󠁫󠁵|󠁡󠁬󠁫󠁲|󠁡󠁬󠁫󠁯|󠁹󠁥󠁭󠁡|󠁹󠁥󠁬󠁡|󠁹󠁥󠁪󠁡|󠁹󠁥󠁩󠁢|󠁹󠁥󠁨󠁵|󠁹󠁥󠁨󠁪|󠁹󠁥󠁨󠁤|󠁹󠁥󠁤󠁨|󠁹󠁥󠁤󠁡|󠁹󠁥󠁢󠁡|󠁹󠁥󠁡󠁭|󠁹󠁥󠁡󠁤|󠁹󠁥󠁡󠁢|󠁷󠁳󠁶󠁳|󠁷󠁳󠁶󠁦|󠁷󠁳󠁴󠁵|󠁷󠁳󠁳󠁡|󠁷󠁳󠁰󠁡|󠁵󠁳󠁶󠁴|󠁡󠁬󠁨󠁡|󠁺󠁭󠀱󠀰|󠁺󠁡󠁷󠁣|󠁺󠁡󠁮󠁷|󠁺󠁡󠁮󠁣|󠁺󠁡󠁭󠁰|󠁺󠁡󠁬󠁰|󠁺󠁡󠁧󠁰|󠁺󠁡󠁦󠁳|󠁺󠁡󠁥󠁣|󠁹󠁥󠁴󠁡|󠁹󠁥󠁳󠁵|󠁹󠁥󠁳󠁮|󠁹󠁥󠁳󠁨|󠁹󠁥󠁳󠁤|󠁹󠁥󠁳󠁡|󠁹󠁥󠁲󠁡|󠁹󠁥󠁭󠁷|󠁹󠁥󠁭󠁲|󠁩󠁴󠁲󠁩|󠁩󠁴󠁲󠁧|󠁩󠁴󠁲󠁥|󠁩󠁴󠁲󠁣|󠁩󠁴󠁲󠁡|󠁩󠁴󠁰󠁺|󠁩󠁴󠁰󠁲|󠁩󠁴󠁰󠁩|󠁩󠁴󠁰󠁧|󠁩󠁴󠁰󠁡|󠁩󠁴󠁯󠁲|󠁩󠁴󠁮󠁵|󠁩󠁴󠁮󠁯|󠁩󠁴󠁮󠁡|󠁩󠁴󠁭󠁩|󠁩󠁴󠁭󠁥|󠁩󠁴󠁬󠁯|󠁩󠁴󠁬󠁩|󠁪󠁯󠁩󠁲|󠁪󠁯󠁢󠁡|󠁪󠁯󠁡󠁺|󠁪󠁯󠁡󠁴|󠁪󠁯󠁡󠁱|󠁪󠁯󠁡󠁭|󠁪󠁯󠁡󠁪|󠁩󠁴󠁶󠁶|󠁩󠁴󠁶󠁴|󠁩󠁴󠁶󠁲|󠁩󠁴󠁶󠁩|󠁩󠁴󠁶󠁥|󠁩󠁴󠁵󠁤|󠁩󠁴󠁴󠁶|󠁩󠁴󠁴󠁥|󠁩󠁴󠁴󠁡|󠁩󠁴󠁳󠁩|󠁩󠁴󠁳󠁡|󠁩󠁴󠁣󠁥|󠁩󠁴󠁢󠁺|󠁩󠁴󠁢󠁬|󠁩󠁴󠁢󠁩|󠁩󠁴󠁢󠁧|󠁩󠁴󠁢󠁡|󠁩󠁴󠁡󠁶|󠁩󠁴󠁡󠁴|󠁩󠁴󠁡󠁮|󠁩󠁴󠁡󠁬|󠁩󠁴󠁡󠁧|󠁩󠁴󠀸󠀸|󠁩󠁴󠀸󠀲|󠁩󠁴󠀷󠀵|󠁩󠁴󠀷󠀲|󠁩󠁴󠀶󠀷|󠁩󠁴󠀶󠀵|󠁩󠁴󠀶󠀲|󠁩󠁴󠁬󠁥|󠁩󠁴󠁬󠁣|󠁩󠁴󠁫󠁲|󠁩󠁴󠁩󠁳|󠁩󠁴󠁩󠁭|󠁩󠁴󠁧󠁲|󠁩󠁴󠁧󠁯|󠁩󠁴󠁧󠁥|󠁩󠁴󠁦󠁲|󠁩󠁴󠁦󠁭|󠁩󠁴󠁦󠁩|󠁩󠁴󠁦󠁧|󠁩󠁴󠁦󠁥|󠁩󠁴󠁦󠁣|󠁩󠁴󠁥󠁮|󠁩󠁴󠁣󠁺|󠁩󠁴󠁣󠁬|󠁬󠁢󠁪󠁬|󠁬󠁢󠁪󠁡|󠁬󠁢󠁢󠁡|󠁬󠁢󠁡󠁳|󠁬󠁢󠁡󠁫|󠁬󠁡󠁸󠁳|󠁬󠁡󠁸󠁩|󠁬󠁡󠁸󠁥|󠁬󠁡󠁸󠁡|󠁬󠁡󠁶󠁴|󠁬󠁡󠁶󠁩|󠁬󠁡󠁳󠁶|󠁬󠁡󠁳󠁬|󠁬󠁡󠁰󠁨|󠁬󠁡󠁯󠁵|󠁬󠁡󠁬󠁰|󠁬󠁡󠁬󠁭|󠁬󠁡󠁫󠁨|󠁬󠁴󠁡󠁬|󠁬󠁴󠀶󠀰|󠁬󠁲󠁳󠁩|󠁬󠁲󠁲󠁩|󠁬󠁲󠁲󠁧|󠁬󠁲󠁮󠁩|󠁬󠁲󠁭󠁹|󠁬󠁲󠁭󠁯|󠁬󠁲󠁭󠁧|󠁬󠁲󠁬󠁯|󠁬󠁲󠁧󠁰|󠁬󠁲󠁧󠁫|󠁬󠁲󠁧󠁧|󠁬󠁲󠁧󠁢|󠁬󠁲󠁣󠁭|󠁬󠁲󠁢󠁭|󠁬󠁲󠁢󠁧|󠁬󠁢󠁮󠁡|󠁫󠁷󠁭󠁵|󠁫󠁷󠁫󠁵|󠁫󠁷󠁪󠁡|󠁫󠁷󠁨󠁡|󠁫󠁷󠁦󠁡|󠁫󠁷󠁡󠁨|󠁫󠁲󠀵󠀰|󠁫󠁲󠀱󠀱|󠁫󠁰󠀱󠀰|󠁫󠁮󠀱󠀵|󠁫󠁧󠁧󠁯|󠁫󠁧󠁧󠁢|󠁪󠁯󠁭󠁮|󠁪󠁯󠁭󠁤|󠁪󠁯󠁭󠁡|󠁪󠁯󠁫󠁡|󠁪󠁯󠁪󠁡|󠁩󠁴󠁣󠁨|󠁬󠁡󠁨󠁯|󠁬󠁡󠁣󠁨|󠁬󠁡󠁡󠁴|󠁫󠁺󠀷󠀹|󠁫󠁺󠀷󠀵|󠁫󠁺󠀷󠀱|󠁫󠁺󠀵󠀹|󠁫󠁺󠀵󠀵|󠁫󠁺󠀴󠀷|󠁫󠁺󠀴󠀳|󠁫󠁺󠀳󠀹|󠁫󠁺󠀳󠀵|󠁫󠁺󠀳󠀳|󠁫󠁺󠀳󠀱|󠁫󠁺󠀲󠀷|󠁫󠁺󠀲󠀳|󠁫󠁺󠀱󠀹|󠁩󠁤󠁬󠁡|󠁩󠁤󠁫󠁩|󠁩󠁤󠁪󠁷|󠁩󠁤󠁪󠁴|󠁩󠁤󠁪󠁫|󠁩󠁤󠁪󠁩|󠁩󠁤󠁧󠁯|󠁩󠁤󠁢󠁴|󠁩󠁤󠁢󠁥|󠁩󠁤󠁡󠁣|󠁨󠁵󠁺󠁥|󠁨󠁵󠁺󠁡|󠁨󠁵󠁶󠁭|󠁨󠁵󠁶󠁥|󠁨󠁵󠁶󠁡|󠁨󠁵󠁴󠁯|󠁨󠁵󠁴󠁢|󠁨󠁵󠁳󠁺|󠁩󠁥󠁬󠁭|󠁩󠁥󠁬󠁫|󠁩󠁥󠁬󠁨|󠁩󠁥󠁬󠁤|󠁩󠁥󠁫󠁹|󠁩󠁥󠁫󠁫|󠁩󠁥󠁫󠁥|󠁩󠁥󠁤󠁬|󠁩󠁥󠁣󠁷|󠁩󠁥󠁣󠁥|󠁩󠁤󠁹󠁯|󠁩󠁤󠁳󠁧|󠁩󠁤󠁲󠁩|󠁩󠁤󠁰󠁰|󠁩󠁤󠁮󠁢|󠁩󠁤󠁭󠁵|󠁩󠁤󠁭󠁬|󠁩󠁤󠁭󠁡|󠁨󠁵󠁧󠁳|󠁨󠁵󠁦󠁥|󠁨󠁵󠁥󠁲|󠁨󠁵󠁥󠁧|󠁨󠁵󠁤󠁵|󠁨󠁵󠁤󠁥|󠁨󠁵󠁣󠁳|󠁨󠁵󠁢󠁺|󠁨󠁵󠁢󠁵|󠁨󠁵󠁢󠁫|󠁨󠁵󠁢󠁥|󠁨󠁵󠁢󠁣|󠁨󠁵󠁢󠁡|󠁨󠁴󠁯󠁵|󠁨󠁴󠁮󠁯|󠁨󠁴󠁮󠁩|󠁨󠁴󠁧󠁡|󠁢󠁳󠁮󠁥|󠁨󠁵󠁳󠁫|󠁨󠁵󠁳󠁨|󠁨󠁵󠁳󠁦|󠁨󠁵󠁳󠁤|󠁨󠁵󠁰󠁳|󠁨󠁵󠁰󠁥|󠁨󠁵󠁮󠁹|󠁨󠁵󠁮󠁯|󠁨󠁵󠁮󠁫|󠁨󠁵󠁭󠁩|󠁨󠁵󠁫󠁶|󠁨󠁵󠁫󠁭|󠁨󠁵󠁫󠁥|󠁨󠁵󠁪󠁮|󠁨󠁵󠁨󠁶|󠁨󠁵󠁨󠁥|󠁨󠁵󠁨󠁢|󠁩󠁱󠁮󠁡|󠁩󠁱󠁭󠁵|󠁩󠁱󠁭󠁡|󠁩󠁱󠁫󠁲|󠁩󠁱󠁫󠁩|󠁩󠁱󠁫󠁡|󠁩󠁱󠁤󠁱|󠁩󠁱󠁤󠁩|󠁩󠁱󠁤󠁡|󠁩󠁱󠁢󠁧|󠁩󠁱󠁡󠁲|󠁩󠁱󠁡󠁮|󠁩󠁮󠁷󠁢|󠁩󠁮󠁵󠁰|󠁩󠁮󠁵󠁫|󠁩󠁮󠁴󠁮|󠁩󠁮󠁳󠁫|󠁩󠁮󠁲󠁪|󠁫󠁺󠀱󠀵|󠁩󠁴󠀵󠀷|󠁩󠁴󠀵󠀵|󠁩󠁴󠀵󠀲|󠁩󠁴󠀴󠀵|󠁩󠁴󠀴󠀲|󠁩󠁴󠀳󠀶|󠁩󠁴󠀳󠀴|󠁩󠁴󠀳󠀲|󠁩󠁴󠀲󠀵|󠁩󠁴󠀲󠀳|󠁩󠁴󠀲󠀱|󠁩󠁲󠀳󠀰|󠁩󠁱󠁷󠁡|󠁩󠁱󠁳󠁵|󠁩󠁱󠁳󠁤|󠁩󠁱󠁱󠁡|󠁩󠁱󠁮󠁩|󠁩󠁮󠁧󠁡|󠁩󠁮󠁤󠁬|󠁩󠁮󠁤󠁨|󠁩󠁮󠁢󠁲|󠁩󠁮󠁡󠁰|󠁩󠁮󠁡󠁮|󠁩󠁬󠁴󠁡|󠁩󠁬󠁪󠁭|󠁩󠁬󠁨󠁡|󠁩󠁥󠁷󠁨|󠁩󠁥󠁷󠁤|󠁩󠁥󠁴󠁡|󠁩󠁥󠁳󠁯|󠁩󠁥󠁲󠁮|󠁩󠁥󠁯󠁹|󠁩󠁥󠁭󠁨|󠁩󠁥󠁬󠁳|󠁨󠁵󠁧󠁹|󠁩󠁮󠁰󠁹|󠁩󠁮󠁰󠁢|󠁩󠁮󠁯󠁤|󠁩󠁮󠁮󠁬|󠁩󠁮󠁭󠁺|󠁩󠁮󠁭󠁰|󠁩󠁮󠁭󠁮|󠁩󠁮󠁭󠁬|󠁩󠁮󠁭󠁨|󠁩󠁮󠁬󠁤|󠁩󠁮󠁬󠁡|󠁩󠁮󠁫󠁬|󠁩󠁮󠁫󠁡|󠁩󠁮󠁪󠁫|󠁩󠁮󠁪󠁨|󠁩󠁮󠁨󠁲|󠁩󠁮󠁨󠁰|󠁩󠁮󠁧󠁪|󠁮󠁧󠁡󠁫|󠁮󠁧󠁡󠁤|󠁮󠁧󠁡󠁢|󠁮󠁡󠁯󠁷|󠁮󠁡󠁯󠁮|󠁮󠁡󠁯󠁨|󠁮󠁡󠁯󠁤|󠁮󠁡󠁫󠁷|󠁮󠁡󠁫󠁵|󠁮󠁡󠁫󠁨|󠁮󠁡󠁫󠁥|󠁮󠁡󠁫󠁡|󠁮󠁡󠁨󠁡|󠁮󠁡󠁥󠁲|󠁮󠁡󠁣󠁡|󠁭󠁷󠁺󠁯|󠁭󠁷󠁴󠁨|󠁭󠁷󠁳󠁡|󠁮󠁧󠁬󠁡|󠁮󠁧󠁫󠁷|󠁮󠁧󠁫󠁴|󠁮󠁧󠁪󠁩|󠁮󠁧󠁩󠁭|󠁮󠁧󠁧󠁯|󠁮󠁧󠁦󠁣|󠁮󠁧󠁥󠁮|󠁮󠁧󠁥󠁫|󠁮󠁧󠁥󠁤|󠁮󠁧󠁥󠁢|󠁮󠁧󠁤󠁥|󠁮󠁧󠁣󠁲|󠁮󠁧󠁢󠁹|󠁮󠁧󠁢󠁯|󠁮󠁧󠁢󠁥|󠁮󠁧󠁢󠁡|󠁮󠁧󠁡󠁮|󠁭󠁷󠁣󠁫|󠁭󠁷󠁢󠁬|󠁭󠁷󠁢󠁡|󠁭󠁶󠀲󠀰|󠁭󠁶󠀱󠀷|󠁭󠁵󠁳󠁡|󠁭󠁵󠁲󠁲|󠁭󠁵󠁲󠁯|󠁭󠁵󠁰󠁷|󠁭󠁵󠁰󠁬|󠁭󠁵󠁰󠁡|󠁭󠁵󠁭󠁯|󠁭󠁵󠁧󠁰|󠁭󠁵󠁦󠁬|󠁭󠁵󠁣󠁣|󠁭󠁵󠁢󠁬|󠁭󠁵󠁡󠁧|󠁭󠁬󠀱󠀰|󠁭󠁷󠁲󠁵|󠁭󠁷󠁰󠁨|󠁭󠁷󠁮󠁵|󠁭󠁷󠁮󠁳|󠁭󠁷󠁮󠁫|󠁭󠁷󠁮󠁩|󠁭󠁷󠁮󠁥|󠁭󠁷󠁮󠁢|󠁭󠁷󠁭󠁺|󠁭󠁷󠁭󠁷|󠁭󠁷󠁭󠁵|󠁭󠁷󠁭󠁣|󠁭󠁷󠁬󠁫|󠁭󠁷󠁬󠁩|󠁭󠁷󠁤󠁯|󠁭󠁷󠁤󠁥|󠁭󠁷󠁣󠁴|󠁯󠁭󠁢󠁵|󠁯󠁭󠁢󠁳|󠁯󠁭󠁢󠁪|󠁮󠁯󠀵󠀴|󠁮󠁯󠀵󠀰|󠁮󠁯󠀴󠀶|󠁮󠁯󠀴󠀲|󠁮󠁯󠀳󠀸|󠁮󠁯󠀳󠀴|󠁮󠁯󠀳󠀰|󠁮󠁯󠀱󠀸|󠁮󠁯󠀱󠀵|󠁮󠁯󠀱󠀱|󠁮󠁯󠀰󠀳|󠁮󠁬󠁺󠁨|󠁮󠁬󠁺󠁥|󠁮󠁬󠁵󠁴|󠁮󠁬󠁯󠁶|󠁰󠁫󠁫󠁰|󠁰󠁫󠁪󠁫|󠁰󠁫󠁩󠁳|󠁰󠁫󠁧󠁢|󠁰󠁫󠁢󠁡|󠁰󠁡󠁮󠁴|󠁰󠁡󠁮󠁢|󠁰󠁡󠁫󠁹|󠁰󠁡󠁥󠁭|󠁰󠁡󠀱󠀰|󠁯󠁭󠁺󠁵|󠁯󠁭󠁺󠁡|󠁯󠁭󠁷󠁵|󠁯󠁭󠁳󠁳|󠁯󠁭󠁳󠁪|󠁯󠁭󠁭󠁵|󠁯󠁭󠁭󠁡|󠁯󠁭󠁤󠁡|󠁮󠁩󠁣󠁩|󠁮󠁩󠁣󠁡|󠁮󠁩󠁢󠁯|󠁮󠁩󠁡󠁳|󠁮󠁩󠁡󠁮|󠁮󠁧󠁺󠁡|󠁮󠁧󠁹󠁯|󠁮󠁧󠁴󠁡|󠁮󠁧󠁳󠁯|󠁮󠁧󠁲󠁩|󠁮󠁧󠁰󠁬|󠁮󠁧󠁯󠁹|󠁮󠁧󠁯󠁳|󠁮󠁧󠁯󠁮|󠁮󠁧󠁯󠁧|󠁮󠁧󠁮󠁩|󠁮󠁧󠁮󠁡|󠁭󠁷󠁣󠁲|󠁮󠁬󠁮󠁨|󠁮󠁬󠁮󠁢|󠁮󠁬󠁬󠁩|󠁮󠁬󠁧󠁲|󠁮󠁬󠁧󠁥|󠁮󠁬󠁦󠁲|󠁮󠁬󠁦󠁬|󠁮󠁬󠁤󠁲|󠁮󠁩󠁳󠁪|󠁮󠁩󠁲󠁩|󠁮󠁩󠁮󠁳|󠁮󠁩󠁭󠁮|󠁮󠁩󠁭󠁤|󠁮󠁩󠁬󠁥|󠁮󠁩󠁪󠁩|󠁮󠁩󠁧󠁲|󠁮󠁩󠁥󠁳|󠁮󠁩󠁣󠁯|󠁬󠁹󠁫󠁦|󠁬󠁹󠁭󠁢|󠁬󠁹󠁭󠁱|󠁬󠁹󠁮󠁬|󠁬󠁹󠁮󠁱|󠁬󠁹󠁳󠁢|󠁬󠁹󠁳󠁲|󠁬󠁹󠁴󠁢|󠁬󠁹󠁷󠁡|󠁬󠁹󠁷󠁤|󠁬󠁹󠁷󠁳|󠁬󠁹󠁺󠁡|󠁭󠁣󠁣󠁬|󠁭󠁣󠁣󠁯|󠁭󠁣󠁦󠁯|󠁭󠁣󠁧󠁡|󠁭󠁣󠁪󠁥|󠁭󠁣󠁬󠁡|󠁭󠁣󠁭󠁡|󠁭󠁣󠁭󠁣|󠁭󠁣󠁭󠁧|󠁭󠁣󠁭󠁯|󠁭󠁣󠁭󠁵|󠁭󠁣󠁰󠁨|󠁭󠁣󠁳󠁤|󠁭󠁣󠁳󠁲|󠁭󠁣󠁶󠁲|󠁭󠁤󠁡󠁮|󠁭󠁤󠁢󠁡|󠁬󠁴󠁫󠁬|󠁬󠁴󠁫󠁵|󠁬󠁴󠁭󠁲|󠁬󠁴󠁰󠁮|󠁬󠁴󠁳󠁡|󠁬󠁴󠁴󠁡|󠁬󠁴󠁴󠁥|󠁬󠁴󠁵󠁴|󠁬󠁴󠁶󠁬|󠁬󠁵󠁣󠁡|󠁬󠁵󠁣󠁬|󠁬󠁵󠁤󠁩|󠁬󠁵󠁥󠁣|󠁬󠁵󠁥󠁳|󠁬󠁵󠁧󠁲|󠁬󠁵󠁬󠁵|󠁬󠁵󠁭󠁥|󠁬󠁵󠁲󠁤|󠁬󠁵󠁲󠁭|󠁬󠁵󠁶󠁤|󠁬󠁵󠁷󠁩|󠁬󠁹󠁢󠁡|󠁬󠁹󠁢󠁵|󠁬󠁹󠁤󠁲|󠁬󠁹󠁧󠁴|󠁬󠁹󠁪󠁡|󠁬󠁹󠁪󠁧|󠁬󠁹󠁪󠁩|󠁬󠁹󠁪󠁵|󠁭󠁤󠁢󠁤|󠁭󠁤󠁨󠁩|󠁭󠁤󠁯󠁣|󠁭󠁤󠁧󠁬|󠁭󠁤󠁧󠁡|󠁭󠁤󠁵󠁮|󠁭󠁤󠁯󠁲|󠁭󠁤󠁲󠁥|󠁭󠁤󠁴󠁥|󠁭󠁤󠁦󠁬|󠁭󠁤󠁲󠁩|󠁭󠁤󠁤󠁵|󠁭󠁤󠁳󠁤|󠁭󠁤󠁳󠁩|󠁭󠁤󠁳󠁴|󠁭󠁤󠁳󠁶|󠁭󠁤󠁥󠁤|󠁭󠁤󠁴󠁡|󠁭󠁤󠁣󠁡|󠁭󠁤󠁤󠁯|󠁭󠁤󠁩󠁡|󠁭󠁤󠁤󠁲|󠁭󠁤󠁬󠁥|󠁭󠁤󠁦󠁡|󠁭󠁤󠁮󠁩|󠁧󠁱󠁩|󠁴󠁧󠁫|󠁧󠁷󠁮|󠁧󠁷󠁬|󠁬󠁵󠁤|󠁥󠁳󠁡|󠁬󠁵󠁧|󠁬󠁵󠁬|󠁴󠁧󠁭|󠁭󠁷󠁣|󠁳󠁴󠁰|󠁥󠁳󠁯|󠁴󠁧󠁰|󠁥󠁳󠁰|󠁥󠁳󠁳|󠁴󠁧󠁳|󠁴󠁨󠁳|󠁳󠁬󠁷|󠁧󠁱󠁣|󠁵󠁧󠁷|󠁵󠁧󠁮|󠁵󠁧󠁥|󠁵󠁧󠁣|󠁭󠁧󠁡|󠁭󠁧󠁤|󠁰󠁡󠀱|󠁥󠁳󠁬|󠁥󠁳󠁣|󠁳󠁴󠁳|󠁥󠁳󠁪|󠁭󠁧󠁦|󠁭󠁧󠁭|󠁥󠁳󠁨|󠁭󠁨󠁬|󠁭󠁮󠀱|󠁭󠁨󠁴|󠁭󠁬󠀱|󠁲󠁯󠁢|󠁧󠁷󠁳|󠁴󠁭󠁤|󠁬󠁫󠀱|󠁬󠁫󠀲|󠁬󠁫󠀳|󠁬󠁫󠀴|󠁬󠁫󠀵|󠁬󠁫󠀶|󠁮󠁺󠁮|󠁮󠁺󠁳|󠁬󠁫󠀷|󠁬󠁫󠀸|󠁬󠁫󠀹|󠁴󠁭󠁳|󠁰󠁹󠀱|󠁥󠁳󠁭|󠁫󠁭󠁭|󠁥󠁧󠁣|󠁫󠁮󠁫|󠁢󠁯󠁨|󠁦󠁲󠁣|󠁢󠁯󠁬|󠁫󠁮󠁮|󠁣󠁲󠁡|󠁦󠁲󠁭|󠁣󠁲󠁣|󠁩󠁬󠁺|󠁦󠁲󠁮|󠁩󠁬󠁭|󠁣󠁲󠁬|󠁣󠁲󠁰|󠁩󠁬󠁤|󠁳󠁥󠁫|󠁭󠁺󠁮|󠁭󠁺󠁬|󠁣󠁧󠀵|󠁣󠁧󠀲|󠁭󠁺󠁩|󠁭󠁺󠁧|󠁥󠁳󠁺|󠁫󠁧󠁪|󠁫󠁧󠁴|󠁫󠁧󠁹|󠁫󠁨󠀱|󠁫󠁨󠀲|󠁫󠁩󠁧|󠁫󠁩󠁬|󠁫󠁩󠁰|󠁫󠁭󠁡|󠁫󠁭󠁧|󠁩󠁥󠁬|󠁥󠁳󠁴|󠁧󠁮󠁫|󠁩󠁥󠁧|󠁩󠁥󠁤|󠁭󠁷󠁮|󠁧󠁮󠁬|󠁳󠁬󠁥|󠁩󠁥󠁣|󠁳󠁬󠁮|󠁩󠁳󠀰|󠁧󠁮󠁭|󠁣󠁶󠁳|󠁧󠁮󠁮|󠁳󠁬󠁳|󠁴󠁧󠁣|󠁥󠁳󠁢|󠁭󠁷󠁳|󠁩󠁥󠁵|󠁥󠁳󠁶|󠁧󠁭󠁢|󠁧󠁭󠁵|󠁧󠁭󠁷|󠁧󠁮󠁢|󠁣󠁶󠁢|󠁦󠁪󠁣|󠁧󠁮󠁣|󠁩󠁥󠁭|󠁧󠁮󠁤|󠁦󠁪󠁥|󠁦󠁪󠁮|󠁦󠁪󠁲|󠁦󠁪󠁷|󠁧󠁮󠁦)󠁿)|(?:🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼)|(?:[\#\*0-9]️⃣|\p{EBase}\p{EMod}|(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?))|[🏻-🏿🦰-🦳]|(?:(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}](?!(?:\p{EMod}|️))︎?|\p{EPres}︎)|[\#\*0-9]⃣))/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_well_formed.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_well_formed.rb new file mode 100644 index 000000000..3ef5fb374 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_well_formed.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_WELL_FORMED = /(?:(?:(?:(?:\p{EBase}\p{EMod}|(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{Emoji})‍)+(?:\p{EBase}\p{EMod}|(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{Emoji}))|(?:(?:(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{EBase}\p{EMod})[󠀰-󠀹󠁡-󠁺]{1,30}󠁿)|\p{RI}{2}|(?:[\#\*0-9]️⃣|\p{EBase}\p{EMod}|(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?))|[🏻-🏿🦰-🦳])/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_well_formed_include_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_well_formed_include_text.rb new file mode 100644 index 000000000..acf132801 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/generated_native/regex_well_formed_include_text.rb @@ -0,0 +1,8 @@ +# This file was generated by a script, please do not edit it by hand. +# See `$ rake generate_constants` and data/generate_constants.rb for more info. + +module Unicode + module Emoji + REGEX_WELL_FORMED_INCLUDE_TEXT = /(?:(?:(?:(?:\p{EBase}\p{EMod}|(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{Emoji})‍)+(?:\p{EBase}\p{EMod}|(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{Emoji}))|(?:(?:(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?)|\p{EBase}\p{EMod})[󠀰-󠀹󠁡-󠁺]{1,30}󠁿)|\p{RI}{2}|(?:[\#\*0-9]️⃣|\p{EBase}\p{EMod}|(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}]️|\p{EPres}(?!︎)️?))|[🏻-🏿🦰-🦳]|(?:(?!\p{EComp})(?:[\p{Emoji}&&\P{EPres}](?!(?:\p{EMod}|️))︎?|\p{EPres}︎)|[\#\*0-9]⃣))/ + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/index.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/index.rb new file mode 100644 index 000000000..7ded80b5a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/index.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "zlib" +require_relative "constants" + +module Unicode + module Emoji + File.open(INDEX_FILENAME, "rb") do |file| + serialized_data = Zlib::GzipReader.new(file).read + serialized_data.force_encoding Encoding::BINARY + INDEX = Marshal.load(serialized_data) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/lazy_constants.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/lazy_constants.rb new file mode 100644 index 000000000..00b313e97 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/lazy_constants.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module Unicode + module Emoji + # The current list of codepoints with the "Emoji" property + # Same characters as \p{Emoji} + # (Emoji version of this gem might be more recent than Ruby's Emoji version) + EMOJI_CHAR = INDEX[:PROPERTIES].select{ |ord, props| props.include?(:E) }.keys.freeze + + # The current list of codepoints with the "Emoji_Presentation" property + # Same characters as \p{Emoji Presentation} or \p{EPres} + # (Emoji version of this gem might be more recent than Ruby's Emoji version) + EMOJI_PRESENTATION = INDEX[:PROPERTIES].select{ |ord, props| props.include?(:P) }.keys.freeze + + # The current list of codepoints with the "Emoji" property that lack the "Emoji Presentation" property + TEXT_PRESENTATION = INDEX[:PROPERTIES].select{ |ord, props| props.include?(:E) && !props.include?(:P) }.keys.freeze + + # The current list of codepoints with the "Emoji_Component" property + # Same characters as \p{Emoji Component} or \p{EComp} + # (Emoji version of this gem might be more recent than Ruby's Emoji version) + EMOJI_COMPONENT = INDEX[:PROPERTIES].select{ |ord, props| props.include?(:C) }.keys.freeze + + # The current list of codepoints with the "Emoji_Modifier_Base" property + # Same characters as \p{Emoji Modifier Base} or \p{EBase} + # (Emoji version of this gem might be more recent than Ruby's Emoji version) + EMOJI_MODIFIER_BASES = INDEX[:PROPERTIES].select{ |ord, props| props.include?(:B) }.keys.freeze + + # The current list of codepoints with the "Emoji_Modifier" property + # Same characters as \p{Emoji Modifier} or \p{EMod} + # (Emoji version of this gem might be more recent than Ruby's Emoji version) + EMOJI_MODIFIERS = INDEX[:PROPERTIES].select{ |ord, props| props.include?(:M) }.keys.freeze + + # The current list of codepoints with the "Extended_Pictographic" property + # Same characters as \p{Extended Pictographic} or \p{ExtPict} + # (Emoji version of this gem might be more recent than Ruby's Emoji version) + EXTENDED_PICTOGRAPHIC = INDEX[:PROPERTIES].select{ |ord, props| props.include?(:X) }.keys.freeze + + # The current list of codepoints with the "Extended_Pictographic" property that don't have the "Emoji" property + EXTENDED_PICTOGRAPHIC_NO_EMOJI= INDEX[:PROPERTIES].select{ |ord, props| props.include?(:X) && !props.include?(:E) }.keys.freeze + + # The list of characters that can be used as base for keycap sequences + EMOJI_KEYCAPS = INDEX[:KEYCAPS].freeze + + # The list of valid regions + VALID_REGION_FLAGS = INDEX[:FLAGS].freeze + + # The list of valid subdivisions in regex character class syntax + VALID_SUBDIVISIONS = INDEX[:SD].map{_1.sub(/(.)~(.)/, '[\1-\2]') } + + # The list RGI tag sequence flags + RECOMMENDED_SUBDIVISION_FLAGS = INDEX[:TAGS].freeze + + # The list of fully-qualified RGI Emoji ZWJ sequences + RECOMMENDED_ZWJ_SEQUENCES = INDEX[:ZWJ].freeze + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/list.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/list.rb new file mode 100644 index 000000000..e04e19cc8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/lib/unicode/emoji/list.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Unicode + module Emoji + # Contains an ordered and group list of all currently recommended Emoji (RGI/FQE) + LIST = INDEX[:LIST].freeze.each_value(&:freeze) + + # Sometimes, categories change, we issue a warning in these cases + LIST_REMOVED_KEYS = [ + "Smileys & People", + ].freeze + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/unicode-emoji.gemspec b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/unicode-emoji.gemspec new file mode 100644 index 000000000..888d3eb8a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/bundle/ruby/3.1.0/gems/unicode-emoji-4.1.0/unicode-emoji.gemspec @@ -0,0 +1,22 @@ +# -*- encoding: utf-8 -*- + +require File.dirname(__FILE__) + "/lib/unicode/emoji/constants" + +Gem::Specification.new do |gem| + gem.name = "unicode-emoji" + gem.version = Unicode::Emoji::VERSION + gem.summary = "Emoji data and regex" + gem.description = "[Emoji #{Unicode::Emoji::EMOJI_VERSION}] Provides Unicode Emoji data and regexes, incorporating the latest Unicode and Emoji standards. Includes a categorized list of recommended Emoji." + gem.authors = ["Jan Lelis"] + gem.email = ["hi@ruby.consulting"] + gem.homepage = "https://github.com/janlelis/unicode-emoji" + gem.license = "MIT" + + gem.files = Dir["{**/}{.*,*}"].select{ |path| File.file?(path) && path !~ /^pkg/ && path !~ /spec\/data\/[^.]/ } + gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } + gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) + gem.require_paths = ["lib"] + gem.metadata = { "rubygems_mfa_required" => "true" } + + gem.required_ruby_version = ">= 2.5", "< 4.0" +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman.rb new file mode 100644 index 000000000..d0aec691f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman.rb @@ -0,0 +1,622 @@ +require 'set' +require 'brakeman/version' + +module Brakeman + + #This exit code is used when warnings are found and the --exit-on-warn + #option is set + Warnings_Found_Exit_Code = 3 + + #Exit code returned when no Rails application is detected + No_App_Found_Exit_Code = 4 + + #Exit code returned when brakeman was outdated + Not_Latest_Version_Exit_Code = 5 + + #Exit code returned when user requests non-existent checks + Missing_Checks_Exit_Code = 6 + + #Exit code returned when errors were found and the --exit-on-error + #option is set + Errors_Found_Exit_Code = 7 + + #Exit code returned when an ignored warning has no note and + #--ensure-ignore-notes is set + Empty_Ignore_Note_Exit_Code = 8 + + # Exit code returned when at least one obsolete ignore entry is present + # and `--ensure-no-obsolete-ignore-entries` is set. + Obsolete_Ignore_Entries_Exit_Code = 9 + + @debug = false + @quiet = false + @loaded_dependencies = [] + @vendored_paths = false + + #Run Brakeman scan. Returns Tracker object. + # + #Options: + # + # * :app_path - path to root of Rails app (required) + # * :additional_checks_path - array of additional directories containing additional out-of-tree checks to run + # * :additional_libs_path - array of additional application relative lib directories (ex. app/mailers) to process + # * :assume_all_routes - assume all methods are routes (default: true) + # * :check_arguments - check arguments of methods (default: true) + # * :collapse_mass_assignment - report unprotected models in single warning (default: false) + # * :combine_locations - combine warning locations (default: true) + # * :config_file - configuration file + # * :escape_html - escape HTML by default (automatic) + # * :exit_on_error - only affects Commandline module (default: true) + # * :exit_on_warn - only affects Commandline module (default: true) + # * :github_repo - github repo to use for file links (user/repo[/path][@ref]) + # * :highlight_user_input - highlight user input in reported warnings (default: true) + # * :html_style - path to CSS file + # * :ignore_model_output - consider models safe (default: false) + # * :index_libs - add libraries to call index (default: true) + # * :interprocedural - limited interprocedural processing of method calls (default: false) + # * :message_limit - limit length of messages + # * :min_confidence - minimum confidence (0-2, 0 is highest) + # * :output_files - files for output + # * :output_formats - formats for output (:to_s, :to_tabs, :to_csv, :to_html) + # * :parallel_checks - run checks in parallel (default: true) + # * :parser_timeout - set timeout for parsing an individual file (default: 10 seconds) + # * :print_report - if no output file specified, print to stdout (default: false) + # * :quiet - suppress most messages (default: true) + # * :rails3 - force Rails 3 mode (automatic) + # * :rails4 - force Rails 4 mode (automatic) + # * :rails5 - force Rails 5 mode (automatic) + # * :rails6 - force Rails 6 mode (automatic) + # * :report_routes - show found routes on controllers (default: false) + # * :run_checks - array of checks to run (run all if not specified) + # * :safe_methods - array of methods to consider safe + # * :show_ignored - Display warnings that are usually ignored + # * :sql_safe_methods - array of sql sanitization methods to consider safe + # * :skip_libs - do not process lib/ directory (default: false) + # * :skip_vendor - do not process vendor/ directory (default: true) + # * :skip_checks - checks not to run (run all if not specified) + # * :absolute_paths - show absolute path of each file (default: false) + # * :summary_only - only output summary section of report for plain/table (:summary_only, :no_summary, true) + # + #Alternatively, just supply a path as a string. + def self.run options + options = set_options options + + @quiet = !!options[:quiet] + @debug = !!options[:debug] + + if @quiet + options[:report_progress] = false + end + + if options[:use_prism] + begin + require 'prism' + notify '[Notice] Using Prism parser' + rescue LoadError => e + Brakeman.debug "[Notice] Asked to use Prism, but failed to load: #{e}" + end + end + + scan options + end + + #Sets up options for run, checks given application path + def self.set_options options + if options.is_a? String + options = { :app_path => options } + end + + if options[:quiet] == :command_line + command_line = true + options.delete :quiet + end + + options = default_options.merge(load_options(options)).merge(options) + + if options[:quiet].nil? and not command_line + options[:quiet] = true + end + + if options[:rails4] + options[:rails3] = true + elsif options[:rails5] + options[:rails3] = true + options[:rails4] = true + elsif options[:rails6] + options[:rails3] = true + options[:rails4] = true + options[:rails5] = true + end + + options[:output_formats] = get_output_formats options + options[:github_url] = get_github_url options + + + # Use ENV value only if option was not already explicitly set + # (i.e. prefer commandline option over environment variable). + if options[:gemfile].nil? and ENV['BUNDLE_GEMFILE'] and not ENV['BUNDLE_GEMFILE'].empty? + options[:gemfile] = ENV['BUNDLE_GEMFILE'] + end + + options + end + + #Load options from YAML file + def self.load_options line_options + custom_location = line_options[:config_file] + quiet = line_options[:quiet] + app_path = line_options[:app_path] + + #Load configuration file + if config = config_file(custom_location, app_path) + require 'yaml' + options = YAML.safe_load_file config, permitted_classes: [Symbol], symbolize_names: true + + if options + options.each { |k, v| options[k] = Set.new v if v.is_a? Array } + + # After parsing the yaml config file for options, convert any string keys into symbols. + options.keys.select {|k| k.is_a? String}.map {|k| k.to_sym }.each {|k| options[k] = options[k.to_s]; options.delete(k.to_s) } + + unless line_options[:allow_check_paths_in_config] + if options.include? :additional_checks_path + options.delete :additional_checks_path + + notify "[Notice] Ignoring additional check paths in config file. Use --allow-check-paths-in-config to allow" unless (options[:quiet] || quiet) + end + end + + # notify if options[:quiet] and quiet is nil||false + notify "[Notice] Using configuration in #{config}" unless (options[:quiet] || quiet) + options + else + notify "[Notice] Empty configuration file: #{config}" unless quiet + {} + end + else + {} + end + end + + CONFIG_FILES = begin + [ + File.expand_path("~/.brakeman/config.yml"), + File.expand_path("/etc/brakeman/config.yml") + ] + rescue ArgumentError + # In case $HOME or $USER aren't defined for use of `~` + [ + File.expand_path("/etc/brakeman/config.yml") + ] + end + + def self.config_file custom_location, app_path + app_config = File.expand_path(File.join(app_path, "config", "brakeman.yml")) + supported_locations = [File.expand_path(custom_location || ""), app_config] + CONFIG_FILES + supported_locations.detect {|f| File.file?(f) } + end + + #Default set of options + def self.default_options + { :assume_all_routes => true, + :check_arguments => true, + :collapse_mass_assignment => false, + :combine_locations => true, + :engine_paths => ["engines/*"], + :exit_on_error => true, + :exit_on_warn => true, + :highlight_user_input => true, + :html_style => "#{File.expand_path(File.dirname(__FILE__))}/brakeman/format/style.css", + :ignore_model_output => false, + :ignore_redirect_to_model => true, + :index_libs => true, + :message_limit => 100, + :min_confidence => 2, + :output_color => true, + :pager => true, + :parallel_checks => true, + :parser_timeout => 10, + :use_prism => true, + :relative_path => false, + :report_progress => true, + :safe_methods => Set.new, + :show_ignored => false, + :sql_safe_methods => Set.new, + :skip_checks => Set.new, + :skip_vendor => true, + } + end + + #Determine output formats based on options[:output_formats] + #or options[:output_files] + def self.get_output_formats options + #Set output format + if options[:output_format] && options[:output_files] && options[:output_files].size > 1 + raise ArgumentError, "Cannot specify output format if multiple output files specified" + end + if options[:output_format] + get_formats_from_output_format options[:output_format] + elsif options[:output_files] + get_formats_from_output_files options[:output_files] + else + begin + self.load_brakeman_dependency 'terminal-table', :allow_fail + return [:to_s] + rescue LoadError + return [:to_json] + end + end + end + + def self.get_formats_from_output_format output_format + case output_format + when :html, :to_html + [:to_html] + when :csv, :to_csv + [:to_csv] + when :pdf, :to_pdf + [:to_pdf] + when :tabs, :to_tabs + [:to_tabs] + when :json, :to_json + [:to_json] + when :markdown, :to_markdown + [:to_markdown] + when :cc, :to_cc, :codeclimate, :to_codeclimate + [:to_codeclimate] + when :plain ,:to_plain, :text, :to_text, :to_s + [:to_text] + when :table, :to_table + [:to_table] + when :junit, :to_junit + [:to_junit] + when :sarif, :to_sarif + [:to_sarif] + when :sonar, :to_sonar + [:to_sonar] + when :github, :to_github + [:to_github] + else + [:to_text] + end + end + private_class_method :get_formats_from_output_format + + def self.get_formats_from_output_files output_files + output_files.map do |output_file| + case output_file + when /\.html$/i + :to_html + when /\.csv$/i + :to_csv + when /\.pdf$/i + :to_pdf + when /\.tabs$/i + :to_tabs + when /\.json$/i + :to_json + when /\.md$/i + :to_markdown + when /(\.cc|\.codeclimate)$/i + :to_codeclimate + when /\.plain$/i + :to_text + when /\.table$/i + :to_table + when /\.junit$/i + :to_junit + when /\.sarif$/i + :to_sarif + when /\.sonar$/i + :to_sonar + when /\.github$/i + :to_github + else + :to_text + end + end + end + private_class_method :get_formats_from_output_files + + def self.get_github_url options + if github_repo = options[:github_repo] + full_repo, ref = github_repo.split '@', 2 + name, repo, path = full_repo.split '/', 3 + unless name && repo && !(name.empty? || repo.empty?) + raise ArgumentError, "Invalid GitHub repository format" + end + path.chomp '/' if path + ref ||= 'master' + ['https://github.com', name, repo, 'blob', ref, path].compact.join '/' + else + nil + end + end + private_class_method :get_github_url + + #Output list of checks (for `-k` option) + def self.list_checks options + require 'brakeman/scanner' + + add_external_checks options + + if options[:list_optional_checks] + $stderr.puts "Optional Checks:" + checks = Checks.optional_checks + else + $stderr.puts "Available Checks:" + checks = Checks.checks + end + + format_length = 30 + + $stderr.puts "-" * format_length + checks.each do |check| + $stderr.printf("%-#{format_length}s%s\n", check.name, check.description) + end + end + + #Output configuration to YAML + def self.dump_config options + require 'yaml' + if options[:create_config].is_a? String + file = options[:create_config] + else + file = nil + end + + options.delete :create_config + + options.each do |k,v| + if v.is_a? Set + options[k] = v.to_a + end + end + + if file + File.open file, "w" do |f| + YAML.dump options, f + end + notify "Output configuration to #{file}" + else + notify YAML.dump(options) + end + end + + def self.ensure_latest + current = Brakeman::Version + latest = Gem.latest_version_for('brakeman').to_s + if current != latest + "Brakeman #{current} is not the latest version #{latest}" + end + end + + #Run a scan. Generally called from Brakeman.run instead of directly. + def self.scan options + #Load scanner + notify "Loading scanner..." + + begin + require 'brakeman/scanner' + rescue LoadError + raise NoBrakemanError, "Cannot find lib/ directory." + end + + add_external_checks options + + #Start scanning + scanner = Scanner.new options + tracker = scanner.tracker + + check_for_missing_checks options[:run_checks], options[:skip_checks], options[:enable_checks] + + notify "Processing application in #{tracker.app_path}" + scanner.process + + if options[:parallel_checks] + notify "Running checks in parallel..." + else + notify "Running checks..." + end + + tracker.run_checks + + self.filter_warnings tracker, options + + if options[:output_files] + notify "Generating report..." + + write_report_to_files tracker, options[:output_files] + elsif options[:print_report] + notify "Generating report..." + + write_report_to_formats tracker, options[:output_formats] + end + + tracker + end + + def self.write_report_to_files tracker, output_files + require 'fileutils' + tracker.options[:output_color] = false unless tracker.options[:output_color] == :force + + output_files.each_with_index do |output_file, idx| + dir = File.dirname(output_file) + unless Dir.exist? dir + FileUtils.mkdir_p(dir) + end + + File.open output_file, "w" do |f| + f.write tracker.report.format(tracker.options[:output_formats][idx]) + end + notify "Report saved in '#{output_file}'" + end + end + private_class_method :write_report_to_files + + def self.write_report_to_formats tracker, output_formats + unless $stdout.tty? or tracker.options[:output_color] == :force + tracker.options[:output_color] = false + end + + if not $stdout.tty? or not tracker.options[:pager] or output_formats.length > 1 # does this ever happen?? + output_formats.each do |output_format| + puts tracker.report.format(output_format) + end + else + require "brakeman/report/pager" + + Brakeman::Pager.new(tracker).page_report(tracker.report, output_formats.first) + end + end + private_class_method :write_report_to_formats + + #Rescan a subset of files in a Rails application. + # + #A full scan must have been run already to use this method. + #The returned Tracker object from Brakeman.run is used as a starting point + #for the rescan. + # + #Options may be given as a hash with the same values as Brakeman.run. + #Note that these options will be merged into the Tracker. + # + #This method returns a RescanReport object with information about the scan. + #However, the Tracker object will also be modified as the scan is run. + def self.rescan tracker, files, options = {} + require 'brakeman/rescanner' + + options = tracker.options.merge options + + @quiet = !!tracker.options[:quiet] + @debug = !!tracker.options[:debug] + + Rescanner.new(options, tracker.processor, files).recheck + end + + def self.notify message + $stderr.puts message unless @quiet + end + + def self.debug message + $stderr.puts message if @debug + end + + # Compare JSON output from a previous scan and return the diff of the two scans + def self.compare options + require 'json' + require 'brakeman/differ' + raise ArgumentError.new("Comparison file doesn't exist") unless File.exist? options[:previous_results_json] + + begin + previous_results = JSON.parse(File.read(options[:previous_results_json]), :symbolize_names => true)[:warnings] + rescue JSON::ParserError + self.notify "Error parsing comparison file: #{options[:previous_results_json]}" + exit! + end + + tracker = run(options) + new_report = JSON.parse(tracker.report.to_json, symbolize_names: true) + + new_results = new_report[:warnings] + obsolete_ignored = tracker.unused_fingerprints + + Brakeman::Differ.new(new_results, previous_results).diff.tap do |diff| + diff[:obsolete] = obsolete_ignored + end + end + + def self.load_brakeman_dependency name, allow_fail = false + return if @loaded_dependencies.include? name + + unless @vendored_paths + path_load = "#{File.expand_path(File.dirname(__FILE__))}/../bundle/load.rb" + + if File.exist? path_load + require path_load + end + + @vendored_paths = true + end + + begin + require name + rescue LoadError => e + if allow_fail + raise e + else + $stderr.puts e.message + $stderr.puts "Please install the appropriate dependency: #{name}." + exit!(-1) + end + end + end + + # Returns an array of alert fingerprints for any ignored warnings without + # notes found in the specified ignore file (if it exists). + def self.ignore_file_entries_with_empty_notes file + return [] unless file + + require 'brakeman/report/ignore/config' + + config = IgnoreConfig.new(file, nil) + config.read_from_file + config.already_ignored_entries_with_empty_notes.map { |i| i[:fingerprint] } + end + + def self.filter_warnings tracker, options + require 'brakeman/report/ignore/config' + + app_tree = Brakeman::AppTree.from_options(options) + + if options[:ignore_file] + file = options[:ignore_file] + elsif app_tree.exists? "config/brakeman.ignore" + file = app_tree.expand_path("config/brakeman.ignore") + elsif not options[:interactive_ignore] + return + end + + notify "Filtering warnings..." + + if options[:interactive_ignore] + require 'brakeman/report/ignore/interactive' + config = InteractiveIgnorer.new(file, tracker.warnings).start + else + notify "[Notice] Using '#{file}' to filter warnings" + config = IgnoreConfig.new(file, tracker.warnings) + config.read_from_file + config.filter_ignored + end + + tracker.ignored_filter = config + end + + def self.add_external_checks options + options[:additional_checks_path].each do |path| + Brakeman::Checks.initialize_checks path + end if options[:additional_checks_path] + end + + def self.check_for_missing_checks included_checks, excluded_checks, enabled_checks + checks = included_checks.to_a + excluded_checks.to_a + enabled_checks.to_a + + missing = Brakeman::Checks.missing_checks(checks) + + unless missing.empty? + raise MissingChecksError, "Could not find specified check#{missing.length > 1 ? 's' : ''}: #{missing.map {|c| "`#{c}`"}.join(', ')}" + end + end + + def self.debug= val + @debug = val + end + + def self.quiet= val + @quiet = val + end + + class DependencyError < RuntimeError; end + class NoBrakemanError < RuntimeError; end + class NoApplication < RuntimeError; end + class MissingChecksError < RuntimeError; end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/app_tree.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/app_tree.rb new file mode 100644 index 000000000..5b0324895 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/app_tree.rb @@ -0,0 +1,329 @@ +require 'pathname' +require 'brakeman/file_path' + +module Brakeman + class AppTree + VIEW_EXTENSIONS = %w[html.erb html.haml rhtml js.erb html.slim].join(",") + + attr_reader :root + + def self.from_options(options) + root = File.expand_path options[:app_path] + + # Convert files into Regexp for matching + init_options = {} + if options[:skip_files] + init_options[:skip_files] = regex_for_paths(options[:skip_files]) + end + + if options[:only_files] + init_options[:only_files] = regex_for_paths(options[:only_files]) + end + init_options[:additional_libs_path] = options[:additional_libs_path] + init_options[:engine_paths] = options[:engine_paths] + init_options[:skip_vendor] = options[:skip_vendor] + init_options[:follow_symlinks] = options[:follow_symlinks] + + new(root, init_options) + end + + # Accepts an array of filenames and paths with the following format and + # returns a Regexp to match them: + # * "path1/file1.rb" - Matches a specific filename in the project directory. + # * "path1/" - Matches any path that contains "path1" in the project directory. + # * "/path1/ - Matches any path that is rooted at "path1" in the project directory. + # + # TODO: This is wacky and I don't like it. + def self.regex_for_paths(paths) + path_regexes = paths.map do |f| + # If path ends in a file separator then we assume it is a path rather + # than a filename. + if f.end_with?(File::SEPARATOR) + # If path starts with a file separator then we assume that they + # want the project relative path to start with this path prefix. + if f.start_with?(File::SEPARATOR) + "\\A#{Regexp.escape f}" + # If it ends in a file separator, but does not begin with a file + # separator then we assume the path can match any path component in + # the project. + else + Regexp.escape f + end + else + "#{Regexp.escape f}\\z" + end + end + Regexp.new("(?:#{path_regexes.join("|")})") + end + private_class_method(:regex_for_paths) + + def initialize(root, init_options = {}) + @root = root + @project_root_path = Pathname.new(@root) + @skip_files = init_options[:skip_files] + @only_files = init_options[:only_files] + @additional_libs_path = init_options[:additional_libs_path] || [] + @engine_paths = init_options[:engine_paths] || [] + @absolute_engine_paths = @engine_paths.select { |path| path.start_with?(File::SEPARATOR) } + @relative_engine_paths = @engine_paths - @absolute_engine_paths + @skip_vendor = init_options[:skip_vendor] + @follow_symlinks = init_options[:follow_symlinks] + @gemspec = nil + @root_search_pattern = nil + end + + # Create a new Brakeman::FilePath + def file_path(path) + Brakeman::FilePath.from_app_tree(self, path) + end + + # Should only be used by Brakeman::FilePath. + # Use AppTree#file_path(path).absolute instead. + def expand_path(path) + File.expand_path(path, @root) + end + + # Should only be used by Brakeman::FilePath + # Use AppTree#file_path(path).relative instead. + def relative_path(path) + pname = Pathname.new path + if path and not path.empty? and pname.absolute? + pname.relative_path_from(Pathname.new(self.root)).to_s + else + path + end + end + + def exists?(path) + if path.is_a? Brakeman::FilePath + path.exists? + else + File.exist?(File.join(@root, path)) + end + end + + def ruby_file_paths + find_paths(".").uniq + end + + def initializer_paths + @initializer_paths ||= prioritize_concerns(find_paths("config/initializers")) + end + + def controller_paths + @controller_paths ||= prioritize_concerns(find_paths("app/**/controllers")) + end + + def model_paths + @model_paths ||= prioritize_concerns(find_paths("app/**/models")) + end + + def template_paths + @template_paths ||= find_paths(".", "*.{#{VIEW_EXTENSIONS}}") + + find_paths("**", "*.{erb,haml,slim}").reject { |path| File.basename(path).count(".") > 1 } + end + + def layout_exists?(name) + !Dir.glob("#{root_search_pattern}app/views/layouts/#{name}.html.{erb,haml,slim}").empty? + end + + def lib_paths + @lib_files ||= find_paths("lib").reject { |path| path.relative.include? "/generators/" or path.relative.include? "lib/tasks/" or path.relative.include? "lib/templates/" } + + find_additional_lib_paths + + find_helper_paths + + find_job_paths + end + + def gemspec + return @gemspec unless @gemspec.nil? + + gemspecs = Dir.glob(File.join(@root, "*.gemspec")) + + if gemspecs.length > 1 or gemspecs.empty? + @gemspec = false + else + @gemspec = file_path(File.basename(gemspecs.first)) + end + end + + + # Call this to be able to marshall the AppTree + def marshallable + @initializer_paths = @initializer_paths.to_a + @controller_paths = @controller_paths.to_a + @template_paths = @template_paths.to_a + @lib_files = @file_paths.to_a + + self + end + + private + + def find_helper_paths + find_paths "app/helpers" + end + + def find_job_paths + find_paths "app/jobs" + end + + def find_additional_lib_paths + @additional_libs_path.collect{ |path| find_paths path }.flatten + end + + def find_paths(directory, extensions = ".rb") + select_files(glob_files(directory, "*", extensions)) + end + + def glob_files(directory, name, extensions = ".rb") + if @follow_symlinks + root_directory = "#{root_search_pattern}#{directory}" + patterns = ["#{root_directory}/**/#{name}#{extensions}"] + + Dir.glob("#{root_directory}/**/*", File::FNM_DOTMATCH).each do |path| + if File.symlink?(path) && File.directory?(path) + symlink_target = File.readlink(path) + if Pathname.new(symlink_target).relative? + symlink_target = File.join(File.dirname(path), symlink_target) + end + patterns << "#{search_pattern(symlink_target)}/**/#{name}#{extensions}" + end + end + + files = patterns.flat_map { |pattern| Dir.glob(pattern) } + files.uniq.lazy + else + if directory == '.' + pattern = File.join(top_directories_pattern, '**', "#{name}#{extensions}") + else + pattern = "#{root_search_pattern}#{directory}/**/#{name}#{extensions}" + end + + Dir.glob(pattern).lazy + end + end + + def select_files(paths) + paths = select_only_files(paths) + paths = reject_skipped_files(paths) + paths = convert_to_file_paths(paths) + paths = reject_global_excludes(paths) + paths = reject_directories(paths) + paths + end + + def reject_directories(paths) + paths.reject { |path| File.directory?(path) } + end + + def select_only_files(paths) + return paths unless @only_files + + paths.select do |path| + match_path @only_files, path + end + end + + def reject_skipped_files(paths) + return paths unless @skip_files + + paths.reject do |path| + match_path @skip_files, path + end + end + + EXCLUDED_PATHS = regex_for_paths %w[ + generators/ + lib/tasks/ + lib/templates/ + db/ + spec/ + test/ + tmp/ + ] + + def reject_global_excludes(paths) + paths.reject do |path| + relative_path = path.relative + + if @skip_vendor and relative_path.include? 'vendor/' and !in_engine_paths?(path) and !in_add_libs_paths?(path) + true + else + match_path EXCLUDED_PATHS, path + end + end + end + + def in_engine_paths?(path) + @engine_paths.any? { |p| path.absolute.include?(p) } + end + + def in_add_libs_paths?(path) + @additional_libs_path.any? { |p| path.absolute.include?(p) } + end + + def match_path files, path + # TODO: Converting to Pathnames and Strings seems like a lot + # of converting that could perhaps all be handled in Brakeman::FilePath + # instead? + absolute_path = Pathname.new(path) + + # relative root never has a leading separator. But, we use a leading + # separator in a @skip_files entry to imply that a directory is + # "absolute" with respect to the project directory. + # + # Also directories need a trailing separator. + project_relative_path = if File.directory?(path) + File.join( + File::SEPARATOR, + absolute_path.relative_path_from(@project_root_path).to_s, + File::SEPARATOR + ) + else + File.join( + File::SEPARATOR, + absolute_path.relative_path_from(@project_root_path).to_s + ) + end + + files.match(project_relative_path) + end + + def top_directories_pattern + top_dirs = convert_to_file_paths(Dir.glob(File.join(root_search_pattern, '*/'))) + top_dirs.reject! { |d| File.symlink?(d) or !File.directory?(d) } + top_dirs = reject_global_excludes(top_dirs) + top_dirs = reject_skipped_files(top_dirs) + + if top_dirs.empty? + # Fall back to searching everything, otherwise the empty pattern + # will start searching from the global root + root_search_pattern + else + "{#{top_dirs.join(',')}}" + end + end + + def root_search_pattern + return @root_search_pattern if @root_search_pattern + @root_search_pattern = search_pattern(@root) + end + + def search_pattern(root_dir) + abs = @absolute_engine_paths.to_a.map { |path| path.gsub(/#{File::SEPARATOR}+$/, '') } + rel = @relative_engine_paths.to_a.map { |path| path.gsub(/#{File::SEPARATOR}+$/, '') } + + roots = ([root_dir] + abs).join(",") + rel_engines = (rel + [""]).join("/,") + "{#{roots}}/{#{rel_engines}}" + end + + def prioritize_concerns paths + paths.partition { |path| path.relative.include? "concerns" }.flatten + end + + def convert_to_file_paths paths + paths.map { |path| file_path(path) } + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/call_index.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/call_index.rb new file mode 100644 index 000000000..6bb64c0fd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/call_index.rb @@ -0,0 +1,261 @@ +require 'set' + +#Stores call sites to look up later. +class Brakeman::CallIndex + + #Initialize index with calls from FindAllCalls + def initialize calls + @calls_by_method = {} + @calls_by_target = {} + + index_calls calls + end + + #Find calls matching specified option hash. + # + #Options: + # + # * :target - symbol, array of symbols, or regular expression to match target(s) + # * :method - symbol, array of symbols, or regular expression to match method(s) + # * :chained - boolean, whether or not to match against a whole method chain (false by default) + # * :nested - boolean, whether or not to match against a method call that is a target itself (false by default) + def find_calls options + target = options[:target] || options[:targets] + method = options[:method] || options[:methods] + nested = options[:nested] + + if options[:chained] + return find_chain options + #Find by narrowest category + elsif target.is_a? Array and method.is_a? Array + if target.length > method.length + calls = filter_by_target calls_by_methods(method), target + else + calls = calls_by_targets(target) + calls = filter_by_method calls, method + end + + elsif target.is_a? Regexp and method + calls = filter_by_target(calls_by_method(method), target) + + elsif method.is_a? Regexp and target + calls = filter_by_method(calls_by_target(target), method) + + #Find by target, then by methods, if provided + elsif target + calls = calls_by_target target + + if calls and method + calls = filter_by_method calls, method + end + + #Find calls with no explicit target + #with either :target => nil or :target => false + elsif (options.key? :target or options.key? :targets) and not target and method + calls = calls_by_method method + calls = filter_by_target calls, nil + + #Find calls by method + elsif method + calls = calls_by_method method + else + raise "Invalid arguments to CallCache#find_calls: #{options.inspect}" + end + + return [] if calls.nil? + + #Remove calls that are actually targets of other calls + #Unless those are explicitly desired + calls = filter_nested calls unless nested + + calls + end + + def remove_template_indexes template_name = nil + [@calls_by_method, @calls_by_target].each do |calls_by| + calls_by.each do |_name, calls| + calls.delete_if do |call| + from_template call, template_name + end + end + end + end + + def remove_indexes_by_class classes + [@calls_by_method, @calls_by_target].each do |calls_by| + calls_by.each do |_name, calls| + calls.delete_if do |call| + call[:location][:type] == :class and classes.include? call[:location][:class] + end + end + end + end + + def remove_indexes_by_file file + [@calls_by_method, @calls_by_target].each do |calls_by| + calls_by.each do |_name, calls| + calls.delete_if do |call| + call[:location][:file] == file + end + end + end + end + + def index_calls calls + calls.each do |call| + @calls_by_method[call[:method]] ||= [] + @calls_by_method[call[:method]] << call + + target = call[:target] + + if not target.is_a? Sexp + @calls_by_target[target] ||= [] + @calls_by_target[target] << call + elsif target.node_type == :params or target.node_type == :session + @calls_by_target[target.node_type] ||= [] + @calls_by_target[target.node_type] << call + end + end + end + + private + + def find_chain options + target = options[:target] || options[:targets] + method = options[:method] || options[:methods] + + calls = calls_by_method method + + return [] if calls.nil? + + calls = filter_by_chain calls, target + end + + def calls_by_target target + case target + when Array + calls_by_targets target + when Regexp + calls_by_targets_regex target + else + @calls_by_target[target] || [] + end + end + + def calls_by_targets targets + calls = [] + + targets.each do |target| + calls.concat @calls_by_target[target] if @calls_by_target.key? target + end + + calls + end + + def calls_by_targets_regex targets_regex + calls = [] + + @calls_by_target.each do |key, value| + case key + when String, Symbol + calls.concat value if key.match targets_regex + end + end + + calls + end + + def calls_by_method method + case method + when Array + calls_by_methods method + when Regexp + calls_by_methods_regex method + else + @calls_by_method[method.to_sym] || [] + end + end + + def calls_by_methods methods + methods = methods.map { |m| m.to_sym } + calls = [] + + methods.each do |method| + calls.concat @calls_by_method[method] if @calls_by_method.key? method + end + + calls + end + + def calls_by_methods_regex methods_regex + calls = [] + + @calls_by_method.each do |key, value| + calls.concat value if key.match methods_regex + end + + calls + end + + def filter calls, key, value + case value + when Array + values = Set.new value + + calls.select do |call| + values.include? call[key] + end + when Regexp + calls.select do |call| + case call[key] + when String, Symbol + call[key].match value + end + end + else + calls.select do |call| + call[key] == value + end + end + end + + def filter_by_method calls, method + filter calls, :method, method + end + + def filter_by_target calls, target + filter calls, :target, target + end + + def filter_nested calls + filter calls, :nested, false + end + + def filter_by_chain calls, target + case target + when Array + targets = Set.new target + + calls.select do |call| + targets.include? call[:chain].first + end + when Regexp + calls.select do |call| + case call[:chain].first + when String, Symbol + call[:chain].first.match target + end + end + else + calls.select do |call| + call[:chain].first == target + end + end + end + + def from_template call, template_name + return false unless call[:location][:type] == :template + return true if template_name.nil? + call[:location][:template] == template_name + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks.rb new file mode 100644 index 000000000..09e309b6c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks.rb @@ -0,0 +1,217 @@ +require 'thread' +require 'brakeman/differ' + +#Collects up results from running different checks. +# +#Checks can be added with +Check.add(check_class)+ +# +#All .rb files in checks/ will be loaded. +class Brakeman::Checks + @checks = [] + @optional_checks = [] + + attr_reader :warnings, :controller_warnings, :model_warnings, :template_warnings, :checks_run + + #Add a check. This will call +_klass_.new+ when running tests + def self.add klass + @checks << klass unless @checks.include? klass + end + + #Add an optional check + def self.add_optional klass + @optional_checks << klass unless @checks.include? klass + end + + def self.checks + @checks + @optional_checks + end + + def self.optional_checks + @optional_checks + end + + def self.initialize_checks check_directory = "" + #Load all files in check_directory + Dir.glob(File.join(check_directory, "*.rb")).sort.each do |f| + require f + end + end + + def self.missing_checks check_args + check_args = check_args.to_a.map(&:to_s).to_set + + if check_args == Set['CheckNone'] + return [] + else + loaded = self.checks.map { |name| name.to_s.gsub('Brakeman::', '') }.to_set + missing = check_args - loaded + + unless missing.empty? + return missing + end + end + + [] + end + + #No need to use this directly. + def initialize options = { } + if options[:min_confidence] + @min_confidence = options[:min_confidence] + else + @min_confidence = Brakeman.get_defaults[:min_confidence] + end + + @warnings = [] + @template_warnings = [] + @model_warnings = [] + @controller_warnings = [] + @checks_run = [] + end + + #Add Warning to list of warnings to report. + #Warnings are split into four different arrays + #for template, controller, model, and generic warnings. + # + #Will not add warnings which are below the minimum confidence level. + def add_warning warning + unless warning.confidence > @min_confidence + case warning.warning_set + when :template + @template_warnings << warning + when :warning + @warnings << warning + when :controller + @controller_warnings << warning + when :model + @model_warnings << warning + else + raise "Unknown warning: #{warning.warning_set}" + end + end + end + + #Return a hash of arrays of new and fixed warnings + # + # diff = checks.diff old_checks + # diff[:fixed] # [...] + # diff[:new] # [...] + def diff other_checks + my_warnings = self.all_warnings + other_warnings = other_checks.all_warnings + Brakeman::Differ.new(my_warnings, other_warnings).diff + end + + #Return an array of all warnings found. + def all_warnings + @warnings + @template_warnings + @controller_warnings + @model_warnings + end + + #Run all the checks on the given Tracker. + #Returns a new instance of Checks with the results. + def self.run_checks(tracker) + checks = self.checks_to_run(tracker) + check_runner = self.new :min_confidence => tracker.options[:min_confidence] + self.actually_run_checks(checks, check_runner, tracker) + end + + def self.actually_run_checks(checks, check_runner, tracker) + threads = [] # Results for parallel + results = [] # Results for sequential + parallel = tracker.options[:parallel_checks] + error_mutex = Mutex.new + + checks.each do |c| + check_name = get_check_name c + Brakeman.notify " - #{check_name}" + + if parallel + threads << Thread.new do + self.run_a_check(c, error_mutex, tracker) + end + else + results << self.run_a_check(c, error_mutex, tracker) + end + + #Maintain list of which checks were run + #mainly for reporting purposes + check_runner.checks_run << check_name[5..-1] + end + + threads.each { |t| t.join } + + Brakeman.notify "Checks finished, collecting results..." + + if parallel + threads.each do |thread| + thread.value.each do |warning| + check_runner.add_warning warning + end + end + else + results.each do |warnings| + warnings.each do |warning| + check_runner.add_warning warning + end + end + end + + check_runner + end + + private + + def self.get_check_name check_class + check_class.to_s.split("::").last + end + + def self.checks_to_run tracker + to_run = if tracker.options[:run_all_checks] or tracker.options[:run_checks] + @checks + @optional_checks + else + @checks.dup + end.to_set + + if enabled_checks = tracker.options[:enable_checks] + @optional_checks.each do |c| + if enabled_checks.include? self.get_check_name(c) + to_run << c + end + end + end + + self.filter_checks to_run, tracker + end + + def self.filter_checks checks, tracker + skipped = tracker.options[:skip_checks] + explicit = tracker.options[:run_checks] + enabled = tracker.options[:enable_checks] || [] + + checks.reject do |c| + check_name = self.get_check_name(c) + + skipped.include? check_name or + (explicit and not explicit.include? check_name and not enabled.include? check_name) + end + end + + def self.run_a_check klass, mutex, tracker + check = klass.new(tracker) + + begin + check.run_check + rescue => e + mutex.synchronize do + tracker.error e + end + end + + check.warnings + end +end + +#Load all files in checks/ directory +Dir.glob("#{File.expand_path(File.dirname(__FILE__))}/checks/*.rb").sort.each do |f| + require f.match(/(brakeman\/checks\/.*)\.rb$/)[0] +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/base_check.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/base_check.rb new file mode 100644 index 000000000..ac58ba742 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/base_check.rb @@ -0,0 +1,528 @@ +require 'brakeman/processors/output_processor' +require 'brakeman/processors/lib/processor_helper' +require 'brakeman/warning' +require 'brakeman/util' +require 'brakeman/messages' + +#Basis of vulnerability checks. +class Brakeman::BaseCheck < Brakeman::SexpProcessor + include Brakeman::ProcessorHelper + include Brakeman::SafeCallHelper + include Brakeman::Util + include Brakeman::Messages + attr_reader :tracker, :warnings + + # This is for legacy support. + # Use :high, :medium, or :low instead when creating warnings. + CONFIDENCE = Brakeman::Warning::CONFIDENCE + + Match = Struct.new(:type, :match) + + class << self + attr_accessor :name + + def inherited(subclass) + subclass.name = subclass.to_s.match(/^Brakeman::(.*)$/)[1] + end + end + + #Initialize Check with Checks. + def initialize(tracker) + super() + @app_tree = tracker.app_tree + @results = [] #only to check for duplicates + @warnings = [] + @tracker = tracker + @string_interp = false + @current_set = nil + @current_template = @current_module = @current_class = @current_method = nil + @active_record_models = nil + @mass_assign_disabled = nil + @has_user_input = nil + @in_array = false + @safe_input_attributes = Set[:to_i, :to_f, :arel_table, :id, :uuid] + @comparison_ops = Set[:==, :!=, :>, :<, :>=, :<=] + end + + #Add result to result list, which is used to check for duplicates + def add_result result + location = get_location result + location, line = get_location result + + @results << [line, location, result] + end + + #Default Sexp processing. Iterates over each value in the Sexp + #and processes them if they are also Sexps. + def process_default exp + exp.each do |e| + process e if sexp? e + end + + exp + end + + #Process calls and check if they include user input + def process_call exp + unless @comparison_ops.include? exp.method + process exp.target if sexp? exp.target + process_call_args exp + end + + target = exp.target + + unless always_safe_method? exp.method + if params? target + @has_user_input = Match.new(:params, exp) + elsif cookies? target + @has_user_input = Match.new(:cookies, exp) + elsif request_headers? target + @has_user_input = Match.new(:request, exp) + elsif sexp? target and model_name? target[1] #TODO: Can this be target.target? + @has_user_input = Match.new(:model, exp) + end + end + + exp + end + + def process_if exp + #This is to ignore user input in condition + current_user_input = @has_user_input + process exp.condition + @has_user_input = current_user_input + + process exp.then_clause if sexp? exp.then_clause + process exp.else_clause if sexp? exp.else_clause + + exp + end + + #Note that params are included in current expression + def process_params exp + @has_user_input = Match.new(:params, exp) + exp + end + + #Note that cookies are included in current expression + def process_cookies exp + @has_user_input = Match.new(:cookies, exp) + exp + end + + def process_array exp + @in_array = true + process_default exp + ensure + @in_array = false + end + + #Does not actually process string interpolation, but notes that it occurred. + def process_dstr exp + unless array_interp? exp or @string_interp # don't overwrite existing value + @string_interp = Match.new(:interp, exp) + end + + process_default exp + end + + private + + # Checking for + # + # %W[#{a}] + # + # which will be parsed as + # + # s(:array, s(:dstr, "", s(:evstr, s(:call, nil, :a)))) + def array_interp? exp + @in_array and + string_interp? exp and + exp[1] == "".freeze and + exp.length == 3 # only one interpolated value + end + + def always_safe_method? meth + @safe_input_attributes.include? meth or + @comparison_ops.include? meth + end + + def boolean_method? method + method[-1] == "?" + end + + TEMP_FILE_PATH = [ + s(:call, s(:call, s(:const, :Tempfile), :new), :path).freeze, + s(:call, s(:call, s(:const, :Tempfile), :create), :path).freeze + ].freeze + + def temp_file_path? exp + TEMP_FILE_PATH.include? exp + end + + #Report a warning + def warn options + extra_opts = { :check => self.class.to_s } + + if options[:file] + options[:file] = @app_tree.file_path(options[:file]) + end + + @warnings << Brakeman::Warning.new(options.merge(extra_opts)) + end + + #Run _exp_ through OutputProcessor to get a nice String. + def format_output exp + Brakeman::OutputProcessor.new.format(exp).gsub(/\r|\n/, "") + end + + #Checks if mass assignment is disabled globally in an initializer. + def mass_assign_disabled? + return @mass_assign_disabled unless @mass_assign_disabled.nil? + + @mass_assign_disabled = false + + if version_between?("3.1.0", "3.9.9") and + tracker.config.whitelist_attributes? + + @mass_assign_disabled = true + elsif tracker.options[:rails4] && (!tracker.config.has_gem?(:protected_attributes) || tracker.config.whitelist_attributes?) + + @mass_assign_disabled = true + else + #Check for ActiveRecord::Base.send(:attr_accessible, nil) + tracker.find_call(target: :"ActiveRecord::Base", method: :attr_accessible).each do |result| + call = result[:call] + + if call? call + if call.first_arg == Sexp.new(:nil) + @mass_assign_disabled = true + break + end + end + end + + unless @mass_assign_disabled + #Check for + # class ActiveRecord::Base + # attr_accessible nil + # end + tracker.check_initializers([], :attr_accessible).each do |result| + if result.module == "ActiveRecord" and result.result_class == :Base + arg = result.call.first_arg + + if arg.nil? or node_type? arg, :nil + @mass_assign_disabled = true + break + end + end + end + end + end + + #There is a chance someone is using Rails 3.x and the `strong_parameters` + #gem and still using hack above, so this is a separate check for + #including ActiveModel::ForbiddenAttributesProtection in + #ActiveRecord::Base in an initializer. + if not @mass_assign_disabled and version_between?("3.1.0", "3.9.9") and tracker.config.has_gem? :strong_parameters + matches = tracker.check_initializers([], :include) + forbidden_protection = Sexp.new(:colon2, Sexp.new(:const, :ActiveModel), :ForbiddenAttributesProtection) + + matches.each do |result| + if call? result.call and result.call.first_arg == forbidden_protection + @mass_assign_disabled = true + end + end + + unless @mass_assign_disabled + tracker.find_call(target: :"ActiveRecord::Base", method: [:send, :include]).each do |result| + call = result[:call] + if call? call and (call.first_arg == forbidden_protection or call.second_arg == forbidden_protection) + @mass_assign_disabled = true + end + end + end + end + + @mass_assign_disabled + end + + def original? result + return false if result[:call].original_line or duplicate? result + add_result result + true + end + + #This is to avoid reporting duplicates. Checks if the result has been + #reported already from the same line number. + def duplicate? result, location = nil + location, line = get_location result + + @results.each do |r| + if r[0] == line and r[1] == location + if tracker.options[:combine_locations] + return true + elsif r[2] == result + return true + end + end + end + + false + end + + def get_location result + if result.is_a? Hash + line = result[:call].original_line || result[:call].line + elsif sexp? result + line = result.original_line || result.line + else + raise ArgumentError + end + + location ||= (@current_template && @current_template.name) || @current_class || @current_module || @current_set || result[:location][:class] || result[:location][:template] || result[:location][:file].to_s + + location = location[:name] if location.is_a? Hash + location = location.name if location.is_a? Brakeman::Collection + location = location.to_sym + + return location, line + end + + #Checks if _exp_ includes user input in the form of cookies, parameters, + #request environment, or model attributes. + # + #If found, returns a struct containing a type (:cookies, :params, :request, :model) and + #the matching expression (Match#type and Match#match). + # + #Returns false otherwise. + def include_user_input? exp + @has_user_input = false + process exp + @has_user_input + end + + #This is used to check for user input being used directly. + # + ##If found, returns a struct containing a type (:cookies, :params, :request) and + #the matching expression (Match#type and Match#match). + # + #Returns false otherwise. + def has_immediate_user_input? exp + if exp.nil? + false + elsif call? exp and not always_safe_method? exp.method + if params? exp + return Match.new(:params, exp) + elsif cookies? exp + return Match.new(:cookies, exp) + elsif request_headers? exp + return Match.new(:request, exp) + else + has_immediate_user_input? exp.target + end + elsif sexp? exp + case exp.node_type + when :dstr + exp.each do |e| + if sexp? e + match = has_immediate_user_input?(e) + return match if match + end + end + false + when :evstr + if sexp? exp.value + if exp.value.node_type == :rlist + exp.value.each_sexp do |e| + match = has_immediate_user_input?(e) + return match if match + end + false + else + has_immediate_user_input? exp.value + end + end + when :format + has_immediate_user_input? exp.value + when :if + (sexp? exp.then_clause and has_immediate_user_input? exp.then_clause) or + (sexp? exp.else_clause and has_immediate_user_input? exp.else_clause) + when :or + has_immediate_user_input? exp.lhs or + has_immediate_user_input? exp.rhs + when :splat, :kwsplat + exp.each_sexp do |e| + match = has_immediate_user_input?(e) + return match if match + end + + false + when :hash + if kwsplat? exp + exp[1].each_sexp do |e| + match = has_immediate_user_input?(e) + return match if match + end + + false + end + else + false + end + end + end + + #Checks for a model attribute at the top level of the + #expression. + def has_immediate_model? exp, out = nil + out = exp if out.nil? + + if sexp? exp and exp.node_type == :output + exp = exp.value + end + + if call? exp + target = exp.target + method = exp.method + + if always_safe_method? method + false + elsif call? target and not method.to_s[-1,1] == "?" + if has_immediate_model?(target, out) + exp + else + false + end + elsif model_name? target + exp + else + false + end + elsif sexp? exp + case exp.node_type + when :dstr + exp.each do |e| + if sexp? e and match = has_immediate_model?(e, out) + return match + end + end + false + when :evstr + if sexp? exp.value + if exp.value.node_type == :rlist + exp.value.each_sexp do |e| + if match = has_immediate_model?(e, out) + return match + end + end + false + else + has_immediate_model? exp.value, out + end + end + when :format + has_immediate_model? exp.value, out + when :if + ((sexp? exp.then_clause and has_immediate_model? exp.then_clause, out) or + (sexp? exp.else_clause and has_immediate_model? exp.else_clause, out)) + when :or + has_immediate_model? exp.lhs or + has_immediate_model? exp.rhs + else + false + end + end + end + + #Checks if +exp+ is a model name. + # + #Prior to using this method, either @tracker must be set to + #the current tracker, or else @models should contain an array of the model + #names, which is available via tracker.models.keys + def model_name? exp + @models ||= @tracker.models.keys + + if exp.is_a? Symbol + @models.include? exp + elsif call? exp and exp.target.nil? and exp.method == :current_user + true + elsif sexp? exp + @models.include? class_name(exp) + else + false + end + end + + #Returns true if +target+ is in +exp+ + def include_target? exp, target + return false unless call? exp + + exp.each do |e| + return true if e == target or include_target? e, target + end + + false + end + + def lts_version? version + tracker.config.has_gem? :'railslts-version' and + version_between? version, "2.3.18.99", tracker.config.gem_version(:'railslts-version') + end + + def version_between? low_version, high_version, current_version = nil + tracker.config.version_between? low_version, high_version, current_version + end + + def gemfile_or_environment gem_name = :rails + if gem_name and info = tracker.config.get_gem(gem_name.to_sym) + info + elsif @app_tree.exists?("Gemfile") + @app_tree.file_path "Gemfile" + elsif @app_tree.exists?("gems.rb") + @app_tree.file_path "gems.rb" + else + @app_tree.file_path "config/environment.rb" + end + end + + def self.description + @description + end + + def active_record_models + return @active_record_models if @active_record_models + + @active_record_models = {} + + tracker.models.each do |name, model| + if model.ancestor? :"ActiveRecord::Base" + @active_record_models[name] = model + end + end + + @active_record_models + end + + STRING_METHODS = Set[:<<, :+, :concat, :prepend] + private_constant :STRING_METHODS + + def string_building? exp + return false unless call? exp and STRING_METHODS.include? exp.method + + node_type? exp.target, :str, :dstr or + node_type? exp.first_arg, :str, :dstr or + string_building? exp.target or + string_building? exp.first_arg + end + + I18N_CLASS = s(:const, :I18n) + + def locale_call? exp + return unless call? exp + + (exp.target == I18N_CLASS and + exp.method == :locale) or + locale_call? exp.target + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_basic_auth.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_basic_auth.rb new file mode 100644 index 000000000..7c2e47713 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_basic_auth.rb @@ -0,0 +1,92 @@ +require 'brakeman/checks/base_check' + +#Checks if password is stored in controller +#when using http_basic_authenticate_with +# +#Only for Rails >= 3.1 +class Brakeman::CheckBasicAuth < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for the use of http_basic_authenticate_with" + + def run_check + return if version_between? "0.0.0", "3.0.99" + + check_basic_auth_filter + check_basic_auth_request + end + + def check_basic_auth_filter + controllers = tracker.controllers.select do |_name, c| + c.options[:http_basic_authenticate_with] + end + + Hash[controllers].each do |name, controller| + controller.options[:http_basic_authenticate_with].each do |call| + + if pass = get_password(call) and string? pass + warn :controller => name, + :warning_type => "Basic Auth", + :warning_code => :basic_auth_password, + :message => "Basic authentication password stored in source code", + :code => call, + :confidence => :high, + :file => controller.file, + :cwe_id => [259] + break + end + end + end + end + + # Look for + # authenticate_or_request_with_http_basic do |username, password| + # username == "foo" && password == "bar" + # end + def check_basic_auth_request + tracker.find_call(:target => nil, :method => :authenticate_or_request_with_http_basic).each do |result| + if include_password_literal? result + warn :result => result, + :code => @include_password, + :warning_type => "Basic Auth", + :warning_code => :basic_auth_password, + :message => "Basic authentication password stored in source code", + :confidence => :high, + :cwe_id => [259] + end + end + end + + # Check if the block of a result contains a comparison of password to string + def include_password_literal? result + return false if result[:block_args].nil? + + @password_var = result[:block_args].last + @include_password = false + process result[:block] + @include_password + end + + # Looks for :== calls on password var + def process_call exp + target = exp.target + + if node_type?(target, :lvar) and + target.value == @password_var and + exp.method == :== and + string? exp.first_arg + + @include_password = exp + end + + exp + end + + def get_password call + arg = call.first_arg + + return false if arg.nil? or not hash? arg + + hash_access(arg, :password) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_basic_auth_timing_attack.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_basic_auth_timing_attack.rb new file mode 100644 index 000000000..8b74484ed --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_basic_auth_timing_attack.rb @@ -0,0 +1,34 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckBasicAuthTimingAttack < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for timing attack in basic auth (CVE-2015-7576)" + + def run_check + @upgrade = case + when version_between?("0.0.0", "3.2.22") + "3.2.22.1" + when version_between?("4.0.0", "4.1.14") + "4.1.14.1" + when version_between?("4.2.0", "4.2.5") + "4.2.5.1" + else + return + end + + check_basic_auth_call + end + + def check_basic_auth_call + tracker.find_call(target: nil, method: :http_basic_authenticate_with).each do |result| + warn :result => result, + :warning_type => "Timing Attack", + :warning_code => :CVE_2015_7576, + :message => msg("Basic authentication in ", msg_version(rails_version), " is vulnerable to timing attacks. Upgrade to ", msg_version(@upgrade)), + :confidence => :high, + :link => "https://groups.google.com/d/msg/rubyonrails-security/ANv0HDHEC3k/mt7wNGxbFQAJ", + :cwe_id => [1254] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_content_tag.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_content_tag.rb new file mode 100644 index 000000000..f25777bcf --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_content_tag.rb @@ -0,0 +1,218 @@ +require 'brakeman/checks/check_cross_site_scripting' + +#Checks for unescaped values in `content_tag` +# +# content_tag :tag, body +# ^-- Unescaped in Rails 2.x +# +# content_tag, :tag, body, attribute => value +# ^-- Unescaped in all versions +# +# content_tag, :tag, body, attribute => value +# ^ +# | +# Escaped by default, can be explicitly escaped +# or not by passing in (true|false) as fourth argument +class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting + Brakeman::Checks.add self + + @description = "Checks for XSS in calls to content_tag" + + def run_check + @ignore_methods = Set[:button_to, :check_box, :escapeHTML, :escape_once, + :field_field, :fields_for, :h, :hidden_field, + :hidden_field, :hidden_field_tag, :image_tag, :label, + :mail_to, :radio_button, :select, + :submit_tag, :text_area, :text_field, + :text_field_tag, :url_encode, :u, :url_for, + :will_paginate].merge tracker.options[:safe_methods] + + @known_dangerous = [] + @content_tags = tracker.find_call :target => false, :method => :content_tag + + @models = tracker.models.keys + @inspect_arguments = tracker.options[:check_arguments] + @mark = nil + + Brakeman.debug "Checking for XSS in content_tag" + @content_tags.each do |call| + process_result call + end + + check_cve_2016_6316 + end + + def process_result result + return if duplicate? result + + case result[:location][:type] + when :template + @current_template = result[:location][:template] + when :class + @current_class = result[:location][:class] + @current_method = result[:location][:method] + end + + @current_file = result[:location][:file] + + call = result[:call] + args = call.arglist + + tag_name = args[1] + content = args[2] + attributes = args[3] + escape_attr = args[4] + + @matched = false + + #Silly, but still dangerous if someone uses user input in the tag type + check_argument result, tag_name + + #Versions before 3.x do not escape body of tag, nor does the rails_xss gem + unless @matched or (tracker.options[:rails3] and not raw? content) + check_argument result, content + end + + # This changed in Rails 6.1.6 + if version_between? '0.0.0', '6.1.5' + #Attribute keys are never escaped, so check them for user input + if not @matched and hash? attributes and not request_value? attributes + hash_iterate(attributes) do |k, _v| + check_argument result, k + return if @matched + end + end + end + + #By default, content_tag escapes attribute values passed in as a hash. + #But this behavior can be disabled. So only check attributes hash + #if they are explicitly not escaped. + if not @matched and attributes and (false? escape_attr or cve_2016_6316?) + if request_value? attributes or not hash? attributes + check_argument result, attributes + else #check hash values + hash_iterate(attributes) do |_k, v| + check_argument result, v + return if @matched + end + end + end + ensure + @current_template = @current_class = @current_method = @current_file = nil + end + + def check_argument result, exp + #Check contents of raw() calls directly + if raw? exp + arg = process exp.first_arg + else + arg = process exp + end + + if input = has_immediate_user_input?(arg) + message = msg("Unescaped ", msg_input(input), " in ", msg_code("content_tag")) + + add_result result + + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :xss_content_tag, + :message => message, + :user_input => input, + :confidence => :high, + :link_path => "content_tag", + :cwe_id => [79] + + elsif not tracker.options[:ignore_model_output] and match = has_immediate_model?(arg) + unless IGNORE_MODEL_METHODS.include? match.method + add_result result + + if likely_model_attribute? match + confidence = :high + else + confidence = :medium + end + + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :xss_content_tag, + :message => msg("Unescaped model attribute in ", msg_code("content_tag")), + :user_input => match, + :confidence => confidence, + :link_path => "content_tag", + :cwe_id => [79] + end + + elsif @matched + return if @matched.type == :model and tracker.options[:ignore_model_output] + + message = msg("Unescaped ", msg_input(@matched), " in ", msg_code("content_tag")) + + add_result result + + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :xss_content_tag, + :message => message, + :user_input => @matched, + :confidence => :medium, + :link_path => "content_tag", + :cwe_id => [79] + end + end + + def process_call exp + if @mark + actually_process_call exp + else + @mark = true + actually_process_call exp + @mark = false + end + + exp + end + + def check_cve_2016_6316 + if cve_2016_6316? + confidence = if @content_tags.any? + :high + else + :medium + end + + fix_version = case + when version_between?("3.0.0", "3.2.22.3") + "3.2.22.4" + when version_between?("4.0.0", "4.2.7.0") + "4.2.7.1" + when version_between?("5.0.0", "5.0.0") + "5.0.0.1" + when (version.nil? and tracker.options[:rails3]) + "3.2.22.4" + when (version.nil? and tracker.options[:rails4]) + "4.2.7.2" + else + return + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2016_6316, + :message => msg(msg_version(rails_version), " ", msg_code("content_tag"), " does not escape double quotes in attribute values ", msg_cve("CVE-2016-6316"), ". Upgrade to ", msg_version(fix_version)), + :confidence => confidence, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/ruby-security-ann/8B2iV2tPRSE/JkjCJkSoCgAJ", + :cwe_id => [79] + end + end + + def raw? exp + call? exp and exp.method == :raw + end + + def cve_2016_6316? + version_between? "3.0.0", "3.2.22.3" or + version_between? "4.0.0", "4.2.7.0" or + version_between? "5.0.0", "5.0.0.0" + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_cookie_serialization.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_cookie_serialization.rb new file mode 100644 index 000000000..f159e0d11 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_cookie_serialization.rb @@ -0,0 +1,23 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckCookieSerialization < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for use of Marshal for cookie serialization" + + def run_check + tracker.find_call(target: :'Rails.application.config.action_dispatch', method: :cookies_serializer=).each do |result| + setting = result[:call].first_arg + + if symbol? setting and [:marshal, :hybrid].include? setting.value + warn :result => result, + :warning_type => "Remote Code Execution", + :warning_code => :unsafe_cookie_serialization, + :message => msg("Use of unsafe cookie serialization strategy ", msg_code(setting.value.inspect), " might lead to remote code execution"), + :confidence => :medium, + :link_path => "unsafe_deserialization", + :cwe_id => [565, 502] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_create_with.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_create_with.rb new file mode 100644 index 000000000..205a998b4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_create_with.rb @@ -0,0 +1,76 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckCreateWith < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for strong params bypass in CVE-2014-3514" + + def run_check + @warned = false + + if version_between? "4.0.0", "4.0.8" + suggested_version = "4.0.9" + elsif version_between? "4.1.0", "4.1.4" + suggested_version = "4.1.5" + else + return + end + + @message = msg(msg_code("create_with"), " is vulnerable to strong params bypass. Upgrade to ", msg_version(suggested_version), " or patch") + + tracker.find_call(:method => :create_with, :nested => true).each do |result| + process_result result + end + + generic_warning unless @warned + end + + def process_result result + return unless original? result + arg = result[:call].first_arg + + confidence = danger_level arg + + if confidence + @warned = true + + warn :warning_type => "Mass Assignment", + :warning_code => :CVE_2014_3514_call, + :result => result, + :message => @message, + :confidence => confidence, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/M4chq5Sb540/CC1Fh0Y_NWwJ", + :cwe_id => [915] + end + end + + #For a given create_with call, set confidence level. + #Ignore calls that use permit() + def danger_level exp + return unless sexp? exp + + if call? exp and exp.method == :permit + nil + elsif request_value? exp + :high + elsif hash? exp + nil + elsif has_immediate_user_input?(exp) + :high + elsif include_user_input? exp + :medium + else + :weak + end + end + + def generic_warning + warn :warning_type => "Mass Assignment", + :warning_code => :CVE_2014_3514, + :message => @message, + :gem_info => gemfile_or_environment, + :confidence => :medium, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/M4chq5Sb540/CC1Fh0Y_NWwJ", + :cwe_id => [915] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_cross_site_scripting.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_cross_site_scripting.rb new file mode 100644 index 000000000..40bf05c75 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_cross_site_scripting.rb @@ -0,0 +1,389 @@ +require 'brakeman/checks/base_check' +require 'brakeman/processors/lib/find_call' +require 'brakeman/processors/lib/processor_helper' +require 'brakeman/util' +require 'set' + +#This check looks for unescaped output in templates which contains +#parameters or model attributes. +# +#For example: +# +# <%= User.find(:id).name %> +# <%= params[:id] %> +class Brakeman::CheckCrossSiteScripting < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for unescaped output in views" + + #Model methods which are known to be harmless + IGNORE_MODEL_METHODS = Set[:average, :count, :maximum, :minimum, :sum, :id] + + MODEL_METHODS = Set[:all, :find, :first, :last, :new] + + IGNORE_LIKE = /^link_to_|(_path|_tag|_url)$/ + + HAML_HELPERS = Sexp.new(:colon2, Sexp.new(:const, :Haml), :Helpers) + + XML_HELPER = Sexp.new(:colon2, Sexp.new(:const, :Erubis), :XmlHelper) + + URI = Sexp.new(:const, :URI) + + CGI = Sexp.new(:const, :CGI) + + FORM_BUILDER = Sexp.new(:call, Sexp.new(:const, :FormBuilder), :new) + + def initialize *args + super + @matched = @mark = false + end + + #Run check + def run_check + setup + + tracker.each_template do |name, template| + Brakeman.debug "Checking #{name} for XSS" + + @current_template = template + + template.each_output do |out| + unless check_for_immediate_xss out + @matched = false + @mark = false + process out + end + end + end + end + + def check_for_immediate_xss exp + return :duplicate if duplicate? exp + + if exp.node_type == :output + out = exp.value + end + + if raw_call? exp + out = exp.value.first_arg + elsif html_safe_call? exp + out = exp.value.target + end + + return if call? out and ignore_call? out.target, out.method + + if input = has_immediate_user_input?(out) + add_result exp + + message = msg("Unescaped ", msg_input(input)) + + warn :template => @current_template, + :warning_type => "Cross-Site Scripting", + :warning_code => :cross_site_scripting, + :message => message, + :code => input.match, + :confidence => :high, + :cwe_id => [79] + + elsif not tracker.options[:ignore_model_output] and match = has_immediate_model?(out) + method = if call? match + match.method + else + nil + end + + unless IGNORE_MODEL_METHODS.include? method + add_result exp + + if likely_model_attribute? match + confidence = :high + else + confidence = :medium + end + + message = "Unescaped model attribute" + link_path = "cross_site_scripting" + warning_code = :cross_site_scripting + + if node_type?(out, :call, :safe_call, :attrasgn, :safe_attrasgn) && out.method == :to_json + message += " in JSON hash" + link_path += "_to_json" + warning_code = :xss_to_json + end + + warn :template => @current_template, + :warning_type => "Cross-Site Scripting", + :warning_code => warning_code, + :message => message, + :code => match, + :confidence => confidence, + :link_path => link_path, + :cwe_id => [79] + end + + else + false + end + end + + #Call already involves a model, but might not be acting on a record + def likely_model_attribute? exp + return false unless call? exp + + method = exp.method + + if MODEL_METHODS.include? method or method.to_s.start_with? "find_by_" + true + else + likely_model_attribute? exp.target + end + end + + #Process an output Sexp + def process_output exp + process exp.value.dup + end + + #Look for calls to raw() + #Otherwise, ignore + def process_escaped_output exp + unless check_for_immediate_xss exp + if not duplicate? exp + if raw_call? exp + process exp.value.first_arg + elsif html_safe_call? exp + process exp.value.target + end + end + end + exp + end + + #Check a call for user input + # + # + #Since we want to report an entire call and not just part of one, use @mark + #to mark when a call is started. Any dangerous values inside will then + #report the entire call chain. + def process_call exp + if @mark + actually_process_call exp + else + @mark = true + actually_process_call exp + message = nil + + if @matched + unless @matched.type and tracker.options[:ignore_model_output] + message = msg("Unescaped ", msg_input(@matched)) + end + + if message and not duplicate? exp + add_result exp + + link_path = "cross_site_scripting" + warning_code = :cross_site_scripting + + if @known_dangerous.include? exp.method + confidence = :high + if exp.method == :to_json + message << msg_plain(" in JSON hash") + link_path += "_to_json" + warning_code = :xss_to_json + end + else + confidence = :weak + end + + warn :template => @current_template, + :warning_type => "Cross-Site Scripting", + :warning_code => warning_code, + :message => message, + :code => exp, + :user_input => @matched, + :confidence => confidence, + :link_path => link_path, + :cwe_id => [79] + end + end + + @mark = @matched = false + end + + exp + end + + def actually_process_call exp + return if @matched + target = exp.target + if sexp? target + target = process target + end + + method = exp.method + + #Ignore safe items + if ignore_call? target, method + @matched = false + elsif sexp? target and model_name? target[1] #TODO: use method call? + @matched = Match.new(:model, exp) + elsif cookies? exp + @matched = Match.new(:cookies, exp) + elsif @inspect_arguments and params? exp + @matched = Match.new(:params, exp) + elsif @inspect_arguments + process_call_args exp + end + end + + #Note that params have been found + def process_params exp + @matched = Match.new(:params, exp) + exp + end + + #Note that cookies have been found + def process_cookies exp + @matched = Match.new(:cookies, exp) + exp + end + + #Ignore calls to render + def process_render exp + exp + end + + #Process as default + def process_dstr exp + process_default exp + end + + #Process as default + def process_format exp + process_default exp + end + + #Ignore output HTML escaped via HAML + def process_format_escaped exp + exp + end + + #Ignore condition in if Sexp + def process_if exp + process exp.then_clause if sexp? exp.then_clause + process exp.else_clause if sexp? exp.else_clause + exp + end + + def process_case exp + #Ignore user input in case value + #TODO: also ignore when values + + current = 2 + while current < exp.length + process exp[current] if exp[current] + current += 1 + end + + exp + end + + def setup + @ignore_methods = Set[:==, :!=, :button_to, :check_box, :content_tag, :escapeHTML, :escape_once, + :field_field, :fields_for, :form_for, :h, :hidden_field, + :hidden_field, :hidden_field_tag, :image_tag, :label, + :link_to, :mail_to, :radio_button, :select, + :submit_tag, :text_area, :text_field, + :text_field_tag, :url_encode, :u, :url_for, + :will_paginate].merge tracker.options[:safe_methods] + + @models = tracker.models.keys + @inspect_arguments = tracker.options[:check_arguments] + + @known_dangerous = Set[:truncate, :concat] + + if version_between? "2.0.0", "3.0.5" + @known_dangerous << :auto_link + elsif version_between? "3.0.6", "3.0.99" + @ignore_methods << :auto_link + end + + if version_between? "2.0.0", "2.3.14" or tracker.config.gem_version(:'rails-html-sanitizer') == '1.0.2' + @known_dangerous << :strip_tags + end + + if tracker.config.has_gem? :'rails-html-sanitizer' and + version_between? "1.0.0", "1.0.2", tracker.config.gem_version(:'rails-html-sanitizer') + + @known_dangerous << :sanitize + end + + json_escape_on = false + initializers = tracker.find_call(target: :ActiveSupport, method: :escape_html_entities_in_json=) + initializers.each {|result| json_escape_on = true?(result[:call].first_arg) } + + if tracker.config.escape_html_entities_in_json? + json_escape_on = true + elsif version_between? "4.0.0", "9.9.9" + json_escape_on = true + end + + if !json_escape_on or version_between? "0.0.0", "2.0.99" + @known_dangerous << :to_json + Brakeman.debug("Automatic to_json escaping not enabled, consider to_json dangerous") + else + @safe_input_attributes << :to_json + Brakeman.debug("Automatic to_json escaping is enabled.") + end + end + + def raw_call? exp + exp.value.node_type == :call and exp.value.method == :raw + end + + def html_safe_call? exp + call? exp.value and exp.value.method == :html_safe + end + + def ignore_call? target, method + ignored_method?(target, method) or + safe_input_attribute?(target, method) or + ignored_model_method?(target, method) or + form_builder_method?(target, method) or + haml_escaped?(target, method) or + boolean_method?(method) or + cgi_escaped?(target, method) or + xml_escaped?(target, method) + end + + def ignored_model_method? target, method + ((@matched and @matched.type == :model) or + model_name? target) and + IGNORE_MODEL_METHODS.include? method + end + + def ignored_method? target, method + @ignore_methods.include? method or method.to_s =~ IGNORE_LIKE + end + + def cgi_escaped? target, method + method == :escape and + (target == URI or target == CGI) + end + + def haml_escaped? target, method + method == :html_escape and target == HAML_HELPERS + end + + def xml_escaped? target, method + method == :escape_xml and target == XML_HELPER + end + + def form_builder_method? target, method + target == FORM_BUILDER and @ignore_methods.include? method + end + + def safe_input_attribute? target, method + target and always_safe_method? method + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_csrf_token_forgery_cve.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_csrf_token_forgery_cve.rb new file mode 100644 index 000000000..0da17596d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_csrf_token_forgery_cve.rb @@ -0,0 +1,29 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckCSRFTokenForgeryCVE < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for versions with CSRF token forgery vulnerability (CVE-2020-8166)" + + def run_check + fix_version = case + when version_between?('0.0.0', '5.2.4.2') + '5.2.4.3' + when version_between?('6.0.0', '6.0.3') + '6.0.3.1' + else + nil + end + + if fix_version + warn :warning_type => "Cross-Site Request Forgery", + :warning_code => :CVE_2020_8166, + :message => msg(msg_version(rails_version), " has a vulnerability that may allow CSRF token forgery. Upgrade to ", msg_version(fix_version), " or patch"), + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link => "https://groups.google.com/g/rubyonrails-security/c/NOjKiGeXUgw", + :cwe_id => [352] + end + end +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_default_routes.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_default_routes.rb new file mode 100644 index 000000000..dfb70de62 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_default_routes.rb @@ -0,0 +1,94 @@ +require 'brakeman/checks/base_check' + +#Checks if default routes are allowed in routes.rb +class Brakeman::CheckDefaultRoutes < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for default routes" + + def initialize *args + super + @actions_allowed_on_controller = nil + end + + #Checks for :allow_all_actions globally and for individual routes + #if it is not enabled globally. + def run_check + check_for_default_routes + check_for_action_globs + check_for_cve_2014_0130 + end + + def check_for_default_routes + if allow_all_actions? + #Default routes are enabled globally + warn :warning_type => "Default Routes", + :warning_code => :all_default_routes, + :message => msg("All public methods in controllers are available as actions in ", msg_file("routes.rb")), + :line => tracker.routes[:allow_all_actions].line, + :confidence => :high, + :file => "#{tracker.app_path}/config/routes.rb", + :cwe_id => [22] + end + end + + def check_for_action_globs + return if allow_all_actions? + Brakeman.debug "Checking each controller for default routes" + + tracker.routes.each do |name, actions| + if actions.is_a? Array and actions[0] == :allow_all_actions + @actions_allowed_on_controller = true + if actions[1].is_a? Hash and actions[1][:allow_verb] + verb = actions[1][:allow_verb] + else + verb = "any" + end + warn :controller => name, + :warning_type => "Default Routes", + :warning_code => :controller_default_routes, + :message => msg("Any public method in ", msg_code(name), " can be used as an action for ", msg_code(verb), " requests."), + :line => actions[2], + :confidence => :medium, + :file => "#{tracker.app_path}/config/routes.rb", + :cwe_id => [22] + end + end + end + + def check_for_cve_2014_0130 + case + when lts_version?("2.3.18.9") + #TODO: Should support LTS 3.0.20 too + return + when version_between?("2.0.0", "2.3.18") + upgrade = "3.2.18" + when version_between?("3.0.0", "3.2.17") + upgrade = "3.2.18" + when version_between?("4.0.0", "4.0.4") + upgrade = "4.0.5" + when version_between?("4.1.0", "4.1.0") + upgrade = "4.1.1" + else + return + end + + if allow_all_actions? or @actions_allowed_on_controller + confidence = :high + else + confidence = :medium + end + + warn :warning_type => "Remote Code Execution", + :warning_code => :CVE_2014_0130, + :message => msg(msg_version(rails_version), " with globbing routes is vulnerable to directory traversal and remote code execution. Patch or upgrade to ", msg_version(upgrade)), + :confidence => confidence, + :file => "#{tracker.app_path}/config/routes.rb", + :link => "http://matasano.com/research/AnatomyOfRailsVuln-CVE-2014-0130.pdf", + :cwe_id => [22] + end + + def allow_all_actions? + tracker.routes[:allow_all_actions] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_deserialize.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_deserialize.rb new file mode 100644 index 000000000..29692227f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_deserialize.rb @@ -0,0 +1,129 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckDeserialize < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for unsafe deserialization of objects" + + def run_check + check_yaml + check_csv + check_marshal + check_oj + end + + def check_yaml + check_methods :YAML, :load_documents, :load_stream, :parse_documents, :parse_stream + + # Check for safe_yaml gem use with YAML.load(..., safe: true) + if uses_safe_yaml? + tracker.find_call(target: :YAML, method: :load).each do |result| + call = result[:call] + options = call.second_arg + + if hash? options and true? hash_access(options, :safe) + next + else + check_deserialize result, :YAML + end + end + else + check_methods :YAML, :load + end + end + + def check_csv + check_methods :CSV, :load + end + + def check_marshal + check_methods :Marshal, :load, :restore + end + + def check_oj + check_methods :Oj, :object_load # Always unsafe, regardless of mode + + unsafe_mode = :object + safe_default = oj_safe_default? + + tracker.find_call(:target => :Oj, :method => :load).each do |result| + call = result[:call] + options = call.second_arg + + if options and hash? options and mode = hash_access(options, :mode) + if symbol? mode and mode.value == unsafe_mode + check_deserialize result, :Oj + end + elsif not safe_default + check_deserialize result, :Oj + end + end + end + + def check_methods target, *methods + tracker.find_call(:target => target, :methods => methods ).each do |result| + check_deserialize result, target + end + end + + def check_deserialize result, target, arg = nil + return unless original? result + + arg ||= result[:call].first_arg + method = result[:call].method + + if input = has_immediate_user_input?(arg) + confidence = :high + elsif input = include_user_input?(arg) + confidence = :medium + elsif target == :Marshal + confidence = :low + message = msg("Use of ", msg_code("#{target}.#{method}"), " may be dangerous") + end + + if confidence + message ||= msg(msg_code("#{target}.#{method}"), " called with ", msg_input(input)) + + warn :result => result, + :warning_type => "Remote Code Execution", + :warning_code => :unsafe_deserialize, + :message => message, + :user_input => input, + :confidence => confidence, + :link_path => "unsafe_deserialization", + :cwe_id => [502] + end + end + + private + + def oj_safe_default? + safe_default = false + + if tracker.find_call(target: :Oj, method: :mimic_JSON).any? + safe_default = true + elsif result = tracker.find_call(target: :Oj, method: :default_options=).first + options = result[:call].first_arg + + if oj_safe_mode? options + safe_default = true + end + end + + safe_default + end + + def oj_safe_mode? options + if hash? options and mode = hash_access(options, :mode) + if symbol? mode and mode != :object + return true + end + end + + false + end + + def uses_safe_yaml? + tracker.config.has_gem? :safe_yaml + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_detailed_exceptions.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_detailed_exceptions.rb new file mode 100644 index 000000000..6950c8b6a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_detailed_exceptions.rb @@ -0,0 +1,57 @@ +require 'brakeman/checks/base_check' + +# Check for detailed exceptions enabled for production +class Brakeman::CheckDetailedExceptions < Brakeman::BaseCheck + Brakeman::Checks.add self + + LOCAL_REQUEST = s(:call, s(:call, nil, :request), :local?) + + @description = "Checks for information disclosure displayed via detailed exceptions" + + def run_check + check_local_request_config + check_detailed_exceptions + end + + def check_local_request_config + if true? tracker.config.rails[:consider_all_requests_local] + warn :warning_type => "Information Disclosure", + :warning_code => :local_request_config, + :message => "Detailed exceptions are enabled in production", + :confidence => :high, + :file => "config/environments/production.rb", + :cwe_id => [200] + end + end + + def check_detailed_exceptions + tracker.controllers.each do |_name, controller| + controller.methods_public.each do |method_name, definition| + src = definition.src + body = src.body.last + next unless body + + if method_name == :show_detailed_exceptions? and not safe? body + if true? body + confidence = :high + else + confidence = :medium + end + + warn :warning_type => "Information Disclosure", + :warning_code => :detailed_exceptions, + :message => msg("Detailed exceptions may be enabled in ", msg_code("show_detailed_exceptions?")), + :confidence => confidence, + :code => src, + :file => definition[:file], + :cwe_id => [200] + end + end + end + end + + def safe? body + false? body or + body == LOCAL_REQUEST + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_digest_dos.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_digest_dos.rb new file mode 100644 index 000000000..3fce7bcae --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_digest_dos.rb @@ -0,0 +1,39 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckDigestDoS < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for digest authentication DoS vulnerability" + + def run_check + message = msg("Vulnerability in digest authentication ", msg_cve("CVE-2012-3424"), ". Upgrade to ") + + if version_between? "3.0.0", "3.0.15" + message << msg_version("3.0.16") + elsif version_between? "3.1.0", "3.1.6" + message << msg_version("3.1.7") + elsif version_between? "3.2.0", "3.2.5" + message << msg_version("3.2.7") + else + return + end + + if with_http_digest? + confidence = :high + else + confidence = :weak + end + + warn :warning_type => "Denial of Service", + :warning_code => :CVE_2012_3424, + :message => message, + :confidence => confidence, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/vxJjrc15qYM/discussion", + :gem_info => gemfile_or_environment, + :cwe_id => [287] + end + + def with_http_digest? + not tracker.find_call(:target => false, :method => [:authenticate_or_request_with_http_digest, :authenticate_with_http_digest]).empty? + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_divide_by_zero.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_divide_by_zero.rb new file mode 100644 index 000000000..d5c168334 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_divide_by_zero.rb @@ -0,0 +1,43 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckDivideByZero < Brakeman::BaseCheck + Brakeman::Checks.add_optional self + + @description = "Warns on potential division by zero" + + def run_check + tracker.find_call(:method => :"/").each do |result| + check_division result + end + end + + def check_division result + return unless original? result + + call = result[:call] + + denominator = call.first_arg + + if number? denominator and denominator.value == 0 + numerator = call.target + + if number? numerator + if numerator.value.is_a? Float + return # 0.0 / 0 is NaN and 1.0 / 0 is Infinity + else + confidence = :medium + end + else + confidence = :weak + end + + warn :result => result, + :warning_type => "Divide by Zero", + :warning_code => :divide_by_zero, + :message => "Potential division by zero", + :confidence => confidence, + :user_input => denominator, + :cwe_id => [369] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_dynamic_finders.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_dynamic_finders.rb new file mode 100644 index 000000000..a297b0f54 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_dynamic_finders.rb @@ -0,0 +1,49 @@ +require 'brakeman/checks/base_check' + +#This check looks for regexes that include user input. +class Brakeman::CheckDynamicFinders < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check unsafe usage of find_by_*" + + def run_check + if tracker.config.has_gem? :mysql and version_between? '2.0.0', '4.1.99' + tracker.find_call(:method => /^find_by_/).each do |result| + process_result result + end + end + end + + def process_result result + return unless original? result + + call = result[:call] + + if potentially_dangerous? call.method + call.each_arg do |arg| + if params? arg and not safe_call? arg + warn :result => result, + :warning_type => "SQL Injection", + :warning_code => :sql_injection_dynamic_finder, + :message => "MySQL integer conversion may cause 0 to match any string", + :confidence => :medium, + :user_input => arg, + :cwe_id => [89] + + break + end + end + end + end + + def safe_call? arg + return false unless call? arg + + meth = arg.method + meth == :to_s or meth == :to_i + end + + def potentially_dangerous? method_name + method_name.match(/^find_by_.*(token|guid|password|api_key|activation|code|private|reset)/) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_eol_rails.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_eol_rails.rb new file mode 100644 index 000000000..57e6d3898 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_eol_rails.rb @@ -0,0 +1,30 @@ +require_relative 'eol_check' + +class Brakeman::CheckEOLRails < Brakeman::EOLCheck + Brakeman::Checks.add self + + @description = "Checks for unsupported versions of Rails" + + def run_check + return unless tracker.config.rails_version + + check_eol_version :rails, RAILS_EOL_DATES + end + + # https://rubyonrails.org/maintenance + # https://endoflife.date/rails + RAILS_EOL_DATES = { + ['2.0.0', '2.3.99'] => Date.new(2013, 6, 25), + ['3.0.0', '3.2.99'] => Date.new(2016, 6, 30), + ['4.0.0', '4.2.99'] => Date.new(2017, 4, 27), + ['5.0.0', '5.0.99'] => Date.new(2018, 5, 9), + ['5.1.0', '5.1.99'] => Date.new(2019, 8, 25), + ['5.2.0', '5.2.99'] => Date.new(2022, 6, 1), + ['6.0.0', '6.0.99'] => Date.new(2023, 6, 1), + ['6.1.0', '6.1.99'] => Date.new(2024, 10, 1), + ['7.0.0', '7.0.99'] => Date.new(2025, 4, 1), + ['7.1.0', '7.1.99'] => Date.new(2025, 10, 1), + ['7.2.0', '7.2.99'] => Date.new(2026, 8, 9), + ['8.0.0', '8.0.99'] => Date.new(2026, 10, 7), + } +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_eol_ruby.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_eol_ruby.rb new file mode 100644 index 000000000..643347ced --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_eol_ruby.rb @@ -0,0 +1,30 @@ +require_relative 'eol_check' + +class Brakeman::CheckEOLRuby < Brakeman::EOLCheck + Brakeman::Checks.add self + + @description = "Checks for unsupported versions of Ruby" + + def run_check + return unless tracker.config.ruby_version + + check_eol_version :ruby, RUBY_EOL_DATES + end + + RUBY_EOL_DATES = { + ['0.0.0', '1.9.3'] => Date.new(2015, 2, 23), + ['2.0.0', '2.0.99'] => Date.new(2016, 2, 24), + ['2.1.0', '2.1.99'] => Date.new(2017, 3, 31), + ['2.2.0', '2.2.99'] => Date.new(2018, 3, 31), + ['2.3.0', '2.3.99'] => Date.new(2019, 3, 31), + ['2.4.0', '2.4.99'] => Date.new(2020, 3, 31), + ['2.5.0', '2.5.99'] => Date.new(2021, 3, 31), + ['2.6.0', '2.6.99'] => Date.new(2022, 3, 31), + ['2.7.0', '2.7.99'] => Date.new(2023, 3, 31), + ['3.0.0', '3.0.99'] => Date.new(2024, 3, 31), + ['3.1.0', '3.1.99'] => Date.new(2025, 3, 31), + ['3.2.0', '3.2.99'] => Date.new(2026, 3, 31), + ['3.3.0', '3.3.99'] => Date.new(2027, 3, 31), + ['3.4.0', '3.4.99'] => Date.new(2028, 3, 31), + } +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_escape_function.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_escape_function.rb new file mode 100644 index 000000000..e212d737d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_escape_function.rb @@ -0,0 +1,22 @@ +require 'brakeman/checks/base_check' + +#Check for versions with vulnerable html escape method +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/56bffb5923ab1195 +class Brakeman::CheckEscapeFunction < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for versions before 2.3.14 which have a vulnerable escape method" + + def run_check + if version_between?('2.0.0', '2.3.13') and RUBY_VERSION < '1.9.0' + + warn :warning_type => 'Cross-Site Scripting', + :warning_code => :CVE_2011_2932, + :message => msg("Rails versions before 2.3.14 have a vulnerability in the ", msg_code("escape"), " method when used with Ruby 1.8 ", msg_cve("CVE-2011-2932")), + :confidence => :high, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/Vr_7WSOrEZU/discussion", + :cwe_id => [79] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_evaluation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_evaluation.rb new file mode 100644 index 000000000..e8be6f4ad --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_evaluation.rb @@ -0,0 +1,72 @@ +require 'brakeman/checks/base_check' + +#This check looks for calls to +eval+, +instance_eval+, etc. which include +#user input. +class Brakeman::CheckEvaluation < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Searches for evaluation of user input" + + #Process calls + def run_check + Brakeman.debug "Finding eval-like calls" + calls = tracker.find_call methods: [:eval, :instance_eval, :class_eval, :module_eval], nested: true + + Brakeman.debug "Processing eval-like calls" + calls.each do |call| + process_result call + end + end + + #Warns if eval includes user input + def process_result result + return unless original? result + + first_arg = result[:call].first_arg + + unless safe_value? first_arg + if input = include_user_input?(first_arg) + confidence = :high + message = msg(msg_input(input), " evaluated as code") + elsif string_evaluation? first_arg + confidence = :low + message = "Dynamic string evaluated as code" + elsif result[:call].method == :eval + confidence = :low + message = "Dynamic code evaluation" + end + + if confidence + warn :result => result, + :warning_type => "Dangerous Eval", + :warning_code => :code_eval, + :message => message, + :user_input => input, + :confidence => confidence, + :cwe_id => [913, 95] + end + end + end + + def string_evaluation? exp + string_interp? exp or + (call? exp and string? exp.target) + end + + def safe_value? exp + return true unless sexp? exp + + case exp.sexp_type + when :dstr + exp.all? { |e| safe_value? e} + when :evstr + safe_value? exp.value + when :str, :lit + true + when :call + always_safe_method? exp.method + else + false + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_execute.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_execute.rb new file mode 100644 index 000000000..a2484b7e0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_execute.rb @@ -0,0 +1,310 @@ +require 'brakeman/checks/base_check' + +#Checks for string interpolation and parameters in calls to +#Kernel#system, Kernel#exec, Kernel#syscall, and inside backticks. +# +#Examples of command injection vulnerabilities: +# +# system("rf -rf #{params[:file]}") +# exec(params[:command]) +# `unlink #{params[:something}` +class Brakeman::CheckExecute < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Finds instances of possible command injection" + + SAFE_VALUES = [s(:const, :RAILS_ROOT), + s(:call, s(:const, :Rails), :root), + s(:call, s(:const, :Rails), :env), + s(:call, s(:const, :Process), :pid)] + + SHELL_ESCAPE_MODULE_METHODS = Set[:escape, :join, :shellescape, :shelljoin] + SHELL_ESCAPE_MIXIN_METHODS = Set[:shellescape, :shelljoin] + + # These are common shells that are known to allow the execution of commands + # via a -c flag. See dash_c_shell_command? for more info. + KNOWN_SHELL_COMMANDS = Set["sh", "bash", "ksh", "csh", "tcsh", "zsh"] + + SHELLWORDS = s(:const, :Shellwords) + + #Check models, controllers, and views for command injection. + def run_check + Brakeman.debug "Finding system calls using ``" + check_for_backticks tracker + + check_open_calls + + Brakeman.debug "Finding other system calls" + calls = tracker.find_call :targets => [:IO, :Open3, :Kernel, :'POSIX::Spawn', :Process, nil], + :methods => [:capture2, :capture2e, :capture3, :exec, :pipeline, :pipeline_r, + :pipeline_rw, :pipeline_start, :pipeline_w, :popen, :popen2, :popen2e, + :popen3, :spawn, :syscall, :system], :nested => true + + Brakeman.debug "Processing system calls" + calls.each do |result| + process_result result + end + end + + private + + #Processes results from Tracker#find_call. + def process_result result + call = result[:call] + args = call.arglist + first_arg = call.first_arg + failure = nil + + case call.method + when :popen + # Normally, if we're in a `popen` call, we only are worried about shell + # injection when the argument is not an array, because array elements + # are always escaped by Ruby. However, an exception is when the array + # contains two values are something like "bash -c" because then the third + # element is effectively the command being run and might be a malicious + # executable if it comes (partially or fully) from user input. + if !array?(first_arg) + failure = include_user_input?(first_arg) || + dangerous_interp?(first_arg) || + dangerous_string_building?(first_arg) + elsif dash_c_shell_command?(first_arg[1], first_arg[2]) + failure = include_user_input?(first_arg[3]) || + dangerous_interp?(first_arg[3]) || + dangerous_string_building?(first_arg[3]) + end + when :pipeline, :pipline_r, :pipeline_rw, :pipeline_w, :pipeline_start + # Since these pipeline commands pipe together several commands, + # need to check each argument. If it's an array, check first argument + # (the command) and also check for `bash -c`. Otherwise check the argument + # as a unit. + + args.each do |arg| + next unless sexp? arg + + if array?(arg) + # Check first element of array + failure = include_user_input?(arg[1]) || + dangerous_interp?(arg[1]) || + dangerous_string_building?(arg[1]) + + # Check for ['bash', '-c', user_input] + if dash_c_shell_command?(arg[1], arg[2]) + failure = include_user_input?(arg[3]) || + dangerous_interp?(arg[3]) || + dangerous_string_building?(arg[3]) + end + else + failure = include_user_input?(arg) + end + + break if failure + end + when :system, :exec + # Normally, if we're in a `system` or `exec` call, we only are worried + # about shell injection when there's a single argument, because comma- + # separated arguments are always escaped by Ruby. However, an exception is + # when the first two arguments are something like "bash -c" because then + # the third argument is effectively the command being run and might be + # a malicious executable if it comes (partially or fully) from user input. + if dash_c_shell_command?(first_arg, call.second_arg) + failure = include_user_input?(args[3]) || + dangerous_interp?(args[3]) || + dangerous_string_building?(args[3]) + else + failure = include_user_input?(first_arg) || + dangerous_interp?(first_arg) || + dangerous_string_building?(first_arg) + end + when :capture2, :capture2e, :capture3 + # Open3 capture methods can take a :stdin_data argument which is used as the + # the input to the called command so it is not succeptable to command injection. + # As such if the last argument is a hash (and therefore execution options) it + # should be ignored + + args.pop if hash?(args.last) && args.length > 2 + failure = include_user_input?(args) || + dangerous_interp?(args) || + dangerous_string_building?(args) + else + failure = include_user_input?(args) || + dangerous_interp?(args) || + dangerous_string_building?(args) + end + + if failure and original? result + + if failure.type == :interp #Not from user input + confidence = :medium + else + confidence = :high + end + + warn :result => result, + :warning_type => "Command Injection", + :warning_code => :command_injection, + :message => "Possible command injection", + :code => call, + :user_input => failure, + :confidence => confidence, + :cwe_id => [77] + end + end + + # @return [Boolean] true iff the command given by `first_arg`, `second_arg` + # invokes a new shell process via `<shell_command> -c` (like `bash -c`) + def dash_c_shell_command?(first_arg, second_arg) + string?(first_arg) && + KNOWN_SHELL_COMMANDS.include?(first_arg.value) && + string?(second_arg) && + second_arg.value == "-c" + end + + def check_open_calls + tracker.find_call(:targets => [nil, :Kernel], :method => :open).each do |result| + if match = dangerous_open_arg?(result[:call].first_arg) + warn :result => result, + :warning_type => "Command Injection", + :warning_code => :command_injection, + :message => msg("Possible command injection in ", msg_code("open")), + :user_input => match, + :confidence => :high, + :cwe_id => [77] + end + end + end + + def include_user_input? exp + if node_type? exp, :arglist, :dstr, :evstr, :dxstr + exp.each_sexp do |e| + if res = include_user_input?(e) + return res + end + end + + false + else + if shell_escape? exp + false + else + super exp + end + end + end + + def dangerous_open_arg? exp + if string_interp? exp + # Check for input at start of string + exp[1] == "" and + node_type? exp[2], :evstr and + has_immediate_user_input? exp[2] + else + has_immediate_user_input? exp + end + end + + #Looks for calls using backticks such as + # + # `rm -rf #{params[:file]}` + def check_for_backticks tracker + tracker.find_call(:target => nil, :method => :`).each do |result| + process_backticks result + end + end + + #Processes backticks. + def process_backticks result + return unless original? result + + exp = result[:call] + + if input = include_user_input?(exp) + confidence = :high + elsif input = dangerous?(exp) + confidence = :medium + else + return + end + + warn :result => result, + :warning_type => "Command Injection", + :warning_code => :command_injection, + :message => "Possible command injection", + :code => exp, + :user_input => input, + :confidence => confidence, + :cwe_id => [77] + end + + # This method expects a :dstr or :evstr node + def dangerous? exp + exp.each_sexp do |e| + if call? e and e.method == :to_s + e = e.target + end + + next if node_type? e, :lit, :str + next if SAFE_VALUES.include? e + next if shell_escape? e + next if temp_file_path? e + + if node_type? e, :if + # If we're in a conditional, evaluate the `then` and `else` clauses to + # see if they're dangerous. + if res = dangerous?(e.sexp_body.sexp_body) + return res + end + elsif node_type? e, :or, :evstr, :dstr + if res = dangerous?(e) + return res + end + else + return e + end + end + + false + end + + def dangerous_interp? exp + match = include_interp? exp + return unless match + interp = match.match + + interp.each_sexp do |e| + if res = dangerous?(e) + return Match.new(:interp, res) + end + end + + false + end + + #Checks if an expression contains string interpolation. + # + #Returns Match with :interp type if found. + def include_interp? exp + @string_interp = false + process exp + @string_interp + end + + def dangerous_string_building? exp + if string_building?(exp) && res = dangerous?(exp) + return Match.new(:interp, res) + end + + false + end + + def shell_escape? exp + return false unless call? exp + + if exp.target == SHELLWORDS and SHELL_ESCAPE_MODULE_METHODS.include? exp.method + true + elsif SHELL_ESCAPE_MIXIN_METHODS.include?(exp.method) + true + else + false + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_file_access.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_file_access.rb new file mode 100644 index 000000000..40a97d267 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_file_access.rb @@ -0,0 +1,88 @@ +require 'brakeman/checks/base_check' +require 'brakeman/processors/lib/processor_helper' + +#Checks for user input in methods which open or manipulate files +class Brakeman::CheckFileAccess < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Finds possible file access using user input" + + def run_check + Brakeman.debug "Finding possible file access" + methods = tracker.find_call :targets => [:Dir, :File, :IO, :Kernel, :"Net::FTP", :"Net::HTTP", :PStore, :Pathname, :Shell], :methods => [:[], :chdir, :chroot, :delete, :entries, :foreach, :glob, :install, :lchmod, :lchown, :link, :load, :load_file, :makedirs, :move, :new, :open, :read, :readlines, :rename, :rmdir, :safe_unlink, :symlink, :syscopy, :sysopen, :truncate, :unlink] + + methods.concat tracker.find_call :target => :YAML, :methods => [:load_file, :parse_file] + methods.concat tracker.find_call :target => nil, :method => [:open] + + Brakeman.debug "Finding calls to load()" + methods.concat tracker.find_call :target => false, :method => :load + + Brakeman.debug "Finding calls using FileUtils" + methods.concat tracker.find_call :target => :FileUtils + + Brakeman.debug "Processing found calls" + methods.each do |call| + process_result call + end + end + + def process_result result + return unless original? result + call = result[:call] + + file_name = call.first_arg + + return if called_on_tempfile?(file_name) || sanitized?(file_name) + + if match = has_immediate_user_input?(file_name) + confidence = :high + elsif match = has_immediate_model?(file_name) + match = Match.new(:model, match) + confidence = :medium + elsif tracker.options[:check_arguments] and + match = include_user_input?(file_name) + + #Check for string building in file name + if call?(file_name) and (file_name.method == :+ or file_name.method == :<<) + confidence = :high + else + confidence = :weak + end + end + + if match and not temp_file_method? match.match + + message = msg(msg_input(match), " used in file name") + + warn :result => result, + :warning_type => "File Access", + :warning_code => :file_access, + :message => message, + :confidence => confidence, + :code => call, + :user_input => match, + :cwe_id => [22] + end + end + + # When using Tempfile, there is no risk of unauthorized file access, since + # Tempfile adds a unique string onto the end of every provided filename, and + # ensures that the filename does not already exist in the system. + def called_on_tempfile? file_name + call?(file_name) && file_name.target == s(:const, :Tempfile) + end + + def sanitized? file + call?(file) && + call?(file.target) && + class_name(file.target.target) == :"ActiveStorage::Filename" + end + + def temp_file_method? exp + if call? exp + return true if exp.call_chain.include? :tempfile + + params? exp.target and exp.method == :path + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_file_disclosure.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_file_disclosure.rb new file mode 100644 index 000000000..0b5e40942 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_file_disclosure.rb @@ -0,0 +1,36 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckFileDisclosure < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = 'Checks for versions with file existence disclosure vulnerability' + + def run_check + fix_version = case + when version_between?('2.0.0', '2.3.18') + '3.2.21' + when version_between?('3.0.0', '3.2.20') + '3.2.21' + when version_between?('4.0.0', '4.0.11') + '4.0.12' + when version_between?('4.1.0', '4.1.7') + '4.1.8' + else + nil + end + + if fix_version and serves_static_assets? + warn :warning_type => "File Access", + :warning_code => :CVE_2014_7829, + :message => msg(msg_version(rails_version), " has a file existence disclosure vulnerability. Upgrade to ", msg_version(fix_version), " or disable serving static assets"), + :confidence => :high, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/23fiuwb1NBA/MQVM1-5GkPMJ", + :cwe_id => [22] + end + end + + def serves_static_assets? + true? tracker.config.rails[:serve_static_assets] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_filter_skipping.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_filter_skipping.rb new file mode 100644 index 000000000..4e2a502dd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_filter_skipping.rb @@ -0,0 +1,32 @@ +require 'brakeman/checks/base_check' + +#Check for filter skipping vulnerability +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/3420ac71aed312d6 +class Brakeman::CheckFilterSkipping < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for versions 3.0-3.0.9 which had a vulnerability in filters" + + def run_check + if version_between?('3.0.0', '3.0.9') and uses_arbitrary_actions? + + warn :warning_type => "Default Routes", + :warning_code => :CVE_2011_2929, + :message => msg("Rails versions before 3.0.10 have a vulnerability which allows filters to be bypassed", msg_cve("CVE-2011-2929")), + :confidence => :high, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/NCCsca7TEtY/discussion", + :cwe_id => [20] + end + end + + def uses_arbitrary_actions? + tracker.routes.each do |_name, actions| + if actions.include? :allow_all_actions + return true + end + end + + false + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_force_ssl.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_force_ssl.rb new file mode 100644 index 000000000..bb7d41403 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_force_ssl.rb @@ -0,0 +1,28 @@ +class Brakeman::CheckForceSSL < Brakeman::BaseCheck + Brakeman::Checks.add_optional self + + @description = "Check that force_ssl setting is enabled in production" + + def run_check + return if tracker.config.rails.empty? or tracker.config.rails_version.nil? + return if tracker.config.rails_version < "3.1.0" + + force_ssl = tracker.config.rails[:force_ssl] + + if false? force_ssl or force_ssl.nil? + line = if sexp? force_ssl + force_ssl.line + else + 1 + end + + warn :warning_type => "Missing Encryption", + :warning_code => :force_ssl_disabled, + :message => msg("The application does not force use of HTTPS: ", msg_code("config.force_ssl"), " is not enabled"), + :confidence => :high, + :file => "config/environments/production.rb", + :line => line, + :cwe_id => [311] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_forgery_setting.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_forgery_setting.rb new file mode 100644 index 000000000..5cc18fd56 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_forgery_setting.rb @@ -0,0 +1,83 @@ +require 'brakeman/checks/base_check' + +#Checks that +protect_from_forgery+ is set in the ApplicationController. +# +#Also warns for CSRF weakness in certain versions of Rails: +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/2d95a3cc23e03665 +class Brakeman::CheckForgerySetting < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Verifies that protect_from_forgery is enabled in direct subclasses of ActionController::Base" + + def run_check + return if tracker.config.default_protect_from_forgery? + + tracker.controllers + .select { |_, controller| controller.parent == :"ActionController::Base" } + .each do |name, controller| + if controller and not controller.protect_from_forgery? + csrf_warning :controller => name, + :warning_code => :csrf_protection_missing, + :message => msg(msg_code("protect_from_forgery"), " should be called in ", msg_code(name)), + :file => controller.file, + :line => controller.top_line + elsif version_between? "4.0.0", "100.0.0" and forgery_opts = controller.options[:protect_from_forgery] + unless forgery_opts.is_a?(Array) and sexp?(forgery_opts.first) and + access_arg = hash_access(forgery_opts.first.first_arg, :with) and symbol? access_arg and + access_arg.value == :exception + + args = { + :controller => name, + :warning_type => "Cross-Site Request Forgery", + :warning_code => :csrf_not_protected_by_raising_exception, + :message => msg(msg_code("protect_from_forgery"), " should be configured with ", msg_code("with: :exception")), + :confidence => :medium, + :file => controller.file + } + + args.merge!(:code => forgery_opts.first) if forgery_opts.is_a?(Array) + + csrf_warning args + end + + end + + if controller.options[:protect_from_forgery] + check_cve_2011_0447 + end + end + end + + def csrf_warning opts + opts = { + :controller => :ApplicationController, + :warning_type => "Cross-Site Request Forgery", + :confidence => :high, + :cwe_id => [352] + }.merge opts + + warn opts + end + + def check_cve_2011_0447 + @warned_cve_2011_0447 ||= false + return if @warned_cve_2011_0447 + + if version_between? "2.1.0", "2.3.10" + new_version = "2.3.11" + elsif version_between? "3.0.0", "3.0.3" + new_version = "3.0.4" + else + return + end + + @warned_cve_2011_0447 = true # only warn once + + csrf_warning :warning_code => :CVE_2011_0447, + :message => msg("CSRF protection is flawed in unpatched versions of ", msg_version(rails_version), " ", msg_cve("CVE-2011-0447"), ". Upgrade to ", msg_version(new_version), " or apply patches as needed"), + :gem_info => gemfile_or_environment, + :file => nil, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/LZWjzCPgNmU/discussion", + :cwe_id => [352] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_header_dos.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_header_dos.rb new file mode 100644 index 000000000..2a992783b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_header_dos.rb @@ -0,0 +1,32 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckHeaderDoS < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for header DoS (CVE-2013-6414)" + + def run_check + if (version_between? "3.0.0", "3.2.15" or version_between? "4.0.0", "4.0.1") and not has_workaround? + message = msg(msg_version(rails_version), " has a denial of service vulnerability ", msg_cve("CVE-2013-6414"), ". Upgrade to ") + + if version_between? "3.0.0", "3.2.15" + message << msg_version("3.2.16") + else + message << msg_version("4.0.2") + end + + warn :warning_type => "Denial of Service", + :warning_code => :CVE_2013_6414, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/ruby-security-ann/A-ebV4WxzKg/KNPTbX8XAQUJ", + :cwe_id => [20] + end + end + + def has_workaround? + tracker.find_call(target: :ActiveSupport, method: :on_load).any? and + tracker.find_call(target: :"ActionView::LookupContext::DetailsKey", method: :class_eval).any? + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_i18n_xss.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_i18n_xss.rb new file mode 100644 index 000000000..00cb02c1d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_i18n_xss.rb @@ -0,0 +1,49 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckI18nXSS < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for i18n XSS (CVE-2013-4491)" + + def run_check + if (version_between? "3.0.6", "3.2.15" or version_between? "4.0.0", "4.0.1") and not has_workaround? + i18n_gem = tracker.config.gem_version :i18n + message = msg(msg_version(rails_version), " has an XSS vulnerability in ", msg_version(i18n_gem, "i18n"), " ", msg_cve("CVE-2013-4491"), ". Upgrade to ") + + if version_between? "3.0.6", "3.1.99" and version_before i18n_gem, "0.5.1" + message << msg_version("3.2.16 or i18n 0.5.1") + elsif version_between? "3.2.0", "4.0.1" and version_before i18n_gem, "0.6.6" + message << msg_version("4.0.2 or i18n 0.6.6") + else + return + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2013_4491, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment(:i18n), + :link_path => "https://groups.google.com/d/msg/ruby-security-ann/pLrh6DUw998/bLFEyIO4k_EJ", + :cwe_id => [79] + end + end + + def version_before gem_version, target + return true unless gem_version + gem_version.split('.').map(&:to_i).zip(target.split('.').map(&:to_i)).each do |gv, t| + if gv < t + return true + elsif gv > t + return false + end + end + + false + end + + def has_workaround? + tracker.find_call(target: :I18n, method: :const_defined?, chained: true).any? do |match| + match[:call].first_arg == s(:lit, :MissingTranslation) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_jruby_xml.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_jruby_xml.rb new file mode 100644 index 000000000..6809b8203 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_jruby_xml.rb @@ -0,0 +1,37 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckJRubyXML < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for versions with JRuby XML parsing backend" + + def run_check + return unless RUBY_PLATFORM == "java" + + fix_version = case + when version_between?('3.0.0', '3.0.99') + '3.2.13' + when version_between?('3.1.0', '3.1.11') + '3.1.12' + when version_between?('3.2.0', '3.2.12') + '3.2.13' + else + return + end + + #Check for workaround + tracker.find_call(target: :"ActiveSupport::XmlMini", method: :backend=, chained: true).each do |result| + arg = result[:call].first_arg + + return if string? arg and arg.value == "REXML" + end + + warn :warning_type => "File Access", + :warning_code => :CVE_2013_1856, + :message => msg(msg_version(rails_version), " with JRuby has a vulnerability in XML parser. Upgrade to ", msg_version(fix_version), " or patch"), + :confidence => :high, + :gem_info => gemfile_or_environment, + :link => "https://groups.google.com/d/msg/rubyonrails-security/KZwsQbYsOiI/5kUV7dSCJGwJ", + :cwe_id => [20] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_encoding.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_encoding.rb new file mode 100644 index 000000000..a6194452e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_encoding.rb @@ -0,0 +1,48 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckJSONEncoding < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for missing JSON encoding (CVE-2015-3226)" + + def run_check + if (version_between? "4.1.0", "4.1.10" or version_between? "4.2.0", "4.2.1") and not has_workaround? + message = msg(msg_version(rails_version), " does not encode JSON keys ", msg_cve("CVE-2015-3226"), ". Upgrade to ") + + if version_between? "4.1.0", "4.1.10" + message << msg_version("4.1.11") + else + message << msg_version("4.2.2") + end + + if tracker.find_call(:methods => [:to_json, :encode]).any? + confidence = :high + else + confidence = :medium + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2015_3226, + :message => message, + :confidence => confidence, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/7VlB_pck3hU/3QZrGIaQW6cJ", + :cwe_id => [79] + end + end + + def has_workaround? + workaround = s(:module, :ActiveSupport, + s(:module, :JSON, + s(:module, :Encoding, + s(:call, nil, :private), + s(:class, :EscapedString, nil, + s(:defn, :to_s, + s(:args), + s(:self)))))) + + tracker.initializers.any? do |_name, initializer| + initializer == workaround + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_entity_escape.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_entity_escape.rb new file mode 100644 index 000000000..046896d97 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_entity_escape.rb @@ -0,0 +1,40 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckJSONEntityEscape < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check if HTML escaping is disabled for JSON output" + + def run_check + check_config_setting + check_manual_disable + end + + def check_config_setting + if false? tracker.config.rails.dig(:active_support, :escape_html_entities_in_json) + warn :warning_type => "Cross-Site Scripting", + :warning_code => :json_html_escape_config, + :message => msg("HTML entities in JSON are not escaped by default"), + :confidence => :medium, + :file => "config/environments/production.rb", + :line => 1, + :cwe_id => [79] + end + end + + def check_manual_disable + tracker.find_call(targets: [:ActiveSupport, :'ActiveSupport::JSON::Encoding'], method: :escape_html_entities_in_json=).each do |result| + setting = result[:call].first_arg + + if false? setting + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :json_html_escape_module, + :message => msg("HTML entities in JSON are not escaped by default"), + :confidence => :medium, + :file => "config/environments/production.rb", + :cwe_id => [79] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_parsing.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_parsing.rb new file mode 100644 index 000000000..7a395d96f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_json_parsing.rb @@ -0,0 +1,111 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckJSONParsing < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for JSON parsing vulnerabilities CVE-2013-0333 and CVE-2013-0269" + + def initialize *args + super + @uses_json_parse = nil + end + + def run_check + check_cve_2013_0333 + check_cve_2013_0269 + end + + def check_cve_2013_0333 + return unless version_between? "0.0.0", "2.3.15" or version_between? "3.0.0", "3.0.19" + + unless uses_yajl? or uses_gem_backend? + new_version = if version_between? "0.0.0", "2.3.14" + "2.3.16" + elsif version_between? "3.0.0", "3.0.19" + "3.0.20" + end + + message = msg(msg_version(rails_version), " has a serious JSON parsing vulnerability. Upgrade to ", msg_version(new_version), " or patch") + gem_info = gemfile_or_environment + + warn :warning_type => "Remote Code Execution", + :warning_code => :CVE_2013_0333, + :message => message, + :confidence => :high, + :gem_info => gem_info, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/1h2DR63ViGo/discussion", + :cwe_id => [74] # TODO: is this the best CWE for this? + end + end + + #Check if `yajl` is included in Gemfile + def uses_yajl? + tracker.config.has_gem? :yajl + end + + #Check for `ActiveSupport::JSON.backend = "JSONGem"` + def uses_gem_backend? + matches = tracker.find_call(target: :'ActiveSupport::JSON', method: :backend=, chained: true) + + unless matches.empty? + json_gem = s(:str, "JSONGem") + + matches.each do |result| + if result[:call].first_arg == json_gem + return true + end + end + end + + false + end + + def check_cve_2013_0269 + [:json, :json_pure].each do |name| + gem_hash = tracker.config.get_gem name + check_json_version name, gem_hash[:version] if gem_hash and gem_hash[:version] + end + end + + def check_json_version name, version + return if version >= "1.7.7" or + (version >= "1.6.8" and version < "1.7.0") or + (version >= "1.5.5" and version < "1.6.0") + + warning_type = "Denial of Service" + confidence = :medium + gem_name = "#{name} gem" + message = msg(msg_version(version, gem_name), " has a symbol creation vulnerability. Upgrade to ") + + if version >= "1.7.0" + confidence = :high + warning_type = "Remote Code Execution" + message = msg(msg_version(version, "json gem"), " has a remote code execution vulnerability. Upgrade to ", msg_version("1.7.7", "json gem")) + elsif version >= "1.6.0" + message << msg_version("1.6.8", gem_name) + elsif version >= "1.5.0" + message << msg_version("1.5.5", gem_name) + else + confidence = :weak + message << msg_version("1.5.5", gem_name) + end + + if confidence == :medium and uses_json_parse? + confidence = :high + end + + warn :warning_type => warning_type, + :warning_code => :CVE_2013_0269, + :message => message, + :confidence => confidence, + :gem_info => gemfile_or_environment(name), + :link => "https://groups.google.com/d/topic/rubyonrails-security/4_YvCpLzL58/discussion", + :cwe_id => [74] # TODO: is this the best CWE for this? + end + + def uses_json_parse? + return @uses_json_parse unless @uses_json_parse.nil? + + not tracker.find_call(:target => :JSON, :method => :parse).empty? + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_link_to.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_link_to.rb new file mode 100644 index 000000000..c859ed48d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_link_to.rb @@ -0,0 +1,133 @@ +require 'brakeman/checks/check_cross_site_scripting' + +#Checks for calls to link_to in versions of Ruby where link_to did not +#escape the first argument. +# +#See https://rails.lighthouseapp.com/projects/8994/tickets/3518-link_to-doesnt-escape-its-input +class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting + Brakeman::Checks.add self + + @description = "Checks for XSS in link_to in versions before 3.0" + + def run_check + return unless version_between?("2.0.0", "2.9.9") and not tracker.config.escape_html? + + @ignore_methods = Set[:button_to, :check_box, :escapeHTML, :escape_once, + :field_field, :fields_for, :h, :hidden_field, + :hidden_field, :hidden_field_tag, :image_tag, :label, + :mail_to, :radio_button, :select, + :submit_tag, :text_area, :text_field, + :text_field_tag, :url_encode, :u, :url_for, + :will_paginate].merge tracker.options[:safe_methods] + + @known_dangerous = [] + #Ideally, I think this should also check to see if people are setting + #:escape => false + @models = tracker.models.keys + @inspect_arguments = tracker.options[:check_arguments] + + tracker.find_call(:target => false, :method => :link_to).each {|call| process_result call} + end + + def process_result result + return if duplicate? result + + #Have to make a copy of this, otherwise it will be changed to + #an ignored method call by the code above. + call = result[:call] + + first_arg = call.first_arg + second_arg = call.second_arg + + @matched = false + + #Skip if no arguments(?) or first argument is a hash + return if first_arg.nil? or hash? first_arg + + if version_between? "2.0.0", "2.2.99" + check_argument result, first_arg + + if second_arg and not hash? second_arg + check_argument result, second_arg + end + elsif second_arg + #Only check first argument if there is a second argument + #in Rails 2.3.x + check_argument result, first_arg + end + end + + # Check the argument for possible xss exploits + def check_argument result, exp + argument = process(exp) + !check_user_input(result, argument) && !check_method(result, argument) && !check_matched(result, @matched) + end + + # Check we should warn about the user input + def check_user_input(result, argument) + input = has_immediate_user_input?(argument) + return false unless input + + message = msg("Unescaped ", msg_input(input), " in ", msg_code("link_to")) + + warn_xss(result, message, input, :high) + end + + # Check if we should warn about the specified method + def check_method(result, argument) + return false if tracker.options[:ignore_model_output] + match = has_immediate_model?(argument) + return false unless match + method = match.method + return false if IGNORE_MODEL_METHODS.include? method + + confidence = :medium + confidence = :high if likely_model_attribute? match + warn_xss(result, msg("Unescaped model attribute in ", msg_code("link_to")), match, confidence) + end + + # Check if we should warn about the matched result + def check_matched(result, matched = nil) + return false unless matched + return false if matched.type == :model and tracker.options[:ignore_model_output] + + message = msg("Unescaped ", msg_input(matched), " in ", msg_code("link_to")) + + warn_xss(result, message, @matched, :medium) + end + + # Create a warn for this xss + def warn_xss(result, message, user_input, confidence) + add_result(result) + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :xss_link_to, + :message => message, + :user_input => user_input, + :confidence => confidence, + :link_path => "link_to", + :cwe_id => [79] + + true + end + + def process_call exp + @mark = true + actually_process_call exp + exp + end + + def actually_process_call exp + return if @matched + + target = exp.target + target = process target.dup if sexp? target + + #Bare records create links to the model resource, + #not a string that could have injection + #TODO: Needs test? I think this is broken? + return exp if model_name? target and context == [:call, :arglist] + + super + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_link_to_href.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_link_to_href.rb new file mode 100644 index 000000000..46c27a6e4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_link_to_href.rb @@ -0,0 +1,151 @@ +require 'brakeman/checks/check_cross_site_scripting' + +#Checks for calls to link_to which pass in potentially hazardous data +#to the second argument. While this argument must be html_safe to not break +#the html, it must also be url safe as determined by calling a +#:url_safe_method. This prevents attacks such as javascript:evil() or +#data:<encoded XSS> which is html_safe, but not safe as an href +#Props to Nick Green for the idea. +class Brakeman::CheckLinkToHref < Brakeman::CheckLinkTo + Brakeman::Checks.add self + + @description = "Checks to see if values used for hrefs are sanitized using a :url_safe_method to protect against javascript:/data: XSS" + + def run_check + @ignore_methods = Set[:button_to, :check_box, + :field_field, :fields_for, :hidden_field, + :hidden_field, :hidden_field_tag, :image_tag, :label, + :mail_to, :polymorphic_url, :radio_button, :select, :slice, + :submit_tag, :text_area, :text_field, + :text_field_tag, :url_encode, :u, + :will_paginate].merge(tracker.options[:url_safe_methods] || []) + + @models = tracker.models.keys + @inspect_arguments = tracker.options[:check_arguments] + + methods = tracker.find_call :target => false, :method => :link_to + methods.each do |call| + process_result call + end + end + + def process_result result + call = result[:call] + @matched = false + + url_arg = if result[:block] + process call.first_arg + else + process call.second_arg + end + + if check_argument? url_arg + url_arg = url_arg.first_arg + end + + return if call? url_arg and ignore_call? url_arg.target, url_arg.method + + if input = has_immediate_user_input?(url_arg) + message = msg("Unsafe ", msg_input(input), " in ", msg_code("link_to"), " href") + + unless duplicate? result or call_on_params? url_arg or ignore_interpolation? url_arg, input.match + add_result result + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :xss_link_to_href, + :message => message, + :user_input => input, + :confidence => :high, + :link_path => "link_to_href", + :cwe_id => [79] + end + elsif not tracker.options[:ignore_model_output] and input = has_immediate_model?(url_arg) + return if ignore_model_call? url_arg, input or duplicate? result + add_result result + + message = msg("Potentially unsafe model attribute in ", msg_code("link_to"), " href") + + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :xss_link_to_href, + :message => message, + :user_input => input, + :confidence => :weak, + :link_path => "link_to_href", + :cwe_id => [79] + end + end + + CHECK_INSIDE_METHODS = [:url_for, :h, :sanitize] + + def check_argument? url_arg + return unless call? url_arg + + target = url_arg.target + method = url_arg.method + + CHECK_INSIDE_METHODS.include? method or + cgi_escaped? target, method + end + + def ignore_model_call? url_arg, exp + return true unless call? exp + + target = exp.target + method = exp.method + + return true unless model_find_call? target + + return true unless method.to_s =~ /url|uri|link|page|site/ + + ignore_call? target, method or + IGNORE_MODEL_METHODS.include? method or + ignore_interpolation? url_arg, exp + end + + #Ignore situations where the href is an interpolated string + #with something before the user input + def ignore_interpolation? arg, suspect + return unless string_interp? arg + return true unless arg[1].chomp.empty? # plain string before interpolation + + first_interp = arg.find_nodes(:evstr).first + return unless first_interp + + first_interp[1].deep_each do |e| + if suspect == e + return false + end + end + + true + end + + def ignore_call? target, method + decorated_model? method or super + end + + def decorated_model? method + tracker.config.has_gem? :draper and + method == :decorate + end + + def ignored_method? target, method + @ignore_methods.include? method or + method.to_s =~ /_path$/ or + (target.nil? and method.to_s =~ /_url$/) + end + + def model_find_call? exp + return unless call? exp + + MODEL_METHODS.include? exp.method or + exp.method.to_s =~ /^find_by_/ + end + + def call_on_params? exp + call? exp and + params? exp.target and + exp.method != :[] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mail_to.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mail_to.rb new file mode 100644 index 000000000..2f74a1d0f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mail_to.rb @@ -0,0 +1,50 @@ +require 'brakeman/checks/base_check' + +#Check for cross-site scripting vulnerability in mail_to :encode => :javascript +#with certain versions of Rails (< 2.3.11 or < 3.0.4). +# +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/f02a48ede8315f81 +class Brakeman::CheckMailTo < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for mail_to XSS vulnerability in certain versions" + + def run_check + if (version_between? "2.3.0", "2.3.10" or version_between? "3.0.0", "3.0.3") and result = mail_to_javascript? + message = msg("Vulnerability in ", msg_code("mail_to"), " using javascript encoding ", msg_cve("CVE-2011-0446"), ". Upgrade to ") + + if version_between? "2.3.0", "2.3.10" + message << msg_version("2.3.11") + else + message << msg_version("3.0.4") + end + + warn :result => result, + :warning_type => "Mail Link", + :warning_code => :CVE_2011_0446, + :message => message, + :confidence => :high, + :gem_info => gemfile_or_environment, # Probably ignored now + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/8CpI7egxX4E/discussion", + :cwe_id => [79] + end + end + + #Check for javascript encoding of mail_to address + # mail_to email, name, :encode => :javascript + def mail_to_javascript? + Brakeman.debug "Checking calls to mail_to for javascript encoding" + + tracker.find_call(:target => false, :method => :mail_to).each do |result| + result[:call].each_arg do |arg| + if hash? arg + if option = hash_access(arg, :encode) + return result if symbol? option and option.value == :javascript + end + end + end + end + + false + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mass_assignment.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mass_assignment.rb new file mode 100644 index 000000000..bfe56d336 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mass_assignment.rb @@ -0,0 +1,227 @@ +require 'brakeman/checks/base_check' +require 'set' + +#Checks for mass assignments to models. +# +#See http://guides.rubyonrails.org/security.html#mass-assignment for details +class Brakeman::CheckMassAssignment < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Finds instances of mass assignment" + + def initialize(*) + super + @mass_assign_calls = nil + end + + def run_check + check_mass_assignment + check_permit! + check_permit_all_parameters + end + + def find_mass_assign_calls + return @mass_assign_calls if @mass_assign_calls + + models = [] + tracker.models.each do |name, m| + if m.is_a? Hash + p m + end + if m.unprotected_model? + models << name + end + end + + return [] if models.empty? + + Brakeman.debug "Finding possible mass assignment calls on #{models.length} models" + @mass_assign_calls = tracker.find_call :chained => true, :targets => models, :methods => [:new, + :attributes=, + :update_attributes, + :update_attributes!, + :create, + :create!, + :build, + :first_or_create, + :first_or_create!, + :first_or_initialize!, + :assign_attributes, + :update + ] + end + + def check_mass_assignment + return if mass_assign_disabled? + + Brakeman.debug "Processing possible mass assignment calls" + find_mass_assign_calls.each do |result| + process_result result + end + end + + #All results should be Model.new(...) or Model.attributes=() calls + def process_result res + call = res[:call] + + check = check_call call + + if check and original? res + + model = tracker.models[res[:chain].first] + attr_protected = (model and model.attr_protected) + first_arg = call.first_arg + + if attr_protected and tracker.options[:ignore_attr_protected] + return + elsif call? first_arg and (first_arg.method == :slice or first_arg.method == :only) + return + elsif input = include_user_input?(call.arglist) + if not node_type? first_arg, :hash + if attr_protected + confidence = :medium + else + confidence = :high + end + else + return + end + elsif node_type? call.first_arg, :lit, :str + return + else + confidence = :weak + input = nil + end + + warn :result => res, + :warning_type => "Mass Assignment", + :warning_code => :mass_assign_call, + :message => "Unprotected mass assignment", + :code => call, + :user_input => input, + :confidence => confidence, + :cwe_id => [915] + end + + res + end + + #Want to ignore calls to Model.new that have no arguments + def check_call call + process_call_args call + + if call.method == :update + arg = call.second_arg + else + arg = call.first_arg + end + + if arg.nil? #empty new() + false + elsif hash? arg and not include_user_input? arg + false + elsif all_literal_args? call + false + else + true + end + end + + LITERALS = Set[:lit, :true, :false, :nil, :string] + + def all_literal_args? exp + if call? exp + exp.each_arg do |arg| + return false unless literal? arg + end + + true + else + exp.all? do |arg| + literal? arg + end + end + + end + + def literal? exp + if sexp? exp + if exp.node_type == :hash + all_literal_args? exp + else + LITERALS.include? exp.node_type + end + else + true + end + end + + # Look for and warn about uses of Parameters#permit! for mass assignment + def check_permit! + tracker.find_call(:method => :permit!, :nested => true).each do |result| + if params? result[:call].target + unless inside_safe_method? result or calls_slice? result + warn_on_permit! result + end + end + end + end + + # Ignore blah_some_path(params.permit!) + def inside_safe_method? result + parent_call = result.dig(:parent, :call) + + call? parent_call and + parent_call.method.match(/_path$/) + end + + def calls_slice? result + result[:chain].include? :slice or + (result[:full_call] and result[:full_call][:chain].include? :slice) + end + + # Look for actual use of params in mass assignment to avoid + # warning about uses of Parameters#permit! without any mass assignment + # or when mass assignment is restricted by model instead. + def subsequent_mass_assignment? result + location = result[:location] + line = result[:call].line + find_mass_assign_calls.any? do |call| + call[:location] == location and + params? call[:call].first_arg and + call[:call].line >= line + end + end + + def warn_on_permit! result + return unless original? result + + confidence = if subsequent_mass_assignment? result + :high + else + :medium + end + + warn :result => result, + :warning_type => "Mass Assignment", + :warning_code => :mass_assign_permit!, + :message => msg('Specify exact keys allowed for mass assignment instead of using ', msg_code('permit!'), ' which allows any keys'), + :confidence => confidence, + :cwe_id => [915] + end + + def check_permit_all_parameters + tracker.find_call(target: :"ActionController::Parameters", method: :permit_all_parameters=).each do |result| + call = result[:call] + + if true? call.first_arg + warn :result => result, + :warning_type => "Mass Assignment", + :warning_code => :mass_assign_permit_all, + :message => msg('Mass assignment is globally enabled. Disable and specify exact keys using ', msg_code('params.permit'), ' instead'), + :confidence => :high, + :cwe_id => [915] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mime_type_dos.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mime_type_dos.rb new file mode 100644 index 000000000..f952a6307 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_mime_type_dos.rb @@ -0,0 +1,40 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckMimeTypeDoS < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for mime type denial of service (CVE-2016-0751)" + + def run_check + fix_version = case + when version_between?("3.0.0", "3.2.22") + "3.2.22.1" + when version_between?("4.0.0", "4.1.14") + "4.1.14.1" + when version_between?("4.2.0", "4.2.5") + "4.2.5.1" + else + return + end + + return if has_workaround? + + message = msg(msg_version(rails_version), " is vulnerable to denial of service via mime type caching ", msg_cve("CVE-2016-0751"), ". Upgrade to ", msg_version(fix_version)) + + warn :warning_type => "Denial of Service", + :warning_code => :CVE_2016_0751, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/9oLY_FCzvoc/w9oI9XxbFQAJ", + :cwe_id => [399] + end + + def has_workaround? + tracker.find_call(target: :Mime, method: :const_set).any? do |match| + arg = match[:call].first_arg + + symbol? arg and arg.value == :LOOKUP + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_attr_accessible.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_attr_accessible.rb new file mode 100644 index 000000000..20c55791e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_attr_accessible.rb @@ -0,0 +1,57 @@ +require 'brakeman/checks/base_check' + +# Author: Paul Deardorff (themetric) +# Checks models to see if important foreign keys +# or attributes are exposed as attr_accessible when +# they probably shouldn't be. + +class Brakeman::CheckModelAttrAccessible < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Reports models which have dangerous attributes defined via attr_accessible" + + SUSP_ATTRS = [ + [:admin, :high], # Very dangerous unless some Rails authorization used + [:role, :medium], + [:banned, :medium], + [:account_id, :high], + [/\S*_id(s?)\z/, :weak] # All other foreign keys have weak/low confidence + ] + + def run_check + check_models do |name, model| + model.attr_accessible.each do |attribute| + next if role_limited? model, attribute + + SUSP_ATTRS.each do |susp_attr, confidence| + if susp_attr.is_a?(Regexp) and susp_attr =~ attribute.to_s or susp_attr == attribute + warn :model => model, + :file => model.file, + :warning_type => "Mass Assignment", + :warning_code => :dangerous_attr_accessible, + :message => "Potentially dangerous attribute available for mass assignment", + :confidence => confidence, + :code => Sexp.new(:lit, attribute), + :cwe_id => [915] + + break # Prevent from matching single attr multiple times + end + end + end + end + end + + def role_limited? model, attribute + role_accessible = model.role_accessible + return if role_accessible.nil? + role_accessible.include? attribute + end + + def check_models + tracker.models.each do |name, model| + if !model.attr_accessible.nil? + yield name, model + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_attributes.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_attributes.rb new file mode 100644 index 000000000..b4dd8b8e1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_attributes.rb @@ -0,0 +1,83 @@ +require 'brakeman/checks/base_check' + +#Check if mass assignment is used with models +#which inherit from ActiveRecord::Base. +class Brakeman::CheckModelAttributes < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Reports models which do not use attr_restricted and warns on models that use attr_protected" + + def run_check + return if mass_assign_disabled? or tracker.config.has_gem?(:protected_attributes) + + #Roll warnings into one warning for all models + if tracker.options[:collapse_mass_assignment] + Brakeman.notify "[Notice] The `collapse_mass_assignment` option has been removed." + end + + check_models do |name, model| + if model.attr_protected.nil? + warn :model => model, + :file => model.file, + :line => model.top_line, + :warning_type => "Attribute Restriction", + :warning_code => :no_attr_accessible, + :message => msg("Mass assignment is not restricted using ", msg_code("attr_accessible")), + :confidence => :high, + :cwe_id => [915] # TODO: Should this be mass assignment? + elsif not tracker.options[:ignore_attr_protected] + message, confidence, link = check_for_attr_protected_bypass + + if link + warning_code = :CVE_2013_0276 + else + warning_code = :attr_protected_used + end + + warn :model => model, + :file => model.file, + :line => model.attr_protected.first.line, + :warning_type => "Attribute Restriction", + :warning_code => warning_code, + :message => message, + :confidence => confidence, + :cwe_id => [915] # TODO: Should this be mass assignment? + end + end + end + + def check_models + tracker.models.each do |name, model| + if model.unprotected_model? + yield name, model + end + end + end + + def check_for_attr_protected_bypass + upgrade_version = case + when version_between?("2.0.0", "2.3.16") + "2.3.17" + when version_between?("3.0.0", "3.0.99") + "3.2.11" + when version_between?("3.1.0", "3.1.10") + "3.1.11" + when version_between?("3.2.0", "3.2.11") + "3.2.12" + else + nil + end + + if upgrade_version + message = msg(msg_code("attr_protected"), " is bypassable in ", msg_version(rails_version), ". Use ", msg_code("attr_accessible"), " or upgrade to ", msg_version(upgrade_version)) + confidence = :high + link = "https://groups.google.com/d/topic/rubyonrails-security/AFBKNY7VSH8/discussion" + else + message = msg(msg_code("attr_accessible"), " is recommended over ", msg_code("attr_protected")) + confidence = :medium + link = nil + end + + return message, confidence, link + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_serialize.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_serialize.rb new file mode 100644 index 000000000..83a671a3b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_model_serialize.rb @@ -0,0 +1,68 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckModelSerialize < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Report uses of serialize in versions vulnerable to CVE-2013-0277" + + def run_check + @upgrade_version = case + when version_between?("2.0.0", "2.3.16") + "2.3.17" + when version_between?("3.0.0", "3.0.99") + "3.2.11" + else + nil + end + + return unless @upgrade_version + + tracker.models.each do |_name, model| + check_for_serialize model + end + end + + #High confidence warning on serialized, unprotected attributes. + #Medium confidence warning for serialized, protected attributes. + def check_for_serialize model + if serialized_attrs = model.options[:serialize] + attrs = Set.new + + serialized_attrs.each do |arglist| + arglist.each do |arg| + attrs << arg if symbol? arg + end + end + + if unsafe_attrs = model.attr_accessible + attrs.delete_if { |attr| not unsafe_attrs.include? attr.value } + elsif protected_attrs = model.attr_protected + safe_attrs = Set.new + + protected_attrs.each do |arglist| + arglist.each do |arg| + safe_attrs << arg if symbol? arg + end + end + + attrs.delete_if { |attr| safe_attrs.include? attr } + end + + if attrs.empty? + confidence = :medium + else + confidence = :high + end + + warn :model => model, + :warning_type => "Remote Code Execution", + :warning_code => :CVE_2013_0277, + :message => msg("Serialized attributes are vulnerable in ", msg_version(rails_version), ", upgrade to ", msg_version(@upgrade_version), " or patch"), + :confidence => confidence, + :link => "https://groups.google.com/d/topic/rubyonrails-security/KtmwSbEpzrU/discussion", + :file => model.file, + :line => model.top_line, + :cwe_id => [502] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_nested_attributes.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_nested_attributes.rb new file mode 100644 index 000000000..4655b5047 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_nested_attributes.rb @@ -0,0 +1,39 @@ +require 'brakeman/checks/base_check' + +#Check for vulnerability in nested attributes in Rails 2.3.9 and 3.0.0 +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/f9f913d328dafe0c +class Brakeman::CheckNestedAttributes < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for nested attributes vulnerability in Rails 2.3.9 and 3.0.0" + + def run_check + version = rails_version + + if (version == "2.3.9" or version == "3.0.0") and uses_nested_attributes? + message = msg("Vulnerability in nested attributes ", msg_cve("CVE-2010-3933"), ". Upgrade to ") + + if version == "2.3.9" + message << msg_version("2.3.10") + else + message << msg_version("3.0.1") + end + + warn :warning_type => "Nested Attributes", + :warning_code => :CVE_2010_3933, + :message => message, + :confidence => :high, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/-fkT0yja_gw/discussion", + :cwe_id => [20] + end + end + + def uses_nested_attributes? + active_record_models.each do |_name, model| + return true if model.options[:accepts_nested_attributes_for] + end + + false + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_nested_attributes_bypass.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_nested_attributes_bypass.rb new file mode 100644 index 000000000..af0dc38e3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_nested_attributes_bypass.rb @@ -0,0 +1,59 @@ +require 'brakeman/checks/base_check' + +#https://groups.google.com/d/msg/rubyonrails-security/cawsWcQ6c8g/tegZtYdbFQAJ +class Brakeman::CheckNestedAttributesBypass < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for nested attributes vulnerability (CVE-2015-7577)" + + def run_check + if version_between? "3.1.0", "3.2.22" or + version_between? "4.0.0", "4.1.14" or + version_between? "4.2.0", "4.2.5" + + unless workaround? + check_nested_attributes + end + end + end + + def check_nested_attributes + active_record_models.each do |name, model| + if opts = model.options[:accepts_nested_attributes_for] + opts.each do |args| + if args.any? { |a| allow_destroy? a } and args.any? { |a| reject_if? a } + warn_about_nested_attributes model, args + end + end + end + end + end + + def warn_about_nested_attributes model, args + message = msg(msg_version(rails_version), " does not call ", msg_code(":reject_if"), " option when ", msg_code(":allow_destroy"), " is ", msg_code("false"), " ", msg_cve("CVE-2015-7577")) + + warn :model => model, + :warning_type => "Nested Attributes", + :warning_code => :CVE_2015_7577, + :message => message, + :file => model.file, + :line => args.line, + :confidence => :medium, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/cawsWcQ6c8g/tegZtYdbFQAJ", + :cwe_id => [284] + end + + def allow_destroy? arg + hash? arg and + false? hash_access(arg, :allow_destroy) + end + + def reject_if? arg + hash? arg and + hash_access(arg, :reject_if) + end + + def workaround? + tracker.find_call(method: :will_be_destroyed?).any? + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_number_to_currency.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_number_to_currency.rb new file mode 100644 index 000000000..01021e712 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_number_to_currency.rb @@ -0,0 +1,76 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckNumberToCurrency < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for number helpers XSS vulnerabilities in certain versions" + + def initialize(*) + super + @found_any = false + end + + def run_check + if version_between? "2.0.0", "2.3.18" or + version_between? "3.0.0", "3.2.16" or + version_between? "4.0.0", "4.0.2" + + return if lts_version? "2.3.18.8" + + check_number_helper_usage + generic_warning unless @found_any + end + end + + def generic_warning + message = msg(msg_version(rails_version), " has a vulnerability in number helpers ", msg_cve("CVE-2014-0081"), ". Upgrade to ") + + if version_between? "2.3.0", "3.2.16" + message << msg_version("3.2.17") + else + message << msg_version("4.0.3") + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2014_0081, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/ruby-security-ann/9WiRn2nhfq0/2K2KRB4LwCMJ", + :cwe_id => [79] + end + + def check_number_helper_usage + number_methods = [:number_to_currency, :number_to_percentage, :number_to_human] + tracker.find_call(:target => false, :methods => number_methods).each do |result| + arg = result[:call].second_arg + next unless arg + + if not check_helper_option(result, arg) and hash? arg + hash_iterate(arg) do |_key, value| + break if check_helper_option(result, value) + end + end + end + end + + def check_helper_option result, exp + if match = (has_immediate_user_input? exp or has_immediate_model? exp) + warn_on_number_helper result, match + @found_any = true + else + false + end + end + + def warn_on_number_helper result, match + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2014_0081_call, + :message => msg("Format options in ", msg_code(result[:call].method), " are not safe in ", msg_version(rails_version)), + :confidence => :high, + :link_path => "https://groups.google.com/d/msg/ruby-security-ann/9WiRn2nhfq0/2K2KRB4LwCMJ", + :user_input => match, + :cwe_id => [79] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_page_caching_cve.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_page_caching_cve.rb new file mode 100644 index 000000000..52d603ceb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_page_caching_cve.rb @@ -0,0 +1,38 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckPageCachingCVE < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for page caching vulnerability (CVE-2020-8159)" + + def run_check + gem_name = 'actionpack-page_caching' + gem_version = tracker.config.gem_version(gem_name.to_sym) + upgrade_version = '1.2.2' + cve = 'CVE-2020-8159' + + return unless gem_version and version_between?('0.0.0', '1.2.1', gem_version) + + message = msg("Directory traversal vulnerability in ", msg_version(gem_version, gem_name), " ", msg_cve(cve), ". Upgrade to ", msg_version(upgrade_version, gem_name)) + + if uses_caches_page? + confidence = :high + else + confidence = :weak + end + + warn :warning_type => 'Directory Traversal', + :warning_code => :CVE_2020_8159, + :message => message, + :confidence => confidence, + :link_path => 'https://groups.google.com/d/msg/rubyonrails-security/CFRVkEytdP8/c5gmICECAgAJ', + :gem_info => gemfile_or_environment(gem_name), + :cwe_id => [22] + end + + def uses_caches_page? + tracker.controllers.any? do |name, controller| + controller.options.has_key? :caches_page + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_pathname.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_pathname.rb new file mode 100644 index 000000000..48b3ecb71 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_pathname.rb @@ -0,0 +1,48 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckPathname < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for unexpected Pathname behavior" + + def run_check + check_rails_root_join + check_pathname_join + + end + + def check_rails_root_join + tracker.find_call(target: :'Rails.root', method: :join, nested: true).each do |result| + check_result result + end + end + + def check_pathname_join + pathname_methods = [ + :'Pathname.new', + :'Pathname.getwd', + :'Pathname.glob', + :'Pathname.pwd', + ] + + tracker.find_call(targets: pathname_methods, method: :join, nested: true).each do |result| + check_result result + end + end + + def check_result result + return unless original? result + + result[:call].each_arg do |arg| + if match = has_immediate_user_input?(arg) + warn :result => result, + :warning_type => "Path Traversal", + :warning_code => :pathname_traversal, + :message => "Absolute paths in `Pathname#join` cause the entire path to be relative to the absolute path, ignoring any prior values", + :user_input => match, + :confidence => :high, + :cwe_id => [22] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_permit_attributes.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_permit_attributes.rb new file mode 100644 index 000000000..964373610 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_permit_attributes.rb @@ -0,0 +1,44 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckPermitAttributes < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Warn on potentially dangerous attributes allowed via permit" + + SUSPICIOUS_KEYS = { + admin: :high, + account_id: :high, + role: :medium, + banned: :medium, + } + + def run_check + tracker.find_call(:method => :permit).each do |result| + check_permit result + end + end + + def check_permit result + return unless original? result + + call = result[:call] + + call.each_arg do |arg| + if symbol? arg + if SUSPICIOUS_KEYS.key? arg.value + warn_on_permit_key result, arg + end + end + end + end + + def warn_on_permit_key result, key, confidence = nil + warn :result => result, + :warning_type => "Mass Assignment", + :warning_code => :dangerous_permit_key, + :message => "Potentially dangerous key allowed for mass assignment", + :confidence => (confidence || SUSPICIOUS_KEYS[key.value]), + :user_input => key, + :cwe_id => [915] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_quote_table_name.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_quote_table_name.rb new file mode 100644 index 000000000..36b981a0b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_quote_table_name.rb @@ -0,0 +1,41 @@ +require 'brakeman/checks/base_check' + +#Check for uses of quote_table_name in Rails versions before 2.3.13 and 3.0.10 +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/6a1e473744bc389b +class Brakeman::CheckQuoteTableName < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for quote_table_name vulnerability in versions before 2.3.14 and 3.0.10" + + def run_check + if (version_between?('2.0.0', '2.3.13') or + version_between?('3.0.0', '3.0.9')) + + if uses_quote_table_name? + confidence = :high + else + confidence = :medium + end + + if rails_version =~ /^3/ + message = msg("Rails versions before 3.0.10 have a vulnerability in ", msg_code("quote_table_name"), " ", msg_cve("CVE-2011-2930")) + else + message = msg("Rails versions before 2.3.14 have a vulnerability in ", msg_code("quote_table_name"), " ", msg_cve("CVE-2011-2930")) + end + + warn :warning_type => "SQL Injection", + :warning_code => :CVE_2011_2930, + :message => message, + :confidence => confidence, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/ah5HN0S8OJs/discussion", + :cwe_id => [89] + end + end + + def uses_quote_table_name? + Brakeman.debug "Finding calls to quote_table_name()" + + not tracker.find_call(:target => false, :method => :quote_table_name).empty? + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_ransack.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_ransack.rb new file mode 100644 index 000000000..8a4eca71c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_ransack.rb @@ -0,0 +1,53 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckRansack < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for dangerous use of the Ransack library" + + def run_check + return unless version_between? "0.0.0", "3.99", tracker.config.gem_version(:ransack) + check_ransack_calls + end + + def check_ransack_calls + tracker.find_call(method: :ransack, nested: true).each do |result| + next unless original? result + + call = result[:call] + arg = call.first_arg + + # If an allow list is defined anywhere in the + # class or super classes, consider it safe + class_name = result[:chain].first + + next if ransackable_allow_list?(class_name) + + if input = has_immediate_user_input?(arg) + confidence = if tracker.find_class(class_name).nil? + confidence = :low + elsif result[:location][:file].relative.include? 'admin' + confidence = :medium + else + confidence = :high + end + + message = msg('Unrestricted search using ', msg_code('ransack'), ' library called with ', msg_input(input), '. Limit search by defining ', msg_code('ransackable_attributes'), ' and ', msg_code('ransackable_associations'), ' methods in class or upgrade Ransack to version 4.0.0 or newer') + + warn result: result, + warning_type: 'Missing Authorization', + warning_code: :ransack_search, + message: message, + user_input: input, + confidence: confidence, + cwe_id: [862], + link: 'https://positive.security/blog/ransack-data-exfiltration' + end + end + end + + def ransackable_allow_list? class_name + tracker.find_method(:ransackable_attributes, class_name, :class) and + tracker.find_method(:ransackable_associations, class_name, :class) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_redirect.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_redirect.rb new file mode 100644 index 000000000..b375c129f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_redirect.rb @@ -0,0 +1,292 @@ +require 'brakeman/checks/base_check' + +#Reports any calls to +redirect_to+ which include parameters in the arguments. +# +#For example: +# +# redirect_to params.merge(:action => :elsewhere) +class Brakeman::CheckRedirect < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Looks for calls to redirect_to with user input as arguments" + + def run_check + @model_find_calls = Set[:all, :create, :create!, :find, :find_by_sql, :first, :first!, :last, :last!, :new, :sole] + + if tracker.options[:rails3] + @model_find_calls.merge [:from, :group, :having, :joins, :lock, :order, :reorder, :select, :where] + end + + if version_between? "4.0.0", "9.9.9" + @model_find_calls.merge [:find_by, :find_by!, :take] + end + + if version_between? "7.0.0", "9.9.9" + @model_find_calls << :find_sole_by + end + + methods = [:redirect_to, :redirect_back, :redirect_back_or_to] + + @tracker.find_call(:target => false, :methods => methods).each do |res| + process_result res + end + end + + def process_result result + return unless original? result + + call = result[:call] + opt = call.first_arg + + # Location is specified with `fallback_location:` + # otherwise the arguments do not contain a location and + # the call can be ignored + if call.method == :redirect_back + if hash? opt and location = hash_access(opt, :fallback_location) + opt = location + else + return + end + end + + if not protected_by_raise?(call) and + not only_path?(call) and + not explicit_host?(opt) and + not slice_call?(opt) and + not safe_permit?(opt) and + not disallow_other_host?(call) and + res = include_user_input?(opt) + + if res.type == :immediate and not allow_other_host?(call) + confidence = :high + else + confidence = :weak + end + + warn :result => result, + :warning_type => "Redirect", + :warning_code => :open_redirect, + :message => "Possible unprotected redirect", + :code => call, + :user_input => res, + :confidence => confidence, + :cwe_id => [601] + end + end + + #Custom check for user input. First looks to see if the user input + #is being output directly. This is necessary because of tracker.options[:check_arguments] + #which can be used to enable/disable reporting output of method calls which use + #user input as arguments. + def include_user_input? opt, immediate = :immediate + Brakeman.debug "Checking if call includes user input" + + # if the first argument is an array, rails assumes you are building a + # polymorphic route, which will never jump off-host + return false if array? opt + + if tracker.options[:ignore_redirect_to_model] + if model_instance?(opt) or decorated_model?(opt) + return false + end + end + + if res = has_immediate_model?(opt) + unless call? opt and opt.method.to_s =~ /_path/ + return Match.new(immediate, res) + end + elsif call? opt + if request_value? opt + return Match.new(immediate, opt) + elsif opt.method == :url_for and include_user_input? opt.first_arg + return Match.new(immediate, opt) + #Ignore helpers like some_model_url? + elsif opt.method.to_s =~ /_(url|path)\z/ + return false + elsif opt.method == :url_from + return false + end + elsif request_value? opt + return Match.new(immediate, opt) + elsif node_type? opt, :or + return (include_user_input?(opt.lhs) or include_user_input?(opt.rhs)) + end + + if tracker.options[:check_arguments] and call? opt + include_user_input? opt.first_arg, false #I'm doubting if this is really necessary... + else + false + end + end + + #Checks +redirect_to+ arguments for +only_path => true+ which essentially + #nullifies the danger posed by redirecting with user input + def only_path? call + arg = call.first_arg + + if hash? arg + return has_only_path? arg + elsif call? arg and arg.method == :url_for + return check_url_for(arg) + elsif call? arg and hash? arg.first_arg and use_unsafe_hash_method? arg + return has_only_path? arg.first_arg + end + + false + end + + def use_unsafe_hash_method? arg + return call_has_param(arg, :to_unsafe_hash) || call_has_param(arg, :to_unsafe_h) + end + + def call_has_param arg, key + if call? arg and call? arg.target + target = arg.target + method = target.method + + node_type? target.target, :params and method == key + else + false + end + end + + def has_only_path? arg + if value = hash_access(arg, :only_path) + return true if true?(value) + end + + false + end + + def explicit_host? arg + return unless sexp? arg + + if hash? arg + if value = hash_access(arg, :host) + return !has_immediate_user_input?(value) + end + elsif call? arg + target = arg.target + + if hash? target and value = hash_access(target, :host) + return !has_immediate_user_input?(value) + elsif call? arg + return explicit_host? target + end + end + + false + end + + #+url_for+ is only_path => true by default. This checks to see if it is + #set to false for some reason. + def check_url_for call + arg = call.first_arg + + if hash? arg + if value = hash_access(arg, :only_path) + return false if false?(value) + end + end + + true + end + + #Returns true if exp is (probably) a model instance + def model_instance? exp + if node_type? exp, :or + model_instance? exp.lhs or model_instance? exp.rhs + elsif call? exp + if model_target? exp and + (@model_find_calls.include? exp.method or exp.method.to_s.match(/^find_by_/)) + true + else + association?(exp.target, exp.method) + end + end + end + + def model_target? exp + return false unless call? exp + model_name? exp.target or + friendly_model? exp.target or + model_target? exp.target + end + + #Returns true if exp is (probably) a friendly model instance + #using the FriendlyId gem + def friendly_model? exp + call? exp and model_name? exp.target and exp.method == :friendly + end + + #Returns true if exp is (probably) a decorated model instance + #using the Draper gem + def decorated_model? exp + if node_type? exp, :or + decorated_model? exp.lhs or decorated_model? exp.rhs + else + tracker.config.has_gem? :draper and + call? exp and + node_type?(exp.target, :const) and + exp.target.value.to_s.match(/Decorator$/) and + exp.method == :decorate + end + end + + #Check if method is actually an association in a Model + def association? model_name, meth + if call? model_name + return association? model_name.target, meth + elsif model_name? model_name + model = tracker.models[class_name(model_name)] + else + return false + end + + return false unless model + + model.association? meth + end + + def slice_call? exp + return unless call? exp + exp.method == :slice + end + + DANGEROUS_KEYS = [:host, :subdomain, :domain, :port] + + def safe_permit? exp + if call? exp and params? exp.target and exp.method == :permit + exp.each_arg do |opt| + if symbol? opt and DANGEROUS_KEYS.include? opt.value + return false + end + end + + return true + end + + false + end + + def protected_by_raise? call + raise_on_redirects? and + not allow_other_host? call + end + + def raise_on_redirects? + @raise_on_redirects ||= true?(tracker.config.rails.dig(:action_controller, :raise_on_open_redirects)) + end + + def allow_other_host? call + opt = call.last_arg + + hash? opt and true? hash_access(opt, :allow_other_host) + end + + def disallow_other_host? call + opt = call.last_arg + + hash? opt and false? hash_access(opt, :allow_other_host) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_regex_dos.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_regex_dos.rb new file mode 100644 index 000000000..5093a1a51 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_regex_dos.rb @@ -0,0 +1,69 @@ +require 'brakeman/checks/base_check' + +#This check looks for regexes that include user input. +class Brakeman::CheckRegexDoS < Brakeman::BaseCheck + Brakeman::Checks.add self + + ESCAPES = { + s(:const, :Regexp) => [ + :escape, + :quote + ] + } + + @description = "Searches regexes including user input" + + #Process calls + def run_check + Brakeman.debug "Finding dynamic regexes" + calls = tracker.find_call :method => [:brakeman_regex_interp] + + Brakeman.debug "Processing dynamic regexes" + calls.each do |call| + process_result call + end + end + + #Warns if regex includes user input + def process_result result + return unless original? result + + call = result[:call] + components = call.sexp_body + + components.any? do |component| + next unless sexp? component + + if match = has_immediate_user_input?(component) + confidence = :high + elsif match = has_immediate_model?(component) + match = Match.new(:model, match) + confidence = :medium + elsif match = include_user_input?(component) + confidence = :weak + end + + if match + message = msg(msg_input(match), " used in regular expression") + + warn :result => result, + :warning_type => "Denial of Service", + :warning_code => :regex_dos, + :message => message, + :confidence => confidence, + :user_input => match, + :cwe_id => [20, 185] + end + end + end + + def process_call(exp) + if escape_methods = ESCAPES[exp.target] + if escape_methods.include? exp.method + return exp + end + end + + super + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render.rb new file mode 100644 index 000000000..d749b0197 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render.rb @@ -0,0 +1,123 @@ +require 'brakeman/checks/base_check' + +#Check calls to +render()+ for dangerous values +class Brakeman::CheckRender < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Finds calls to render that might allow file access or code execution" + + def run_check + tracker.find_call(:target => nil, :method => :render).each do |result| + process_render_result result + end + end + + def process_render_result result + return unless node_type? result[:call], :render + + case result[:call].render_type + when :partial, :template, :action, :file + check_for_rce(result) or + check_for_dynamic_path(result) + when :inline + when :js + when :json + when :text + when :update + when :xml + end + end + + #Check if path to action or file is determined dynamically + def check_for_dynamic_path result + view = result[:call][2] + + if sexp? view and original? result + return if renderable?(view) + + if input = has_immediate_user_input?(view) + if string_interp? view + confidence = :medium + else + confidence = :high + end + elsif input = include_user_input?(view) + confidence = :weak + else + return + end + + return if input.type == :model #skip models + return if safe_param? input.match + + message = msg("Render path contains ", msg_input(input)) + + warn :result => result, + :warning_type => "Dynamic Render Path", + :warning_code => :dynamic_render_path, + :message => message, + :user_input => input, + :confidence => confidence, + :cwe_id => [22] + end + end + + def check_for_rce result + return unless version_between? "0.0.0", "3.2.22" or + version_between? "4.0.0", "4.1.14" or + version_between? "4.2.0", "4.2.5" + + + view = result[:call][2] + if sexp? view and not duplicate? result + if params? view + add_result result + return if safe_param? view + + warn :result => result, + :warning_type => "Remote Code Execution", + :warning_code => :dynamic_render_path_rce, + :message => msg("Passing query parameters to ", msg_code("render"), " is vulnerable in ", msg_version(rails_version), " ", msg_cve("CVE-2016-0752")), + :user_input => view, + :confidence => :high, + :cwe_id => [22] + end + end + end + + def safe_param? exp + if params? exp and call? exp + method_name = exp.method + + if method_name == :[] + arg = exp.first_arg + symbol? arg and [:controller, :action].include? arg.value + else + boolean_method? method_name + end + end + end + + def renderable? exp + return false unless call?(exp) and constant?(exp.target) + + if exp.method == :with_content + exp = exp.target + end + + return false unless constant?(exp.target) + target_class_name = class_name(exp.target) + known_renderable_class?(target_class_name) or tracker.find_method(:render_in, target_class_name) + end + + def known_renderable_class? class_name + klass = tracker.find_class(class_name) + return false if klass.nil? + knowns = [ + :"ViewComponent::Base", + :"ViewComponentContrib::Base", + :"Phlex::HTML" + ] + knowns.any? { |k| klass.ancestor? k } + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render_dos.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render_dos.rb new file mode 100644 index 000000000..bff6e144e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render_dos.rb @@ -0,0 +1,38 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckRenderDoS < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Warn about denial of service with render :text (CVE-2014-0082)" + + def run_check + if version_between? "3.0.0", "3.0.20" or + version_between? "3.1.0", "3.1.12" or + version_between? "3.2.0", "3.2.16" + + tracker.find_call(:target => nil, :method => :render).each do |result| + if text_render? result + warn_about_text_render + break + end + end + end + end + + def text_render? result + node_type? result[:call], :render and + result[:call].render_type == :text + end + + def warn_about_text_render + message = msg(msg_version(rails_version), " has a denial of service vulnerability ", msg_cve("CVE-2014-0082"), ". Upgrade to ", msg_version("3.2.17")) + + warn :warning_type => "Denial of Service", + :warning_code => :CVE_2014_0082, + :message => message, + :confidence => :high, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/LMxO_3_eCuc/ozGBEhKaJbIJ", + :gem_info => gemfile_or_environment, + :cwe_id => [20] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render_inline.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render_inline.rb new file mode 100644 index 000000000..6d7c5eb5d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_render_inline.rb @@ -0,0 +1,55 @@ +class Brakeman::CheckRenderInline < Brakeman::CheckCrossSiteScripting + Brakeman::Checks.add self + + @description = "Checks for cross-site scripting in render calls" + + def run_check + setup + + tracker.find_call(:target => nil, :method => :render).each do |result| + check_render result + end + end + + def check_render result + return unless original? result + + call = result[:call] + + if node_type? call, :render and + (call.render_type == :text or call.render_type == :inline) + + unless call.render_type == :text and content_type_set? call[3] + render_value = call[2] + + if input = has_immediate_user_input?(render_value) + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :cross_site_scripting_inline, + :message => msg("Unescaped ", msg_input(input), " rendered inline"), + :user_input => input, + :confidence => :high, + :cwe_id => [79] + elsif input = has_immediate_model?(render_value) + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :cross_site_scripting_inline, + :message => "Unescaped model attribute rendered inline", + :user_input => input, + :confidence => :medium, + :cwe_id => [79] + end + end + end + end + + CONTENT_TYPES = ["text/html", "text/javascript", "application/javascript"] + + def content_type_set? opts + if hash? opts + content_type = hash_access(opts, :content_type) + + string? content_type and not CONTENT_TYPES.include? content_type.value + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_response_splitting.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_response_splitting.rb new file mode 100644 index 000000000..78e22c4e8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_response_splitting.rb @@ -0,0 +1,22 @@ +require 'brakeman/checks/base_check' + +#Warn about response splitting in Rails versions before 2.3.13 +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/6ffc93bde0298768 +class Brakeman::CheckResponseSplitting < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Report response splitting in Rails 2.3.0 - 2.3.13" + + def run_check + if version_between?('2.3.0', '2.3.13') + + warn :warning_type => "Response Splitting", + :warning_code => :CVE_2011_3186, + :message => msg("Rails versions before 2.3.14 have a vulnerability content type handling allowing injection of headers ", msg_cve("CVE-2011-3186")), + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/b_yTveAph2g/discussion", + :cwe_id => [94] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_reverse_tabnabbing.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_reverse_tabnabbing.rb new file mode 100644 index 000000000..427ee205c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_reverse_tabnabbing.rb @@ -0,0 +1,59 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckReverseTabnabbing < Brakeman::BaseCheck + Brakeman::Checks.add_optional self + + @description = "Checks for reverse tabnabbing cases on 'link_to' calls" + + def run_check + calls = tracker.find_call :methods => :link_to + calls.each do |call| + process_result call + end + end + + def process_result result + return unless original? result and result[:call].last_arg + + html_opts = result[:call].last_arg + return unless hash? html_opts + + target = hash_access html_opts, :target + unless target && + (string?(target) && target.value == "_blank" || + symbol?(target) && target.value == :_blank) + return + end + + target_url = result[:block] ? result[:call].first_arg : result[:call].second_arg + + # `url_for` and `_path` calls lead to urls on to the same origin. + # That means that an adversary would need to run javascript on + # the victim application's domain. If that is the case, the adversary + # already has the ability to redirect the victim user anywhere. + # Also statically provided URLs (interpolated or otherwise) are also + # ignored as they produce many false positives. + return if !call?(target_url) || target_url.method.match(/^url_for$|_path$/) + + rel = hash_access html_opts, :rel + confidence = :medium + + if rel && string?(rel) then + rel_opt = rel.value + return if rel_opt.include?("noopener") && rel_opt.include?("noreferrer") + + if rel_opt.include?("noopener") ^ rel_opt.include?("noreferrer") then + confidence = :weak + end + end + + warn :result => result, + :warning_type => "Reverse Tabnabbing", + :warning_code => :reverse_tabnabbing, + :message => msg("When opening a link in a new tab without setting ", msg_code('rel: "noopener noreferrer"'), + ", the new tab can control the parent tab's location. For example, an attacker could redirect to a phishing page."), + :confidence => confidence, + :user_input => rel, + :cwe_id => [1022] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_route_dos.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_route_dos.rb new file mode 100644 index 000000000..5cd791e71 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_route_dos.rb @@ -0,0 +1,43 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckRouteDoS < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for route DoS (CVE-2015-7581)" + + def run_check + fix_version = case + when version_between?("4.0.0", "4.1.14") + "4.1.14.1" + when version_between?("4.2.0", "4.2.5") + "4.2.5.1" + else + return + end + + if controller_wildcards? + message = msg(msg_version(rails_version), " has a denial of service vulnerability with ", msg_code(":controller"), " routes ", msg_cve("CVE-2015-7581"), ". Upgrade to ", msg_version(fix_version)) + + warn :warning_type => "Denial of Service", + :warning_code => :CVE_2015_7581, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/dthJ5wL69JE/YzPnFelbFQAJ", + :cwe_id => [399] + end + end + + def controller_wildcards? + tracker.routes.each do |name, actions| + if name == :':controllerController' + # awful hack for routes with :controller in them + return true + elsif string? actions and actions.value.include? ":controller" + return true + end + end + + false + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_safe_buffer_manipulation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_safe_buffer_manipulation.rb new file mode 100644 index 000000000..fb78de550 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_safe_buffer_manipulation.rb @@ -0,0 +1,32 @@ +require 'brakeman/checks/base_check' + +#Check for unsafe manipulation of strings +#Right now this is just a version check for +#https://groups.google.com/group/rubyonrails-security/browse_thread/thread/edd28f1e3d04e913?pli=1 +class Brakeman::CheckSafeBufferManipulation < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for Rails versions with SafeBuffer bug" + + def run_check + + if version_between? "3.0.0", "3.0.11" + suggested_version = "3.0.12" + elsif version_between? "3.1.0", "3.1.3" + suggested_version = "3.1.4" + elsif version_between? "3.2.0", "3.2.1" + suggested_version = "3.2.2" + else + return + end + + message = msg(msg_version(rails_version), " has a vulnerability in ", msg_code("SafeBuffer"), ". Upgrade to ", msg_version(suggested_version), " or apply patches") + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :safe_buffer_vuln, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment, + :cwe_id => [79] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sanitize_config_cve.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sanitize_config_cve.rb new file mode 100644 index 000000000..a9d07b5fd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sanitize_config_cve.rb @@ -0,0 +1,120 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckSanitizeConfigCve < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for vunerable uses of sanitize (CVE-2022-32209)" + + def run_check + @specific_warning = false + + @gem_version = tracker.config.gem_version :'rails-html-sanitizer' + if version_between? "0.0.0", "1.4.2", @gem_version + check_config + check_sanitize_calls + check_safe_list_allowed_tags + + unless @specific_warning + # General warning about the vulnerable version + cve_warning + end + end + end + + def cve_warning confidence: :weak, result: nil + return if result and not original? result + + message = msg(msg_version(@gem_version, 'rails-html-sanitizer'), + " is vulnerable to cross-site scripting when ", + msg_code('select'), + " and ", + msg_code("style"), + " tags are allowed ", + msg_cve("CVE-2022-32209") + ) + + unless result + message << ". Upgrade to 1.4.3 or newer" + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2022_32209, + :message => message, + :confidence => confidence, + :gem_info => gemfile_or_environment(:'rails-html-sanitizer'), + :link_path => "https://groups.google.com/g/rubyonrails-security/c/ce9PhUANQ6s/m/S0fJfnkmBAAJ", + :cwe_id => [79], + :result => result + end + + # Look for + # config.action_view.sanitized_allowed_tags = ["select", "style"] + def check_config + sanitizer_config = tracker.config.rails.dig(:action_view, :sanitized_allowed_tags) + + if sanitizer_config and include_both_tags? sanitizer_config + @specific_warning = true + cve_warning confidence: :high + end + end + + # Look for + # sanitize ..., tags: ["select", "style"] + # and + # Rails::Html::SafeListSanitizer.new.sanitize(..., tags: ["select", "style"]) + def check_sanitize_calls + tracker.find_call(method: :sanitize, target: nil).each do |result| + check_tags_option result + end + + tracker.find_call(method: :sanitize, target: :'Rails::Html::SafeListSanitizer.new').each do |result| + check_tags_option result + end + end + + # Look for + # Rails::Html::SafeListSanitizer.allowed_tags = ["select", "style"] + def check_safe_list_allowed_tags + tracker.find_call(target: :'Rails::Html::SafeListSanitizer', method: :allowed_tags=).each do |result| + check_result result, result[:call].first_arg + end + end + + private + + def check_tags_option result + options = result[:call].last_arg + + if options + check_result result, hash_access(options, :tags) + end + end + + def check_result result, arg + if include_both_tags? arg + @specific_warning = true + cve_warning confidence: :high, result: result + end + end + + def include_both_tags? exp + return unless sexp? exp + + has_tag? exp, 'select' and + has_tag? exp, 'style' + end + + def has_tag? exp, tag + tag_sym = tag.to_sym + + exp.each_sexp do |e| + if string? e and e.value == tag + return true + elsif symbol? e and e.value == tag_sym + return true + end + end + + false + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sanitize_methods.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sanitize_methods.rb new file mode 100644 index 000000000..6e5e1a561 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sanitize_methods.rb @@ -0,0 +1,116 @@ +require 'brakeman/checks/base_check' + +#sanitize and sanitize_css are vulnerable: +#CVE-2013-1855 and CVE-2013-1857 +class Brakeman::CheckSanitizeMethods < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for versions with vulnerable sanitize and sanitize_css" + + def run_check + @fix_version = case + when version_between?('2.0.0', '2.3.17') + '2.3.18' + when version_between?('3.0.0', '3.0.99') + '3.2.13' + when version_between?('3.1.0', '3.1.11') + '3.1.12' + when version_between?('3.2.0', '3.2.12') + '3.2.13' + end + + if @fix_version + check_cve_2013_1855 + check_cve_2013_1857 + end + + if tracker.config.has_gem? :'rails-html-sanitizer' + check_rails_html_sanitizer + end + + check_cve_2018_8048 + end + + def check_cve_2013_1855 + check_for_cve :sanitize_css, :CVE_2013_1855, "https://groups.google.com/d/msg/rubyonrails-security/4_QHo4BqnN8/_RrdfKk12I4J" + end + + def check_cve_2013_1857 + check_for_cve :sanitize, :CVE_2013_1857, "https://groups.google.com/d/msg/rubyonrails-security/zAAU7vGTPvI/1vZDWXqBuXgJ" + end + + def check_for_cve method, code, link + tracker.find_call(:target => false, :method => method).each do |result| + next if duplicate? result + add_result result + + message = msg(msg_version(rails_version), " has a vulnerability in ", msg_code(method), ". Upgrade to ", msg_version(@fix_version), " or patch") + + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => code, + :message => message, + :confidence => :high, + :link_path => link, + :cwe_id => [79] + end + end + + def check_rails_html_sanitizer + rhs_version = tracker.config.gem_version(:'rails-html-sanitizer') + + if version_between? "1.0.0", "1.0.2", rhs_version + warn_sanitizer_cve "CVE-2015-7578", "https://groups.google.com/d/msg/rubyonrails-security/uh--W4TDwmI/JbvSRpdbFQAJ", "1.0.3" + warn_sanitizer_cve "CVE-2015-7580", "https://groups.google.com/d/msg/rubyonrails-security/uh--W4TDwmI/m_CVZtdbFQAJ", "1.0.3" + end + + if version_between? "1.0.0", "1.0.3", rhs_version + warn_sanitizer_cve "CVE-2018-3741", "https://groups.google.com/d/msg/rubyonrails-security/tP7W3kLc5u4/uDy2Br7xBgAJ", "1.0.4" + end + end + + def check_cve_2018_8048 + if loofah_vulnerable_cve_2018_8048? + message = msg(msg_version(tracker.config.gem_version(:loofah), "loofah gem"), " is vulnerable (CVE-2018-8048). Upgrade to 2.2.1") + + if tracker.find_call(:target => false, :method => :sanitize).any? + confidence = :high + else + confidence = :medium + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2018_8048, + :message => message, + :gem_info => gemfile_or_environment(:loofah), + :confidence => confidence, + :link_path => "https://github.com/flavorjones/loofah/issues/144", + :cwe_id => [79] + end + end + + def loofah_vulnerable_cve_2018_8048? + loofah_version = tracker.config.gem_version(:loofah) + + # 2.2.1 is fix version + loofah_version and version_between?("0.0.0", "2.2.0", loofah_version) + end + + def warn_sanitizer_cve cve, link, upgrade_version + message = msg(msg_version(tracker.config.gem_version(:'rails-html-sanitizer'), "rails-html-sanitizer"), " is vulnerable ", msg_cve(cve), ". Upgrade to ", msg_version(upgrade_version, "rails-html-sanitizer")) + + if tracker.find_call(:target => false, :method => :sanitize).any? + confidence = :high + else + confidence = :medium + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => cve.tr('-', '_').to_sym, + :message => message, + :gem_info => gemfile_or_environment(:'rails-html-sanitizer'), + :confidence => confidence, + :link_path => link, + :cwe_id => [79] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_secrets.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_secrets.rb new file mode 100644 index 000000000..40f2f48db --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_secrets.rb @@ -0,0 +1,41 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckSecrets < Brakeman::BaseCheck + Brakeman::Checks.add_optional self + + @description = "Checks for secrets stored in source code" + + def run_check + check_constants + end + + def check_constants + @warned = Set.new + + @tracker.constants.each do |constant| + name = constant.name_array.last + value = constant.value + + if string? value and not value.value.empty? and looks_like_secret? name + match = [name, value, value.line] + + unless @warned.include? match + @warned << match + + warn :warning_code => :secret_in_source, + :warning_type => "Authentication", + :message => msg("Hardcoded value for ", msg_code(name), " in source code"), + :confidence => :medium, + :file => constant.file, + :line => constant.line, + :cwe_id => [798] + end + end + end + end + + def looks_like_secret? name + # REST_AUTH_SITE_KEY is the pepper in Devise + name.match(/password|secret|(rest_auth_site|api)_key$/i) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_select_tag.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_select_tag.rb new file mode 100644 index 000000000..0e9d075ca --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_select_tag.rb @@ -0,0 +1,60 @@ +require 'brakeman/checks/base_check' + +#Checks for CVE-2012-3463, unescaped input in :prompt option of select_tag: +#https://groups.google.com/d/topic/rubyonrails-security/fV3QUToSMSw/discussion +class Brakeman::CheckSelectTag < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Looks for unsafe uses of select_tag() in some versions of Rails 3.x" + + def run_check + + if version_between? "3.0.0", "3.0.16" + suggested_version = "3.0.17" + elsif version_between? "3.1.0", "3.1.7" + suggested_version = "3.1.8" + elsif version_between? "3.2.0", "3.2.7" + suggested_version = "3.2.8" + else + return + end + + @ignore_methods = Set[:escapeHTML, :escape_once, :h].merge tracker.options[:safe_methods] + + @message = msg("Upgrade to ", msg_version(suggested_version), ". In ", msg_version(rails_version), " ", msg_code("select_tag"), " is vulnerable ", msg_cve("CVE-2012-3463")) + + calls = tracker.find_call(:target => nil, :method => :select_tag).select do |result| + result[:location][:type] == :template + end + + calls.each do |result| + process_result result + end + end + + #Check if select_tag is called with user input in :prompt option + def process_result result + return unless original? result + + #Only concerned if user input is supplied for :prompt option + last_arg = result[:call].last_arg + + if hash? last_arg + prompt_option = hash_access last_arg, :prompt + + if call? prompt_option and @ignore_methods.include? prompt_option.method + return + elsif sexp? prompt_option and input = include_user_input?(prompt_option) + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2012_3463, + :result => result, + :message => @message, + :confidence => :high, + :user_input => input, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/fV3QUToSMSw/discussion", + :cwe_id => [79] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_select_vulnerability.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_select_vulnerability.rb new file mode 100644 index 000000000..22b122aae --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_select_vulnerability.rb @@ -0,0 +1,61 @@ +require 'brakeman/checks/base_check' + +#Checks for select() helper vulnerability in some versions of Rails 3 +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/9da0c515a6c4664 +class Brakeman::CheckSelectVulnerability < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Looks for unsafe uses of select() helper" + + def run_check + + if lts_version? "2.3.18.7" + return + elsif version_between? "3.0.0", "3.0.11" + suggested_version = "3.0.12" + elsif version_between? "3.1.0", "3.1.3" + suggested_version = "3.1.4" + elsif version_between? "3.2.0", "3.2.1" + suggested_version = "3.2.2" + elsif version_between? "2.0.0", "2.3.14" + suggested_version = "3 or use options_for_select" + else + return + end + + @message = msg("Upgrade to ", msg_version(suggested_version), ". In ", msg_version(rails_version), " ", msg_code("select"), " helper is vulnerable") + + calls = tracker.find_call(:target => nil, :method => :select).select do |result| + result[:location][:type] == :template + end + + calls.each do |result| + process_result result + end + end + + def process_result result + return if duplicate? result + + third_arg = result[:call].third_arg + + #Check for user input in options parameter + if sexp? third_arg and include_user_input? third_arg + add_result result + + if string_interp? third_arg + confidence = :medium + else + confidence = :weak + end + + warn :template => result[:location][:template], + :warning_type => "Cross-Site Scripting", + :warning_code => :select_options_vuln, + :result => result, + :message => @message, + :confidence => confidence, + :cwe_id => [79] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_send.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_send.rb new file mode 100644 index 000000000..5c3064dc8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_send.rb @@ -0,0 +1,47 @@ +require 'brakeman/checks/base_check' + +#Checks if user supplied data is passed to send +class Brakeman::CheckSend < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for unsafe use of Object#send" + + def run_check + @send_methods = [:send, :try, :__send__, :public_send] + Brakeman.debug("Finding instances of #send") + calls = tracker.find_call :methods => @send_methods, :nested => true + + calls.each do |call| + process_result call + end + end + + def process_result result + return unless original? result + + send_call = get_send result[:call] + process_call_args send_call + process send_call.target + + if input = has_immediate_user_input?(send_call.first_arg) + warn :result => result, + :warning_type => "Dangerous Send", + :warning_code => :dangerous_send, + :message => "User controlled method execution", + :user_input => input, + :confidence => :high, + :cwe_id => [77] + end + end + + # Recursively check call chain for send call + def get_send exp + if call? exp + if @send_methods.include? exp.method + return exp + else + get_send exp.target + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_send_file.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_send_file.rb new file mode 100644 index 000000000..e45325aef --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_send_file.rb @@ -0,0 +1,19 @@ +require 'brakeman/checks/check_file_access' +require 'brakeman/processors/lib/processor_helper' + +#Checks for user input in send_file() +class Brakeman::CheckSendFile < Brakeman::CheckFileAccess + Brakeman::Checks.add self + + @description = "Check for user input in uses of send_file" + + def run_check + Brakeman.debug "Finding all calls to send_file()" + + methods = tracker.find_call :target => false, :method => :send_file + + methods.each do |call| + process_result call + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_session_manipulation.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_session_manipulation.rb new file mode 100644 index 000000000..2670dc382 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_session_manipulation.rb @@ -0,0 +1,35 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckSessionManipulation < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for user input in session keys" + + def run_check + tracker.find_call(:method => :[]=, :target => :session).each do |result| + process_result result + end + end + + def process_result result + return unless original? result + + index = result[:call].first_arg + + if input = has_immediate_user_input?(index) + if params? index + confidence = :high + else + confidence = :medium + end + + warn :result => result, + :warning_type => "Session Manipulation", + :warning_code => :session_key_manipulation, + :message => msg(msg_input(input), " used as key in session hash"), + :user_input => input, + :confidence => confidence, + :cwe_id => [20] # TODO: what cwe should this be? it seems like it's looking for authz bypass + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_session_settings.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_session_settings.rb new file mode 100644 index 000000000..cbd1424b0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_session_settings.rb @@ -0,0 +1,181 @@ +require 'brakeman/checks/base_check' + +#Checks for session key length and http_only settings +class Brakeman::CheckSessionSettings < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for session key length and http_only settings" + + def initialize *args + super + + unless tracker.options[:rails3] + @session_settings = Sexp.new(:colon2, Sexp.new(:const, :ActionController), :Base) + else + @session_settings = nil + end + end + + def run_check + settings = tracker.config.session_settings + + check_for_issues settings, @app_tree.file_path("config/environment.rb") + + session_store = @app_tree.file_path("config/initializers/session_store.rb") + secret_token = @app_tree.file_path("config/initializers/secret_token.rb") + + [session_store, secret_token].each do |file| + if tracker.initializers[file] and not ignored? file.basename + process tracker.initializers[file] + end + end + + if tracker.options[:rails4] + check_secrets_yaml + end + end + + #Looks for ActionController::Base.session = { ... } + #in Rails 2.x apps + # + #and App::Application.config.secret_token = + #in Rails 3.x apps + # + #and App::Application.config.secret_key_base = + #in Rails 4.x apps + def process_attrasgn exp + if not tracker.options[:rails3] and exp.target == @session_settings and exp.method == :session= + check_for_issues exp.first_arg, @app_tree.file_path("config/initializers/session_store.rb") + end + + if tracker.options[:rails3] and settings_target?(exp.target) and + (exp.method == :secret_token= or exp.method == :secret_key_base=) and string? exp.first_arg + + warn_about_secret_token exp.line, @app_tree.file_path("config/initializers/secret_token.rb") + end + + exp + end + + #Looks for Rails3::Application.config.session_store :cookie_store, { ... } + #in Rails 3.x apps + def process_call exp + if tracker.options[:rails3] and settings_target?(exp.target) and exp.method == :session_store + check_for_rails3_issues exp.second_arg, @app_tree.file_path("config/initializers/session_store.rb") + end + + exp + end + + private + + def settings_target? exp + call? exp and + exp.method == :config and + node_type? exp.target, :colon2 and + exp.target.rhs == :Application + end + + def check_for_issues settings, file + if settings and hash? settings + if value = (hash_access(settings, :session_http_only) || + hash_access(settings, :http_only) || + hash_access(settings, :httponly)) + + if false? value + warn_about_http_only value.line, file + end + end + + if value = hash_access(settings, :secret) + if string? value + warn_about_secret_token value.line, file + end + end + end + end + + def check_for_rails3_issues settings, file + if settings and hash? settings + if value = hash_access(settings, :httponly) + if false? value + warn_about_http_only value.line, file + end + end + + if value = hash_access(settings, :secure) + if false? value + warn_about_secure_only value.line, file + end + end + end + end + + def check_secrets_yaml + secrets_file = @app_tree.file_path("config/secrets.yml") + + if secrets_file.exists? and not ignored? "secrets.yml" and not ignored? "config/*.yml" + yaml = secrets_file.read + require 'yaml' + begin + secrets = YAML.safe_load yaml, aliases: true + rescue Psych::SyntaxError, RuntimeError => e + Brakeman.notify "[Notice] #{self.class}: Unable to parse `#{secrets_file}`" + Brakeman.debug "Failed to parse #{secrets_file}: #{e.inspect}" + return + end + + if secrets && secrets["production"] and secret = secrets["production"]["secret_key_base"] + unless secret.include? "<%=" + line = yaml.lines.find_index { |l| l.include? secret } + 1 + + warn_about_secret_token line, @app_tree.file_path(secrets_file) + end + end + end + end + + def warn_about_http_only line, file + warn :warning_type => "Session Setting", + :warning_code => :http_cookies, + :message => "Session cookies should be set to HTTP only", + :confidence => :high, + :line => line, + :file => file, + :cwe_id => [1004] + + end + + def warn_about_secret_token line, file + warn :warning_type => "Session Setting", + :warning_code => :session_secret, + :message => "Session secret should not be included in version control", + :confidence => :high, + :line => line, + :file => file, + :cwe_id => [798] + end + + def warn_about_secure_only line, file + warn :warning_type => "Session Setting", + :warning_code => :secure_cookies, + :message => "Session cookie should be set to secure only", + :confidence => :high, + :line => line, + :file => file, + :cwe_id => [614] + end + + def ignored? file + [".", "config", "config/initializers"].each do |dir| + ignore_file = @app_tree.file_path("#{dir}/.gitignore") + if @app_tree.exists? ignore_file + input = ignore_file.read + + return true if input.include? file + end + end + + false + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_simple_format.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_simple_format.rb new file mode 100644 index 000000000..68ed5e3be --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_simple_format.rb @@ -0,0 +1,65 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckSimpleFormat < Brakeman::CheckCrossSiteScripting + Brakeman::Checks.add self + + @description = "Checks for simple_format XSS vulnerability (CVE-2013-6416) in certain versions" + + def initialize *args + super + @found_any = false + end + + def run_check + if version_between? "4.0.0", "4.0.1" + @inspect_arguments = true + @ignore_methods = Set[:h, :escapeHTML] + + check_simple_format_usage + generic_warning unless @found_any + end + end + + def generic_warning + message = msg(msg_version(rails_version), " has a vulnerability in ", msg_code("simple_format"), " ", msg_cve("CVE-2013-6416"), ". Upgrade to ", msg_version("4.0.2")) + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2013_6416, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/ruby-security-ann/5ZI1-H5OoIM/ZNq4FoR2GnIJ", + :cwe_id => [79] + end + + def check_simple_format_usage + tracker.find_call(:target => false, :method => :simple_format).each do |result| + @matched = false + process_call result[:call] + if @matched + warn_on_simple_format result, @matched + end + end + end + + def process_call exp + @mark = true + actually_process_call exp + exp + end + + def warn_on_simple_format result, match + return unless original? result + + @found_any = true + + warn :result => result, + :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2013_6416_call, + :message => msg("Values passed to ", msg_code("simple_format"), " are not safe in ", msg_version(rails_version)), + :confidence => :high, + :link_path => "https://groups.google.com/d/msg/ruby-security-ann/5ZI1-H5OoIM/ZNq4FoR2GnIJ", + :user_input => match, + :cwe_id => [79] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_single_quotes.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_single_quotes.rb new file mode 100644 index 000000000..b7f19538a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_single_quotes.rb @@ -0,0 +1,106 @@ +require 'brakeman/checks/base_check' + +#Checks for versions which do not escape single quotes. +#https://groups.google.com/d/topic/rubyonrails-security/kKGNeMrnmiY/discussion +class Brakeman::CheckSingleQuotes < Brakeman::BaseCheck + Brakeman::Checks.add self + RACK_UTILS = Sexp.new(:colon2, Sexp.new(:const, :Rack), :Utils) + + @description = "Check for versions which do not escape single quotes (CVE-2012-3464)" + + def initialize *args + super + @inside_erb = @inside_util = @inside_html_escape = @uses_rack_escape = false + end + + def run_check + return if uses_rack_escape? + + if version_between? '2.0.0', '2.3.14' + message = msg("All Rails 2.x versions do not escape single quotes ", msg_cve("CVE-2012-3464")) + else + message = msg(msg_version(rails_version), " does not escape single quotes ", msg_cve("CVE-2012-3464"), ". Upgrade to ") + + case + when version_between?('3.0.0', '3.0.16') + message << msg_version('3.0.17') + when version_between?('3.1.0', '3.1.7') + message << msg_version('3.1.8') + when version_between?('3.2.0', '3.2.7') + message << msg_version('3.2.8') + else + return + end + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2012_3464, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/kKGNeMrnmiY/discussion", + :cwe_id => [79] + end + + #Process initializers to see if they use workaround + #by replacing Erb::Util.html_escape + def uses_rack_escape? + @tracker.initializers.each do |_name, src| + process src + end + + @uses_rack_escape + end + + #Look for + # + # class ERB + def process_class exp + if exp.class_name == :ERB + @inside_erb = true + process_all exp.body + @inside_erb = false + end + + exp + end + + #Look for + # + # module Util + def process_module exp + if @inside_erb and exp.module_name == :Util + @inside_util = true + process_all exp.body + @inside_util = false + end + + exp + end + + #Look for + # + # def html_escape + def process_defn exp + if @inside_util and exp.method_name == :html_escape + @inside_html_escape = true + process_all exp.body + @inside_html_escape = false + end + + exp + end + + #Look for + # + # Rack::Utils.escape_html + def process_call exp + if @inside_html_escape and exp.target == RACK_UTILS and exp.method == :escape_html + @uses_rack_escape = true + else + process exp.target if exp.target + end + + exp + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_skip_before_filter.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_skip_before_filter.rb new file mode 100644 index 000000000..ab6ab9ba7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_skip_before_filter.rb @@ -0,0 +1,62 @@ +require 'brakeman/checks/base_check' + +#At the moment, this looks for +# +# skip_before_filter :verify_authenticity_token, :except => [...] +# +#which is essentially a skip-by-default approach (no actions are checked EXCEPT the +#ones listed) versus a enforce-by-default approach (ONLY the actions listed will skip +#the check) +class Brakeman::CheckSkipBeforeFilter < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Warn when skipping CSRF or authentication checks by default" + + def run_check + tracker.controllers.each do |_name, controller| + controller.skip_filters.each do |filter| + process_skip_filter filter, controller + end + end + end + + def process_skip_filter filter, controller + case skip_except_value filter + when :verify_authenticity_token + warn :class => controller.name, #ugh this should be a controller warning, too + :warning_type => "Cross-Site Request Forgery", + :warning_code => :csrf_blacklist, + :message => msg("List specific actions (", msg_code(":only => [..]"), ") when skipping CSRF check"), + :code => filter, + :confidence => :medium, + :file => controller.file, + :cwe_id => [352] + + when :login_required, :authenticate_user!, :require_user + warn :controller => controller.name, + :warning_code => :auth_blacklist, + :warning_type => "Authentication", + :message => msg("List specific actions (", msg_code(":only => [..]"), ") when skipping authentication"), + :code => filter, + :confidence => :medium, + :link_path => "authentication_whitelist", + :file => controller.file, + :cwe_id => [287] + end + end + + def skip_except_value filter + return false unless call? filter + + first_arg = filter.first_arg + last_arg = filter.last_arg + + if symbol? first_arg and hash? last_arg + if hash_access(last_arg, :except) + return first_arg.value + end + end + + false + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sprockets_path_traversal.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sprockets_path_traversal.rb new file mode 100644 index 000000000..a657b2db3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sprockets_path_traversal.rb @@ -0,0 +1,40 @@ +class Brakeman::CheckSprocketsPathTraversal < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for CVE-2018-3760" + + def run_check + sprockets_version = tracker.config.gem_version(:sprockets) + + return unless sprockets_version + return if has_workaround? + + case + when version_between?("0.0.0", "2.12.4", sprockets_version) + upgrade_version = "2.12.5" + confidence = :weak + when version_between?("3.0.0", "3.7.1", sprockets_version) + upgrade_version = "3.7.2" + confidence = :high + when version_between?("4.0.0.beta1", "4.0.0.beta7", sprockets_version) + upgrade_version = "4.0.0.beta8" + confidence = :high + else + return + end + + message = msg(msg_version(sprockets_version, "sprockets"), " has a path traversal vulnerability ", msg_cve("CVE-2018-3760"), ". Upgrade to ", msg_version(upgrade_version, "sprockets"), " or newer") + + warn :warning_type => "Path Traversal", + :warning_code => :CVE_2018_3760, + :message => message, + :confidence => confidence, + :gem_info => gemfile_or_environment(:sprockets), + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/ft_J--l55fM/7roDfQ50BwAJ", + :cwe_id => [22, 200] + end + + def has_workaround? + false? (tracker.config.rails[:assets] and tracker.config.rails[:assets][:compile]) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sql.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sql.rb new file mode 100644 index 000000000..4ca632d78 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sql.rb @@ -0,0 +1,759 @@ +require 'brakeman/checks/base_check' + +#This check tests for find calls which do not use Rails' auto SQL escaping +# +#For example: +# Project.find(:all, :conditions => "name = '" + params[:name] + "'") +# +# Project.find(:all, :conditions => "name = '#{params[:name]}'") +# +# User.find_by_sql("SELECT * FROM projects WHERE name = '#{params[:name]}'") +class Brakeman::CheckSQL < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for SQL injection" + + def run_check + # Avoid reporting `user_input` on silly values when generating warning. + # Note that we retroactively find `user_input` inside the "dangerous" value. + @safe_input_attributes.merge IGNORE_METHODS_IN_SQL + + @sql_targets = [:average, :calculate, :count, :count_by_sql, :delete_all, :destroy_all, + :find_by_sql, :maximum, :minimum, :pluck, :sum, :update_all] + @sql_targets.concat [:from, :group, :having, :joins, :lock, :order, :reorder, :where] if tracker.options[:rails3] + @sql_targets.concat [:find_by, :find_by!, :find_or_create_by, :find_or_create_by!, :find_or_initialize_by, :not] if tracker.options[:rails4] + + if tracker.options[:rails6] + @sql_targets.concat [:delete_by, :destroy_by, :rewhere, :reselect] + + @sql_targets.delete :delete_all + @sql_targets.delete :destroy_all + end + + if version_between?("6.1.0", "9.9.9") + @sql_targets.delete :order + @sql_targets.delete :reorder + @sql_targets.delete :pluck + end + + if version_between?("2.0.0", "3.9.9") or tracker.config.rails_version.nil? + @sql_targets << :first << :last << :all + end + + if version_between?("2.0.0", "4.0.99") or tracker.config.rails_version.nil? + @sql_targets << :find + end + + @connection_calls = [:delete, :execute, :insert, :select_all, :select_one, + :select_rows, :select_value, :select_values] + + if tracker.options[:rails3] + @connection_calls.concat [:exec_delete, :exec_insert, :exec_query, :exec_update] + else + @connection_calls.concat [:add_limit!, :add_offset_limit!, :add_lock!] + end + + @expected_targets = active_record_models.keys + [:connection, :"ActiveRecord::Base", :Arel] + + Brakeman.debug "Finding possible SQL calls on models" + calls = tracker.find_call(:methods => @sql_targets, :nested => true) + + narrow_targets = [:exists?, :select] + calls.concat tracker.find_call(:targets => active_record_models.keys, :methods => narrow_targets, :chained => true) + + Brakeman.debug "Finding possible SQL calls with no target" + calls.concat tracker.find_call(:target => nil, :methods => @sql_targets) + + Brakeman.debug "Finding possible SQL calls using constantized()" + calls.concat tracker.find_call(:methods => @sql_targets).select { |result| constantize_call? result } + + calls.concat tracker.find_call(:targets => @expected_targets, :methods => @connection_calls, :chained => true).select { |result| connect_call? result } + + calls.concat tracker.find_call(:target => :Arel, :method => :sql) + + Brakeman.debug "Finding calls to named_scope or scope" + calls.concat find_scope_calls + + Brakeman.debug "Processing possible SQL calls" + calls.each { |call| process_result call } + end + + #Find calls to named_scope() or scope() in models + #RP 3 TODO + def find_scope_calls + scope_calls = [] + + # Used in pre-3.1.0 versions of Rails + ar_scope_calls(:named_scope) do |model, args| + call = make_call(nil, :named_scope, args).line(args.line) + scope_calls << scope_call_hash(call, model, :named_scope) + end + + # Use in 3.1.0 and later + ar_scope_calls(:scope) do |model, args| + second_arg = args[2] + next unless sexp? second_arg + + if second_arg.node_type == :iter and node_type? second_arg.block, :block, :call, :safe_call + process_scope_with_block(model, args) + elsif call? second_arg + call = second_arg + scope_calls << scope_call_hash(call, model, call.method) + else + call = make_call(nil, :scope, args).line(args.line) + scope_calls << scope_call_hash(call, model, :scope) + end + end + + scope_calls + end + + def ar_scope_calls(symbol_name, &block) + active_record_models.each do |name, model| + model_args = model.options[symbol_name] + if model_args + model_args.each do |args| + yield model, args + end + end + end + end + + def scope_call_hash(call, model, method) + { :call => call, :location => { :type => :class, :class => model.name, :file => model.file }, :method => :named_scope } + end + + + def process_scope_with_block model, args + scope_name = args[1][1] + block = args[-1][-1] + + # Search lambda for calls to query methods + if block.node_type == :block + find_calls = Brakeman::FindAllCalls.new(tracker) + find_calls.process_source(block, :class => model.name, :method => scope_name, :file => model.file) + find_calls.calls.each { |call| process_result(call) if @sql_targets.include?(call[:method]) } + elsif call? block + while call? block + process_result :target => block.target, :method => block.method, :call => block, + :location => { :type => :class, :class => model.name, :method => scope_name, :file => model.file } + + block = block.target + end + end + end + + #Process possible SQL injection sites: + # + # Model#find + # + # Model#(named_)scope + # + # Model#(find|count)_by_sql + # + # Model#all + # + ### Rails 3 + # + # Model#(where|having) + # Model#(order|group) + # + ### Find Options Hash + # + # Dangerous keys that accept SQL: + # + # * conditions + # * order + # * having + # * joins + # * select + # * from + # * lock + # + def process_result result + return if duplicate?(result) or result[:call].original_line + + call = result[:call] + method = call.method + + dangerous_value = case method + when :find + check_find_arguments call.second_arg + when :exists? + check_exists call.first_arg + when :delete_all, :destroy_all + check_find_arguments call.first_arg + when :named_scope, :scope + check_scope_arguments call + when :find_by_sql, :count_by_sql + check_by_sql_arguments call.first_arg + when :calculate + if call.arglist.length > 2 + unsafe_sql?(call.second_arg) or check_find_arguments(call.third_arg) + elsif call.arglist.length > 1 + unsafe_sql?(call.second_arg) + end + when :last, :first, :all + check_find_arguments call.first_arg + when :average, :count, :maximum, :minimum, :sum + if call.arglist.length > 1 + unsafe_sql?(call.first_arg) or check_find_arguments(call.last_arg) + else + check_find_arguments call.last_arg + end + when :where, :rewhere, :having, :find_by, :find_by!, :find_or_create_by, :find_or_create_by!, :find_or_initialize_by,:not, :delete_by, :destroy_by + check_query_arguments call.arglist + when :order, :group, :reorder + check_order_arguments call.arglist + when :joins + check_joins_arguments call.first_arg + when :from + unsafe_sql? call.first_arg + when :lock + check_lock_arguments call.first_arg + when :pluck + unsafe_sql? call.first_arg + when :sql + unsafe_sql? call.first_arg + when :update_all, :select, :reselect + check_update_all_arguments call.args + when *@connection_calls + check_by_sql_arguments call.first_arg + else + Brakeman.debug "Unhandled SQL method: #{method}" + end + + if dangerous_value + add_result result + + input = include_user_input? dangerous_value + if input + confidence = :high + user_input = input + else + confidence = :medium + user_input = dangerous_value + end + + if result[:call].target and result[:chain] and not @expected_targets.include? result[:chain].first + confidence = case confidence + when :high + :medium + when :medium + :weak + else + confidence + end + end + + warn :result => result, + :warning_type => "SQL Injection", + :warning_code => :sql_injection, + :message => "Possible SQL injection", + :user_input => user_input, + :confidence => confidence, + :cwe_id => [89] + end + + if check_for_limit_or_offset_vulnerability call.last_arg + if include_user_input? call.last_arg + confidence = :high + else + confidence = :weak + end + + warn :result => result, + :warning_type => "SQL Injection", + :warning_code => :sql_injection_limit_offset, + :message => msg("Upgrade to Rails >= 2.1.2 to escape ", msg_code(":limit"), " and ", msg_code("offset"), ". Possible SQL injection"), + :confidence => confidence, + :cwe_id => [89] + end + end + + + #The 'find' methods accept a number of different types of parameters: + # + # * The first argument might be :all, :first, or :last + # * The first argument might be an integer ID or an array of IDs + # * The second argument might be a hash of options, some of which are + # dangerous and some of which are not + # * The second argument might contain SQL fragments as values + # * The second argument might contain properly parameterized SQL fragments in arrays + # * The second argument might contain improperly parameterized SQL fragments in arrays + # + #This method should only be passed the second argument. + def check_find_arguments arg + return nil if not sexp? arg or node_type? arg, :lit, :string, :str, :true, :false, :nil + + unsafe_sql? arg + end + + def check_scope_arguments call + scope_arg = call.second_arg #first arg is name of scope + + node_type?(scope_arg, :iter) ? unsafe_sql?(scope_arg.block) : unsafe_sql?(scope_arg) + end + + def check_query_arguments arg + return unless sexp? arg + first_arg = arg[1] + + if node_type? arg, :arglist + if arg.length > 2 and string_interp? first_arg + # Model.where("blah = ?", blah) + return check_string_interp first_arg + else + arg = first_arg + end + end + + if request_value? arg + unless call? arg and params? arg.target and [:permit, :slice, :to_h, :to_hash, :symbolize_keys].include? arg.method + # Model.where(params[:where]) + arg + end + elsif hash? arg and not kwsplat? arg + #This is generally going to be a hash of column names and values, which + #would escape the values. But the keys _could_ be user input. + check_hash_keys arg + elsif node_type? arg, :lit, :str + nil + elsif node_type? arg, :or + check_query_arguments(arg.lhs) or + check_query_arguments(arg.rhs) + else + #Hashes are safe...but we check above for hash, so...? + unsafe_sql? arg, :ignore_hash + end + end + + #Checks each argument to order/reorder/group for possible SQL. + #Anything used with these methods is passed in verbatim. + def check_order_arguments args + return unless sexp? args + + if node_type? args, :arglist + check_update_all_arguments(args) + else + unsafe_sql? args + end + end + + #find_by_sql and count_by_sql can take either a straight SQL string + #or an array with values to bind. + def check_by_sql_arguments arg + return unless sexp? arg + + #This is kind of unnecessary, because unsafe_sql? will handle an array + #correctly, but might be better to be explicit. + array?(arg) ? unsafe_sql?(arg[1]) : unsafe_sql?(arg) + end + + #joins can take a string, hash of associations, or an array of both(?) + #We only care about the possible string values. + def check_joins_arguments arg + return unless sexp? arg and not node_type? arg, :hash, :string, :str + + if array? arg + arg.each do |a| + unsafe_arg = check_joins_arguments a + return unsafe_arg if unsafe_arg + end + + nil + else + unsafe_sql? arg + end + end + + def check_update_all_arguments args + args.each do |arg| + unsafe_arg = unsafe_sql? arg + return unsafe_arg if unsafe_arg + end + + nil + end + + #Model#lock essentially only cares about strings. But those strings can be + #any SQL fragment. This does not apply to all databases. (For those who do not + #support it, the lock method does nothing). + def check_lock_arguments arg + return unless sexp? arg and not node_type? arg, :hash, :array, :string, :str + + unsafe_sql?(arg, :ignore_hash) + end + + + #Check hash keys for user input. + #(Seems unlikely, but if a user can control the column names queried, that + #could be bad) + def check_hash_keys exp + hash_iterate(exp) do |key, _value| + unless symbol?(key) + unsafe_key = unsafe_sql? key + return unsafe_key if unsafe_key + end + end + + false + end + + #Check an interpolated string for dangerous values. + # + #This method assumes values interpolated into strings are unsafe by default, + #unless safe_value? explicitly returns true. + def check_string_interp arg + arg.each do |exp| + if dangerous = unsafe_string_interp?(exp) + return dangerous + end + end + + nil + end + + TO_STRING_METHODS = [:chomp, :chop, :lstrip, :rstrip, :scrub, :squish, :strip, + :strip_heredoc, :to_s, :tr] + + #Returns value if interpolated value is not something safe + def unsafe_string_interp? exp + if node_type? exp, :evstr + value = exp.value + else + value = exp + end + + if not sexp? value + nil + elsif call? value and TO_STRING_METHODS.include? value.method + unsafe_string_interp? value.target + elsif call? value and safe_literal_target? value + nil + else + case value.node_type + when :or + unsafe_string_interp?(value.lhs) || unsafe_string_interp?(value.rhs) + when :dstr + if dangerous = check_string_interp(value) + return dangerous + end + else + if safe_value? value + nil + elsif string_building? value + check_for_string_building value + else + value + end + end + end + end + + #Checks the given expression for unsafe SQL values. If an unsafe value is + #found, returns that value (may be the given _exp_ or a subexpression). + # + #Otherwise, returns false/nil. + def unsafe_sql? exp, ignore_hash = false + return unless sexp?(exp) + + dangerous_value = find_dangerous_value exp, ignore_hash + safe_value?(dangerous_value) ? false : dangerous_value + end + + #Check _exp_ for dangerous values. Used by unsafe_sql? + def find_dangerous_value exp, ignore_hash + case exp.node_type + when :lit, :str, :const, :colon2, :true, :false, :nil + nil + when :array + #Assume this is an array like + # + # ["blah = ? AND thing = ?", ...] + # + #and check first value + unsafe_sql? exp[1] + when :dstr + check_string_interp exp + when :hash + if kwsplat? exp and has_immediate_user_input? exp + exp + elsif not ignore_hash + check_hash_values exp + else + nil + end + when :if + unsafe_sql? exp.then_clause or unsafe_sql? exp.else_clause + when :call + unless IGNORE_METHODS_IN_SQL.include? exp.method + if has_immediate_user_input? exp + exp + elsif TO_STRING_METHODS.include? exp.method + find_dangerous_value exp.target, ignore_hash + else + check_call exp + end + end + when :or + if unsafe = (unsafe_sql?(exp.lhs) || unsafe_sql?(exp.rhs)) + unsafe + else + nil + end + when :block, :rlist + unsafe_sql? exp.last + else + if has_immediate_user_input? exp + exp + else + nil + end + end + end + + #Checks hash values associated with these keys: + # + # * conditions + # * order + # * having + # * joins + # * select + # * from + # * lock + def check_hash_values exp + hash_iterate(exp) do |key, value| + if symbol? key + unsafe = case key.value + when :conditions, :having, :select + check_query_arguments value + when :order, :group + check_order_arguments value + when :joins + check_joins_arguments value + when :lock + check_lock_arguments value + when :from + unsafe_sql? value + else + nil + end + + return unsafe if unsafe + end + end + + false + end + + def check_for_string_building exp + return unless call? exp + + target = exp.target + method = exp.method + arg = exp.first_arg + + if STRING_METHODS.include? method + check_str_target_or_arg(target, arg) or + check_interp_target_or_arg(target, arg) or + check_for_string_building(target) or + check_for_string_building(arg) + else + nil + end + end + + def check_str_target_or_arg target, arg + if string? target + check_string_arg arg + elsif string? arg + check_string_arg target + end + end + + def check_interp_target_or_arg target, arg + if string_interp? target or string_interp? arg + check_string_arg target and + check_string_arg arg + end + end + + def check_string_arg exp + if safe_value? exp + nil + elsif string_building? exp + check_for_string_building exp + elsif string_interp? exp + check_string_interp exp + elsif call? exp and exp.method == :to_s + check_string_arg exp.target + else + exp + end + end + + IGNORE_METHODS_IN_SQL = Set[:id, :merge_conditions, :table_name, :quoted_table_name, + :quoted_primary_key, :to_i, :to_f, :sanitize_sql, :sanitize_sql_array, + :sanitize_sql_for_assignment, :sanitize_sql_for_conditions, :sanitize_sql_hash, + :sanitize_sql_hash_for_assignment, :sanitize_sql_hash_for_conditions, + :to_sql, :sanitize, :primary_key, :table_name_prefix, :table_name_suffix, + :where_values_hash, :foreign_key, :uuid, :escape, :escape_string + ] + + def ignore_methods_in_sql + @ignore_methods_in_sql ||= IGNORE_METHODS_IN_SQL + (tracker.options[:sql_safe_methods] || []) + end + + def safe_value? exp + return true unless sexp? exp + + case exp.node_type + when :str, :lit, :const, :colon2, :nil, :true, :false + true + when :call + if exp.method == :to_s or exp.method == :to_sym + safe_value? exp.target + else + ignore_call? exp + end + when :if + safe_value? exp.then_clause and safe_value? exp.else_clause + when :block, :rlist + safe_value? exp.last + when :or + safe_value? exp.lhs and safe_value? exp.rhs + when :dstr + not unsafe_string_interp? exp + else + false + end + end + + def ignore_call? exp + return unless call? exp + + ignore_methods_in_sql.include? exp.method or + quote_call? exp or + arel? exp or + exp.method.to_s.end_with? "_id" or + number_target? exp or + date_target? exp or + locale_call? exp + end + + QUOTE_METHODS = [:quote, :quote_column_name, :quoted_date, :quote_string, :quote_table_name] + + def quote_call? exp + if call? exp.target + exp.target.method == :connection and QUOTE_METHODS.include? exp.method + elsif exp.target.nil? + exp.method == :quote_value + end + end + + AREL_METHODS = [:all, :and, :arel_table, :as, :eq, :eq_any, :exists, :group, + :gt, :gteq, :having, :in, :join_sources, :limit, :lt, :lteq, :not, + :not_eq, :on, :or, :order, :project, :skip, :take, :where, :with] + + def arel? exp + call? exp and (AREL_METHODS.include? exp.method or arel? exp.target) + end + + #Check call for string building + def check_call exp + return unless call? exp + unsafe = check_for_string_building exp + + if unsafe + unsafe + elsif call? exp.target + check_call exp.target + else + nil + end + end + + def check_exists arg + if call? arg and arg.method == :to_s + false + else + check_find_arguments arg + end + end + + #Prior to Rails 2.1.1, the :offset and :limit parameters were not + #escaping input properly. + # + #http://www.rorsecurity.info/2008/09/08/sql-injection-issue-in-limit-and-offset-parameter/ + def check_for_limit_or_offset_vulnerability options + return false if rails_version.nil? or rails_version >= "2.1.1" or not hash?(options) + + return true if hash_access(options, :limit) or hash_access(options, :offset) + + false + end + + #Look for something like this: + # + # params[:x].constantize.find('something') + # + # s(:call, + # s(:call, + # s(:call, + # s(:call, nil, :params, s(:arglist)), + # :[], + # s(:arglist, s(:lit, :x))), + # :constantize, + # s(:arglist)), + # :find, + # s(:arglist, s(:str, "something"))) + def constantize_call? result + call = result[:call] + call? call.target and call.target.method == :constantize + end + + SELF_CLASS = s(:call, s(:self), :class) + + def connect_call? result + call = result[:call] + target = call.target + + if call? target and target.method == :connection + target = target.target + klass = class_name(target) + + target.nil? or + target == SELF_CLASS or + node_type? target, :self or + klass == :"ActiveRecord::Base" or + active_record_models.include? klass + end + end + + def number_target? exp + return unless call? exp + + if number? exp.target + true + elsif call? exp.target + number_target? exp.target + else + false + end + end + + DATE_CLASS = s(:const, :Date) + + def date_target? exp + return unless call? exp + + if exp.target == DATE_CLASS + true + elsif call? exp.target + date_target? exp.target + else + false + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sql_cves.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sql_cves.rb new file mode 100644 index 000000000..23b7cdf18 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_sql_cves.rb @@ -0,0 +1,108 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckSQLCVEs < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for several SQL CVEs" + + def run_check + check_rails_versions_against_cve_issues + check_cve_2014_0080 + end + + def check_rails_versions_against_cve_issues + issues = [ + { + :cve => "CVE-2012-2660", + :versions => [%w[2.0.0 2.3.14 2.3.17], %w[3.0.0 3.0.12 3.0.13], %w[3.1.0 3.1.4 3.1.5], %w[3.2.0 3.2.3 3.2.4]], + :url => "https://groups.google.com/d/topic/rubyonrails-security/8SA-M3as7A8/discussion" + }, + { + :cve => "CVE-2012-2661", + :versions => [%w[3.0.0 3.0.12 3.0.13], %w[3.1.0 3.1.4 3.1.5], %w[3.2.0 3.2.3 3.2.5]], + :url => "https://groups.google.com/d/topic/rubyonrails-security/dUaiOOGWL1k/discussion" + }, + { + :cve => "CVE-2012-2695", + :versions => [%w[2.0.0 2.3.14 2.3.15], %w[3.0.0 3.0.13 3.0.14], %w[3.1.0 3.1.5 3.1.6], %w[3.2.0 3.2.5 3.2.6]], + :url => "https://groups.google.com/d/topic/rubyonrails-security/l4L0TEVAz1k/discussion" + }, + { + :cve => "CVE-2012-5664", + :versions => [%w[2.0.0 2.3.14 2.3.15], %w[3.0.0 3.0.17 3.0.18], %w[3.1.0 3.1.8 3.1.9], %w[3.2.0 3.2.9 3.2.18]], + :url => "https://groups.google.com/d/topic/rubyonrails-security/DCNTNp_qjFM/discussion" + }, + { + :cve => "CVE-2013-0155", + :versions => [%w[2.0.0 2.3.15 2.3.16], %w[3.0.0 3.0.18 3.0.19], %w[3.1.0 3.1.9 3.1.10], %w[3.2.0 3.2.10 3.2.11]], + :url => "https://groups.google.com/d/topic/rubyonrails-security/c7jT-EeN9eI/discussion" + }, + { + :cve => "CVE-2016-6317", + :versions => [%w[4.2.0 4.2.7.0 4.2.7.1]], + :url => "https://groups.google.com/d/msg/ruby-security-ann/WccgKSKiPZA/9DrsDVSoCgAJ" + }, + + ] + + unless lts_version? '2.3.18.6' + issues << { + :cve => "CVE-2013-6417", + :versions => [%w[2.0.0 3.2.15 3.2.16], %w[4.0.0 4.0.1 4.0.2]], + :url => "https://groups.google.com/d/msg/ruby-security-ann/niK4drpSHT4/g8JW8ZsayRkJ" + } + end + + if tracker.config.has_gem? :pg + issues << { + :cve => "CVE-2014-3482", + :versions => [%w[2.0.0 2.9.9 3.2.19], %w[3.0.0 3.2.18 3.2.19], %w[4.0.0 4.0.6 4.0.7], %w[4.1.0 4.1.2 4.1.3]], + :url => "https://groups.google.com/d/msg/rubyonrails-security/wDxePLJGZdI/WP7EasCJTA4J" + } << + { + :cve => "CVE-2014-3483", + :versions => [%w[2.0.0 2.9.9 3.2.19], %w[3.0.0 3.2.18 3.2.19], %w[4.0.0 4.0.6 4.0.7], %w[4.1.0 4.1.2 4.1.3]], + :url => "https://groups.google.com/d/msg/rubyonrails-security/wDxePLJGZdI/WP7EasCJTA4J" } + end + + issues.each do |cve_issue| + cve_warning_for cve_issue[:versions], cve_issue[:cve], cve_issue[:url] + end + end + + def cve_warning_for versions, cve, link + upgrade_version = upgrade_version? versions + return unless upgrade_version + + code = cve.tr('-', '_').to_sym + + warn :warning_type => 'SQL Injection', + :warning_code => code, + :message => msg(msg_version(rails_version), " contains a SQL injection vulnerability ", msg_cve(cve), ". Upgrade to ", msg_version(upgrade_version)), + :confidence => :high, + :gem_info => gemfile_or_environment, + :link_path => link, + :cwe_id => [89] + end + + def upgrade_version? versions + versions.each do |low, high, upgrade| + return upgrade if version_between? low, high + end + + false + end + + def check_cve_2014_0080 + return unless version_between? "4.0.0", "4.0.2" and + @tracker.config.has_gem? :pg + + warn :warning_type => 'SQL Injection', + :warning_code => :CVE_2014_0080, + :message => msg(msg_version(rails_version), " contains a SQL injection vulnerability ", msg_cve("CVE-2014-0080"), " with PostgreSQL. Upgrade to ", msg_version("4.0.3")), + :confidence => :high, + :gem_info => gemfile_or_environment(:pg), + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/Wu96YkTUR6s/pPLBMZrlwvYJ", + :cwe_id => [89] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_ssl_verify.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_ssl_verify.rb new file mode 100644 index 000000000..8926b6742 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_ssl_verify.rb @@ -0,0 +1,49 @@ +require 'brakeman/checks/base_check' + +# Checks if verify_mode= is called with OpenSSL::SSL::VERIFY_NONE + +class Brakeman::CheckSSLVerify < Brakeman::BaseCheck + Brakeman::Checks.add self + + SSL_VERIFY_NONE = s(:colon2, s(:colon2, s(:const, :OpenSSL), :SSL), :VERIFY_NONE) + + @description = "Checks for OpenSSL::SSL::VERIFY_NONE" + + def run_check + check_open_ssl_verify_none + check_http_start + end + + def check_open_ssl_verify_none + tracker.find_call(:method => :verify_mode=).each {|call| process_verify_mode_result(call) } + end + + def process_verify_mode_result result + if result[:call].last_arg == SSL_VERIFY_NONE + warn_about_ssl_verification_bypass result + end + end + + def check_http_start + tracker.find_call(:target => :'Net::HTTP', :method => :start).each { |call| process_http_start_result call } + end + + def process_http_start_result result + arg = result[:call].last_arg + + if hash? arg and hash_access(arg, :verify_mode) == SSL_VERIFY_NONE + warn_about_ssl_verification_bypass result + end + end + + def warn_about_ssl_verification_bypass result + return unless original? result + + warn :result => result, + :warning_type => "SSL Verification Bypass", + :warning_code => :ssl_verification_bypass, + :message => "SSL certificate verification was bypassed", + :confidence => :high, + :cwe_id => [295] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_strip_tags.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_strip_tags.rb new file mode 100644 index 000000000..7d9990980 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_strip_tags.rb @@ -0,0 +1,94 @@ +require 'brakeman/checks/base_check' + +#Check for uses of strip_tags in Rails versions before 3.0.17, 3.1.8, 3.2.8 (including 2.3.x): +#https://groups.google.com/d/topic/rubyonrails-security/FgVEtBajcTY/discussion +# +#Check for uses of strip_tags in Rails versions before 2.3.13 and 3.0.10: +#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/2b9130749b74ea12 +# +#Check for user of strip_tags with rails-html-sanitizer 1.0.2: +#https://groups.google.com/d/msg/rubyonrails-security/OU9ugTZcbjc/PjEP46pbFQAJ +class Brakeman::CheckStripTags < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Report strip_tags vulnerabilities" + + def run_check + if uses_strip_tags? + cve_2011_2931 + cve_2012_3465 + end + + cve_2015_7579 + end + + def cve_2011_2931 + if version_between?('2.0.0', '2.3.12') or version_between?('3.0.0', '3.0.9') + if rails_version =~ /^3/ + message = msg("Versions before 3.0.10 have a vulnerability in ", msg_code("strip_tags"), " ", msg_cve("CVE-2011-2931")) + else + message = msg("Versions before 2.3.13 have a vulnerability in ", msg_code("strip_tags"), " ", msg_cve("CVE-2011-2931")) + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2011_2931, + :message => message, + :gem_info => gemfile_or_environment, + :confidence => :high, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/K5EwdJt06hI/discussion", + :cwe_id => [79] + end + end + + def cve_2012_3465 + message = msg(msg_version(rails_version), " has a vulnerability in ", msg_code("strip_tags"), " ", msg_cve("CVE-2012-3465"), ". Upgrade to ") + + case + when (version_between?('2.0.0', '2.3.14') and tracker.config.escape_html?) + message = msg("All Rails 2.x versions have a vulnerability in ", msg_code("strip_tags"), " ", msg_cve("CVE-2012-3465")) + when version_between?('3.0.10', '3.0.16') + message << msg_version('3.0.17') + when version_between?('3.1.0', '3.1.7') + message << msg_version('3.1.8') + when version_between?('3.2.0', '3.2.7') + message << msg_version('3.2.8') + else + return + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2012_3465, + :message => message, + :confidence => :high, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/FgVEtBajcTY/discussion", + :cwe_id => [79] + end + + def cve_2015_7579 + if tracker.config.gem_version(:'rails-html-sanitizer') == '1.0.2' + if uses_strip_tags? + confidence = :high + else + confidence = :medium + end + + message = msg(msg_version("1.0.2", "rails-html-sanitizer"), " is vulnerable (CVE-2015-7579). Upgrade to ", msg_version("1.0.3", "rails-html-sanitizer")) + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :CVE_2015_7579, + :message => message, + :confidence => confidence, + :gem_info => gemfile_or_environment(:"rails-html-sanitizer"), + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/OU9ugTZcbjc/PjEP46pbFQAJ", + :cwe_id => [79] + + end + end + + def uses_strip_tags? + Brakeman.debug "Finding calls to strip_tags()" + + not tracker.find_call(:target => false, :method => :strip_tags, :nested => true).empty? + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_symbol_dos.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_symbol_dos.rb new file mode 100644 index 000000000..64f90d7d4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_symbol_dos.rb @@ -0,0 +1,72 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckSymbolDoS < Brakeman::BaseCheck + Brakeman::Checks.add_optional self + + UNSAFE_METHODS = [:to_sym, :literal_to_sym, :intern, :symbolize_keys, :symbolize_keys!] + + @description = "Checks for symbol denial of service" + + def run_check + return if rails_version and rails_version >= "5.0.0" + return if tracker.config.ruby_version and tracker.config.ruby_version >= "2.2" + + tracker.find_call(:methods => UNSAFE_METHODS, :nested => true).each do |result| + check_unsafe_symbol_creation(result) + end + end + + def check_unsafe_symbol_creation result + return unless original? result + + call = result[:call] + + if result[:method] == :literal_to_sym + args = call.select { |e| sexp? e } + else + args = [call.target] + end + + if input = args.map{ |arg| has_immediate_user_input?(arg) }.compact.first + confidence = :high + elsif input = args.map{ |arg| include_user_input?(arg) }.compact.first + confidence = :medium + end + + + if confidence + return if safe_parameter? input.match + return if symbolizing_attributes? input + + message = msg("Symbol conversion from unsafe string in ", msg_input(input)) + + warn :result => result, + :warning_type => "Denial of Service", + :warning_code => :unsafe_symbol_creation, + :message => message, + :user_input => input, + :confidence => confidence, + :cwe_id => [20] + end + end + + def safe_parameter? input + if call? input + if node_type? input.target, :params + input.method == :[] and + symbol? input.first_arg and + [:controller, :action].include? input.first_arg.value + else + safe_parameter? input.target + end + else + false + end + end + + def symbolizing_attributes? input + input.type == :model and + call? input.match and + input.match.method == :attributes + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_symbol_dos_cve.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_symbol_dos_cve.rb new file mode 100644 index 000000000..870d925ad --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_symbol_dos_cve.rb @@ -0,0 +1,31 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckSymbolDoSCVE < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for versions with ActiveRecord symbol denial of service vulnerability" + + def run_check + fix_version = case + when version_between?('2.0.0', '2.3.17') + '2.3.18' + when version_between?('3.1.0', '3.1.11') + '3.1.12' + when version_between?('3.2.0', '3.2.12') + '3.2.13' + else + nil + end + + if fix_version && active_record_models.any? + warn :warning_type => "Denial of Service", + :warning_code => :CVE_2013_1854, + :message => msg(msg_version(rails_version), " has a denial of service vulnerability in ActiveRecord. Upgrade to ", msg_version(fix_version), " or patch"), + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link => "https://groups.google.com/d/msg/rubyonrails-security/jgJ4cjjS8FE/BGbHRxnDRTIJ", + :cwe_id => [20] + end + end +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_template_injection.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_template_injection.rb new file mode 100644 index 000000000..a7727e07f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_template_injection.rb @@ -0,0 +1,33 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckTemplateInjection < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Searches for evaluation of user input through template injection" + + #Process calls + def run_check + Brakeman.debug "Finding ERB.new calls" + erb_calls = tracker.find_call :target => :ERB, :method => :new, :nested => true + + Brakeman.debug "Processing ERB.new calls" + erb_calls.each do |call| + process_result call + end + end + + #Warns if eval includes user input + def process_result result + return unless original? result + + if input = include_user_input?(result[:call].arglist) + warn :result => result, + :warning_type => "Template Injection", + :warning_code => :erb_template_injection, + :message => msg(msg_input(input), " used directly in ", msg_code("ERB"), " template, which might enable remote code execution"), + :user_input => input, + :confidence => :high, + :cwe_id => [1336] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_translate_bug.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_translate_bug.rb new file mode 100644 index 000000000..56f30ee6a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_translate_bug.rb @@ -0,0 +1,46 @@ +require 'brakeman/checks/base_check' + +#Check for vulnerability in translate() helper that allows cross-site scripting +class Brakeman::CheckTranslateBug < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Report XSS vulnerability in translate helper" + + def run_check + return if lts_version? '2.3.18.6' + if (version_between?('2.3.0', '2.3.99') and tracker.config.escape_html?) or + version_between?('3.0.0', '3.0.10') or + version_between?('3.1.0', '3.1.1') + + confidence = if uses_translate? + :high + else + :medium + end + + description = [" has a vulnerability in the translate helper with keys ending in ", msg_code("_html")] + + message = if rails_version =~ /^3\.1/ + msg(msg_version(rails_version), *description, ". Upgrade to ", msg_version("3.1.2")) + elsif rails_version =~ /^3\.0/ + msg(msg_version(rails_version), *description, ". Upgrade to ", msg_version("3.0.11")) + else + msg("Rails 2.3.x using the rails_xss plugin", *description) + end + + warn :warning_type => "Cross-Site Scripting", + :warning_code => :translate_vuln, + :message => message, + :confidence => confidence, + :gem_info => gemfile_or_environment, + :link_path => "http://groups.google.com/group/rubyonrails-security/browse_thread/thread/2b61d70fb73c7cc5", + :cwe_id => [79] + end + end + + def uses_translate? + Brakeman.debug "Finding calls to translate() or t()" + + tracker.find_call(:target => nil, :methods => [:t, :translate]).any? + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unsafe_reflection.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unsafe_reflection.rb new file mode 100644 index 000000000..a19dd41b0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unsafe_reflection.rb @@ -0,0 +1,56 @@ +require 'brakeman/checks/base_check' + +# Checks for string interpolation and parameters in calls to +# String#constantize, String#safe_constantize, Module#const_get and Module#qualified_const_get. +# +# Exploit examples at: http://blog.conviso.com.br/exploiting-unsafe-reflection-in-rubyrails-applications/ +class Brakeman::CheckUnsafeReflection < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for unsafe reflection" + + def run_check + reflection_methods = [:constantize, :safe_constantize, :const_get, :qualified_const_get] + + tracker.find_call(:methods => reflection_methods, :nested => true).each do |result| + check_unsafe_reflection result + end + end + + def check_unsafe_reflection result + return unless original? result + + call = result[:call] + method = call.method + + case method + when :constantize, :safe_constantize + arg = call.target + else + arg = call.first_arg + end + + if input = has_immediate_user_input?(arg) + confidence = :high + elsif input = include_user_input?(arg) + confidence = :medium + end + + if confidence + case method + when :constantize, :safe_constantize + message = msg("Unsafe reflection method ", msg_code(method), " called on ", msg_input(input)) + else + message = msg("Unsafe reflection method ", msg_code(method), " called with ", msg_input(input)) + end + + warn :result => result, + :warning_type => "Remote Code Execution", + :warning_code => :unsafe_constantize, + :message => message, + :user_input => input, + :confidence => confidence, + :cwe_id => [470] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unsafe_reflection_methods.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unsafe_reflection_methods.rb new file mode 100644 index 000000000..a48260256 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unsafe_reflection_methods.rb @@ -0,0 +1,69 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckUnsafeReflectionMethods < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for unsafe reflection to access methods" + + def run_check + check_method + check_tap + check_to_proc + end + + def check_method + tracker.find_call(method: :method, nested: true).each do |result| + argument = result[:call].first_arg + + if user_input = include_user_input?(argument) + warn_unsafe_reflection(result, user_input) + end + end + end + + def check_tap + tracker.find_call(method: :tap, nested: true).each do |result| + argument = result[:call].first_arg + + # Argument is passed like a.tap(&argument) + if node_type? argument, :block_pass + argument = argument.value + end + + if user_input = include_user_input?(argument) + warn_unsafe_reflection(result, user_input) + end + end + end + + def check_to_proc + tracker.find_call(method: :to_proc, nested: true).each do |result| + target = result[:call].target + + if user_input = include_user_input?(target) + warn_unsafe_reflection(result, user_input) + end + end + end + + def warn_unsafe_reflection result, input + return unless original? result + method = result[:call].method + + confidence = if input.type == :params + :high + else + :medium + end + + message = msg("Unsafe reflection method ", msg_code(method), " called with ", msg_input(input)) + + warn :result => result, + :warning_type => "Remote Code Execution", + :warning_code => :unsafe_method_reflection, + :message => message, + :user_input => input, + :confidence => confidence, + :cwe_id => [470] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unscoped_find.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unscoped_find.rb new file mode 100644 index 000000000..9b72cd6c6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_unscoped_find.rb @@ -0,0 +1,66 @@ +require 'brakeman/checks/base_check' + +# Checks for unscoped calls to models' #find and #find_by_id methods. +class Brakeman::CheckUnscopedFind < Brakeman::BaseCheck + Brakeman::Checks.add_optional self + + @description = "Check for unscoped ActiveRecord queries" + + def run_check + Brakeman.debug("Finding instances of #find on models with associations") + + associated_model_names = active_record_models.keys.select do |name| + if belongs_to = active_record_models[name].associations[:belongs_to] + not optional_belongs_to? belongs_to + else + false + end + end + + calls = tracker.find_call :method => [:find, :find_by_id, :find_by_id!], + :targets => associated_model_names + + calls.each do |call| + process_result call + end + + tracker.find_call(:methods => [:find_by, :find_by!], :targets => associated_model_names).each do |result| + arg = result[:call].first_arg + + if hash? arg and hash_access(arg, :id) + process_result result + end + end + end + + def process_result result + return if duplicate? result or result[:call].original_line + + # Not interested unless argument is user controlled. + inputs = result[:call].args.map { |arg| include_user_input?(arg) } + return unless input = inputs.compact.first + + add_result result + + warn :result => result, + :warning_type => "Unscoped Find", + :warning_code => :unscoped_find, + :message => msg("Unscoped call to ", msg_code("#{result[:target]}##{result[:method]}")), + :code => result[:call], + :confidence => :weak, + :user_input => input, + :cwe_id => [285] + end + + def optional_belongs_to? exp + return false unless exp.is_a? Array + + exp.each do |e| + if hash? e and true? hash_access(e, :optional) + return true + end + end + + false + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_validation_regex.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_validation_regex.rb new file mode 100644 index 000000000..32f899a8f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_validation_regex.rb @@ -0,0 +1,117 @@ +require 'brakeman/checks/base_check' + +#Reports any calls to +validates_format_of+ which do not use +\A+ and +\z+ +#as anchors in the given regular expression. +# +#For example: +# +# #Allows anything after new line +# validates_format_of :user_name, :with => /^\w+$/ +class Brakeman::CheckValidationRegex < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Report uses of validates_format_of with improper anchors" + + WITH = Sexp.new(:lit, :with) + FORMAT = Sexp.new(:lit, :format) + + def run_check + active_record_models.each do |name, model| + @current_model = model + format_validations = model.options[:validates_format_of] + + if format_validations + format_validations.each do |v| + process_validates_format_of v + end + end + + validates = model.options[:validates] + + if validates + validates.each do |v| + process_validates v + end + end + end + end + + #Check validates_format_of + def process_validates_format_of validator + if value = hash_access(validator.last, WITH) + check_regex value, validator + end + end + + #Check validates ..., :format => ... + def process_validates validator + hash_arg = validator.last + return unless hash? hash_arg + + value = hash_access(hash_arg, FORMAT) + + if hash? value + value = hash_access(value, WITH) + end + + if value + check_regex value, validator + end + end + + # Match secure regexp without extended option + SECURE_REGEXP_PATTERN = %r{ + \A + \\A + .* + \\[zZ] + \z + }x + + # Match secure of regexp with extended option + EXTENDED_SECURE_REGEXP_PATTERN = %r{ + \A + \s* + \\A + .* + \\[zZ] + \s* + \z + }mx + + #Issue warning if the regular expression does not use + #+\A+ and +\z+ + def check_regex value, validator + return unless regexp? value + + regex = value.value + unless secure_regex?(regex) + warn :model => @current_model, + :warning_type => "Format Validation", + :warning_code => :validation_regex, + :message => msg("Insufficient validation for ", msg_code(get_name validator), " using ", msg_code(regex.inspect), ". Use ", msg_code("\\A"), " and ", msg_code("\\z"), " as anchors"), + :line => value.line, + :confidence => :high, + :cwe_id => [777] + end + end + + #Get the name of the attribute being validated. + def get_name validator + name = validator[1] + + if sexp? name + name.value + else + name + end + end + + private + + def secure_regex?(regex) + extended_regex = Regexp::EXTENDED == regex.options & Regexp::EXTENDED + regex_pattern = extended_regex ? EXTENDED_SECURE_REGEXP_PATTERN : SECURE_REGEXP_PATTERN + regex_pattern =~ regex.source + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_verb_confusion.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_verb_confusion.rb new file mode 100644 index 000000000..95ecd8ff1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_verb_confusion.rb @@ -0,0 +1,76 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckVerbConfusion < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for uses of `request.get?` that might have unintentional behavior" + + #Process calls + def run_check + calls = tracker.find_call(target: :request, methods: [:get?]) + + calls.each do |call| + process_result call + end + end + + def process_result result + @current_result = result + @matched_call = result[:call] + klass = tracker.find_class(result[:location][:class]) + + # TODO: abstract into tracker.find_location ? + if klass.nil? + Brakeman.debug "No class found: #{result[:location][:class]}" + return + end + + method = klass.get_method(result[:location][:method]) + + if method.nil? + Brakeman.debug "No method found: #{result[:location][:method]}" + return + end + + process method.src + end + + def process_if exp + if exp.condition == @matched_call + # Found `if request.get?` + + # Do not warn if there is an `elsif` clause + if node_type? exp.else_clause, :if + return exp + end + + warn_about_result @current_result, exp + end + + exp + end + + def warn_about_result result, code + return unless original? result + + confidence = :weak + message = msg('Potential HTTP verb confusion. ', + msg_code('HEAD'), + ' is routed like ', + msg_code('GET'), + ' but ', + msg_code('request.get?'), + ' will return ', + msg_code('false') + ) + + warn :result => result, + :warning_type => "HTTP Verb Confusion", + :warning_code => :http_verb_confusion, + :message => message, + :code => code, + :user_input => result[:call], + :confidence => confidence, + :cwe_id => [352] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_weak_hash.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_weak_hash.rb new file mode 100644 index 000000000..1d3406881 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_weak_hash.rb @@ -0,0 +1,150 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckWeakHash < Brakeman::BaseCheck + Brakeman::Checks.add_optional self + + @description = "Checks for use of weak hashes like MD5" + + DIGEST_CALLS = [:base64digest, :digest, :hexdigest, :new] + + def run_check + tracker.find_call(:targets => [:'Digest::MD5', :'Digest::SHA1', :'OpenSSL::Digest::MD5', :'OpenSSL::Digest::SHA1'], :nested => true).each do |result| + process_hash_result result + end + + tracker.find_call(:target => :'Digest::HMAC', :methods => [:new, :hexdigest], :nested => true).each do |result| + process_hmac_result result + end + + tracker.find_call(:targets => [:'OpenSSL::Digest::Digest', :'OpenSSL::Digest'], :method => :new).each do |result| + process_openssl_result result + end + end + + def process_hash_result result + return unless original? result + + input = nil + call = result[:call] + + if DIGEST_CALLS.include? call.method + if input = user_input_as_arg?(call) + confidence = :high + elsif input = hashing_password?(call) + confidence = :high + else + confidence = :medium + end + else + confidence = :medium + end + + message = msg("Weak hashing algorithm used") + + case call.target.last + when :MD5 + message << ": " << msg_lit("MD5") + when :SHA1 + message << ": " << msg_lit("SHA1") + end + + warn :result => result, + :warning_type => "Weak Hash", + :warning_code => :weak_hash_digest, + :message => message, + :confidence => confidence, + :user_input => input, + :cwe_id => [328] + end + + def process_hmac_result result + return unless original? result + + call = result[:call] + + message = msg("Weak hashing algorithm used in HMAC") + + case call.third_arg.last + when :MD5 + message << ": " << msg_lit("MD5") + when :SHA1 + message << ": " << msg_lit("SHA1") + end + + warn :result => result, + :warning_type => "Weak Hash", + :warning_code => :weak_hash_hmac, + :message => message, + :confidence => :medium, + :cwe_id => [328] + end + + def process_openssl_result result + return unless original? result + + arg = result[:call].first_arg + + if string? arg + alg = arg.value.upcase + + if alg == 'MD5' or alg == 'SHA1' + warn :result => result, + :warning_type => "Weak Hash", + :warning_code => :weak_hash_digest, + :message => msg("Weak hashing algorithm used: ", msg_lit(alg)), + :confidence => :medium, + :cwe_id => [328] + end + end + end + + def user_input_as_arg? call + call.each_arg do |arg| + if input = include_user_input?(arg) + return input + end + end + + nil + end + + def hashing_password? call + call.each_arg do |arg| + @has_password = false + + process arg + + if @has_password + return @has_password + end + end + + nil + end + + def process_call exp + if exp.method == :password + @has_password = exp + else + process_default exp + end + + exp + end + + def process_ivar exp + if exp.value == :@password + @has_password = exp + end + + exp + end + + def process_lvar exp + if exp.value == :password + @has_password = exp + end + + exp + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_weak_rsa_key.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_weak_rsa_key.rb new file mode 100644 index 000000000..3f9dbfc54 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_weak_rsa_key.rb @@ -0,0 +1,112 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckWeakRSAKey < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for weak uses RSA keys" + + def run_check + check_rsa_key_creation + check_rsa_operations + end + + def check_rsa_key_creation + tracker.find_call(targets: [:'OpenSSL::PKey::RSA'], method: [:new, :generate], nested: true).each do |result| + key_size_arg = result[:call].first_arg + check_key_size(result, key_size_arg) + end + + tracker.find_call(targets: [:'OpenSSL::PKey'], method: [:generate_key], nested: true).each do |result| + call = result[:call] + key_type = call.first_arg + options_arg = call.second_arg + + next unless options_arg and hash? options_arg + + if string? key_type and key_type.value.upcase == 'RSA' + key_size_arg = (hash_access(options_arg, :rsa_keygen_bits) || hash_access(options_arg, s(:str, 'rsa_key_gen_bits'))) + check_key_size(result, key_size_arg) + end + end + end + + def check_rsa_operations + tracker.find_call(targets: [:'OpenSSL::PKey::RSA.new'], methods: [:public_encrypt, :public_decrypt, :private_encrypt, :private_decrypt], nested: true).each do |result| + padding_arg = result[:call].second_arg + check_padding(result, padding_arg) + end + + tracker.find_call(targets: [:'OpenSSL::PKey.generate_key'], methods: [:encrypt, :decrypt, :sign, :verify, :sign_raw, :verify_raw], nested: true).each do |result| + call = result[:call] + options_arg = call.last_arg + + if options_arg and hash? options_arg + padding_arg = (hash_access(options_arg, :rsa_padding_mode) || hash_access(options_arg, s(:str, 'rsa_padding_mode'))) + else + padding_arg = nil + end + + check_padding(result, padding_arg) + end + end + + def check_key_size result, key_size_arg + return unless number? key_size_arg + return unless original? result + + key_size = key_size_arg.value + + if key_size < 1024 + confidence = :high + message = msg("RSA key with size ", msg_code(key_size.to_s), " is considered very weak. Use at least 2048 bit key size") + elsif key_size < 2048 + confidence = :medium + message = msg("RSA key with size ", msg_code(key_size.to_s), " is considered weak. Use at least 2048 bit key size") + else + return + end + + warn result: result, + warning_type: "Weak Cryptography", + warning_code: :small_rsa_key_size, + message: message, + confidence: confidence, + user_input: key_size_arg, + cwe_id: [326] + end + + PKCS1_PADDING = s(:colon2, s(:colon2, s(:colon2, s(:const, :OpenSSL), :PKey), :RSA), :PKCS1_PADDING).freeze + PKCS1_PADDING_STR = s(:str, 'pkcs1').freeze + SSLV23_PADDING = s(:colon2, s(:colon2, s(:colon2, s(:const, :OpenSSL), :PKey), :RSA), :SSLV23_PADDING).freeze + SSLV23_PADDING_STR = s(:str, 'sslv23').freeze + NO_PADDING = s(:colon2, s(:colon2, s(:colon2, s(:const, :OpenSSL), :PKey), :RSA), :NO_PADDING).freeze + NO_PADDING_STR = s(:str, 'none').freeze + + def check_padding result, padding_arg + return unless original? result + + if string? padding_arg + padding_arg = padding_arg.deep_clone(padding_arg.line) + padding_arg.value = padding_arg.value.downcase + end + + case padding_arg + when PKCS1_PADDING, PKCS1_PADDING_STR, nil + message = "Use of padding mode PKCS1 (default if not specified), which is known to be insecure. Use OAEP instead" + when SSLV23_PADDING, SSLV23_PADDING_STR + message = "Use of padding mode SSLV23 for RSA key, which is only useful for outdated versions of SSL. Use OAEP instead" + when NO_PADDING, NO_PADDING_STR + message = "No padding mode used for RSA key. A safe padding mode (OAEP) should be specified for RSA keys" + else + return + end + + warn result: result, + warning_type: "Weak Cryptography", + warning_code: :insecure_rsa_padding_mode, + message: message, + confidence: :high, + user_input: padding_arg, + cwe_id: [780] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_without_protection.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_without_protection.rb new file mode 100644 index 000000000..e7f03046d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_without_protection.rb @@ -0,0 +1,81 @@ +require 'brakeman/checks/base_check' + +#Check for bypassing mass assignment protection +#with without_protection => true +# +#Only for Rails 3.1 +class Brakeman::CheckWithoutProtection < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Check for mass assignment using without_protection" + + def run_check + if version_between? "0.0.0", "3.0.99" + return + end + + return if active_record_models.empty? + + Brakeman.debug "Finding all mass assignments" + calls = tracker.find_call :targets => active_record_models.keys, :methods => [:new, + :attributes=, + :update_attributes, + :update_attributes!, + :create, + :create!] + + Brakeman.debug "Processing all mass assignments" + calls.each do |result| + process_result result + end + end + + #All results should be Model.new(...) or Model.attributes=() calls + def process_result res + call = res[:call] + last_arg = call.last_arg + + if hash? last_arg and not call.original_line and not duplicate? res + + if value = hash_access(last_arg, :without_protection) + if true? value + add_result res + + if input = include_user_input?(call.arglist) + confidence = :high + elsif all_literals? call + return + else + confidence = :medium + end + + warn :result => res, + :warning_type => "Mass Assignment", + :warning_code => :mass_assign_without_protection, + :message => "Unprotected mass assignment", + :code => call, + :user_input => input, + :confidence => confidence, + :cwe_id => [915] + + end + end + end + end + + def all_literals? call + call.each_arg do |arg| + if hash? arg + hash_iterate arg do |k, v| + unless node_type? k, :str, :lit, :false, :true and node_type? v, :str, :lit, :false, :true + return false + end + end + else + return false + end + end + + true + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_xml_dos.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_xml_dos.rb new file mode 100644 index 000000000..aa36224d9 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_xml_dos.rb @@ -0,0 +1,46 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckXMLDoS < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for XML denial of service (CVE-2015-3227)" + + def run_check + version = rails_version + + fix_version = case + when version_between?("2.0.0", "3.2.21") + "3.2.22" + when version_between?("4.1.0", "4.1.10") + "4.1.11" + when version_between?("4.2.0", "4.2.1") + "4.2.2" + when version_between?("4.0.0", "4.0.99") + "4.2.2" + else + return + end + + return if has_workaround? + + message = msg(msg_version(version), " is vulnerable to denial of service via XML parsing ", msg_cve("CVE-2015-3227"), ". Upgrade to ", msg_version(fix_version)) + + warn :warning_type => "Denial of Service", + :warning_code => :CVE_2015_3227, + :message => message, + :confidence => :medium, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/msg/rubyonrails-security/bahr2JLnxvk/x4EocXnHPp8J", + :cwe_id => [125] + end + + def has_workaround? + tracker.find_call(target: :"ActiveSupport::XmlMini", method: :backend=).any? do |match| + arg = match[:call].first_arg + if string? arg + value = arg.value + value == 'Nokogiri' or value == 'LibXML' + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_yaml_parsing.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_yaml_parsing.rb new file mode 100644 index 000000000..e7b8bb383 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/check_yaml_parsing.rb @@ -0,0 +1,115 @@ +require 'brakeman/checks/base_check' + +class Brakeman::CheckYAMLParsing < Brakeman::BaseCheck + Brakeman::Checks.add self + + @description = "Checks for YAML parsing vulnerabilities (CVE-2013-0156)" + + def run_check + return unless version_between? "0.0.0", "2.3.14" or + version_between? "3.0.0", "3.0.18" or + version_between? "3.1.0", "3.1.9" or + version_between? "3.2.0", "3.2.10" + + unless disabled_xml_parser? or disabled_xml_dangerous_types? + new_version = if version_between? "0.0.0", "2.3.14" + "2.3.15" + elsif version_between? "3.0.0", "3.0.18" + "3.0.19" + elsif version_between? "3.1.0", "3.1.9" + "3.1.10" + elsif version_between? "3.2.0", "3.2.10" + "3.2.11" + end + + message = msg(msg_version(rails_version), " has a remote code execution vulnerability. Upgrade to ", msg_version(new_version), " or disable XML parsing") + + warn :warning_type => "Remote Code Execution", + :warning_code => :CVE_2013_0156, + :message => message, + :confidence => :high, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/61bkgvnSGTQ/discussion", + :cwe_id => [20] + end + + #Warn if app accepts YAML + if version_between?("0.0.0", "2.3.14") and enabled_yaml_parser? + message = "Parsing YAML request parameters enables remote code execution: disable YAML parser" + + warn :warning_type => "Remote Code Execution", + :warning_code => :CVE_2013_0156, + :message => message, + :confidence => :high, + :gem_info => gemfile_or_environment, + :link_path => "https://groups.google.com/d/topic/rubyonrails-security/61bkgvnSGTQ/discussion", + :cwe_id => [20] + end + end + + def disabled_xml_parser? + if version_between? "0.0.0", "2.3.14" + #Look for ActionController::Base.param_parsers.delete(Mime::XML) + matches = tracker.find_call(target: :"ActionController::Base.param_parsers", method: :delete) + else + #Look for ActionDispatch::ParamsParser::DEFAULT_PARSERS.delete(Mime::XML) + matches = tracker.find_call(target: :"ActionDispatch::ParamsParser::DEFAULT_PARSERS", method: :delete) + end + + unless matches.empty? + mime_xml = s(:colon2, s(:const, :Mime), :XML) + + matches.each do |result| + if result[:call].first_arg == mime_xml + return true + end + end + end + + false + end + + #Look for ActionController::Base.param_parsers[Mime::YAML] = :yaml + #in Rails 2.x apps + def enabled_yaml_parser? + matches = tracker.find_call(target: :'ActionController::Base.param_parsers', method: :[]=) + + mime_yaml = s(:colon2, s(:const, :Mime), :YAML) + + matches.each do |result| + if result[:call].first_arg == mime_yaml and + symbol? result[:call].second_arg and + result[:call].second_arg.value == :yaml + + return true + end + end + + false + end + + def disabled_xml_dangerous_types? + if version_between? "0.0.0", "2.3.14" + matches = tracker.find_call(target: :"ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING", method: :delete) + else + matches = tracker.find_call(target: :"ActiveSupport::XmlMini::PARSING", method: :delete) + end + + symbols_off = false + yaml_off = false + + matches.each do |result| + arg = result[:call].first_arg + + if string? arg + if arg.value == "yaml" + yaml_off = true + elsif arg.value == "symbol" + symbols_off = true + end + end + end + + symbols_off and yaml_off + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/eol_check.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/eol_check.rb new file mode 100644 index 000000000..52245db46 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/checks/eol_check.rb @@ -0,0 +1,49 @@ +require 'date' +require 'brakeman/checks/base_check' + +# Not used directly - base check for EOLRails and EOLRuby +class Brakeman::EOLCheck < Brakeman::BaseCheck + def check_eol_version library, eol_dates + version = case library + when :rails + tracker.config.rails_version + when :ruby + tracker.config.ruby_version + else + raise 'Implement using tracker.config.gem_version' + end + + eol_dates.each do |(start_version, end_version), eol_date| + if version_between? start_version, end_version, version + case + when Date.today >= eol_date + warn_about_unsupported_version library, eol_date, version + when (Date.today + 30) >= eol_date + warn_about_soon_unsupported_version library, eol_date, version, :medium + when (Date.today + 60) >= eol_date + warn_about_soon_unsupported_version library, eol_date, version, :low + end + + break + end + end + end + + def warn_about_soon_unsupported_version library, eol_date, version, confidence + warn warning_type: 'Unmaintained Dependency', + warning_code: :"pending_eol_#{library}", + message: msg("Support for ", msg_version(version, library.capitalize), " ends on #{eol_date}"), + confidence: confidence, + gem_info: gemfile_or_environment(library), + :cwe_id => [1104] + end + + def warn_about_unsupported_version library, eol_date, version + warn warning_type: 'Unmaintained Dependency', + warning_code: :"eol_#{library}", + message: msg("Support for ", msg_version(version, library.capitalize), " ended on #{eol_date}"), + confidence: :high, + gem_info: gemfile_or_environment(library), + :cwe_id => [1104] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/codeclimate/engine_configuration.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/codeclimate/engine_configuration.rb new file mode 100644 index 000000000..56548864c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/codeclimate/engine_configuration.rb @@ -0,0 +1,97 @@ +require 'pathname' + +module Brakeman + module Codeclimate + class EngineConfiguration + + def initialize(engine_config = {}) + @engine_config = engine_config + end + + def options + default_options.merge(configured_options) + end + + private + + attr_reader :engine_config + + def default_options + @default_options = { + :output_format => :codeclimate, + :quiet => true, + :pager => false, + :app_path => Dir.pwd + } + if system("test -w /dev/stdout") + @default_options[:output_files] = ["/dev/stdout"] + end + @default_options + end + + def configured_options + @configured_options = {} + # ATM this gets parsed as a string instead of bool: "config":{ "debug":"true" } + if brakeman_configuration["debug"] && brakeman_configuration["debug"].to_s.downcase == "true" + @configured_options[:debug] = true + @configured_options[:report_progress] = false + end + + if active_include_paths + @configured_options[:only_files] = active_include_paths + end + + if brakeman_configuration["app_path"] + @configured_options[:path_prefix] = brakeman_configuration["app_path"] + path = Pathname.new(Dir.pwd) + brakeman_configuration["app_path"] + @configured_options[:app_path] = path.to_s + end + @configured_options + end + + def brakeman_configuration + if engine_config["config"] + engine_config["config"] + else + {} + end + end + + def active_include_paths + @active_include_paths ||= + if brakeman_configuration["app_path"] + stripped_include_paths(brakeman_configuration["app_path"]) + else + engine_config["include_paths"] && engine_config["include_paths"].compact + end + end + + def stripped_include_paths(prefix) + subprefixes = path_subprefixes(prefix) + engine_config["include_paths"] && engine_config["include_paths"].map do |path| + next unless path + stripped_include_path(prefix, subprefixes, path) + end.compact + end + + def path_subprefixes(path) + Pathname.new(path).each_filename.inject([]) do |memo, piece| + memo << + if memo.any? + File.join(memo.last, piece) + else + File.join(piece) + end + end + end + + def stripped_include_path(prefix, subprefixes, path) + if path.start_with?(prefix) + path.sub(%r{^#{prefix}/?}, "/") + elsif subprefixes.any? { |subprefix| path =~ %r{^#{subprefix}/?$} } + "/" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/commandline.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/commandline.rb new file mode 100644 index 000000000..d0b403c45 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/commandline.rb @@ -0,0 +1,208 @@ +require 'brakeman/options' + +module Brakeman + + # Implements handling of running Brakeman from the command line. + class Commandline + class << self + + # Main method to run Brakeman from the command line. + # + # If no options are provided, ARGV will be parsed and used instead. + # Otherwise, the options are expected to be a Hash like the one returned + # after ARGV is parsed. + def start options = nil, app_path = "." + + unless options + options, app_path = parse_options ARGV + end + + run options, app_path + end + + # Runs everything: + # + # - `set_interrupt_handler` + # - `early_exit_options` + # - `set_options` + # - `check_latest` + # - `run_report` + def run options, default_app_path = "." + set_interrupt_handler options + early_exit_options options + set_options options, default_app_path + check_latest if options[:ensure_latest] + run_report options + end + + # Check for the latest version. + # + # If the latest version is newer, quit with a message. + def check_latest + if error = Brakeman.ensure_latest + quit Brakeman::Not_Latest_Version_Exit_Code, error + end + end + + # Runs a comparison report based on the options provided. + def compare_results options + require 'json' + vulns = Brakeman.compare options.merge(:quiet => options[:quiet]) + + if options[:comparison_output_file] + File.open options[:comparison_output_file], "w" do |f| + f.puts JSON.pretty_generate(vulns) + end + + Brakeman.notify "Comparison saved in '#{options[:comparison_output_file]}'" + else + puts JSON.pretty_generate(vulns) + end + + if options[:exit_on_warn] && vulns[:new].count > 0 + quit Brakeman::Warnings_Found_Exit_Code + end + end + + # Handle options that exit without generating a report. + def early_exit_options options + if options[:list_checks] or options[:list_optional_checks] + Brakeman.list_checks options + quit + elsif options[:create_config] + Brakeman.dump_config options + quit + elsif options[:show_help] + puts Brakeman::Options.create_option_parser({}) + quit + elsif options[:show_version] + require 'brakeman/version' + puts "brakeman #{Brakeman::Version}" + quit + end + end + + # Parse ARGV-style array of options. + # + # Exits if options are invalid. + # + # Returns an option hash and the app_path. + def parse_options argv + begin + options, _ = Brakeman::Options.parse! argv + rescue OptionParser::ParseError => e + $stderr.puts e.message + $stderr.puts "Please see `brakeman --help` for valid options" + quit(-1) + end + + if argv[-1] + app_path = argv[-1] + else + app_path = "." + end + + if options[:ensure_ignore_notes] and options[:previous_results_json] + warn '[Notice] --ensure-ignore-notes may not be used at the same ' \ + 'time as --compare. Deactivating --ensure-ignore-notes. ' \ + 'Please see `brakeman --help` for valid options' + options[:ensure_ignore_notes] = false + end + + return options, app_path + end + + # Exits with the given exit code and prints out the message, if given. + # + # Override this method for different behavior. + def quit exit_code = 0, message = nil + warn message if message + exit exit_code + end + + # Runs a regular report based on the options provided. + def regular_report options + tracker = run_brakeman options + + ensure_ignore_notes_failed = false + if tracker.options[:ensure_ignore_notes] + fingerprints = Brakeman::ignore_file_entries_with_empty_notes tracker.ignored_filter&.file + + unless fingerprints.empty? + ensure_ignore_notes_failed = true + warn '[Error] Notes required for all ignored warnings when ' \ + '--ensure-ignore-notes is set. No notes provided for these ' \ + 'warnings: ' + fingerprints.each { |f| warn f } + end + end + + if tracker.options[:exit_on_warn] and not tracker.filtered_warnings.empty? + quit Brakeman::Warnings_Found_Exit_Code + end + + if tracker.options[:exit_on_error] and tracker.errors.any? + quit Brakeman::Errors_Found_Exit_Code + end + + if tracker.options[:ensure_no_obsolete_ignore_entries] && tracker.unused_fingerprints.any? + warn '[Error] Obsolete ignore entries were found, exiting with an error code.' + quit Brakeman::Obsolete_Ignore_Entries_Exit_Code + end + + if ensure_ignore_notes_failed + quit Brakeman::Empty_Ignore_Note_Exit_Code + end + end + + # Actually run Brakeman. + # + # Returns a Tracker object. + def run_brakeman options + Brakeman.run options.merge(:print_report => true, :quiet => options[:quiet]) + end + + # Run either a comparison or regular report based on options provided. + def run_report options + begin + if options[:previous_results_json] + compare_results options + else + regular_report options + end + rescue Brakeman::NoApplication => e + quit Brakeman::No_App_Found_Exit_Code, e.message + rescue Brakeman::MissingChecksError => e + quit Brakeman::Missing_Checks_Exit_Code, e.message + end + end + + # Sets interrupt handler to gracefully handle Ctrl+C + def set_interrupt_handler options + trap("INT") do + warn "\nInterrupted - exiting." + + if options[:debug] + warn caller + end + + exit! + end + end + + # Modifies options, including setting the app_path + # if none is given in the options hash. + def set_options options, default_app_path = "." + unless options[:app_path] + options[:app_path] = default_app_path + end + + if options[:quiet].nil? + options[:quiet] = :command_line + end + + options + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/differ.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/differ.rb new file mode 100644 index 000000000..c7b48f65c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/differ.rb @@ -0,0 +1,49 @@ +# extracting the diff logic to it's own class for consistency. Currently handles +# an array of Brakeman::Warnings or plain hash representations. +class Brakeman::Differ + attr_reader :old_warnings, :new_warnings + + def initialize new_warnings, old_warnings + @new_warnings = new_warnings + @old_warnings = old_warnings + end + + def diff + warnings = {} + warnings[:new] = @new_warnings - @old_warnings + warnings[:fixed] = @old_warnings - @new_warnings + + second_pass(warnings) + end + + # second pass to cleanup any vulns which have changed in line number only. + # Given a list of new warnings, delete pairs of new/fixed vulns that differ + # only by line number. + def second_pass(warnings) + new_fingerprints = Set.new(warnings[:new].map(&method(:fingerprint))) + fixed_fingerprints = Set.new(warnings[:fixed].map(&method(:fingerprint))) + + # Remove warnings which fingerprints are both in :new and :fixed + shared_fingerprints = new_fingerprints.intersection(fixed_fingerprints) + + unless shared_fingerprints.empty? + warnings[:new].delete_if do |warning| + shared_fingerprints.include?(fingerprint(warning)) + end + + warnings[:fixed].delete_if do |warning| + shared_fingerprints.include?(fingerprint(warning)) + end + end + + warnings + end + + def fingerprint(warning) + if warning.is_a?(Brakeman::Warning) + warning.fingerprint + else + warning[:fingerprint] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/file_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/file_parser.rb new file mode 100644 index 000000000..1d5be54b4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/file_parser.rb @@ -0,0 +1,121 @@ +require 'parallel' + +module Brakeman + ASTFile = Struct.new(:path, :ast) + + # This class handles reading and parsing files. + class FileParser + attr_reader :file_list, :errors + + def initialize app_tree, timeout, parallel = true, use_prism = false + @use_prism = use_prism + + if @use_prism + begin + require 'prism' + Brakeman.debug '[Notice] Using Prism parser' + rescue LoadError => e + Brakeman.debug "[Notice] Asked to use Prism, but failed to load: #{e}" + @use_prism = false + end + end + + @app_tree = app_tree + @timeout = timeout + @file_list = [] + @errors = [] + @parallel = parallel + end + + def parse_files list + if @parallel + parallel_options = {} + else + # Disable parallelism + parallel_options = { in_threads: 0 } + end + + # Parse the files in parallel. + # By default, the parsing will be in separate processes. + # So we map the result to ASTFiles and/or Exceptions + # then partition them into ASTFiles and Exceptions + # and add the Exceptions to @errors + # + # Basically just a funky way to deal with two possible + # return types that are returned from isolated processes. + # + # Note this method no longer uses read_files + @file_list, new_errors = Parallel.map(list, parallel_options) do |file_name| + file_path = @app_tree.file_path(file_name) + contents = file_path.read + + begin + if ast = parse_ruby(contents, file_path.relative) + ASTFile.new(file_name, ast) + end + rescue Exception => e + e + end + end.compact.partition do |result| + result.is_a? ASTFile + end + + errors.concat new_errors + end + + def read_files list + list.each do |path| + file = @app_tree.file_path(path) + + begin + result = yield file, file.read + + if result + @file_list << result + end + rescue Exception => e + @errors << e + end + end + end + + # _path_ can be a string or a Brakeman::FilePath + def parse_ruby input, path + if path.is_a? Brakeman::FilePath + path = path.relative + end + + Brakeman.debug "Parsing #{path}" + + if @use_prism + begin + parse_with_prism input, path + rescue => e + Brakeman.debug "Prism failed to parse #{path}: #{e}" + + parse_with_ruby_parser input, path + end + else + parse_with_ruby_parser input, path + end + end + + private + + def parse_with_prism input, path + Prism::Translation::RubyParser.parse(input, path) + end + + def parse_with_ruby_parser input, path + begin + RubyParser.new.parse input, path, @timeout + rescue Racc::ParseError => e + raise e.exception(e.message + "\nCould not parse #{path}") + rescue Timeout::Error => e + raise Exception.new("Parsing #{path} took too long (> #{@timeout} seconds). Try increasing the limit with --parser-timeout") + rescue => e + raise e.exception(e.message + "\nWhile processing #{path}") + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/file_path.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/file_path.rb new file mode 100644 index 000000000..6087ad7d8 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/file_path.rb @@ -0,0 +1,89 @@ +require 'pathname' + +module Brakeman + # Class to represent file paths within Brakeman. + # FilePath objects track both the relative and absolute paths + # to make it easier to manage paths. + class FilePath + attr_reader :absolute, :relative + @cache = {} + + # Create a new FilePath using an AppTree object. + # + # Note that if the path is already a FilePath, that path will + # be returned unaltered. + # + # Additionally, paths are cached. If the absolute path already has + # a FilePath in the cache, that existing FilePath will be returned. + def self.from_app_tree app_tree, path + return path if path.is_a? Brakeman::FilePath + + absolute = app_tree.expand_path(path).freeze + + if fp = @cache[absolute] + return fp + end + + relative = app_tree.relative_path(path).freeze + + self.new(absolute, relative).tap { |fp| @cache[absolute] = fp } + end + + # Create a new FilePath with the given absolute and relative paths. + def initialize absolute_path, relative_path + @absolute = absolute_path + @relative = relative_path + end + + # Just the file name, no path + def basename + @basename ||= File.basename(self.relative) + end + + # Read file from absolute path. + def read + File.read self.absolute + end + + # Check if absolute path exists. + def exists? + File.exist? self.absolute + end + + # Compare FilePaths. Raises an ArgumentError unless both objects are FilePaths. + def <=> rhs + raise ArgumentError unless rhs.is_a? Brakeman::FilePath + self.relative <=> rhs.relative + end + + # Compare FilePaths. Raises an ArgumentError unless both objects are FilePaths. + def == rhs + return false unless rhs.is_a? Brakeman::FilePath + + self.absolute == rhs.absolute + end + + # Returns a string with the absolute path. + def to_str + self.absolute + end + + # Required for Pathname compatibility. + # Ruby 3.5+ requires Pathname#initialize to receive a String or an object with to_path method. + alias to_path to_str + + # Returns a string with the absolute path. + def to_s + self.to_str + end + + def hash + @hash ||= [@absolute, @relative].hash + end + + def eql? rhs + @absolute == rhs.absolute and + @relative == rhs.relative + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/format/style.css b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/format/style.css new file mode 100644 index 000000000..d9fc5573d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/format/style.css @@ -0,0 +1,141 @@ +/* CSS style used for HTML reports */ + +body { + font-family: sans-serif; + color: #161616; +} + +a { + color: #161616; +} + +p { + font-weight: bold; + font-size: 11pt; + color: #2D0200; + } + + th { + background-color: #980905; + border-bottom: 5px solid #530200; + color: white; + font-size: 11pt; + padding: 1px 8px 1px 8px; + } + + td { + border-bottom: 2px solid white; + font-family: monospace; + padding: 5px 8px 1px 8px; + } + + table { + background-color: #FCF4D4; + border-collapse: collapse; + } + + h1 { + color: #2D0200; + font-size: 14pt; + } + + h2 { + color: #2D0200; + font-size: 12pt; + } + + span.high-confidence { + font-weight:bold; + color: red; + } + + span.med-confidence { + } + + span.weak-confidence { + color:gray; + } + + div.warning_message { + cursor: pointer; + } + + div.warning_message:hover { + background-color: white; + } + + table caption { + background-color: #FFE; + padding: 2px; + } + + table.context { + margin-top: 5px; + margin-bottom: 5px; + border-left: 1px solid #90e960; + color: #212121; + } + + tr.context { + background-color: white; + } + + tr.first { + border-top: 1px solid #7ecc54; + padding-top: 2px; + } + + tr.error { + background-color: #f4c1c1 !important + } + + tr.near_error { + background-color: #f4d4d4 !important + } + + tr.alt { + background-color: #e8f4d4; + } + + td.context { + padding: 2px 10px 0px 6px; + border-bottom: none; + } + + td.context_line { + padding: 2px 8px 0px 7px; + border-right: 1px solid #b3bda4; + border-bottom: none; + color: #6e7465; + } + + pre.context { + margin-bottom: 1px; + } + + .user_input { + background-color: #fcecab; + } + + div.render_path { + display: none; + background-color: #ffe; + padding: 5px; + margin: 2px 0px 2px 0px; + } + + div.template_name { + cursor: pointer; + } + + div.template_name:hover { + background-color: white; + } + + span.code { + font-family: monospace; + } + + span.filename { + font-family: monospace; + } diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/messages.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/messages.rb new file mode 100644 index 000000000..7a939a514 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/messages.rb @@ -0,0 +1,220 @@ +module Brakeman + module Messages + # Create a new message from a list of messages. + # Strings are converted to Brakeman::Messages::Plain objects. + def msg *args + parts = args.map do |a| + if a.is_a? String + Plain.new(a) + else + a + end + end + + Message.new(*parts) + end + + # Create a new code message fragment + def msg_code code + Code.new code + end + + # Create a new message fragment with a CVE identifier + def msg_cve cve + CVE.new cve + end + + # Create a new message fragment representing a file name + def msg_file str + Messages::FileName.new str + end + + # Create a new message fragment from a user input type (e.g. `:params`). + # The input type will be converted to a friendly version (e.g. "parameter value"). + def msg_input input + Input.new input + end + + # Create a new message fragment which will not be modified during output + def msg_lit str + Literal.new str + end + + # Create a new plain string message fragment + def msg_plain str + Plain.new str + end + + # Create a message fragment representing the version of a library + def msg_version version, lib = "Rails" + Version.new version, lib + end + end +end + +# Class to represent a list of message types +class Brakeman::Messages::Message + def initialize *args + @parts = args.map do |a| + case a + when String, Symbol + Brakeman::Messages::Plain.new(a.to_s) + else + a + end + end + end + + def << msg + if msg.is_a? String + @parts << Brakeman::Messages::Plain.new(msg) + else + @parts << msg + end + end + + def to_s + output = @parts.map(&:to_s).join + + case @parts.first + when Brakeman::Messages::Code, Brakeman::Messages::Literal, Brakeman::Messages::Version + else + output[0] = output[0].capitalize + end + + output + end + + def to_html + require 'cgi/escape' + + output = @parts.map(&:to_html).join + + case @parts.first + when Brakeman::Messages::Code, Brakeman::Messages::Literal, Brakeman::Messages::Version + else + output[0] = output[0].capitalize + end + + output + end +end + +class Brakeman::Messages::Code + def initialize code + @code = code.to_s + end + + def to_s + "`#{@code}`" + end + + def to_html + "<span class=\"code\">#{CGI.escapeHTML(@code)}</span>" + end +end + +class Brakeman::Messages::CVE + def initialize cve + @cve = cve + end + + def to_s + "(#{@cve})" + end + + def to_html + "(<a href=\"https://cve.mitre.org/cgi-bin/cvename.cgi?name=#{@cve}\" target=\"_blank\" rel=\"noreferrer\">#{@cve}</a>)" + end +end + +class Brakeman::Messages::FileName + def initialize file + @file = file + end + + def to_s + "`#{@file}`" + end + + def to_html + "<span class=\"filename\">#{CGI.escapeHTML(@file)}</span>" + end +end + +class Brakeman::Messages::Input + def initialize input + @input = input + @value = friendly_type_of(@input) + end + + def friendly_type_of input_type + if input_type.is_a? Brakeman::BaseCheck::Match + input_type = input_type.type + end + + case input_type + when :params + "parameter value" + when :cookies + "cookie value" + when :request + "request value" + when :model + "model attribute" + else + "user input" + end + end + + def to_s + @value + end + + def to_html + self.to_s + end +end + +class Brakeman::Messages::Literal + def initialize value + @value = value.to_s + end + + def to_s + @value + end + + def to_html + @value + end +end + +class Brakeman::Messages::Plain + def initialize string + @value = string + end + + def to_s + @value + end + + def to_html + CGI.escapeHTML(@value) + end +end + +class Brakeman::Messages::Version + def initialize version, lib + @version = version + @library = lib + end + + def to_s + "#{@library} #{@version}" + end + + def to_html + CGI.escapeHTML(self.to_s) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/options.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/options.rb new file mode 100644 index 000000000..d1ee1c223 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/options.rb @@ -0,0 +1,441 @@ +require 'optparse' +require 'set' + +#Parses command line arguments for Brakeman +module Brakeman::Options + + class << self + + #Parse argument array + def parse args + get_options args + end + + #Parse arguments and remove them from the array as they are matched + def parse! args + get_options args, true + end + + #Return hash of options and the parser + def get_options args, destructive = false + options = {} + + parser = create_option_parser options + + if destructive + parser.parse! args + else + parser.parse args + end + + if options[:previous_results_json] and options[:output_files] + options[:comparison_output_file] = options[:output_files].shift + end + + return options, parser + end + + def create_option_parser options + OptionParser.new do |opts| + opts.banner = "Usage: brakeman [options] rails/root/path" + + opts.on "-n", "--no-threads", "Run checks and file parsing sequentially" do + options[:parallel_checks] = false + end + + opts.on "--[no-]progress", "Show progress reports" do |progress| + options[:report_progress] = progress + end + + opts.on "-p", "--path PATH", "Specify path to Rails application" do |path| + options[:app_path] = path + end + + opts.on "-q", "--[no-]quiet", "Suppress informational messages" do |quiet| + options[:quiet] = quiet + end + + opts.on( "-z", "--[no-]exit-on-warn", "Exit code is non-zero if warnings found (Default)") do |exit_on_warn| + options[:exit_on_warn] = exit_on_warn + end + + opts.on "--[no-]exit-on-error", "Exit code is non-zero if errors raised (Default)" do |exit_on_error| + options[:exit_on_error] = exit_on_error + end + + opts.on "--ensure-latest", "Fail when Brakeman is outdated" do + options[:ensure_latest] = true + end + + opts.on "--ensure-ignore-notes", "Fail when an ignored warnings does not include a note" do + options[:ensure_ignore_notes] = true + end + + opts.on "--ensure-no-obsolete-ignore-entries", "Fail when an obsolete ignore entry is found" do + options[:ensure_no_obsolete_ignore_entries] = true + end + + opts.on "-3", "--rails3", "Force Rails 3 mode" do + options[:rails3] = true + end + + opts.on "-4", "--rails4", "Force Rails 4 mode" do + options[:rails3] = true + options[:rails4] = true + end + + opts.on "-5", "--rails5", "Force Rails 5 mode" do + options[:rails3] = true + options[:rails4] = true + options[:rails5] = true + end + + opts.on "-6", "--rails6", "Force Rails 6 mode" do + options[:rails3] = true + options[:rails4] = true + options[:rails5] = true + options[:rails6] = true + end + + opts.on "-7", "--rails7", "Force Rails 7 mode" do + options[:rails3] = true + options[:rails4] = true + options[:rails5] = true + options[:rails6] = true + options[:rails7] = true + end + + opts.on "-8", "--rails8", "Force Rails 8 mode" do + options[:rails3] = true + options[:rails4] = true + options[:rails5] = true + options[:rails6] = true + options[:rails7] = true + options[:rails8] = true + end + + opts.separator "" + opts.separator "Scanning options:" + + opts.on "-A", "--run-all-checks", "Run all default and optional checks" do + options[:run_all_checks] = true + end + + opts.on "-a", "--[no-]assume-routes", "Assume all controller methods are actions (Default)" do |assume| + options[:assume_all_routes] = assume + end + + opts.on "-e", "--escape-html", "Escape HTML by default" do + options[:escape_html] = true + end + + opts.on "--faster", "Faster, but less accurate scan" do + options[:ignore_ifs] = true + options[:skip_libs] = true + options[:disable_constant_tracking] = true + end + + opts.on "--ignore-model-output", "Consider model attributes XSS-safe" do + options[:ignore_model_output] = true + end + + opts.on "--ignore-protected", "Consider models with attr_protected safe" do + options[:ignore_attr_protected] = true + end + + opts.on "--[no-]index-libs", "Add libraries to call index (Default)" do |index| + options[:index_libs] = index + end + + opts.on "--interprocedural", "Process method calls to known methods" do + options[:interprocedural] = true + end + + opts.on "--no-branching", "Disable flow sensitivity on conditionals" do + options[:ignore_ifs] = true + end + + opts.on "--branch-limit LIMIT", Integer, "Limit depth of values in branches (-1 for no limit)" do |limit| + options[:branch_limit] = limit + end + + opts.on "--parser-timeout SECONDS", Integer, "Set parse timeout (Default: 10)" do |timeout| + options[:parser_timeout] = timeout + end + + opts.on "--[no-]prism", "Use the Prism parser" do |use_prism| + if use_prism + min_prism_version = '1.0.0' + + begin + gem 'prism', ">=#{min_prism_version}" + require 'prism' + rescue Gem::MissingSpecVersionError, Gem::MissingSpecError, Gem::LoadError => e + $stderr.puts "Please install `prism` version #{min_prism_version} or newer:" + raise e + end + end + + options[:use_prism] = use_prism + end + + opts.on "-r", "--report-direct", "Only report direct use of untrusted data" do |option| + options[:check_arguments] = !option + end + + opts.on "-s", "--safe-methods meth1,meth2,etc", Array, "Set methods as safe for unescaped output in views" do |methods| + options[:safe_methods] ||= Set.new + options[:safe_methods].merge methods.map {|e| e.to_sym } + end + + opts.on "--sql-safe-methods meth1,meth2,etc", Array, "Do not warn of SQL if the input is wrapped in a safe method" do |methods| + options[:sql_safe_methods] ||= Set.new + options[:sql_safe_methods].merge methods.map {|e| e.to_sym } + end + + opts.on "--url-safe-methods method1,method2,etc", Array, "Do not warn of XSS if the link_to href parameter is wrapped in a safe method" do |methods| + options[:url_safe_methods] ||= Set.new + options[:url_safe_methods].merge methods.map {|e| e.to_sym } + end + + opts.on "--skip-files file1,path2,etc", Array, "Skip processing of these files/directories. Directories are application relative and must end in \"#{File::SEPARATOR}\"" do |files| + options[:skip_files] ||= Set.new + options[:skip_files].merge files + end + + opts.on "--only-files file1,path2,etc", Array, "Process only these files/directories. Directories are application relative and must end in \"#{File::SEPARATOR}\"" do |files| + options[:only_files] ||= Set.new + options[:only_files].merge files + end + + opts.on "--[no-]skip-vendor", "Skip processing vendor directory (Default)" do |skip| + options[:skip_vendor] = skip + end + + opts.on "--skip-libs", "Skip processing lib directory" do + options[:skip_libs] = true + end + + opts.on "--add-libs-path path1,path2,etc", Array, "An application relative lib directory (ex. app/mailers) to process" do |paths| + options[:additional_libs_path] ||= Set.new + options[:additional_libs_path].merge paths + end + + opts.on "--add-engines-path path1,path2,etc", Array, "Include these engines in the scan" do |paths| + options[:engine_paths] ||= Set.new + options[:engine_paths].merge paths + end + + opts.on '--[no-]follow-symlinks', 'Follow symbolic links for directions' do |follow_symlinks| + options[:follow_symlinks] = follow_symlinks + end + + opts.on '--gemfile GEMFILE', 'Specify Gemfile to scan' do |gemfile| + options[:gemfile] = gemfile + end + + opts.on "-E", "--enable Check1,Check2,etc", Array, "Enable the specified checks" do |checks| + checks.map! do |check| + if check.start_with? "Check" + check + else + "Check#{check}" + end + end + + options[:enable_checks] ||= Set.new + options[:enable_checks].merge checks + end + + opts.on "-t", "--test Check1,Check2,etc", Array, "Only run the specified checks" do |checks| + checks.each_with_index do |s, index| + if s[0,5] != "Check" + checks[index] = "Check#{s}" + end + end + + options[:run_checks] ||= Set.new + options[:run_checks].merge checks + end + + opts.on "-x", "--except Check1,Check2,etc", Array, "Skip the specified checks" do |skip| + skip.each do |s| + if s[0,5] != "Check" + s = "Check#{s}" + end + + options[:skip_checks] ||= Set.new + options[:skip_checks] << s + end + end + + opts.on "--add-checks-path path1,path2,etc", Array, "A directory containing additional out-of-tree checks to run" do |paths| + options[:additional_checks_path] ||= Set.new + options[:additional_checks_path].merge paths.map {|p| File.expand_path p} + end + + opts.separator "" + opts.separator "Output options:" + + opts.on "-d", "--debug", "Lots of output" do + options[:debug] = true + end + + opts.on "--timing", "Measure time for scan steps" do + options[:show_timing] = true + end + + opts.on "-f", + "--format TYPE", + [:pdf, :text, :html, :csv, :tabs, :json, :markdown, :codeclimate, :cc, :plain, :table, :junit, :sarif, :sonar, :github], + "Specify output formats. Default is text" do |type| + + type = "s" if type == :text + options[:output_format] = :"to_#{type}" + end + + opts.on "--css-file CSSFile", "Specify CSS to use for HTML output" do |file| + options[:html_style] = File.expand_path file + end + + opts.on "-i IGNOREFILE", "--ignore-config IGNOREFILE", "Use configuration to ignore warnings" do |file| + options[:ignore_file] = file + end + + opts.on "-I", "--interactive-ignore", "Interactively ignore warnings" do + options[:interactive_ignore] = true + end + + opts.on "--show-ignored", "Show files that are usually ignored by the ignore configuration file" do + options[:show_ignored] = true + end + + opts.on "-l", "--[no-]combine-locations", "Combine warning locations (Default)" do |combine| + options[:combine_locations] = combine + end + + opts.on "--[no-]highlights", "Highlight user input in report" do |highlight| + options[:highlight_user_input] = highlight + end + + opts.on "--[no-]color", "Use ANSI colors in report (Default)" do |color| + if color + options[:output_color] = :force + else + options[:output_color] = color + end + end + + opts.on "-m", "--routes", "Report controller information" do + options[:report_routes] = true + end + + opts.on "--message-limit LENGTH", "Limit message length in HTML report" do |limit| + options[:message_limit] = limit.to_i + end + + opts.on "--[no-]pager", "Use pager for output to terminal (Default)" do |pager| + options[:pager] = pager + end + + opts.on "--table-width WIDTH", "Limit table width in text report" do |width| + options[:table_width] = width.to_i + end + + opts.on "-o", "--output FILE", "Specify files for output. Defaults to stdout. Multiple '-o's allowed" do |file| + options[:output_files] ||= [] + options[:output_files].push(file) + end + + opts.on "--[no-]separate-models", "Warn on each model without attr_accessible (Default)" do |separate| + options[:collapse_mass_assignment] = !separate + end + + opts.on "--[no-]summary", "Only output summary of warnings" do |summary_only| + if summary_only + options[:summary_only] = :summary_only + else + options[:summary_only] = :no_summary + end + end + + opts.on "--absolute-paths", "Output absolute file paths in reports" do + options[:absolute_paths] = true + end + + opts.on "--github-repo USER/REPO[/PATH][@REF]", "Output links to GitHub in markdown and HTML reports using specified repo" do |repo| + options[:github_repo] = repo + end + + opts.on "--text-fields field1,field2,etc.", Array, "Specify fields for text report format" do |format| + valid_options = [:category, :category_id, :check, :code, :confidence, :cwe, :file, :fingerprint, :line, :link, :message, :render_path] + + options[:text_fields] = format.map(&:to_sym) + + if options[:text_fields] == [:all] + options[:text_fields] = valid_options + else + invalid_options = (options[:text_fields] - valid_options) + + unless invalid_options.empty? + raise OptionParser::ParseError, "\nInvalid format options: #{invalid_options.inspect}" + end + end + end + + opts.on "-w", + "--confidence-level LEVEL", + ["1", "2", "3"], + "Set minimal confidence level (1 - 3)" do |level| + + options[:min_confidence] = 3 - level.to_i + end + + opts.on "--compare FILE", "Compare the results of a previous Brakeman scan (only JSON is supported)" do |file| + options[:previous_results_json] = File.expand_path(file) + end + + opts.separator "" + opts.separator "Configuration files:" + + opts.on "-c", "--config-file FILE", "Use specified configuration file" do |file| + options[:config_file] = File.expand_path(file) + end + + opts.on "-C", "--create-config [FILE]", "Output configuration file based on options" do |file| + if file + options[:create_config] = file + else + options[:create_config] = true + end + end + + opts.on "--allow-check-paths-in-config", "Allow loading checks from configuration file (Unsafe)" do + options[:allow_check_paths_in_config] = true + end + + opts.separator "" + + opts.on "-k", "--checks", "List all available vulnerability checks" do + options[:list_checks] = true + end + + opts.on "--optional-checks", "List optional checks" do + options[:list_optional_checks] = true + end + + opts.on "-v", "--version", "Show Brakeman version" do + options[:show_version] = true + end + + opts.on "--force-scan", "Scan application even if rails is not detected" do + options[:force_scan] = true + end + + opts.on_tail "-h", "--help", "Display this message" do + options[:show_help] = true + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/erubis_patch.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/erubis_patch.rb new file mode 100644 index 000000000..a301e23be --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/erubis_patch.rb @@ -0,0 +1,11 @@ +module Brakeman::ErubisPatch + # Simple patch to make `erubis` compatible with frozen string literals + def convert(input) + codebuf = +"" # Modified line, the rest is identitical + @preamble.nil? ? add_preamble(codebuf) : (@preamble && (codebuf << @preamble)) + convert_input(codebuf, input) + @postamble.nil? ? add_postamble(codebuf) : (@postamble && (codebuf << @postamble)) + @_proc = nil # clear cached proc object + return codebuf # or codebuf.join() + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/haml6_embedded.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/haml6_embedded.rb new file mode 100644 index 000000000..1f2eb77e0 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/haml6_embedded.rb @@ -0,0 +1,23 @@ +[:Coffee, :CoffeeScript, :Markdown, :Sass].each do |name| + klass = Module.const_get("Haml::Filters::#{name}") + + klass.define_method(:compile) do |node| + temple = [:multi] + temple << [:static, "<script>\n"] + temple << compile_with_tilt(node) + temple << [:static, "</script>"] + temple + end + + klass.define_method(:compile_with_tilt) do |node| + # From Haml + text = ::Haml::Util.unescape_interpolation(node.value[:text]).gsub(/(\\+)n/) do |s| + escapes = $1.size + next s if escapes % 2 == 0 + "#{'\\' * (escapes - 1)}\n" + end + text.prepend("\n").sub!(/\n"\z/, '"') + + [:dynamic, "BrakemanFilter.render(#{text})"] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/haml_embedded.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/haml_embedded.rb new file mode 100644 index 000000000..a636ed558 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/haml_embedded.rb @@ -0,0 +1,44 @@ +module Brakeman + module FakeHamlFilter + # Copied from Haml 4 - force delayed compilation + def compile(compiler, text) + filter = self + compiler.instance_eval do + text = unescape_interpolation(text).gsub(/(\\+)n/) do |s| + escapes = $1.size + next s if escapes % 2 == 0 + ("\\" * (escapes - 1)) + "\n" + end + # We need to add a newline at the beginning to get the + # filter lines to line up (since the Haml filter contains + # a line that doesn't show up in the source, namely the + # filter name). Then we need to escape the trailing + # newline so that the whole filter block doesn't take up + # too many. + text = "\n" + text.sub(/\n"\Z/, "\\n\"") + push_script <<RUBY.rstrip, :escape_html => false +find_and_preserve(#{filter.inspect}.render_with_options(#{text}, _hamlout.options)) +RUBY + return + end + end + end +end + +# Fake CoffeeScript filter for Haml +module Haml::Filters::Coffee + include Haml::Filters::Base + extend Brakeman::FakeHamlFilter +end + +# Fake Markdown filter for Haml +module Haml::Filters::Markdown + include Haml::Filters::Base + extend Brakeman::FakeHamlFilter +end + +# Fake Sass filter for Haml +module Haml::Filters::Sass + include Haml::Filters::Base + extend Brakeman::FakeHamlFilter +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails2_erubis.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails2_erubis.rb new file mode 100644 index 000000000..c4091a9bf --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails2_erubis.rb @@ -0,0 +1,9 @@ +Brakeman.load_brakeman_dependency 'erubis' + +require 'brakeman/parsers/erubis_patch' + +#Erubis processor which ignores any output which is plain text. +class Brakeman::ScannerErubis < Erubis::Eruby + include Erubis::NoTextEnhancer + include Brakeman::ErubisPatch +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails2_xss_plugin_erubis.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails2_xss_plugin_erubis.rb new file mode 100644 index 000000000..2db2ae238 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails2_xss_plugin_erubis.rb @@ -0,0 +1,52 @@ +Brakeman.load_brakeman_dependency 'erubis' + +require 'brakeman/parsers/erubis_patch' + +#This is from the rails_xss plugin for Rails 2 +class Brakeman::Rails2XSSPluginErubis < ::Erubis::Eruby + include Brakeman::ErubisPatch + + def add_preamble(src) + #src << "@output_buffer = ActiveSupport::SafeBuffer.new;" + end + + #This is different from rails_xss - fixes some line number issues + def add_text(src, text) + if text == "\n" + src << "\n" + elsif text.include? "\n" + lines = text.split("\n") + if text.match(/\n\z/) + lines.each do |line| + src << "@output_buffer.safe_concat('" << escape_text(line) << "');\n" + end + else + lines[0..-2].each do |line| + src << "@output_buffer.safe_concat('" << escape_text(line) << "');\n" + end + + src << "@output_buffer.safe_concat('" << escape_text(lines.last) << "');" + end + else + src << "@output_buffer.safe_concat('" << escape_text(text) << "');" + end + end + + BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/ + + def add_expr_literal(src, code) + if code =~ BLOCK_EXPR + src << "@output_buffer.safe_concat((" << $1 << ").to_s);" + else + src << '@output_buffer << ((' << code << ').to_s);' + end + end + + def add_expr_escaped(src, code) + src << '@output_buffer << ' << escaped_expr(code) << ';' + end + + def add_postamble(src) + #src << '@output_buffer.to_s' + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails3_erubis.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails3_erubis.rb new file mode 100644 index 000000000..fcbe09287 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/rails3_erubis.rb @@ -0,0 +1,85 @@ +Brakeman.load_brakeman_dependency 'erubis' + +require 'brakeman/parsers/erubis_patch' + +# This is from Rails 5 version of the Erubis handler +# https://github.com/rails/rails/blob/ec608107801b1e505db03ba76bae4a326a5804ca/actionview/lib/action_view/template/handlers/erb.rb#L7-L73 +class Brakeman::Rails3Erubis < ::Erubis::Eruby + include Brakeman::ErubisPatch + + def add_preamble(src) + @newline_pending = 0 + src << "_this_is_to_make_yields_syntactally_correct {" + src << "@output_buffer = output_buffer || ActionView::OutputBuffer.new;" + end + + def add_text(src, text) + return if text.empty? + + if text == "\n" + @newline_pending += 1 + else + src << "@output_buffer.safe_append='" + src << "\n" * @newline_pending if @newline_pending > 0 + src << escape_text(text) + src << "'.freeze;" + + @newline_pending = 0 + end + end + + # Erubis toggles <%= and <%== behavior when escaping is enabled. + # We override to always treat <%== as escaped. + def add_expr(src, code, indicator) + case indicator + when '==' + add_expr_escaped(src, code) + else + super + end + end + + BLOCK_EXPR = /\s*((\s+|\))do|\{)(\s*\|[^|]*\|)?\s*\Z/ + + def add_expr_literal(src, code) + flush_newline_if_pending(src) + if code =~ BLOCK_EXPR + src << '@output_buffer.append= ' << code + else + src << '@output_buffer.append=(' << code << ');' + end + end + + def add_expr_escaped(src, code) + flush_newline_if_pending(src) + if code =~ BLOCK_EXPR + src << "@output_buffer.safe_expr_append= " << code + else + src << "@output_buffer.safe_expr_append=(" << code << ");" + end + end + + def add_stmt(src, code) + flush_newline_if_pending(src) + super + end + + def add_postamble(src) + flush_newline_if_pending(src) + src << '@output_buffer.to_s; }' + end + + def flush_newline_if_pending(src) + if @newline_pending > 0 + src << "@output_buffer.safe_append='#{"\n" * @newline_pending}'.freeze;" + @newline_pending = 0 + end + end + + # This is borrowed from graphql's erb plugin: + # https://github.com/github/graphql-client/blob/51e76bd8d8b2ac0021d8fef7468b9a294e4bd6e8/lib/graphql/client/erubis.rb#L33-L38 + def convert_input(src, input) + input = input.gsub(/<%graphql/, "<%#") + super(src, input) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/slim_embedded.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/slim_embedded.rb new file mode 100644 index 000000000..ceb730e89 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/slim_embedded.rb @@ -0,0 +1,46 @@ +# Fake filters for Slim +module Slim + class Embedded + class TiltEngine + alias_method :on_slim_embedded, :on_slim_embedded # silence redefined method warning + def on_slim_embedded(engine, body, attrs) + # Override this method to avoid Slim trying to load sass/scss and failing + case engine + when :sass, :scss, :coffee + tilt_engine = nil # Doesn't really matter, ignored below + else + # Original Slim code + tilt_engine = Tilt[engine] || raise(Temple::FilterError, "Tilt engine #{engine} is not available.") + end + + tilt_options = options[engine.to_sym] || {} + tilt_options[:default_encoding] ||= 'utf-8' + + [:multi, tilt_render(tilt_engine, tilt_options, collect_text(body)), collect_newlines(body)] + end + end + + class SassEngine + protected + + alias_method :tilt_render, :tilt_render # silence redefined method warning + def tilt_render(tilt_engine, tilt_options, text) + [:dynamic, + "BrakemanFilter.render(#{text.inspect}, #{self.class})"] + end + end + + class CoffeeEngine < TiltEngine + protected + + def tilt_render(tilt_engine, tilt_options, text) + [:dynamic, + "BrakemanFilter.render(#{text.inspect}, #{self.class})"] + end + end + + # Override the engine for CoffeeScript, because Slim doesn't have + # one, it just uses Tilt's + register :coffee, JavaScriptEngine, engine: CoffeeEngine + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/template_parser.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/template_parser.rb new file mode 100644 index 000000000..ec2d40d00 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/parsers/template_parser.rb @@ -0,0 +1,156 @@ +module Brakeman + class TemplateParser + include Brakeman::Util + attr_reader :tracker + KNOWN_TEMPLATE_EXTENSIONS = /.*\.(erb|haml|rhtml|slim)$/ + + TemplateFile = Struct.new(:path, :ast, :name, :type) + + def initialize tracker, file_parser + @tracker = tracker + @file_parser = file_parser + @slim_smart = nil # Load slim/smart ? + end + + def parse_template path, text + type = path.relative.match(KNOWN_TEMPLATE_EXTENSIONS)[1].to_sym + type = :erb if type == :rhtml + name = template_path_to_name path + Brakeman.debug "Parsing #{path}" + + begin + src = case type + when :erb + type = :erubis if erubis? + parse_erb path, text + when :haml + type = :haml6 if haml6? + parse_haml path, text + when :slim + parse_slim path, text + else + tracker.error "Unknown template type in #{path}" + nil + end + + if src and ast = @file_parser.parse_ruby(src, path) + @file_parser.file_list << TemplateFile.new(path, ast, name, type) + end + rescue Racc::ParseError => e + tracker.error e, "Could not parse #{path}" + rescue StandardError, LoadError => e + tracker.error e.exception(e.message + "\nWhile processing #{path}"), e.backtrace + end + + nil + end + + def parse_erb path, text + if tracker.config.escape_html? + if tracker.options[:rails3] + require 'brakeman/parsers/rails3_erubis' + Brakeman::Rails3Erubis.new(text, :filename => path).src + else + require 'brakeman/parsers/rails2_xss_plugin_erubis' + Brakeman::Rails2XSSPluginErubis.new(text, :filename => path).src + end + elsif tracker.config.erubis? + require 'brakeman/parsers/rails2_erubis' + Brakeman::ScannerErubis.new(text, :filename => path).src + else + require 'erb' + src = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+ + ERB.new(text, trim_mode: '-').src + else + ERB.new(text, nil, '-').src + end + src.sub!(/^#.*\n/, '') + src + end + end + + def erubis? + tracker.config.escape_html? or + tracker.config.erubis? + end + + def parse_haml path, text + if haml6? + require_relative 'haml6_embedded' + + Haml::Template.new(filename: path.relative, + :escape_html => tracker.config.escape_html?, + generator: Temple::Generators::RailsOutputBuffer, + use_html_safe: true, + buffer_class: 'ActionView::OutputBuffer', + disable_capture: true, + ) { text }.precompiled_template + else + require_relative 'haml_embedded' + + Haml::Engine.new(text, + :filename => path, + :escape_html => tracker.config.escape_html?, + :escape_filter_interpolations => tracker.config.escape_filter_interpolations? + ).precompiled.gsub(/([^\\])\\n/, '\1') + end + rescue Haml::Error => e + tracker.error e, ["While compiling HAML in #{path}"] << e.backtrace + nil + end + + def haml6? + return @haml6 unless @haml6.nil? + + Brakeman.load_brakeman_dependency 'haml' + major_version = Haml::VERSION.split('.').first.to_i + + if major_version >= 6 + @haml6 = true + else + @haml6 = false + end + end + + def parse_slim path, text + Brakeman.load_brakeman_dependency 'slim' + + if @slim_smart.nil? and load_slim_smart? + @slim_smart = true + Brakeman.load_brakeman_dependency 'slim/smart' + else + @slim_smart = false + end + + require_relative 'slim_embedded' + + Slim::Template.new(path, + :disable_capture => true, + :generator => Temple::Generators::RailsOutputBuffer) { text }.precompiled_template + end + + def load_slim_smart? + return !@slim_smart unless @slim_smart.nil? + + # Terrible hack to find + # gem "slim", "~> 3.0.1", require: ["slim", "slim/smart"] + if tracker.app_tree.exists? 'Gemfile' + gemfile_contents = tracker.app_tree.file_path('Gemfile').read + if gemfile_contents.include? 'slim/smart' + return true + end + end + + false + end + + def self.parse_inline_erb tracker, text + fp = Brakeman::FileParser.new(tracker.app_tree, tracker.options[:parser_timeout]) + tp = self.new(tracker, fp) + src = tp.parse_erb '_inline_', text + type = tp.erubis? ? :erubis : :erb + + return type, fp.parse_ruby(src, "_inline_") + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processor.rb new file mode 100644 index 000000000..58c98aec6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processor.rb @@ -0,0 +1,103 @@ +#Load all files in processors/ +Dir.glob("#{File.expand_path(File.dirname(__FILE__))}/processors/*.rb").each { |f| require f.match(/brakeman\/processors.*/)[0] } +require 'brakeman/tracker' +require 'set' +require 'pathname' + +module Brakeman + #Makes calls to the appropriate processor. + # + #The ControllerProcessor, TemplateProcessor, and ModelProcessor will + #update the Tracker with information about what is parsed. + class Processor + include Util + + def initialize(app_tree, options) + @tracker = Tracker.new(app_tree, self, options) + end + + def tracked_events + @tracker + end + + #Process configuration file source + def process_config src, file_name + ConfigProcessor.new(@tracker).process_config src, file_name + end + + #Process Gemfile + def process_gems gem_files + GemProcessor.new(@tracker).process_gems gem_files + end + + #Process route file source + def process_routes src + RoutesProcessor.new(@tracker).process_routes src + end + + #Process controller source. +file_name+ is used for reporting + def process_controller src, file_name + if contains_class? src + ControllerProcessor.new(@tracker).process_controller src, file_name + else + LibraryProcessor.new(@tracker).process_library src, file_name + end + end + + #Process variable aliasing in controller source and save it in the + #tracker. + def process_controller_alias name, src, only_method = nil, file = nil + ControllerAliasProcessor.new(@tracker, only_method).process_controller name, src, file + end + + #Process a model source + def process_model src, file_name + result = ModelProcessor.new(@tracker).process_model src, file_name + AliasProcessor.new(@tracker, file_name).process result if result + end + + #Process either an ERB or HAML template + def process_template name, src, type, called_from = nil, file_name = nil + case type + when :erb + result = ErbTemplateProcessor.new(@tracker, name, called_from, file_name).process src + when :haml + result = HamlTemplateProcessor.new(@tracker, name, called_from, file_name).process src + when :haml6 + result = Haml6TemplateProcessor.new(@tracker, name, called_from, file_name).process src + when :erubis + result = ErubisTemplateProcessor.new(@tracker, name, called_from, file_name).process src + when :slim + result = SlimTemplateProcessor.new(@tracker, name, called_from, file_name).process src + else + abort "Unknown template type: #{type} (#{name})" + end + + #Each template which is rendered is stored separately + #with a new name. + if called_from + name = ("#{name}.#{called_from}").to_sym + end + + @tracker.templates[name].src = result + @tracker.templates[name].type = type + end + + #Process any calls to render() within a template + def process_template_alias template + TemplateAliasProcessor.new(@tracker, template).process_safely template.src + end + + #Process source for initializing files + def process_initializer file_name, src + res = BaseProcessor.new(@tracker).process_file src, file_name + res = AliasProcessor.new(@tracker).process_safely res, nil, file_name + @tracker.initializers[file_name] = res + end + + #Process source for a library file + def process_lib src, file_name + LibraryProcessor.new(@tracker).process_library src, file_name + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/alias_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/alias_processor.rb new file mode 100644 index 000000000..5e1b98e62 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/alias_processor.rb @@ -0,0 +1,1518 @@ +require 'brakeman/util' +require 'ruby_parser/bm_sexp_processor' +require 'brakeman/processors/lib/processor_helper' +require 'brakeman/processors/lib/safe_call_helper' +require 'brakeman/processors/lib/call_conversion_helper' + +#Returns an s-expression with aliases replaced with their value. +#This does not preserve semantics (due to side effects, etc.), but it makes +#processing easier when searching for various things. +class Brakeman::AliasProcessor < Brakeman::SexpProcessor + include Brakeman::ProcessorHelper + include Brakeman::SafeCallHelper + include Brakeman::Util + include Brakeman::CallConversionHelper + + attr_reader :result, :tracker + + #Returns a new AliasProcessor with an empty environment. + # + #The recommended usage is: + # + # AliasProcessor.new.process_safely src + def initialize tracker = nil, current_file = nil + super() + @env = SexpProcessor::Environment.new + @inside_if = false + @ignore_ifs = nil + @exp_context = [] + @tracker = tracker #set in subclass as necessary + @helper_method_cache = {} + @helper_method_info = Hash.new({}) + @or_depth_limit = (tracker && tracker.options[:branch_limit]) || 5 #arbitrary default + @meth_env = nil + @current_file = current_file + @mass_limit = (tracker && tracker.options[:mass_limit]) || 1000 # arbitrary default + set_env_defaults + end + + #This method processes the given Sexp, but copies it first so + #the original argument will not be modified. + # + #_set_env_ should be an instance of SexpProcessor::Environment. If provided, + #it will be used as the starting environment. + # + #This method returns a new Sexp with variables replaced with their values, + #where possible. + def process_safely src, set_env = nil, current_file = @current_file + @current_file = current_file + @env = set_env || SexpProcessor::Environment.new + @result = src.deep_clone + process @result + @result + end + + #Process a Sexp. If the Sexp has a value associated with it in the + #environment, that value will be returned. + def process_default exp + @exp_context.push exp + + begin + exp.map! do |e| + if sexp? e and not e.empty? + process e + else + e + end + end + rescue => err + if @tracker + @tracker.error err + else + raise err + end + end + + result = replace(exp) + + @exp_context.pop + + result + end + + def replace exp, int = 0 + return exp if int > 3 + + if replacement = env[exp] + if not duplicate? replacement and replacement.mass < @mass_limit + replace(replacement.deep_clone(exp.line), int + 1) + else + exp + end + elsif tracker and replacement = tracker.constant_lookup(exp) and not duplicate? replacement + replace(replacement.deep_clone(exp.line), int + 1) + else + exp + end + end + + def process_bracket_call exp + # TODO: What is even happening in this method? + r = replace(exp) + + if r != exp + return r + end + + exp.arglist = process_default(exp.arglist) + + r = replace(exp) + + if r != exp + return r + end + + t = process(exp.target.deep_clone) + + # sometimes t[blah] has a match in the env + # but we don't want to actually set the target + # in case the target is big...which is what this + # whole method is trying to avoid + if t != exp.target + e = exp.deep_clone + e.target = t + + r = replace(e) + + if r != e + return r + end + else + t = exp.target # put it back? + end + + if hash? t + if v = process_hash_access(t, exp.first_arg) + v.deep_clone(exp.line) + else + case t.node_type + when :params + exp.target = PARAMS_SEXP.deep_clone(exp.target.line) + when :session + exp.target = SESSION_SEXP.deep_clone(exp.target.line) + when :cookies + exp.target = COOKIES_SEXP.deep_clone(exp.target.line) + end + + exp + end + elsif array? t + if v = process_array_access(t, exp.args) + v.deep_clone(exp.line) + else + exp + end + elsif t + exp.target = t + exp + else + if exp.target # `self` target is reported as `nil` https://github.com/seattlerb/ruby_parser/issues/250 + exp.target = process_default exp.target + end + + exp + end + end + + ARRAY_CONST = s(:const, :Array) + HASH_CONST = s(:const, :Hash) + RAILS_TEST = s(:call, s(:call, s(:const, :Rails), :env), :test?) + RAILS_DEV = s(:call, s(:call, s(:const, :Rails), :env), :development?) + + #Process a method call. + def process_call exp + return exp if process_call_defn? exp + target_var = exp.target + target_var &&= target_var.deep_clone + if exp.node_type == :safe_call + exp.node_type = :call + end + + if exp.method == :[] + return process_bracket_call exp + else + exp = process_default exp + end + + #In case it is replaced with something else + unless call? exp + return exp + end + + # If x(*[1,2,3]) change to x(1,2,3) + # if that's the only argument + if splat_array? exp.first_arg and exp.second_arg.nil? + exp.arglist = exp.first_arg[1].sexp_body + end + + target = exp.target + method = exp.method + first_arg = exp.first_arg + + if method == :send or method == :__send__ or method == :try + collapse_send_call exp, first_arg + end + + if node_type? target, :or and [:+, :-, :*, :/].include? method + res = process_or_simple_operation(exp) + return res if res + elsif target == ARRAY_CONST and method == :new + return Sexp.new(:array, *exp.args).line(exp.line) + elsif target == HASH_CONST and method == :new and first_arg.nil? and !node_type?(@exp_context.last, :iter) + return Sexp.new(:hash).line(exp.line) + elsif exp == RAILS_TEST or exp == RAILS_DEV + return Sexp.new(:false).line(exp.line) + end + + # For the simplest case of `Foo.thing` + if node_type? target, :const and first_arg.nil? + if tracker and (klass = tracker.find_class(class_name(target.value))) + if return_value = klass.get_simple_method_return_value(:class, method) + return return_value.deep_clone(exp.line) + end + end + end + + #See if it is possible to simplify some basic cases + #of addition/concatenation. + case method + when :+ + if array? target and array? first_arg + exp = join_arrays(target, first_arg, exp) + elsif string? first_arg + exp = join_strings(target, first_arg, exp) + elsif number? first_arg + exp = math_op(:+, target, first_arg, exp) + end + when :-, :*, :/ + if method == :* and array? target + if string? first_arg + exp = process_array_join(target, first_arg) + end + else + exp = math_op(method, target, first_arg, exp) + end + when :[] + # TODO: This might never be used because of process_bracket_call above + if array? target + exp = process_array_access(target, exp.args, exp) + elsif hash? target + exp = process_hash_access(target, first_arg, exp) + end + when :fetch + if array? target + # Not dealing with default value + # so just pass in first argument, but process_array_access expects + # an array of arguments. + exp = process_array_access(target, [first_arg], exp) + elsif hash? target + exp = process_hash_access(target, first_arg, exp) + end + when :merge!, :update + if hash? target and hash? first_arg + target = process_hash_merge! target, first_arg + env[target_var] = target + return target + end + when :merge + if hash? target and hash? first_arg + return process_hash_merge(target, first_arg) + end + when :<< + if string? target and string? first_arg + target.value += first_arg.value + env[target_var] = target + return target + elsif string? target and string_interp? first_arg + exp = Sexp.new(:dstr, target.value + first_arg[1]).concat(first_arg.sexp_body(2)).line(exp.line) + env[target_var] = exp + elsif string? first_arg and string_interp? target + if string? target.last + target.last.value += first_arg.value + elsif target.last.is_a? String + # TODO Use target.last += ? + target.last << first_arg.value + else + target << first_arg + end + env[target_var] = target + return first_arg + elsif new_string? target + env[target_var] = first_arg + return first_arg + elsif array? target + target << first_arg + env[target_var] = target + return target + else + target = find_push_target(target_var) + env[target] = exp unless target.nil? # Happens in TemplateAliasProcessor + end + when :push + if array? target + target << first_arg + env[target_var] = target + return target + end + when :first + if array? target and first_arg.nil? and sexp? target[1] + exp = target[1] + end + when :freeze, :dup, :presence + unless target.nil? + exp = target + end + when :join + if array? target and (string? first_arg or first_arg.nil?) + exp = process_array_join(target, first_arg) + end + when :! + # Convert `!!a` to boolean + if call? target and target.method == :! + exp = s(:or, s(:true).line(exp.line), s(:false).line(exp.line)).line(exp.line) + end + when :values + # Hash literal + if node_type? target, :hash + exp = hash_values(target) + end + when :values_at + if node_type? target, :hash + res = hash_values_at target, exp.args + + # Only convert to array of values if _all_ keys + # are present in the hash. + unless res.any?(&:nil?) + exp = res + end + end + when :presence_in + arg = exp.first_arg + + if node_type? arg, :array + # 1.presence_in [1,2,3] + if arg.include? target + exp = target + elsif all_literals? arg + exp = safe_literal(exp.line) + end + end + end + + exp + end + + # Painful conversion of Array#join into string interpolation + def process_array_join array, join_str + # Empty array + if array.length == 1 + return s(:str, '').line(array.line) + end + + result = s().line(array.line) + + join_value = if string? join_str + join_str.value + else + nil + end + + if array.length > 2 + array[1..-2].each do |e| + result << join_item(e, join_value) + end + end + + result << join_item(array.last, nil) + + # Combine the strings at the beginning because that's what RubyParser does + combined_first = +"" + result.each do |e| + if string? e + combined_first << e.value + elsif e.is_a? String + combined_first << e + else + break + end + end + + # Remove the strings at the beginning + result.reject! do |e| + if e.is_a? String or string? e + true + else + break + end + end + + result.unshift combined_first + + # Have to fix up strings that follow interpolation + string = result.reduce(s(:dstr).line(array.line)) do |memo, e| + if string? e and node_type? memo.last, :evstr + e.value = "#{join_value}#{e.value}" + elsif join_value and node_type? memo.last, :evstr and node_type? e, :evstr + memo << s(:str, join_value).line(e.line) + end + + memo << e + end + + # Convert (:dstr, "hello world") + # to (:str, "hello world") + if string.length == 2 and string.last.is_a? String + string[0] = :str + end + + string + end + + def join_item item, join_value + if item.nil? || item.is_a?(String) + "#{item}#{join_value}" + elsif string? item or symbol? item or number? item + s(:str, "#{item.value}#{join_value}").line(item.line) + else + s(:evstr, item).line(item.line) + end + end + + TEMP_FILE_CLASS = s(:const, :Tempfile) + + def temp_file_open? exp + call? exp and + exp.target == TEMP_FILE_CLASS and + exp.method == :open + end + + def temp_file_create? exp + call? exp and + exp.target == TEMP_FILE_CLASS and + exp.method == :create + end + + def temp_file_new line + s(:call, TEMP_FILE_CLASS, :new).line(line) + end + + def splat_array? exp + node_type? exp, :splat and + node_type? exp[1], :array + end + + def process_iter exp + @exp_context.push exp + exp[1] = process exp.block_call + if array_detect_all_literals? exp[1] + return safe_literal(exp.line) + end + + @exp_context.pop + + env.scope do + call = exp.block_call + block_args = exp.block_args + + if call? call and [:each, :map].include? call.method and all_literals? call.target and block_args.length == 2 and block_args.last.is_a? Symbol + # Iterating over an array of all literal values + local = Sexp.new(:lvar, block_args.last) + env.current[local] = safe_literal(exp.line) + elsif temp_file_open? call + local = Sexp.new(:lvar, block_args.last) + env.current[local] = temp_file_new(exp.line) + elsif temp_file_create? call + local = Sexp.new(:lvar, block_args.last) + env.current[local] = temp_file_new(exp.line) + else + block_args.each do |e| + #Force block arg(s) to be local + if node_type? e, :lasgn + env.current[Sexp.new(:lvar, e.lhs)] = Sexp.new(:lvar, e.lhs) + elsif node_type? e, :kwarg + env.current[Sexp.new(:lvar, e[1])] = e[2] + elsif node_type? e, :masgn, :shadow + e[1..-1].each do |var| + local = Sexp.new(:lvar, var) + env.current[local] = local + end + elsif e.is_a? Symbol + local = Sexp.new(:lvar, e) + env.current[local] = local + elsif e.nil? # trailing comma, argument destructuring + next # Punt for now + else + raise "Unexpected value in block args: #{e.inspect}" + end + end + end + + block = exp.block + + if block? block + process_all! block + else + exp[3] = process block + end + end + + exp + end + + #Process a new scope. + def process_scope exp + env.scope do + process exp.block + end + exp + end + + #Start new scope for block. + def process_block exp + env.scope do + process_default exp + end + end + + #Process a method definition. + def process_defn exp + meth_env do + exp.body = process_all! exp.body + end + exp + end + + def meth_env + begin + env.scope do + set_env_defaults + @meth_env = env.current + yield + end + ensure + @meth_env = nil + end + end + + #Process a method definition on self. + def process_defs exp + meth_env do + exp.body = process_all! exp.body + end + exp + end + + # Handles x = y = z = 1 + def get_rhs exp + if node_type? exp, :lasgn, :iasgn, :gasgn, :attrasgn, :safe_attrasgn, :cvdecl, :cdecl + get_rhs(exp.rhs) + else + exp + end + end + + #Local assignment + # x = 1 + def process_lasgn exp + self_assign = self_assign?(exp.lhs, exp.rhs) + exp.rhs = process exp.rhs if sexp? exp.rhs + return exp if exp.rhs.nil? + + local = Sexp.new(:lvar, exp.lhs).line(exp.line || -2) + + if self_assign + # Skip branching + env[local] = get_rhs(exp) + else + set_value local, get_rhs(exp) + end + + exp + end + + #Instance variable assignment + # @x = 1 + def process_iasgn exp + self_assign = self_assign?(exp.lhs, exp.rhs) + exp.rhs = process exp.rhs + ivar = Sexp.new(:ivar, exp.lhs).line(exp.line) + + if self_assign + if env[ivar].nil? and @meth_env + @meth_env[ivar] = get_rhs(exp) + else + env[ivar] = get_rhs(exp) + end + else + set_value ivar, get_rhs(exp) + end + + exp + end + + #Global assignment + # $x = 1 + def process_gasgn exp + match = Sexp.new(:gvar, exp.lhs) + exp.rhs = process(exp.rhs) + value = get_rhs(exp) + + if value + value.line = exp.line + + set_value match, value + end + + exp + end + + #Class variable assignment + # @@x = 1 + def process_cvdecl exp + match = Sexp.new(:cvar, exp.lhs) + exp.rhs = process(exp.rhs) + value = get_rhs(exp) + + set_value match, value + + exp + end + + #'Attribute' assignment + # x.y = 1 + #or + # x[:y] = 1 + def process_attrasgn exp + tar_variable = exp.target + target = process(exp.target) + method = exp.method + index_arg = exp.first_arg + value_arg = exp.second_arg + + if method == :[]= + index = exp.first_arg = process(index_arg) + value = exp.second_arg = process(value_arg) + match = Sexp.new(:call, target, :[], index) + + set_value match, value + + if hash? target + env[tar_variable] = hash_insert target.deep_clone, index, value + end + + unless node_type? target, :hash + exp.target = target + end + elsif method.to_s[-1,1] == "=" + exp.first_arg = process(index_arg) + value = get_rhs(exp) + #This is what we'll replace with the value + match = Sexp.new(:call, target, method.to_s[0..-2].to_sym) + + set_value match, value + exp.target = target + else + raise "Unrecognized assignment: #{exp}" + end + exp + end + + # Multiple/parallel assignment: + # + # x, y = z, w + def process_masgn exp + exp[2] = process exp[2] if sexp? exp[2] + + if node_type? exp[2], :to_ary and array? exp[2][1] + exp[2] = exp[2][1] + end + + unless array? exp[1] and array? exp[2] + # Already processed RHS, don't do it again + # https://github.com/presidentbeef/brakeman/issues/1877 + return exp + end + + vars = exp[1].dup + vals = exp[2].dup + + vars.shift + vals.shift + + # Call each assignment as if it is normal + vars.each_with_index do |var, i| + val = vals[i] + next unless val # TODO: Break if there are no vals left? + + # This happens with nested destructuring like + # x, (a, b) = blah + if node_type? var, :masgn + # Need to add value to masgn exp + m = var.dup + m[2] = s(:to_ary, val) + + process_masgn m + elsif node_type? var, :splat + # Assign the rest of the values to the variable: + # + # a, *b = 1, 2, 3 + # + # b == [2, 3] + + + assign = var[1].dup # var is s(:splat, s(:lasgn, :b)) + + if i == vars.length - 1 # Last variable being assigned, slurp up the rest + assign.rhs = s(:array, *vals[i..]) # val is the "rest" of the values + else + # Calculate how many values to assign based on how many variables + # there are. + # + # If there are more values than variables, the splat gets an empty array. + + assign.rhs = s(:array, *vals[i, (vals.length - vars.length + 1)]).line(vals.line) + end + + process assign + else + assign = var.dup + assign.rhs = val + process assign + end + end + + exp + end + + def process_hash exp + exp = process_default(exp) + + # Handle { **kw } + if node_type? exp, :hash + if exp.any? { |e| node_type? e, :kwsplat and node_type? e.value, :hash } + kwsplats, rest = exp.partition { |e| node_type? e, :kwsplat and node_type? e.value, :hash } + exp = Sexp.new.concat(rest).line(exp.line) + + kwsplats.each do |e| + exp = process_hash_merge! exp, e.value + end + end + end + + # Return early unless there might be short-hand syntax, + # since handling it is kind of expensive. + return exp unless exp.any? { |e| e.nil? } + + # Need to handle short-hand hash syntax + new_hash = [:hash] + hash_iterate(exp) do |key, value| + # e.g. { a: } + if value.nil? and symbol? key + # Only handling local variables for now, not calls + lvar = s(:lvar, key.value) + if var_value = env[lvar] + new_hash << key << var_value.deep_clone(key.line || 0) + else + # If the value is unknown, assume it was a call + # and set the value to a call + new_hash.concat << key << s(:call, nil, key.value).line(key.line || 0) + end + else + new_hash.concat << key << value + end + end + + Sexp.from_array(new_hash).line(exp.line || 0) + end + + #Merge values into hash when processing + # + # h.merge! :something => "value" + def process_hash_merge! hash, args + hash = hash.deep_clone + hash_iterate args do |key, replacement| + hash_insert hash, key, replacement + match = Sexp.new(:call, hash, :[], key) + env[match] = replacement + end + hash + end + + #Return a new hash Sexp with the given values merged into it. + # + #+args+ should be a hash Sexp as well. + def process_hash_merge hash, args + hash = hash.deep_clone + hash_iterate args do |key, replacement| + hash_insert hash, key, replacement + end + hash + end + + #Assignments like this + # x[:y] ||= 1 + def process_op_asgn1 exp + target_var = exp[1] + target_var &&= target_var.deep_clone + + target = exp[1] = process(exp[1]) + index = exp[2][1] = process(exp[2][1]) + value = exp[4] = process(exp[4]) + match = Sexp.new(:call, target, :[], index) + + if exp[3] == :"||" + unless env[match] + if request_value? target + env[match] = match.combine(value) + else + env[match] = value + end + end + else + new_value = process s(:call, s(:call, target_var, :[], index), exp[3], value).line(exp.line) + + env[match] = new_value + end + + exp + end + + #Assignments like this + # x.y ||= 1 + def process_op_asgn2 exp + return process_default(exp) if exp[3] != :"||" + + target = exp[1] = process(exp[1]) + value = exp[4] = process(exp[4]) + method = exp[2] + + match = Sexp.new(:call, target, method.to_s[0..-2].to_sym) + + unless env[match] + env[match] = value + end + + exp + end + + #This is the right hand side value of a multiple assignment, + #like `x = y, z` + def process_svalue exp + exp.value + end + + #Constant assignments like + # BIG_CONSTANT = 234810983 + def process_cdecl exp + if sexp? exp.rhs + exp.rhs = process exp.rhs + end + + if @tracker + @tracker.add_constant exp.lhs, + exp.rhs, + :file => @current_file, + :module => @current_module, + :class => @current_class, + :method => @current_method + end + + if exp.lhs.is_a? Symbol + match = Sexp.new(:const, exp.lhs) + else + match = exp.lhs + end + + env[match] = get_rhs(exp) + + exp + end + + def hash_or_array_include_all_literals? exp + return unless call? exp and sexp? exp.target + target = exp.target + + case target.node_type + when :hash + hash_include_all_literals? exp + else + array_include_all_literals? exp + end + end + + # Check if exp is a call to Array#include? on an array literal + # that contains all literal values. For example: + # + # [1, 2, "a"].include? x + # + def array_include_all_literals? exp + call? exp and + exp.method == :include? and + (all_literals? exp.target or dir_glob? exp.target) + end + + def array_detect_all_literals? exp + call? exp and + [:detect, :find].include? exp.method and + exp.first_arg.nil? and + (all_literals? exp.target or dir_glob? exp.target) + end + + # Check if exp is a call to Array#include? on an array literal + # that contains all literal values. For example: + # + # x.in? [1, 2, "a"] + # + def in_array_all_literals? exp + call? exp and + exp.method == :in? and + all_literals? exp.first_arg + end + + # Check if exp is a call to Hash#include? on a hash literal + # that contains all literal values. For example: + # + # {x: 1}.include? x + def hash_include_all_literals? exp + call? exp and + exp.method == :include? and + all_literals? exp.target, :hash + end + + #Sets @inside_if = true + def process_if exp + if @ignore_ifs.nil? + @ignore_ifs = @tracker && @tracker.options[:ignore_ifs] + end + + condition = exp.condition = process exp.condition + + #Check if a branch is obviously going to be taken + if true? condition + no_branch = true + exps = [exp.then_clause, nil] + elsif false? condition + no_branch = true + exps = [nil, exp.else_clause] + elsif equality_check? condition and condition.target == condition.first_arg + no_branch = true + exps = [exp.then_clause, nil] + else + no_branch = false + exps = [exp.then_clause, exp.else_clause] + end + + if @ignore_ifs or no_branch + exps.each_with_index do |branch, i| + exp[2 + i] = process_if_branch branch + end + else + # Translate `if !...` into `unless ...` + # Technically they are different but that's only if someone overrides `!` + if call? condition and condition.method == :! + condition = condition.target + exps.reverse! + end + + was_inside = @inside_if + @inside_if = true + + branch_scopes = [] + exps.each_with_index do |branch, i| + scope do + @branch_env = env.current + branch_index = 2 + i # s(:if, condition, then_branch, else_branch) + exp[branch_index] = if i == 0 and hash_or_array_include_all_literals? condition + # If the condition is ["a", "b"].include? x + # set x to safe_literal inside the true branch + var = condition.first_arg + value = safe_literal(var.line) + process_branch_with_value(var, value, branch, i) + elsif i == 0 and in_array_all_literals? condition + # If the condition is x.in? ["a", "b"] + # set x to safe_literal inside the true branch + var = condition.target + value = safe_literal(var.line) + process_branch_with_value(var, value, branch, i) + elsif i == 0 and equality_check? condition + # For conditions like a == b, + # set a to b inside the true branch + var = condition.target + value = condition.first_arg + process_branch_with_value(var, value, branch, i) + elsif i == 1 and hash_or_array_include_all_literals? condition and early_return? branch + var = condition.first_arg + env.current[var] = safe_literal(var.line) + process_if_branch branch + else + process_if_branch branch + end + branch_scopes << env.current + @branch_env = nil + end + end + + @inside_if = was_inside + + branch_scopes.each do |s| + merge_if_branch s + end + end + + exp + end + + def process_branch_with_value var, value, branch, branch_index + previous_value = env.current[var] + env.current[var] = value + result = process_if_branch branch + env.current[var] = previous_value + result + end + + def early_return? exp + return true if node_type? exp, :return + return true if call? exp and [:fail, :raise].include? exp.method + + if node_type? exp, :block, :rlist + node_type? exp.last, :return or + (call? exp and [:fail, :raise].include? exp.method) + else + false + end + end + + def equality_check? exp + call? exp and + exp.method == :== + end + + # Not a list of values + # when :example + def simple_when? exp + node_type? exp[1], :array and + exp[1].length == 2 and # only one element in the array + not node_type? exp[1][1], :splat, :array + end + + # A list of literal values + # + # when 1,2,3 + # + # or + # + # when *[:a, :b] + def all_literals_when? exp + if array? exp[1] # pretty sure this is always true + all_literals? exp[1] or # simple list, not actually array + (splat_array? exp[1][1] and + all_literals? exp[1][1][1]) + end + end + + def process_case exp + if @ignore_ifs.nil? + @ignore_ifs = @tracker && @tracker.options[:ignore_ifs] + end + + if @ignore_ifs + process_default exp + return exp + end + + branch_scopes = [] + was_inside = @inside_if + @inside_if = true + + exp[1] = process exp[1] if exp[1] + + case_value = if node_type? exp[1], :lvar, :ivar, :call + exp[1].deep_clone + end + + exp.each_sexp do |e| + if node_type? e, :when + scope do + # Process the when value for matching + process_default e[1] + + # Moved here to avoid @branch_env being cleared out + # in process_default + # Maybe in the future don't set it to nil? + @branch_env = env.current + + # set value of case var if possible + if case_value + if simple_when? e + @branch_env[case_value] = e[1][1] + elsif all_literals_when? e + @branch_env[case_value] = safe_literal(e.line + 1) + end + end + + # when blocks aren't blocks, they are lists of expressions + process_default e + + branch_scopes << env.current + + @branch_env = nil + end + end + end + + # else clause + if sexp? exp.last + scope do + @branch_env = env.current + + process_default exp[-1] + + branch_scopes << env.current + + @branch_env = nil + end + end + + @inside_if = was_inside + + branch_scopes.each do |s| + merge_if_branch s + end + + exp + end + + def process_if_branch exp + if sexp? exp + if block? exp + process_default exp + else + process exp + end + end + end + + def merge_if_branch branch_env + branch_env.each do |k, v| + next if v.nil? + + current_val = env[k] + + if current_val + unless same_value?(current_val, v) + if too_deep? current_val + # Give up branching, start over with latest value + env[k] = v + else + env[k] = current_val.combine(v, k.line) + end + end + else + env[k] = v + end + end + end + + def too_deep? exp + @or_depth_limit >= 0 and + node_type? exp, :or and + exp.or_depth and + exp.or_depth >= @or_depth_limit + end + + # Change x.send(:y, 1) to x.y(1) + def collapse_send_call exp, first_arg + # Handle try(&:id) + if node_type? first_arg, :block_pass + first_arg = first_arg[1] + end + + return unless symbol? first_arg or string? first_arg + exp.method = first_arg.value.to_sym + args = exp.args + exp.pop # remove last arg + if args.length > 1 + exp.arglist = args.sexp_body + end + end + + #Returns a new SexpProcessor::Environment containing only instance variables. + #This is useful, for example, when processing views. + def only_ivars include_request_vars = false, lenv = nil + lenv ||= env + res = SexpProcessor::Environment.new + + if include_request_vars + lenv.all.each do |k, v| + #TODO Why would this have nil values? + if (k.node_type == :ivar or request_value? k) and not v.nil? + res[k] = v.dup + end + end + else + lenv.all.each do |k, v| + #TODO Why would this have nil values? + if k.node_type == :ivar and not v.nil? + res[k] = v.dup + end + end + end + + res + end + + def only_request_vars + res = SexpProcessor::Environment.new + + env.all.each do |k, v| + if request_value? k and not v.nil? + res[k] = v.dup + end + end + + res + end + + def get_call_value call + method_name = call.method + + #Look for helper methods and see if we can get a return value + if found_method = tracker.find_method(method_name, @current_class) + helper = found_method.src + + if sexp? helper + value = process_helper_method helper, call.args + value.line(call.line) + return value + else + raise "Unexpected value for method: #{found_method}" + end + else + call + end + end + + def process_helper_method method_exp, args + method_name = method_exp.method_name + Brakeman.debug "Processing method #{method_name}" + + info = @helper_method_info[method_name] + + #If method uses instance variables, then include those and request + #variables (params, etc) in the method environment. Otherwise, + #only include request variables. + if info[:uses_ivars] + meth_env = only_ivars(:include_request_vars) + else + meth_env = only_request_vars + end + + #Add arguments to method environment + assign_args method_exp, args, meth_env + + + #Find return values if method does not depend on environment/args + values = @helper_method_cache[method_name] + + unless values + #Serialize environment for cache key + meth_values = meth_env.instance_variable_get(:@env).to_a + meth_values.sort! + meth_values = meth_values.to_s + + digest = Digest::SHA1.new.update(meth_values << method_name.to_s).to_s.to_sym + + values = @helper_method_cache[digest] + end + + if values + #Use values from cache + values[:ivar_values].each do |var, val| + env[var] = val + end + + values[:return_value] + else + #Find return value for method + frv = Brakeman::FindReturnValue.new + value = frv.get_return_value(method_exp.body_list, meth_env) + + ivars = {} + + only_ivars(false, meth_env).all.each do |var, val| + env[var] = val + ivars[var] = val + end + + if not frv.uses_ivars? and args.length == 0 + #Store return value without ivars and args if they are not used + @helper_method_cache[method_exp.method_name] = { :return_value => value, :ivar_values => ivars } + else + @helper_method_cache[digest] = { :return_value => value, :ivar_values => ivars } + end + + #Store information about method, just ivar usage for now + @helper_method_info[method_name] = { :uses_ivars => frv.uses_ivars? } + + value + end + end + + def assign_args method_exp, args, meth_env = SexpProcessor::Environment.new + formal_args = method_exp.formal_args + + formal_args.each_with_index do |arg, index| + next if index == 0 + + if arg.is_a? Symbol and sexp? args[index - 1] + meth_env[Sexp.new(:lvar, arg)] = args[index - 1] + end + end + + meth_env + end + + #Finds the inner most call target which is not the target of a call to << + def find_push_target exp + if call? exp and exp.method == :<< + find_push_target exp.target + else + exp + end + end + + def duplicate? exp + @exp_context[0..-2].reverse_each do |e| + return true if exp == e + end + + false + end + + def find_method *args + nil + end + + #Return true if lhs == rhs or lhs is an or expression and + #rhs is one of its values + def same_value? lhs, rhs + if lhs == rhs + true + elsif node_type? lhs, :or + lhs.rhs == rhs or lhs.lhs == rhs + else + false + end + end + + def self_assign? var, value + self_assign_var?(var, value) or self_assign_target?(var, value) + end + + #Return true if for x += blah or @x += blah + def self_assign_var? var, value + call? value and + value.method == :+ and + node_type? value.target, :lvar, :ivar and + value.target.value == var + end + + #Return true for x = x.blah + def self_assign_target? var, value + target = top_target(value) + + if node_type? target, :lvar, :ivar + target = target.value + end + + var == target + end + + #Returns last non-nil target in a call chain + def top_target exp, last = nil + if call? exp + top_target exp.target, exp + elsif node_type? exp, :iter + top_target exp.block_call, last + else + exp || last + end + end + + def value_from_if exp + if block? exp.else_clause or block? exp.then_clause + #If either clause is more than a single expression, just use entire + #if expression for now + exp + elsif exp.else_clause.nil? + exp.then_clause + elsif exp.then_clause.nil? + exp.else_clause + else + condition = exp.condition + + if true? condition + exp.then_clause + elsif false? condition + exp.else_clause + else + exp.then_clause.combine(exp.else_clause, exp.line) + end + end + end + + def value_from_case exp + result = [] + + exp.each do |e| + if node_type? e, :when + result << e.last + end + end + + result << exp.last if exp.last # else + + result.reduce do |c, e| + if c.nil? + e + elsif node_type? e, :if + c.combine(value_from_if e) + elsif raise? e + c # ignore exceptions + elsif e + c.combine e + else # when e is nil + c + end + end + end + + def raise? exp + call? exp and exp.method == :raise + end + + STRING_NEW = s(:call, s(:const, :String), :new) + + # String.new ? + def new_string? exp + exp == STRING_NEW + end + + #Set variable to given value. + #Creates "branched" versions of values when appropriate. + #Avoids creating multiple branched versions inside same + #if branch. + def set_value var, value + if node_type? value, :if + value = value_from_if(value) + elsif node_type? value, :case + value = value_from_case(value) + end + + if @ignore_ifs or not @inside_if + if @meth_env and node_type? var, :ivar and env[var].nil? + @meth_env[var] = value + else + env[var] = value + end + elsif env.current[var] + env.current[var] = value + elsif @branch_env and @branch_env[var] + @branch_env[var] = value + elsif @branch_env and @meth_env and node_type? var, :ivar + @branch_env[var] = value + else + env.current[var] = value + end + end + + #If possible, distribute operation over both sides of an or. + #For example, + # + # (1 or 2) * 5 + # + #Becomes + # + # (5 or 10) + # + #Only works for strings and numbers right now. + def process_or_simple_operation exp + arg = exp.first_arg + return nil unless string? arg or number? arg + + target = exp.target + lhs = process_or_target(target.lhs, exp.dup) + rhs = process_or_target(target.rhs, exp.dup) + + if lhs and rhs + if same_value? lhs, rhs + lhs + else + exp.target.lhs = lhs + exp.target.rhs = rhs + exp.target + end + else + nil + end + end + + def process_or_target value, copy + if string? value or number? value + copy.target = value + process copy + else + false + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/base_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/base_processor.rb new file mode 100644 index 000000000..60f6101e7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/base_processor.rb @@ -0,0 +1,300 @@ +require 'brakeman/processors/lib/processor_helper' +require 'brakeman/processors/lib/safe_call_helper' +require 'brakeman/util' + +#Base processor for most processors. +class Brakeman::BaseProcessor < Brakeman::SexpProcessor + include Brakeman::ProcessorHelper + include Brakeman::SafeCallHelper + include Brakeman::Util + + IGNORE = Sexp.new(:ignore).line(0) + + #Return a new Processor. + def initialize tracker + super() + @last = nil + @tracker = tracker + @app_tree = tracker.app_tree if tracker + @current_template = @current_module = @current_class = @current_method = @current_file = nil + end + + def process_file exp, current_file + @current_file = current_file + process exp + end + + def ignore + IGNORE + end + + #Process a new scope. Removes expressions that are set to nil. + def process_scope exp + #NOPE? + end + + #Default processing. + def process_default exp + exp = exp.dup + + exp.each_with_index do |e, i| + exp[i] = process e if sexp? e and not e.empty? + end + + exp + end + + #Process an if statement. + def process_if exp + exp = exp.dup + condition = exp[1] = process exp.condition + + if true? condition + exp[2] = process exp.then_clause if exp.then_clause + exp[3] = nil + elsif false? condition + exp[2] = nil + exp[3] = process exp.else_clause if exp.else_clause + else + exp[2] = process exp.then_clause if exp.then_clause + exp[3] = process exp.else_clause if exp.else_clause + end + + exp + end + + #Processes calls with blocks. + # + #s(:iter, CALL, {:lasgn|:masgn}, BLOCK) + def process_iter exp + exp = exp.dup + call = process exp.block_call + #deal with assignments somehow + if exp.block + block = process exp.block + block = nil if block.empty? + else + block = nil + end + + call = Sexp.new(:iter, call, exp.block_args, block).compact + call.line(exp.line) + call + end + + #String with interpolation. + def process_dstr exp + exp = exp.dup + exp.shift + exp.map! do |e| + if e.is_a? String + e + else + res = process e + if res.empty? + nil + else + res + end + end + end.compact! + + exp.unshift :dstr + end + + #Processes a block. Changes Sexp node type to :rlist + def process_block exp + exp = exp.dup + exp.shift + + exp.map! do |e| + process e + end + + exp.unshift :rlist + end + + alias process_rlist process_block + + #Processes the inside of an interpolated String. + def process_evstr exp + exp = exp.dup + if exp[1] + exp[1] = process exp[1] + end + + exp + end + + #Processes a hash + def process_hash exp + exp = exp.dup + exp.shift + exp.map! do |e| + if sexp? e + process e + else + e + end + end + + exp.unshift :hash + end + + #Processes the values in an argument list + def process_arglist exp + exp = exp.dup + exp.shift + exp.map! do |e| + process e + end + + exp.unshift :arglist + end + + #Processes a local assignment + def process_lasgn exp + exp = exp.dup + exp.rhs = process exp.rhs + exp + end + + alias :process_iasgn :process_lasgn + + #Processes an instance variable assignment + def process_iasgn exp + exp = exp.dup + exp.rhs = process exp.rhs + exp + end + + #Processes an attribute assignment, which can be either x.y = 1 or x[:y] = 1 + def process_attrasgn exp + exp = exp.dup + exp.target = process exp.target + exp.arglist = process exp.arglist + exp + end + + #Ignore ignore Sexps + def process_ignore exp + exp + end + + def process_cdecl exp + if @tracker + @tracker.add_constant exp.lhs, + exp.rhs, + :file => current_file, + :module => @current_module, + :class => @current_class, + :method => @current_method + end + + exp + end + + #Convenience method for `make_render exp, true` + def make_render_in_view exp + make_render exp, true + end + + #Generates :render node from call to render. + def make_render exp, in_view = false + render_type, value, rest = find_render_type exp, in_view + rest = process rest + result = Sexp.new(:render, render_type, value, rest) + result.line(exp.line) + + result + end + + #Determines the type of a call to render. + # + #Possible types are: + #:action, :default, :file, :inline, :js, :json, :nothing, :partial, + #:template, :text, :update, :xml + # + #And also :layout for inside templates + def find_render_type call, in_view = false + rest = Sexp.new(:hash).line(call.line) + type = nil + value = nil + first_arg = call.first_arg + + if call.second_arg.nil? and first_arg == Sexp.new(:lit, :update) + return :update, nil, Sexp.new(:arglist, *call.args[0..-2]) #TODO HUH? + end + + #Look for render :action, ... or render "action", ... + if string? first_arg or symbol? first_arg + if @current_template and @tracker.options[:rails3] + type = :partial + value = first_arg + else + type = :action + value = first_arg + end + elsif first_arg.is_a? Symbol or first_arg.is_a? String + type = :action + value = Sexp.new(:lit, first_arg.to_sym).line(call.line) + elsif first_arg.nil? + type = :default + elsif not hash? first_arg + # Maybe do partial if in view? + type = :action + value = first_arg + end + + types_in_hash = Set[:action, :file, :inline, :js, :json, :nothing, :partial, :template, :text, :update, :xml] + + #render :layout => "blah" means something else when in a template + if in_view + types_in_hash << :layout + end + + last_arg = call.last_arg + + #Look for "type" of render in options hash + #For example, render :file => "blah" + if hash? last_arg + hash_iterate(last_arg) do |key, val| + if symbol? key and types_in_hash.include? key.value + type = key.value + value = val + else + rest << key << val + end + end + end + + type ||= :default + value ||= :default + + if type == :inline and string? value and not hash_access(rest, :type) + value, rest = make_inline_render(value, rest) + end + + return type, value, rest + end + + def make_inline_render value, options + require 'brakeman/parsers/template_parser' + + class_or_module = (@current_class || @current_module) + + class_or_module = if class_or_module.nil? + "Unknown" + else + class_or_module.name + end + + template_name = "#@current_method/inline@#{value.line}:#{class_or_module}".to_sym + type, ast = Brakeman::TemplateParser.parse_inline_erb(@tracker, value.value) + ast = ast.deep_clone(value.line) + @tracker.processor.process_template(template_name, ast, type, nil, @current_file) + @tracker.processor.process_template_alias(@tracker.templates[template_name]) + + return s(:lit, template_name).line(value.line), options + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/config_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/config_processor.rb new file mode 100644 index 000000000..9a580ed6c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/config_processor.rb @@ -0,0 +1,17 @@ +require 'brakeman/processors/base_processor' +require 'brakeman/processors/alias_processor' +require 'brakeman/processors/lib/rails4_config_processor.rb' +require 'brakeman/processors/lib/rails3_config_processor.rb' +require 'brakeman/processors/lib/rails2_config_processor.rb' + +class Brakeman::ConfigProcessor + def self.new tracker + if tracker.options[:rails4] + Brakeman::Rails4ConfigProcessor.new tracker + elsif tracker.options[:rails3] + Brakeman::Rails3ConfigProcessor.new tracker + else + Brakeman::Rails2ConfigProcessor.new tracker + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/controller_alias_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/controller_alias_processor.rb new file mode 100644 index 000000000..e13cea3dd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/controller_alias_processor.rb @@ -0,0 +1,244 @@ +require 'brakeman/processors/alias_processor' +require 'brakeman/processors/lib/render_helper' +require 'brakeman/processors/lib/render_path' +require 'brakeman/processors/lib/find_return_value' + +#Processes aliasing in controllers, but includes following +#renders in routes and putting variables into templates +class Brakeman::ControllerAliasProcessor < Brakeman::AliasProcessor + include Brakeman::RenderHelper + + #If only_method is specified, only that method will be processed, + #other methods will be skipped. + #This is for rescanning just a single action. + def initialize tracker, only_method = nil + super tracker + @app_tree = tracker.app_tree + @only_method = only_method + @rendered = false + @current_class = @current_module = @current_method = nil + @method_cache = {} #Cache method lookups + end + + def process_controller name, src, current_file + if not node_type? src, :class + Brakeman.debug "#{name} is not a class, it's a #{src.node_type}" + return + else + @current_class = name + @current_file = @app_tree.file_path(current_file) + + process_default src + + process_mixins + end + end + + #Process modules mixed into the controller, in case they contain actions. + def process_mixins + controller = @tracker.controllers[@current_class] + original_file = @current_file + + controller.includes.each do |i| + mixin = @tracker.libs[i] + + next unless mixin + + #Process methods in alphabetical order for consistency + methods = mixin.methods_public.keys.map { |n| n.to_s }.sort.map { |n| n.to_sym } + + methods.each do |name| + #Need to process the method like it was in a controller in order + #to get the renders set + processor = Brakeman::ControllerProcessor.new(@tracker, mixin.file) + method = mixin.get_method(name).src.deep_clone + + if node_type? method, :defn + method = processor.process_defn method + else + #Should be a defn, but this will catch other cases + method = processor.process method + end + + @current_file = mixin.file + #Then process it like any other method in the controller + process method + end + end + ensure + @current_file = original_file + end + + #Skip it, must be an inner class + def process_class exp + exp + end + + #Processes a method definition, which may include + #processing any rendered templates. + def process_defn exp + meth_name = exp.method_name + + Brakeman.debug "Processing #{@current_class}##{meth_name}" + + #Skip if instructed to only process a specific method + #(but don't skip if this method was called from elsewhere) + return exp if @current_method.nil? and @only_method and @only_method != meth_name + + is_route = route? meth_name + other_method = @current_method + @current_method = meth_name + @rendered = false if is_route + + meth_env do + if is_route + before_filter_list(@current_method, @current_class).each do |f| + process_before_filter f + end + end + + process_all exp.body + + if is_route and not @rendered + process_default_render exp + end + end + + @current_method = other_method + exp + end + + #Look for calls to head() + def process_call exp + exp = super + return exp unless call? exp + + method = exp.method + + if method == :head + @rendered = true + elsif exp.target.nil? and method == :template_exists? + env[exp.first_arg] = Sexp.new(:lit, :"brakeman:existing_template") + elsif @tracker.options[:interprocedural] and + @current_method and (exp.target.nil? or exp.target.node_type == :self) + + exp = get_call_value(exp) + end + + exp + end + + #Check for +respond_to+ + def process_iter exp + super + + if call? exp.block_call and exp.block_call.method == :respond_to + @rendered = true + end + + exp + end + + #Processes a call to a before filter. + #Basically, adds any instance variable assignments to the environment. + #TODO: method arguments? + def process_before_filter name + filter = tracker.find_method name, @current_class + + if filter.nil? + Brakeman.debug "[Notice] Could not find filter #{name}" + return + end + + method = filter.src + + if ivars = @tracker.filter_cache[[filter.owner, name]] + ivars.each do |variable, value| + env[variable] = value + end + else + processor = Brakeman::AliasProcessor.new @tracker + processor.process_safely(method.body_list, only_ivars(:include_request_vars)) + + ivars = processor.only_ivars(:include_request_vars).all + + @tracker.filter_cache[[filter.owner, name]] = ivars + + ivars.each do |variable, value| + env[variable] = value + end + end + end + + #Processes the default template for the current action + def process_default_render exp + process_layout + process_template template_name, nil, nil, nil + end + + #Process template and add the current class and method name as called_from info + def process_template name, args, _, line + # If line is null, assume implicit render and set the end of the action + # method as the line number + if line.nil? and controller = @tracker.controllers[@current_class] + if meth = controller.get_method(@current_method) + if line = meth.src && meth.src.last && meth.src.last.line + line += 1 + else + line = 1 + end + end + end + + render_path = Brakeman::RenderPath.new.add_controller_render(@current_class, @current_method, line, @current_file) + super name, args, render_path, line + end + + #Turns a method name into a template name + def template_name name = nil + name ||= @current_method + name = name.to_s + if name.include? "/" + name + else + controller = @current_class.to_s.gsub("Controller", "") + controller.gsub!("::", "/") + underscore(controller + "/" + name.to_s) + end + end + + #Determines default layout name + def layout_name + controller = @tracker.controllers[@current_class] + + return controller.layout if controller.layout + return false if controller.layout == false + + app_controller = @tracker.controllers[:ApplicationController] + + return app_controller.layout if app_controller and app_controller.layout + + nil + end + + #Returns true if the given method name is also a route + def route? method + if @tracker.routes[:allow_all_actions] or @tracker.options[:assume_all_routes] + true + else + routes = @tracker.routes[@current_class] + routes and (routes.include? :allow_all_actions or routes.include? method) + end + end + + #Get list of filters, including those that are inherited + def before_filter_list method, klass + controller = @tracker.controllers[klass] + + if controller + controller.before_filter_list self, method + else + [] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/controller_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/controller_processor.rb new file mode 100644 index 000000000..26398ee9e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/controller_processor.rb @@ -0,0 +1,245 @@ +require 'brakeman/processors/base_processor' +require 'brakeman/processors/lib/module_helper' +require 'brakeman/tracker/controller' + +#Processes controller. Results are put in tracker.controllers +class Brakeman::ControllerProcessor < Brakeman::BaseProcessor + include Brakeman::ModuleHelper + + FORMAT_HTML = Sexp.new(:call, Sexp.new(:lvar, :format), :html) + + def initialize tracker, current_file = nil + super(tracker) + @visibility = :public + @current_file = current_file + @concerns = Set.new + end + + #Use this method to process a Controller + def process_controller src, current_file = @current_file + @current_file = current_file + process src + end + + #s(:class, NAME, PARENT, s(:scope ...)) + def process_class exp + name = class_name(exp.class_name) + parent = class_name(exp.parent_name) + + #If inside a real controller, treat any other classes as libraries. + #But if not inside a controller already, then the class may include + #a real controller, so we can't take this shortcut. + if @current_class and @current_class.name.to_s.end_with? "Controller" + Brakeman.debug "[Notice] Treating inner class as library: #{name}" + Brakeman::LibraryProcessor.new(@tracker).process_library exp, @current_file + return exp + end + + if not name.to_s.end_with? "Controller" + Brakeman.debug "[Notice] Adding noncontroller as library: #{name}" + #Set the class to be a module in order to get the right namespacing. + #Add class to libraries, in case it is needed later (e.g. it's used + #as a parent class for a controller.) + #However, still want to process it in this class, so have to set + #@current_class to this not-really-a-controller thing. + process_module exp, parent + + return exp + end + + handle_class(exp, @tracker.controllers, Brakeman::Controller) do + set_layout_name + end + + exp + end + + def process_module exp, parent = nil + handle_module exp, Brakeman::Controller, parent + end + + def process_concern concern_name + return unless @current_class + + if mod = @tracker.find_class(concern_name) + if mod.options[:included] and not @concerns.include? concern_name + @concerns << concern_name + process mod.options[:included].deep_clone + end + end + end + + #Look for specific calls inside the controller + def process_call exp + return exp if process_call_defn? exp + + target = exp.target + if sexp? target + target = process target + end + + method = exp.method + first_arg = exp.first_arg + last_arg = exp.last_arg + + #Methods called inside class definition + #like attr_* and other settings + if @current_method.nil? and target.nil? and @current_class + if first_arg.nil? #No args + case method + when :private, :protected, :public + @visibility = method + when :protect_from_forgery + @current_class.options[:protect_from_forgery] = true + else + #?? + end + else + case method + when :include + if @current_class + concern = class_name(first_arg) + @current_class.add_include concern + process_concern concern + end + when :before_filter, :append_before_filter, :before_action, :append_before_action + if node_type? exp.first_arg, :iter + add_lambda_filter exp + else + @current_class.add_before_filter exp + end + when :prepend_before_filter, :prepend_before_action + if node_type? exp.first_arg, :iter + add_lambda_filter exp + else + @current_class.prepend_before_filter exp + end + when :skip_before_filter, :skip_filter, :skip_before_action, :skip_action_callback + @current_class.skip_filter exp + when :layout + if string? last_arg + #layout "some_layout" + + name = last_arg.value.to_s + if @app_tree.layout_exists?(name) + @current_class.layout = "layouts/#{name}" + else + Brakeman.debug "[Notice] Layout not found: #{name}" + end + elsif node_type? last_arg, :nil, :false + #layout :false or layout nil + @current_class.layout = false + end + else + @current_class.add_option method, exp + end + end + + exp + elsif target == nil and method == :render + make_render exp + elsif exp == FORMAT_HTML and context[1] != :iter + #This is an empty call to + # format.html + #Which renders the default template if no arguments + #Need to make more generic, though. + call = Sexp.new :render, :default, @current_method + call.line(exp.line) + call + else + call = make_call target, method, process_all!(exp.args) + call.line(exp.line) + call + end + end + + #Look for before_filters and add fake ones if necessary + def process_iter exp + if @current_method.nil? and call? exp.block_call + block_call_name = exp.block_call.method + + if block_call_name == :before_filter or block_call_name == :before_action + add_fake_filter exp + else + super + end + else + super + end + end + + #Sets default layout for renders inside Controller + def set_layout_name + return if @current_class.layout + + name = underscore(@current_class.name.to_s.split("::")[-1].gsub("Controller", '')) + + #There is a layout for this Controller + if @app_tree.layout_exists?(name) + @current_class.layout = "layouts/#{name}" + end + end + + #This is to handle before_filter do |controller| ... end + # + #We build a new method and process that the same way as usual + #methods and filters. + def add_fake_filter exp + unless @current_class + Brakeman.debug "Skipping before_filter outside controller: #{exp}" + return exp + end + + filter_name = ("fake_filter" + rand.to_s[/\d+$/]).to_sym + args = exp.block_call.arglist + args.insert(1, Sexp.new(:lit, filter_name).line(exp.line)) + before_filter_call = make_call(nil, :before_filter, args).line(exp.line) + + if exp.block_args.length > 1 + block_variable = exp.block_args[1] + else + block_variable = :temp + end + + if node_type? exp.block, :block + block_inner = exp.block.sexp_body + else + block_inner = [exp.block] + end + + #Build Sexp for filter method + body = Sexp.new(:lasgn, + block_variable, + Sexp.new(:call, Sexp.new(:const, @current_class.name).line(exp.line), :new).line(exp.line)).line(exp.line) + + filter_method = Sexp.new(:defn, filter_name, Sexp.new(:args).line(exp.line), body).concat(block_inner).line(exp.line) + + vis = @visibility + @visibility = :private + process_defn filter_method + @visibility = vis + process before_filter_call + exp + end + + def add_lambda_filter exp + # Convert into regular block call + e = exp.dup + lambda_node = e.delete_at(3) + result = Sexp.new(:iter, e).line(e.line) + + # Add block arguments + if node_type? lambda_node[2], :args + result << lambda_node[2].last + else + result << s(:args) + end + + # Add block contents + if sexp? lambda_node[3] + result << lambda_node[3] + end + + add_fake_filter result + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/erb_template_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/erb_template_processor.rb new file mode 100644 index 000000000..16066864c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/erb_template_processor.rb @@ -0,0 +1,77 @@ +require 'brakeman/processors/template_processor' + +#Processes ERB templates +#(those ending in .html.erb or .rthml). +class Brakeman::ErbTemplateProcessor < Brakeman::TemplateProcessor + + #s(:call, TARGET, :method, ARGS) + def process_call exp + target = exp.target + if sexp? target + target = process target + end + method = exp.method + + #_erbout is the default output variable for erb + if node_type? target, :lvar and target.value == :_erbout + if method == :concat or method == :<< + @inside_concat = true + exp.arglist = process(exp.arglist) + @inside_concat = false + + if exp.second_arg + raise "Did not expect more than a single argument to _erbout.concat" + end + + arg = normalize_output(exp.first_arg) + + if arg.node_type == :str #ignore plain strings + ignore + else + add_output arg + end + elsif method == :force_encoding + ignore + else + abort "Unrecognized action on _erbout: #{method}" + end + elsif target == nil and method == :render + exp.arglist = process(exp.arglist) + make_render_in_view exp + else + exp.target = target + exp.arglist = process(exp.arglist) + exp + end + end + + #Process block, removing irrelevant expressions + def process_block exp + exp = exp.dup + exp.shift + if @inside_concat + @inside_concat = false + exp[0..-2].each do |e| + process e + end + @inside_concat = true + process exp.last + else + exp.map! do |e| + res = process e + if res.empty? or res == ignore + nil + elsif node_type?(res, :lvar) and res.value == :_erbout + nil + + else + res + end + end + block = Sexp.new(:rlist).concat(exp).compact + block.line(exp.line) + block + end + end + +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/erubis_template_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/erubis_template_processor.rb new file mode 100644 index 000000000..d6bfa6b70 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/erubis_template_processor.rb @@ -0,0 +1,92 @@ +require 'brakeman/processors/template_processor' + +#Processes ERB templates using Erubis instead of erb. +class Brakeman::ErubisTemplateProcessor < Brakeman::TemplateProcessor + + #s(:call, TARGET, :method, ARGS) + def process_call exp + target = exp.target + if sexp? target + target = process target + end + + exp.target = target + exp.arglist = process exp.arglist + method = exp.method + + #_buf is the default output variable for Erubis + if node_type?(target, :lvar, :ivar) and (target.value == :_buf or target.value == :@output_buffer) + if method == :<< or method == :safe_concat + + arg = normalize_output(exp.first_arg) + + if arg.node_type == :str #ignore plain strings + ignore + elsif node_type? target, :ivar and target.value == :@output_buffer + add_escaped_output arg + else + add_output arg + end + elsif method == :to_s + ignore + else + abort "Unrecognized action on buffer: #{method}" + end + elsif target == nil and method == :render + make_render_in_view exp + else + exp + end + end + + #Process blocks, ignoring :ignore exps + def process_block exp + exp = exp.dup + exp.shift + exp.map! do |e| + res = process e + if res.empty? or res == ignore + nil + else + res + end + end + block = Sexp.new(:rlist).concat(exp).compact + block.line(exp.line) + block + end + + #Look for assignments to output buffer that look like this: + # @output_buffer.append = some_output + # @output_buffer.safe_append = some_output + # @output_buffer.safe_expr_append = some_output + def process_attrasgn exp + if exp.target.node_type == :ivar and exp.target.value == :@output_buffer + if append_method?(exp.method) + exp.first_arg = process(exp.first_arg) + arg = normalize_output(exp.first_arg) + + if arg.node_type == :str + ignore + elsif safe_append_method?(exp.method) + add_output arg + else + add_escaped_output arg + end + else + super + end + else + super + end + end + + private + def append_method?(method) + method == :append= || safe_append_method?(method) + end + + def safe_append_method?(method) + method == :safe_append= || method == :safe_expr_append= + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/gem_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/gem_processor.rb new file mode 100644 index 000000000..a8f283163 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/gem_processor.rb @@ -0,0 +1,103 @@ +require 'brakeman/processors/lib/basic_processor' + +#Processes Gemfile and Gemfile.lock +class Brakeman::GemProcessor < Brakeman::BasicProcessor + + def initialize *args + super + @gem_name_version = /^\s*([-_+.A-Za-z0-9]+) \((\w(\.\w+)*)\)/ + @ruby_version = /^\s+ruby (\d\.\d.\d+)/ + end + + def process_gems gem_files + @gem_files = gem_files + @gemfile = gem_files[:gemfile] && gem_files[:gemfile][:file] + @gemspec = gem_files[:gemspec] && gem_files[:gemspec][:file] + + + if @gemspec + process gem_files[:gemspec][:src] + end + + if @gemfile + process gem_files[:gemfile][:src] + end + + if gem_files[:gemlock] + process_gem_lock + end + + @tracker.config.set_rails_version + end + + # Known issue: Brakeman does not yet support `gem` calls with multiple + # "version requirements". Consider the following example from the ruby docs: + # + # gem 'rake', '>= 1.1.a', '< 2' + # + # We are assuming that `second_arg` (eg. '>= 1.1.a') is the only requirement. + # Perhaps we should instantiate an array of `::Gem::Requirement`s or even a + # `::Gem::Dependency` and pass that to `Tracker::Config#add_gem`? + def process_call exp + if exp.target == nil + if exp.method == :gem + gem_name = exp.first_arg + return exp unless string? gem_name + + gem_version = exp.second_arg + + version = if string? gem_version + gem_version.value + else + nil + end + + @tracker.config.add_gem gem_name.value, version, @gemfile, exp.line + elsif exp.method == :ruby + version = exp.first_arg + if string? version + @tracker.config.set_ruby_version version.value, @gemfile, exp.line + end + end + elsif @inside_gemspec and exp.method == :add_dependency + if string? exp.first_arg and string? exp.second_arg + @tracker.config.add_gem exp.first_arg.value, exp.second_arg.value, @gemspec, exp.line + end + end + + exp + end + + GEM_SPEC = s(:colon2, s(:const, :Gem), :Specification) + + def process_iter exp + if exp.block_call.target == GEM_SPEC and exp.block_call.method == :new + @inside_gemspec = true + process exp.block if sexp? exp.block + + exp + else + process_default exp + end + ensure + @inside_gemspec = false + end + + def process_gem_lock + line_num = 1 + file = @gem_files[:gemlock][:file] + @gem_files[:gemlock][:src].each_line do |line| + set_gem_version_and_file line, file, line_num + line_num += 1 + end + end + + # Supports .rc2 but not ~>, >=, or <= + def set_gem_version_and_file line, file, line_num + if line =~ @gem_name_version + @tracker.config.add_gem $1, $2, file, line_num + elsif line =~ @ruby_version + @tracker.config.set_ruby_version $1, file, line_num + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/haml6_template_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/haml6_template_processor.rb new file mode 100644 index 000000000..d5de0f6f2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/haml6_template_processor.rb @@ -0,0 +1,92 @@ +require 'brakeman/processors/haml_template_processor' + +class Brakeman::Haml6TemplateProcessor < Brakeman::HamlTemplateProcessor + + OUTPUT_BUFFER = s(:ivar, :@output_buffer) + HAML_UTILS = s(:colon2, s(:colon3, :Haml), :Util) + HAML_UTILS2 = s(:colon2, s(:const, :Haml), :Util) + # @output_buffer = output_buffer || ActionView::OutputBuffer.new + AV_SAFE_BUFFER = s(:or, s(:call, nil, :output_buffer), s(:call, s(:colon2, s(:const, :ActionView), :OutputBuffer), :new)) + EMBEDDED_FILTER = s(:const, :BrakemanFilter) + + def initialize(*) + super + + # Because of how Haml 6 handles line breaks - + # we have to track where _haml_compiler variables are assigned. + # then change the line number of where they are output to where + # they are assigned. + # + # Like this: + # + # ; _haml_compiler1 = (params[:x]; + # ; ); @output_buffer.safe_concat((((::Haml::Util.escape_html_safe((_haml_compiler1))).to_s).to_s)); + # + # `_haml_compiler1` is output a line after it's assigned, + # but the assignment matches the "real" line where it is output in the template. + @compiler_assigns = {} + end + + # @output_buffer.safe_concat + def buffer_append? exp + call? exp and + output_buffer? exp.target and + exp.method == :safe_concat + end + + def process_lasgn exp + if exp.lhs.match?(/_haml_compiler\d+/) + @compiler_assigns[exp.lhs] = exp.rhs + ignore + else + exp + end + end + + def process_lvar exp + if exp.value.match?(/_haml_compiler\d+/) + exp = @compiler_assigns[exp.value] || exp + end + + exp + end + + def is_escaped? exp + return unless call? exp + + html_escaped? exp or + javascript_escaped? exp + end + + def javascript_escaped? call + # TODO: Adding here to match existing behavior for HAML, + # but really this is not safe and needs to be revisited + call.method == :j or + call.method == :escape_javascript + end + + def html_escaped? call + (call.target == HAML_UTILS or call.target == HAML_UTILS2) and + (call.method == :escape_html or call.method == :escape_html_safe) + end + + def output_buffer? exp + exp == OUTPUT_BUFFER or + exp == AV_SAFE_BUFFER + end + + def normalize_output arg + arg = super(arg) + + if embedded_filter? arg + super(arg.first_arg) + else + arg + end + end + + # Handle our "fake" embedded filters + def embedded_filter? arg + call? arg and arg.method == :render and arg.target == EMBEDDED_FILTER + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/haml_template_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/haml_template_processor.rb new file mode 100644 index 000000000..70d6d6bee --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/haml_template_processor.rb @@ -0,0 +1,182 @@ +require 'brakeman/processors/template_processor' + +#Processes HAML templates. +class Brakeman::HamlTemplateProcessor < Brakeman::TemplateProcessor + HAMLOUT = s(:call, nil, :_hamlout) + HAML_BUFFER = s(:call, HAMLOUT, :buffer) + HAML_HELPERS = s(:colon2, s(:const, :Haml), :Helpers) + HAML_HELPERS2 = s(:colon2, s(:colon3, :Haml), :Helpers) + JAVASCRIPT_FILTER = s(:colon2, s(:colon2, s(:const, :Haml), :Filters), :Javascript) + COFFEE_FILTER = s(:colon2, s(:colon2, s(:const, :Haml), :Filters), :Coffee) + ATTRIBUTE_BUILDER = s(:colon2, s(:colon3, :Haml), :AttributeBuilder) + + def initialize *args + super + @javascript = false + end + + #Processes call, looking for template output + def process_call exp + exp = process_default exp + + if buffer_append? exp + output = normalize_output(exp.first_arg) + res = get_pushed_value(output) + end + + res or exp + end + + # _haml_out.buffer << ... + def buffer_append? exp + call? exp and + exp.target == HAML_BUFFER and + exp.method == :<< + end + + PRESERVE_METHODS = [:find_and_preserve, :preserve] + + def find_and_preserve? exp + call? exp and + PRESERVE_METHODS.include?(exp.method) and + exp.first_arg + end + + #If inside an output stream, only return the final expression + def process_block exp + exp = exp.dup + exp.shift + + exp.map! do |e| + res = process e + if res.empty? + nil + else + res + end + end + + Sexp.new(:rlist).concat(exp).compact + end + + #HAML likes to put interpolated values into _hamlout.push_text + #but we want to handle those individually + def build_output_from_push_text exp, default = :output + if string_interp? exp + exp.map! do |e| + if sexp? e + if node_type? e, :evstr and e[1] + e = e.value + end + + get_pushed_value e, default + else + e + end + end + end + end + + ESCAPE_METHODS = [ + :html_escape, + :html_escape_without_haml_xss, + :escape_once, + :escape_once_without_haml_xss + ] + + def is_escaped? exp + return unless call? exp + + haml_helpers? exp.target and ESCAPE_METHODS.include? exp.method + end + + def get_pushed_value exp, default = :output + return exp unless sexp? exp + + case exp.node_type + when :format + exp.node_type = :output + @current_template.add_output exp + exp + when :format_escaped + exp.node_type = :escaped_output + @current_template.add_output exp + exp + when :str, :ignore, :output, :escaped_output + exp + when :block, :rlist + exp.map! { |e| get_pushed_value(e, default) } + when :dstr + build_output_from_push_text(exp, default) + when :if + clauses = [get_pushed_value(exp.then_clause, default), get_pushed_value(exp.else_clause, default)].compact + + if clauses.length > 1 + s(:or, *clauses).line(exp.line) + else + clauses.first + end + when :call + if exp.method == :to_s or exp.method == :strip + get_pushed_value(exp.target, default) + elsif is_escaped? exp + get_pushed_value(exp.first_arg, :escaped_output) + elsif @javascript and (exp.method == :j or exp.method == :escape_javascript) # TODO: Remove - this is not safe + get_pushed_value(exp.first_arg, :escaped_output) + elsif find_and_preserve? exp or fix_textareas? exp + get_pushed_value(exp.first_arg, default) + elsif raw? exp + get_pushed_value(exp.first_arg, :output) + elsif hamlout_attributes? exp + ignore # ignore _hamlout.attributes calls + elsif exp.target.nil? and exp.method == :render + #Process call to render() + exp.arglist = process exp.arglist + make_render_in_view exp + elsif exp.method == :render_with_options + if exp.target == JAVASCRIPT_FILTER or exp.target == COFFEE_FILTER + @javascript = true + end + + get_pushed_value(exp.first_arg, default) + @javascript = false + elsif haml_attribute_builder? exp + ignore # probably safe... seems escaped by default? + else + add_output exp, default + end + else + add_output exp, default + end + end + + def haml_helpers? exp + # Sometimes its Haml::Helpers and + # sometimes its ::Haml::Helpers + exp == HAML_HELPERS or + exp == HAML_HELPERS2 + end + + def hamlout_attributes? exp + call? exp and + exp.target == HAMLOUT and + exp.method == :attributes + end + + def haml_attribute_builder? exp + call? exp and + exp.target == ATTRIBUTE_BUILDER and + (exp.method == :build or exp.method == :build_id) + end + + def fix_textareas? exp + call? exp and + exp.target == HAMLOUT and + exp.method == :fix_textareas! + end + + def raw? exp + call? exp and + exp.method == :raw + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/basic_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/basic_processor.rb new file mode 100644 index 000000000..fce1c680a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/basic_processor.rb @@ -0,0 +1,37 @@ +require 'brakeman/processors/lib/processor_helper' +require 'brakeman/processors/lib/safe_call_helper' +require 'brakeman/util' + +class Brakeman::BasicProcessor < Brakeman::SexpProcessor + include Brakeman::ProcessorHelper + include Brakeman::SafeCallHelper + include Brakeman::Util + + def initialize tracker + super() + @tracker = tracker + @current_template = @current_module = @current_class = @current_method = nil + end + + def process_default exp + process_all exp + end + + def process_if exp + condition = exp.condition + + process condition + + if true? condition + process exp.then_clause + elsif false? condition + process exp.else_clause + else + [exp.then_clause, exp.else_clause].compact.map do |e| + process e + end + end + + exp + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/call_conversion_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/call_conversion_helper.rb new file mode 100644 index 000000000..5888b8052 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/call_conversion_helper.rb @@ -0,0 +1,102 @@ +module Brakeman + module CallConversionHelper + # Join two array literals into one. + def join_arrays lhs, rhs, original_exp = nil + if array? lhs and array? rhs + result = Sexp.new(:array) + result.line(lhs.line || rhs.line || 1) + result.concat lhs[1..-1] + result.concat rhs[1..-1] + result + else + original_exp + end + end + + STRING_LENGTH_LIMIT = 50 + + # Join two string literals into one. + def join_strings lhs, rhs, original_exp = nil + if string? lhs and string? rhs + if (lhs.value.length + rhs.value.length > STRING_LENGTH_LIMIT) + # Avoid gigantic strings + lhs + else + result = Sexp.new(:str).line(lhs.line) + result.value = lhs.value + rhs.value + result + end + elsif call? lhs and lhs.method == :+ and string? lhs.first_arg and string? rhs + joined = join_strings lhs.first_arg, rhs + lhs.first_arg = joined + lhs + elsif safe_literal? lhs or safe_literal? rhs + safe_literal(lhs.line) + else + original_exp + end + rescue Encoding::CompatibilityError => e + # If the two strings are different encodings, we can't join them. + Brakeman.debug e.inspect + original_exp + end + + def math_op op, lhs, rhs, original_exp = nil + if number? lhs and number? rhs + if op == :/ and rhs.value == 0 and not lhs.value.is_a? Float + # Avoid division by zero + return original_exp + else + value = lhs.value.send(op, rhs.value) + Sexp.new(:lit, value).line(lhs.line) + end + elsif call? lhs and lhs.method == :+ and number? lhs.first_arg and number? rhs + # (x + 1) + 2 -> (x + 3) + lhs.first_arg = Sexp.new(:lit, lhs.first_arg.value + rhs.value).line(lhs.first_arg.line) + lhs + elsif safe_literal? lhs or safe_literal? rhs + safe_literal(lhs.line) + else + original_exp + end + end + + # Process single integer access to an array. + # + # Returns the value inside the array, if possible. + def process_array_access array, args, original_exp = nil + if args.length == 1 and integer? args.first + index = args.first.value + + #Have to do this because first element is :array and we have to skip it + array[1..-1][index] or original_exp + elsif all_literals? array + safe_literal(array.line) + else + original_exp + end + end + + # Process hash access by returning the value associated + # with the given argument. + def process_hash_access hash, index, original_exp = nil + if value = hash_access(hash, index) + value # deep_clone? + elsif all_literals? hash, :hash + safe_literal(hash.line) + else + original_exp + end + end + + # You must check the return value for `nil`s - + # which indicate a key could not be found. + def hash_values_at hash, keys + values = keys.map do |key| + process_hash_access hash, key + end + + Sexp.new(:array).concat(values).line(hash.line) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/file_type_detector.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/file_type_detector.rb new file mode 100644 index 000000000..3872de44c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/file_type_detector.rb @@ -0,0 +1,66 @@ +module Brakeman + class FileTypeDetector < BaseProcessor + def initialize + super(nil) + reset + end + + def detect_type(file) + reset + process(file.ast) + + if @file_type.nil? + @file_type = guess_from_path(file.path.relative) + end + + @file_type || :lib + end + + MODEL_CLASSES = [ + :'ActiveRecord::Base', + :ApplicationRecord + ] + + def process_class exp + name = class_name(exp.class_name) + parent = class_name(exp.parent_name) + + if name.match(/Controller$/) + @file_type = :controller + return exp + elsif MODEL_CLASSES.include? parent + @file_type = :model + return exp + end + + super + end + + def guess_from_path path + case + when path.include?('app/models') + :model + when path.include?('app/controllers') + :controller + when path.include?('config/initializers') + :initializer + when path.include?('lib/') + :lib + when path.match?(%r{config/environments/(?!production\.rb)$}) + :skip + when path.match?(%r{environments/production\.rb$}) + :skip + when path.match?(%r{application\.rb$}) + :skip + when path.match?(%r{config/routes\.rb$}) + :skip + end + end + + private + + def reset + @file_type = nil + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_all_calls.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_all_calls.rb new file mode 100644 index 000000000..347ad6244 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_all_calls.rb @@ -0,0 +1,264 @@ +require 'brakeman/processors/lib/basic_processor' + +class Brakeman::FindAllCalls < Brakeman::BasicProcessor + attr_reader :calls + + def initialize tracker + super + + @in_target = false + @processing_class = false + @calls = [] + @cache = {} + end + + #Process the given source. Provide either class and method being searched + #or the template. These names are used when reporting results. + def process_source exp, opts + @current_class = opts[:class] + @current_method = opts[:method] + @current_template = opts[:template] + @current_file = opts[:file] + @current_call = nil + @full_call = nil + process exp + end + + #For whatever reason, originally the indexing of calls + #was performed on individual method bodies (see process_defn). + #This method explicitly indexes all calls everywhere given any + #source. + def process_all_source exp, opts + @processing_class = true + process_source exp, opts + ensure + @processing_class = false + end + + #Process body of method + def process_defn exp + return exp unless @current_method or @processing_class + + # 'Normal' processing assumes the method name was given + # as an option to `process_source` but for `process_all_source` + # we don't want to do that. + if @current_method.nil? + @current_method = exp.method_name + process_all exp.body + @current_method = nil + else + process_all exp.body + end + + exp + end + + alias process_defs process_defn + + #Process body of block + def process_rlist exp + process_all exp + end + + def process_call exp + @calls << create_call_hash(exp).freeze + exp + end + + def process_iter exp + call = exp.block_call + + if call.node_type == :call + call_hash = create_call_hash(call) + + call_hash[:block] = exp.block + call_hash[:block_args] = exp.block_args + call_hash.freeze + + @calls << call_hash + + process exp.block + else + #Probably a :render call with block + process call + process exp.block + end + + exp + end + + #Calls to render() are converted to s(:render, ...) but we would + #like them in the call cache still for speed + def process_render exp + process_all exp + + add_simple_call :render, exp + + exp + end + + #Technically, `` is call to Kernel#` + #But we just need them in the call cache for speed + def process_dxstr exp + process exp.last if sexp? exp.last + + add_simple_call :`, exp + + exp + end + + #:"string" is equivalent to "string".to_sym + def process_dsym exp + exp.each { |arg| process arg if sexp? arg } + + add_simple_call :literal_to_sym, exp + + exp + end + + # Process a dynamic regex like a call + def process_dregx exp + exp.each { |arg| process arg if sexp? arg } + + add_simple_call :brakeman_regex_interp, exp + + exp + end + + #Process an assignment like a call + def process_attrasgn exp + process_call exp + end + + private + + def add_simple_call method_name, exp + @calls << { :target => nil, + :method => method_name, + :call => exp, + :nested => false, + :location => make_location, + :parent => @current_call, + :full_call => @full_call }.freeze + end + + #Gets the target of a call as a Symbol + #if possible + def get_target exp, include_calls = false + if sexp? exp + case exp.node_type + when :ivar, :lvar, :const, :lit + exp.value + when :true, :false + exp[0] + when :colon2 + class_name exp + when :self + @current_class || @current_module || nil + when :params, :session, :cookies + exp.node_type + when :call, :safe_call + if include_calls + if exp.target.nil? + exp.method + else + t = get_target(exp.target, :include_calls) + if t.is_a? Symbol + :"#{t}.#{exp.method}" + else + exp + end + end + else + exp + end + else + exp + end + else + exp + end + end + + #Returns method chain as an array + #For example, User.human.alive.all would return [:User, :human, :alive, :all] + def get_chain call + if node_type? call, :call, :attrasgn, :safe_call, :safe_attrasgn + get_chain(call.target) + [call.method] + elsif call.nil? + [] + else + [get_target(call)] + end + end + + def make_location + if @current_template + key = [@current_template, @current_file] + cached = @cache[key] + return cached if cached + + @cache[key] = { :type => :template, + :template => @current_template, + :file => @current_file } + else + key = [@current_class, @current_method, @current_file] + cached = @cache[key] + return cached if cached + @cache[key] = { :type => :class, + :class => @current_class, + :method => @current_method, + :file => @current_file } + end + + end + + #Return info hash for a call Sexp + def create_call_hash exp + target = get_target exp.target + target_symbol = get_target(target, :include_calls) + + method = exp.method + + call_hash = { + :target => target_symbol, + :method => method, + :call => exp, + :nested => @in_target, + :chain => get_chain(exp), + :location => make_location, + :parent => @current_call, + :full_call => @full_call + } + + unless @in_target + @full_call = call_hash + call_hash[:full_call] = call_hash + end + + # Process up the call chain + if call? target or node_type? target, :dxstr # need to index `` even if target of a call + already_in_target = @in_target + @in_target = true + process target + @in_target = already_in_target + end + + # Process call arguments + # but add the current call as the 'parent' + # to any calls in the arguments + old_parent = @current_call + @current_call = call_hash + + # Do not set @full_call when processing arguments + old_full_call = @full_call + @full_call = nil + + process_call_args exp + + @current_call = old_parent + @full_call = old_full_call + + call_hash + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_call.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_call.rb new file mode 100644 index 000000000..9ad2d5830 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_call.rb @@ -0,0 +1,122 @@ +require 'brakeman/processors/lib/basic_processor' + +#Finds method calls matching the given target(s). +# #-- This should be deprecated --# +# #-- Do not use for new code --# +# +#Targets/methods can be: +# +# - nil: matches anything, including nothing +# - Empty array: matches nothing +# - Symbol: matches single target/method exactly +# - Array of symbols: matches against any of the symbols +# - Regular expression: matches the expression +# - Array of regular expressions: matches any of the expressions +# +#If a target is also the name of a class, methods called on instances +#of that class will also be matched, in a very limited way. +#(Any methods called on Klass.new, basically. More useful when used +#in conjunction with AliasProcessor.) +# +#Examples: +# +# #To find any uses of this class: +# FindCall.new :FindCall, nil +# +# #Find system calls without a target +# FindCall.new [], [:system, :exec, :syscall] +# +# #Find all calls to length(), no matter the target +# FindCall.new nil, :length +# +# #Find all calls to sub, sub!, gsub, or gsub! +# FindCall.new nil, /^g?sub!?$/ +class Brakeman::FindCall < Brakeman::BasicProcessor + + def initialize targets, methods, tracker + super tracker + @calls = [] + @find_targets = targets + @find_methods = methods + @current_class = nil + @current_method = nil + end + + #Returns a list of results. + # + #A result looks like: + # + # s(:result, :ClassName, :method_name, s(:call, ...)) + def matches + @calls + end + + #Process the given source. Provide either class and method being searched + #or the template. These names are used when reporting results. + # + #Use FindCall#matches to retrieve results. + def process_source exp + process exp + end + + #Process body of method + def process_defn exp + process_all exp.body + end + + alias :process_defs :process_defn + + #Look for matching calls and add them to results + def process_call exp + target = get_target exp.target + method = exp.method + + process_call_args exp + + if match(@find_targets, target) and match(@find_methods, method) + @calls << Sexp.new(:result, @current_module, @current_class, @current_method, exp).line(exp.line) + end + + exp + end + + #Process an assignment like a call + def process_attrasgn exp + process_call exp + end + + private + + #Gets the target of a call as a Symbol + #if possible + def get_target exp + if sexp? exp + case exp.node_type + when :ivar, :lvar, :const, :lit + exp.value + when :colon2 + class_name exp + else + exp + end + else + exp + end + end + + #Checks if the search terms match the given item + def match search_terms, item + case search_terms + when Symbol + if search_terms == item + true + else + false + end + when Enumerable + if search_terms.empty? + item == nil + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_return_value.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_return_value.rb new file mode 100644 index 000000000..770f66e62 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/find_return_value.rb @@ -0,0 +1,166 @@ +require 'brakeman/processors/alias_processor' + +#Attempts to determine the return value of a method. +# +#Preferred usage: +# +# Brakeman::FindReturnValue.return_value exp +class Brakeman::FindReturnValue + include Brakeman::Util + + #Returns a guess at the return value of a given method or other block of code. + # + #If multiple return values are possible, returns all values in an :or Sexp. + def self.return_value exp, env = nil + self.new.get_return_value exp, env + end + + def initialize + @uses_ivars = false + @return_values = [] + end + + def uses_ivars? + @uses_ivars + end + + #Find return value of Sexp. Takes an optional starting environment. + def get_return_value exp, env = nil + process_method exp, env + value = make_return_value + value.original_line = exp.line + value + end + + #Process method (or, actually, any Sexp) for return value. + def process_method exp, env = nil + exp = Brakeman::AliasProcessor.new.process_safely exp, env + + find_explicit_return_values exp + + if node_type? exp, :defn, :defs + body = exp.body + + unless body.empty? + @return_values << last_value(body) + else + Brakeman.debug "FindReturnValue: Empty method? #{exp.inspect}" + end + elsif exp + @return_values << last_value(exp) + else + Brakeman.debug "FindReturnValue: Given something strange? #{exp.inspect}" + end + + exp + end + + #Searches expression for return statements. + def find_explicit_return_values exp + todo = [exp] + + until todo.empty? + current = todo.shift + + @uses_ivars = true if node_type? current, :ivar + + if node_type? current, :return + @return_values << last_value(current.value) if current.value + elsif sexp? current + todo = current[1..-1].concat todo + end + end + end + + #Determines the "last value" of an expression. + def last_value exp + case exp.node_type + when :rlist, :block, :scope, Sexp + last_value exp.last + when :if + then_clause = exp.then_clause + else_clause = exp.else_clause + + if then_clause.nil? and else_clause.nil? + nil + elsif then_clause.nil? + last_value else_clause + elsif else_clause.nil? + last_value then_clause + else + true_branch = last_value then_clause + false_branch = last_value else_clause + + if true_branch and false_branch + value = make_or(true_branch, false_branch) + value.original_line = value.rhs.line + value + else #Unlikely? + true_branch or false_branch + end + end + when :lasgn, :iasgn, :op_asgn_or, :attrasgn + last_value exp.rhs + when :rescue + values = [] + + exp.each_sexp do |e| + if node_type? e, :resbody + if e.last + values << last_value(e.last) + end + elsif sexp? e + values << last_value(e) + end + end + + values.reject! do |v| + v.nil? or node_type? v, :nil + end + + if values.length > 1 + values.inject do |m, v| + make_or(m, v) + end + else + values.first + end + when :return + if exp.value + last_value exp.value + else + nil + end + when :nil + nil + else + exp.original_line = exp.line unless exp.original_line + exp + end + end + + def make_or lhs, rhs + #Better checks in future + if lhs == rhs + lhs + else + Sexp.new(:or, lhs, rhs) + end + end + + #Turns the array of return values into an :or Sexp + def make_return_value + @return_values.compact! + @return_values.uniq! + + if @return_values.empty? + Sexp.new(:nil) + elsif @return_values.length == 1 + @return_values.first + else + @return_values.reduce do |value, sexp| + make_or value, sexp + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/module_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/module_helper.rb new file mode 100644 index 000000000..76559872a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/module_helper.rb @@ -0,0 +1,141 @@ +module Brakeman::ModuleHelper + def handle_module exp, tracker_class, parent = nil + name = class_name(exp.module_name) + + if @current_module + outer_module = @current_module + name = (outer_module.name.to_s + "::" + name.to_s).to_sym + end + + if @current_class + name = (@current_class.name.to_s + "::" + name.to_s).to_sym + end + + if @tracker.libs[name] + @current_module = @tracker.libs[name] + @current_module.add_file @current_file, exp + else + @current_module = tracker_class.new name, parent, @current_file, exp, @tracker + @tracker.libs[name] = @current_module + end + + exp.body = process_all! exp.body + + if outer_module + @current_module = outer_module + else + @current_module = nil + end + + exp + end + + def handle_class exp, collection, tracker_class + name = class_name(exp.class_name) + parent = class_name exp.parent_name + + if @current_class + outer_class = @current_class + name = (outer_class.name.to_s + "::" + name.to_s).to_sym + end + + if @current_module + name = (@current_module.name.to_s + "::" + name.to_s).to_sym + end + + if collection[name] + @current_class = collection[name] + @current_class.add_file @current_file, exp + else + @current_class = tracker_class.new name, parent, @current_file, exp, @tracker + collection[name] = @current_class + end + + exp.body = process_all! exp.body + + yield if block_given? + + if outer_class + @current_class = outer_class + else + @current_class = nil + end + + exp + end + + def process_defs exp + name = exp.method_name + + if node_type? exp[1], :self + if @current_class + target = @current_class.name + elsif @current_module + target = @current_module.name + else + target = nil + end + else + target = class_name exp[1] + end + + @current_method = name + res = Sexp.new :defs, target, name, exp.formal_args, *process_all!(exp.body) + res.line(exp.line) + @current_method = nil + + # TODO: if target is not self/nil, then + # the method should be added to `target`, not current class + + if @current_class + @current_class.add_method @visibility, name, res, @current_file + elsif @current_module + @current_module.add_method @visibility, name, res, @current_file + end + res + end + + def process_defn exp + name = exp.method_name + + @current_method = name + + if @inside_sclass + res = Sexp.new :defs, s(:self), name, exp.formal_args, *process_all!(exp.body) + else + res = Sexp.new :defn, name, exp.formal_args, *process_all!(exp.body) + end + + res.line(exp.line) + @current_method = nil + + if @current_class + @current_class.add_method @visibility, name, res, @current_file + elsif @current_module + @current_module.add_method @visibility, name, res, @current_file + end + + res + end + + # class << self + def process_sclass exp + @inside_sclass = true + + process_all! exp + + exp + ensure + @inside_sclass = false + end + + def make_defs exp + # 'What if' there was some crazy code that had a + # defs inside a def inside an sclass? :| + return exp if node_type? exp, :defs + + raise "Unexpected node type: #{exp.node_type}" unless node_type? exp, :defn + + Sexp.new(:defs, s(:self), exp.method_name, exp.formal_args, *exp.body).line(exp.line) + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/processor_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/processor_helper.rb new file mode 100644 index 000000000..345ea6841 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/processor_helper.rb @@ -0,0 +1,88 @@ +#Contains a couple shared methods for Processors. +module Brakeman::ProcessorHelper + def process_all exp + exp.each_sexp do |e| + process e + end + exp + end + + def process_all! exp + exp.map! do |e| + if sexp? e + process e + else + e + end + end + + exp + end + + #Process the arguments of a method call. Does not store results. + # + #This method is used because Sexp#args and Sexp#arglist create new objects. + def process_call_args exp + exp.each_arg do |a| + process a if sexp? a + end + + exp + end + + def process_class exp + current_class = @current_class + @current_class = class_name exp[1] + process_all exp.body + @current_class = current_class + exp + end + + #Sets the current module. + def process_module exp + module_name = class_name(exp.class_name).to_s + prev_module = @current_module + + if prev_module + @current_module = "#{prev_module}::#{module_name}" + else + @current_module = module_name + end + + if block_given? + yield + else + process_all exp.body + end + + @current_module = prev_module + + exp + end + + # e.g. private defn + def process_call_defn? exp + if call? exp and exp.target.nil? and node_type? exp.first_arg, :defn, :defs and [:private, :public, :protected].include? exp.method + prev_visibility = @visibility + @visibility = exp.method + process exp.first_arg + @visibility = prev_visibility + exp + else + false + end + end + + def current_file + case + when @current_file + @current_file + when @current_class.is_a?(Brakeman::Collection) + @current_class.file + when @current_module.is_a?(Brakeman::Collection) + @current_module.file + else + nil + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails2_config_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails2_config_processor.rb new file mode 100644 index 000000000..095341f8c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails2_config_processor.rb @@ -0,0 +1,145 @@ +require 'brakeman/processors/lib/basic_processor' + +#Processes configuration. Results are put in tracker.config. +# +#Configuration of Rails via Rails::Initializer are stored in tracker.config.rails. +#For example: +# +# Rails::Initializer.run |config| +# config.action_controller.session_store = :cookie_store +# end +# +#will be stored in +# +# tracker.config[:rails][:action_controller][:session_store] +# +#Values for tracker.config.rails will still be Sexps. +class Brakeman::Rails2ConfigProcessor < Brakeman::BasicProcessor + #Replace block variable in + # + # Rails::Initializer.run |config| + # + #with this value so we can keep track of it. + RAILS_CONFIG = Sexp.new(:const, :"!BRAKEMAN_RAILS_CONFIG") + + def initialize *args + super + end + + #Use this method to process configuration file + def process_config src, current_file + @current_file = current_file + res = Brakeman::ConfigAliasProcessor.new.process_safely(src, nil, current_file) + process res + end + + #Check if config is set to use Erubis + def process_call exp + target = exp.target + target = process target if sexp? target + + if exp.method == :gem and exp.first_arg.value == "erubis" + Brakeman.notify "[Notice] Using Erubis for ERB templates" + @tracker.config.erubis = true + end + + exp + end + + #Look for configuration settings + def process_attrasgn exp + if exp.target == RAILS_CONFIG + #Get rid of '=' at end + attribute = exp.method.to_s[0..-2].to_sym + if exp.args.length > 1 + #Multiple arguments?...not sure if this will ever happen + @tracker.config.rails[attribute] = exp.args + else + @tracker.config.rails[attribute] = exp.first_arg + end + elsif include_rails_config? exp + options = get_rails_config exp + level = @tracker.config.rails + options[0..-2].each do |o| + level[o] ||= {} + level = level[o] + end + + level[options.last] = exp.first_arg + end + + exp + end + + #Check for Rails version + def process_cdecl exp + #Set Rails version required + if exp.lhs == :RAILS_GEM_VERSION + @tracker.config.set_rails_version exp.rhs.value + end + + exp + end + + #Check if an expression includes a call to set Rails config + def include_rails_config? exp + target = exp.target + if call? target + if target.target == RAILS_CONFIG + true + else + include_rails_config? target + end + elsif target == RAILS_CONFIG + true + else + false + end + end + + #Returns an array of symbols for each 'level' in the config + # + # config.action_controller.session_store = :cookie + # + #becomes + # + # [:action_controller, :session_store] + def get_rails_config exp + if node_type? exp, :attrasgn + attribute = exp.method.to_s[0..-2].to_sym + get_rails_config(exp.target) << attribute + elsif call? exp + if exp.target == RAILS_CONFIG + [exp.method] + else + get_rails_config(exp.target) << exp.method + end + else + raise "WHAT" + end + end +end + +#This is necessary to replace block variable so we can track config settings +class Brakeman::ConfigAliasProcessor < Brakeman::AliasProcessor + + RAILS_INIT = Sexp.new(:colon2, Sexp.new(:const, :Rails), :Initializer) + + #Look for a call to + # + # Rails::Initializer.run do |config| + # ... + # end + # + #and replace config with RAILS_CONFIG + def process_iter exp + target = exp.block_call.target + method = exp.block_call.method + + if sexp? target and target == RAILS_INIT and method == :run + env[Sexp.new(:lvar, exp.block_args.value)] = Brakeman::Rails2ConfigProcessor::RAILS_CONFIG + end + + process_default exp + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails2_route_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails2_route_processor.rb new file mode 100644 index 000000000..6cd836230 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails2_route_processor.rb @@ -0,0 +1,313 @@ +require 'brakeman/processors/lib/basic_processor' + +#Processes the Sexp from routes.rb. Stores results in tracker.routes. +# +#Note that it is only interested in determining what methods on which +#controllers are used as routes, not the generated URLs for routes. +class Brakeman::Rails2RoutesProcessor < Brakeman::BasicProcessor + include Brakeman::RouteHelper + + attr_reader :map, :nested, :current_controller + + def initialize tracker + super + @map = Sexp.new(:lvar, :map) + @nested = nil #used for identifying nested targets + @prefix = [] #Controller name prefix (a module name, usually) + @current_controller = nil + @with_options = nil #For use inside map.with_options + @current_file = "config/routes.rb" + end + + #Call this with parsed route file information. + # + #This method first calls RouteAliasProcessor#process_safely on the +exp+, + #so it does not modify the +exp+. + def process_routes exp + process Brakeman::RouteAliasProcessor.new.process_safely(exp, nil, @current_file) + end + + #Looking for mapping of routes + def process_call exp + target = exp.target + + if target == map or (not target.nil? and target == nested) + process_map exp + else + process_default exp + end + + exp + end + + #Process a map.something call + #based on the method used + def process_map exp + args = exp.args + + case exp.method + when :resource + process_resource args + when :resources + process_resources args + when :connect, :root + process_connect args + else + process_named_route args + end + + exp + end + + #Look for map calls that take a block. + #Otherwise, just do the default processing. + def process_iter exp + target = exp.block_call.target + + if target == map or target == nested + method = exp.block_call.method + case method + when :namespace + process_namespace exp + when :resources, :resource + process_resources exp.block_call.args + process_default exp.block if exp.block + when :with_options + process_with_options exp + end + exp + else + process_default exp + end + end + + #Process + # map.resources :x, :controller => :y, :member => ... + #etc. + def process_resources exp + controller = check_for_controller_name exp + if controller + self.current_controller = controller + process_resource_options exp[-1] + else + exp.each do |argument| + if node_type? argument, :lit + self.current_controller = exp.first.value + add_resources_routes + process_resource_options exp.last + end + end + end + end + + #Process all the options that might be in the hash passed to + #map.resource, et al. + def process_resource_options exp + if exp.nil? and @with_options + exp = @with_options + elsif @with_options + exp = exp.concat @with_options[1..-1] + end + return unless exp.node_type == :hash + + hash_iterate(exp) do |option, value| + case option[1] + when :controller, :requirements, :singular, :path_prefix, :as, + :path_names, :shallow, :name_prefix, :member_path, :nested_member_path, + :belongs_to, :conditions, :active_scaffold + #should be able to skip + when :collection, :member, :new + process_collection value + when :has_one + save_controller = current_controller + process_resource value[1..-1] #Verify this is proper behavior + self.current_controller = save_controller + when :has_many + save_controller = current_controller + process_resources value[1..-1] + self.current_controller = save_controller + when :only + process_option_only value + when :except + process_option_except value + else + Brakeman.notify "[Notice] Unhandled resource option, please report: #{option}" + end + end + end + + #Process route option :only => ... + def process_option_only exp + routes = @tracker.routes[@current_controller] + [:index, :new, :create, :show, :edit, :update, :destroy].each do |r| + routes.delete r + end + + if exp.node_type == :array + exp[1..-1].each do |e| + routes << e.value + end + end + end + + #Process route option :except => ... + def process_option_except exp + return unless exp.node_type == :array + routes = @tracker.routes[@current_controller] + + exp[1..-1].each do |e| + routes.delete e.value + end + end + + # map.resource :x, .. + def process_resource exp + controller = check_for_controller_name exp + if controller + self.current_controller = controller + process_resource_options exp.last + else + exp.each do |argument| + if node_type? argument, :lit + self.current_controller = pluralize(exp.first.value.to_s) + add_resource_routes + process_resource_options exp.last + end + end + end + end + + #Process + # map.connect '/something', :controller => 'blah', :action => 'whatever' + def process_connect exp + return if exp.empty? + + controller = check_for_controller_name exp + self.current_controller = controller if controller + + #Check for default route + if string? exp.first + if exp.first.value == ":controller/:action/:id" + @tracker.routes[:allow_all_actions] = exp.first + elsif exp.first.value.include? ":action" + @tracker.routes[@current_controller] = [:allow_all_actions, exp.line] + return + end + end + + #This -seems- redundant, but people might connect actions + #to a controller which already allows them all + return if @tracker.routes[@current_controller].is_a? Array and @tracker.routes[@current_controller][0] == :allow_all_actions + + exp.last.each_with_index do |e,i| + if symbol? e and e.value == :action + action = exp.last[i + 1] + + if node_type? action, :lit + @tracker.routes[@current_controller] << action.value.to_sym + end + + return + end + end + end + + # map.with_options :controller => 'something' do |something| + # something.resources :blah + # end + def process_with_options exp + @with_options = exp.block_call.last_arg + @nested = Sexp.new(:lvar, exp.block_args.value) + + self.current_controller = check_for_controller_name exp.block_call.args + + #process block + process exp.block + + @with_options = nil + @nested = nil + end + + # map.namespace :something do |something| + # something.resources :blah + # end + def process_namespace exp + call = exp.block_call + formal_args = exp.block_args + block = exp.block + + @prefix << camelize(call.first_arg.value) + + if formal_args + @nested = Sexp.new(:lvar, formal_args.value) + end + + process block + + @prefix.pop + end + + # map.something_abnormal '/blah', :controller => 'something', :action => 'wohoo' + def process_named_route exp + process_connect exp + end + + #Process collection option + # :collection => { :some_action => :http_actions } + def process_collection exp + return unless exp.node_type == :hash + routes = @tracker.routes[@current_controller] + + hash_iterate(exp) do |action, _type| + routes << action.value + end + end + + private + + #Checks an argument list for a hash that has a key :controller. + #If it does, returns the value. + # + #Otherwise, returns nil. + def check_for_controller_name args + args.each do |a| + if hash? a and value = hash_access(a, :controller) + return value.value if string? value or symbol? value + end + end + + nil + end +end + +#This is for a really specific case where a hash is used as arguments +#to one of the map methods. +class Brakeman::RouteAliasProcessor < Brakeman::AliasProcessor + + #This replaces + # { :some => :hash }.keys + #with + # [:some] + def process_call exp + process_default exp + + if hash? exp.target and exp.method == :keys + keys = get_keys exp.target + exp.clear + keys.each_with_index do |e,i| + exp[i] = e + end + end + exp + end + + #Returns an array Sexp containing the keys from the hash + def get_keys hash + keys = Sexp.new(:array) + hash_iterate(hash) do |key, _value| + keys << key + end + + keys + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails3_config_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails3_config_processor.rb new file mode 100644 index 000000000..102b11b6e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails3_config_processor.rb @@ -0,0 +1,132 @@ + +require 'brakeman/processors/lib/basic_processor' + +#Processes configuration. Results are put in tracker.config. +# +#Configuration of Rails via Rails::Initializer are stored in tracker.config.rails. +#For example: +# +# MyApp::Application.configure do +# config.active_record.whitelist_attributes = true +# end +# +#will be stored in +# +# tracker.config.rails[:active_record][:whitelist_attributes] +# +#Values for tracker.config.rails will still be Sexps. +class Brakeman::Rails3ConfigProcessor < Brakeman::BasicProcessor + RAILS_CONFIG = Sexp.new(:call, nil, :config) + + def initialize *args + super + @inside_config = false + end + + #Use this method to process configuration file + def process_config src, current_file + @current_file = current_file + res = Brakeman::AliasProcessor.new(@tracker).process_safely(src, nil, @current_file) + process res + end + + #Look for MyApp::Application.configure do ... end + def process_iter exp + call = exp.block_call + + if node_type?(call.target, :colon2) and + call.target.rhs == :Application and + call.method == :configure + + @inside_config = true + process exp.block if sexp? exp.block + @inside_config = false + end + + exp + end + + #Look for class Application < Rails::Application + def process_class exp + if exp.class_name == :Application + @inside_config = true + process_all exp.body if sexp? exp.body + @inside_config = false + end + + exp + end + + #Look for configuration settings that + #are just a call like + # + # config.load_defaults 5.2 + def process_call exp + return exp unless @inside_config + + if exp.target == RAILS_CONFIG and exp.first_arg + @tracker.config.rails[exp.method] = exp.first_arg + end + + exp + end + + #Look for configuration settings + def process_attrasgn exp + return exp unless @inside_config + + if exp.target == RAILS_CONFIG + #Get rid of '=' at end + attribute = exp.method.to_s[0..-2].to_sym + if exp.args.length > 1 + #Multiple arguments?...not sure if this will ever happen + @tracker.config.rails[attribute] = exp.args + else + @tracker.config.rails[attribute] = exp.first_arg + end + elsif include_rails_config? exp + options_path = get_rails_config exp + @tracker.config.set_rails_config(value: exp.first_arg, path: options_path, overwrite: true) + end + + exp + end + + #Check if an expression includes a call to set Rails config + def include_rails_config? exp + target = exp.target + if call? target + if target.target == RAILS_CONFIG + true + else + include_rails_config? target + end + elsif target == RAILS_CONFIG + true + else + false + end + end + + #Returns an array of symbols for each 'level' in the config + # + # config.action_controller.session_store = :cookie + # + #becomes + # + # [:action_controller, :session_store] + def get_rails_config exp + if node_type? exp, :attrasgn + attribute = exp.method.to_s[0..-2].to_sym + get_rails_config(exp.target) << attribute + elsif call? exp + if exp.target == RAILS_CONFIG + [exp.method] + else + get_rails_config(exp.target) << exp.method + end + else + raise "WHAT" + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails3_route_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails3_route_processor.rb new file mode 100644 index 000000000..a704bb6db --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails3_route_processor.rb @@ -0,0 +1,308 @@ +require 'brakeman/processors/lib/basic_processor' + +#Processes the Sexp from routes.rb. Stores results in tracker.routes. +# +#Note that it is only interested in determining what methods on which +#controllers are used as routes, not the generated URLs for routes. +class Brakeman::Rails3RoutesProcessor < Brakeman::BasicProcessor + include Brakeman::RouteHelper + + attr_reader :map, :nested, :current_controller + + def initialize tracker + super + @map = Sexp.new(:lvar, :map) + @nested = nil #used for identifying nested targets + @prefix = [] #Controller name prefix (a module name, usually) + @current_controller = nil + @with_options = nil #For use inside map.with_options + @controller_block = false + @current_file = "config/routes.rb" + end + + def process_routes exp + process Brakeman::AliasProcessor.new.process_safely(exp, nil, @current_file) + end + + def process_call exp + case exp.method + when :resources + process_resources exp + when :resource + process_resource exp + when :root + process_root exp + when :member + process_default exp + when :get, :put, :post, :delete + process_verb exp + when :match + process_match exp + else + exp + end + end + + def process_iter exp + case exp.block_call.method + when :namespace + process_namespace exp + when :resource + process_resource_block exp + when :resources + process_resources_block exp + when :scope + process_scope_block exp + when :controller + process_controller_block exp + else + process_default exp + end + end + + def process_namespace exp + arg = exp.block_call.first_arg + return exp unless symbol? arg or string? arg + + name = arg.value + block = exp.block + + @prefix << camelize(name) + + process block + + @prefix.pop + + exp + end + + #TODO: Need test for this + def process_root exp + return exp unless hash? exp.first_arg + + if value = hash_access(exp.first_arg, :to) + if string? value + add_route_from_string value + end + end + + exp + end + + def process_match exp + first_arg = exp.first_arg + second_arg = exp.second_arg + last_arg = exp.last_arg + + if string? first_arg + + matcher = first_arg.value + if matcher == ':controller(/:action(/:id(.:format)))' or + matcher.include? ':controller' and action_route?(matcher) #Default routes + @tracker.routes[:allow_all_actions] = first_arg + return exp + elsif action_route?(first_arg) + if hash? second_arg and controller_name = hash_access(second_arg, :controller) + loose_action(controller_name, "matched") #TODO: Parse verbs + end + elsif second_arg.nil? and in_controller_block? and not matcher.include? ":" + add_route matcher + end + end + + if hash? last_arg + hash_iterate last_arg do |k, v| + if string? k + if string? v + add_route_from_string v + elsif in_controller_block? and symbol? v + add_route v + end + elsif symbol? k + case k.value + when :action + if string? v + add_route_from_string v + else + add_route v + end + + when :to + if string? v + add_route_from_string v[1] + elsif in_controller_block? and symbol? v + add_route v + end + end + end + end + end + + @current_controller = nil unless in_controller_block? + exp + end + + def add_route_from_string value + value = value[1] if string? value + + controller, action = extract_action value + + if action + add_route action, controller + elsif in_controller_block? + add_route value + end + end + + def process_verb exp + first_arg = exp.first_arg + second_arg = exp.second_arg + + if symbol? first_arg and not hash? second_arg + add_route first_arg + elsif hash? second_arg + hash_iterate second_arg do |k, v| + if symbol? k and k.value == :to + if string? v + add_route_from_string v + elsif in_controller_block? and symbol? v + add_route v + end + elsif action_route?(first_arg) + if hash? second_arg and controller_name = hash_access(second_arg, :controller) + loose_action(controller_name, exp.method) + end + end + end + elsif string? first_arg + if first_arg.value.include? ':controller' and action_route?(first_arg) #Default routes + @tracker.routes[:allow_all_actions] = first_arg + end + + route = first_arg.value.split "/" + if route.length != 2 + add_route route[0] + else + add_route route[1], route[0] + end + else hash? first_arg + hash_iterate first_arg do |k, v| + if string? k + if string? v + add_route_from_string v + elsif in_controller_block? + add_route v + end + end + end + end + + @current_controller = nil unless in_controller_block? + exp + end + + def process_resources exp + first_arg = exp.first_arg + second_arg = exp.second_arg + + return exp unless symbol? first_arg or string? first_arg + + if second_arg and second_arg.node_type == :hash + self.current_controller = first_arg.value + #handle hash + add_resources_routes + elsif exp.args.all? { |s| symbol? s } + exp.each_arg do |s| + self.current_controller = s.value + add_resources_routes + end + end + + @current_controller = nil unless in_controller_block? + exp + end + + def process_resource exp + #Does resource even take more than one controller name? + exp.each_arg do |s| + if symbol? s + self.current_controller = pluralize(s.value.to_s) + add_resource_routes + else + #handle something else, like options + #or something? + end + end + + @current_controller = nil unless in_controller_block? + exp + end + + def process_resources_block exp + in_controller_block do + process_resources exp.block_call + process exp.block + end + + @current_controller = nil + exp + end + + def process_resource_block exp + in_controller_block do + process_resource exp.block_call + process exp.block + end + + @current_controller = nil + exp + end + + def process_scope_block exp + #How to deal with options? + process exp.block + exp + end + + def process_controller_block exp + if string? exp or symbol? exp + self.current_controller = exp.block_call.first_arg.value + + in_controller_block do + process exp[-1] if exp[-1] + end + + @current_controller = nil + end + + exp + end + + def extract_action str + str.split "#" + end + + def in_controller_block? + @controller_block + end + + def in_controller_block + prev_block = @controller_block + @controller_block = true + yield + @controller_block = prev_block + end + + def action_route? arg + if string? arg + arg = arg.value + end + + arg.is_a? String and (arg.include? ":action" or arg.include? "*action") + end + + def loose_action controller_name, verb = "any" + self.current_controller = controller_name.value + @tracker.routes[@current_controller] = [:allow_all_actions, {:allow_verb => verb}] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails4_config_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails4_config_processor.rb new file mode 100644 index 000000000..80322bb08 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/rails4_config_processor.rb @@ -0,0 +1,19 @@ +require 'brakeman/processors/lib/rails3_config_processor' + +class Brakeman::Rails4ConfigProcessor < Brakeman::Rails3ConfigProcessor + APPLICATION_CONFIG = s(:call, s(:call, s(:const, :Rails), :application), :configure) + ALT_APPLICATION_CONFIG = s(:call, s(:call, s(:colon3, :Rails), :application), :configure) + + # Look for Rails.application.configure do ... end + def process_iter exp + if exp.block_call == APPLICATION_CONFIG or exp.block_call == ALT_APPLICATION_CONFIG + @inside_config = true + process exp.block if sexp? exp.block + @inside_config = false + else + super + end + + exp + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/render_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/render_helper.rb new file mode 100644 index 000000000..c57fe395b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/render_helper.rb @@ -0,0 +1,225 @@ +require 'digest/sha1' + +#Processes a call to render() in a controller or template +module Brakeman::RenderHelper + + #Process s(:render, TYPE, OPTION?, OPTIONS) + def process_render exp + process_default exp + @rendered = true + case exp.render_type + when :action, :template, :inline + action = exp[2] + args = exp[3] + + if string? action or symbol? action + process_action action.value, args, exp.line + else + process_model_action action, args + end + when :default + begin + process_template template_name, exp[3], nil, exp.line + rescue ArgumentError + Brakeman.debug "Problem processing render: #{exp}" + end + when :partial, :layout + process_partial exp[2], exp[3], exp.line + when :nothing + end + exp + end + + #Processes layout + def process_layout name = nil + if name.nil? and defined? layout_name + name = layout_name + end + + return unless name + + process_template name, nil, nil, nil + end + + #Determines file name for partial and then processes it + def process_partial name, args, line + if !(string? name or symbol? name) or name.value == "" + return + end + + names = name.value.to_s.split("/") + names[-1] = "_" + names[-1] + process_template template_name(names.join("/")), args, nil, line + end + + #Processes a given action + def process_action name, args, line + if name.is_a? String or name.is_a? Symbol + process_template template_name(name), args, nil, line + else + Brakeman.debug "Not processing render #{name.inspect}" + end + end + + SINGLE_RECORD = [:first, :find, :last, :new] + COLLECTION = [:all, :where] + + def process_model_action action, args + return unless call? action + + method = action.method + + klass = get_class_target(action) || Brakeman::Tracker::UNKNOWN_MODEL + name = Sexp.new(:lit, klass.downcase) + + if SINGLE_RECORD.include? method + # Set a local variable with name based on class of model + # and value of the value passed to render + local_key = Sexp.new(:lit, :locals) + locals = hash_access(args, local_key) || Sexp.new(:hash) + hash_insert(locals, name, action) + hash_insert(args, local_key, locals) + + process_partial name, args, action.line + elsif COLLECTION.include? method + collection_key = Sexp.new(:lit, :collection) + hash_insert(args, collection_key, action) + + process_partial name, args, action.line + end + end + + #Processes a template, adding any instance variables + #to its environment. + def process_template name, args, called_from = nil, *_ + + Brakeman.debug "Rendering #{name} (#{called_from})" + #Get scanned source for this template + name = name.to_s.gsub(/^\//, "") + template = @tracker.templates[name.to_sym] + unless template + Brakeman.debug "[Notice] No such template: #{name}" + return + end + + if called_from + # Track actual template that was rendered + called_from.last_template = template + end + + template_env = only_ivars(:include_request_vars) + + #Hash the environment and the source of the template to avoid + #pointlessly processing templates, which can become prohibitively + #expensive in terms of time and memory. + digest = Digest::SHA1.new.update(template_env.instance_variable_get(:@env).to_a.sort.to_s << name).to_s.to_sym + + if @tracker.template_cache.include? digest + #Already processed this template with identical environment + return + else + @tracker.template_cache << digest + + options = get_options args + + #Process layout + if string? options[:layout] + process_template "layouts/#{options[:layout][1]}", nil, nil, nil + elsif node_type? options[:layout], :false + #nothing + elsif not template.name.to_s.match(/[^\/_][^\/]+$/) + #Don't do this for partials + + process_layout + end + + if hash? options[:locals] + hash_iterate options[:locals] do |key, value| + if symbol? key + template_env[Sexp.new(:call, nil, key.value)] = value + end + end + end + + if options[:collection] + + #The collection name is the name of the partial without the leading + #underscore. + variable = template.name.to_s.match(/[^\/_][^\/]+$/)[0].to_sym + + #Unless the :as => :variable_name option is used + if options[:as] + if string? options[:as] or symbol? options[:as] + variable = options[:as].value.to_sym + end + end + + collection = get_class_target(options[:collection]) || Brakeman::Tracker::UNKNOWN_MODEL + + template_env[Sexp.new(:call, nil, variable)] = Sexp.new(:call, Sexp.new(:const, collection), :new) + end + + #Set original_line for values so it is clear + #that values came from another file + template_env.all.each do |_var, value| + unless value.original_line + #TODO: This has been broken for a while now and no one noticed + #so maybe we can skip it + value.original_line = value.line + end + end + + #Run source through AliasProcessor with instance variables from the + #current environment. + #TODO: Add in :locals => { ... } to environment + src = Brakeman::TemplateAliasProcessor.new(@tracker, template, called_from).process_safely(template.src, template_env) + + digest = Digest::SHA1.new.update(name + src.to_s).to_s.to_sym + + if @tracker.template_cache.include? digest + return + else + @tracker.template_cache << digest + end + + #Run alias-processed src through the template processor to pull out + #information and outputs. + #This information will be stored in tracker.templates, but with a name + #specifying this particular route. The original source should remain + #pristine (so it can be processed within other environments). + @tracker.processor.process_template name, src, template.type, called_from, template.file + end + end + + #Override to process name, such as adding the controller name. + def template_name name + raise "RenderHelper#template_name should be overridden." + end + + #Turn options Sexp into hash + def get_options args + options = {} + return options unless hash? args + + hash_iterate args do |key, value| + if symbol? key + options[key.value] = value + end + end + + options + end + + def get_class_target sexp + if call? sexp + get_class_target sexp.target + else + klass = class_name sexp + if klass.is_a? Symbol + klass + else + nil + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/render_path.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/render_path.rb new file mode 100644 index 000000000..751e1f0ce --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/render_path.rb @@ -0,0 +1,139 @@ +module Brakeman + class RenderPath + attr_reader :path + + def initialize + @path = [] + end + + def add_controller_render controller_name, method_name, line, file + method_name ||= "" + + @path << { :type => :controller, + :class => controller_name.to_sym, + :method => method_name.to_sym, + :line => line, + :file => file + } + + self + end + + def add_template_render template_name, line, file + @path << { :type => :template, + :name => template_name.to_sym, + :line => line, + :file => file + } + + self + end + + def last_template= template + if @path.last + @path.last[:rendered] = { + name: template.name, + file: template.file, + } + else + Brakeman.debug "[Notice] No render path to add template information" + end + end + + def include_template? name + name = name.to_sym + + @path.any? do |loc| + loc[:type] == :template and loc[:name] == name + end + end + + def include_controller? klass + klass = klass.to_sym + + @path.any? do |loc| + loc[:type] == :controller and loc[:class] == klass + end + end + + def include_any_method? method_names + names = method_names.map(&:to_sym) + + @path.any? do |loc| + loc[:type] == :controller and names.include? loc[:method] + end + end + + def rendered_from_controller? + @path.any? do |loc| + loc[:type] == :controller + end + end + + def each &block + @path.each(&block) + end + + def join *args + self.to_a.join(*args) + end + + def length + @path.length + end + + def map &block + @path.map(&block) + end + + def to_a + @path.map do |loc| + case loc[:type] + when :template + "Template:#{loc[:name]}" + when :controller + "#{loc[:class]}##{loc[:method]}" + end + end + end + + def last + self.to_a.last + end + + def to_s + self.to_a.to_s + end + + def to_sym + self.to_s.to_sym + end + + def to_json *args + require 'json' + JSON.generate(@path) + end + + def with_relative_paths + @path.map do |loc| + r = loc.dup + + if r[:file] + r[:file] = r[:file].relative + end + + if r[:rendered] and r[:rendered][:file] + r[:rendered] = r[:rendered].dup + r[:rendered][:file] = r[:rendered][:file].relative + end + + r + end + end + + def initialize_copy original + @path = original.path.dup + self + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/route_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/route_helper.rb new file mode 100644 index 000000000..bffa626fb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/route_helper.rb @@ -0,0 +1,68 @@ +module Brakeman::RouteHelper + #Manage Controller prefixes + #@prefix is an Array, but this method returns a string + #suitable for prefixing onto a controller name. + def prefix + if @prefix.length > 0 + @prefix.join("::") << "::" + else + '' + end + end + + #Sets the controller name to a proper class name. + #For example + # self.current_controller = :session + # @controller == :SessionController #true + # + #Also prepends the prefix if there is one set. + def current_controller= name + @current_controller = (prefix + camelize(name) + "Controller").to_sym + @tracker.routes[@current_controller] ||= Set.new + end + + #Add route to controller. If a controller is specified, + #the current controller will be set to that controller. + #If no controller is specified, uses current controller value. + def add_route route, controller = nil + if node_type? route, :str, :lit + route = route.value + end + + return unless route.is_a? String or route.is_a? Symbol + + if route.is_a? String and controller.nil? and route.include? ":controller" + controller = ":controller" + end + + route = route.to_sym + + if controller + self.current_controller = controller + end + + routes = @tracker.routes[@current_controller] + + if routes and not routes.include? :allow_all_actions + routes << route + end + end + + #Add default routes + def add_resources_routes + existing_routes = @tracker.routes[@current_controller] + + unless existing_routes.is_a? Array and existing_routes.first == :allow_all_actions + existing_routes.merge [:index, :new, :create, :show, :edit, :update, :destroy] + end + end + + #Add default routes minus :index + def add_resource_routes + existing_routes = @tracker.routes[@current_controller] + + unless existing_routes.is_a? Array and existing_routes.first == :allow_all_actions + existing_routes.merge [:new, :create, :show, :edit, :update, :destroy] + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/safe_call_helper.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/safe_call_helper.rb new file mode 100644 index 000000000..3d494d8f2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/lib/safe_call_helper.rb @@ -0,0 +1,16 @@ +module Brakeman + module SafeCallHelper + [[:process_safe_call, :process_call], + [:process_safe_attrasgn, :process_attrasgn], + [:process_safe_op_asgn, :process_op_asgn], + [:process_safe_op_asgn2, :process_op_asgn2]].each do |call, replacement| + define_method(call) do |exp| + if self.respond_to? replacement + self.send(replacement, exp) + else + process_default exp + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/library_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/library_processor.rb new file mode 100644 index 000000000..b569eb058 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/library_processor.rb @@ -0,0 +1,89 @@ +require 'brakeman/processors/base_processor' +require 'brakeman/processors/alias_processor' +require 'brakeman/processors/lib/module_helper' +require 'brakeman/tracker/library' + +#Process generic library and stores it in Tracker.libs +class Brakeman::LibraryProcessor < Brakeman::BaseProcessor + include Brakeman::ModuleHelper + + def initialize tracker + super + @current_file = nil + @alias_processor = Brakeman::AliasProcessor.new tracker + @current_module = nil + @current_class = nil + @initializer_env = nil + end + + def process_library src, current_file = @current_file + @current_file = current_file + process src + end + + def process_class exp + handle_class exp, @tracker.libs, Brakeman::Library + end + + def process_module exp + handle_module exp, Brakeman::Library + end + + def process_defn exp + # TODO: Why is this different from ModuleHelper? + + if @inside_sclass + exp = make_defs(exp) + end + + if exp.method_name == :initialize + @alias_processor.process_safely exp.body_list + @initializer_env = @alias_processor.only_ivars + elsif node_type? exp, :defn + exp = @alias_processor.process_safely exp, @initializer_env + else + exp = @alias_processor.process exp + end + + if @current_class + exp.body = process_all! exp.body + @current_class.add_method :public, exp.method_name, exp, @current_file + elsif @current_module + exp.body = process_all! exp.body + @current_module.add_method :public, exp.method_name, exp, @current_file + end + + exp + end + + alias process_defs process_defn + + def process_call exp + if process_call_defn? exp + exp + elsif @current_method.nil? and exp.target.nil? and (@current_class or @current_module) + # Methods called inside class / module + case exp.method + when :include + module_name = class_name(exp.first_arg) + (@current_class || @current_module).add_include module_name + end + + exp + else + process_default exp + end + end + + def process_iter exp + res = process_default exp + + if node_type? res, :iter and call? exp.block_call # sometimes this changes after processing + if exp.block_call.method == :included and (@current_module or @current_class) + (@current_module || @current_class).options[:included] = res.block + end + end + + res + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/model_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/model_processor.rb new file mode 100644 index 000000000..aee151dbb --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/model_processor.rb @@ -0,0 +1,122 @@ +require 'brakeman/processors/base_processor' +require 'brakeman/processors/lib/module_helper' +require 'brakeman/tracker/model' + +#Processes models. Puts results in tracker.models +class Brakeman::ModelProcessor < Brakeman::BaseProcessor + include Brakeman::ModuleHelper + + def initialize tracker + super + @current_class = nil + @current_method = nil + @current_module = nil + @visibility = :public + @current_file = nil + end + + #Process model source + def process_model src, current_file = @current_file + @current_file = current_file + process src + end + + #s(:class, NAME, PARENT, BODY) + def process_class exp + name = class_name(exp.class_name) + + #If inside an inner class we treat it as a library. + if @current_class + Brakeman.debug "[Notice] Treating inner class as library: #{name}" + Brakeman::LibraryProcessor.new(@tracker).process_library exp, @current_file + return exp + end + + handle_class exp, @tracker.models, Brakeman::Model + end + + def process_module exp + handle_module exp, Brakeman::Model + end + + #Handle calls outside of methods, + #such as include, attr_accessible, private, etc. + def process_call exp + return exp unless @current_class + return exp if process_call_defn? exp + + target = exp.target + if sexp? target + target = process target + end + + method = exp.method + first_arg = exp.first_arg + + #Methods called inside class definition + #like attr_* and other settings + if @current_method.nil? and target.nil? + if first_arg.nil? + case method + when :private, :protected, :public + @visibility = method + when :attr_accessible + @current_class.set_attr_accessible + else + #?? + end + else + case method + when :include + @current_class.add_include class_name(first_arg) if @current_class + when :attr_accessible + @current_class.set_attr_accessible exp + when :attr_protected + @current_class.set_attr_protected exp + when :enum + add_enum_method exp + else + if @current_class + @current_class.add_option method, exp + end + end + end + + exp + else + call = make_call target, method, process_all!(exp.args) + call.line(exp.line) + call + end + end + + def add_enum_method call + arg = call.first_arg + return unless hash? arg + return unless symbol? arg[1] + + enum_name = arg[1].value # first key + enums = arg[2] # first value + enums_name = pluralize(enum_name.to_s).to_sym + + call_line = call.line + + if hash? enums + enum_values = enums + elsif array? enums + # Build hash for enum values like Rails does + enum_values = s(:hash).line(call_line) + + enums.each_sexp.with_index do |v, index| + enum_values << v + enum_values << s(:lit, index).line(call_line) + end + end + + enum_method = s(:defn, enum_name, s(:args), safe_literal(call_line)) + enums_method = s(:defs, s(:self), enums_name, s(:args), enum_values) + + @current_class.add_method :public, enum_name, enum_method, @current_file + @current_class.add_method :public, enums_name, enums_method, @current_file + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/output_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/output_processor.rb new file mode 100644 index 000000000..99dfa863a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/output_processor.rb @@ -0,0 +1,149 @@ +Brakeman.load_brakeman_dependency 'ruby2ruby' +require 'brakeman/util' + +#Produces formatted output strings from Sexps. +#Recommended usage is +# +# OutputProcessor.new.format(Sexp.new(:str, "hello")) +class Brakeman::OutputProcessor < Ruby2Ruby + include Brakeman::Util + + def initialize *args + super + @user_input = nil + end + + #Copies +exp+ and then formats it. + def format exp, user_input = nil, &block + @user_input = user_input + @user_input_block = block + process(exp.deep_clone) || "[Format Error]" + end + + alias process_safely format + + def process exp + begin + if @user_input and @user_input == exp + @user_input_block.call(exp, super(exp)) + else + super exp if sexp? exp and not exp.empty? + end + rescue => e + Brakeman.debug "While formatting #{exp}: #{e}\n#{e.backtrace.join("\n")}" + end + end + + def process_ignore exp + "[ignored]" + end + + def process_params exp + "params" + end + + def process_session exp + "session" + end + + def process_cookies exp + "cookies" + end + + def process_rlist exp + out = exp.map do |e| + res = process e + if res == "" + nil + else + res + end + end.compact.join("\n") + + out + end + + def process_defn exp + # Copied from Ruby2Ruby except without the whole + # "convert methods to attr_*" stuff + exp = exp.deep_clone + exp.shift + name = exp.shift + args = process exp.shift + args = "" if args == "()" + + exp.shift if exp == s(s(:nil)) # empty it out of a default nil expression + + body = [] + until exp.empty? do + body << indent(process(exp.shift)) + end + + body << indent("# do nothing") if body.empty? + + body = body.join("\n") + + return "def #{name}#{args}\n#{body}\nend".gsub(/\n\s*\n+/, "\n") + end + + def process_iter exp + call = process exp[1] + block = process_rlist exp.sexp_body(3) + out = "#{call} do\n #{block}\n end" + + out + end + + def process_output exp + output_format exp, "Output" + end + + def process_escaped_output exp + output_format exp, "Escaped Output" + end + + + def process_format exp + output_format exp, "Format" + end + + def process_format_escaped exp + output_format exp, "Escaped" + end + + def output_format exp, tag + out = if exp[1].node_type == :str or exp[1].node_type == :ignore + "" + else + res = process exp[1] + + if res == "" + "" + else + "[#{tag}] #{res}" + end + end + + out + end + + def process_const exp + if exp[1] == Brakeman::Tracker::UNKNOWN_MODEL + "(Unresolved Model)" + else + out = exp[1].to_s + out + end + end + + def process_render exp + exp = exp.deep_clone + exp.shift + + exp[1] = process exp[1] if sexp? exp[1] + exp[2] = process exp[2] if sexp? exp[2] + out = "render(#{exp[0]} => #{exp[1]}, #{exp[2]})" + + out + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/route_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/route_processor.rb new file mode 100644 index 000000000..e6994c8b3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/route_processor.rb @@ -0,0 +1,17 @@ +require 'brakeman/processors/base_processor' +require 'brakeman/processors/alias_processor' +require 'brakeman/processors/lib/route_helper' +require 'brakeman/util' +require 'brakeman/processors/lib/rails3_route_processor.rb' +require 'brakeman/processors/lib/rails2_route_processor.rb' +require 'set' + +class Brakeman::RoutesProcessor + def self.new tracker + if tracker.options[:rails3] + Brakeman::Rails3RoutesProcessor.new tracker + else + Brakeman::Rails2RoutesProcessor.new tracker + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/slim_template_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/slim_template_processor.rb new file mode 100644 index 000000000..52499a810 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/slim_template_processor.rb @@ -0,0 +1,127 @@ +require 'brakeman/processors/template_processor' +require 'brakeman/processors/lib/render_helper' + +class Brakeman::SlimTemplateProcessor < Brakeman::TemplateProcessor + include Brakeman::RenderHelper + + SAFE_BUFFER = s(:call, s(:colon2, s(:const, :ActiveSupport), :SafeBuffer), :new) + OUTPUT_BUFFER = s(:ivar, :@output_buffer) + TEMPLE_UTILS = s(:colon2, s(:colon3, :Temple), :Utils) + ATTR_MERGE = s(:call, s(:call, s(:array), :reject, s(:block_pass, s(:lit, :empty?))), :join, s(:str, " ")) + EMBEDDED_FILTER = s(:const, :BrakemanFilter) + + def process_call exp + target = exp.target + method = exp.method + + if method == :safe_concat and (target == SAFE_BUFFER or target == OUTPUT_BUFFER) + arg = normalize_output(exp.first_arg) + + if is_escaped? arg + add_escaped_output arg.first_arg + elsif string? arg + ignore + elsif render? arg + add_output make_render_in_view arg + elsif string_interp? arg + process_inside_interp arg + elsif node_type? arg, :ignore + ignore + elsif internal_variable? arg + ignore + elsif arg == ATTR_MERGE + ignore + else + add_output arg + end + elsif is_escaped? exp + add_escaped_output arg + elsif target == nil and method == :render + exp.arglist = process exp.arglist + make_render_in_view exp + else + exp.arglist = process exp.arglist + exp + end + end + + def normalize_output arg + arg = super(arg) + + if embedded_filter? arg + super(arg.first_arg) + else + arg + end + end + + # Handle our "fake" embedded filters + def embedded_filter? arg + call? arg and arg.method == :render and arg.target == EMBEDDED_FILTER + end + + #Slim likes to interpolate output into strings then pass them to safe_concat. + #Better to pull those values out directly. + def process_inside_interp exp + exp.map! do |e| + if node_type? e, :evstr + e.value = process_interp_output e.value + e + else + e + end + end + + exp + end + + def process_interp_output exp + if sexp? exp + if node_type? exp, :if + process_interp_output exp.then_clause + process_interp_output exp.else_clause + elsif exp == SAFE_BUFFER + ignore + elsif render? exp + add_output make_render_in_view exp + elsif node_type? :output, :escaped_output + exp + elsif is_escaped? exp + add_escaped_output exp + else + add_output exp + end + end + end + + def add_escaped_output exp + exp = normalize_output(exp) + + return exp if string? exp or internal_variable? exp + + super exp + end + + def is_escaped? exp + call? exp and + exp.target == TEMPLE_UTILS and + (exp.method == :escape_html or exp.method == :escape_html_safe) + end + + def internal_variable? exp + node_type? exp, :lvar and + exp.value =~ /^_(temple_|slim_)/ + end + + def render? exp + call? exp and + exp.target.nil? and + exp.method == :render + end + + def process_render exp + #Still confused as to why this is not needed in other template processors + #but is needed here + exp + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/template_alias_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/template_alias_processor.rb new file mode 100644 index 000000000..cb655683e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/template_alias_processor.rb @@ -0,0 +1,150 @@ +require 'set' +require 'brakeman/processors/alias_processor' +require 'brakeman/processors/lib/render_helper' +require 'brakeman/processors/lib/render_path' +require 'brakeman/tracker' + +#Processes aliasing in templates. +#Handles calls to +render+. +class Brakeman::TemplateAliasProcessor < Brakeman::AliasProcessor + include Brakeman::RenderHelper + + FORM_METHODS = Set[:form_for, :remote_form_for, :form_remote_for] + + def initialize tracker, template, called_from = nil + super tracker + @template = template + @current_file = template.file + @called_from = called_from + end + + #Process template + def process_template name, args, _, line = nil + # Strip forward slash from beginning of template path. + # This also happens in RenderHelper#process_template but + # we need it here too to accurately avoid circular renders below. + name = name.to_s.gsub(/^\//, "") + + if @called_from + if @called_from.include_template? name + Brakeman.debug "Skipping circular render from #{@template.name} to #{name}" + return + end + + super name, args, @called_from.dup.add_template_render(@template.name, line, @current_file), line + else + super name, args, Brakeman::RenderPath.new.add_template_render(@template.name, line, @current_file), line + end + end + + def process_lasgn exp + if exp.lhs == :haml_temp or haml_capture? exp.rhs + exp.rhs = process exp.rhs + + # Avoid propagating contents of block + if node_type? exp.rhs, :iter + new_exp = exp.dup + new_exp.rhs = exp.rhs.block_call + + super new_exp + + exp # Still save the original, though + else + super exp + end + else + super exp + end + end + + HAML_CAPTURE = [:capture, :capture_haml] + + def haml_capture? exp + node_type? exp, :iter and + call? exp.block_call and + HAML_CAPTURE.include? exp.block_call.method + end + + #Determine template name + def template_name name + if !name.to_s.include?('/') && @template.name.to_s.include?('/') + name = "#{@template.name.to_s.match(/^(.*\/).*$/)[1]}#{name}" + end + name + end + + UNKNOWN_MODEL_CALL = Sexp.new(:call, Sexp.new(:const, Brakeman::Tracker::UNKNOWN_MODEL), :new) + FORM_BUILDER_CALL = Sexp.new(:call, Sexp.new(:const, :FormBuilder), :new) + + #Looks for form methods and iterating over collections of Models + def process_iter exp + process_default exp + + call = exp.block_call + + if call? call + target = call.target + method = call.method + arg = exp.block_args.first_param + block = exp.block + + #Check for e.g. Model.find.each do ... end + if method == :each and arg and block and model = get_model_target(target) + if arg.is_a? Symbol + if model == target.target + env[Sexp.new(:lvar, arg)] = Sexp.new(:call, model, :new) + else + env[Sexp.new(:lvar, arg)] = UNKNOWN_MODEL_CALL + end + + process block if sexp? block + end + elsif FORM_METHODS.include? method + if arg.is_a? Symbol + env[Sexp.new(:lvar, arg)] = FORM_BUILDER_CALL + + process block if sexp? block + end + end + end + + exp + end + + COLLECTION_METHODS = [:all, :find, :select, :where] + + #Checks if +exp+ is a call to Model.all or Model.find* + def get_model_target exp + if call? exp + target = exp.target + + if COLLECTION_METHODS.include? exp.method or exp.method.to_s[0,4] == "find" + models = Set.new @tracker.models.keys + name = class_name target + return target if models.include?(name) + end + + return get_model_target(target) + end + + false + end + + #Ignore `<<` calls on template variables which are used by the templating + #library (HAML, ERB, etc.) + def find_push_target exp + if sexp? exp + if exp.node_type == :lvar and (exp.value == :_buf or exp.value == :_erbout) + return nil + elsif exp.node_type == :ivar and exp.value == :@output_buffer + return nil + elsif exp.node_type == :call and call? exp.target and + exp.target.method == :_hamlout and exp.method == :buffer + + return nil + end + end + + super + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/template_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/template_processor.rb new file mode 100644 index 000000000..a474baba3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/processors/template_processor.rb @@ -0,0 +1,89 @@ +require 'brakeman/processors/base_processor' +require 'brakeman/tracker/template' + +#Base Processor for templates/views +class Brakeman::TemplateProcessor < Brakeman::BaseProcessor + + #Initializes template information. + def initialize tracker, template_name, called_from = nil, current_file = nil + super(tracker) + @current_template = Brakeman::Template.new template_name, called_from, current_file, tracker + @current_file = @current_template.file + + if called_from + template_name = (template_name.to_s + "." + called_from.to_s).to_sym + end + + tracker.templates[template_name] = @current_template + + @inside_concat = false + end + + #Process the template Sexp. + def process exp + begin + super + rescue => e + except = e.exception("Error when processing #{@current_template.name}: #{e.message}") + except.set_backtrace(e.backtrace) + raise except + end + end + + #Ignore initial variable assignment + def process_lasgn exp + if exp.lhs == :_erbout and exp.rhs.node_type == :str #ignore + ignore + elsif exp.lhs == :_buf and exp.rhs.node_type == :str + ignore + else + exp.rhs = process exp.rhs + exp + end + end + + #Adds output to the list of outputs. + def process_output exp + exp.value = process exp.value + @current_template.add_output exp unless exp.original_line + exp + end + + def process_escaped_output exp + process_output exp + end + + # Pull out actual output value from template + def normalize_output arg + if call? arg and [:to_s, :html_safe!, :freeze].include? arg.method + normalize_output(arg.target) # sometimes it's foo.to_s.to_s + elsif node_type? arg, :if + branches = [arg.then_clause, arg.else_clause].compact + + if branches.empty? + s(:nil).line(arg.line) + elsif branches.length == 2 + Sexp.new(:or, *branches).line(arg.line) + else + branches.first + end + else + arg + end + end + + def add_escaped_output output + add_output output, :escaped_output + end + + def add_output output, type = :output + if node_type? output, :or + Sexp.new(:or, add_output(output.lhs, type), add_output(output.rhs, type)).line(output.line) + else + s = Sexp.new(type, output) + s.line(output.line) + @current_template.add_output s + s + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report.rb new file mode 100644 index 000000000..8104f2ba6 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report.rb @@ -0,0 +1,109 @@ +require 'brakeman/report/report_base' + +#Generates a report based on the Tracker and the results of +#Tracker#run_checks. Be sure to +run_checks+ before generating +#a report. +class Brakeman::Report + attr_reader :tracker + + VALID_FORMATS = [:to_html, :to_pdf, :to_csv, :to_json, :to_tabs, :to_hash, :to_s, :to_markdown, :to_codeclimate, :to_plain, :to_text, :to_junit, :to_github] + + def initialize tracker + @app_tree = tracker.app_tree + @tracker = tracker + end + + def format format + reporter = case format + when :to_codeclimate + require_report 'codeclimate' + Brakeman::Report::CodeClimate + when :to_csv + require_report 'csv' + Brakeman::Report::CSV + when :to_html + require_report 'html' + Brakeman::Report::HTML + when :to_json + return self.to_json + when :to_tabs + require_report 'tabs' + Brakeman::Report::Tabs + when :to_hash + require_report 'hash' + Brakeman::Report::Hash + when :to_markdown + return self.to_markdown + when :to_plain, :to_text, :to_s + return self.to_plain + when :to_table + return self.to_table + when :to_pdf + raise "PDF output is not yet supported." + when :to_junit + require_report 'junit' + Brakeman::Report::JUnit + when :to_sarif + return self.to_sarif + when :to_sonar + require_report 'sonar' + Brakeman::Report::Sonar + when :to_github + require_report 'github' + Brakeman::Report::Github + else + raise "Invalid format: #{format}. Should be one of #{VALID_FORMATS.inspect}" + end + + generate(reporter) + end + + def method_missing method, *args + if VALID_FORMATS.include? method + format method + else + super + end + end + + def require_report type + require "brakeman/report/report_#{type}" + end + + def to_json + require_report 'json' + generate Brakeman::Report::JSON + end + + def to_sonar + require_report 'sonar' + generate Brakeman::Report::Sonar + end + + def to_table + require_report 'table' + generate Brakeman::Report::Table + end + + def to_markdown + require_report 'markdown' + generate Brakeman::Report::Markdown + end + + def to_text + require_report 'text' + generate Brakeman::Report::Text + end + + alias to_plain to_text + alias to_s to_text + + def to_sarif + require_report 'sarif' + generate Brakeman::Report::SARIF + end + + def generate reporter + reporter.new(@tracker).generate_report + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/config/remediation.yml b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/config/remediation.yml new file mode 100644 index 000000000..d6330ad4b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/config/remediation.yml @@ -0,0 +1,71 @@ +--- +basic_auth_password: 300000 +cross_site_scripting: 300000 +xss_content_tag: 300000 +CVE_2014_3514_call: 600000 +all_default_routes: 2000000 +unsafe_deserialize: 2000000 +local_request_config: 100000 +CVE_2012_3424: 4000000 +CVE_2011_2932: 8000000 +code_eval: 2000000 +command_injection: 2000000 +file_access: 2000000 +CVE_2014_7829: 4000000 +CVE_2011_2929: 4000000 +csrf_protection_disabled: 4000000 +CVE_2013_6414: 4000000 +CVE_2013_4491: 4000000 +CVE_2013_1856: 4000000 +CVE_2015_3226: 4000000 +CVE_2013_0333: 4000000 +xss_link_to: 300000 +xss_link_to_href: 300000 +CVE_2011_0446: 300000 +mass_assign_call: 2000000 +dangerous_attr_accessible: 2000000 +no_attr_accessible: 2000000 +CVE_2013_0277: 2000000 +CVE_2010_3933: 4000000 +CVE_2014_0081: 300000 +CVE_2011_2930: 600000 +open_redirect: 300000 +regex_dos: 600000 +dynamic_render_path: 4000000 +CVE_2014_0082: 4000000 +cross_site_scripting_inline: 600000 +CVE_2011_3186: 2000000 +safe_buffer_vuln: 4000000 +CVE_2013_1855: 4000000 +CVE_2013_1857: 4000000 +CVE_2012_3463: 600000 +select_options_vuln: 4000000 +dangerous_send: 600000 +session_key_manipulation: 600000 +http_cookies: 600000 +session_secret: 600000 +secure_cookies: 600000 +CVE_2013_6416: 600000 +CVE_2012_3464: 4000000 +csrf_blacklist: 300000 +auth_blacklist: 300000 +sql_injection: 1200000 +CVE-2012-2660: 4000000 +CVE-2012-2661: 4000000 +CVE-2012-2695: 4000000 +CVE-2012-5664: 4000000 +CVE-2013-0155: 4000000 +CVE-2013-6417: 4000000 +CVE-2014-3482: 4000000 +CVE-2014-3483: 4000000 +ssl_verification_bypass: 2500000 +CVE_2011_2931: 4000000 +unsafe_symbol_creation: 300000 +translate_vuln: 300000 +unsafe_constantize: 600000 +unscoped_find: 300000 +validation_regex: 300000 +mass_assign_without_protection: 600000 +CVE_2015_3227: 4000000 +CVE_2013_0156: 4000000 +weak_hash_digest: 800000 diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/ignore/config.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/ignore/config.rb new file mode 100644 index 000000000..b23392685 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/ignore/config.rb @@ -0,0 +1,159 @@ +require 'set' +require 'json' + +module Brakeman + class IgnoreConfig + attr_reader :shown_warnings, :ignored_warnings + attr_accessor :file + + def initialize file, new_warnings + @file = file + @new_warnings = new_warnings + @already_ignored = [] + @ignored_fingerprints = Set.new + @used_fingerprints = Set.new + @notes = {} + @shown_warnings = @ignored_warnings = nil + @changed = false + end + + # Populate ignored_warnings and shown_warnings based on ignore + # configuration + def filter_ignored + @shown_warnings = [] + @ignored_warnings = [] + @used_fingerprints = Set.new + + @new_warnings.each do |w| + if ignored? w + @ignored_warnings << w + else + @shown_warnings << w + end + end + + @shown_warnings + end + + # Remove warning from ignored list + def unignore warning + @ignored_fingerprints.delete warning.fingerprint + if @already_ignored.reject! { |w|w[:fingerprint] == warning.fingerprint } + @changed = true + end + end + + # Determine if warning should be ignored + def ignored? warning + @used_fingerprints << warning.fingerprint + @ignored_fingerprints.include? warning.fingerprint + end + + def ignore warning + @changed = true unless ignored? warning + @ignored_fingerprints << warning.fingerprint + end + + # Add note for warning + def add_note warning, note + @changed = true + @notes[warning.fingerprint] = note + end + + # Retrieve note for warning if it exists. Returns nil if no + # note is found + def note_for warning + if warning.is_a? Warning + fingerprint = warning.fingerprint + else + fingerprint = warning[:fingerprint] + end + + @already_ignored.each do |w| + if fingerprint == w[:fingerprint] + return w[:note] + end + end + + nil + end + + # The set of unused ignore entries + def obsolete_fingerprints + (@ignored_fingerprints - @used_fingerprints).to_a + end + + def prune_obsolete + obsolete = obsolete_fingerprints.to_set + @ignored_fingerprints -= obsolete + + @already_ignored.reject! do |w| + if obsolete.include? w[:fingerprint] + @changed = true + end + end + end + + def already_ignored_entries_with_empty_notes + @already_ignored.select { |i| i if i[:note].strip.empty? } + end + + # Read configuration to file + def read_from_file file = @file + if File.exist? file + begin + @already_ignored = JSON.parse(File.read(file), :symbolize_names => true)[:ignored_warnings] + rescue => e + raise e, "\nError[#{e.class}] while reading brakeman ignore file: #{file}\n" + end + else + Brakeman.notify "[Notice] Could not find ignore configuration in #{file}" + @already_ignored = [] + end + + @already_ignored.each do |w| + @ignored_fingerprints << w[:fingerprint] + @notes[w[:fingerprint]] = w[:note] + end + end + + # Save configuration to file + def save_to_file warnings, file = @file + warnings = warnings.map do |w| + if w.is_a? Warning + w = w.to_hash(absolute_paths: false) + end + + w[:note] = @notes[w[:fingerprint]] || "" + w + end.sort_by { |w| [w[:fingerprint], w[:line] || 0] } + + output = { + :ignored_warnings => warnings, + :brakeman_version => Brakeman::Version + } + + File.open file, "w" do |f| + f.puts JSON.pretty_generate(output) + end + end + + # Save old ignored warnings and newly ignored ones + def save_with_old + warnings = @ignored_warnings.dup + + # Only add ignored warnings not already ignored + @already_ignored.each do |w| + fingerprint = w[:fingerprint] + + unless @ignored_warnings.find { |ignored_warning| ignored_warning.fingerprint == fingerprint } + warnings << w + end + end + + if @changed + save_to_file warnings + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/ignore/interactive.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/ignore/interactive.rb new file mode 100644 index 000000000..ffede1178 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/ignore/interactive.rb @@ -0,0 +1,362 @@ +Brakeman.load_brakeman_dependency 'highline' + +module Brakeman + class InteractiveIgnorer + def initialize file, warnings + @ignore_config = Brakeman::IgnoreConfig.new(file, warnings) + @new_warnings = warnings + @skip_ignored = false + @skip_rest = false + @ignore_rest = false + @quit = false + @restart = false + end + + def start + file_menu + initial_menu + + @ignore_config.filter_ignored + + unless @quit + penultimate_menu + final_menu + end + + if @restart + @restart = false + start + end + + @ignore_config + end + + private + + def file_menu + loop do + @ignore_config.file = HighLine.new.ask "Input file: " do |q| + if @ignore_config.file and not @ignore_config.file.empty? + q.default = @ignore_config.file + else + q.default = "config/brakeman.ignore" + end + end + + if File.exist? @ignore_config.file + @ignore_config.read_from_file + return + else + if yes_or_no "No such file. Continue with empty config? " + return + end + end + end + end + + def initial_menu + HighLine.new.choose do |m| + m.choice "Inspect all warnings" do + @skip_ignored = false + pre_show_help + process_warnings + end + + m.choice "Inspect new warnings" do + @skip_ignored = true + pre_show_help + process_warnings + end + + m.choice "Prune obsolete ignored warnings" do + prune_obsolete + end + + m.choice "Skip - use current ignore configuration" do + @quit = true + @ignore_config.filter_ignored + end + end + end + + def warning_menu + HighLine.new.choose do |m| + m.prompt = "Action: " + m.layout = :one_line + m.list_option = ", " + m.select_by = :name + + m.choice "i" + m.choice "n" + m.choice "s" + m.choice "u" + m.choice "a" + m.choice "k" + m.choice "q" + m.choice "?" do + show_help + "?" + end + end + end + + def pre_show_help + say "-" * 30 + say "Actions:", :cyan + show_help + end + + def show_help + say <<-HELP +i - Add warning to ignore list +n - Add warning to ignore list and add note +s - Skip this warning (will remain ignored or shown) +u - Remove this warning from ignore list +a - Ignore this warning and all remaining warnings +k - Skip this warning and all remaining warnings +q - Quit, do not update ignored warnings +? - Display this help + HELP + end + + def penultimate_menu + obsolete = @ignore_config.obsolete_fingerprints + return unless obsolete.any? + + if obsolete.length > 1 + plural = 's' + verb = 'are' + else + plural = '' + verb = 'is' + end + + say "\n#{obsolete.length} fingerprint#{plural} #{verb} unused:", :green + obsolete.each do |obs| + say obs + end + + if yes_or_no "\nRemove fingerprint#{plural}?" + @ignore_config.prune_obsolete + end + end + + def prune_obsolete + @ignore_config.filter_ignored + obsolete = @ignore_config.obsolete_fingerprints + @ignore_config.prune_obsolete + + say "Removed #{obsolete.length} obsolete fingerprint#{'s' if obsolete.length > 1} from ignore config.", :yellow + end + + def final_menu + summarize_changes + + HighLine.new.choose do |m| + m.choice "Save changes" do + save + end + + m.choice "Start over" do + start_over + end + + m.choice "Quit, do not save changes" do + quit + end + end + end + + def save + @ignore_config.file = HighLine.new.ask "Output file: " do |q| + if @ignore_config.file and not @ignore_config.file.empty? + q.default = @ignore_config.file + else + q.default = "config/brakeman.ignore" + end + end + + @ignore_config.save_with_old + end + + def start_over + reset_config + @restart = true + end + + def reset_config + @ignore_config = Brakeman::IgnoreConfig.new(@ignore_config.file, @new_warnings) + end + + def process_warnings + @warning_count = @new_warnings.length + + @new_warnings.each_with_index do |w, index| + @current_index = index + + if skip_ignored? w or @skip_rest + next + elsif @ignore_rest + ignore w + elsif @quit or @restart + return + else + ask_about w + end + end + end + + def ask_about warning + pretty_display warning + warning_action warning_menu, warning + end + + def warning_action action, warning + case action + when "i" + ignore warning + when "n" + ignore_and_note warning + when "s" + # do nothing + when "u" + unignore warning + when "a" + ignore_rest warning + when "k" + skip_rest warning + when "q" + quit + when "?" + ask_about warning + else + raise "Unexpected action" + end + end + + def ignore warning + @ignore_config.ignore warning + end + + def ignore_and_note warning + note = HighLine.new.ask("Note: ") + @ignore_config.ignore warning + @ignore_config.add_note warning, note + end + + def unignore warning + @ignore_config.unignore warning + end + + def skip_rest warning + @skip_rest = true + end + + def ignore_rest warning + ignore warning + @ignore_rest = true + end + + def quit + reset_config + @ignore_config.read_from_file + @ignore_config.filter_ignored + @quit = true + end + + def pretty_display warning + progress = "#{@current_index + 1}/#{@warning_count}" + say "-------- #{progress} #{"-" * (20 - progress.length)}", :cyan + show_confidence warning + + label "Category" + say warning.warning_type + + label "Message" + say warning.message + + if warning.code + label "Code" + say warning.format_code + end + + if warning.file + label "File" + say warning.file.relative + end + + if warning.line + label "Line" + say warning.line + end + + if already_ignored? warning + show_note warning + say "Already ignored", :red + end + + say "" + end + + def already_ignored? warning + @ignore_config.ignored? warning + end + + def skip_ignored? warning + @skip_ignored and already_ignored? warning + end + + def summarize_changes + say "-" * 30 + + say "Ignoring #{@ignore_config.ignored_warnings.length} warnings", :yellow + say "Showing #{@ignore_config.shown_warnings.length} warnings", :green + end + + def label name + say "#{name}: ", :green + end + + def show_confidence warning + label "Confidence" + + case warning.confidence + when 0 + say "High", :red + when 1 + say "Medium", :yellow + when 2 + say "Weak", :cyan + else + say "Unknown" + end + end + + def show_note warning + note = @ignore_config.note_for warning + + if note + label "Note" + say note + end + end + + def say text, color = nil + text = text.to_s + + if color + HighLine.new.say HighLine.new.color(text, color) + else + HighLine.new.say text + end + end + + def yes_or_no message + answer = HighLine.new.ask message do |q| + q.in = ["y", "n", "yes", "no"] + end + + answer.match /^y/i + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/pager.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/pager.rb new file mode 100644 index 000000000..a6bfe192b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/pager.rb @@ -0,0 +1,113 @@ +module Brakeman + class Pager + def initialize tracker, pager = :less, output = $stdout + @tracker = tracker + @pager = pager + @output = output + @less_available = @less_options = nil + end + + def page_report report, format + if @pager == :less + set_color + end + + text = report.format(format) + + if in_ci? + no_pager text + else + page_output text + end + end + + def page_output text + case @pager + when :none + no_pager text + when :highline + page_via_highline text + when :less + if less_available? + page_via_less text + else + page_via_highline text + end + else + no_pager text + end + end + + def no_pager text + @output.puts text + end + + def page_via_highline text + Brakeman.load_brakeman_dependency 'highline' + h = ::HighLine.new($stdin, @output) + h.page_at = :auto + h.say text + end + + def page_via_less text + # Adapted from https://github.com/piotrmurach/tty-pager/ + + write_io = IO.popen("less #{less_options.join}", 'w') + pid = write_io.pid + + write_io.write(text) + write_io.close + + Process.waitpid2(pid, Process::WNOHANG) + rescue Errno::ECHILD + # on jruby 9x waiting on pid raises (per tty-pager) + true + rescue => e + warn "[Error] #{e}" + warn "[Error] Could not use pager. Set --no-pager to avoid this issue." + no_pager text + end + + def in_ci? + ci = ENV["CI"] + + ci.is_a? String and ci.downcase == "true" + end + + def less_available? + return @less_available unless @less_available.nil? + + @less_available = system("which less > /dev/null") + end + + def less_options + # -R show colors + # -F exit if output fits on one screen + # -X do not clear screen after less exits + + return @less_options if @less_options + + @less_options = [] + + if system("which less > /dev/null") + less_help = `less -?` + + ["-R ", "-F ", "-X ", " --wordwrap"].each do |opt| + if less_help.include? opt + @less_options << opt + end + end + end + + @less_options + end + + def set_color + return unless @tracker + + unless less_options.include? "-R " or @tracker.options[:output_color] == :force + @tracker.options[:output_color] = false + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/renderer.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/renderer.rb new file mode 100644 index 000000000..27ea483c3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/renderer.rb @@ -0,0 +1,24 @@ +require 'erb' + +class Brakeman::Report + class Renderer + def initialize(template_file, hash = {}) + hash[:locals] ||= {} + singleton = class << self; self end + + hash[:locals].each do |attribute_name, attribute_value| + singleton.send(:define_method, attribute_name) { attribute_value } + end + + # There are last, so as to make overwriting these using locals impossible. + singleton.send(:define_method, 'template_file') { template_file } + singleton.send(:define_method, 'template') { + File.read(File.expand_path("templates/#{template_file}.html.erb", File.dirname(__FILE__))) + } + end + + def render + ERB.new(template).result(binding) + end + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_base.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_base.rb new file mode 100644 index 000000000..863bce087 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_base.rb @@ -0,0 +1,191 @@ +require 'set' +require 'brakeman/util' +require 'brakeman/version' +require 'brakeman/report/renderer' +require 'brakeman/processors/output_processor' +require 'brakeman/warning' + +# Base class for report formats +class Brakeman::Report::Base + include Brakeman::Util + + attr_reader :tracker, :checks + + def initialize tracker + @app_tree = tracker.app_tree + @tracker = tracker + @checks = tracker.checks + @ignore_filter = tracker.ignored_filter + @highlight_user_input = tracker.options[:highlight_user_input] + @warnings_summary = nil + end + + #Return summary of warnings in hash and store in @warnings_summary + def warnings_summary + return @warnings_summary if @warnings_summary + + summary = Hash.new(0) + high_confidence_warnings = 0 + + [all_warnings].each do |warnings| + warnings.each do |warning| + summary[warning.warning_type.to_s] += 1 + high_confidence_warnings += 1 if warning.confidence == 0 + end + end + + summary[:high_confidence] = high_confidence_warnings + @warnings_summary = summary + end + + def controller_information + controller_rows = [] + + tracker.controllers.keys.map{|k| k.to_s}.sort.each do |name| + name = name.to_sym + c = tracker.controllers[name] + + if tracker.routes.include? :allow_all_actions or (tracker.routes[name] and tracker.routes[name].include? :allow_all_actions) + routes = c.methods_public.keys.map{|e| e.to_s}.sort.join(", ") + elsif tracker.routes[name].nil? + #No routes defined for this controller. + #This can happen when it is only a parent class + #for other controllers, for example. + routes = "[None]" + + else + routes = (Set.new(c.methods_public.keys) & tracker.routes[name.to_sym]). + to_a. + map {|e| e.to_s}. + sort. + join(", ") + end + + if routes == "" + routes = "[None]" + end + + controller_rows << { "Name" => name.to_s, + "Parent" => c.parent.to_s, + "Includes" => c.includes.join(", "), + "Routes" => routes + } + end + + controller_rows + end + + def all_warnings + if @ignore_filter + @all_warnings ||= @ignore_filter.shown_warnings + else + @all_warnings ||= tracker.checks.all_warnings + end + end + + def filter_warnings warnings + if @ignore_filter + warnings.reject do |w| + @ignore_filter.ignored? w + end + else + warnings + end + end + + def generic_warnings + filter_warnings tracker.checks.warnings + end + + def template_warnings + filter_warnings tracker.checks.template_warnings + end + + def model_warnings + filter_warnings tracker.checks.model_warnings + end + + def controller_warnings + filter_warnings tracker.checks.controller_warnings + end + + def ignored_warnings + if @ignore_filter + @ignore_filter.ignored_warnings + else + [] + end + end + + def number_of_templates tracker + Set.new(tracker.templates.map {|k,v| v.name.to_s[/[^.]+/]}).length + end + + def absolute_paths? + @tracker.options[:absolute_paths] + end + + def warning_file warning + return nil if warning.file.nil? + + if absolute_paths? + warning.file.absolute + else + warning.file.relative + end + end + + #Return array of lines surrounding the warning location from the original + #file. + def context_for warning + file = warning.file + context = [] + return context unless warning.line and file and file.exists? + + current_line = 0 + start_line = warning.line - 5 + end_line = warning.line + 5 + + start_line = 1 if start_line < 0 + + File.open file do |f| + f.each_line do |line| + current_line += 1 + + next if line.strip == "" + + if current_line > end_line + break + end + + if current_line >= start_line + context << [current_line, line] + end + end + end + + context + end + + def rails_version + case + when tracker.config.rails_version + tracker.config.rails_version + when tracker.options[:rails4] + "4.x" + when tracker.options[:rails3] + "3.x" + else + "Unknown" + end + end + + def github_url file, line=nil + if repo_url = @tracker.options[:github_url] and file + url = "#{repo_url}/#{file.relative}" + url << "#L#{line}" if line + else + nil + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_codeclimate.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_codeclimate.rb new file mode 100644 index 000000000..2cfb0fcd3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_codeclimate.rb @@ -0,0 +1,79 @@ +require "json" +require "yaml" +require "pathname" + +class Brakeman::Report::CodeClimate < Brakeman::Report::Base + DOCUMENTATION_PATH = File.expand_path("../../../../docs/warning_types", __FILE__) + REMEDIATION_POINTS_CONFIG_PATH = File.expand_path("../config/remediation.yml", __FILE__) + REMEDIATION_POINTS_DEFAULT = 300_000 + + def generate_report + all_warnings.map { |warning| issue_json(warning) }.join("\0") + end + + private + + def issue_json(warning) + warning_code_name = name_for(warning.warning_code) + + { + type: "Issue", + check_name: warning_code_name, + description: warning.message, + fingerprint: warning.fingerprint, + categories: ["Security"], + severity: severity_level_for(warning.confidence), + remediation_points: remediation_points_for(warning_code_name), + location: { + path: file_path(warning), + lines: { + begin: warning.line || 1, + end: warning.line || 1, + } + }, + content: { + body: content_for(warning.warning_code, warning.link) + } + }.to_json + end + + def severity_level_for(confidence) + if confidence == 0 + "critical" + else + "normal" + end + end + + def remediation_points_for(warning_code) + @remediation_points ||= YAML.load_file(REMEDIATION_POINTS_CONFIG_PATH) + @remediation_points.fetch(name_for(warning_code), REMEDIATION_POINTS_DEFAULT) + end + + def name_for(warning_code) + @warning_codes ||= Brakeman::WarningCodes::Codes.invert + @warning_codes[warning_code].to_s + end + + def content_for(warning_code, link) + @contents ||= {} + unless link.nil? + @contents[warning_code] ||= local_content_for(link) || "Read more: #{link}" + end + end + + def local_content_for(link) + directory = link.split("/").last + filename = File.join(DOCUMENTATION_PATH, directory, "index.markdown") + + File.read(filename) if File.exist?(filename) + end + + def file_path(warning) + if tracker.options[:path_prefix] + (Pathname.new(tracker.options[:path_prefix]) + Pathname.new(warning.file.relative)).to_s + else + warning.relative_path + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_csv.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_csv.rb new file mode 100644 index 000000000..b16c93fff --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_csv.rb @@ -0,0 +1,51 @@ +require 'csv' + +class Brakeman::Report::CSV < Brakeman::Report::Base + def generate_report + headers = [ + "Confidence", + "Warning Type", + "CWE", + "File", + "Line", + "Message", + "Code", + "User Input", + "Check Name", + "Warning Code", + "Fingerprint", + "Link" + ] + + rows = tracker.filtered_warnings.sort_by do |w| + [w.confidence, w.warning_type, w.file, w.line || 0, w.fingerprint] + end.map do |warning| + generate_row(headers, warning) + end + + table = CSV::Table.new(rows) + + table.to_csv + end + + def generate_row headers, warning + CSV::Row.new headers, warning_row(warning) + end + + def warning_row warning + [ + warning.confidence_name, + warning.warning_type, + warning.cwe_id.first, + warning_file(warning), + warning.line, + warning.message, + warning.code && warning.format_code(false), + warning.user_input && warning.format_user_input(false), + warning.check_name, + warning.warning_code, + warning.fingerprint, + warning.link, + ] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_github.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_github.rb new file mode 100644 index 000000000..5ddbf0124 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_github.rb @@ -0,0 +1,31 @@ +# GitHub Actions Formatter +# Formats warnings as workflow commands to create annotations in GitHub UI +class Brakeman::Report::Github < Brakeman::Report::Base + def generate_report + # @see https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message + errors.concat(warnings).join("\n") + end + + def warnings + all_warnings + .map { |warning| "::warning file=#{warning_file(warning)},line=#{warning.line}::#{warning.message}" } + end + + def errors + tracker.errors.map do |error| + if error[:exception].is_a?(Racc::ParseError) + # app/services/balance.rb:4 :: parse error on value "..." (tDOT3) + file, line = error[:exception].message.split(':').map(&:strip)[0,2] + "::error file=#{file},line=#{line}::#{clean_message(error[:error])}" + else + "::error ::#{clean_message(error[:error])}" + end + end + end + + private + + def clean_message(msg) + msg.gsub('::','').squeeze(' ') + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_hash.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_hash.rb new file mode 100644 index 000000000..2c6ef80d7 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_hash.rb @@ -0,0 +1,23 @@ +# Generates a hash table for use in Brakeman tests +class Brakeman::Report::Hash < Brakeman::Report::Base + def generate_report + report = { :errors => tracker.errors, + :controllers => tracker.controllers, + :models => tracker.models, + :templates => tracker.templates + } + + [:generic_warnings, :controller_warnings, :model_warnings, :template_warnings].each do |meth| + report[meth] = self.send(meth) + report[meth].each do |w| + w.message = w.format_message + w.context = context_for(w).join("\n") + end + end + + report[:config] = tracker.config + report[:checks_run] = tracker.checks.checks_run + + report + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_html.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_html.rb new file mode 100644 index 000000000..25e3d4d80 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_html.rb @@ -0,0 +1,219 @@ +require 'cgi/escape' +require 'brakeman/report/report_table.rb' + +class Brakeman::Report::HTML < Brakeman::Report::Table + HTML_CONFIDENCE = [ "<span class='high-confidence'>High</span>", + "<span class='med-confidence'>Medium</span>", + "<span class='weak-confidence'>Weak</span>" ] + + def initialize *args + super + + @element_id = 0 #Used for HTML ids + end + + def generate_report + out = html_header << + generate_overview << + generate_warning_overview.to_s + + # Return early if only summarizing + return out if tracker.options[:summary_only] + + out << generate_controllers.to_s if tracker.options[:report_routes] or tracker.options[:debug] + out << generate_templates.to_s if tracker.options[:debug] + out << generate_errors.to_s + out << generate_warnings.to_s + out << generate_controller_warnings.to_s + out << generate_model_warnings.to_s + out << generate_template_warnings.to_s + out << generate_ignored_warnings.to_s + out << "</body></html>" + end + + def generate_overview + locals = { + :tracker => tracker, + :warnings => all_warnings.length, + :warnings_summary => warnings_summary, + :number_of_templates => number_of_templates(@tracker), + :ignored_warnings => ignored_warnings.length + } + + Brakeman::Report::Renderer.new('overview', :locals => locals).render + end + + #Generate listings of templates and their output + def generate_templates + out_processor = Brakeman::OutputProcessor.new + template_rows = {} + tracker.templates.each do |name, template| + template.each_output do |out| + out = CGI.escapeHTML(out_processor.format(out)) + template_rows[name] ||= [] + template_rows[name] << out.gsub("\n", ";").gsub(/\s+/, " ") + end + end + + template_rows = template_rows.sort_by{|name, value| name.to_s} + + Brakeman::Report::Renderer.new('template_overview', :locals => {:template_rows => template_rows}).render + end + + def render_array template, headings, value_array, locals + return if value_array.empty? + + Brakeman::Report::Renderer.new(template, :locals => locals).render + end + + def convert_warning warning, original + warning["Confidence"] = HTML_CONFIDENCE[original.confidence] + warning["Message"] = with_context original, warning["Message"] + warning["Warning Type"] = with_link original, warning["Warning Type"] + warning + end + + def with_link warning, message + "<a rel=\"noreferrer\" href=\"#{warning.link}\">#{message}</a>" + end + + def convert_template_warning warning, original + warning = convert_warning warning, original + warning["Called From"] = original.called_from + warning["Template Name"] = original.template.name + warning + end + + def convert_ignored_warning warning, original + warning = convert_warning(warning, original) + warning['File'] = original.file.relative + warning['Note'] = CGI.escapeHTML(@ignore_filter.note_for(original) || "") + warning + end + + #Return header for HTML output. Uses CSS from tracker.options[:html_style] + def html_header + if File.exist? tracker.options[:html_style] + css = File.read tracker.options[:html_style] + else + raise "Cannot find CSS stylesheet for HTML: #{tracker.options[:html_style]}" + end + + locals = { + :css => css, + :tracker => tracker, + :checks => checks, + :rails_version => rails_version, + :brakeman_version => Brakeman::Version + } + + Brakeman::Report::Renderer.new('header', :locals => locals).render + end + + #Generate HTML for warnings, including context show/hidden via Javascript + def with_context warning, message + @element_id += 1 + context = context_for(warning) + message = html_message(warning, message) + + code_id = "context#@element_id" + message_id = "message#@element_id" + full_message_id = "full_message#@element_id" + alt = false + output = "<div class='warning_message' onClick=\"toggle('#{code_id}');toggle('#{message_id}');toggle('#{full_message_id}')\" >" << + message << + "<table id='#{code_id}' class='context' style='display:none'>" << + "<caption>#{CGI.escapeHTML warning_file(warning) || ''}</caption>" + + output << <<-HTML + <thead style='display:none'> + <tr> + <th>line number</th> + <th>line content</th> + </tr> + </thead> + <tbody> + HTML + + unless context.empty? + if warning.line - 1 == 1 or warning.line + 1 == 1 + error = " near_error" + elsif 1 == warning.line + error = " error" + else + error = "" + end + + output << <<-HTML + <tr class='context first#{error}'> + <td class='context_line'> + <pre class='context'>#{context.first[0]}</pre> + </td> + <td class='context'> + <pre class='context'>#{CGI.escapeHTML context.first[1].chomp}</pre> + </td> + </tr> + HTML + + if context.length > 1 + output << context[1..-1].map do |code| + alt = !alt + if code[0] == warning.line - 1 or code[0] == warning.line + 1 + error = " near_error" + elsif code[0] == warning.line + error = " error" + else + error = "" + end + + <<-HTML + <tr class='context#{alt ? ' alt' : ''}#{error}'> + <td class='context_line'> + <pre class='context'>#{code[0]}</pre> + </td> + <td class='context'> + <pre class='context'>#{CGI.escapeHTML code[1].chomp}</pre> + </td> + </tr> + HTML + end.join + end + end + + output << "</tbody></table></div>" + end + + #Escape warning message and highlight user input in HTML output + def html_message warning, message + message = message.to_html + + if warning.file + if github_url = github_url(warning.file, warning.line) + message << " <a href=\"#{github_url}\" target='_blank'>near line #{warning.line}</a>" + elsif warning.line + message << " near line #{warning.line}" + end + end + + if warning.code + code = warning.format_with_user_input do |_, user_input| + "[BMP_UI]#{user_input}[/BMP_UI]" + end + + code = "<span class=\"code\">#{CGI.escapeHTML(code).gsub("[BMP_UI]", "<span class=\"user_input\">").gsub("[/BMP_UI]", "</span>")}</span>" + full_message = "#{message}: #{code}" + + if warning.code.mass > 20 + message_id = "message#@element_id" + full_message_id = "full_message#@element_id" + + "<span id='#{message_id}' style='display:block'>#{message}: ...</span>" << + "<span id='#{full_message_id}' style='display:none'>#{full_message}</span>" + else + full_message + end + else + message + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_json.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_json.rb new file mode 100644 index 000000000..b208d32d1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_json.rb @@ -0,0 +1,43 @@ +class Brakeman::Report::JSON < Brakeman::Report::Base + def generate_report + errors = tracker.errors.map{|e| { :error => e[:error], :location => e[:backtrace][0] }} + + obsolete = tracker.unused_fingerprints + + warnings = convert_to_hashes all_warnings + + ignored = convert_to_hashes ignored_warnings + + scan_info = { + :app_path => tracker.app_path, + :rails_version => rails_version, + :security_warnings => all_warnings.length, + :start_time => tracker.start_time.to_s, + :end_time => tracker.end_time.to_s, + :duration => tracker.duration, + :checks_performed => checks.checks_run.sort, + :number_of_controllers => tracker.controllers.length, + # ignore the "fake" model + :number_of_models => tracker.models.length - 1, + :number_of_templates => number_of_templates(@tracker), + :ruby_version => RUBY_VERSION, + :brakeman_version => Brakeman::Version + } + + report_info = { + :scan_info => scan_info, + :warnings => warnings, + :ignored_warnings => ignored, + :errors => errors, + :obsolete => obsolete + } + + JSON.pretty_generate report_info + end + + def convert_to_hashes warnings + warnings.map do |w| + w.to_hash(absolute_paths: false) + end.sort_by { |w| "#{w[:fingerprint]}#{w[:line]}" } + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_junit.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_junit.rb new file mode 100644 index 000000000..eb47f4ae4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_junit.rb @@ -0,0 +1,51 @@ +require 'time' +require 'stringio' +Brakeman.load_brakeman_dependency 'rexml/document' + +class Brakeman::Report::JUnit < Brakeman::Report::Base + def generate_report + io = StringIO.new + doc = REXML::Document.new + doc.add REXML::XMLDecl.new '1.0', 'UTF-8' + + test_suites = REXML::Element.new 'testsuites' + + i = 0 + all_warnings + .map { |warning| [warning.file, [warning]] } + .reduce({}) { |entries, entry| + key, value = entry + entries[key] = entries[key] ? entries[key].concat(value) : value + entries + } + .each { |file, warnings| + i += 1 + test_suite = test_suites.add_element 'testsuite' + test_suite.add_attribute 'id', i + test_suite.add_attribute 'package', 'brakeman' + test_suite.add_attribute 'file', file.relative + test_suite.add_attribute 'timestamp', tracker.start_time.strftime('%FT%T') + test_suite.add_attribute 'tests', checks.checks_run.length + test_suite.add_attribute 'failures', warnings.length + test_suite.add_attribute 'errors', '0' + test_suite.add_attribute 'time', '0' + + warnings.each { |warning| + test_case = test_suite.add_element 'testcase' + test_case.add_attribute 'name', warning.check.sub(/^Brakeman::/, '') + test_case.add_attribute 'file', file.relative + test_case.add_attribute 'line', warning.line if warning.line + test_case.add_attribute 'time', '0' + + failure = test_case.add_element 'failure' + failure.add_attribute 'message', warning.message + failure.add_attribute 'type', warning.warning_type + failure.add_text warning.to_s + } + } + + doc.add test_suites + doc.write io + io.string + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_markdown.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_markdown.rb new file mode 100644 index 000000000..adeda47ec --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_markdown.rb @@ -0,0 +1,113 @@ +require 'brakeman/report/report_table' + +class Brakeman::Report::Markdown < Brakeman::Report::Table + + class MarkdownTable < Terminal::Table + + def initialize options = {}, &block + options[:style] ||= {} + options[:style].merge!({ + :border_x => '-', + :border_y => '|', + :border_i => '|' + }) + super options, &block + end + + def render + super.split("\n")[1...-1].join("\n") + end + alias :to_s :render + + end + + def initialize *args + super + @table = MarkdownTable + end + + def generate_report + out = +"# BRAKEMAN REPORT\n\n" << + generate_metadata.to_s << "\n\n" << + generate_checks.to_s << "\n\n" << + "### SUMMARY\n\n" << + generate_overview.to_s << "\n\n" << + generate_warning_overview.to_s << "\n\n" + + #Return output early if only summarizing + return out if tracker.options[:summary_only] + + if tracker.options[:report_routes] or tracker.options[:debug] + out << "### CONTROLLERS" << "\n\n" << + generate_controllers.to_s << "\n\n" + end + + if tracker.options[:debug] + out << "### TEMPLATES\n\n" << + generate_templates.to_s << "\n\n" + end + + output_table("Errors", generate_errors, out) + output_table("SECURITY WARNINGS", generate_warnings, out) + output_table("Controller Warnings:", generate_controller_warnings, out) + output_table("Model Warnings:", generate_model_warnings, out) + output_table("View Warnings:", generate_template_warnings, out) + + out + end + + def output_table title, result, output + return unless result + + output << "### #{title}\n\n#{result.to_s}\n\n" + end + + def generate_metadata + MarkdownTable.new( + :headings => + ['Application path', 'Rails version', 'Brakeman version', 'Started at', 'Duration'] + ) do |t| + t.add_row([ + tracker.app_path, + rails_version, + Brakeman::Version, + tracker.start_time, + "#{tracker.duration} seconds", + ]) + end + end + + def generate_checks + MarkdownTable.new(:headings => ['Checks performed']) do |t| + t.add_row([checks.checks_run.sort.join(", ")]) + end + end + + def convert_warning warning, original + warning["Message"] = markdown_message original, warning["Message"] + warning["Warning Type"] = "[#{warning['Warning Type']}](#{original.link})" if original.link + warning + end + + # Escape and code format warning message + def markdown_message warning, message + message = message.to_s + + if warning.file + github_url = github_url warning.file, warning.line + + if github_url + message << " near line [#{warning.line}](#{github_url})" + elsif warning.line + message << " near line #{warning.line}" + end + end + + if warning.code + code = warning.format_code.gsub('`','``').gsub(/\A``|``\z/, '` `') + message << ": `#{code}`" + end + + message + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_sarif.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_sarif.rb new file mode 100644 index 000000000..d9782e87d --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_sarif.rb @@ -0,0 +1,253 @@ +require 'uri' + +class Brakeman::Report::SARIF < Brakeman::Report::Base + def generate_report + sarif_log = { + :version => '2.1.0', + :$schema => 'https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0.json', + :runs => runs, + } + JSON.pretty_generate sarif_log + end + + def runs + [ + { + :tool => { + :driver => { + :name => 'Brakeman', + :informationUri => 'https://brakemanscanner.org', + :semanticVersion => Brakeman::Version, + :rules => rules, + }, + }, + :results => results, + }.merge(original_uri_base_ids) + ] + end + + # Output base URIs + # based on what the user specified for the application path + # and whether or not --absolute-paths was set. + def original_uri_base_ids + if tracker.options[:app_path] == '.' + # Probably no app_path was specified, as that's the default + + if absolute_paths? + # Set %SRCROOT% to absolute path + { + originalUriBaseIds: { + '%SRCROOT%' => { + uri: file_uri(tracker.app_tree.root), + description: { + text: 'Base path for application' + } + } + } + } + else + # Empty %SRCROOT% + # This avoids any paths appearing in the report + # that are not part of the application directory. + # Seems fine! + { + originalUriBaseIds: { + '%SRCROOT%' => { + description: { + text: 'Base path for application' + } + }, + } + } + + end + elsif tracker.options[:app_path] != tracker.app_tree.root + # Path was specified and it was relative + + if absolute_paths? + # Include absolute root and relative application path + { + originalUriBaseIds: { + PROJECTROOT: { + uri: file_uri(tracker.app_tree.root), + description: { + text: 'Base path for all project files' + } + }, + '%SRCROOT%' => { + # Technically should ensure this doesn't have any '..' + # but... TODO + uri: File.join(tracker.options[:app_path], '/'), + uriBaseId: 'PROJECTROOT', + description: { + text: 'Base path for application' + } + } + } + } + else + # Just include relative application path. + # Not clear this is 100% valid, but there is one example in the spec like this + { + originalUriBaseIds: { + PROJECTROOT: { + description: { + text: 'Base path for all project files' + } + }, + '%SRCROOT%' => { + # Technically should ensure this doesn't have any '..' + # but... TODO + uri: File.join(tracker.options[:app_path], '/'), + uriBaseId: 'PROJECTROOT', + description: { + text: 'Base path for application' + } + } + } + } + end + else + # app_path was absolute + + if absolute_paths? + # Set %SRCROOT% to absolute path + { + originalUriBaseIds: { + '%SRCROOT%' => { + uri: file_uri(tracker.app_tree.root), + description: { + text: 'Base path for application' + } + } + } + } + else + # Empty %SRCROOT% + # Seems fine! + { + originalUriBaseIds: { + '%SRCROOT%' => { + description: { + text: 'Base path for application' + } + }, + } + } + end + end + end + + def rules + @rules ||= unique_warnings_by_warning_code.map do |warning| + rule_id = render_id warning + check_name = warning.check_name + check_description = render_message check_descriptions[check_name] + { + :id => rule_id, + :name => "#{check_name}/#{warning.warning_type}", + :fullDescription => { + :text => check_description, + }, + :helpUri => warning.link, + :help => { + :text => "More info: #{warning.link}.", + :markdown => "[More info](#{warning.link}).", + }, + :properties => { + :tags => [check_name], + }, + } + end + end + + def results + @results ||= tracker.checks.all_warnings.map do |warning| + rule_id = render_id warning + result_level = infer_level warning + message_text = render_message warning.message.to_s + result = { + :ruleId => rule_id, + :ruleIndex => rules.index { |r| r[:id] == rule_id }, + :level => result_level, + :message => { + :text => message_text, + }, + :locations => [ + :physicalLocation => { + :artifactLocation => { + :uri => warning.file.relative, + :uriBaseId => '%SRCROOT%', + }, + :region => { + :startLine => warning.line.is_a?(Integer) ? warning.line : 1, + }, + }, + ], + } + + if @ignore_filter && @ignore_filter.ignored?(warning) + result[:suppressions] = [ + { + :kind => 'external', + :justification => @ignore_filter.note_for(warning), + :location => { + :physicalLocation => { + :artifactLocation => { + :uri => Brakeman::FilePath.from_app_tree(@app_tree, @ignore_filter.file).relative, + :uriBaseId => '%SRCROOT%', + }, + }, + }, + } + ] + end + + result + end + end + + # Returns a hash of all check descriptions, keyed by check name + def check_descriptions + @check_descriptions ||= Brakeman::Checks.checks.map do |check| + [check.name.gsub(/^Check/, ''), check.description] + end.to_h + end + + # Returns a de-duplicated set of warnings, used to generate rules + def unique_warnings_by_warning_code + @unique_warnings_by_warning_code ||= tracker.checks.all_warnings.uniq { |w| w.warning_code } + end + + def render_id warning + # Include alpha prefix to provide 'compiler error' appearance + "BRAKE#{'%04d' % warning.warning_code}" # 46 becomes BRAKE0046, for example + end + + def render_message message + return message if message.nil? + + # Ensure message ends with a period + if message.end_with? "." + message + else + "#{message}." + end + end + + def infer_level warning + # Infer result level from warning confidence + @@levels_from_confidence ||= Hash.new('warning').update({ + 0 => 'error', # 0 represents 'high confidence', which we infer as 'error' + 1 => 'warning', # 1 represents 'medium confidence' which we infer as 'warning' + 2 => 'note', # 2 represents 'weak, or low, confidence', which we infer as 'note' + }) + @@levels_from_confidence[warning.confidence] + end + + # File URI as a string with trailing forward-slash + # as required by SARIF standard + def file_uri(path) + URI::File.build(path: File.join(path, '/')).to_s + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_sonar.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_sonar.rb new file mode 100644 index 000000000..3298b731a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_sonar.rb @@ -0,0 +1,38 @@ +class Brakeman::Report::Sonar < Brakeman::Report::Base + def generate_report + report_object = { + issues: all_warnings.map { |warning| issue_json(warning) } + } + return JSON.pretty_generate report_object + end + + private + + def issue_json(warning) + { + engineId: "Brakeman", + ruleId: warning.warning_code, + type: "VULNERABILITY", + severity: severity_level_for(warning.confidence), + primaryLocation: { + message: warning.message, + filePath: warning.file.relative, + textRange: { + "startLine": warning.line || 1, + "endLine": warning.line || 1, + } + }, + effortMinutes: (4 - warning.confidence) * 15 + } + end + + def severity_level_for(confidence) + if confidence == 0 + "CRITICAL" + elsif confidence == 1 + "MAJOR" + else + "MINOR" + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_table.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_table.rb new file mode 100644 index 000000000..d12ecaea3 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_table.rb @@ -0,0 +1,290 @@ +Brakeman.load_brakeman_dependency 'terminal-table' + +class Brakeman::Report::Table < Brakeman::Report::Base + def initialize *args + super + @table = Terminal::Table + end + + def generate_report + summary_option = tracker.options[:summary_only] + out = +"" + + unless summary_option == :no_summary + out << text_header << + "\n\n+SUMMARY+\n\n" << + truncate_table(generate_overview.to_s) << "\n\n" << + truncate_table(generate_warning_overview.to_s) << "\n" + end + + #Return output early if only summarizing + if summary_option == :summary_only or summary_option == true + return out + end + + if tracker.options[:report_routes] or tracker.options[:debug] + out << "\n+CONTROLLERS+\n" << + truncate_table(generate_controllers.to_s) << "\n" + end + + if tracker.options[:debug] + out << "\n+TEMPLATES+\n\n" << + truncate_table(generate_templates.to_s) << "\n" + end + + output_table("+Obsolete Ignore Entries+", generate_obsolete, out) + output_table("+Errors+", generate_errors, out) + output_table("+SECURITY WARNINGS+", generate_warnings, out) + output_table("Controller Warnings:", generate_controller_warnings, out) + output_table("Model Warnings:", generate_model_warnings, out) + output_table("View Warnings:", generate_template_warnings, out) + + out << "\n" + out + end + + def output_table title, result, output + return unless result + + output << "\n\n#{title}\n\n#{truncate_table(result.to_s)}" + end + + def generate_overview + num_warnings = all_warnings.length + + @table.new(:headings => ['Scanned/Reported', 'Total']) do |t| + t.add_row ['Controllers', tracker.controllers.length] + t.add_row ['Models', tracker.models.length - 1] + t.add_row ['Templates', number_of_templates(@tracker)] + t.add_row ['Errors', tracker.errors.length] + t.add_row ['Security Warnings', "#{num_warnings} (#{warnings_summary[:high_confidence]})"] + t.add_row ['Ignored Warnings', ignored_warnings.length] unless ignored_warnings.empty? + end + end + + #Generate table of how many warnings of each warning type were reported + def generate_warning_overview + types = warnings_summary.keys + types.delete :high_confidence + values = types.sort.collect{|warning_type| [warning_type, warnings_summary[warning_type]] } + locals = {:types => types, :warnings_summary => warnings_summary} + + render_array('warning_overview', ['Warning Type', 'Total'], values, locals) + end + + #Generate table of controllers and routes found for those controllers + def generate_controllers + controller_rows = controller_information + + cols = ['Name', 'Parent', 'Includes', 'Routes'] + + locals = {:controller_rows => controller_rows} + values = controller_rows.collect{|row| row.values_at(*cols) } + render_array('controller_overview', cols, values, locals) + end + + #Generate table of errors or return nil if no errors + def generate_errors + values = tracker.errors.collect{|error| [error[:error], error[:backtrace][0]]} + render_array('error_overview', ['Error', 'Location'], values, {:tracker => tracker}) + end + + def generate_obsolete + values = tracker.unused_fingerprints.collect{|fingerprint| [fingerprint] } + render_array('obsolete_ignore_entries', ['fingerprint'], values, {:tracker => tracker}) + end + + def generate_warnings + render_warnings generic_warnings, + :warning, + 'security_warnings', + ["Confidence", "Class", "Method", "Warning Type", "CWE ID", "Message"], + 'Class' + end + + #Generate table of template warnings or return nil if no warnings + def generate_template_warnings + render_warnings template_warnings, + :template, + 'view_warnings', + ['Confidence', 'Template', 'Warning Type', "CWE ID", 'Message'], + 'Template' + + end + + #Generate table of model warnings or return nil if no warnings + def generate_model_warnings + render_warnings model_warnings, + :model, + 'model_warnings', + ['Confidence', 'Model', 'Warning Type', "CWE ID", 'Message'], + 'Model' + end + + #Generate table of controller warnings or nil if no warnings + def generate_controller_warnings + render_warnings controller_warnings, + :controller, + 'controller_warnings', + ['Confidence', 'Controller', 'Warning Type', "CWE ID", 'Message'], + 'Controller' + end + + def generate_ignored_warnings + render_warnings ignored_warnings, + :ignored, + 'ignored_warnings', + ['Confidence', 'Warning Type', "CWE ID", 'File', 'Message'], + 'Warning Type' + end + + def render_warnings warnings, type, template, cols, sort_col + unless warnings.empty? + rows = sort(convert_to_rows(warnings, type), sort_col) + + values = rows.collect { |row| row.values_at(*cols) } + + locals = { :warnings => rows } + + render_array(template, cols, values, locals) + else + nil + end + end + + #Generate listings of templates and their output + def generate_templates + out_processor = Brakeman::OutputProcessor.new + template_rows = {} + tracker.templates.each do |name, template| + template.each_output do |out| + out = out_processor.format out + template_rows[name] ||= [] + template_rows[name] << out.gsub("\n", ";").gsub(/\s+/, " ") + end + end + + template_rows = template_rows.sort_by{|name, value| name.to_s} + + output = +'' + template_rows.each do |template| + output << template.first.to_s << "\n\n" + table = @table.new(:headings => ['Output']) do |t| + # template[1] is an array of calls + template[1].each do |v| + t.add_row [v] + end + end + + output << table.to_s << "\n\n" + end + + output + end + + def convert_to_rows warnings, type = :warning + warnings.map do |warning| + w = warning.to_row type + + case type + when :warning + convert_warning w, warning + when :ignored + convert_ignored_warning w, warning + when :template + convert_template_warning w, warning + else + convert_warning w, warning + end + end + end + + def convert_ignored_warning warning, original + convert_warning warning, original + end + + def convert_template_warning warning, original + convert_warning warning, original + end + + def sort rows, sort_col + stabilizer = 0 + rows.sort_by do |row| + stabilizer += 1 + + row.values_at("Confidence", "Warning Type", sort_col) << stabilizer + end + end + + def render_array template, headings, value_array, locals + return if value_array.empty? + + @table.new(:headings => headings) do |t| + value_array.each { |value_row| t.add_row value_row } + end + end + + def convert_warning warning, original + warning["Message"] = text_message original, warning["Message"] + + warning + end + + #Escape warning message and highlight user input in text output + def text_message warning, message + message = message.to_s + + if warning.line + message << " near line #{warning.line}" + end + + if warning.code + if @highlight_user_input and warning.user_input + code = warning.format_with_user_input do |user_input, user_input_string| + "+#{user_input_string}+" + end + else + code = warning.format_code + end + + message << ": #{code}" + end + + message + end + + #Generate header for text output + def text_header + <<-HEADER + ++BRAKEMAN REPORT+ + +Application path: #{tracker.app_path} +Rails version: #{rails_version} +Brakeman version: #{Brakeman::Version} +Started at #{tracker.start_time} +Duration: #{tracker.duration} seconds +Checks run: #{checks.checks_run.sort.join(", ")} +HEADER + end + + def truncate_table str + @terminal_width ||= if @tracker.options[:table_width] + @tracker.options[:table_width] + elsif $stdin && $stdin.tty? + Brakeman.load_brakeman_dependency 'highline' + ::HighLine.default_instance.terminal.terminal_size[0] + else + 80 + end + lines = str.lines + + lines.map do |line| + if line.chomp.length > @terminal_width + line[0..(@terminal_width - 3)] + ">>\n" + else + line + end + end.join + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_tabs.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_tabs.rb new file mode 100644 index 000000000..b94424d6e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_tabs.rb @@ -0,0 +1,18 @@ +require 'brakeman/report/report_table' + +#Generated tab-separated output suitable for the Jenkins Brakeman Plugin: +#https://github.com/presidentbeef/brakeman-jenkins-plugin +class Brakeman::Report::Tabs < Brakeman::Report::Table + def generate_report + [[:generic_warnings, "General"], [:controller_warnings, "Controller"], + [:model_warnings, "Model"], [:template_warnings, "Template"]].map do |meth, category| + + self.send(meth).map do |w| + line = w.line || 0 + "#{(w.file.absolute)}\t#{line}\t#{w.warning_type}\t#{category}\t#{w.format_message}\t#{w.confidence_name}" + end.join "\n" + + end.join "\n" + + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_text.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_text.rb new file mode 100644 index 000000000..094868970 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/report_text.rb @@ -0,0 +1,243 @@ +Brakeman.load_brakeman_dependency 'highline' + +class Brakeman::Report::Text < Brakeman::Report::Base + def generate_report + HighLine.use_color = !!tracker.options[:output_color] + summary_option = tracker.options[:summary_only] + @output_string = +"\n" + + unless summary_option == :no_summary + add_chunk generate_header + add_chunk generate_overview + add_chunk generate_warning_overview + end + + if summary_option == :summary_only or summary_option == true + return @output_string + end + + add_chunk generate_controllers if tracker.options[:debug] or tracker.options[:report_routes] + add_chunk generate_templates if tracker.options[:debug] + add_chunk generate_obsolete + add_chunk generate_errors + add_chunk generate_warnings + add_chunk generate_show_ignored_overview if tracker.options[:show_ignored] && ignored_warnings.any? + + @output_string + end + + def add_chunk chunk, out = @output_string + if chunk and not chunk.empty? + if chunk.is_a? Array + chunk = chunk.join("\n") + end + + out << chunk << "\n\n" + end + end + + def generate_controllers + double_space "Controller Overview", controller_information.map { |ci| + controller = [ + label("Controller", ci["Name"]), + label("Parent", ci["Parent"]), + label("Routes", ci["Routes"]) + ] + + if ci["Includes"] and not ci["Includes"].empty? + controller.insert(2, label("Includes", ci["Includes"])) + end + + controller + } + end + + def generate_header + [ + header("Brakeman Report"), + label("Application Path", tracker.app_path), + label("Rails Version", rails_version), + label("Brakeman Version", Brakeman::Version), + label("Scan Date", tracker.start_time), + label("Duration", "#{tracker.duration} seconds"), + label("Checks Run", checks.checks_run.sort.join(", ")) + ] + end + + def generate_overview + overview = [ + header("Overview"), + label('Controllers', tracker.controllers.length), + label('Models', tracker.models.length - 1), + label('Templates', number_of_templates(@tracker)), + label('Errors', tracker.errors.length), + label('Security Warnings', all_warnings.length) + ] + + unless ignored_warnings.empty? + overview << label('Ignored Warnings', ignored_warnings.length) + end + + overview + end + + def generate_warning_overview + warning_types = warnings_summary + warning_types.delete :high_confidence + + warning_types.sort_by { |t, c| t }.map do |type, count| + label(type, count) + end.unshift(header('Warning Types')) + end + + def generate_warnings + if tracker.filtered_warnings.empty? + HighLine.color("No warnings found", :bold, :green) + else + warnings = tracker.filtered_warnings.sort_by do |w| + [w.confidence, w.warning_type, w.file, w.line || 0, w.fingerprint] + end.map do |w| + output_warning w + end + + double_space "Warnings", warnings + end + end + + def generate_show_ignored_overview + double_space("Ignored Warnings", ignored_warnings.map {|w| output_warning w}) + end + + def generate_errors + return if tracker.errors.empty? + full_trace = tracker.options[:debug] + + errors = tracker.errors.map do |e| + trace = if full_trace + e[:backtrace].join("\n") + else + e[:backtrace][0] + end + + [ + label("Error", e[:error]), + label("Location", trace) + ] + end + + double_space "Errors", errors + end + + def generate_obsolete + return if tracker.unused_fingerprints.empty? + + [header("Obsolete Ignore Entries")] + tracker.unused_fingerprints + end + + def generate_templates + out_processor = Brakeman::OutputProcessor.new + + template_rows = {} + tracker.templates.each do |name, template| + template.each_output do |out| + out = out_processor.format out + template_rows[name] ||= [] + template_rows[name] << out.gsub("\n", ";").gsub(/\s+/, " ") + end + end + + double_space "Template Output", template_rows.sort_by { |name, value| name.to_s }.map { |template| + [HighLine.new.color("#{template.first}\n", :cyan)] + template[1] + }.compact + end + + def output_warning w + text_format = tracker.options[:text_fields] || + [:confidence, :category, :check, :message, :code, :file, :line] + + text_format.map do |option| + format_line(w, option) + end.compact + end + + def format_line w, option + case option + when :confidence + label('Confidence', confidence(w.confidence)) + when :category + label('Category', w.warning_type.to_s) + when :cwe + label('CWE', w.cwe_id.join(', ')) + when :check + label('Check', w.check_name) + when :message + label('Message', w.message) + when :code + if w.code + label('Code', format_code(w)) + end + when :file + label('File', warning_file(w)) + when :line + if w.line + label('Line', w.line) + end + when :link + label('Link', w.link) + when :fingerprint + label('Fingerprint', w.fingerprint) + when :category_id + label('Category ID', w.warning_code) + when :render_path + if w.called_from + label('Render Path', w.called_from.join(" > ")) + end + end + end + + def double_space title, values + values = values.map { |v| v.join("\n") }.join("\n\n") + [header(title), values] + end + + def format_code w + if @highlight_user_input and w.user_input + w.format_with_user_input do |exp, text| + HighLine.new.color(text, :yellow) + end + else + w.format_code + end + end + + def confidence c + case c + when 0 + HighLine.new.color("High", :red) + when 1 + HighLine.new.color("Medium", :yellow) + when 2 + HighLine.new.color("Weak", :none) + end + end + + def label l, value, color = :green + "#{HighLine.new.color(l, color)}: #{value}" + end + + def header text + HighLine.new.color("== #{text} ==\n", :bold, :magenta) + end + + # ONLY used for generate_controllers to avoid duplication + def render_array name, cols, values, locals + controllers = values.map do |controller_name, parent, includes, routes| + c = [ label("Controller", controller_name) ] + c << label("Parent", parent) unless parent.empty? + c << label("Includes", includes) unless includes.empty? + c << label("Routes", routes) + end + + double_space "Controller Overview", controllers + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/controller_overview.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/controller_overview.html.erb new file mode 100644 index 000000000..c2d9cf623 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/controller_overview.html.erb @@ -0,0 +1,22 @@ +<h2>Controllers</h2> + +<table> + <thead> + <tr> + <th>Name</th> + <th>Parent</th> + <th>Includes</th> + <th>Routes</th> + </tr> + </thead> + <tbody> + <% controller_rows.each do |row| %> + <tr> + <td><%= row['Name'] %></td> + <td><%= row['Parent'] %></td> + <td><%= row['Includes'] %></td> + <td><%= row['Routes'] %></td> + </tr> + <% end %> + </tbody> +</table> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/controller_warnings.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/controller_warnings.html.erb new file mode 100644 index 000000000..ffbbf6080 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/controller_warnings.html.erb @@ -0,0 +1,23 @@ +<p>Controller Warnings</p> +<table> + <thead> + <tr> + <th>Confidence</th> + <th>Controller</th> + <th>Warning Type</th> + <th>CWE ID</th> + <th>Message</th> + </tr> + </thead> + <tbody> + <% warnings.each do |warning| %> + <tr> + <td><%= warning['Confidence']%></td> + <td><%= warning['Controller']%></td> + <td><%= warning['Warning Type']%></td> + <td><%= warning['CWE ID']%></td> + <td><%= warning['Message']%></td> + </tr> + <% end %> + </tbody> +</table> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/error_overview.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/error_overview.html.erb new file mode 100644 index 000000000..01c5ca4ad --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/error_overview.html.erb @@ -0,0 +1,29 @@ +<div onClick="toggle('errors_table');"> <h2>Exceptions raised during the analysis (click to see them)</h2 ></div> + <div> + <div id='errors_table' style='display:none'> + <table> + <thead> + <tr> + <th>Error</th> + <th>Location</th> + </tr> + </thead> + <tbody> + <% tracker.errors.each do |warning| %> + <tr> + <td><%= CGI.escapeHTML warning[:error] %></td> + <td> + <% if tracker.options[:debug] %> + <% warning[:backtrace].each do |line| %> + <%= line %><br/> + <% end %> + <% else %> + <%= warning[:backtrace][0] %> + <% end %> + </td> + </tr> + <% end %> + </tbody> + </table> + </div> + </div> diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/header.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/header.html.erb new file mode 100644 index 000000000..82870fb01 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/header.html.erb @@ -0,0 +1,63 @@ +<!DOCTYPE HTML SYSTEM> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>Brakeman Report + + + + + + + +

    Brakeman Report

    + + + + + + + + + + + + + + + + + + + +
    Application PathRails VersionBrakeman VersionReport TimeChecks Performed
    <%= tracker.app_path %><%= rails_version %><%= brakeman_version %> + <%= tracker.start_time %>

    + <%= tracker.duration %> seconds +
    <%= checks.checks_run.sort.join(", ") %>
    +
    diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/ignored_warnings.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/ignored_warnings.html.erb new file mode 100644 index 000000000..28870ccda --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/ignored_warnings.html.erb @@ -0,0 +1,27 @@ +

    <%= warnings.length %> Ignored Warnings (click to see them)

    + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/model_warnings.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/model_warnings.html.erb new file mode 100644 index 000000000..073cd1e63 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/model_warnings.html.erb @@ -0,0 +1,23 @@ +

    Model Warnings

    + + + + + + + + + + + + <% warnings.each do |warning| %> + + + + + + + + <% end %> + +
    ConfidenceModelWarning TypeCWE IDMessage
    <%= warning['Confidence']%><%= warning['Model']%><%= warning['Warning Type']%><%= warning['CWE ID']%><%= warning['Message']%>
    \ No newline at end of file diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/overview.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/overview.html.erb new file mode 100644 index 000000000..20aa4d4c4 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/overview.html.erb @@ -0,0 +1,38 @@ +

    Summary

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <% if warnings_summary['Ignored Warnings'] %> + + + + + <% end %> + +
    Scanned/ReportedTotal
    Controllers<%= tracker.controllers.length %>
    Models<%= tracker.models.length - 1 %>
    Templates<%= number_of_templates %>
    Errors<%= tracker.errors.length %>
    Security Warnings<%= warnings %> (<%= warnings_summary[:high_confidence] %>)
    Ignored Warnings<%= ignored_warnings %>
    +
    diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/security_warnings.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/security_warnings.html.erb new file mode 100644 index 000000000..99c715062 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/security_warnings.html.erb @@ -0,0 +1,25 @@ +

    Security Warnings

    + + + + + + + + + + + + + <% warnings.each do |warning| %> + + + + + + + + + <% end %> + +
    ConfidenceClassMethodWarning TypeCWE IDMessage
    <%= warning['Confidence']%><%= warning['Class']%><%= warning['Method']%><%= warning['Warning Type']%><%= warning['CWE ID']%><%= warning['Message']%>
    diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/template_overview.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/template_overview.html.erb new file mode 100644 index 000000000..d0aef0231 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/template_overview.html.erb @@ -0,0 +1,21 @@ +

    Templates

    + +<% template_rows.each do |template| %> + +

    <%= template[0] %>

    + + + + + + + + <% template[1].each do |call| %> + + + + <% end %> + +
    Output
    <%= call %>
    + +<% end %> \ No newline at end of file diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/view_warnings.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/view_warnings.html.erb new file mode 100644 index 000000000..428d76b8e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/view_warnings.html.erb @@ -0,0 +1,36 @@ +

    View Warnings

    + + + + + + + + + + + + <% warnings.each_with_index do |warning, i| %> + + + + + + + + <% end %> + +
    ConfidenceTemplateWarning TypeCWE IDMessage
    <%= warning['Confidence']%> + <% if warning['Called From'] and warning['Called From'].length > 1 %> +
    +
    + <%= warning['Template'] %> +
    +
    + <%= warning['Called From'].join(' → ') %> → <%= warning['Template Name'] %> +
    +
    + <% else %> + <%= warning['Template']%> + <% end %> +
    <%= warning['Warning Type']%><%= warning['CWE ID']%><%= warning['Message']%>
    diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/warning_overview.html.erb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/warning_overview.html.erb new file mode 100644 index 000000000..5fa75e5ed --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/report/templates/warning_overview.html.erb @@ -0,0 +1,17 @@ + + + + + + + + + <% types.sort.each do |warning_type| %> + + + + + <% end %> + +
    Warning TypeTotal
    <%= warning_type %><%= warnings_summary[warning_type] %>
    +
    diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/rescanner.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/rescanner.rb new file mode 100644 index 000000000..899230731 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/rescanner.rb @@ -0,0 +1,138 @@ +require 'brakeman/scanner' +require 'brakeman/util' +require 'brakeman/differ' + +#Class for rescanning changed files after an initial scan +class Brakeman::Rescanner < Brakeman::Scanner + include Brakeman::Util + KNOWN_TEMPLATE_EXTENSIONS = Brakeman::TemplateParser::KNOWN_TEMPLATE_EXTENSIONS + + #Create new Rescanner to scan changed files + def initialize options, processor, changed_files + super(options) + + @old_tracker = processor.tracked_events + + @paths = changed_files.map {|f| tracker.app_tree.file_path(f) } + @old_results = @old_tracker.filtered_warnings.dup #Old warnings from previous scan + @changes = nil #True if files had to be rescanned + @reindex = Set.new + end + + #Runs checks. + #Will rescan files if they have not already been scanned + def recheck + rescan if @changes.nil? + + if @changes + tracker.run_checks + Brakeman.filter_warnings(tracker, options) # Actually sets ignored_filter + Brakeman::RescanReport.new @old_results, tracker + else + # No changes, fake no new results + Brakeman::RescanReport.new @old_results, @old_tracker + end + end + + #Rescans changed files + def rescan + raise "Cannot rescan: set `support_rescanning: true`" unless @old_tracker.options[:support_rescanning] + + tracker.file_cache = @old_tracker.pristine_file_cache + + template_paths = [] + ruby_paths = [] + + # Remove changed files from the cache. + # Collect files to re-parse. + @paths.each do |path| + file_cache.delete path + + if path.exists? + if path.relative.match? KNOWN_TEMPLATE_EXTENSIONS + template_paths << path + elsif path.relative.end_with? '.rb' + ruby_paths << path + end + end + end + + # Try to skip rescanning files that do not impact + # Brakeman results + if @paths.all? { |path| ignorable? path } + @changes = false + else + @changes = true + process(ruby_paths:, template_paths:) + end + + self + end + + IGNORE_PATTERN = /\.(md|txt|js|ts|tsx|json|scss|css|xml|ru|png|jpg|pdf|gif|svg|webm|ttf|sql)$/ + + def ignorable? path + path.relative.match? IGNORE_PATTERN + end +end + +#Class to make reporting of rescan results simpler to deal with +class Brakeman::RescanReport + include Brakeman::Util + attr_reader :old_results, :new_results + + def initialize old_results, tracker + @tracker = tracker + @old_results = old_results + @all_warnings = nil + @diff = nil + end + + #Returns true if any warnings were found (new or old) + def any_warnings? + not all_warnings.empty? + end + + #Returns an array of all warnings found + def all_warnings + @all_warnings ||= @tracker.filtered_warnings + end + + #Returns an array of warnings which were in the old report but are not in the + #new report after rescanning + def fixed_warnings + diff[:fixed] + end + + #Returns an array of warnings which were in the new report but were not in + #the old report + def new_warnings + diff[:new] + end + + #Returns true if there are any new or fixed warnings + def warnings_changed? + not (diff[:new].empty? and diff[:fixed].empty?) + end + + #Returns a hash of arrays for :new and :fixed warnings + def diff + @diff ||= Brakeman::Differ.new(all_warnings, @old_results).diff + end + + #Returns an array of warnings which were in the old report and the new report + def existing_warnings + @old ||= all_warnings.select do |w| + not new_warnings.include? w + end + end + + #Output total, fixed, and new warnings + def to_s + <<~OUTPUT + Total warnings: #{all_warnings.length} + Fixed warnings: #{fixed_warnings.length} + New warnings: #{new_warnings.length} + OUTPUT + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/scanner.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/scanner.rb new file mode 100644 index 000000000..7e5c14d89 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/scanner.rb @@ -0,0 +1,459 @@ +begin + Brakeman.load_brakeman_dependency 'ruby_parser' + require 'ruby_parser/bm_sexp.rb' + require 'ruby_parser/bm_sexp_processor.rb' + require 'brakeman/processor' + require 'brakeman/app_tree' + require 'brakeman/file_parser' + require 'brakeman/parsers/template_parser' + require 'brakeman/processors/lib/file_type_detector' + require 'brakeman/tracker/file_cache' +rescue LoadError => e + $stderr.puts e.message + $stderr.puts "Please install the appropriate dependency." + exit(-1) +end + +#Scans the Rails application. +class Brakeman::Scanner + attr_reader :options + + #Pass in path to the root of the Rails application + def initialize options, processor = nil + @options = options + @app_tree = Brakeman::AppTree.from_options(options) + + if (!@app_tree.root || !@app_tree.exists?("app")) && !options[:force_scan] + message = "Please supply the path to a Rails application (looking in #{@app_tree.root}).\n" << + " Use `--force` to run a scan anyway." + + raise Brakeman::NoApplication, message + end + + @processor = processor || Brakeman::Processor.new(@app_tree, options) + @show_timing = tracker.options[:debug] || tracker.options[:show_timing] + @per_file_timing = tracker.options[:debug] && tracker.options[:show_timing] + end + + #Returns the Tracker generated from the scan + def tracker + @processor.tracked_events + end + + def file_cache + tracker.file_cache + end + + def process_step description + Brakeman.notify "#{description}...".ljust(40) + + if @show_timing + start_t = Time.now + yield + duration = Time.now - start_t + + Brakeman.notify "(#{description}) Duration: #{duration} seconds" + else + yield + end + end + + def process_step_file description + if @per_file_timing + Brakeman.notify "Processing #{description}" + + start_t = Time.now + yield + duration = Time.now - start_t + + Brakeman.notify "(#{description}) Duration: #{duration} seconds" + else + yield + end + end + + #Process everything in the Rails application + def process(ruby_paths: nil, template_paths: nil) + process_step 'Processing gems' do + process_gems + end + + process_step 'Processing configuration' do + guess_rails_version + process_config + end + + # - + # If ruby_paths or template_paths are set, + # only parse those files. The rest will be fetched + # from the file cache. + # + # Otherwise, parse everything normally. + # + astfiles = nil + process_step 'Finding files' do + ruby_paths ||= tracker.app_tree.ruby_file_paths + template_paths ||= tracker.app_tree.template_paths + end + + process_step 'Parsing files' do + astfiles = parse_files(ruby_paths: ruby_paths, template_paths: template_paths) + end + + process_step 'Detecting file types' do + detect_file_types(astfiles) + end + + tracker.save_file_cache! if support_rescanning? + # - + + process_step 'Processing initializers' do + process_initializers + end + + process_step 'Processing libs' do + process_libs + end + + process_step 'Processing routes' do + process_routes + end + + process_step 'Processing templates' do + process_templates + end + + process_step 'Processing data flow in templates' do + process_template_data_flows + end + + process_step 'Processing models' do + process_models + end + + process_step 'Processing controllers' do + process_controllers + end + + process_step 'Processing data flow in controllers' do + process_controller_data_flows + end + + process_step 'Indexing call sites' do + index_call_sites + end + + tracker + end + + def parse_files(ruby_paths:, template_paths:) + fp = Brakeman::FileParser.new(tracker.app_tree, tracker.options[:parser_timeout], tracker.options[:parallel_checks], tracker.options[:use_prism]) + + fp.parse_files ruby_paths + + template_parser = Brakeman::TemplateParser.new(tracker, fp) + + fp.read_files(template_paths) do |path, contents| + template_parser.parse_template(path, contents) + end + + # Collect errors raised during parsing + tracker.add_errors(fp.errors) + + fp.file_list + end + + def detect_file_types(astfiles) + detector = Brakeman::FileTypeDetector.new + + astfiles.each do |file| + if file.is_a? Brakeman::TemplateParser::TemplateFile + file_cache.add_file file, :template + else + type = detector.detect_type(file) + + unless type == :skip + if file_cache.valid_type? type + file_cache.add_file(file, type) + else + raise "Unexpected file type: #{type.inspect}" + end + end + end + end + end + + #Process config/environment.rb and config/gems.rb + # + #Stores parsed information in tracker.config + def process_config + # Sometimes folks like to put constants in environment.rb + # so let's always process it even for newer Rails versions + process_config_file "environment.rb" + + if options[:rails3] or options[:rails4] or options[:rails5] or options[:rails6] + process_config_file "application.rb" + process_config_file "environments/production.rb" + else + process_config_file "gems.rb" + end + + if @app_tree.exists?("vendor/plugins/rails_xss") or + options[:rails3] or options[:escape_html] + + tracker.config.escape_html = true + Brakeman.notify "[Notice] Escaping HTML by default" + end + + if @app_tree.exists? ".ruby-version" + if version = @app_tree.file_path(".ruby-version").read[/(\d\.\d.\d+)/] + tracker.config.set_ruby_version version, @app_tree.file_path(".ruby-version"), 1 + end + end + + tracker.config.load_rails_defaults + end + + def process_config_file file + path = @app_tree.file_path("config/#{file}") + + if path.exists? + @processor.process_config(parse_ruby_file(path), path) + end + + rescue => e + Brakeman.notify "[Notice] Error while processing #{path}" + tracker.error e.exception(e.message + "\nwhile processing #{path}"), e.backtrace + end + + private :process_config_file + + #Process Gemfile + def process_gems + gem_files = {} + gem_file_names = ['Gemfile', 'gems.rb'] + lock_file_names = ['Gemfile.lock', 'gems.locked'] + + if tracker.options[:gemfile] + name = tracker.options[:gemfile] + gem_file_names.unshift name + lock_file_names.unshift "#{name}.lock" + end + + gem_file_names.each do |name| + if @app_tree.exists? name + file = @app_tree.file_path(name) + gem_files[:gemfile] = { :src => parse_ruby_file(file), :file => file } + break + end + end + + lock_file_names.each do |name| + if @app_tree.exists? name + file = @app_tree.file_path(name) + gem_files[:gemlock] = { :src => file.read, :file => file } + break + end + end + + if @app_tree.gemspec + gem_files[:gemspec] = { :src => parse_ruby_file(@app_tree.gemspec), :file => @app_tree.gemspec } + end + + if not gem_files.empty? + @processor.process_gems gem_files + end + rescue => e + Brakeman.notify "[Notice] Error while processing Gemfile." + tracker.error e.exception(e.message + "\nWhile processing Gemfile"), e.backtrace + end + + #Set :rails3/:rails4 option if version was not determined from Gemfile + def guess_rails_version + unless tracker.options[:rails3] or tracker.options[:rails4] + if @app_tree.exists?("script/rails") + tracker.options[:rails3] = true + Brakeman.notify "[Notice] Detected Rails 3 application" + elsif @app_tree.exists?("app/channels") + tracker.options[:rails3] = true + tracker.options[:rails4] = true + tracker.options[:rails5] = true + Brakeman.notify "[Notice] Detected Rails 5 application" + elsif not @app_tree.exists?("script") + tracker.options[:rails3] = true + tracker.options[:rails4] = true + Brakeman.notify "[Notice] Detected Rails 4 application" + end + end + end + + #Process all the .rb files in config/initializers/ + # + #Adds parsed information to tracker.initializers + def process_initializers + track_progress file_cache.initializers do |path, init| + process_step_file path do + process_initializer init + end + end + end + + #Process an initializer + def process_initializer init + @processor.process_initializer(init.path, init.ast) + end + + #Process all .rb in lib/ + # + #Adds parsed information to tracker.libs. + def process_libs + if options[:skip_libs] + Brakeman.notify '[Skipping]' + return + end + + libs = file_cache.libs.sort_by { |path, _| path } + + track_progress libs do |path, lib| + process_step_file path do + process_lib lib + end + end + end + + #Process a library + def process_lib lib + @processor.process_lib lib.ast, lib.path + end + + #Process config/routes.rb + # + #Adds parsed information to tracker.routes + def process_routes + if @app_tree.exists?("config/routes.rb") + file = @app_tree.file_path("config/routes.rb") + if routes_sexp = parse_ruby_file(file) + @processor.process_routes routes_sexp + else + Brakeman.notify "[Notice] Error while processing routes - assuming all public controller methods are actions." + options[:assume_all_routes] = true + end + else + Brakeman.notify "[Notice] No route information found" + end + end + + #Process all .rb files in controllers/ + # + #Adds processed controllers to tracker.controllers + def process_controllers + controllers = file_cache.controllers.sort_by { |path, _| path } + + track_progress controllers do |path, controller| + process_step_file path do + process_controller controller + end + end + end + + def process_controller_data_flows + controllers = tracker.controllers.sort_by { |name, _| name } + + track_progress controllers, "controllers" do |name, controller| + process_step_file name do + controller.src.each do |file, src| + @processor.process_controller_alias name, src, nil, file + end + end + end + + #No longer need these processed filter methods + tracker.filter_cache.clear + end + + def process_controller astfile + begin + @processor.process_controller(astfile.ast, astfile.path) + rescue => e + tracker.error e.exception(e.message + "\nWhile processing #{astfile.path}"), e.backtrace + end + end + + #Process all views and partials in views/ + # + #Adds processed views to tracker.views + def process_templates + templates = file_cache.templates.sort_by { |path, _| path } + + track_progress templates, "templates" do |path, template| + process_step_file path do + process_template template + end + end + end + + def process_template template + @processor.process_template(template.name, template.ast, template.type, nil, template.path) + end + + def process_template_data_flows + templates = tracker.templates.sort_by { |name, _| name } + + track_progress templates, "templates" do |name, template| + process_step_file name do + @processor.process_template_alias template + end + end + end + + #Process all the .rb files in models/ + # + #Adds the processed models to tracker.models + def process_models + models = file_cache.models.sort_by { |path, _| path } + + track_progress models do |path, model| + process_step_file path do + process_model model + end + end + end + + def process_model astfile + @processor.process_model(astfile.ast, astfile.path) + end + + def track_progress list, type = "files" + total = list.length + current = 0 + list.each do |item| + report_progress current, total, type + current += 1 + yield item + end + end + + def report_progress(current, total, type = "files") + return unless @options[:report_progress] + $stderr.print " #{current}/#{total} #{type} processed\r" + end + + def index_call_sites + tracker.index_call_sites + end + + def parse_ruby_file file + fp = Brakeman::FileParser.new(tracker.app_tree, tracker.options[:parser_timeout], false, tracker.options[:use_prism]) + fp.parse_ruby(file.read, file) + rescue Exception => e + tracker.error(e) + nil + end + + def support_rescanning? + tracker.options[:support_rescanning] + end +end + +# This is to allow operation without loading the Haml library +module Haml; class Error < StandardError; end; end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker.rb new file mode 100644 index 000000000..938b219c1 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker.rb @@ -0,0 +1,450 @@ +require 'set' +require 'brakeman/call_index' +require 'brakeman/checks' +require 'brakeman/report' +require 'brakeman/processors/lib/find_call' +require 'brakeman/processors/lib/find_all_calls' +require 'brakeman/tracker/config' +require 'brakeman/tracker/constants' + +#The Tracker keeps track of all the processed information. +class Brakeman::Tracker + attr_accessor :controllers, :constants, :templates, :models, :errors, + :checks, :initializers, :config, :routes, :processor, :libs, + :template_cache, :options, :filter_cache, :start_time, :end_time, + :duration, :ignored_filter, :app_tree, :file_cache, :pristine_file_cache + + #Place holder when there should be a model, but it is not + #clear what model it will be. + UNKNOWN_MODEL = :BrakemanUnresolvedModel + + #Creates a new Tracker. + # + #The Processor argument is only used by other Processors + #that might need to access it. + def initialize(app_tree, processor = nil, options = {}) + @app_tree = app_tree + @processor = processor + @options = options + @file_cache = Brakeman::FileCache.new + @pristine_file_cache = nil + + reset_all + end + + def reset_all + @templates = {} + @controllers = {} + + #Initialize models with the unknown model so + #we can match models later without knowing precisely what + #class they are. + @models = {} + @models[UNKNOWN_MODEL] = Brakeman::Model.new(UNKNOWN_MODEL, nil, @app_tree.file_path("NOT_REAL.rb"), nil, self) + + @method_cache = {} + @routes = {} + @initializers = {} + @errors = [] + @libs = {} + @constants = Brakeman::Constants.new + @checks = nil + @processed = nil + @template_cache = Set.new + @filter_cache = {} + @call_index = nil + @config = Brakeman::Config.new(self) + @start_time = Time.now + @end_time = nil + @duration = nil + end + + def save_file_cache! + @pristine_file_cache = @file_cache.dup + end + + #Add an error to the list. If no backtrace is given, + #the one from the exception will be used. + def error exception, backtrace = nil + backtrace ||= exception.backtrace + unless backtrace.is_a? Array + backtrace = [ backtrace ] + end + + Brakeman.debug exception + Brakeman.debug backtrace + + @errors << { + :exception => exception, + :error => exception.to_s.gsub("\n", " "), + :backtrace => backtrace + } + end + + def add_errors exceptions + exceptions.each do |e| + error(e) + end + end + + #Run a set of checks on the current information. Results will be stored + #in Tracker#checks. + def run_checks + @checks = Brakeman::Checks.run_checks(self) + + @end_time = Time.now + @duration = @end_time - @start_time + @checks + end + + def app_path + @app_path ||= File.expand_path @options[:app_path] + end + + #Iterate over all methods in controllers and models. + def each_method + classes = [self.controllers, self.models] + + if @options[:index_libs] + classes << self.libs + end + + classes.each do |set| + set.each do |set_name, collection| + collection.each_method do |method_name, definition| + src = definition.src + yield src, set_name, method_name, definition.file + end + end + end + end + + #Iterates over each template, yielding the name and the template. + #Prioritizes templates which have been rendered. + def each_template + if @processed.nil? + @processed, @rest = templates.keys.sort_by{|template| template.to_s}.partition { |k| k.to_s.include? "." } + end + + @processed.each do |k| + yield k, templates[k] + end + + @rest.each do |k| + yield k, templates[k] + end + end + + + def each_class + classes = [self.controllers, self.models] + + if @options[:index_libs] + classes << self.libs + end + + classes.each do |set| + set.each do |set_name, collection| + collection.src.each do |file, src| + yield src, set_name, file + end + end + end + end + + #Find a method call. + # + #Options: + # * :target => target name(s) + # * :method => method name(s) + # * :chained => search in method chains + # + #If :target => false or :target => nil, searches for methods without a target. + #Targets and methods can be specified as a symbol, an array of symbols, + #or a regular expression. + # + #If :chained => true, matches target at head of method chain and method at end. + # + #For example: + # + # find_call :target => User, :method => :all, :chained => true + # + #could match + # + # User.human.active.all(...) + # + def find_call options + index_call_sites unless @call_index + @call_index.find_calls options + end + + #Searches the initializers for a method call + def check_initializers target, method + finder = Brakeman::FindCall.new target, method, self + + initializers.sort.each do |name, initializer| + finder.process_source initializer + end + + finder.matches + end + + #Returns a Report with this Tracker's information + def report + Brakeman::Report.new(self) + end + + def warnings + self.checks.all_warnings + end + + def filtered_warnings + if self.ignored_filter + self.warnings.reject do |w| + self.ignored_filter.ignored? w + end + else + self.warnings + end + end + + def unused_fingerprints + return [] unless self.ignored_filter + self.ignored_filter.obsolete_fingerprints + end + + def add_constant name, value, context = nil + @constants.add name, value, context unless @options[:disable_constant_tracking] + end + + # This method does not return all constants at this time, + # just ones with "simple" values. + def constant_lookup name + @constants.get_simple_value name unless @options[:disable_constant_tracking] + end + + def find_class name + [@controllers, @models, @libs].each do |collection| + if c = collection[name] + return c + end + end + + nil + end + + def find_method method_name, class_name, method_type = :instance + return nil unless method_name.is_a? Symbol + + klass = find_class(class_name) + return nil unless klass + + cache_key = [klass, method_name, method_type] + + if method = @method_cache[cache_key] + return method + end + + if method = klass.get_method(method_name, method_type) + return method + else + # Check modules included for method definition + # TODO: only for instance methods, otherwise check extends! + klass.includes.each do |included_name| + if method = find_method(method_name, included_name, method_type) + return (@method_cache[cache_key] = method) + end + end + + # Not in any included modules, check the parent + @method_cache[cache_key] = find_method(method_name, klass.parent, method_type) + end + end + + def index_call_sites + finder = Brakeman::FindAllCalls.new self + + self.each_method do |definition, set_name, method_name, file| + finder.process_source definition, :class => set_name, :method => method_name, :file => file + end + + self.each_class do |definition, set_name, file| + finder.process_source definition, :class => set_name, :file => file + end + + self.each_template do |_name, template| + finder.process_source template.src, :template => template, :file => template.file + end + + self.initializers.each do |file_name, src| + finder.process_all_source src, :file => file_name + end + + @call_index = Brakeman::CallIndex.new finder.calls + end + + #Reindex call sites + # + #Takes a set of symbols which can include :templates, :models, + #or :controllers + # + #This will limit reindexing to the given sets + def reindex_call_sites locations + #If reindexing templates, models, controllers, + #just redo everything. + if locations.length == 3 + return index_call_sites + end + + if locations.include? :templates + @call_index.remove_template_indexes + end + + classes_to_reindex = Set.new + method_sets = [] + + if locations.include? :models + classes_to_reindex.merge self.models.keys + method_sets << self.models + end + + if locations.include? :controllers + classes_to_reindex.merge self.controllers.keys + method_sets << self.controllers + end + + if locations.include? :libs + classes_to_reindex.merge self.libs.keys + method_sets << self.libs + end + + if locations.include? :initializers + self.initializers.each do |file_name, src| + @call_index.remove_indexes_by_file file_name + end + end + + @call_index.remove_indexes_by_class classes_to_reindex + + finder = Brakeman::FindAllCalls.new self + + method_sets.each do |set| + set.each do |set_name, info| + info.each_method do |method_name, definition| + src = definition.src + finder.process_source src, :class => set_name, :method => method_name, :file => definition.file + end + end + end + + if locations.include? :templates + self.each_template do |_name, template| + finder.process_source template.src, :template => template, :file => template.file + end + end + + if locations.include? :initializers + self.initializers.each do |file_name, src| + finder.process_all_source src, :file => file_name + end + end + + @call_index.index_calls finder.calls + end + + #Clear information related to templates. + #If :only_rendered => true, will delete templates rendered from + #controllers (but not those rendered from other templates) + def reset_templates options = { :only_rendered => false } + if options[:only_rendered] + @templates.delete_if do |_name, template| + template.rendered_from_controller? + end + else + @templates = {} + end + @processed = nil + @rest = nil + @template_cache.clear + end + + #Clear information related to template + def reset_template name + name = name.to_sym + @templates.delete name + @processed = nil + @rest = nil + @template_cache.clear + end + + #Clear information related to model + def reset_model path + model_name = nil + + @models.each do |name, model| + if model.files.include?(path) + model_name = name + break + end + end + + @models.delete(model_name) + end + + #Clear information related to model + def reset_lib path + lib_name = nil + + @libs.each do |name, lib| + if lib.files.include?(path) + lib_name = name + break + end + end + + @libs.delete lib_name + end + + def reset_controller path + controller_name = nil + + #Remove from controller + @controllers.each do |name, controller| + if controller.files.include?(path) + controller_name = name + + #Remove templates rendered from this controller + @templates.each do |template_name, template| + if template.render_path and template.render_path.include_controller? name + reset_template template_name + @call_index.remove_template_indexes template_name + end + end + + #Remove calls indexed from this controller + @call_index.remove_indexes_by_class [name] + break + end + end + @controllers.delete controller_name + end + + #Clear information about routes + def reset_routes + @routes = {} + end + + def reset_initializer path + @initializers.delete_if do |file, src| + path.relative.include? file + end + + @call_index.remove_indexes_by_file path + end + + # Call this to be able to marshal the Tracker + def marshallable + @app_tree.marshallable + self + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/collection.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/collection.rb new file mode 100644 index 000000000..0255b1aee --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/collection.rb @@ -0,0 +1,144 @@ +require 'brakeman/util' +require 'brakeman/tracker/method_info' + +module Brakeman + class Collection + include Brakeman::Util + + attr_reader :collection, :files, :includes, :name, :options, :parent, :src, :tracker + + def initialize name, parent, file_name, src, tracker + @name = name + @parent = parent + @files = [] + @src = {} + @includes = [] + @methods = { :public => {}, :private => {}, :protected => {} } + @class_methods = {} + @simple_methods = { :class => {}, instance: {} } + @options = {} + @tracker = tracker + + add_file file_name, src + end + + def ancestor? parent, seen={} + seen[self.name] = true + + if self.parent == parent or self.name == parent or seen[self.parent] + true + elsif parent_model = collection[self.parent] + parent_model.ancestor? parent, seen + else + false + end + end + + def add_file file_name, src + @files << file_name unless @files.include? file_name + @src[file_name] = src + end + + def add_include class_name + @includes << class_name unless ancestor?(class_name) + end + + def add_option name, exp + @options[name] ||= [] + @options[name] << exp + end + + def add_method visibility, name, src, file_name + meth_info = Brakeman::MethodInfo.new(name, src, self, file_name) + add_simple_method_maybe meth_info + + if src.node_type == :defs + @class_methods[name] = meth_info + + # TODO fix this weirdness + name = :"#{src[1]}.#{name}" + end + + @methods[visibility][name] = meth_info + end + + def each_method + @methods.each do |_vis, meths| + meths.each do |name, info| + yield name, info + end + end + end + + def get_method name, type = :instance + case type + when :class + get_class_method name + when :instance + get_instance_method name + else + raise "Unexpected method type: #{type.inspect}" + end + end + + def get_instance_method name + @methods.each do |_vis, meths| + if meths[name] + return meths[name] + end + end + + nil + end + + def get_class_method name + @class_methods[name] + end + + def file + @files.first + end + + def top_line + if sexp? @src[file] + @src[file].line + else + @src.each_value do |source| + if sexp? source + return source.line + end + end + end + end + + def methods_public + @methods[:public] + end + + def get_simple_method_return_value type, name + @simple_methods[type][name] + end + + private + + def add_simple_method_maybe meth_info + if meth_info.very_simple_method? + add_simple_method meth_info + end + end + + def add_simple_method meth_info + name = meth_info.name + value = meth_info.return_value + + case meth_info.src.node_type + when :defn + @simple_methods[:instance][name] = value + when :defs + @simple_methods[:class][name] = value + else + raise "Expected sexp type: #{src.node_type}" + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/config.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/config.rb new file mode 100644 index 000000000..e4bc37d93 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/config.rb @@ -0,0 +1,288 @@ +require 'brakeman/util' + +module Brakeman + class Config + include Util + + attr_reader :gems, :rails, :ruby_version, :tracker + attr_writer :erubis, :escape_html + + def initialize tracker + @tracker = tracker + @rails = {} + @gems = {} + @settings = {} + @escape_html = nil + @erubis = nil + @ruby_version = nil + @rails_version = nil + end + + def default_protect_from_forgery? + if version_between? "5.2.0.beta1", "9.9.9" + if @rails.dig(:action_controller, :default_protect_from_forgery) == Sexp.new(:true) + return true + end + end + + false + end + + def erubis? + @erubis + end + + def escape_html? + @escape_html + end + + def escape_html_entities_in_json? + #TODO add version-specific information here + true? @rails.dig(:active_support, :escape_html_entities_in_json) + end + + def escape_filter_interpolations? + # TODO see if app is actually turning this off itself + has_gem?(:haml) and + version_between? "5.0.0", "5.99", gem_version(:haml) + end + + def whitelist_attributes? + @rails.dig(:active_record, :whitelist_attributes) == Sexp.new(:true) + end + + def gem_version name + extract_version @gems.dig(name.to_sym, :version) + end + + def add_gem name, version, file, line + name = name.to_sym + @gems[name] = { + :version => version, + :file => file, + :line => line + } + end + + def has_gem? name + !!@gems[name.to_sym] + end + + def get_gem name + @gems[name.to_sym] + end + + def set_rails_version version = nil + version = if version + # Only used by Rails2ConfigProcessor right now + extract_version(version) + else + gem_version(:rails) || + gem_version(:railties) || + gem_version(:activerecord) + end + + if version + @rails_version = version + + if tracker.options[:rails3].nil? and tracker.options[:rails4].nil? + if @rails_version.start_with? "3" + tracker.options[:rails3] = true + Brakeman.notify "[Notice] Detected Rails 3 application" + elsif @rails_version.start_with? "4" + tracker.options[:rails3] = true + tracker.options[:rails4] = true + Brakeman.notify "[Notice] Detected Rails 4 application" + elsif @rails_version.start_with? "5" + tracker.options[:rails3] = true + tracker.options[:rails4] = true + tracker.options[:rails5] = true + Brakeman.notify "[Notice] Detected Rails 5 application" + elsif @rails_version.start_with? "6" + tracker.options[:rails3] = true + tracker.options[:rails4] = true + tracker.options[:rails5] = true + tracker.options[:rails6] = true + Brakeman.notify "[Notice] Detected Rails 6 application" + elsif @rails_version.start_with? "7" + tracker.options[:rails3] = true + tracker.options[:rails4] = true + tracker.options[:rails5] = true + tracker.options[:rails6] = true + tracker.options[:rails7] = true + Brakeman.notify "[Notice] Detected Rails 7 application" + elsif @rails_version.start_with? "8" + tracker.options[:rails3] = true + tracker.options[:rails4] = true + tracker.options[:rails5] = true + tracker.options[:rails6] = true + tracker.options[:rails7] = true + tracker.options[:rails8] = true + Brakeman.notify "[Notice] Detected Rails 8 application" + end + end + end + + if get_gem :rails_xss + @escape_html = true + Brakeman.notify "[Notice] Escaping HTML by default" + end + end + + def rails_version + # This needs to be here because Util#rails_version calls Tracker::Config#rails_version + # but Tracker::Config includes Util... + @rails_version + end + + def set_ruby_version version, file, line + @ruby_version = extract_version(version) + add_gem :ruby, @ruby_version, file, line + end + + def extract_version version + return unless version.is_a? String + + version[/\d+\.\d+(\.\d+.*)?/] + end + + #Returns true if low_version <= RAILS_VERSION <= high_version + # + #If the Rails version is unknown, returns false. + def version_between? low_version, high_version, current_version = nil + current_version ||= rails_version + return false unless current_version + + low = Gem::Version.new(low_version) + high = Gem::Version.new(high_version) + current = Gem::Version.new(current_version) + + current.between?(low, high) + end + + def session_settings + @rails.dig(:action_controller, :session) + end + + + # Set Rails config option value + # where path is an array of attributes, e.g. + # + # :action_controller, :perform_caching + # + # then this will set + # + # rails[:action_controller][:perform_caching] = value + def set_rails_config value:, path:, overwrite: false + config = self.rails + + path[0..-2].each do |o| + config[o] ||= {} + + option = config[o] + + if not option.is_a? Hash + Brakeman.debug "[Notice] Skipping config setting: #{path.map(&:to_s).join(".")}" + return + end + + config = option + end + + if overwrite || config[path.last].nil? + config[path.last] = value + end + end + + # Load defaults based on config.load_defaults value + # as documented here: https://guides.rubyonrails.org/configuring.html#results-of-config-load-defaults + def load_rails_defaults + return unless node_type? tracker.config.rails[:load_defaults], :lit, :str + + version = tracker.config.rails[:load_defaults].value.to_s + + unless version.match?(/^\d+\.\d+$/) + Brakeman.debug "[Notice] Unknown version: #{tracker.config.rails[:load_defaults]}" + return + end + + true_value = Sexp.new(:true) + false_value = Sexp.new(:false) + + if version >= '5.0' + set_rails_config(value: true_value, path: [:action_controller, :per_form_csrf_tokens]) + set_rails_config(value: true_value, path: [:action_controller, :forgery_protection_origin_check]) + set_rails_config(value: true_value, path: [:active_record, :belongs_to_required_by_default]) + # Note: this may need to be changed, because ssl_options is a Hash + set_rails_config(value: true_value, path: [:ssl_options, :hsts, :subdomains]) + end + + if version >= '5.1' + set_rails_config(value: false_value, path: [:assets, :unknown_asset_fallback]) + set_rails_config(value: true_value, path: [:action_view, :form_with_generates_remote_forms]) + end + + if version >= '5.2' + set_rails_config(value: true_value, path: [:active_record, :cache_versioning]) + set_rails_config(value: true_value, path: [:action_dispatch, :use_authenticated_cookie_encryption]) + set_rails_config(value: true_value, path: [:active_support, :use_authenticated_message_encryption]) + set_rails_config(value: true_value, path: [:active_support, :use_sha1_digests]) + set_rails_config(value: true_value, path: [:action_controller, :default_protect_from_forgery]) + set_rails_config(value: true_value, path: [:action_view, :form_with_generates_ids]) + end + + if version >= '6.0' + set_rails_config(value: Sexp.new(:lit, :zeitwerk), path: [:autoloader]) + set_rails_config(value: false_value, path: [:action_view, :default_enforce_utf8]) + set_rails_config(value: true_value, path: [:action_dispatch, :use_cookies_with_metadata]) + set_rails_config(value: false_value, path: [:action_dispatch, :return_only_media_type_on_content_type]) + set_rails_config(value: Sexp.new(:str, 'ActionMailer::MailDeliveryJob'), path: [:action_mailer, :delivery_job]) + set_rails_config(value: true_value, path: [:active_job, :return_false_on_aborted_enqueue]) + set_rails_config(value: Sexp.new(:lit, :active_storage_analysis), path: [:active_storage, :queues, :analysis]) + set_rails_config(value: Sexp.new(:lit, :active_storage_purge), path: [:active_storage, :queues, :purge]) + set_rails_config(value: true_value, path: [:active_storage, :replace_on_assign_to_many]) + set_rails_config(value: true_value, path: [:active_record, :collection_cache_versioning]) + end + + if version >= '6.1' + set_rails_config(value: true_value, path: [:action_controller, :urlsafe_csrf_tokens]) + set_rails_config(value: Sexp.new(:lit, :lax), path: [:action_dispatch, :cookies_same_site_protection]) + set_rails_config(value: Sexp.new(:lit, 308), path: [:action_dispatch, :ssl_default_redirect_status]) + set_rails_config(value: false_value, path: [:action_view, :form_with_generates_remote_forms]) + set_rails_config(value: true_value, path: [:action_view, :preload_links_header]) + set_rails_config(value: Sexp.new(:lit, 0.15), path: [:active_job, :retry_jitter]) + set_rails_config(value: true_value, path: [:active_record, :has_many_inversing]) + set_rails_config(value: false_value, path: [:active_record, :legacy_connection_handling]) + set_rails_config(value: true_value, path: [:active_storage, :track_variants]) + end + + if version >= '7.0' + video_args = + Sexp.new(:str, "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2") + hash_class = s(:colon2, s(:colon2, s(:const, :OpenSSL), :Digest), :SHA256) + + set_rails_config(value: true_value, path: [:action_controller, :raise_on_open_redirects]) + set_rails_config(value: true_value, path: [:action_controller, :wrap_parameters_by_default]) + set_rails_config(value: Sexp.new(:lit, :json), path: [:action_dispatch, :cookies_serializer]) + set_rails_config(value: false_value, path: [:action_dispatch, :return_only_request_media_type_on_content_type]) + set_rails_config(value: Sexp.new(:lit, 5), path: [:action_mailer, :smtp_timeout]) + set_rails_config(value: false_value, path: [:action_view, :apply_stylesheet_media_default]) + set_rails_config(value: true_value, path: [:ction_view, :button_to_generates_button_tag]) + set_rails_config(value: true_value, path: [:active_record, :automatic_scope_inversing]) + set_rails_config(value: false_value, path: [:active_record, :partial_inserts]) + set_rails_config(value: true_value, path: [:active_record, :verify_foreign_keys_for_fixtures]) + set_rails_config(value: true_value, path: [:active_storage, :multiple_file_field_include_hidden]) + set_rails_config(value: Sexp.new(:lit, :vips), path: [:active_storage, :variant_processor]) + set_rails_config(value: video_args, path: [:active_storage, :video_preview_arguments]) + set_rails_config(value: Sexp.new(:lit, 7.0), path: [:active_support, :cache_format_version]) + set_rails_config(value: true_value, path: [:active_support, :disable_to_s_conversion]) + set_rails_config(value: true_value, path: [:active_support, :executor_around_test_case]) + set_rails_config(value: hash_class, path: [:active_support, :hash_digest_class]) + set_rails_config(value: Sexp.new(:lit, :thread), path: [:active_support, :isolation_level]) + set_rails_config(value: hash_class, path: [:active_support, :key_generator_hash_digest_class]) + set_rails_config(value: true_value, path: [:active_support, :remove_deprecated_time_with_zone_name]) + set_rails_config(value: true_value, path: [:active_support, :use_rfc4122_namespaced_uuids]) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/constants.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/constants.rb new file mode 100644 index 000000000..e9ac82907 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/constants.rb @@ -0,0 +1,173 @@ +require 'brakeman/processors/output_processor' +require 'brakeman/util' + +module Brakeman + class Constant + include Brakeman::Util + + attr_reader :name, :name_array, :file, :value, :context + + def initialize name, value, context = {} + set_name name, context + @value = value + @context = context + + if @context + if @context[:class].is_a? Brakeman::Controller + @context[:class] = @context[:class].name + end + + @file = @context[:file] + end + end + + def line + if @value.is_a? Sexp + @value.line + end + end + + def set_name name, context + @name = name + @name_array = Constants.constant_as_array(name) + end + + def match? name + if name == @name + return true + elsif name.is_a? Sexp and name.node_type == :const and name.value == @name + return true + elsif name.is_a? Symbol and name.value == @name + return true + elsif name.class == Array + name == @name_array or + @name_array.reverse.zip(name.reverse).reduce(true) { |m, a| a[1] ? a[0] == a[1] && m : m } + else + false + end + end + end + + class Constants + include Brakeman::Util + + def initialize + @constants = {} + end + + def size + @constants.length + end + + def [] exp + return unless constant? exp + match = find_constant exp + + if match + match.value + else + nil + end + end + + def find_constant exp + base_name = Constants.get_constant_base_name(exp) + + if @constants.key? base_name + @constants[base_name].find do |c| + if c.match? exp + return c + end + end + + name_array = Constants.constant_as_array(exp) + + # Avoid losing info about dynamic constant values + return unless name_array.all? { |n| constant? n or n.is_a? Symbol } + + @constants[base_name].find do |c| + if c.match? name_array + return c + end + end + end + + nil + end + + def find_all exp + base_name = Constants.get_constant_base_name(exp) + @constants[base_name] + end + + def add name, value, context = nil + if call? value and value.method == :freeze + value = value.target + end + + base_name = Constants.get_constant_base_name(name) + @constants[base_name] ||= [] + @constants[base_name] << Constant.new(name, value, context) + end + + # Returns constant values that are not too complicated. + # Right now that means literal values (string, array, etc.) + # or calls on Dir.glob(..).whatever. + def get_simple_value name + if x = self[name] and (literal? x or dir_glob? x) + x + else + nil + end + end + + def each + @constants.each do |name, values| + values.each do |constant| + yield constant + end + end + end + + def self.constant_as_array exp + res = [] + while exp + if exp.is_a? Sexp + case exp.node_type + when :const + res << exp.value + exp = nil + when :colon3 + res << exp.value << :"" + exp = nil + when :colon2 + res << exp.last + exp = exp[1] + else + res << exp + exp = nil + end + else + res << exp + exp = nil + end + end + + res.reverse! + res + end + + def self.get_constant_base_name exp + return exp unless exp.is_a? Sexp + + case exp.node_type + when :const, :colon3 + exp.value + when :colon2 + exp.last + else + exp + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/controller.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/controller.rb new file mode 100644 index 000000000..61ddd0361 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/controller.rb @@ -0,0 +1,165 @@ +require 'brakeman/tracker/collection' + +module Brakeman + module ControllerMethods + attr_accessor :layout + + def initialize_controller + @options[:before_filters] = [] + @options[:skip_filters] = [] + @layout = nil + @skip_filter_cache = nil + @before_filter_cache = nil + end + + def protect_from_forgery? + @options[:protect_from_forgery] + end + + def add_before_filter exp + @options[:before_filters] << exp + end + + def prepend_before_filter exp + @options[:before_filters].unshift exp + end + + def before_filters + @options[:before_filters] + end + + def skip_filter exp + @options[:skip_filters] << exp + end + + def skip_filters + @options[:skip_filters] + end + + def before_filter_list processor, method + controller = self + filters = [] + + while controller + filters = controller.get_before_filters(processor, method) + filters + + controller = tracker.controllers[controller.parent] || + tracker.libs[controller.parent] + end + + remove_skipped_filters processor, filters, method + end + + def get_skipped_filters processor, method + filters = [] + + if @skip_filter_cache.nil? + @skip_filter_cache = skip_filters.map do |filter| + before_filter_to_hash(processor, filter.args) + end + end + + @skip_filter_cache.each do |f| + if filter_includes_method? f, method + filters.concat f[:methods] + else + end + end + + filters + end + + + def remove_skipped_filters processor, filters, method + controller = self + + while controller + filters = filters - controller.get_skipped_filters(processor, method) + + controller = tracker.controllers[controller.parent] || + tracker.libs[controller.parent] + end + + filters + end + + def get_before_filters processor, method + filters = [] + + if @before_filter_cache.nil? + @before_filter_cache = [] + + before_filters.each do |filter| + @before_filter_cache << before_filter_to_hash(processor, filter.args) + end + end + + @before_filter_cache.each do |f| + if filter_includes_method? f, method + filters.concat f[:methods] + end + end + + filters + end + + def before_filter_to_hash processor, args + filter = {} + + #Process args for the uncommon but possible situation + #in which some variables are used in the filter. + args.each do |a| + if sexp? a + a = processor.process_default a + end + end + + filter[:methods] = [] + + args.each do |a| + filter[:methods] << a[1] if a.node_type == :lit + end + + options = args.last + + if hash? options + # Probably only one option, + # but this also avoids issues with kwsplats + hash_iterate(options) do |option, value| + case value.node_type + when :array + filter[option.value] = value.sexp_body.map {|v| v[1] } + when :lit, :str + filter[option.value] = value[1] + else + Brakeman.debug "[Notice] Unknown before_filter value: #{option} => #{value}" + end + end + else + filter[:all] = true + end + + filter + end + + private + + def filter_includes_method? filter_rule, method_name + filter_rule[:all] or + (filter_rule[:only] == method_name) or + (filter_rule[:only].is_a? Array and filter_rule[:only].include? method_name) or + (filter_rule[:except].is_a? Symbol and filter_rule[:except] != method_name) or + (filter_rule[:except].is_a? Array and not filter_rule[:except].include? method_name) + end + end + + class Controller < Brakeman::Collection + include ControllerMethods + + def initialize name, parent, file_name, src, tracker + super + initialize_controller + @collection = tracker.controllers + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/file_cache.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/file_cache.rb new file mode 100644 index 000000000..dacca3d05 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/file_cache.rb @@ -0,0 +1,83 @@ +module Brakeman + class FileCache + def initialize(file_list = nil) + @file_list = file_list || { + controller: {}, + initializer: {}, + lib: {}, + model: {}, + template: {}, + } + end + + def controllers + @file_list[:controller] + end + + def initializers + @file_list[:initializer] + end + + def libs + @file_list[:lib] + end + + def models + @file_list[:model] + end + + def templates + @file_list[:template] + end + + def add_file(astfile, type) + raise "Unknown type: #{type}" unless valid_type? type + @file_list[type][astfile.path] = astfile + end + + def valid_type?(type) + @file_list.key? type + end + + def cached? path + @file_list.any? do |name, list| + list[path] + end + end + + def delete path + @file_list.each do |name, list| + list.delete path + end + end + + def diff other + @file_list.each do |name, list| + other_list = other.send(:"#{name}s") + + if list == other_list + next + else + puts "-- #{name} --" + puts "Old: #{other_list.keys - list.keys}" + puts "New: #{list.keys - other_list.keys}" + end + end + end + + def dup + copy_file_list = @file_list.map do |name, list| + copy_list = list.map do |path, astfile| + copy_astfile = astfile.dup + copy_astfile.ast = copy_astfile.ast.deep_clone + + [path, copy_astfile] + end.to_h + + [name, copy_list] + end.to_h + + FileCache.new(copy_file_list) + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/library.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/library.rb new file mode 100644 index 000000000..d248ec93a --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/library.rb @@ -0,0 +1,17 @@ +require 'brakeman/tracker/collection' +require 'brakeman/tracker/controller' +require 'brakeman/tracker/model' + +module Brakeman + class Library < Brakeman::Collection + include ControllerMethods + include ModelMethods + + def initialize name, parent, file_name, src, tracker + super + initialize_controller + initialize_model + @collection = tracker.libs + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/method_info.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/method_info.rb new file mode 100644 index 000000000..31a2b6b4f --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/method_info.rb @@ -0,0 +1,70 @@ +require 'brakeman/util' + +module Brakeman + class MethodInfo + include Brakeman::Util + + attr_reader :name, :src, :owner, :file, :type + + def initialize name, src, owner, file + @name = name + @src = src + @owner = owner + @file = file + @type = case src.node_type + when :defn + :instance + when :defs + :class + else + raise "Expected sexp type: #{src.node_type}" + end + + @simple_method = nil + end + + # To support legacy code that expected a Hash + def [] attr + self.send(attr) + end + + def very_simple_method? + return @simple_method == :very unless @simple_method.nil? + + # Very simple methods have one (simple) expression in the body and + # no arguments + if src.formal_args.length == 1 # no args + if src.method_length == 1 # Single expression in body + value = first_body # First expression in body + + if simple_literal? value or + (array? value and all_literals? value) or + (hash? value and all_literals? value, :hash) + + @return_value = value + @simple_method = :very + end + end + end + + @simple_method ||= false + end + + def return_value env = nil + if very_simple_method? + return @return_value + else + nil + end + end + + def first_body + case @type + when :class + src[4] + when :instance + src[3] + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/model.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/model.rb new file mode 100644 index 000000000..8f1005684 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/model.rb @@ -0,0 +1,90 @@ +require 'brakeman/tracker/collection' + +module Brakeman + module ModelMethods + attr_reader :associations, :attr_accessible, :role_accessible + + def initialize_model + @associations = {} + @role_accessible = [] + @attr_accessible = nil + end + + def association? method_name + @associations.each do |name, args| + args.each do |arg| + if symbol? arg and arg.value == method_name + return true + end + end + end + + false + end + + def unprotected_model? + @attr_accessible.nil? and !parent_classes_protected? and ancestor?(:"ActiveRecord::Base") + end + + # go up the chain of parent classes to see if any have attr_accessible + def parent_classes_protected? seen={} + seen[self.name] = true + + if @attr_accessible or self.includes.include? :"ActiveModel::ForbiddenAttributesProtection" + true + elsif parent = tracker.models[self.parent] and !seen[self.parent] + parent.parent_classes_protected? seen + else + false + end + end + + def set_attr_accessible exp = nil + if exp + args = [] + + exp.each_arg do |e| + if node_type? e, :lit + args << e.value + elsif hash? e + @role_accessible.concat args + end + end + + @attr_accessible ||= [] + @attr_accessible.concat args + else + @attr_accessible ||= [] + end + end + + def set_attr_protected exp + add_option :attr_protected, exp + end + + def attr_protected + @options[:attr_protected] + end + end + + class Model < Brakeman::Collection + include ModelMethods + + ASSOCIATIONS = Set[:belongs_to, :has_one, :has_many, :has_and_belongs_to_many] + + def initialize name, parent, file_name, src, tracker + super + initialize_model + @collection = tracker.models + end + + def add_option name, exp + if ASSOCIATIONS.include? name + @associations[name] ||= [] + @associations[name].concat exp.args + else + super name, exp.arglist.line(exp.line) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/template.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/template.rb new file mode 100644 index 000000000..38b1743e2 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/tracker/template.rb @@ -0,0 +1,33 @@ +require 'brakeman/tracker/collection' + +module Brakeman + class Template < Brakeman::Collection + attr_accessor :type + attr_reader :render_path + attr_writer :src + + def initialize name, called_from, file_name, tracker + super name, nil, file_name, nil, tracker + @render_path = called_from + @outputs = [] + end + + def add_output exp + @outputs << exp + end + + def each_output + @outputs.each do |o| + yield o + end + end + + def rendered_from_controller? + if @render_path + @render_path.rendered_from_controller? + else + false + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/util.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/util.rb new file mode 100644 index 000000000..1a4c853cc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/util.rb @@ -0,0 +1,410 @@ +require 'set' +require 'pathname' + +#This is a mixin containing utility methods. +module Brakeman::Util + + QUERY_PARAMETERS = Sexp.new(:call, Sexp.new(:call, nil, :request), :query_parameters) + + PATH_PARAMETERS = Sexp.new(:call, Sexp.new(:call, nil, :request), :path_parameters) + + REQUEST_REQUEST_PARAMETERS = Sexp.new(:call, Sexp.new(:call, nil, :request), :request_parameters) + + REQUEST_PARAMETERS = Sexp.new(:call, Sexp.new(:call, nil, :request), :parameters) + + REQUEST_PARAMS = Sexp.new(:call, Sexp.new(:call, nil, :request), :params) + + REQUEST_ENV = Sexp.new(:call, Sexp.new(:call, nil, :request), :env) + + PARAMETERS = Sexp.new(:call, nil, :params) + + COOKIES = Sexp.new(:call, nil, :cookies) + + REQUEST_COOKIES = s(:call, s(:call, nil, :request), :cookies) + + SESSION = Sexp.new(:call, nil, :session) + + ALL_PARAMETERS = Set[PARAMETERS, QUERY_PARAMETERS, PATH_PARAMETERS, REQUEST_REQUEST_PARAMETERS, REQUEST_PARAMETERS, REQUEST_PARAMS] + + ALL_COOKIES = Set[COOKIES, REQUEST_COOKIES] + + SAFE_LITERAL = s(:lit, :BRAKEMAN_SAFE_LITERAL) + + #Convert a string from "something_like_this" to "SomethingLikeThis" + # + #Taken from ActiveSupport. + def camelize lower_case_and_underscored_word + lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } + end + + #Convert a string from "Something::LikeThis" to "something/like_this" + # + #Taken from ActiveSupport. + def underscore camel_cased_word + camel_cased_word.to_s.gsub(/::/, '/'). + gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). + gsub(/([a-z\d])([A-Z])/,'\1_\2'). + tr("-", "_"). + downcase + end + + # stupid simple, used to delegate to ActiveSupport + def pluralize word + if word.end_with? 's' + word + 'es' + else + word + 's' + end + end + + #Returns a class name as a Symbol. + #If class name cannot be determined, returns _exp_. + def class_name exp + case exp + when Sexp + case exp.node_type + when :const, :colon3 + exp.value + when :lvar + exp.value.to_sym + when :colon2 + "#{class_name(exp.lhs)}::#{exp.rhs}".to_sym + when :self + @current_class || @current_module || nil + else + exp + end + when Symbol + exp + when nil + nil + else + exp + end + end + + #Takes an Sexp like + # (:hash, (:lit, :key), (:str, "value")) + #and yields the key and value pairs to the given block. + # + #For example: + # + # h = Sexp.new(:hash, (:lit, :name), (:str, "bob"), (:lit, :name), (:str, "jane")) + # names = [] + # hash_iterate(h) do |key, value| + # if symbol? key and key[1] == :name + # names << value[1] + # end + # end + # names #["bob"] + def hash_iterate hash + hash = remove_kwsplat(hash) + + 1.step(hash.length - 1, 2) do |i| + yield hash[i], hash[i + 1] + end + end + + def remove_kwsplat exp + if exp.any? { |e| node_type? e, :kwsplat } + exp.reject { |e| node_type? e, :kwsplat } + else + exp + end + end + + #Insert value into Hash Sexp + def hash_insert hash, key, value + index = 1 + hash_iterate hash.dup do |k,v| + if k == key + hash[index + 1] = value + return hash + end + index += 2 + end + + hash << key << value + + hash + end + + #Get value from hash using key. + # + #If _key_ is a Symbol, it will be converted to a Sexp(:lit, key). + def hash_access hash, key + if key.is_a? Symbol + key = Sexp.new(:lit, key) + end + + if index = hash.find_index(key) and index > 0 + return hash[index + 1] + end + + nil + end + + def hash_values hash + values = hash.each_sexp.each_slice(2).map do |_, value| + value + end + + Sexp.new(:array).concat(values).line(hash.line) + end + + #These are never modified + PARAMS_SEXP = Sexp.new(:params) + SESSION_SEXP = Sexp.new(:session) + COOKIES_SEXP = Sexp.new(:cookies) + + #Adds params, session, and cookies to environment + #so they can be replaced by their respective Sexps. + def set_env_defaults + @env[PARAMETERS] = PARAMS_SEXP + @env[SESSION] = SESSION_SEXP + @env[COOKIES] = COOKIES_SEXP + end + + #Check if _exp_ represents a hash: s(:hash, {...}) + #This also includes pseudo hashes params, session, and cookies. + def hash? exp + exp.is_a? Sexp and (exp.node_type == :hash or + exp.node_type == :params or + exp.node_type == :session or + exp.node_type == :cookies) + end + + #Check if _exp_ represents an array: s(:array, [...]) + def array? exp + exp.is_a? Sexp and exp.node_type == :array + end + + #Check if _exp_ represents a String: s(:str, "...") + def string? exp + exp.is_a? Sexp and exp.node_type == :str + end + + def string_interp? exp + exp.is_a? Sexp and exp.node_type == :dstr + end + + #Check if _exp_ represents a Symbol: s(:lit, :...) + def symbol? exp + exp.is_a? Sexp and exp.node_type == :lit and exp[1].is_a? Symbol + end + + #Check if _exp_ represents a method call: s(:call, ...) + def call? exp + exp.is_a? Sexp and + (exp.node_type == :call or exp.node_type == :safe_call) + end + + #Check if _exp_ represents a Regexp: s(:lit, /.../) + def regexp? exp + exp.is_a? Sexp and exp.node_type == :lit and exp[1].is_a? Regexp + end + + #Check if _exp_ represents an Integer: s(:lit, ...) + def integer? exp + exp.is_a? Sexp and exp.node_type == :lit and exp[1].is_a? Integer + end + + #Check if _exp_ represents a number: s(:lit, ...) + def number? exp + exp.is_a? Sexp and exp.node_type == :lit and exp[1].is_a? Numeric + end + + #Check if _exp_ represents a result: s(:result, ...) + def result? exp + exp.is_a? Sexp and exp.node_type == :result + end + + #Check if _exp_ represents a :true, :lit, or :string node + def true? exp + exp.is_a? Sexp and (exp.node_type == :true or + exp.node_type == :lit or + exp.node_type == :string) + end + + #Check if _exp_ represents a :false or :nil node + def false? exp + exp.is_a? Sexp and (exp.node_type == :false or + exp.node_type == :nil) + end + + #Check if _exp_ represents a block of code + def block? exp + exp.is_a? Sexp and (exp.node_type == :block or + exp.node_type == :rlist) + end + + #Check if _exp_ is a params hash + def params? exp + recurse_check?(exp) { |child| child.node_type == :params or ALL_PARAMETERS.include? child } + end + + def cookies? exp + recurse_check?(exp) { |child| child.node_type == :cookies or ALL_COOKIES.include? child } + end + + def recurse_check? exp, &check + if exp.is_a? Sexp + return true if yield(exp) + + if call? exp + if recurse_check? exp[1], &check + return true + elsif exp[2] == :[] + return recurse_check? exp[1], &check + end + end + end + + false + end + + # Only return true when accessing request headers via request.env[...] + def request_headers? exp + return unless sexp? exp + + if exp[1] == REQUEST_ENV + if exp.method == :[] + if string? exp.first_arg + # Only care about HTTP headers, which are prefixed by 'HTTP_' + exp.first_arg.value.start_with?('HTTP_'.freeze) + else + true # request.env[something] + end + else + false # request.env.something + end + else + false + end + end + + #Check if exp is params, cookies, or request_headers + def request_value? exp + params? exp or + cookies? exp or + request_headers? exp + end + + def constant? exp + node_type? exp, :const, :colon2, :colon3 + end + + def kwsplat? exp + exp.is_a? Sexp and + exp.node_type == :hash and + exp[1].is_a? Sexp and + exp[1].node_type == :kwsplat + end + + #Check if _exp_ is a Sexp. + def sexp? exp + exp.is_a? Sexp + end + + #Check if _exp_ is a Sexp and the node type matches one of the given types. + def node_type? exp, *types + exp.is_a? Sexp and types.include? exp.node_type + end + + SIMPLE_LITERALS = [:lit, :false, :str, :true] + + def simple_literal? exp + exp.is_a? Sexp and SIMPLE_LITERALS.include? exp.node_type + end + + LITERALS = [*SIMPLE_LITERALS, :array, :hash] + + def literal? exp + exp.is_a? Sexp and LITERALS.include? exp.node_type + end + + def all_literals? exp, expected_type = :array + node_type? exp, expected_type and + exp.length > 1 and + exp.all? { |e| e.is_a? Symbol or node_type? e, :lit, :str } + end + + DIR_CONST = s(:const, :Dir) + + # Dir.glob(...).whatever + def dir_glob? exp + exp = exp.block_call if node_type? exp, :iter + return unless call? exp + + (exp.target == DIR_CONST and exp.method == :glob) or dir_glob? exp.target + end + + #Returns true if the given _exp_ contains a :class node. + # + #Useful for checking if a module is just a module or if it is a namespace. + def contains_class? exp + todo = [exp] + + until todo.empty? + current = todo.shift + + if node_type? current, :class + return true + elsif sexp? current + todo = current.sexp_body.concat todo + end + end + + false + end + + def make_call target, method, *args + call = Sexp.new(:call, target, method) + + if args.empty? or args.first.empty? + #nothing to do + elsif node_type? args.first, :arglist + call.concat args.first.sexp_body + elsif args.first.node_type.is_a? Sexp #just a list of args + call.concat args.first + else + call.concat args + end + + call + end + + def safe_literal line = nil + s(:lit, :BRAKEMAN_SAFE_LITERAL).line(line || 0) + end + + def safe_literal? exp + exp == SAFE_LITERAL + end + + def safe_literal_target? exp + if call? exp + safe_literal_target? exp.target + else + safe_literal? exp + end + end + + def rails_version + @tracker.config.rails_version + end + + #Convert path/filename to view name + # + # views/test/something.html.erb -> test/something + def template_path_to_name path + names = path.relative.split('/') + names.last.gsub!(/(\.(html|js)\..*|\.(rhtml|haml|erb|slim))$/, '') + + if names.include? 'views' + names[(names.index('views') + 1)..-1] + else + names + end.join('/').to_sym + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/version.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/version.rb new file mode 100644 index 000000000..99a7abd9e --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/version.rb @@ -0,0 +1,3 @@ +module Brakeman + Version = "7.1.1" +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/warning.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/warning.rb new file mode 100644 index 000000000..2e983476b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/warning.rb @@ -0,0 +1,324 @@ +require 'json' +require 'digest/sha2' +require 'brakeman/warning_codes' +require 'brakeman/messages' + +#The Warning class stores information about warnings +class Brakeman::Warning + attr_reader :called_from, :check, :class, :confidence, :controller, :cwe_id, + :line, :method, :model, :template, :user_input, :user_input_type, + :warning_code, :warning_set, :warning_type + + attr_accessor :code, :context, :file, :message + + TEXT_CONFIDENCE = { + 0 => "High", + 1 => "Medium", + 2 => "Weak", + } + + CONFIDENCE = { + :high => 0, + :med => 1, + :medium => 1, + :low => 2, + :weak => 2, + } + + OPTIONS = { + :called_from => :@called_from, + :check => :@check, + :class => :@class, + :code => :@code, + :controller => :@controller, + :cwe_id => :@cwe_id, + :file => :@file, + :gem_info => :@gem_info, + :line => :@line, + :link => :@link, + :link_path => :@link_path, + :message => :@message, + :method => :@method, + :model => :@model, + :template => :@template, + :user_input => :@user_input, + :warning_set => :@warning_set, + :warning_type => :@warning_type, + } + + #+options[:result]+ can be a result from Tracker#find_call. Otherwise, it can be +nil+. + def initialize options = {} + @view_name = nil + + OPTIONS.each do |key, var| + self.instance_variable_set(var, options[key]) + end + + self.confidence = options[:confidence] + + result = options[:result] + if result + @code ||= result[:call] + @file ||= result[:location][:file] + + if result[:location][:type] == :template #template result + @template ||= result[:location][:template] + else + @class ||= result[:location][:class] + @method ||= result[:location][:method] + end + end + + if @method.to_s =~ /^fake_filter\d+/ + @method = :before_filter + end + + if @user_input.is_a? Brakeman::BaseCheck::Match + @user_input_type = @user_input.type + @user_input = @user_input.match + elsif @user_input == false + @user_input = nil + end + + if not @line + if @user_input and @user_input.respond_to? :line + @line = @user_input.line + elsif @code and @code.respond_to? :line + @line = @code.line + end + end + + if @gem_info + if @gem_info.is_a? Hash + @line ||= @gem_info[:line] + @file ||= @gem_info[:file] + else + # Fallback behavior returns just a string for the file name + @file ||= @gem_info + end + end + + unless @warning_set + if self.model + @warning_set = :model + @file ||= self.model.file + elsif self.template + @warning_set = :template + @called_from = self.template.render_path + @file ||= self.template.file + elsif self.controller + @warning_set = :controller + else + @warning_set = :warning + end + end + + if options[:warning_code] + @warning_code = Brakeman::WarningCodes.code options[:warning_code] + else + @warning_code = nil + end + + Brakeman.debug("Warning created without warning code: #{options[:warning_code]}") unless @warning_code + + if options[:message].is_a? String + @message = Brakeman::Messages::Message.new(options[:message]) + end + + @format_message = nil + @row = nil + end + + def hash + self.to_s.hash + end + + def eql? other_warning + self.hash == other_warning.hash + end + + def confidence= conf + @confidence = case conf + when Integer + conf + when Symbol + CONFIDENCE[conf] + else + raise "Could not set confidence to `#{conf}`" + end + + raise "Could not set confidence to `#{conf}`" unless @confidence + raise "Invalid confidence: `#{@confidence}`" unless TEXT_CONFIDENCE[@confidence] + end + + #Returns name of a view, including where it was rendered from + def view_name(include_renderer = true) + if called_from and include_renderer + @view_name = "#{template.name} (#{called_from.last})" + else + @view_name = template.name + end + end + + #Return String of the code output from the OutputProcessor and + #stripped of newlines and tabs. + def format_code strip = true + format_ruby self.code, strip + end + + #Return String of the user input formatted and + #stripped of newlines and tabs. + def format_user_input strip = true + format_ruby self.user_input, strip + end + + def format_with_user_input strip = true, &block + if self.user_input + formatted = Brakeman::OutputProcessor.new.format(code, self.user_input, &block) + formatted.gsub!(/(\t|\r|\n)+/, " ") if strip + formatted + else + format_code + end + end + + #Return formatted warning message + def format_message + return @format_message if @format_message + + @format_message = self.message.to_s.dup + + if self.line + @format_message << " near line #{self.line}" + end + + if self.code + @format_message << ": #{format_code}" + end + + @format_message + end + + def link + return @link if @link + + if @link_path + if @link_path.start_with? "http" + @link = @link_path + else + @link = "https://brakemanscanner.org/docs/warning_types/#{@link_path}" + end + else + warning_path = self.warning_type.to_s.downcase.gsub(/\s+/, '_') + "/" + @link = "https://brakemanscanner.org/docs/warning_types/#{warning_path}" + end + + @link + end + + #Generates a hash suitable for inserting into a table + def to_row type = :warning + @row = { "Confidence" => TEXT_CONFIDENCE[self.confidence], + "Warning Type" => self.warning_type.to_s, + "CWE ID" => self.cwe_id, + "Message" => self.message } + + case type + when :template + @row["Template"] = self.view_name.to_s + when :model + @row["Model"] = self.model.name.to_s + when :controller + @row["Controller"] = self.controller.to_s + when :warning + @row["Class"] = self.class.to_s + @row["Method"] = self.method.to_s + end + + @row + end + + def to_s + output = "(#{TEXT_CONFIDENCE[self.confidence]}) #{self.warning_type} - #{self.message}" + output << " near line #{self.line}" if self.line + output << " in #{self.file.relative}" if self.file + output << ": #{self.format_code}" if self.code + + output + end + + def fingerprint + loc = self.location + location_string = loc && loc.sort_by { |k, v| k.to_s }.inspect + warning_code_string = sprintf("%03d", @warning_code) + code_string = @code.inspect + + Digest::SHA2.new(256).update("#{warning_code_string}#{code_string}#{location_string}#{self.file.relative}#{self.confidence}").to_s + end + + def location include_renderer = true + case @warning_set + when :template + { :type => :template, :template => self.view_name(include_renderer) } + when :model + { :type => :model, :model => self.model.name } + when :controller + { :type => :controller, :controller => self.controller } + when :warning + if self.class + { :type => :method, :class => self.class, :method => self.method } + else + nil + end + end + end + + def relative_path + self.file.relative + end + + def check_name + @check_name ||= self.check.sub(/^Brakeman::Check/, '') + end + + def confidence_name + TEXT_CONFIDENCE[self.confidence] + end + + def to_hash absolute_paths: true + if self.called_from and not absolute_paths + render_path = self.called_from.with_relative_paths + else + render_path = self.called_from + end + + { :warning_type => self.warning_type, + :warning_code => @warning_code, + :fingerprint => self.fingerprint, + :check_name => self.check_name, + :message => self.message.to_s, + :file => (absolute_paths ? self.file.absolute : self.file.relative), + :line => self.line, + :link => self.link, + :code => (@code && self.format_code(false)), + :render_path => render_path, + :location => self.location(false), + :user_input => (@user_input && self.format_user_input(false)), + :confidence => self.confidence_name, + :cwe_id => cwe_id + } + end + + def to_json + JSON.generate self.to_hash + end + + private + + def format_ruby code, strip + formatted = Brakeman::OutputProcessor.new.format(code) + formatted = formatted.gsub(/(\t|\r|\n)+/, " ") if strip + formatted + end +end + diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/warning_codes.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/warning_codes.rb new file mode 100644 index 000000000..3845d6b20 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/brakeman/warning_codes.rb @@ -0,0 +1,141 @@ +module Brakeman::WarningCodes + Codes = { + :sql_injection => 0, + :sql_injection_limit_offset => 1, + :cross_site_scripting => 2, + :xss_link_to => 3, + :xss_link_to_href => 4, + :xss_to_json => 5, + :csrf_protection_disabled => 6, + :csrf_protection_missing => 7, + :csrf_blacklist => 8, + :basic_auth_password => 9, + :auth_blacklist => 10, + :all_default_routes => 11, + :controller_default_routes => 12, + :code_eval => 13, + :command_injection => 14, + :dynamic_render_path => 15, + :file_access => 16, + :mass_assign_call => 17, + :open_redirect => 18, + :no_attr_accessible => 19, + :attr_protected_used => 20, + :safe_buffer_vuln => 21, + :select_options_vuln => 22, + :dangerous_send => 23, + :unsafe_constantize => 24, + :unsafe_deserialize => 25, + :http_cookies => 26, + :secure_cookies => 27, + :translate_vuln => 28, + :session_secret => 29, + :validation_regex => 30, + :CVE_2010_3933 => 31, + :CVE_2011_0446 => 32, + :CVE_2011_0447 => 33, + :CVE_2011_2929 => 34, + :CVE_2011_2930 => 35, + :CVE_2011_2931 => 36, + :CVE_2011_3186 => 37, + :CVE_2012_2660 => 38, + :CVE_2012_2661 => 39, + :CVE_2012_2695 => 40, + #:CVE_2012_2931 => 41, + :CVE_2012_3424 => 42, + :CVE_2012_3463 => 43, + :CVE_2012_3464 => 44, + :CVE_2012_3465 => 45, + :CVE_2012_5664 => 46, + :CVE_2013_0155 => 47, + :CVE_2013_0156 => 48, + :CVE_2013_0269 => 49, + :CVE_2013_0277 => 50, + :CVE_2013_0276 => 51, + :CVE_2013_0333 => 52, + :xss_content_tag => 53, + :mass_assign_without_protection => 54, + :CVE_2013_1854 => 55, + :CVE_2013_1855 => 56, + :CVE_2013_1856 => 57, + :CVE_2013_1857 => 58, + :unsafe_symbol_creation => 59, + :dangerous_attr_accessible => 60, + :local_request_config => 61, + :detailed_exceptions => 62, + :CVE_2013_4491 => 63, + :CVE_2013_6414 => 64, + # Replaced by CVE_2014_0081 + #:CVE_2013_6415 => 65, + #:CVE_2013_6415_call => 66, + :CVE_2013_6416 => 67, + :CVE_2013_6416_call => 68, + :CVE_2013_6417 => 69, + :mass_assign_permit! => 70, + :ssl_verification_bypass => 71, + :CVE_2014_0080 => 72, + :CVE_2014_0081 => 73, + :CVE_2014_0081_call => 74, + :CVE_2014_0082 => 75, + :regex_dos => 76, + :CVE_2014_0130 => 77, + :CVE_2014_3482 => 78, + :CVE_2014_3483 => 79, + :CVE_2014_3514 => 80, + :CVE_2014_3514_call => 81, + :unscoped_find => 82, + :CVE_2011_2932 => 83, + :cross_site_scripting_inline => 84, + :CVE_2014_7829 => 85, + :csrf_not_protected_by_raising_exception => 86, + :CVE_2015_3226 => 87, + :CVE_2015_3227 => 88, + :session_key_manipulation => 89, + :weak_hash_digest => 90, + :weak_hash_hmac => 91, + :sql_injection_dynamic_finder => 92, + :CVE_2015_7576 => 93, + :CVE_2016_0751 => 94, + :CVE_2015_7577 => 95, + :CVE_2015_7578 => 96, + :CVE_2015_7580 => 97, + :CVE_2015_7579 => 98, + :dynamic_render_path_rce => 99, + :CVE_2015_7581 => 100, + :secret_in_source => 101, + :CVE_2016_6316 => 102, + :CVE_2016_6317 => 103, + :divide_by_zero => 104, + :dangerous_permit_key => 105, + :CVE_2018_8048 => 106, + :CVE_2018_3741 => 107, + :CVE_2018_3760 => 108, + :force_ssl_disabled => 109, + :unsafe_cookie_serialization => 110, + :reverse_tabnabbing => 111, + :mass_assign_permit_all => 112, + :json_html_escape_config => 113, + :json_html_escape_module => 114, + :CVE_2020_8159 => 115, + :CVE_2020_8166 => 116, + :erb_template_injection => 117, + :http_verb_confusion => 118, + :unsafe_method_reflection => 119, + :eol_rails => 120, + :eol_ruby => 121, + :pending_eol_rails => 122, + :pending_eol_ruby => 123, + :CVE_2022_32209 => 124, + :pathname_traversal => 125, + :insecure_rsa_padding_mode => 126, + :missing_rsa_padding_mode => 127, + :small_rsa_key_size => 128, + :ransack_search => 129, + + :custom_check => 9090, + } + + def self.code name + Codes[name] + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/ruby_parser/bm_sexp.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/ruby_parser/bm_sexp.rb new file mode 100644 index 000000000..abdee62fc --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/ruby_parser/bm_sexp.rb @@ -0,0 +1,659 @@ +#Sexp changes from ruby_parser +#and some changes for caching hash value and tracking 'original' line number +#of a Sexp. +class Sexp + attr_accessor :original_line, :or_depth + ASSIGNMENT_BOOL = [:gasgn, :iasgn, :lasgn, :cvdecl, :cvasgn, :cdecl, :or, :and, :colon2, :op_asgn_or] + CALLS = [:call, :attrasgn, :safe_call, :safe_attrasgn] + + alias_method :method_missing, :method_missing # silence redefined method warning + def method_missing name, *args + #Brakeman does not use this functionality, + #so overriding it to raise a NoMethodError. + # + #The original functionality calls find_node and optionally + #deletes the node if found. + # + #Defining a method named "return" seems like a bad idea, so we have to + #check for it here instead + if name == :return + find_node name, *args + else + raise NoMethodError.new("No method '#{name}' for Sexp", name, args) + end + end + + #Create clone of Sexp and nested Sexps but not their non-Sexp contents. + #If a line number is provided, also sets line/original_line on all Sexps. + def deep_clone line = nil + s = Sexp.new + + self.each do |e| + if e.is_a? Sexp + s << e.deep_clone(line) + else + s << e + end + end + + if line + s.original_line = self.original_line || self.line + s.line(line) + else + s.original_line = self.original_line + s.line(self.line) if self.line + end + + s + end + + alias_method :paren, :paren # silence redefined method warning + def paren + @paren ||= false + end + + alias_method :value, :value # silence redefined method warning + def value + raise WrongSexpError, "Sexp#value called on multi-item Sexp: `#{self.inspect}`" if size > 2 + self[1] + end + + def value= exp + raise WrongSexpError, "Sexp#value= called on multi-item Sexp: `#{self.inspect}`" if size > 2 + @my_hash_value = nil + self[1] = exp + end + + def second + self[1] + end + + def to_sym + self.value.to_sym + end + + def node_type= type + @my_hash_value = nil + self[0] = type + end + + #Join self and exp into an :or Sexp. + #Sets or_depth. + #Used for combining "branched" values in AliasProcessor. + def combine exp, line = nil + combined = Sexp.new(:or, self, exp).line(line || -2) + + combined.or_depth = [self.or_depth, exp.or_depth].compact.reduce(0, :+) + 1 + + combined + end + + alias :node_type :sexp_type + alias :values :sexp_body # TODO: retire + + alias :old_push :<< + alias :old_compact :compact + alias :old_fara :find_and_replace_all + alias :old_find_node :find_node + + def << arg + @my_hash_value = nil + old_push arg + end + + alias_method :hash, :hash # silence redefined method warning + def hash + #There still seems to be some instances in which the hash of the + #Sexp changes, but I have not found what method call is doing it. + #Of course, Sexp is subclasses from Array, so who knows what might + #be going on. + @my_hash_value ||= super + end + + def compact + @my_hash_value = nil + old_compact + end + + def find_and_replace_all *args + @my_hash_value = nil + old_fara(*args) + end + + def find_node *args + @my_hash_value = nil + old_find_node(*args) + end + + #Raise a WrongSexpError if the nodes type does not match one of the expected + #types. + def expect *types + unless types.include? self.node_type + raise WrongSexpError, "Expected #{types.join ' or '} but given #{self.inspect}", caller[1..-1] + end + end + + #Returns target of a method call: + # + #s(:call, s(:call, nil, :x, s(:arglist)), :y, s(:arglist, s(:lit, 1))) + # ^-----------target-----------^ + def target + expect :call, :attrasgn, :safe_call, :safe_attrasgn + self[1] + end + + #Sets the target of a method call: + def target= exp + expect :call, :attrasgn, :safe_call, :safe_attrasgn + @my_hash_value = nil + self[1] = exp + end + + #Returns method of a method call: + # + #s(:call, s(:call, nil, :x, s(:arglist)), :y, s(:arglist, s(:lit, 1))) + # ^- method + def method + expect :call, :attrasgn, :safe_call, :safe_attrasgn, :super, :zsuper, :result + + case self.node_type + when :call, :attrasgn, :safe_call, :safe_attrasgn + self[2] + when :super, :zsuper + :super + when :result + self.last + end + end + + def method= name + expect :call, :safe_call + + self[2] = name + end + + #Sets the arglist in a method call. + def arglist= exp + expect :call, :attrasgn, :safe_call, :safe_attrasgn + @my_hash_value = nil + start_index = 3 + + if exp.is_a? Sexp and exp.node_type == :arglist + exp = exp.sexp_body + end + + exp.each_with_index do |e, i| + self[start_index + i] = e + end + end + + def set_args *exp + self.arglist = exp + end + + #Returns arglist for method call. This differs from Sexp#args, as Sexp#args + #does not return a 'real' Sexp (it does not have a node type) but + #Sexp#arglist returns a s(:arglist, ...) + # + # s(:call, s(:call, nil, :x, s(:arglist)), :y, s(:arglist, s(:lit, 1), s(:lit, 2))) + # ^------------ arglist ------------^ + def arglist + expect :call, :attrasgn, :safe_call, :safe_attrasgn, :super, :zsuper + + case self.node_type + when :call, :attrasgn, :safe_call, :safe_attrasgn + self.sexp_body(3).unshift :arglist + when :super, :zsuper + if self[1] + self.sexp_body.unshift :arglist + else + Sexp.new(:arglist) + end + end + end + + #Returns arguments of a method call. This will be an 'untyped' Sexp. + # + # s(:call, s(:call, nil, :x, s(:arglist)), :y, s(:arglist, s(:lit, 1), s(:lit, 2))) + # ^--------args--------^ + def args + expect :call, :attrasgn, :safe_call, :safe_attrasgn, :super, :zsuper + + case self.node_type + when :call, :attrasgn, :safe_call, :safe_attrasgn + if self[3] + self.sexp_body(3) + else + Sexp.new + end + when :super, :zsuper + if self[1] + self.sexp_body + else + Sexp.new + end + end + end + + def each_arg replace = false + expect :call, :attrasgn, :safe_call, :safe_attrasgn, :super, :zsuper + range = nil + + case self.node_type + when :call, :attrasgn, :safe_call, :safe_attrasgn + if self[3] + range = (3...self.length) + end + when :super, :zsuper + if self[1] + range = (1...self.length) + end + end + + if range + range.each do |i| + res = yield self[i] + self[i] = res if replace + end + end + + self + end + + def each_arg! &block + @my_hash_value = nil + self.each_arg true, &block + end + + #Returns first argument of a method call. + def first_arg + expect :call, :attrasgn, :safe_call, :safe_attrasgn + self[3] + end + + #Sets first argument of a method call. + def first_arg= exp + expect :call, :attrasgn, :safe_call, :safe_attrasgn + @my_hash_value = nil + self[3] = exp + end + + #Returns second argument of a method call. + def second_arg + expect :call, :attrasgn, :safe_call, :safe_attrasgn + self[4] + end + + #Sets second argument of a method call. + def second_arg= exp + expect :call, :attrasgn, :safe_call, :safe_attrasgn + @my_hash_value = nil + self[4] = exp + end + + def third_arg + expect :call, :attrasgn, :safe_call, :safe_attrasgn + self[5] + end + + def third_arg= exp + expect :call, :attrasgn, :safe_call, :safe_attrasgn + @my_hash_value = nil + self[5] = exp + end + + def last_arg + expect :call, :attrasgn, :safe_call, :safe_attrasgn + + if self[3] + self[-1] + else + nil + end + end + + def call_chain + expect :call, :attrasgn, :safe_call, :safe_attrasgn + + chain = [] + call = self + + while call.class == Sexp and CALLS.include? call.first + chain << call.method + call = call.target + end + + chain.reverse! + chain + end + + #Returns condition of an if expression: + # + # s(:if, + # s(:lvar, :condition), <-- condition + # s(:lvar, :then_val), + # s(:lvar, :else_val))) + def condition + expect :if + self[1] + end + + def condition= exp + expect :if + self[1] = exp + end + + + #Returns 'then' clause of an if expression: + # + # s(:if, + # s(:lvar, :condition), + # s(:lvar, :then_val), <-- then clause + # s(:lvar, :else_val))) + def then_clause + expect :if + self[2] + end + + #Returns 'else' clause of an if expression: + # + # s(:if, + # s(:lvar, :condition), + # s(:lvar, :then_val), + # s(:lvar, :else_val))) + # ^---else caluse---^ + def else_clause + expect :if + self[3] + end + + #Method call associated with a block: + # + # s(:iter, + # s(:call, nil, :x, s(:arglist)), <- block_call + # s(:lasgn, :y), + # s(:block, s(:lvar, :y), s(:call, nil, :z, s(:arglist)))) + def block_call + expect :iter + + if self[1].node_type == :lambda + s(:call, nil, :lambda).line(self.line) + else + self[1] + end + end + + #Returns block of a call with a block. + #Could be a single expression or a block: + # + # s(:iter, + # s(:call, nil, :x, s(:arglist)), + # s(:lasgn, :y), + # s(:block, s(:lvar, :y), s(:call, nil, :z, s(:arglist)))) + # ^-------------------- block --------------------------^ + def block delete = nil + unless delete.nil? #this is from RubyParser + return find_node :block, delete + end + + expect :iter, :scope, :resbody + + case self.node_type + when :iter + self[3] + when :scope + self[1] + when :resbody + #This is for Ruby2Ruby ONLY + find_node :block + end + end + + #Returns parameters for a block + # + # s(:iter, + # s(:call, nil, :x, s(:arglist)), + # s(:lasgn, :y), <- block_args + # s(:call, nil, :p, s(:arglist, s(:lvar, :y)))) + def block_args + expect :iter + if self[2] == 0 # ?! See https://github.com/presidentbeef/brakeman/issues/331 + return Sexp.new(:args) + else + self[2] + end + end + + def first_param + expect :args + self[1] + end + + #Returns the left hand side of assignment or boolean: + # + # s(:lasgn, :x, s(:lit, 1)) + # ^--lhs + def lhs + expect(*ASSIGNMENT_BOOL) + self[1] + end + + #Sets the left hand side of assignment or boolean. + def lhs= exp + expect(*ASSIGNMENT_BOOL) + @my_hash_value = nil + self[1] = exp + end + + #Returns right side (value) of assignment or boolean: + # + # s(:lasgn, :x, s(:lit, 1)) + # ^--rhs---^ + def rhs + expect :attrasgn, :safe_attrasgn, *ASSIGNMENT_BOOL + + if self.node_type == :attrasgn or self.node_type == :safe_attrasgn + if self[2] == :[]= + self[4] + else + self[3] + end + else + self[2] + end + end + + #Sets the right hand side of assignment or boolean. + def rhs= exp + expect :attrasgn, :safe_attrasgn, *ASSIGNMENT_BOOL + @my_hash_value = nil + + if self.node_type == :attrasgn or self.node_type == :safe_attrasgn + self[3] = exp + else + self[2] = exp + end + end + + #Returns name of method being defined in a method definition. + def method_name + expect :defn, :defs + + case self.node_type + when :defn + self[1] + when :defs + self[2] + end + end + + def formal_args + expect :defn, :defs + + case self.node_type + when :defn + self[2] + when :defs + self[3] + end + end + + #Sets body, which is now a complicated process because the body is no longer + #a separate Sexp, but just a list of Sexps. + def body= exp + expect :defn, :defs, :class, :module + @my_hash_value = nil + + case self.node_type + when :defn, :class + index = 3 + when :defs + index = 4 + when :module + index = 2 + end + + self.slice!(index..-1) #Remove old body + + if exp.first == :rlist + exp = exp.sexp_body + end + + #Insert new body + exp.each do |e| + self[index] = e + index += 1 + end + end + + #Returns body of a method definition, class, or module. + #This will be an untyped Sexp containing a list of Sexps from the body. + def body + expect :defn, :defs, :class, :module + + case self.node_type + when :defn, :class + self.sexp_body(3) + when :defs + self.sexp_body(4) + when :module + self.sexp_body(2) + end + end + + #Like Sexp#body, except the returned Sexp is of type :rlist + #instead of untyped. + def body_list + self.body.unshift :rlist + end + + # Number of "statements" in a method. + # This is more efficient than `Sexp#body.length` + # because `Sexp#body` creates a new Sexp. + def method_length + expect :defn, :defs + + case self.node_type + when :defn + self.length - 3 + when :defs + self.length - 4 + end + end + + def render_type + expect :render + self[1] + end + + def class_name + expect :class, :module + self[1] + end + + alias module_name class_name + + def parent_name + expect :class + self[2] + end + + #Returns the call Sexp in a result returned from FindCall + def call + expect :result + + self.last + end + + #Returns the module the call is inside + def module + expect :result + + self[1] + end + + #Return the class the call is inside + def result_class + expect :result + + self[2] + end + + require 'set' + def inspect seen = Set.new + if seen.include? self.object_id + 's(...)' + else + seen << self.object_id + sexp_str = self.map do |x| + if x.is_a? Sexp + x.inspect seen + else + x.inspect + end + end.join(', ') + + "s(#{sexp_str})" + end + end +end + +#Invalidate hash cache if the Sexp changes +[:[]=, :clear, :collect!, :compact!, :concat, :delete, :delete_at, + :delete_if, :drop, :drop_while, :fill, :flatten!, :insert, + :keep_if, :map!, :pop, :push, :reject!, :replace, :reverse!, :rotate!, + :select!, :shift, :shuffle!, :slice!, :sort!, :sort_by!, :transpose, + :uniq!, :unshift].each do |method| + + Sexp.class_eval <<-RUBY + def #{method} *args + @my_hash_value = nil + super + end + RUBY +end + +#Methods used by RubyParser which would normally go through method_missing but +#we don't want that to happen because it hides Brakeman errors +[:resbody, :lasgn, :iasgn, :splat].each do |method| + Sexp.class_eval <<-RUBY + def #{method} delete = false + if delete + @my_hash_value = false + end + find_node :#{method}, delete + end + RUBY +end + +class String + ## + # This is a hack used by the lexer to sneak in line numbers at the + # identifier level. This should be MUCH smaller than making + # process_token return [value, lineno] and modifying EVERYTHING that + # reduces tIDENTIFIER. + + attr_accessor :lineno +end + +class WrongSexpError < RuntimeError; end diff --git a/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/ruby_parser/bm_sexp_processor.rb b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/ruby_parser/bm_sexp_processor.rb new file mode 100644 index 000000000..3b210e3ac --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/brakeman-7.1.1/lib/ruby_parser/bm_sexp_processor.rb @@ -0,0 +1,117 @@ +## +# SexpProcessor provides a uniform interface to process Sexps. +# +# In order to create your own SexpProcessor subclass you'll need +# to call super in the initialize method, then set any of the +# Sexp flags you want to be different from the defaults. +# +# SexpProcessor uses a Sexp's type to determine which process method +# to call in the subclass. For Sexp s(:lit, 1) +# SexpProcessor will call #process_lit, if it is defined. +# + +class Brakeman::SexpProcessor + + VERSION = 'CUSTOM' + + ## + # Return a stack of contexts. Most recent node is first. + + attr_reader :context + + ## + # Expected result class + + attr_accessor :expected + + ## + # A scoped environment to make you happy. + + attr_reader :env + + # Cache process methods per class + + def self.processors + @processors ||= {} + end + + ## + # Creates a new SexpProcessor. Use super to invoke this + # initializer from SexpProcessor subclasses, then use the + # attributes above to customize the functionality of the + # SexpProcessor + + def initialize + @expected = Sexp + @processors = self.class.processors + @context = [] + @current_class = @current_module = @current_method = @visibility = nil + + if @processors.empty? + public_methods.each do |name| + if name.to_s.start_with? "process_" then + @processors[name[8..-1].to_sym] = name.to_sym + end + end + end + end + + ## + # Default Sexp processor. Invokes process_ methods matching + # the Sexp type given. Performs additional checks as specified by + # the initializer. + + def process(exp) + return nil if exp.nil? + + result = nil + + type = exp.first + raise "Type should be a Symbol, not: #{exp.first.inspect} in #{exp.inspect}" unless Symbol === type + + in_context type do + # now do a pass with the real processor (or generic) + meth = @processors[type] + if meth then + result = self.send(meth, exp) + else + result = self.process_default(exp) + end + end + + raise SexpTypeError, "Result must be a #{@expected}, was #{result.class}:#{result.inspect}" unless @expected === result + + result + end + + ## + # Add a scope level to the current env. Eg: + # + # def process_defn exp + # name = exp.shift + # args = process(exp.shift) + # scope do + # body = process(exp.shift) + # # ... + # end + # end + # + # env[:x] = 42 + # scope do + # env[:x] # => 42 + # env[:y] = 24 + # end + # env[:y] # => nil + + def scope &block + env.scope(&block) + end + + def in_context type + self.context.unshift type + + yield + + self.context.shift + end +end diff --git a/vendor/bundle/ruby/3.4.0/specifications/brakeman-7.1.1.gemspec b/vendor/bundle/ruby/3.4.0/specifications/brakeman-7.1.1.gemspec new file mode 100644 index 000000000..ae9990529 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/specifications/brakeman-7.1.1.gemspec @@ -0,0 +1,28 @@ +# -*- encoding: utf-8 -*- +# stub: brakeman 7.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "brakeman".freeze + s.version = "7.1.1".freeze + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/presidentbeef/brakeman/issues", "changelog_uri" => "https://github.com/presidentbeef/brakeman/releases", "documentation_uri" => "https://brakemanscanner.org/docs/", "homepage_uri" => "https://brakemanscanner.org/", "source_code_uri" => "https://github.com/presidentbeef/brakeman", "wiki_uri" => "https://github.com/presidentbeef/brakeman/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Justin Collins".freeze] + s.date = "2025-11-04" + s.description = "Brakeman detects security vulnerabilities in Ruby on Rails applications via static analysis.".freeze + s.email = "gem@brakeman.org".freeze + s.executables = ["brakeman".freeze] + s.files = ["bin/brakeman".freeze] + s.homepage = "https://brakemanscanner.org".freeze + s.licenses = ["Brakeman Public Use License".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 3.1.0".freeze) + s.rubygems_version = "3.3.27".freeze + s.summary = "Security vulnerability scanner for Ruby on Rails.".freeze + + s.installed_by_version = "3.7.1".freeze + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, [">= 0".freeze]) +end